This commit is contained in:
commit
61cd0f81b5
340 changed files with 4441 additions and 2452 deletions
4
.env.development
Normal file
4
.env.development
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Required by ActiveRecord encryption feature
|
||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR
|
||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E
|
||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr
|
|
@ -3,3 +3,8 @@ NODE_ENV=production
|
|||
# Federation
|
||||
LOCAL_DOMAIN=cb6e6126.ngrok.io
|
||||
LOCAL_HTTPS=true
|
||||
|
||||
# Required by ActiveRecord encryption feature
|
||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR
|
||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E
|
||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr
|
||||
|
|
|
@ -363,6 +363,7 @@ module.exports = defineConfig({
|
|||
"message": "Use typed hooks `useAppDispatch` and `useAppSelector` instead."
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/restrict-template-expressions": ['warn', { allowNumber: true }],
|
||||
'jsdoc/require-jsdoc': 'off',
|
||||
|
||||
// Those rules set stricter rules for TS files
|
||||
|
|
2
.github/workflows/crowdin-download.yml
vendored
2
.github/workflows/crowdin-download.yml
vendored
|
@ -52,7 +52,7 @@ jobs:
|
|||
|
||||
# Create or update the pull request
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6.0.2
|
||||
uses: peter-evans/create-pull-request@v6.0.3
|
||||
with:
|
||||
commit-message: 'New Crowdin translations'
|
||||
title: 'New Crowdin Translations (automated)'
|
||||
|
|
2
.github/workflows/test-js.yml
vendored
2
.github/workflows/test-js.yml
vendored
|
@ -38,5 +38,5 @@ jobs:
|
|||
- name: Set up Javascript environment
|
||||
uses: ./.github/actions/setup-javascript
|
||||
|
||||
- name: Jest testing
|
||||
- name: JavaScript testing
|
||||
run: yarn jest --reporters github-actions summary
|
||||
|
|
6
.github/workflows/test-ruby.yml
vendored
6
.github/workflows/test-ruby.yml
vendored
|
@ -28,6 +28,9 @@ jobs:
|
|||
env:
|
||||
RAILS_ENV: ${{ matrix.mode }}
|
||||
BUNDLE_WITH: ${{ matrix.mode }}
|
||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY: precompile_placeholder
|
||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT: precompile_placeholder
|
||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY: precompile_placeholder
|
||||
OTP_SECRET: precompile_placeholder
|
||||
SECRET_KEY_BASE: precompile_placeholder
|
||||
|
||||
|
@ -111,7 +114,6 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
ruby-version:
|
||||
- '3.0'
|
||||
- '3.1'
|
||||
- '.ruby-version'
|
||||
- '3.3'
|
||||
|
@ -187,7 +189,6 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
ruby-version:
|
||||
- '3.0'
|
||||
- '3.1'
|
||||
- '.ruby-version'
|
||||
- '3.3'
|
||||
|
@ -287,7 +288,6 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
ruby-version:
|
||||
- '3.0'
|
||||
- '3.1'
|
||||
- '.ruby-version'
|
||||
- '3.3'
|
||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -24,7 +24,6 @@
|
|||
/public/packs-test
|
||||
.env
|
||||
.env.production
|
||||
.env.development
|
||||
/node_modules/
|
||||
/build/
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
exclude:
|
||||
- 'vendor/**/*'
|
||||
- lib/templates/haml/scaffold/_form.html.haml
|
||||
|
||||
require:
|
||||
- ./lib/linter/haml_middle_dot.rb
|
||||
|
@ -11,6 +10,6 @@ linters:
|
|||
MiddleDot:
|
||||
enabled: true
|
||||
LineLength:
|
||||
max: 320
|
||||
max: 300
|
||||
ViewLength:
|
||||
max: 200 # Override default value of 100 inherited from rubocop
|
||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
|||
20.11
|
||||
20.12
|
||||
|
|
26
.rubocop.yml
26
.rubocop.yml
|
@ -14,7 +14,7 @@ require:
|
|||
- ./lib/linter/rubocop_middle_dot
|
||||
|
||||
AllCops:
|
||||
TargetRubyVersion: 3.0 # Set to minimum supported version of CI
|
||||
TargetRubyVersion: 3.1 # Set to minimum supported version of CI
|
||||
DisplayCopNames: true
|
||||
DisplayStyleGuide: true
|
||||
ExtraDetails: true
|
||||
|
@ -39,13 +39,7 @@ Layout/FirstHashElementIndentation:
|
|||
# Reason: Currently disabled in .rubocop_todo.yml
|
||||
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
|
||||
Layout/LineLength:
|
||||
Max: 320 # Default of 120 causes a duplicate entry in generated todo file
|
||||
|
||||
# Reason:
|
||||
# https://docs.rubocop.org/rubocop/cops_lint.html#lintuselessaccessmodifier
|
||||
Lint/UselessAccessModifier:
|
||||
ContextCreatingMethods:
|
||||
- class_methods
|
||||
Max: 300 # Default of 120 causes a duplicate entry in generated todo file
|
||||
|
||||
## Disable most Metrics/*Length cops
|
||||
# Reason: those are often triggered and force significant refactors when this happend
|
||||
|
@ -86,6 +80,11 @@ Metrics/CyclomaticComplexity:
|
|||
Metrics/ParameterLists:
|
||||
CountKeywordArgs: false
|
||||
|
||||
# Reason: Prefer seeing a variable name
|
||||
# https://docs.rubocop.org/rubocop/cops_naming.html#namingblockforwarding
|
||||
Naming/BlockForwarding:
|
||||
EnforcedStyle: explicit
|
||||
|
||||
# Reason: Prevailing style is argument file paths
|
||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsfilepath
|
||||
Rails/FilePath:
|
||||
|
@ -148,11 +147,6 @@ RSpec/NamedSubject:
|
|||
RSpec/NotToNot:
|
||||
EnforcedStyle: to_not
|
||||
|
||||
# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
|
||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
|
||||
RSpec/Rails/HttpStatus:
|
||||
EnforcedStyle: numeric
|
||||
|
||||
# Reason: Match overrides from Rspec/FilePath rule above
|
||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecspecfilepathformat
|
||||
RSpec/SpecFilePathFormat:
|
||||
|
@ -163,6 +157,11 @@ RSpec/SpecFilePathFormat:
|
|||
OEmbedController: oembed_controller
|
||||
OStatus: ostatus
|
||||
|
||||
# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
|
||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
|
||||
RSpecRails/HttpStatus:
|
||||
EnforcedStyle: numeric
|
||||
|
||||
# Reason:
|
||||
# https://docs.rubocop.org/rubocop/cops_style.html#styleclassandmodulechildren
|
||||
Style/ClassAndModuleChildren:
|
||||
|
@ -186,6 +185,7 @@ Style/FormatStringToken:
|
|||
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
|
||||
Style/HashSyntax:
|
||||
EnforcedStyle: ruby19_no_mixed_keys
|
||||
EnforcedShorthandSyntax: either
|
||||
|
||||
# Reason:
|
||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# This configuration was generated by
|
||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
|
||||
# using RuboCop version 1.60.2.
|
||||
# using RuboCop version 1.62.1.
|
||||
# The point is for the user to remove these configuration records
|
||||
# one by one as the offenses are removed from the code base.
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
|
@ -36,7 +36,7 @@ Metrics/PerceivedComplexity:
|
|||
|
||||
# Configuration parameters: CountAsOne.
|
||||
RSpec/ExampleLength:
|
||||
Max: 20 # Override default of 5
|
||||
Max: 18
|
||||
|
||||
RSpec/MultipleExpectations:
|
||||
Max: 7
|
||||
|
@ -88,7 +88,6 @@ Style/FetchEnvVar:
|
|||
Exclude:
|
||||
- 'app/lib/redis_configuration.rb'
|
||||
- 'app/lib/translation_service.rb'
|
||||
- 'config/environments/development.rb'
|
||||
- 'config/environments/production.rb'
|
||||
- 'config/initializers/2_limited_federation_mode.rb'
|
||||
- 'config/initializers/3_omniauth.rb'
|
||||
|
@ -98,7 +97,6 @@ Style/FetchEnvVar:
|
|||
- 'config/initializers/paperclip.rb'
|
||||
- 'config/initializers/vapid.rb'
|
||||
- 'lib/mastodon/redis_config.rb'
|
||||
- 'lib/premailer_webpack_strategy.rb'
|
||||
- 'lib/tasks/repo.rake'
|
||||
- 'spec/features/profile_spec.rb'
|
||||
|
||||
|
@ -144,7 +142,6 @@ Style/GuardClause:
|
|||
- 'lib/mastodon/cli/accounts.rb'
|
||||
- 'lib/mastodon/cli/maintenance.rb'
|
||||
- 'lib/mastodon/cli/media.rb'
|
||||
- 'lib/paperclip/attachment_extensions.rb'
|
||||
- 'lib/tasks/repo.rake'
|
||||
|
||||
# This cop supports safe autocorrection (--autocorrect).
|
||||
|
@ -252,11 +249,6 @@ Style/SignalException:
|
|||
- 'lib/devise/strategies/two_factor_ldap_authenticatable.rb'
|
||||
- 'lib/devise/strategies/two_factor_pam_authenticatable.rb'
|
||||
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
Style/SingleArgumentDig:
|
||||
Exclude:
|
||||
- 'lib/webpacker/manifest_extensions.rb'
|
||||
|
||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||
# Configuration parameters: Mode.
|
||||
Style/StringConcatenation:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# syntax=docker/dockerfile:1.4
|
||||
# syntax=docker/dockerfile:1.7
|
||||
|
||||
# Please see https://docs.docker.com/engine/reference/builder for information about
|
||||
# the extended buildx capabilities used in this file.
|
||||
|
@ -205,7 +205,12 @@ ARG TARGETPLATFORM
|
|||
|
||||
RUN \
|
||||
# Use Ruby on Rails to create Mastodon assets
|
||||
OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder bundle exec rails assets:precompile; \
|
||||
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=precompile_placeholder \
|
||||
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=precompile_placeholder \
|
||||
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=precompile_placeholder \
|
||||
OTP_SECRET=precompile_placeholder \
|
||||
SECRET_KEY_BASE=precompile_placeholder \
|
||||
bundle exec rails assets:precompile; \
|
||||
# Cleanup temporary files
|
||||
rm -fr /opt/mastodon/tmp;
|
||||
|
||||
|
|
7
Gemfile
7
Gemfile
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source 'https://rubygems.org'
|
||||
ruby '>= 3.0.0'
|
||||
ruby '>= 3.1.0'
|
||||
|
||||
gem 'puma', '~> 6.3'
|
||||
gem 'rails', '~> 7.1.1'
|
||||
|
@ -69,7 +69,6 @@ gem 'nsa'
|
|||
gem 'oj', '~> 3.14'
|
||||
gem 'ox', '~> 2.14'
|
||||
gem 'parslet'
|
||||
gem 'posix-spawn'
|
||||
gem 'public_suffix', '~> 5.0'
|
||||
gem 'pundit', '~> 2.3'
|
||||
gem 'premailer-rails'
|
||||
|
@ -89,7 +88,7 @@ gem 'sidekiq-unique-jobs', '~> 7.1'
|
|||
gem 'sidekiq-bulk', '~> 0.2.0'
|
||||
gem 'simple-navigation', '~> 4.4'
|
||||
gem 'simple_form', '~> 5.2'
|
||||
gem 'stoplight', '~> 3.0.1'
|
||||
gem 'stoplight', '~> 4.1'
|
||||
gem 'strong_migrations', '1.8.0'
|
||||
gem 'tty-prompt', '~> 0.23', require: false
|
||||
gem 'twitter-text', '~> 3.1.0'
|
||||
|
@ -207,3 +206,5 @@ gem 'net-http', '~> 0.4.0'
|
|||
gem 'rubyzip', '~> 2.3'
|
||||
|
||||
gem 'hcaptcha', '~> 7.1'
|
||||
|
||||
gem 'mail', '~> 2.8'
|
||||
|
|
109
Gemfile.lock
109
Gemfile.lock
|
@ -99,20 +99,20 @@ GEM
|
|||
ast (2.4.2)
|
||||
attr_encrypted (4.0.0)
|
||||
encryptor (~> 3.0.0)
|
||||
attr_required (1.0.1)
|
||||
attr_required (1.0.2)
|
||||
awrence (1.2.1)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.873.0)
|
||||
aws-sdk-core (3.190.1)
|
||||
aws-partitions (1.914.0)
|
||||
aws-sdk-core (3.192.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.8)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.75.0)
|
||||
aws-sdk-core (~> 3, >= 3.188.0)
|
||||
aws-sdk-kms (1.79.0)
|
||||
aws-sdk-core (~> 3, >= 3.191.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.142.0)
|
||||
aws-sdk-core (~> 3, >= 3.189.0)
|
||||
aws-sdk-s3 (1.147.0)
|
||||
aws-sdk-core (~> 3, >= 3.192.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-sigv4 (1.8.0)
|
||||
|
@ -132,7 +132,7 @@ GEM
|
|||
erubi (>= 1.0.0)
|
||||
rack (>= 0.9.0)
|
||||
rouge (>= 1.0.0)
|
||||
better_html (2.0.2)
|
||||
better_html (2.1.1)
|
||||
actionview (>= 6.0)
|
||||
activesupport (>= 6.0)
|
||||
ast (~> 2.0)
|
||||
|
@ -140,9 +140,9 @@ GEM
|
|||
parser (>= 2.4)
|
||||
smart_properties
|
||||
bigdecimal (3.1.7)
|
||||
bindata (2.4.15)
|
||||
binding_of_caller (1.0.0)
|
||||
debug_inspector (>= 0.0.1)
|
||||
bindata (2.5.0)
|
||||
binding_of_caller (1.0.1)
|
||||
debug_inspector (>= 1.2.0)
|
||||
blurhash (0.1.7)
|
||||
bootsnap (1.18.3)
|
||||
msgpack (~> 1.2)
|
||||
|
@ -167,7 +167,7 @@ GEM
|
|||
xpath (~> 3.2)
|
||||
case_transform (0.2)
|
||||
activesupport
|
||||
cbor (0.5.9.6)
|
||||
cbor (0.5.9.8)
|
||||
charlock_holmes (0.7.7)
|
||||
chewy (7.5.1)
|
||||
activesupport (>= 5.2)
|
||||
|
@ -182,23 +182,23 @@ GEM
|
|||
cose (1.3.0)
|
||||
cbor (~> 0.5.9)
|
||||
openssl-signature_algorithm (~> 1.0)
|
||||
crack (0.4.6)
|
||||
crack (1.0.0)
|
||||
bigdecimal
|
||||
rexml
|
||||
crass (1.0.6)
|
||||
css_parser (1.14.0)
|
||||
css_parser (1.16.0)
|
||||
addressable
|
||||
csv (3.2.8)
|
||||
csv (3.3.0)
|
||||
database_cleaner-active_record (2.1.0)
|
||||
activerecord (>= 5.a)
|
||||
database_cleaner-core (~> 2.0.0)
|
||||
database_cleaner-core (2.0.1)
|
||||
date (3.3.4)
|
||||
debug (1.9.1)
|
||||
debug (1.9.2)
|
||||
irb (~> 1.10)
|
||||
reline (>= 0.3.8)
|
||||
debug_inspector (1.1.0)
|
||||
devise (4.9.3)
|
||||
debug_inspector (1.2.0)
|
||||
devise (4.9.4)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 4.1.0)
|
||||
|
@ -217,8 +217,7 @@ GEM
|
|||
discard (1.3.0)
|
||||
activerecord (>= 4.2, < 8)
|
||||
docile (1.4.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
domain_name (0.6.20240107)
|
||||
doorkeeper (5.6.9)
|
||||
railties (>= 5)
|
||||
dotenv (2.8.1)
|
||||
|
@ -242,11 +241,11 @@ GEM
|
|||
mail (~> 2.7)
|
||||
encryptor (3.0.0)
|
||||
erubi (1.12.0)
|
||||
et-orbi (1.2.7)
|
||||
et-orbi (1.2.10)
|
||||
tzinfo
|
||||
excon (0.109.0)
|
||||
excon (0.110.0)
|
||||
fabrication (2.31.0)
|
||||
faker (3.2.3)
|
||||
faker (3.3.1)
|
||||
i18n (>= 1.8.11, < 2)
|
||||
faraday (1.10.3)
|
||||
faraday-em_http (~> 1.0)
|
||||
|
@ -274,8 +273,8 @@ GEM
|
|||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fast_blank (1.0.1)
|
||||
fastimage (2.3.0)
|
||||
ffi (1.15.5)
|
||||
fastimage (2.3.1)
|
||||
ffi (1.16.3)
|
||||
ffi-compiler (1.0.1)
|
||||
ffi (>= 1.0.0)
|
||||
rake
|
||||
|
@ -291,7 +290,7 @@ GEM
|
|||
fog-core (~> 2.1)
|
||||
fog-json (>= 1.0)
|
||||
formatador (1.1.0)
|
||||
fugit (1.8.1)
|
||||
fugit (1.10.1)
|
||||
et-orbi (~> 1, >= 1.2.7)
|
||||
raabro (~> 1.4)
|
||||
fuubar (2.5.1)
|
||||
|
@ -357,7 +356,7 @@ GEM
|
|||
rdoc
|
||||
reline (>= 0.4.2)
|
||||
jmespath (1.6.2)
|
||||
json (2.7.1)
|
||||
json (2.7.2)
|
||||
json-canonicalization (1.0.0)
|
||||
json-jwt (1.15.3.1)
|
||||
activesupport (>= 4.2)
|
||||
|
@ -374,7 +373,7 @@ GEM
|
|||
json-ld-preloaded (3.3.0)
|
||||
json-ld (~> 3.3)
|
||||
rdf (~> 3.3)
|
||||
json-schema (4.2.0)
|
||||
json-schema (4.3.0)
|
||||
addressable (>= 2.8)
|
||||
jsonapi-renderer (0.2.2)
|
||||
jwt (2.7.1)
|
||||
|
@ -399,8 +398,8 @@ GEM
|
|||
language_server-protocol (3.17.0.3)
|
||||
launchy (2.5.2)
|
||||
addressable (~> 2.8)
|
||||
letter_opener (1.8.1)
|
||||
launchy (>= 2.2, < 3)
|
||||
letter_opener (1.10.0)
|
||||
launchy (>= 2.2, < 4)
|
||||
letter_opener_web (2.0.0)
|
||||
actionmailer (>= 5.2)
|
||||
letter_opener (~> 1.7)
|
||||
|
@ -423,7 +422,7 @@ GEM
|
|||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
marcel (1.0.2)
|
||||
marcel (1.0.4)
|
||||
mario-redis-lock (1.2.1)
|
||||
redis (>= 3.0.5)
|
||||
matrix (0.4.2)
|
||||
|
@ -434,7 +433,7 @@ GEM
|
|||
memory_profiler (1.0.1)
|
||||
mime-types (3.5.2)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2023.1205)
|
||||
mime-types-data (3.2024.0305)
|
||||
mini_mime (1.1.5)
|
||||
mini_portile2 (2.8.5)
|
||||
minitest (5.22.3)
|
||||
|
@ -456,8 +455,8 @@ GEM
|
|||
timeout
|
||||
net-smtp (0.4.0.1)
|
||||
net-protocol
|
||||
nio4r (2.5.9)
|
||||
nokogiri (1.16.3)
|
||||
nio4r (2.7.1)
|
||||
nokogiri (1.16.4)
|
||||
mini_portile2 (~> 2.8.2)
|
||||
racc (~> 1.4)
|
||||
nsa (0.3.0)
|
||||
|
@ -510,8 +509,7 @@ GEM
|
|||
pg (1.5.6)
|
||||
pghero (3.4.1)
|
||||
activerecord (>= 6)
|
||||
posix-spawn (0.3.15)
|
||||
premailer (1.21.0)
|
||||
premailer (1.23.0)
|
||||
addressable
|
||||
css_parser (>= 1.12.0)
|
||||
htmlentities (>= 4.0.0)
|
||||
|
@ -527,7 +525,7 @@ GEM
|
|||
railties (>= 7.0.0)
|
||||
psych (5.1.2)
|
||||
stringio
|
||||
public_suffix (5.0.4)
|
||||
public_suffix (5.0.5)
|
||||
puma (6.4.2)
|
||||
nio4r (~> 2.0)
|
||||
pundit (2.3.1)
|
||||
|
@ -609,7 +607,7 @@ GEM
|
|||
redlock (1.3.2)
|
||||
redis (>= 3.0.0, < 6.0)
|
||||
regexp_parser (2.9.0)
|
||||
reline (0.4.3)
|
||||
reline (0.5.1)
|
||||
io-console (~> 0.5)
|
||||
request_store (1.5.1)
|
||||
rack (>= 1.4)
|
||||
|
@ -618,7 +616,7 @@ GEM
|
|||
railties (>= 5.2)
|
||||
rexml (3.2.6)
|
||||
rotp (6.3.0)
|
||||
rouge (4.1.2)
|
||||
rouge (4.2.1)
|
||||
rpam2 (4.0.2)
|
||||
rqrcode (2.2.0)
|
||||
chunky_png (~> 1.0)
|
||||
|
@ -642,13 +640,13 @@ GEM
|
|||
rspec-expectations (~> 3.13)
|
||||
rspec-mocks (~> 3.13)
|
||||
rspec-support (~> 3.13)
|
||||
rspec-sidekiq (4.1.0)
|
||||
rspec-sidekiq (4.2.0)
|
||||
rspec-core (~> 3.0)
|
||||
rspec-expectations (~> 3.0)
|
||||
rspec-mocks (~> 3.0)
|
||||
sidekiq (>= 5, < 8)
|
||||
rspec-support (3.13.1)
|
||||
rubocop (1.62.1)
|
||||
rubocop (1.63.2)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (>= 3.17.0)
|
||||
parallel (~> 1.10)
|
||||
|
@ -665,18 +663,21 @@ GEM
|
|||
rubocop (~> 1.41)
|
||||
rubocop-factory_bot (2.25.1)
|
||||
rubocop (~> 1.41)
|
||||
rubocop-performance (1.20.2)
|
||||
rubocop-performance (1.21.0)
|
||||
rubocop (>= 1.48.1, < 2.0)
|
||||
rubocop-ast (>= 1.30.0, < 2.0)
|
||||
rubocop-rails (2.24.0)
|
||||
rubocop-ast (>= 1.31.1, < 2.0)
|
||||
rubocop-rails (2.24.1)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.33.0, < 2.0)
|
||||
rubocop-ast (>= 1.31.1, < 2.0)
|
||||
rubocop-rspec (2.27.1)
|
||||
rubocop-rspec (2.29.1)
|
||||
rubocop (~> 1.40)
|
||||
rubocop-capybara (~> 2.17)
|
||||
rubocop-factory_bot (~> 2.22)
|
||||
rubocop-rspec_rails (~> 2.28)
|
||||
rubocop-rspec_rails (2.28.2)
|
||||
rubocop (~> 1.40)
|
||||
ruby-prof (1.7.0)
|
||||
ruby-progressbar (1.13.0)
|
||||
ruby-saml (1.15.0)
|
||||
|
@ -691,10 +692,10 @@ GEM
|
|||
sanitize (6.1.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
scenic (1.7.0)
|
||||
scenic (1.8.0)
|
||||
activerecord (>= 4.0.0)
|
||||
railties (>= 4.0.0)
|
||||
selenium-webdriver (4.18.1)
|
||||
selenium-webdriver (4.19.0)
|
||||
base64 (~> 0.2)
|
||||
rexml (~> 3.2, >= 3.2.5)
|
||||
rubyzip (>= 1.2.2, < 3.0)
|
||||
|
@ -731,7 +732,7 @@ GEM
|
|||
smart_properties (1.17.0)
|
||||
stackprof (0.2.26)
|
||||
statsd-ruby (1.5.0)
|
||||
stoplight (3.0.2)
|
||||
stoplight (4.1.0)
|
||||
redlock (~> 1.0)
|
||||
stringio (3.1.0)
|
||||
strong_migrations (1.8.0)
|
||||
|
@ -763,7 +764,7 @@ GEM
|
|||
tty-cursor (~> 0.7)
|
||||
tty-screen (~> 0.8)
|
||||
wisper (~> 2.0)
|
||||
tty-screen (0.8.1)
|
||||
tty-screen (0.8.2)
|
||||
twitter-text (3.1.0)
|
||||
idn-ruby
|
||||
unf (~> 0.1.0)
|
||||
|
@ -773,7 +774,7 @@ GEM
|
|||
tzinfo (>= 1.0.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8.2)
|
||||
unf_ext (0.0.9.1)
|
||||
unicode-display_width (2.5.0)
|
||||
uri (0.12.2)
|
||||
validate_email (0.1.6)
|
||||
|
@ -796,7 +797,7 @@ GEM
|
|||
webfinger (1.2.0)
|
||||
activesupport
|
||||
httpclient (>= 2.4)
|
||||
webmock (3.22.0)
|
||||
webmock (3.23.0)
|
||||
addressable (>= 2.8.0)
|
||||
crack (>= 0.3.2)
|
||||
hashdiff (>= 0.4.0, < 2.0.0)
|
||||
|
@ -879,6 +880,7 @@ DEPENDENCIES
|
|||
letter_opener_web (~> 2.0)
|
||||
link_header (~> 0.0)
|
||||
lograge (~> 0.12)
|
||||
mail (~> 2.8)
|
||||
mario-redis-lock (~> 1.2)
|
||||
md-paperclip-azure (~> 2.2)
|
||||
memory_profiler
|
||||
|
@ -897,7 +899,6 @@ DEPENDENCIES
|
|||
parslet
|
||||
pg (~> 1.5)
|
||||
pghero
|
||||
posix-spawn
|
||||
premailer-rails
|
||||
private_address_check (~> 0.5)
|
||||
propshaft
|
||||
|
@ -939,7 +940,7 @@ DEPENDENCIES
|
|||
simplecov (~> 0.22)
|
||||
simplecov-lcov (~> 0.8)
|
||||
stackprof
|
||||
stoplight (~> 3.0.1)
|
||||
stoplight (~> 4.1)
|
||||
strong_migrations (= 1.8.0)
|
||||
test-prof
|
||||
thor (~> 1.2)
|
||||
|
@ -956,4 +957,4 @@ RUBY VERSION
|
|||
ruby 3.2.2p53
|
||||
|
||||
BUNDLED WITH
|
||||
2.5.4
|
||||
2.5.7
|
||||
|
|
|
@ -69,7 +69,7 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
|
|||
|
||||
- **PostgreSQL** 12+
|
||||
- **Redis** 4+
|
||||
- **Ruby** 3.0+
|
||||
- **Ruby** 3.1+
|
||||
- **Node.js** 16+
|
||||
|
||||
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
|
||||
|
|
1
Vagrantfile
vendored
1
Vagrantfile
vendored
|
@ -173,6 +173,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|||
|
||||
# Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
|
||||
config.vm.network :forwarded_port, guest: 3000, host: 3000
|
||||
config.vm.network :forwarded_port, guest: 3035, host: 3035
|
||||
config.vm.network :forwarded_port, guest: 4000, host: 4000
|
||||
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
||||
config.vm.network :forwarded_port, guest: 9200, host: 9200
|
||||
|
|
|
@ -46,7 +46,7 @@ class AccountsController < ApplicationController
|
|||
end
|
||||
|
||||
def default_statuses
|
||||
@account.statuses.where(visibility: [:public, :unlisted])
|
||||
@account.statuses.distributable_visibility
|
||||
end
|
||||
|
||||
def only_media_scope
|
||||
|
|
|
@ -31,7 +31,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
|
|||
|
||||
def set_replies
|
||||
@replies = only_other_accounts? ? Status.where.not(account_id: @account.id).joins(:account).merge(Account.without_suspended) : @account.statuses
|
||||
@replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted])
|
||||
@replies = @replies.distributable_visibility.where(in_reply_to_id: @status.id)
|
||||
@replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
|
||||
end
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ class Api::BaseController < ApplicationController
|
|||
include Api::CachingConcern
|
||||
include Api::ContentSecurityPolicy
|
||||
include Api::ErrorHandling
|
||||
include Api::Pagination
|
||||
|
||||
skip_before_action :require_functional!, unless: :limited_federation_mode?
|
||||
|
||||
|
@ -29,21 +30,6 @@ class Api::BaseController < ApplicationController
|
|||
|
||||
protected
|
||||
|
||||
def pagination_max_id
|
||||
pagination_collection.last.id
|
||||
end
|
||||
|
||||
def pagination_since_id
|
||||
pagination_collection.first.id
|
||||
end
|
||||
|
||||
def set_pagination_headers(next_path = nil, prev_path = nil)
|
||||
links = []
|
||||
links << [next_path, [%w(rel next)]] if next_path
|
||||
links << [prev_path, [%w(rel prev)]] if prev_path
|
||||
response.headers['Link'] = LinkHeader.new(links) unless links.empty?
|
||||
end
|
||||
|
||||
def limit_param(default_limit)
|
||||
return default_limit unless params[:limit]
|
||||
|
||||
|
@ -72,10 +58,6 @@ class Api::BaseController < ApplicationController
|
|||
render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.unavailable?
|
||||
end
|
||||
|
||||
def require_valid_pagination_options!
|
||||
render json: { error: 'Pagination values for `offset` and `limit` must be positive' }, status: 400 if pagination_options_invalid?
|
||||
end
|
||||
|
||||
def require_user!
|
||||
if !current_user
|
||||
render json: { error: 'This method requires an authenticated user' }, status: 422
|
||||
|
@ -104,14 +86,6 @@ class Api::BaseController < ApplicationController
|
|||
|
||||
private
|
||||
|
||||
def insert_pagination_headers
|
||||
set_pagination_headers(next_path, prev_path)
|
||||
end
|
||||
|
||||
def pagination_options_invalid?
|
||||
params.slice(:limit, :offset).values.map(&:to_i).any?(&:negative?)
|
||||
end
|
||||
|
||||
def respond_with_error(code)
|
||||
render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code
|
||||
end
|
||||
|
|
|
@ -12,10 +12,6 @@ class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController
|
|||
private
|
||||
|
||||
def set_recently_used_tags
|
||||
@recently_used_tags = Tag.recently_used(current_account).where.not(id: featured_tag_ids).limit(10)
|
||||
end
|
||||
|
||||
def featured_tag_ids
|
||||
current_account.featured_tags.pluck(:tag_id)
|
||||
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(10)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -23,7 +23,7 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::V1::Statuses::Base
|
|||
end
|
||||
|
||||
def paginated_statuses
|
||||
Status.where(reblog_of_id: @status.id).where(visibility: [:public, :unlisted]).paginate_by_max_id(
|
||||
Status.where(reblog_of_id: @status.id).distributable_visibility.paginate_by_max_id(
|
||||
limit_param(DEFAULT_ACCOUNTS_LIMIT),
|
||||
params[:max_id],
|
||||
params[:since_id]
|
||||
|
|
36
app/controllers/concerns/api/pagination.rb
Normal file
36
app/controllers/concerns/api/pagination.rb
Normal file
|
@ -0,0 +1,36 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Api::Pagination
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
protected
|
||||
|
||||
def pagination_max_id
|
||||
pagination_collection.last.id
|
||||
end
|
||||
|
||||
def pagination_since_id
|
||||
pagination_collection.first.id
|
||||
end
|
||||
|
||||
def set_pagination_headers(next_path = nil, prev_path = nil)
|
||||
links = []
|
||||
links << [next_path, [%w(rel next)]] if next_path
|
||||
links << [prev_path, [%w(rel prev)]] if prev_path
|
||||
response.headers['Link'] = LinkHeader.new(links) unless links.empty?
|
||||
end
|
||||
|
||||
def require_valid_pagination_options!
|
||||
render json: { error: 'Pagination values for `offset` and `limit` must be positive' }, status: 400 if pagination_options_invalid?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def insert_pagination_headers
|
||||
set_pagination_headers(next_path, prev_path)
|
||||
end
|
||||
|
||||
def pagination_options_invalid?
|
||||
params.slice(:limit, :offset).values.map(&:to_i).any?(&:negative?)
|
||||
end
|
||||
end
|
|
@ -46,27 +46,19 @@ module CacheConcern
|
|||
end
|
||||
end
|
||||
|
||||
# TODO: Rename this method, as it does not perform any caching anymore.
|
||||
def cache_collection(raw, klass)
|
||||
return raw unless klass.respond_to?(:with_includes)
|
||||
return raw unless klass.respond_to?(:preload_cacheable_associations)
|
||||
|
||||
raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation)
|
||||
return [] if raw.empty?
|
||||
records = raw.to_a
|
||||
|
||||
cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id)
|
||||
klass.preload_cacheable_associations(records)
|
||||
|
||||
uncached_ids = raw.map(&:id) - cached_keys_with_value.keys
|
||||
|
||||
klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!)
|
||||
|
||||
unless uncached_ids.empty?
|
||||
uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id)
|
||||
Rails.cache.write_multi(uncached.values.to_h { |i| [i, i] })
|
||||
end
|
||||
|
||||
raw.filter_map { |item| cached_keys_with_value[item.id] || uncached[item.id] }
|
||||
records
|
||||
end
|
||||
|
||||
# TODO: Rename this method, as it does not perform any caching anymore.
|
||||
def cache_collection_paginated_by_id(raw, klass, limit, options)
|
||||
cache_collection raw.cache_ids.to_a_paginated_by_id(limit, options), klass
|
||||
cache_collection raw.to_a_paginated_by_id(limit, options), klass
|
||||
end
|
||||
end
|
||||
|
|
|
@ -66,7 +66,7 @@ module SignatureVerification
|
|||
compare_signed_string = build_signed_string(include_query_string: false)
|
||||
return actor unless verify_signature(actor, signature, compare_signed_string).nil?
|
||||
|
||||
actor = stoplight_wrap_request { actor_refresh_key!(actor) }
|
||||
actor = stoplight_wrapper.run { actor_refresh_key!(actor) }
|
||||
|
||||
raise SignatureVerificationError, "Could not refresh public key #{signature_params['keyId']}" if actor.nil?
|
||||
|
||||
|
@ -226,10 +226,10 @@ module SignatureVerification
|
|||
end
|
||||
|
||||
if key_id.start_with?('acct:')
|
||||
stoplight_wrap_request { ResolveAccountService.new.call(key_id.delete_prefix('acct:'), suppress_errors: false) }
|
||||
stoplight_wrapper.run { ResolveAccountService.new.call(key_id.delete_prefix('acct:'), suppress_errors: false) }
|
||||
elsif !ActivityPub::TagManager.instance.local_uri?(key_id)
|
||||
account = ActivityPub::TagManager.instance.uri_to_actor(key_id)
|
||||
account ||= stoplight_wrap_request { ActivityPub::FetchRemoteKeyService.new.call(key_id, suppress_errors: false) }
|
||||
account ||= stoplight_wrapper.run { ActivityPub::FetchRemoteKeyService.new.call(key_id, suppress_errors: false) }
|
||||
account
|
||||
end
|
||||
rescue Mastodon::PrivateNetworkAddressError => e
|
||||
|
@ -238,12 +238,11 @@ module SignatureVerification
|
|||
raise SignatureVerificationError, e.message
|
||||
end
|
||||
|
||||
def stoplight_wrap_request(&block)
|
||||
Stoplight("source:#{request.remote_ip}", &block)
|
||||
def stoplight_wrapper
|
||||
Stoplight("source:#{request.remote_ip}")
|
||||
.with_threshold(1)
|
||||
.with_cool_off_time(5.minutes.seconds)
|
||||
.with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) }
|
||||
.run
|
||||
end
|
||||
|
||||
def actor_refresh_key!(actor)
|
||||
|
|
|
@ -38,7 +38,7 @@ class Settings::FeaturedTagsController < Settings::BaseController
|
|||
end
|
||||
|
||||
def set_recently_used_tags
|
||||
@recently_used_tags = Tag.recently_used(current_account).where.not(id: @featured_tags.map(&:id)).limit(10)
|
||||
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(10)
|
||||
end
|
||||
|
||||
def featured_tag_params
|
||||
|
|
|
@ -19,6 +19,6 @@ module BrandingHelper
|
|||
end
|
||||
|
||||
def render_logo
|
||||
image_pack_tag('logo.svg', alt: 'Mastodon', class: 'logo logo--icon')
|
||||
image_tag(frontend_asset_path('images/logo.svg'), alt: 'Mastodon', class: 'logo logo--icon')
|
||||
end
|
||||
end
|
||||
|
|
|
@ -48,13 +48,11 @@ module ContextHelper
|
|||
end
|
||||
|
||||
def serialized_context(named_contexts_map, context_extensions_map)
|
||||
context_array = []
|
||||
|
||||
named_contexts = named_contexts_map.keys
|
||||
context_extensions = context_extensions_map.keys
|
||||
|
||||
named_contexts.each do |key|
|
||||
context_array << NAMED_CONTEXT_MAP[key]
|
||||
context_array = named_contexts.map do |key|
|
||||
NAMED_CONTEXT_MAP[key]
|
||||
end
|
||||
|
||||
extensions = context_extensions.each_with_object({}) do |key, h|
|
||||
|
|
27
app/helpers/theme_helper.rb
Normal file
27
app/helpers/theme_helper.rb
Normal file
|
@ -0,0 +1,27 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module ThemeHelper
|
||||
def theme_style_tags(theme)
|
||||
if theme == 'system'
|
||||
stylesheet_pack_tag('mastodon-light', media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') +
|
||||
stylesheet_pack_tag('default', media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous')
|
||||
else
|
||||
stylesheet_pack_tag theme, media: 'all', crossorigin: 'anonymous'
|
||||
end
|
||||
end
|
||||
|
||||
def theme_color_tags(theme)
|
||||
if theme == 'system'
|
||||
tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)') +
|
||||
tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)')
|
||||
else
|
||||
tag.meta name: 'theme-color', content: theme_color_for(theme)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def theme_color_for(theme)
|
||||
theme == 'mastodon-light' ? Themes::THEME_COLORS[:light] : Themes::THEME_COLORS[:dark]
|
||||
end
|
||||
end
|
|
@ -1,32 +0,0 @@
|
|||
import { openModal } from './modal';
|
||||
|
||||
export const BOOSTS_INIT_MODAL = 'BOOSTS_INIT_MODAL';
|
||||
export const BOOSTS_CHANGE_PRIVACY = 'BOOSTS_CHANGE_PRIVACY';
|
||||
|
||||
export function initBoostModal(props) {
|
||||
return (dispatch, getState) => {
|
||||
const default_privacy = getState().getIn(['compose', 'default_privacy']);
|
||||
|
||||
const privacy = props.status.get('visibility') === 'private' ? 'private' : default_privacy;
|
||||
|
||||
dispatch({
|
||||
type: BOOSTS_INIT_MODAL,
|
||||
privacy,
|
||||
});
|
||||
|
||||
dispatch(openModal({
|
||||
modalType: 'BOOST',
|
||||
modalProps: props,
|
||||
}));
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
export function changeBoostPrivacy(privacy) {
|
||||
return dispatch => {
|
||||
dispatch({
|
||||
type: BOOSTS_CHANGE_PRIVACY,
|
||||
privacy,
|
||||
});
|
||||
};
|
||||
}
|
|
@ -1,152 +0,0 @@
|
|||
import { List as ImmutableList } from 'immutable';
|
||||
|
||||
import { debounce } from 'lodash';
|
||||
|
||||
import api from '../api';
|
||||
import { compareId } from '../compare_id';
|
||||
|
||||
export const MARKERS_FETCH_REQUEST = 'MARKERS_FETCH_REQUEST';
|
||||
export const MARKERS_FETCH_SUCCESS = 'MARKERS_FETCH_SUCCESS';
|
||||
export const MARKERS_FETCH_FAIL = 'MARKERS_FETCH_FAIL';
|
||||
export const MARKERS_SUBMIT_SUCCESS = 'MARKERS_SUBMIT_SUCCESS';
|
||||
|
||||
export const synchronouslySubmitMarkers = () => (dispatch, getState) => {
|
||||
const accessToken = getState().getIn(['meta', 'access_token'], '');
|
||||
const params = _buildParams(getState());
|
||||
|
||||
if (Object.keys(params).length === 0 || accessToken === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
// The Fetch API allows us to perform requests that will be carried out
|
||||
// after the page closes. But that only works if the `keepalive` attribute
|
||||
// is supported.
|
||||
if (window.fetch && 'keepalive' in new Request('')) {
|
||||
fetch('/api/v1/markers', {
|
||||
keepalive: true,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': `Bearer ${accessToken}`,
|
||||
},
|
||||
body: JSON.stringify(params),
|
||||
});
|
||||
|
||||
return;
|
||||
} else if (navigator && navigator.sendBeacon) {
|
||||
// Failing that, we can use sendBeacon, but we have to encode the data as
|
||||
// FormData for DoorKeeper to recognize the token.
|
||||
const formData = new FormData();
|
||||
|
||||
formData.append('bearer_token', accessToken);
|
||||
|
||||
for (const [id, value] of Object.entries(params)) {
|
||||
formData.append(`${id}[last_read_id]`, value.last_read_id);
|
||||
}
|
||||
|
||||
if (navigator.sendBeacon('/api/v1/markers', formData)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If neither Fetch nor sendBeacon worked, try to perform a synchronous
|
||||
// request.
|
||||
try {
|
||||
const client = new XMLHttpRequest();
|
||||
|
||||
client.open('POST', '/api/v1/markers', false);
|
||||
client.setRequestHeader('Content-Type', 'application/json');
|
||||
client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
|
||||
client.send(JSON.stringify(params));
|
||||
} catch (e) {
|
||||
// Do not make the BeforeUnload handler error out
|
||||
}
|
||||
};
|
||||
|
||||
const _buildParams = (state) => {
|
||||
const params = {};
|
||||
|
||||
const lastHomeId = state.getIn(['timelines', 'home', 'items'], ImmutableList()).find(item => item !== null);
|
||||
const lastNotificationId = state.getIn(['notifications', 'lastReadId']);
|
||||
|
||||
if (lastHomeId && compareId(lastHomeId, state.getIn(['markers', 'home'])) > 0) {
|
||||
params.home = {
|
||||
last_read_id: lastHomeId,
|
||||
};
|
||||
}
|
||||
|
||||
if (lastNotificationId && compareId(lastNotificationId, state.getIn(['markers', 'notifications'])) > 0) {
|
||||
params.notifications = {
|
||||
last_read_id: lastNotificationId,
|
||||
};
|
||||
}
|
||||
|
||||
return params;
|
||||
};
|
||||
|
||||
const debouncedSubmitMarkers = debounce((dispatch, getState) => {
|
||||
const accessToken = getState().getIn(['meta', 'access_token'], '');
|
||||
const params = _buildParams(getState());
|
||||
|
||||
if (Object.keys(params).length === 0 || accessToken === '') {
|
||||
return;
|
||||
}
|
||||
|
||||
api(getState).post('/api/v1/markers', params).then(() => {
|
||||
dispatch(submitMarkersSuccess(params));
|
||||
}).catch(() => {});
|
||||
}, 300000, { leading: true, trailing: true });
|
||||
|
||||
export function submitMarkersSuccess({ home, notifications }) {
|
||||
return {
|
||||
type: MARKERS_SUBMIT_SUCCESS,
|
||||
home: (home || {}).last_read_id,
|
||||
notifications: (notifications || {}).last_read_id,
|
||||
};
|
||||
}
|
||||
|
||||
export function submitMarkers(params = {}) {
|
||||
const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState);
|
||||
|
||||
if (params.immediate === true) {
|
||||
debouncedSubmitMarkers.flush();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export const fetchMarkers = () => (dispatch, getState) => {
|
||||
const params = { timeline: ['notifications'] };
|
||||
|
||||
dispatch(fetchMarkersRequest());
|
||||
|
||||
api(getState).get('/api/v1/markers', { params }).then(response => {
|
||||
dispatch(fetchMarkersSuccess(response.data));
|
||||
}).catch(error => {
|
||||
dispatch(fetchMarkersFail(error));
|
||||
});
|
||||
};
|
||||
|
||||
export function fetchMarkersRequest() {
|
||||
return {
|
||||
type: MARKERS_FETCH_REQUEST,
|
||||
skipLoading: true,
|
||||
};
|
||||
}
|
||||
|
||||
export function fetchMarkersSuccess(markers) {
|
||||
return {
|
||||
type: MARKERS_FETCH_SUCCESS,
|
||||
markers,
|
||||
skipLoading: true,
|
||||
};
|
||||
}
|
||||
|
||||
export function fetchMarkersFail(error) {
|
||||
return {
|
||||
type: MARKERS_FETCH_FAIL,
|
||||
error,
|
||||
skipLoading: true,
|
||||
skipAlert: true,
|
||||
};
|
||||
}
|
165
app/javascript/mastodon/actions/markers.ts
Normal file
165
app/javascript/mastodon/actions/markers.ts
Normal file
|
@ -0,0 +1,165 @@
|
|||
import { List as ImmutableList } from 'immutable';
|
||||
|
||||
import { debounce } from 'lodash';
|
||||
|
||||
import type { MarkerJSON } from 'mastodon/api_types/markers';
|
||||
import type { RootState } from 'mastodon/store';
|
||||
import { createAppAsyncThunk } from 'mastodon/store/typed_functions';
|
||||
|
||||
import api, { authorizationTokenFromState } from '../api';
|
||||
import { compareId } from '../compare_id';
|
||||
|
||||
export const synchronouslySubmitMarkers = createAppAsyncThunk(
|
||||
'markers/submit',
|
||||
async (_args, { getState }) => {
|
||||
const accessToken = authorizationTokenFromState(getState);
|
||||
const params = buildPostMarkersParams(getState());
|
||||
|
||||
if (Object.keys(params).length === 0 || !accessToken) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The Fetch API allows us to perform requests that will be carried out
|
||||
// after the page closes. But that only works if the `keepalive` attribute
|
||||
// is supported.
|
||||
if ('fetch' in window && 'keepalive' in new Request('')) {
|
||||
await fetch('/api/v1/markers', {
|
||||
keepalive: true,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${accessToken}`,
|
||||
},
|
||||
body: JSON.stringify(params),
|
||||
});
|
||||
|
||||
return;
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
} else if ('navigator' && 'sendBeacon' in navigator) {
|
||||
// Failing that, we can use sendBeacon, but we have to encode the data as
|
||||
// FormData for DoorKeeper to recognize the token.
|
||||
const formData = new FormData();
|
||||
|
||||
formData.append('bearer_token', accessToken);
|
||||
|
||||
for (const [id, value] of Object.entries(params)) {
|
||||
if (value.last_read_id)
|
||||
formData.append(`${id}[last_read_id]`, value.last_read_id);
|
||||
}
|
||||
|
||||
if (navigator.sendBeacon('/api/v1/markers', formData)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If neither Fetch nor sendBeacon worked, try to perform a synchronous
|
||||
// request.
|
||||
try {
|
||||
const client = new XMLHttpRequest();
|
||||
|
||||
client.open('POST', '/api/v1/markers', false);
|
||||
client.setRequestHeader('Content-Type', 'application/json');
|
||||
client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
|
||||
client.send(JSON.stringify(params));
|
||||
} catch (e) {
|
||||
// Do not make the BeforeUnload handler error out
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
interface MarkerParam {
|
||||
last_read_id?: string;
|
||||
}
|
||||
|
||||
function getLastHomeId(state: RootState): string | undefined {
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */
|
||||
return (
|
||||
state
|
||||
// @ts-expect-error state.timelines is not yet typed
|
||||
.getIn(['timelines', 'home', 'items'], ImmutableList())
|
||||
// @ts-expect-error state.timelines is not yet typed
|
||||
.find((item) => item !== null)
|
||||
);
|
||||
}
|
||||
|
||||
function getLastNotificationId(state: RootState): string | undefined {
|
||||
// @ts-expect-error state.notifications is not yet typed
|
||||
return state.getIn(['notifications', 'lastReadId']);
|
||||
}
|
||||
|
||||
const buildPostMarkersParams = (state: RootState) => {
|
||||
const params = {} as { home?: MarkerParam; notifications?: MarkerParam };
|
||||
|
||||
const lastHomeId = getLastHomeId(state);
|
||||
const lastNotificationId = getLastNotificationId(state);
|
||||
|
||||
if (lastHomeId && compareId(lastHomeId, state.markers.home) > 0) {
|
||||
params.home = {
|
||||
last_read_id: lastHomeId,
|
||||
};
|
||||
}
|
||||
|
||||
if (
|
||||
lastNotificationId &&
|
||||
compareId(lastNotificationId, state.markers.notifications) > 0
|
||||
) {
|
||||
params.notifications = {
|
||||
last_read_id: lastNotificationId,
|
||||
};
|
||||
}
|
||||
|
||||
return params;
|
||||
};
|
||||
|
||||
export const submitMarkersAction = createAppAsyncThunk<{
|
||||
home: string | undefined;
|
||||
notifications: string | undefined;
|
||||
}>('markers/submitAction', async (_args, { getState }) => {
|
||||
const accessToken = authorizationTokenFromState(getState);
|
||||
const params = buildPostMarkersParams(getState());
|
||||
|
||||
if (Object.keys(params).length === 0 || accessToken === '') {
|
||||
return { home: undefined, notifications: undefined };
|
||||
}
|
||||
|
||||
await api(getState).post<MarkerJSON>('/api/v1/markers', params);
|
||||
|
||||
return {
|
||||
home: params.home?.last_read_id,
|
||||
notifications: params.notifications?.last_read_id,
|
||||
};
|
||||
});
|
||||
|
||||
const debouncedSubmitMarkers = debounce(
|
||||
(dispatch) => {
|
||||
dispatch(submitMarkersAction());
|
||||
},
|
||||
300000,
|
||||
{
|
||||
leading: true,
|
||||
trailing: true,
|
||||
},
|
||||
);
|
||||
|
||||
export const submitMarkers = createAppAsyncThunk(
|
||||
'markers/submit',
|
||||
(params: { immediate?: boolean }, { dispatch }) => {
|
||||
debouncedSubmitMarkers(dispatch);
|
||||
|
||||
if (params.immediate) {
|
||||
debouncedSubmitMarkers.flush();
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
export const fetchMarkers = createAppAsyncThunk(
|
||||
'markers/fetch',
|
||||
async (_args, { getState }) => {
|
||||
const response = await api(getState).get<Record<string, MarkerJSON>>(
|
||||
`/api/v1/markers`,
|
||||
{ params: { timeline: ['notifications'] } },
|
||||
);
|
||||
|
||||
return { markers: response.data };
|
||||
},
|
||||
);
|
|
@ -1,46 +0,0 @@
|
|||
// @ts-check
|
||||
|
||||
export const PICTURE_IN_PICTURE_DEPLOY = 'PICTURE_IN_PICTURE_DEPLOY';
|
||||
export const PICTURE_IN_PICTURE_REMOVE = 'PICTURE_IN_PICTURE_REMOVE';
|
||||
|
||||
/**
|
||||
* @typedef MediaProps
|
||||
* @property {string} src
|
||||
* @property {boolean} muted
|
||||
* @property {number} volume
|
||||
* @property {number} currentTime
|
||||
* @property {string} poster
|
||||
* @property {string} backgroundColor
|
||||
* @property {string} foregroundColor
|
||||
* @property {string} accentColor
|
||||
*/
|
||||
|
||||
/**
|
||||
* @param {string} statusId
|
||||
* @param {string} accountId
|
||||
* @param {string} playerType
|
||||
* @param {MediaProps} props
|
||||
* @returns {object}
|
||||
*/
|
||||
export const deployPictureInPicture = (statusId, accountId, playerType, props) => {
|
||||
// @ts-expect-error
|
||||
return (dispatch, getState) => {
|
||||
// Do not open a player for a toot that does not exist
|
||||
if (getState().hasIn(['statuses', statusId])) {
|
||||
dispatch({
|
||||
type: PICTURE_IN_PICTURE_DEPLOY,
|
||||
statusId,
|
||||
accountId,
|
||||
playerType,
|
||||
props,
|
||||
});
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* @return {object}
|
||||
*/
|
||||
export const removePictureInPicture = () => ({
|
||||
type: PICTURE_IN_PICTURE_REMOVE,
|
||||
});
|
31
app/javascript/mastodon/actions/picture_in_picture.ts
Normal file
31
app/javascript/mastodon/actions/picture_in_picture.ts
Normal file
|
@ -0,0 +1,31 @@
|
|||
import { createAction } from '@reduxjs/toolkit';
|
||||
|
||||
import type { PIPMediaProps } from 'mastodon/reducers/picture_in_picture';
|
||||
import { createAppAsyncThunk } from 'mastodon/store/typed_functions';
|
||||
|
||||
interface DeployParams {
|
||||
statusId: string;
|
||||
accountId: string;
|
||||
playerType: 'audio' | 'video';
|
||||
props: PIPMediaProps;
|
||||
}
|
||||
|
||||
export const removePictureInPicture = createAction('pip/remove');
|
||||
|
||||
export const deployPictureInPictureAction =
|
||||
createAction<DeployParams>('pip/deploy');
|
||||
|
||||
export const deployPictureInPicture = createAppAsyncThunk(
|
||||
'pip/deploy',
|
||||
(args: DeployParams, { dispatch, getState }) => {
|
||||
const { statusId } = args;
|
||||
|
||||
// Do not open a player for a toot that does not exist
|
||||
|
||||
// @ts-expect-error state.statuses is not yet typed
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
||||
if (getState().hasIn(['statuses', statusId])) {
|
||||
dispatch(deployPictureInPictureAction(args));
|
||||
}
|
||||
},
|
||||
);
|
|
@ -29,9 +29,14 @@ const setCSRFHeader = () => {
|
|||
|
||||
void ready(setCSRFHeader);
|
||||
|
||||
export const authorizationTokenFromState = (getState?: GetState) => {
|
||||
return (
|
||||
getState && (getState().meta.get('access_token', '') as string | false)
|
||||
);
|
||||
};
|
||||
|
||||
const authorizationHeaderFromState = (getState?: GetState) => {
|
||||
const accessToken =
|
||||
getState && (getState().meta.get('access_token', '') as string);
|
||||
const accessToken = authorizationTokenFromState(getState);
|
||||
|
||||
if (!accessToken) {
|
||||
return {};
|
||||
|
|
7
app/javascript/mastodon/api_types/markers.ts
Normal file
7
app/javascript/mastodon/api_types/markers.ts
Normal file
|
@ -0,0 +1,7 @@
|
|||
// See app/serializers/rest/account_serializer.rb
|
||||
|
||||
export interface MarkerJSON {
|
||||
last_read_id: string;
|
||||
version: string;
|
||||
updated_at: string;
|
||||
}
|
22
app/javascript/mastodon/api_types/media_attachments.ts
Normal file
22
app/javascript/mastodon/api_types/media_attachments.ts
Normal file
|
@ -0,0 +1,22 @@
|
|||
// See app/serializers/rest/media_attachment_serializer.rb
|
||||
|
||||
export type MediaAttachmentType =
|
||||
| 'image'
|
||||
| 'gifv'
|
||||
| 'video'
|
||||
| 'unknown'
|
||||
| 'audio';
|
||||
|
||||
export interface ApiMediaAttachmentJSON {
|
||||
id: string;
|
||||
type: MediaAttachmentType;
|
||||
url: string;
|
||||
preview_url: string;
|
||||
remoteUrl: string;
|
||||
preview_remote_url: string;
|
||||
text_url: string;
|
||||
// TODO: how to define this?
|
||||
meta: unknown;
|
||||
description?: string;
|
||||
blurhash: string;
|
||||
}
|
23
app/javascript/mastodon/api_types/polls.ts
Normal file
23
app/javascript/mastodon/api_types/polls.ts
Normal file
|
@ -0,0 +1,23 @@
|
|||
import type { ApiCustomEmojiJSON } from './custom_emoji';
|
||||
|
||||
// See app/serializers/rest/poll_serializer.rb
|
||||
|
||||
export interface ApiPollOptionJSON {
|
||||
title: string;
|
||||
votes_count: number;
|
||||
}
|
||||
|
||||
export interface ApiPollJSON {
|
||||
id: string;
|
||||
expires_at: string;
|
||||
expired: boolean;
|
||||
multiple: boolean;
|
||||
votes_count: number;
|
||||
voters_count: number;
|
||||
|
||||
options: ApiPollOptionJSON[];
|
||||
emojis: ApiCustomEmojiJSON[];
|
||||
|
||||
voted: boolean;
|
||||
own_votes: number[];
|
||||
}
|
91
app/javascript/mastodon/api_types/statuses.ts
Normal file
91
app/javascript/mastodon/api_types/statuses.ts
Normal file
|
@ -0,0 +1,91 @@
|
|||
// See app/serializers/rest/status_serializer.rb
|
||||
|
||||
import type { ApiAccountJSON } from './accounts';
|
||||
import type { ApiCustomEmojiJSON } from './custom_emoji';
|
||||
import type { ApiMediaAttachmentJSON } from './media_attachments';
|
||||
import type { ApiPollJSON } from './polls';
|
||||
|
||||
// See app/modals/status.rb
|
||||
export type StatusVisibility =
|
||||
| 'public'
|
||||
| 'unlisted'
|
||||
| 'private'
|
||||
// | 'limited' // This is never exposed to the API (they become `private`)
|
||||
| 'direct';
|
||||
|
||||
export interface ApiStatusApplicationJSON {
|
||||
name: string;
|
||||
website: string;
|
||||
}
|
||||
|
||||
export interface ApiTagJSON {
|
||||
name: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export interface ApiMentionJSON {
|
||||
id: string;
|
||||
username: string;
|
||||
url: string;
|
||||
acct: string;
|
||||
}
|
||||
|
||||
export interface ApiPreviewCardJSON {
|
||||
url: string;
|
||||
title: string;
|
||||
description: string;
|
||||
language: string;
|
||||
type: string;
|
||||
author_name: string;
|
||||
author_url: string;
|
||||
provider_name: string;
|
||||
provider_url: string;
|
||||
html: string;
|
||||
width: number;
|
||||
height: number;
|
||||
image: string;
|
||||
image_description: string;
|
||||
embed_url: string;
|
||||
blurhash: string;
|
||||
published_at: string;
|
||||
}
|
||||
|
||||
export interface ApiStatusJSON {
|
||||
id: string;
|
||||
created_at: string;
|
||||
in_reply_to_id?: string;
|
||||
in_reply_to_account_id?: string;
|
||||
sensitive: boolean;
|
||||
spoiler_text?: string;
|
||||
visibility: StatusVisibility;
|
||||
language: string;
|
||||
uri: string;
|
||||
url: string;
|
||||
replies_count: number;
|
||||
reblogs_count: number;
|
||||
favorites_count: number;
|
||||
edited_at?: string;
|
||||
|
||||
favorited?: boolean;
|
||||
reblogged?: boolean;
|
||||
muted?: boolean;
|
||||
bookmarked?: boolean;
|
||||
pinned?: boolean;
|
||||
|
||||
// filtered: FilterResult[]
|
||||
filtered: unknown; // TODO
|
||||
content?: string;
|
||||
text?: string;
|
||||
|
||||
reblog?: ApiStatusJSON;
|
||||
application?: ApiStatusApplicationJSON;
|
||||
account: ApiAccountJSON;
|
||||
media_attachments: ApiMediaAttachmentJSON[];
|
||||
mentions: ApiMentionJSON[];
|
||||
|
||||
tags: ApiTagJSON[];
|
||||
emojis: ApiCustomEmojiJSON[];
|
||||
|
||||
card?: ApiPreviewCardJSON;
|
||||
poll?: ApiPollJSON;
|
||||
}
|
|
@ -2,7 +2,7 @@ import Rails from '@rails/ujs';
|
|||
import 'font-awesome/css/font-awesome.css';
|
||||
|
||||
export function start() {
|
||||
require.context('../images/', true);
|
||||
require.context('../images/', true, /\.(jpg|png|svg)$/);
|
||||
|
||||
try {
|
||||
Rails.start();
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
import type { PropsWithChildren } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
interface BaseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
interface BaseProps
|
||||
extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
|
||||
block?: boolean;
|
||||
secondary?: boolean;
|
||||
text?: JSX.Element;
|
||||
}
|
||||
|
||||
interface PropsWithChildren extends BaseProps {
|
||||
text?: never;
|
||||
interface PropsChildren extends PropsWithChildren<BaseProps> {
|
||||
text?: undefined;
|
||||
}
|
||||
|
||||
interface PropsWithText extends BaseProps {
|
||||
text: JSX.Element;
|
||||
children: never;
|
||||
text: JSX.Element | string;
|
||||
children?: undefined;
|
||||
}
|
||||
|
||||
type Props = PropsWithText | PropsWithChildren;
|
||||
type Props = PropsWithText | PropsChildren;
|
||||
|
||||
export const Button: React.FC<Props> = ({
|
||||
text,
|
||||
type = 'button',
|
||||
onClick,
|
||||
disabled,
|
||||
|
@ -28,6 +28,7 @@ export const Button: React.FC<Props> = ({
|
|||
secondary,
|
||||
className,
|
||||
title,
|
||||
text,
|
||||
children,
|
||||
...props
|
||||
}) => {
|
||||
|
|
|
@ -24,7 +24,7 @@ export type StatusLike = Record<{
|
|||
|
||||
function normalizeHashtag(hashtag: string) {
|
||||
return (
|
||||
hashtag && hashtag.startsWith('#') ? hashtag.slice(1) : hashtag
|
||||
!!hashtag && hashtag.startsWith('#') ? hashtag.slice(1) : hashtag
|
||||
).normalize('NFKC');
|
||||
}
|
||||
|
||||
|
|
|
@ -191,7 +191,7 @@ const timeRemainingString = (
|
|||
interface Props {
|
||||
intl: IntlShape;
|
||||
timestamp: string;
|
||||
year: number;
|
||||
year?: number;
|
||||
futureDate?: boolean;
|
||||
short?: boolean;
|
||||
}
|
||||
|
@ -203,11 +203,6 @@ class RelativeTimestamp extends Component<Props, States> {
|
|||
now: Date.now(),
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
year: new Date().getFullYear(),
|
||||
short: true,
|
||||
};
|
||||
|
||||
_timer: number | undefined;
|
||||
|
||||
shouldComponentUpdate(nextProps: Props, nextState: States) {
|
||||
|
@ -257,7 +252,13 @@ class RelativeTimestamp extends Component<Props, States> {
|
|||
}
|
||||
|
||||
render() {
|
||||
const { timestamp, intl, year, futureDate, short } = this.props;
|
||||
const {
|
||||
timestamp,
|
||||
intl,
|
||||
futureDate,
|
||||
year = new Date().getFullYear(),
|
||||
short = true,
|
||||
} = this.props;
|
||||
|
||||
const timeGiven = timestamp.includes('T');
|
||||
const date = new Date(timestamp);
|
||||
|
|
|
@ -81,7 +81,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
|
||||
static propTypes = {
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
relationship: ImmutablePropTypes.map,
|
||||
relationship: ImmutablePropTypes.record,
|
||||
onReply: PropTypes.func,
|
||||
onFavourite: PropTypes.func,
|
||||
onReblog: PropTypes.func,
|
||||
|
|
|
@ -4,11 +4,10 @@ import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?re
|
|||
import LockIcon from '@/material-icons/400-24px/lock.svg?react';
|
||||
import PublicIcon from '@/material-icons/400-24px/public.svg?react';
|
||||
import QuietTimeIcon from '@/material-icons/400-24px/quiet_time.svg?react';
|
||||
import type { StatusVisibility } from 'mastodon/models/status';
|
||||
|
||||
import { Icon } from './icon';
|
||||
|
||||
type Visibility = 'public' | 'unlisted' | 'private' | 'direct';
|
||||
|
||||
const messages = defineMessages({
|
||||
public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
|
||||
unlisted_short: {
|
||||
|
@ -25,7 +24,7 @@ const messages = defineMessages({
|
|||
},
|
||||
});
|
||||
|
||||
export const VisibilityIcon: React.FC<{ visibility: Visibility }> = ({
|
||||
export const VisibilityIcon: React.FC<{ visibility: StatusVisibility }> = ({
|
||||
visibility,
|
||||
}) => {
|
||||
const intl = useIntl();
|
||||
|
|
|
@ -8,7 +8,6 @@ import {
|
|||
} from '../actions/accounts';
|
||||
import { showAlertForError } from '../actions/alerts';
|
||||
import { initBlockModal } from '../actions/blocks';
|
||||
import { initBoostModal } from '../actions/boosts';
|
||||
import {
|
||||
replyCompose,
|
||||
mentionCompose,
|
||||
|
@ -107,7 +106,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
|
|||
if ((e && e.shiftKey) || !boostModal) {
|
||||
this.onModalReblog(status);
|
||||
} else {
|
||||
dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
|
||||
dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.onModalReblog } }));
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -262,7 +261,7 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
|
|||
},
|
||||
|
||||
deployPictureInPicture (status, type, mediaProps) {
|
||||
dispatch(deployPictureInPicture(status.get('id'), status.getIn(['account', 'id']), type, mediaProps));
|
||||
dispatch(deployPictureInPicture({statusId: status.get('id'), accountId: status.getIn(['account', 'id']), playerType: type, props: mediaProps}));
|
||||
},
|
||||
|
||||
onInteractionModal (type, status) {
|
||||
|
|
|
@ -22,23 +22,23 @@ describe('emoji', () => {
|
|||
|
||||
it('does unicode', () => {
|
||||
expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).toEqual(
|
||||
'<img draggable="false" class="emojione" alt="👩👩👦👦" title=":woman-woman-boy-boy:" src="/emoji/1f469-200d-1f469-200d-1f466-200d-1f466.svg">');
|
||||
'<picture><img draggable="false" class="emojione" alt="👩👩👦👦" title=":woman-woman-boy-boy:" src="/emoji/1f469-200d-1f469-200d-1f466-200d-1f466.svg"></picture>');
|
||||
expect(emojify('👨👩👧👧')).toEqual(
|
||||
'<img draggable="false" class="emojione" alt="👨👩👧👧" title=":man-woman-girl-girl:" src="/emoji/1f468-200d-1f469-200d-1f467-200d-1f467.svg">');
|
||||
expect(emojify('👩👩👦')).toEqual('<img draggable="false" class="emojione" alt="👩👩👦" title=":woman-woman-boy:" src="/emoji/1f469-200d-1f469-200d-1f466.svg">');
|
||||
'<picture><img draggable="false" class="emojione" alt="👨👩👧👧" title=":man-woman-girl-girl:" src="/emoji/1f468-200d-1f469-200d-1f467-200d-1f467.svg"></picture>');
|
||||
expect(emojify('👩👩👦')).toEqual('<picture><img draggable="false" class="emojione" alt="👩👩👦" title=":woman-woman-boy:" src="/emoji/1f469-200d-1f469-200d-1f466.svg"></picture>');
|
||||
expect(emojify('\u2757')).toEqual(
|
||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg">');
|
||||
'<picture><img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"></picture>');
|
||||
});
|
||||
|
||||
it('does multiple unicode', () => {
|
||||
expect(emojify('\u2757 #\uFE0F\u20E3')).toEqual(
|
||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg">');
|
||||
'<picture><img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"></picture> <picture><img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg"></picture>');
|
||||
expect(emojify('\u2757#\uFE0F\u20E3')).toEqual(
|
||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"><img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg">');
|
||||
'<picture><img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"></picture><picture><img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg"></picture>');
|
||||
expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).toEqual(
|
||||
'<img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg"> <img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg">');
|
||||
'<picture><img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"></picture> <picture><img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg"></picture> <picture><img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"></picture>');
|
||||
expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).toEqual(
|
||||
'foo <img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"> <img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg"> bar');
|
||||
'foo <picture><img draggable="false" class="emojione" alt="❗" title=":exclamation:" src="/emoji/2757.svg"></picture> <picture><img draggable="false" class="emojione" alt="#️⃣" title=":hash:" src="/emoji/23-20e3.svg"></picture> bar');
|
||||
});
|
||||
|
||||
it('ignores unicode inside of tags', () => {
|
||||
|
@ -46,16 +46,16 @@ describe('emoji', () => {
|
|||
});
|
||||
|
||||
it('does multiple emoji properly (issue 5188)', () => {
|
||||
expect(emojify('👌🌈💕')).toEqual('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg"><img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg"><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg">');
|
||||
expect(emojify('👌 🌈 💕')).toEqual('<img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg"> <img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg"> <img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg">');
|
||||
expect(emojify('👌🌈💕')).toEqual('<picture><img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg"></picture><picture><img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg"></picture><picture><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg"></picture>');
|
||||
expect(emojify('👌 🌈 💕')).toEqual('<picture><img draggable="false" class="emojione" alt="👌" title=":ok_hand:" src="/emoji/1f44c.svg"></picture> <picture><img draggable="false" class="emojione" alt="🌈" title=":rainbow:" src="/emoji/1f308.svg"></picture> <picture><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg"></picture>');
|
||||
});
|
||||
|
||||
it('does an emoji that has no shortcode', () => {
|
||||
expect(emojify('👁🗨')).toEqual('<img draggable="false" class="emojione" alt="👁🗨" title="" src="/emoji/1f441-200d-1f5e8.svg">');
|
||||
expect(emojify('👁🗨')).toEqual('<picture><img draggable="false" class="emojione" alt="👁🗨" title="" src="/emoji/1f441-200d-1f5e8.svg"></picture>');
|
||||
});
|
||||
|
||||
it('does an emoji whose filename is irregular', () => {
|
||||
expect(emojify('↙️')).toEqual('<img draggable="false" class="emojione" alt="↙️" title=":arrow_lower_left:" src="/emoji/2199.svg">');
|
||||
expect(emojify('↙️')).toEqual('<picture><img draggable="false" class="emojione" alt="↙️" title=":arrow_lower_left:" src="/emoji/2199.svg"></picture>');
|
||||
});
|
||||
|
||||
it('avoid emojifying on invisible text', () => {
|
||||
|
@ -67,11 +67,11 @@ describe('emoji', () => {
|
|||
|
||||
it('avoid emojifying on invisible text with nested tags', () => {
|
||||
expect(emojify('<span class="invisible">😄<span class="foo">bar</span>😴</span>😇'))
|
||||
.toEqual('<span class="invisible">😄<span class="foo">bar</span>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg">');
|
||||
.toEqual('<span class="invisible">😄<span class="foo">bar</span>😴</span><picture><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg"></picture>');
|
||||
expect(emojify('<span class="invisible">😄<span class="invisible">😕</span>😴</span>😇'))
|
||||
.toEqual('<span class="invisible">😄<span class="invisible">😕</span>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg">');
|
||||
.toEqual('<span class="invisible">😄<span class="invisible">😕</span>😴</span><picture><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg"></picture>');
|
||||
expect(emojify('<span class="invisible">😄<br>😴</span>😇'))
|
||||
.toEqual('<span class="invisible">😄<br>😴</span><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg">');
|
||||
.toEqual('<span class="invisible">😄<br>😴</span><picture><img draggable="false" class="emojione" alt="😇" title=":innocent:" src="/emoji/1f607.svg"></picture>');
|
||||
});
|
||||
|
||||
it('does not emojify emojis with textual presentation VS15 character', () => {
|
||||
|
@ -79,19 +79,19 @@ describe('emoji', () => {
|
|||
.toEqual('✴︎');
|
||||
});
|
||||
|
||||
it('does an simple emoji properly', () => {
|
||||
it('does a simple emoji properly', () => {
|
||||
expect(emojify('♀♂'))
|
||||
.toEqual('<img draggable="false" class="emojione" alt="♀" title=":female_sign:" src="/emoji/2640.svg"><img draggable="false" class="emojione" alt="♂" title=":male_sign:" src="/emoji/2642.svg">');
|
||||
.toEqual('<picture><img draggable="false" class="emojione" alt="♀" title=":female_sign:" src="/emoji/2640.svg"></picture><picture><img draggable="false" class="emojione" alt="♂" title=":male_sign:" src="/emoji/2642.svg"></picture>');
|
||||
});
|
||||
|
||||
it('does an emoji containing ZWJ properly', () => {
|
||||
expect(emojify('💂♀️💂♂️'))
|
||||
.toEqual('<img draggable="false" class="emojione" alt="💂\u200D♀️" title=":female-guard:" src="/emoji/1f482-200d-2640-fe0f_border.svg"><img draggable="false" class="emojione" alt="💂\u200D♂️" title=":male-guard:" src="/emoji/1f482-200d-2642-fe0f_border.svg">');
|
||||
.toEqual('<picture><img draggable="false" class="emojione" alt="💂\u200D♀️" title=":female-guard:" src="/emoji/1f482-200d-2640-fe0f_border.svg"></picture><picture><img draggable="false" class="emojione" alt="💂\u200D♂️" title=":male-guard:" src="/emoji/1f482-200d-2642-fe0f_border.svg"></picture>');
|
||||
});
|
||||
|
||||
it('keeps ordering as expected (issue fixed by PR 20677)', () => {
|
||||
expect(emojify('<p>💕 <a class="hashtag" href="https://example.com/tags/foo" rel="nofollow noopener noreferrer" target="_blank">#<span>foo</span></a> test: foo.</p>'))
|
||||
.toEqual('<p><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg"> <a class="hashtag" href="https://example.com/tags/foo" rel="nofollow noopener noreferrer" target="_blank">#<span>foo</span></a> test: foo.</p>');
|
||||
.toEqual('<p><picture><img draggable="false" class="emojione" alt="💕" title=":two_hearts:" src="/emoji/1f495.svg"></picture> <a class="hashtag" href="https://example.com/tags/foo" rel="nofollow noopener noreferrer" target="_blank">#<span>foo</span></a> test: foo.</p>');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -17,8 +17,13 @@ const emojiFilenames = (emojis) => {
|
|||
const darkEmoji = emojiFilenames(['🎱', '🐜', '⚫', '🖤', '⬛', '◼️', '◾', '◼️', '✒️', '▪️', '💣', '🎳', '📷', '📸', '♣️', '🕶️', '✴️', '🔌', '💂♀️', '📽️', '🍳', '🦍', '💂', '🔪', '🕳️', '🕹️', '🕋', '🖊️', '🖋️', '💂♂️', '🎤', '🎓', '🎥', '🎼', '♠️', '🎩', '🦃', '📼', '📹', '🎮', '🐃', '🏴', '🐞', '🕺', '📱', '📲', '🚲', '🪮', '🐦⬛']);
|
||||
const lightEmoji = emojiFilenames(['👽', '⚾', '🐔', '☁️', '💨', '🕊️', '👀', '🍥', '👻', '🐐', '❕', '❔', '⛸️', '🌩️', '🔊', '🔇', '📃', '🌧️', '🐏', '🍚', '🍙', '🐓', '🐑', '💀', '☠️', '🌨️', '🔉', '🔈', '💬', '💭', '🏐', '🏳️', '⚪', '⬜', '◽', '◻️', '▫️', '🪽', '🪿']);
|
||||
|
||||
const emojiFilename = (filename) => {
|
||||
const borderedEmoji = (document.body && document.body.classList.contains('theme-mastodon-light')) ? lightEmoji : darkEmoji;
|
||||
/**
|
||||
* @param {string} filename
|
||||
* @param {"light" | "dark" } colorScheme
|
||||
* @returns {string}
|
||||
*/
|
||||
const emojiFilename = (filename, colorScheme) => {
|
||||
const borderedEmoji = colorScheme === "light" ? lightEmoji : darkEmoji;
|
||||
return borderedEmoji.includes(filename) ? (filename + '_border') : filename;
|
||||
};
|
||||
|
||||
|
@ -92,12 +97,30 @@ const emojifyTextNode = (node, customEmojis) => {
|
|||
const { filename, shortCode } = unicodeMapping[unicode_emoji];
|
||||
const title = shortCode ? `:${shortCode}:` : '';
|
||||
|
||||
replacement = document.createElement('img');
|
||||
replacement.setAttribute('draggable', 'false');
|
||||
replacement.setAttribute('class', 'emojione');
|
||||
replacement.setAttribute('alt', unicode_emoji);
|
||||
replacement.setAttribute('title', title);
|
||||
replacement.setAttribute('src', `${assetHost}/emoji/${emojiFilename(filename)}.svg`);
|
||||
replacement = document.createElement('picture');
|
||||
|
||||
const isSystemTheme = !!document.body?.classList.contains('theme-system');
|
||||
|
||||
if(isSystemTheme) {
|
||||
let source = document.createElement('source');
|
||||
source.setAttribute('media', '(prefers-color-scheme: dark)');
|
||||
source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, "dark")}.svg`);
|
||||
replacement.appendChild(source);
|
||||
}
|
||||
|
||||
let img = document.createElement('img');
|
||||
img.setAttribute('draggable', 'false');
|
||||
img.setAttribute('class', 'emojione');
|
||||
img.setAttribute('alt', unicode_emoji);
|
||||
img.setAttribute('title', title);
|
||||
|
||||
let theme = "light";
|
||||
|
||||
if(!isSystemTheme && !document.body?.classList.contains('theme-mastodon-light'))
|
||||
theme = "dark";
|
||||
|
||||
img.setAttribute('src', `${assetHost}/emoji/${emojiFilename(filename, theme)}.svg`);
|
||||
replacement.appendChild(img);
|
||||
}
|
||||
|
||||
// Add the processed-up-to-now string and the emoji replacement
|
||||
|
|
|
@ -82,7 +82,7 @@ class GettingStarted extends ImmutablePureComponent {
|
|||
|
||||
static propTypes = {
|
||||
intl: PropTypes.object.isRequired,
|
||||
myAccount: ImmutablePropTypes.map,
|
||||
myAccount: ImmutablePropTypes.record,
|
||||
multiColumn: PropTypes.bool,
|
||||
fetchFollowRequests: PropTypes.func.isRequired,
|
||||
unreadFollowRequests: PropTypes.number,
|
||||
|
|
|
@ -107,7 +107,7 @@ class KeyboardShortcuts extends ImmutablePureComponent {
|
|||
<td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>s</kbd></td>
|
||||
<td><kbd>s</kbd>, <kbd>/</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.search' defaultMessage='to focus search' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
|
|
@ -27,7 +27,7 @@ export const FilteredNotificationsBanner = () => {
|
|||
};
|
||||
}, [dispatch]);
|
||||
|
||||
if (policy === null || policy.getIn(['summary', 'pending_notifications_count']) * 1 === 0) {
|
||||
if (policy === null || policy.getIn(['summary', 'pending_notifications_count']) === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,8 @@ export const FilteredNotificationsBanner = () => {
|
|||
</div>
|
||||
|
||||
<div className='filtered-notifications-banner__badge'>
|
||||
{toCappedNumber(policy.getIn(['summary', 'pending_notifications_count']))}
|
||||
<div className='filtered-notifications-banner__badge__badge'>{toCappedNumber(policy.getIn(['summary', 'pending_notifications_count']))}</div>
|
||||
<FormattedMessage id='filtered_notifications_banner.mentions' defaultMessage='{count, plural, one {mention} other {mentions}}' values={{ count: policy.getIn(['summary', 'pending_notifications_count']) }} />
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
|
|
|
@ -12,7 +12,6 @@ import { HotKeys } from 'react-hotkeys';
|
|||
|
||||
import EditIcon from '@/material-icons/400-24px/edit.svg?react';
|
||||
import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react';
|
||||
import HeartBrokenIcon from '@/material-icons/400-24px/heart_broken-fill.svg?react';
|
||||
import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react';
|
||||
import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react';
|
||||
import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react';
|
||||
|
@ -27,7 +26,7 @@ import { WithRouterPropTypes } from 'mastodon/utils/react_router';
|
|||
|
||||
import FollowRequestContainer from '../containers/follow_request_container';
|
||||
|
||||
import RelationshipsSeveranceEvent from './relationships_severance_event';
|
||||
import { RelationshipsSeveranceEvent } from './relationships_severance_event';
|
||||
import Report from './report';
|
||||
|
||||
const messages = defineMessages({
|
||||
|
@ -40,6 +39,7 @@ const messages = defineMessages({
|
|||
update: { id: 'notification.update', defaultMessage: '{name} edited a post' },
|
||||
adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' },
|
||||
adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' },
|
||||
relationshipsSevered: { id: 'notification.relationships_severance_event', defaultMessage: 'Lost connections with {name}' },
|
||||
});
|
||||
|
||||
const notificationForScreenReader = (intl, message, timestamp) => {
|
||||
|
@ -361,24 +361,23 @@ class Notification extends ImmutablePureComponent {
|
|||
}
|
||||
|
||||
renderRelationshipsSevered (notification) {
|
||||
const { intl, unread } = this.props;
|
||||
const { intl, unread, hidden } = this.props;
|
||||
const event = notification.get('event');
|
||||
|
||||
if (!notification.get('event')) {
|
||||
if (!event) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className={classNames('notification notification-severed-relationships focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.adminReport, { name: notification.getIn(['event', 'target_name']) }), notification.get('created_at'))}>
|
||||
<div className='notification__message'>
|
||||
<Icon id='heart_broken' icon={HeartBrokenIcon} />
|
||||
|
||||
<span title={notification.get('created_at')}>
|
||||
<FormattedMessage id='notification.severed_relationships' defaultMessage='Relationships with {name} severed' values={{ name: notification.getIn(['event', 'target_name']) }} />
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<RelationshipsSeveranceEvent event={notification.get('event')} />
|
||||
<div className={classNames('notification notification-severed-relationships focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.relationshipsSevered, { name: notification.getIn(['event', 'target_name']) }), notification.get('created_at'))}>
|
||||
<RelationshipsSeveranceEvent
|
||||
type={event.get('type')}
|
||||
target={event.get('target_name')}
|
||||
followersCount={event.get('followers_count')}
|
||||
followingCount={event.get('following_count')}
|
||||
hidden={hidden}
|
||||
/>
|
||||
</div>
|
||||
</HotKeys>
|
||||
);
|
||||
|
|
|
@ -7,8 +7,8 @@ import { Link } from 'react-router-dom';
|
|||
|
||||
import { useSelector, useDispatch } from 'react-redux';
|
||||
|
||||
import DeleteIcon from '@/material-icons/400-24px/delete.svg?react';
|
||||
import DoneIcon from '@/material-icons/400-24px/done.svg?react';
|
||||
import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react';
|
||||
import { acceptNotificationRequest, dismissNotificationRequest } from 'mastodon/actions/notifications';
|
||||
import { Avatar } from 'mastodon/components/avatar';
|
||||
import { IconButton } from 'mastodon/components/icon_button';
|
||||
|
@ -51,7 +51,7 @@ export const NotificationRequest = ({ id, accountId, notificationsCount }) => {
|
|||
</Link>
|
||||
|
||||
<div className='notification-request__actions'>
|
||||
<IconButton iconComponent={VolumeOffIcon} onClick={handleDismiss} title={intl.formatMessage(messages.dismiss)} />
|
||||
<IconButton iconComponent={DeleteIcon} onClick={handleDismiss} title={intl.formatMessage(messages.dismiss)} />
|
||||
<IconButton iconComponent={DoneIcon} onClick={handleAccept} title={intl.formatMessage(messages.accept)} />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -2,60 +2,44 @@ import PropTypes from 'prop-types';
|
|||
|
||||
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import HeartBrokenIcon from '@/material-icons/400-24px/heart_broken-fill.svg?react';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { domain } from 'mastodon/initial_state';
|
||||
|
||||
import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
|
||||
|
||||
// This needs to be kept in sync with app/models/relationship_severance_event.rb
|
||||
// This needs to be kept in sync with app/models/relationships_severance_event.rb
|
||||
const messages = defineMessages({
|
||||
account_suspension: { id: 'relationship_severance_notification.types.account_suspension', defaultMessage: 'Account has been suspended' },
|
||||
domain_block: { id: 'relationship_severance_notification.types.domain_block', defaultMessage: 'Domain has been suspended' },
|
||||
user_domain_block: { id: 'relationship_severance_notification.types.user_domain_block', defaultMessage: 'You blocked this domain' },
|
||||
account_suspension: { id: 'notification.relationships_severance_event.account_suspension', defaultMessage: 'An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.' },
|
||||
domain_block: { id: 'notification.relationships_severance_event.domain_block', defaultMessage: 'An admin from {from} has blocked {target}, including {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.' },
|
||||
user_domain_block: { id: 'notification.relationships_severance_event.user_domain_block', defaultMessage: 'You have blocked {target}, removing {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.' },
|
||||
});
|
||||
|
||||
const RelationshipsSeveranceEvent = ({ event, hidden }) => {
|
||||
export const RelationshipsSeveranceEvent = ({ type, target, followingCount, followersCount, hidden }) => {
|
||||
const intl = useIntl();
|
||||
|
||||
if (hidden || !event) {
|
||||
if (hidden) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='notification__report'>
|
||||
<div className='notification__report__details'>
|
||||
<div>
|
||||
<RelativeTimestamp timestamp={event.get('created_at')} short={false} />
|
||||
{' · '}
|
||||
{ event.get('purged') ? (
|
||||
<FormattedMessage
|
||||
id='relationship_severance_notification.purged_data'
|
||||
defaultMessage='purged by administrators'
|
||||
/>
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='relationship_severance_notification.relationships'
|
||||
defaultMessage='{count, plural, one {# relationship} other {# relationships}}'
|
||||
values={{ count: event.get('followers_count', 0) + event.get('following_count', 0) }}
|
||||
/>
|
||||
)}
|
||||
<br />
|
||||
<strong>{intl.formatMessage(messages[event.get('type')])}</strong>
|
||||
</div>
|
||||
<a href='/severed_relationships' target='_blank' rel='noopener noreferrer' className='notification__relationships-severance-event'>
|
||||
<Icon id='heart_broken' icon={HeartBrokenIcon} />
|
||||
|
||||
<div className='notification__report__actions'>
|
||||
<a href='/severed_relationships' className='button' target='_blank' rel='noopener noreferrer'>
|
||||
<FormattedMessage id='relationship_severance_notification.view' defaultMessage='View' />
|
||||
</a>
|
||||
</div>
|
||||
<div className='notification__relationships-severance-event__content'>
|
||||
<p>{intl.formatMessage(messages[type], { from: <strong>{domain}</strong>, target: <strong>{target}</strong>, followingCount, followersCount })}</p>
|
||||
<span className='link-button'><FormattedMessage id='notification.relationships_severance_event.learn_more' defaultMessage='Learn more' /></span>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
RelationshipsSeveranceEvent.propTypes = {
|
||||
event: ImmutablePropTypes.map.isRequired,
|
||||
type: PropTypes.oneOf([
|
||||
'account_suspension',
|
||||
'domain_block',
|
||||
'user_domain_block',
|
||||
]).isRequired,
|
||||
target: PropTypes.string.isRequired,
|
||||
followersCount: PropTypes.number.isRequired,
|
||||
followingCount: PropTypes.number.isRequired,
|
||||
hidden: PropTypes.bool,
|
||||
};
|
||||
|
||||
export default RelationshipsSeveranceEvent;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import { connect } from 'react-redux';
|
||||
|
||||
import { initBoostModal } from '../../../actions/boosts';
|
||||
import { mentionCompose } from '../../../actions/compose';
|
||||
import {
|
||||
reblog,
|
||||
|
@ -8,6 +7,7 @@ import {
|
|||
unreblog,
|
||||
unfavourite,
|
||||
} from '../../../actions/interactions';
|
||||
import { openModal } from '../../../actions/modal';
|
||||
import {
|
||||
hideStatus,
|
||||
revealStatus,
|
||||
|
@ -49,7 +49,7 @@ const mapDispatchToProps = dispatch => ({
|
|||
if (e.shiftKey || !boostModal) {
|
||||
this.onModalReblog(status);
|
||||
} else {
|
||||
dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
|
||||
dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.onModalReblog } }));
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -14,7 +14,6 @@ import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
|||
import ReplyIcon from '@/material-icons/400-24px/reply.svg?react';
|
||||
import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react';
|
||||
import StarIcon from '@/material-icons/400-24px/star.svg?react';
|
||||
import { initBoostModal } from 'mastodon/actions/boosts';
|
||||
import { replyCompose } from 'mastodon/actions/compose';
|
||||
import { reblog, favourite, unreblog, unfavourite } from 'mastodon/actions/interactions';
|
||||
import { openModal } from 'mastodon/actions/modal';
|
||||
|
@ -140,7 +139,7 @@ class Footer extends ImmutablePureComponent {
|
|||
} else if ((e && e.shiftKey) || !boostModal) {
|
||||
this._performReblog(status);
|
||||
} else {
|
||||
dispatch(initBoostModal({ status, onReblog: this._performReblog }));
|
||||
dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this._performReblog } }));
|
||||
}
|
||||
} else {
|
||||
dispatch(openModal({
|
||||
|
@ -210,4 +209,4 @@ class Footer extends ImmutablePureComponent {
|
|||
|
||||
}
|
||||
|
||||
export default withRouter(connect(makeMapStateToProps)(injectIntl(Footer)));
|
||||
export default connect(makeMapStateToProps)(withRouter(injectIntl(Footer)));
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
|
||||
import { Avatar } from 'mastodon/components/avatar';
|
||||
import { DisplayName } from 'mastodon/components/display_name';
|
||||
import { IconButton } from 'mastodon/components/icon_button';
|
||||
|
||||
const messages = defineMessages({
|
||||
close: { id: 'lightbox.close', defaultMessage: 'Close' },
|
||||
});
|
||||
|
||||
const mapStateToProps = (state, { accountId }) => ({
|
||||
account: state.getIn(['accounts', accountId]),
|
||||
});
|
||||
|
||||
class Header extends ImmutablePureComponent {
|
||||
|
||||
static propTypes = {
|
||||
accountId: PropTypes.string.isRequired,
|
||||
statusId: PropTypes.string.isRequired,
|
||||
account: ImmutablePropTypes.record.isRequired,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
render () {
|
||||
const { account, statusId, onClose, intl } = this.props;
|
||||
|
||||
return (
|
||||
<div className='picture-in-picture__header'>
|
||||
<Link to={`/@${account.get('acct')}/${statusId}`} className='picture-in-picture__header__account'>
|
||||
<Avatar account={account} size={36} />
|
||||
<DisplayName account={account} />
|
||||
</Link>
|
||||
|
||||
<IconButton icon='times' iconComponent={CloseIcon} onClick={onClose} title={intl.formatMessage(messages.close)} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default connect(mapStateToProps)(injectIntl(Header));
|
|
@ -0,0 +1,46 @@
|
|||
import { defineMessages, useIntl } from 'react-intl';
|
||||
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
|
||||
import { Avatar } from 'mastodon/components/avatar';
|
||||
import { DisplayName } from 'mastodon/components/display_name';
|
||||
import { IconButton } from 'mastodon/components/icon_button';
|
||||
import { useAppSelector } from 'mastodon/store';
|
||||
|
||||
const messages = defineMessages({
|
||||
close: { id: 'lightbox.close', defaultMessage: 'Close' },
|
||||
});
|
||||
|
||||
interface Props {
|
||||
accountId: string;
|
||||
statusId: string;
|
||||
onClose: () => void;
|
||||
}
|
||||
|
||||
export const Header: React.FC<Props> = ({ accountId, statusId, onClose }) => {
|
||||
const account = useAppSelector((state) => state.accounts.get(accountId));
|
||||
|
||||
const intl = useIntl();
|
||||
|
||||
if (!account) return null;
|
||||
|
||||
return (
|
||||
<div className='picture-in-picture__header'>
|
||||
<Link
|
||||
to={`/@${account.get('acct')}/${statusId}`}
|
||||
className='picture-in-picture__header__account'
|
||||
>
|
||||
<Avatar account={account} size={36} />
|
||||
<DisplayName account={account} />
|
||||
</Link>
|
||||
|
||||
<IconButton
|
||||
icon='times'
|
||||
iconComponent={CloseIcon}
|
||||
onClick={onClose}
|
||||
title={intl.formatMessage(messages.close)}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
|
@ -1,89 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import { Component } from 'react';
|
||||
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import { removePictureInPicture } from 'mastodon/actions/picture_in_picture';
|
||||
import Audio from 'mastodon/features/audio';
|
||||
import Video from 'mastodon/features/video';
|
||||
|
||||
import Footer from './components/footer';
|
||||
import Header from './components/header';
|
||||
|
||||
const mapStateToProps = state => ({
|
||||
...state.get('picture_in_picture'),
|
||||
});
|
||||
|
||||
class PictureInPicture extends Component {
|
||||
|
||||
static propTypes = {
|
||||
statusId: PropTypes.string,
|
||||
accountId: PropTypes.string,
|
||||
type: PropTypes.string,
|
||||
src: PropTypes.string,
|
||||
muted: PropTypes.bool,
|
||||
volume: PropTypes.number,
|
||||
currentTime: PropTypes.number,
|
||||
poster: PropTypes.string,
|
||||
backgroundColor: PropTypes.string,
|
||||
foregroundColor: PropTypes.string,
|
||||
accentColor: PropTypes.string,
|
||||
dispatch: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
handleClose = () => {
|
||||
const { dispatch } = this.props;
|
||||
dispatch(removePictureInPicture());
|
||||
};
|
||||
|
||||
render () {
|
||||
const { type, src, currentTime, accountId, statusId } = this.props;
|
||||
|
||||
if (!currentTime) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let player;
|
||||
|
||||
if (type === 'video') {
|
||||
player = (
|
||||
<Video
|
||||
src={src}
|
||||
currentTime={this.props.currentTime}
|
||||
volume={this.props.volume}
|
||||
muted={this.props.muted}
|
||||
autoPlay
|
||||
inline
|
||||
alwaysVisible
|
||||
/>
|
||||
);
|
||||
} else if (type === 'audio') {
|
||||
player = (
|
||||
<Audio
|
||||
src={src}
|
||||
currentTime={this.props.currentTime}
|
||||
volume={this.props.volume}
|
||||
muted={this.props.muted}
|
||||
poster={this.props.poster}
|
||||
backgroundColor={this.props.backgroundColor}
|
||||
foregroundColor={this.props.foregroundColor}
|
||||
accentColor={this.props.accentColor}
|
||||
autoPlay
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='picture-in-picture'>
|
||||
<Header accountId={accountId} statusId={statusId} onClose={this.handleClose} />
|
||||
|
||||
{player}
|
||||
|
||||
<Footer statusId={statusId} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default connect(mapStateToProps)(PictureInPicture);
|
|
@ -0,0 +1,79 @@
|
|||
import { useCallback } from 'react';
|
||||
|
||||
import { removePictureInPicture } from 'mastodon/actions/picture_in_picture';
|
||||
import Audio from 'mastodon/features/audio';
|
||||
import Video from 'mastodon/features/video';
|
||||
import { useAppDispatch, useAppSelector } from 'mastodon/store/typed_functions';
|
||||
|
||||
import Footer from './components/footer';
|
||||
import { Header } from './components/header';
|
||||
|
||||
export const PictureInPicture: React.FC = () => {
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const handleClose = useCallback(() => {
|
||||
dispatch(removePictureInPicture());
|
||||
}, [dispatch]);
|
||||
|
||||
const pipState = useAppSelector((s) => s.picture_in_picture);
|
||||
|
||||
if (pipState.type === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const {
|
||||
type,
|
||||
src,
|
||||
currentTime,
|
||||
accountId,
|
||||
statusId,
|
||||
volume,
|
||||
muted,
|
||||
poster,
|
||||
backgroundColor,
|
||||
foregroundColor,
|
||||
accentColor,
|
||||
} = pipState;
|
||||
|
||||
let player;
|
||||
|
||||
switch (type) {
|
||||
case 'video':
|
||||
player = (
|
||||
<Video
|
||||
src={src}
|
||||
currentTime={currentTime}
|
||||
volume={volume}
|
||||
muted={muted}
|
||||
autoPlay
|
||||
inline
|
||||
alwaysVisible
|
||||
/>
|
||||
);
|
||||
break;
|
||||
case 'audio':
|
||||
player = (
|
||||
<Audio
|
||||
src={src}
|
||||
currentTime={currentTime}
|
||||
volume={volume}
|
||||
muted={muted}
|
||||
poster={poster}
|
||||
backgroundColor={backgroundColor}
|
||||
foregroundColor={foregroundColor}
|
||||
accentColor={accentColor}
|
||||
autoPlay
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='picture-in-picture'>
|
||||
<Header accountId={accountId} statusId={statusId} onClose={handleClose} />
|
||||
|
||||
{player}
|
||||
|
||||
<Footer statusId={statusId} />
|
||||
</div>
|
||||
);
|
||||
};
|
|
@ -74,7 +74,7 @@ class ActionBar extends PureComponent {
|
|||
|
||||
static propTypes = {
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
relationship: ImmutablePropTypes.map,
|
||||
relationship: ImmutablePropTypes.record,
|
||||
onReply: PropTypes.func.isRequired,
|
||||
onReblog: PropTypes.func.isRequired,
|
||||
onFavourite: PropTypes.func.isRequired,
|
||||
|
|
|
@ -4,7 +4,6 @@ import { connect } from 'react-redux';
|
|||
|
||||
import { showAlertForError } from '../../../actions/alerts';
|
||||
import { initBlockModal } from '../../../actions/blocks';
|
||||
import { initBoostModal } from '../../../actions/boosts';
|
||||
import {
|
||||
replyCompose,
|
||||
mentionCompose,
|
||||
|
@ -85,7 +84,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
|
|||
if (e.shiftKey || !boostModal) {
|
||||
this.onModalReblog(status);
|
||||
} else {
|
||||
dispatch(initBoostModal({ status, onReblog: this.onModalReblog }));
|
||||
dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.onModalReblog } }));
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -27,7 +27,6 @@ import {
|
|||
unmuteAccount,
|
||||
} from '../../actions/accounts';
|
||||
import { initBlockModal } from '../../actions/blocks';
|
||||
import { initBoostModal } from '../../actions/boosts';
|
||||
import {
|
||||
replyCompose,
|
||||
mentionCompose,
|
||||
|
@ -317,7 +316,7 @@ class Status extends ImmutablePureComponent {
|
|||
if ((e && e.shiftKey) || !boostModal) {
|
||||
this.handleModalReblog(status);
|
||||
} else {
|
||||
dispatch(initBoostModal({ status, onReblog: this.handleModalReblog }));
|
||||
dispatch(openModal({ modalType: 'BOOST', modalProps: { status, onReblog: this.handleModalReblog } }));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -1,125 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
|
||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { withRouter } from 'react-router-dom';
|
||||
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||
import { connect } from 'react-redux';
|
||||
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import { changeBoostPrivacy } from 'mastodon/actions/boosts';
|
||||
import AttachmentList from 'mastodon/components/attachment_list';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { VisibilityIcon } from 'mastodon/components/visibility_icon';
|
||||
import PrivacyDropdown from 'mastodon/features/compose/components/privacy_dropdown';
|
||||
import { WithRouterPropTypes } from 'mastodon/utils/react_router';
|
||||
|
||||
import { Avatar } from '../../../components/avatar';
|
||||
import { Button } from '../../../components/button';
|
||||
import { DisplayName } from '../../../components/display_name';
|
||||
import { RelativeTimestamp } from '../../../components/relative_timestamp';
|
||||
import StatusContent from '../../../components/status_content';
|
||||
|
||||
const messages = defineMessages({
|
||||
cancel_reblog: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
});
|
||||
|
||||
const mapStateToProps = state => {
|
||||
return {
|
||||
privacy: state.getIn(['boosts', 'new', 'privacy']),
|
||||
};
|
||||
};
|
||||
|
||||
const mapDispatchToProps = dispatch => {
|
||||
return {
|
||||
onChangeBoostPrivacy(value) {
|
||||
dispatch(changeBoostPrivacy(value));
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
class BoostModal extends ImmutablePureComponent {
|
||||
static propTypes = {
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
onReblog: PropTypes.func.isRequired,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
onChangeBoostPrivacy: PropTypes.func.isRequired,
|
||||
privacy: PropTypes.string.isRequired,
|
||||
intl: PropTypes.object.isRequired,
|
||||
...WithRouterPropTypes,
|
||||
};
|
||||
|
||||
handleReblog = () => {
|
||||
this.props.onReblog(this.props.status, this.props.privacy);
|
||||
this.props.onClose();
|
||||
};
|
||||
|
||||
handleAccountClick = (e) => {
|
||||
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||
e.preventDefault();
|
||||
this.props.onClose();
|
||||
this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);
|
||||
}
|
||||
};
|
||||
|
||||
_findContainer = () => {
|
||||
return document.getElementsByClassName('modal-root__container')[0];
|
||||
};
|
||||
|
||||
render () {
|
||||
const { status, privacy, intl } = this.props;
|
||||
const buttonText = status.get('reblogged') ? messages.cancel_reblog : messages.reblog;
|
||||
|
||||
return (
|
||||
<div className='modal-root__modal boost-modal'>
|
||||
<div className='boost-modal__container'>
|
||||
<div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
|
||||
<div className='status__info'>
|
||||
<a href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
|
||||
<span className='status__visibility-icon'><VisibilityIcon visibility={status.get('visibility')} /></span>
|
||||
<RelativeTimestamp timestamp={status.get('created_at')} />
|
||||
</a>
|
||||
|
||||
<a onClick={this.handleAccountClick} href={`/@${status.getIn(['account', 'acct'])}`} className='status__display-name'>
|
||||
<div className='status__avatar'>
|
||||
<Avatar account={status.get('account')} size={48} />
|
||||
</div>
|
||||
|
||||
<DisplayName account={status.get('account')} />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<StatusContent status={status} />
|
||||
|
||||
{status.get('media_attachments').size > 0 && (
|
||||
<AttachmentList
|
||||
compact
|
||||
media={status.get('media_attachments')}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='boost-modal__action-bar'>
|
||||
<div><FormattedMessage id='boost_modal.combo' defaultMessage='You can press {combo} to skip this next time' values={{ combo: <span>Shift + <Icon id='retweet' icon={RepeatIcon} /></span> }} /></div>
|
||||
{status.get('visibility') !== 'private' && !status.get('reblogged') && (
|
||||
<PrivacyDropdown
|
||||
noDirect
|
||||
value={privacy}
|
||||
container={this._findContainer}
|
||||
onChange={this.props.onChangeBoostPrivacy}
|
||||
/>
|
||||
)}
|
||||
<Button text={intl.formatMessage(buttonText)} onClick={this.handleReblog} autoFocus />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(injectIntl(BoostModal)));
|
162
app/javascript/mastodon/features/ui/components/boost_modal.tsx
Normal file
162
app/javascript/mastodon/features/ui/components/boost_modal.tsx
Normal file
|
@ -0,0 +1,162 @@
|
|||
import type { MouseEventHandler } from 'react';
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { useHistory } from 'react-router';
|
||||
|
||||
import type Immutable from 'immutable';
|
||||
|
||||
import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react';
|
||||
import AttachmentList from 'mastodon/components/attachment_list';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { VisibilityIcon } from 'mastodon/components/visibility_icon';
|
||||
import PrivacyDropdown from 'mastodon/features/compose/components/privacy_dropdown';
|
||||
import type { Account } from 'mastodon/models/account';
|
||||
import type { Status, StatusVisibility } from 'mastodon/models/status';
|
||||
import { useAppSelector } from 'mastodon/store';
|
||||
|
||||
import { Avatar } from '../../../components/avatar';
|
||||
import { Button } from '../../../components/button';
|
||||
import { DisplayName } from '../../../components/display_name';
|
||||
import { RelativeTimestamp } from '../../../components/relative_timestamp';
|
||||
import StatusContent from '../../../components/status_content';
|
||||
|
||||
const messages = defineMessages({
|
||||
cancel_reblog: {
|
||||
id: 'status.cancel_reblog_private',
|
||||
defaultMessage: 'Unboost',
|
||||
},
|
||||
reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
|
||||
});
|
||||
|
||||
export const BoostModal: React.FC<{
|
||||
status: Status;
|
||||
onClose: () => void;
|
||||
onReblog: (status: Status, privacy: StatusVisibility) => void;
|
||||
}> = ({ status, onReblog, onClose }) => {
|
||||
const intl = useIntl();
|
||||
const history = useHistory();
|
||||
|
||||
const default_privacy = useAppSelector(
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
||||
(state) => state.compose.get('default_privacy') as StatusVisibility,
|
||||
);
|
||||
|
||||
const account = status.get('account') as Account;
|
||||
const statusVisibility = status.get('visibility') as StatusVisibility;
|
||||
|
||||
const [privacy, setPrivacy] = useState<StatusVisibility>(
|
||||
statusVisibility === 'private' ? 'private' : default_privacy,
|
||||
);
|
||||
|
||||
const onPrivacyChange = useCallback((value: StatusVisibility) => {
|
||||
setPrivacy(value);
|
||||
}, []);
|
||||
|
||||
const handleReblog = useCallback(() => {
|
||||
onReblog(status, privacy);
|
||||
onClose();
|
||||
}, [onClose, onReblog, status, privacy]);
|
||||
|
||||
const handleAccountClick = useCallback<MouseEventHandler>(
|
||||
(e) => {
|
||||
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||
e.preventDefault();
|
||||
onClose();
|
||||
history.push(`/@${account.acct}`);
|
||||
}
|
||||
},
|
||||
[history, onClose, account],
|
||||
);
|
||||
|
||||
const buttonText = status.get('reblogged')
|
||||
? messages.cancel_reblog
|
||||
: messages.reblog;
|
||||
|
||||
const findContainer = useCallback(
|
||||
() => document.getElementsByClassName('modal-root__container')[0],
|
||||
[],
|
||||
);
|
||||
|
||||
return (
|
||||
<div className='modal-root__modal boost-modal'>
|
||||
<div className='boost-modal__container'>
|
||||
<div
|
||||
className={classNames(
|
||||
'status',
|
||||
`status-${statusVisibility}`,
|
||||
'light',
|
||||
)}
|
||||
>
|
||||
<div className='status__info'>
|
||||
<a
|
||||
href={`/@${account.acct}/${status.get('id') as string}`}
|
||||
className='status__relative-time'
|
||||
target='_blank'
|
||||
rel='noopener noreferrer'
|
||||
>
|
||||
<span className='status__visibility-icon'>
|
||||
<VisibilityIcon visibility={statusVisibility} />
|
||||
</span>
|
||||
<RelativeTimestamp
|
||||
timestamp={status.get('created_at') as string}
|
||||
/>
|
||||
</a>
|
||||
|
||||
<a
|
||||
onClick={handleAccountClick}
|
||||
href={`/@${account.acct}`}
|
||||
className='status__display-name'
|
||||
>
|
||||
<div className='status__avatar'>
|
||||
<Avatar account={account} size={48} />
|
||||
</div>
|
||||
|
||||
<DisplayName account={account} />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{/* @ts-expect-error Expected until StatusContent is typed */}
|
||||
<StatusContent status={status} />
|
||||
|
||||
{(status.get('media_attachments') as Immutable.List<unknown>).size >
|
||||
0 && (
|
||||
<AttachmentList compact media={status.get('media_attachments')} />
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='boost-modal__action-bar'>
|
||||
<div>
|
||||
<FormattedMessage
|
||||
id='boost_modal.combo'
|
||||
defaultMessage='You can press {combo} to skip this next time'
|
||||
values={{
|
||||
combo: (
|
||||
<span>
|
||||
Shift + <Icon id='retweet' icon={RepeatIcon} />
|
||||
</span>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
{statusVisibility !== 'private' && !status.get('reblogged') && (
|
||||
<PrivacyDropdown
|
||||
noDirect
|
||||
value={privacy}
|
||||
container={findContainer}
|
||||
onChange={onPrivacyChange}
|
||||
/>
|
||||
)}
|
||||
<Button
|
||||
text={intl.formatMessage(buttonText)}
|
||||
onClick={handleReblog}
|
||||
// eslint-disable-next-line jsx-a11y/no-autofocus
|
||||
autoFocus
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
|
@ -24,7 +24,7 @@ import BundleContainer from '../containers/bundle_container';
|
|||
|
||||
import ActionsModal from './actions_modal';
|
||||
import AudioModal from './audio_modal';
|
||||
import BoostModal from './boost_modal';
|
||||
import { BoostModal } from './boost_modal';
|
||||
import BundleModalError from './bundle_modal_error';
|
||||
import ConfirmationModal from './confirmation_modal';
|
||||
import FocalPointModal from './focal_point_modal';
|
||||
|
|
|
@ -14,7 +14,7 @@ import { HotKeys } from 'react-hotkeys';
|
|||
import { focusApp, unfocusApp, changeLayout } from 'mastodon/actions/app';
|
||||
import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'mastodon/actions/markers';
|
||||
import { INTRODUCTION_VERSION } from 'mastodon/actions/onboarding';
|
||||
import PictureInPicture from 'mastodon/features/picture_in_picture';
|
||||
import { PictureInPicture } from 'mastodon/features/picture_in_picture';
|
||||
import { layoutFromWindow } from 'mastodon/is_mobile';
|
||||
import { WithRouterPropTypes } from 'mastodon/utils/react_router';
|
||||
|
||||
|
@ -89,7 +89,7 @@ const mapStateToProps = state => ({
|
|||
const keyMap = {
|
||||
help: '?',
|
||||
new: 'n',
|
||||
search: 's',
|
||||
search: ['s', '/'],
|
||||
forceNew: 'option+n',
|
||||
toggleComposeSpoilers: 'option+x',
|
||||
focusColumn: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
|
||||
|
|
|
@ -89,6 +89,14 @@
|
|||
"announcement.announcement": "إعلان",
|
||||
"attachments_list.unprocessed": "(غير معالَج)",
|
||||
"audio.hide": "إخفاء المقطع الصوتي",
|
||||
"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.show_less": "اعرض أقلّ",
|
||||
"block_modal.show_more": "أظهر المزيد",
|
||||
"block_modal.they_cant_mention": "لن يستطيع ذِكرك أو متابعتك.",
|
||||
"block_modal.they_cant_see_posts": "لن يستطيع رؤية منشوراتك ولن ترى منشوراته.",
|
||||
"block_modal.they_will_know": "يمكنه أن يرى أنه قد تم حجبه.",
|
||||
"block_modal.title": "أتريد حظر المستخدم؟",
|
||||
"block_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيهم إليه.",
|
||||
"boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة",
|
||||
"bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ",
|
||||
"bundle_column_error.error.body": "لا يمكن تقديم الصفحة المطلوبة. قد يكون بسبب خطأ في التعليمات البرمجية، أو مشكلة توافق المتصفح.",
|
||||
|
@ -169,6 +177,7 @@
|
|||
"confirmations.delete_list.message": "هل أنتَ مُتأكدٌ أنكَ تُريدُ حَذفَ هذِهِ القائمة بشكلٍ دائم؟",
|
||||
"confirmations.discard_edit_media.confirm": "تجاهل",
|
||||
"confirmations.discard_edit_media.message": "لديك تغييرات غير محفوظة لوصف الوسائط أو معاينتها، أتريد تجاهلها على أي حال؟",
|
||||
"confirmations.domain_block.confirm": "حظر الخادم",
|
||||
"confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.",
|
||||
"confirmations.edit.confirm": "تعديل",
|
||||
"confirmations.edit.message": "التعديل في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد تحريرها. متأكد من أنك تريد المواصلة؟",
|
||||
|
@ -200,6 +209,23 @@
|
|||
"dismissable_banner.explore_statuses": "هذه هي المنشورات الرائجة على الشبكات الاجتماعيّة اليوم. تظهر المنشورات المعاد نشرها والحائزة على مفضّلات أكثر في مرتبة عليا.",
|
||||
"dismissable_banner.explore_tags": "هذه هي الوسوم تكتسب جذب الاهتمام حاليًا على الويب الاجتماعي. الوسوم التي يستخدمها مختلف الناس تحتل مرتبة عليا.",
|
||||
"dismissable_banner.public_timeline": "هذه هي أحدث المنشورات العامة من الناس على الشبكة الاجتماعية التي يتبعها الناس على {domain}.",
|
||||
"domain_block_modal.block": "حظر الخادم",
|
||||
"domain_block_modal.block_account_instead": "أحجب @{name} بدلاً من ذلك",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "يمكن للأشخاص من هذا الخادم التفاعل مع منشوراتك القديمة.",
|
||||
"domain_block_modal.they_cant_follow": "لا أحد من هذا الخادم يمكنه متابعتك.",
|
||||
"domain_block_modal.they_wont_know": "لن يَعرف أنه قد تم حظره.",
|
||||
"domain_block_modal.title": "أتريد حظر النطاق؟",
|
||||
"domain_block_modal.you_will_lose_followers": "سيتم إزالة جميع متابعيك من هذا الخادم.",
|
||||
"domain_block_modal.you_wont_see_posts": "لن ترى منشورات أو إشعارات من المستخدمين على هذا الخادم.",
|
||||
"domain_pill.activitypub_lets_connect": "يتيح لك التواصل والتفاعل مع الناس ليس فقط على ماستدون، ولكن عبر تطبيقات اجتماعية مختلفة أيضا.",
|
||||
"domain_pill.activitypub_like_language": "إنّ ActivityPub مثل لغة ماستدون التي يتحدث بها مع شبكات اجتماعية أخرى.",
|
||||
"domain_pill.server": "الخادِم",
|
||||
"domain_pill.their_handle": "مُعرِّفُه:",
|
||||
"domain_pill.their_server": "بيتهم الرقمي، حيث تُستضاف كافة منشوراتهم.",
|
||||
"domain_pill.their_username": "مُعرّفُهم الفريد على الخادم. من الممكن العثور على مستخدمين بنفس اسم المستخدم على خوادم مختلفة.",
|
||||
"domain_pill.username": "اسم المستخدم",
|
||||
"domain_pill.whats_in_a_handle": "ما المقصود بالمُعرِّف؟",
|
||||
"domain_pill.your_handle": "عنوانك الكامل:",
|
||||
"embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
|
||||
"embed.preview": "إليك ما سيبدو عليه:",
|
||||
"emoji_button.activity": "الأنشطة",
|
||||
|
@ -266,6 +292,7 @@
|
|||
"filter_modal.select_filter.subtitle": "استخدم فئة موجودة أو قم بإنشاء فئة جديدة",
|
||||
"filter_modal.select_filter.title": "تصفية هذا المنشور",
|
||||
"filter_modal.title.status": "تصفية منشور",
|
||||
"filtered_notifications_banner.title": "الإشعارات المصفاة",
|
||||
"firehose.all": "الكل",
|
||||
"firehose.local": "هذا الخادم",
|
||||
"firehose.remote": "خوادم أخرى",
|
||||
|
@ -394,6 +421,13 @@
|
|||
"loading_indicator.label": "جاري التحميل…",
|
||||
"media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}",
|
||||
"moved_to_account_banner.text": "حسابك {disabledAccount} معطل حاليًا لأنك انتقلت إلى {movedToAccount}.",
|
||||
"mute_modal.hide_options": "إخفاء الخيارات",
|
||||
"mute_modal.show_options": "إظهار الخيارات",
|
||||
"mute_modal.they_can_mention_and_follow": "سيكون بإمكانه الإشارة إليك ومتابعتك، لكنك لن تره.",
|
||||
"mute_modal.they_wont_know": "لن يَعرف أنه قد تم كتمه.",
|
||||
"mute_modal.title": "أتريد كتم المُستخدم؟",
|
||||
"mute_modal.you_wont_see_mentions": "سوف لن تر المنشورات التي يُشار إليه.",
|
||||
"mute_modal.you_wont_see_posts": "سيكون بإمكانه رؤية منشوراتك، لكنك لن ترى منشوراته.",
|
||||
"navigation_bar.about": "عن",
|
||||
"navigation_bar.advanced_interface": "افتحه في واجهة الويب المتقدمة",
|
||||
"navigation_bar.blocks": "الحسابات المحجوبة",
|
||||
|
@ -429,14 +463,21 @@
|
|||
"notification.own_poll": "انتهى استطلاعك للرأي",
|
||||
"notification.poll": "لقد انتهى استطلاع رأي شاركتَ فيه",
|
||||
"notification.reblog": "قام {name} بمشاركة منشورك",
|
||||
"notification.relationships_severance_event.learn_more": "اعرف المزيد",
|
||||
"notification.status": "{name} نشر للتو",
|
||||
"notification.update": "عدّلَ {name} منشورًا",
|
||||
"notification_requests.accept": "موافقة",
|
||||
"notification_requests.dismiss": "تخطي",
|
||||
"notification_requests.notifications_from": "إشعارات من {name}",
|
||||
"notification_requests.title": "الإشعارات المصفاة",
|
||||
"notifications.clear": "مسح الإشعارات",
|
||||
"notifications.clear_confirmation": "متأكد من أنك تود مسح جميع الإشعارات الخاصة بك و المتلقاة إلى حد الآن ؟",
|
||||
"notifications.column_settings.admin.report": "التبليغات الجديدة:",
|
||||
"notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:",
|
||||
"notifications.column_settings.alert": "إشعارات سطح المكتب",
|
||||
"notifications.column_settings.favourite": "المفضلة:",
|
||||
"notifications.column_settings.filter_bar.advanced": "عرض جميع الفئات",
|
||||
"notifications.column_settings.filter_bar.category": "شريط التصفية السريعة",
|
||||
"notifications.column_settings.follow": "متابعُون جُدُد:",
|
||||
"notifications.column_settings.follow_request": "الطلبات الجديد لِمتابَعتك:",
|
||||
"notifications.column_settings.mention": "الإشارات:",
|
||||
|
@ -462,6 +503,10 @@
|
|||
"notifications.permission_denied": "تنبيهات سطح المكتب غير متوفرة بسبب رفض أذونات المتصفح مسبقاً",
|
||||
"notifications.permission_denied_alert": "لا يمكن تفعيل إشعارات سطح المكتب، لأن إذن المتصفح قد تم رفضه سابقاً",
|
||||
"notifications.permission_required": "إشعارات سطح المكتب غير متوفرة لأنه لم يتم منح الإذن المطلوب.",
|
||||
"notifications.policy.filter_new_accounts_title": "حسابات جديدة",
|
||||
"notifications.policy.filter_not_followers_title": "أشخاص لا يتابعونك",
|
||||
"notifications.policy.filter_not_following_hint": "حتى توافق عليهم يدويا",
|
||||
"notifications.policy.filter_not_following_title": "أشخاص لا تتابعهم",
|
||||
"notifications_permission_banner.enable": "تفعيل إشعارات سطح المكتب",
|
||||
"notifications_permission_banner.how_to_control": "لتلقي الإشعارات عندما لا يكون ماستدون مفتوح، قم بتفعيل إشعارات سطح المكتب، يمكنك التحكم بدقة في أنواع التفاعلات التي تولد إشعارات سطح المكتب من خلال زر الـ{icon} أعلاه بمجرد تفعيلها.",
|
||||
"notifications_permission_banner.title": "لا تفوت شيئاً أبداً",
|
||||
|
@ -638,6 +683,7 @@
|
|||
"status.direct": "إشارة خاصة لـ @{name}",
|
||||
"status.direct_indicator": "إشارة خاصة",
|
||||
"status.edit": "تعديل",
|
||||
"status.edited": "آخر تعديل يوم {date}",
|
||||
"status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}",
|
||||
"status.embed": "إدماج",
|
||||
"status.favourite": "فضّل",
|
||||
|
|
|
@ -471,6 +471,7 @@
|
|||
"notification.own_poll": "Ваша апытанне скончылася",
|
||||
"notification.poll": "Апытанне, дзе вы прынялі ўдзел, скончылася",
|
||||
"notification.reblog": "{name} пашырыў ваш допіс",
|
||||
"notification.relationships_severance_event.learn_more": "Даведацца больш",
|
||||
"notification.status": "Новы допіс ад {name}",
|
||||
"notification.update": "Допіс {name} адрэдагаваны",
|
||||
"notification_requests.accept": "Прыняць",
|
||||
|
@ -483,6 +484,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Новыя ўваходы:",
|
||||
"notifications.column_settings.alert": "Апавяшчэнні на працоўным стале",
|
||||
"notifications.column_settings.favourite": "Упадабанае:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Паказаць усе катэгорыі",
|
||||
"notifications.column_settings.filter_bar.category": "Панэль хуткай фільтрацыі",
|
||||
"notifications.column_settings.follow": "Новыя падпісчыкі:",
|
||||
"notifications.column_settings.follow_request": "Новыя запыты на падпіску:",
|
||||
"notifications.column_settings.mention": "Згадванні:",
|
||||
|
|
|
@ -471,7 +471,11 @@
|
|||
"notification.own_poll": "Анкетата ви приключи",
|
||||
"notification.poll": "Анкета, в която гласувахте, приключи",
|
||||
"notification.reblog": "{name} подсили ваша публикация",
|
||||
"notification.severed_relationships": "Връзката с {name} е прекъсната",
|
||||
"notification.relationships_severance_event": "Изгуби се връзката с {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Администратор от {from} спря {target}, което значи че повече не може да получавате новости от тях или да взаимодействате с тях.",
|
||||
"notification.relationships_severance_event.domain_block": "Администратор от {from} блокира {target}, вкючващо {followersCount} от последователите ви и {followingCount, plural, one {# акаунт, който} other {# акаунта, които}} следвате.",
|
||||
"notification.relationships_severance_event.learn_more": "Научете повече",
|
||||
"notification.relationships_severance_event.user_domain_block": "Блокирахте {target}, премахвайки {followersCount} от последователите си и {followingCount, plural, one {# акаунт, който} other {# акаунта, които}} следвате.",
|
||||
"notification.status": "{name} току-що публикува",
|
||||
"notification.update": "{name} промени публикация",
|
||||
"notification_requests.accept": "Приемам",
|
||||
|
@ -484,6 +488,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Нови регистрации:",
|
||||
"notifications.column_settings.alert": "Известия на работния плот",
|
||||
"notifications.column_settings.favourite": "Любими:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Показване на всички категории",
|
||||
"notifications.column_settings.filter_bar.category": "Лента за бърз филтър",
|
||||
"notifications.column_settings.follow": "Нови последователи:",
|
||||
"notifications.column_settings.follow_request": "Нови заявки за последване:",
|
||||
"notifications.column_settings.mention": "Споменавания:",
|
||||
|
@ -588,12 +594,6 @@
|
|||
"refresh": "Опресняване",
|
||||
"regeneration_indicator.label": "Зареждане…",
|
||||
"regeneration_indicator.sublabel": "Подготовка на началния ви инфоканал!",
|
||||
"relationship_severance_notification.purged_data": "прочистено от администраторите",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# връзка} other {# връзки}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Акаунтът е спрян",
|
||||
"relationship_severance_notification.types.domain_block": "Домейнът е спрян",
|
||||
"relationship_severance_notification.types.user_domain_block": "Блокирахте този домейн",
|
||||
"relationship_severance_notification.view": "Преглед",
|
||||
"relative_time.days": "{number} д.",
|
||||
"relative_time.full.days": "преди {number, plural, one {# ден} other {# дни}}",
|
||||
"relative_time.full.hours": "преди {number, plural, one {# час} other {# часа}}",
|
||||
|
|
|
@ -256,6 +256,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Implijout ur rummad a zo anezhañ pe krouiñ unan nevez",
|
||||
"filter_modal.select_filter.title": "Silañ an toud-mañ",
|
||||
"filter_modal.title.status": "Silañ un toud",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {meneg} two {veneg} few {meneg} other {a venegoù}}",
|
||||
"firehose.all": "Pep tra",
|
||||
"firehose.local": "Ar servijer-mañ",
|
||||
"firehose.remote": "Servijerioù all",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova",
|
||||
"filter_modal.select_filter.title": "Filtra aquest tut",
|
||||
"filter_modal.title.status": "Filtra un tut",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {menció} other {mencions}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificacions {count, plural, =0 {de ningú} one {d'una persona} other {de # persones}} que potser coneixes",
|
||||
"filtered_notifications_banner.title": "Notificacions filtrades",
|
||||
"firehose.all": "Tots",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "La teva enquesta ha finalitzat",
|
||||
"notification.poll": "Ha finalitzat una enquesta en què has votat",
|
||||
"notification.reblog": "{name} t'ha impulsat",
|
||||
"notification.severed_relationships": "S'han eliminat les relacions amb {name}",
|
||||
"notification.relationships_severance_event": "S'han perdut les connexions amb {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspès {target}; això vol dir que ja no en podreu rebre actualitzacions o interactuar-hi.",
|
||||
"notification.relationships_severance_event.domain_block": "Un administrador de {from} ha blocat {target}, incloent-hi {followersCount} dels vostres seguidors i {followingCount, plural, one {# compte} other {# comptes}} que seguiu.",
|
||||
"notification.relationships_severance_event.learn_more": "Per a saber-ne més",
|
||||
"notification.relationships_severance_event.user_domain_block": "Heu blocat {target}, eliminant {followersCount} dels vostres seguidors i {followingCount, plural, one {# compte} other {# comptes}} que seguiu.",
|
||||
"notification.status": "{name} acaba de publicar",
|
||||
"notification.update": "{name} ha editat un tut",
|
||||
"notification_requests.accept": "Accepta",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Registres nous:",
|
||||
"notifications.column_settings.alert": "Notificacions d'escriptori",
|
||||
"notifications.column_settings.favourite": "Favorits:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
|
||||
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
|
||||
"notifications.column_settings.follow": "Nous seguidors:",
|
||||
"notifications.column_settings.follow_request": "Noves sol·licituds de seguiment:",
|
||||
"notifications.column_settings.mention": "Mencions:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Actualitza",
|
||||
"regeneration_indicator.label": "Es carrega…",
|
||||
"regeneration_indicator.sublabel": "Es prepara la teva línia de temps d'Inici!",
|
||||
"relationship_severance_notification.purged_data": "purgat pels administradors",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# relació} other {# relacions}}",
|
||||
"relationship_severance_notification.types.account_suspension": "S'ha suspès el compte",
|
||||
"relationship_severance_notification.types.domain_block": "S'ha suspès el domini",
|
||||
"relationship_severance_notification.types.user_domain_block": "Heu blocat aquest domini",
|
||||
"relationship_severance_notification.view": "Visualitza",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}",
|
||||
"relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}",
|
||||
|
@ -704,7 +705,7 @@
|
|||
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
|
||||
"status.embed": "Incrusta",
|
||||
"status.favourite": "Favorit",
|
||||
"status.favourites": "{count, plural, one {# favorit} other {# favorits}}",
|
||||
"status.favourites": "{count, plural, one {favorit} other {favorits}}",
|
||||
"status.filter": "Filtra aquest tut",
|
||||
"status.filtered": "Filtrada",
|
||||
"status.hide": "Amaga el tut",
|
||||
|
@ -725,7 +726,7 @@
|
|||
"status.reblog": "Impulsa",
|
||||
"status.reblog_private": "Impulsa amb la visibilitat original",
|
||||
"status.reblogged_by": "impulsat per {name}",
|
||||
"status.reblogs": "{count, plural, one {# impuls} other {# impulsos}}",
|
||||
"status.reblogs": "{count, plural, one {impuls} other {impulsos}}",
|
||||
"status.reblogs.empty": "Encara no ha impulsat ningú aquest tut. Quan algú ho faci, apareixerà aquí.",
|
||||
"status.redraft": "Esborra i reescriu",
|
||||
"status.remove_bookmark": "Elimina el marcador",
|
||||
|
|
|
@ -89,6 +89,14 @@
|
|||
"announcement.announcement": "Oznámení",
|
||||
"attachments_list.unprocessed": "(nezpracováno)",
|
||||
"audio.hide": "Skrýt zvuk",
|
||||
"block_modal.remote_users_caveat": "Požádáme server {domain}, aby respektoval vaše rozhodnutí. Úplné dodržování nastavení však není zaručeno, protože některé servery mohou řešit blokování různě. Veřejné příspěvky mohou být stále viditelné pro nepřihlášené uživatele.",
|
||||
"block_modal.show_less": "Zobrazit méně",
|
||||
"block_modal.show_more": "Zobrazit více",
|
||||
"block_modal.they_cant_mention": "Nemůže vás zmiňovat ani sledovat.",
|
||||
"block_modal.they_cant_see_posts": "Nemůže vidět vaše příspěvky a vy neuvidíte jeho.",
|
||||
"block_modal.they_will_know": "Může vidět, že je zablokovaný.",
|
||||
"block_modal.title": "Zablokovat uživatele?",
|
||||
"block_modal.you_wont_see_mentions": "Neuvidíte příspěvky, které ho zmiňují.",
|
||||
"boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}",
|
||||
"bundle_column_error.copy_stacktrace": "Zkopírovat zprávu o chybě",
|
||||
"bundle_column_error.error.body": "Požadovanou stránku nelze vykreslit. Může to být způsobeno chybou v našem kódu nebo problémem s kompatibilitou prohlížeče.",
|
||||
|
@ -169,6 +177,7 @@
|
|||
"confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?",
|
||||
"confirmations.discard_edit_media.confirm": "Zahodit",
|
||||
"confirmations.discard_edit_media.message": "Máte neuložené změny popisku médií nebo náhledu, chcete je přesto zahodit?",
|
||||
"confirmations.domain_block.confirm": "Blokovat server",
|
||||
"confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí blokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
|
||||
"confirmations.edit.confirm": "Upravit",
|
||||
"confirmations.edit.message": "Editovat teď znamená přepsání zprávy, kterou právě tvoříte. Opravdu chcete pokračovat?",
|
||||
|
@ -200,6 +209,27 @@
|
|||
"dismissable_banner.explore_statuses": "Toto jsou příspěvky ze sociálních sítí, které dnes získávají na popularitě. Novější příspěvky s větším počtem boostů a oblíbení jsou hodnoceny výše.",
|
||||
"dismissable_banner.explore_tags": "Tyto hashtagy právě teď získávají na popularitě mezi lidmi na tomto a dalších serverech decentralizované sítě.",
|
||||
"dismissable_banner.public_timeline": "Toto jsou nejnovější veřejné příspěvky od lidí na sociální síti, které sledují lidé na {domain}.",
|
||||
"domain_block_modal.block": "Blokovat server",
|
||||
"domain_block_modal.block_account_instead": "Raději blokovat @{name}",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Lidé z tohoto serveru mohou interagovat s vašimi starými příspěvky.",
|
||||
"domain_block_modal.they_cant_follow": "Nikdo z tohoto serveru vás nemůže sledovat.",
|
||||
"domain_block_modal.they_wont_know": "Nebude vědět, že je zablokován.",
|
||||
"domain_block_modal.title": "Blokovat doménu?",
|
||||
"domain_block_modal.you_will_lose_followers": "Všichni vaši sledující z tohoto serveru budou odstraněni.",
|
||||
"domain_block_modal.you_wont_see_posts": "Neuvidíte příspěvky ani upozornění od uživatelů z tohoto serveru.",
|
||||
"domain_pill.activitypub_lets_connect": "Umožňuje vám spojit se a komunikovat s lidmi nejen na Mastodonu, ale i s dalšími sociálními aplikacemi.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub je jako jazyk, kterým Mastodon mluví s jinými sociálními sítěmi.",
|
||||
"domain_pill.server": "Server",
|
||||
"domain_pill.their_handle": "Handle:",
|
||||
"domain_pill.their_server": "Digitální domov, kde žijí všechny příspěvky.",
|
||||
"domain_pill.their_username": "Jedinečný identikátor na serveru. Je možné najít uživatele se stejným uživatelským jménem na různých serverech.",
|
||||
"domain_pill.username": "Uživatelské jméno",
|
||||
"domain_pill.whats_in_a_handle": "Co obsahuje handle?",
|
||||
"domain_pill.who_they_are": "Protože handle říkají kdo je kdo a také kde, je možné interagovat s lidmi napříč sociálními weby <button>platforem postavených na ActivityPub</button>.",
|
||||
"domain_pill.who_you_are": "Protože handle říká kdo jsi a kde jsi, mohou s tebou lidé komunikovat napříč sociálními weby <button>platforem postavených na ActivityPub</button>.",
|
||||
"domain_pill.your_handle": "Tvůj handle:",
|
||||
"domain_pill.your_server": "Tvůj digitální domov, kde žijí všechny tvé příspěvky. Nelíbí se ti? Kdykoliv se přesuň na jiný server a vezmi si sebou i své sledující.",
|
||||
"domain_pill.your_username": "Tvůj jedinečný identifikátor na tomto serveru. Je možné najít uživatele se stejným uživatelským jménem na jiných serverech.",
|
||||
"embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
|
||||
"embed.preview": "Takhle to bude vypadat:",
|
||||
"emoji_button.activity": "Aktivita",
|
||||
|
@ -236,6 +266,7 @@
|
|||
"empty_column.list": "V tomto seznamu zatím nic není. Až nějaký člen z tohoto seznamu zveřejní nový příspěvek, objeví se zde.",
|
||||
"empty_column.lists": "Zatím nemáte žádné seznamy. Až nějaký vytvoříte, zobrazí se zde.",
|
||||
"empty_column.mutes": "Zatím jste neskryli žádného uživatele.",
|
||||
"empty_column.notification_requests": "Vyčištěno! Nic tu není. Jakmile obdržíš nové notifikace, objeví se zde podle tvého nastavení.",
|
||||
"empty_column.notifications": "Zatím nemáte žádná oznámení. Až s vámi někdo bude interagovat, uvidíte to zde.",
|
||||
"empty_column.public": "Tady nic není! Napište něco veřejně, nebo začněte ručně sledovat uživatele z jiných serverů, aby tu něco přibylo",
|
||||
"error.unexpected_crash.explanation": "Kvůli chybě v našem kódu nebo problému s kompatibilitou prohlížeče nemohla být tato stránka správně zobrazena.",
|
||||
|
@ -266,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Použít existující kategorii nebo vytvořit novou kategorii",
|
||||
"filter_modal.select_filter.title": "Filtrovat tento příspěvek",
|
||||
"filter_modal.title.status": "Filtrovat příspěvek",
|
||||
"filtered_notifications_banner.title": "Filtrovaná oznámení",
|
||||
"firehose.all": "Vše",
|
||||
"firehose.local": "Tento server",
|
||||
"firehose.remote": "Ostatní servery",
|
||||
|
@ -394,6 +426,8 @@
|
|||
"loading_indicator.label": "Načítání…",
|
||||
"media_gallery.toggle_visible": "{number, plural, one {Skrýt obrázek} few {Skrýt obrázky} many {Skrýt obrázky} other {Skrýt obrázky}}",
|
||||
"moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.",
|
||||
"mute_modal.hide_from_notifications": "Skrýt z notifikací",
|
||||
"mute_modal.title": "Ztlumit uživatele?",
|
||||
"navigation_bar.about": "O aplikaci",
|
||||
"navigation_bar.advanced_interface": "Otevřít pokročilé webové rozhraní",
|
||||
"navigation_bar.blocks": "Blokovaní uživatelé",
|
||||
|
@ -429,8 +463,11 @@
|
|||
"notification.own_poll": "Vaše anketa skončila",
|
||||
"notification.poll": "Anketa, ve které jste hlasovali, skončila",
|
||||
"notification.reblog": "Uživatel {name} boostnul váš příspěvek",
|
||||
"notification.relationships_severance_event.learn_more": "Zjistit více",
|
||||
"notification.status": "Uživatel {name} právě přidal příspěvek",
|
||||
"notification.update": "Uživatel {name} upravil příspěvek",
|
||||
"notification_requests.accept": "Přijmout",
|
||||
"notification_requests.dismiss": "Zamítnout",
|
||||
"notifications.clear": "Vyčistit oznámení",
|
||||
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
|
||||
"notifications.column_settings.admin.report": "Nová hlášení:",
|
||||
|
|
|
@ -220,7 +220,7 @@
|
|||
"domain_pill.activitypub_lets_connect": "Det muliggør at komme i forbindelse og interagere med folk ikke kun på Mastodon, men også på tværs af forskellige sociale apps.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", Mastodon taler med andre sociale netværk.",
|
||||
"domain_pill.server": "Server",
|
||||
"domain_pill.their_handle": "Deres handle:",
|
||||
"domain_pill.their_handle": "Vedkommendes handle:",
|
||||
"domain_pill.username": "Brugernavn",
|
||||
"domain_pill.whats_in_a_handle": "Hvad er der i et handle (@brugernavn)?",
|
||||
"domain_pill.who_they_are": "Da et handle fortæller, hvem nogen er, og hvor de er, kan man interagere med folk på tværs af det sociale net af <button>ActivityPub-drevne platforme</button>.",
|
||||
|
@ -295,6 +295,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Vælg en eksisterende kategori eller opret en ny",
|
||||
"filter_modal.select_filter.title": "Filtrér dette indlæg",
|
||||
"filter_modal.title.status": "Filtrér et indlæg",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notifikationer fra {count, plural, =0 {ingen} one {én person} other {# personer}} du måske kender",
|
||||
"filtered_notifications_banner.title": "Filtrerede notifikationer",
|
||||
"firehose.all": "Alle",
|
||||
|
@ -469,6 +470,11 @@
|
|||
"notification.own_poll": "Din afstemning er afsluttet",
|
||||
"notification.poll": "En afstemning, hvori du stemte, er slut",
|
||||
"notification.reblog": "{name} boostede dit indlæg",
|
||||
"notification.relationships_severance_event": "Mistede forbindelser med {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "En admin fra {from} har suspenderet {target}, hvofor opdateringer herfra eller interaktion hermed ikke længer er mulig.",
|
||||
"notification.relationships_severance_event.domain_block": "En admin fra {from} har blokeret {target}, herunder {followersCount} tilhængere og {followingCount, plural, one {# konto, der} other {# konti, som}} følges.",
|
||||
"notification.relationships_severance_event.learn_more": "Læs mere",
|
||||
"notification.relationships_severance_event.user_domain_block": "{target} er blevet blokeret, og {followersCount} tilhængere samt {followingCount, plural, one {# konto, der} other {# konti, som}} følges, er hermed fjernet.",
|
||||
"notification.status": "{name} har netop postet",
|
||||
"notification.update": "{name} redigerede et indlæg",
|
||||
"notification_requests.accept": "Acceptér",
|
||||
|
@ -481,6 +487,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nye tilmeldinger:",
|
||||
"notifications.column_settings.alert": "Computernotifikationer",
|
||||
"notifications.column_settings.favourite": "Favoritter:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
|
||||
"notifications.column_settings.filter_bar.category": "Hurtigfiltreringsbjælke",
|
||||
"notifications.column_settings.follow": "Nye følgere:",
|
||||
"notifications.column_settings.follow_request": "Nye følgeanmodninger:",
|
||||
"notifications.column_settings.mention": "Omtaler:",
|
||||
|
@ -585,12 +593,6 @@
|
|||
"refresh": "Genindlæs",
|
||||
"regeneration_indicator.label": "Indlæser…",
|
||||
"regeneration_indicator.sublabel": "Din hjemmetidslinje klargøres!",
|
||||
"relationship_severance_notification.purged_data": "renset af administratorer",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# forhold} other {# forhold}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Konto er blevet suspenderet",
|
||||
"relationship_severance_notification.types.domain_block": "Domæne er blevet suspenderet",
|
||||
"relationship_severance_notification.types.user_domain_block": "Dette domæne blev blokeret",
|
||||
"relationship_severance_notification.view": "Vis",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.full.days": "{number, plural, one {# dag} other {# dage}} siden",
|
||||
"relative_time.full.hours": "{number, plural, one {# time} other {# timer}} siden",
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
"alert.rate_limited.message": "Bitte versuche es nach {retry_time, time, medium} erneut.",
|
||||
"alert.rate_limited.title": "Anfragelimit überschritten",
|
||||
"alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.",
|
||||
"alert.unexpected.title": "Ups!",
|
||||
"alert.unexpected.title": "Oha!",
|
||||
"announcement.announcement": "Ankündigung",
|
||||
"attachments_list.unprocessed": "(ausstehend)",
|
||||
"audio.hide": "Audio ausblenden",
|
||||
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen",
|
||||
"filter_modal.select_filter.title": "Diesen Beitrag filtern",
|
||||
"filter_modal.title.status": "Beitrag per Filter ausblenden",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {Erwähnung} other {Erwähnungen}}",
|
||||
"filtered_notifications_banner.pending_requests": "Benachrichtigungen von {count, plural, =0 {keinem Profil, das du möglicherweise kennst} one {einem Profil, das du möglicherweise kennst} other {# Profilen, die du möglicherweise kennst}}",
|
||||
"filtered_notifications_banner.title": "Gefilterte Benachrichtigungen",
|
||||
"firehose.all": "Alles",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "Deine Umfrage ist beendet",
|
||||
"notification.poll": "Eine Umfrage, an der du teilgenommen hast, ist beendet",
|
||||
"notification.reblog": "{name} teilte deinen Beitrag",
|
||||
"notification.severed_relationships": "Beziehungen zu {name} getrennt",
|
||||
"notification.relationships_severance_event": "Verbindungen mit {name} verloren",
|
||||
"notification.relationships_severance_event.account_suspension": "Ein Admin von {from} hat {target} gesperrt. Du wirst von diesem Profil keine Updates mehr erhalten und auch nicht mit ihm interagieren können.",
|
||||
"notification.relationships_severance_event.domain_block": "Ein Admin von {from} hat {target} blockiert – darunter {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst.",
|
||||
"notification.relationships_severance_event.learn_more": "Mehr erfahren",
|
||||
"notification.relationships_severance_event.user_domain_block": "Du hast {target} blockiert – {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst, wurden entfernt.",
|
||||
"notification.status": "{name} hat gerade etwas gepostet",
|
||||
"notification.update": "{name} bearbeitete einen Beitrag",
|
||||
"notification_requests.accept": "Akzeptieren",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Neue Registrierungen:",
|
||||
"notifications.column_settings.alert": "Desktop-Benachrichtigungen",
|
||||
"notifications.column_settings.favourite": "Favoriten:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Alle Filterkategorien anzeigen",
|
||||
"notifications.column_settings.filter_bar.category": "Filterleiste",
|
||||
"notifications.column_settings.follow": "Neue Follower:",
|
||||
"notifications.column_settings.follow_request": "Neue Follower-Anfragen:",
|
||||
"notifications.column_settings.mention": "Erwähnungen:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Aktualisieren",
|
||||
"regeneration_indicator.label": "Wird geladen …",
|
||||
"regeneration_indicator.sublabel": "Deine Startseite wird gerade vorbereitet!",
|
||||
"relationship_severance_notification.purged_data": "von Administrator*innen entfernt",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# Beziehung} other {# Beziehungen}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Konto wurde gesperrt",
|
||||
"relationship_severance_notification.types.domain_block": "Domain wurde gesperrt",
|
||||
"relationship_severance_notification.types.user_domain_block": "Du hast diese Domain blockiert",
|
||||
"relationship_severance_notification.view": "Anzeigen",
|
||||
"relative_time.days": "{number} T.",
|
||||
"relative_time.full.days": "vor {number, plural, one {# Tag} other {# Tagen}}",
|
||||
"relative_time.full.hours": "vor {number, plural, one {# Stunde} other {# Stunden}}",
|
||||
|
|
|
@ -89,6 +89,14 @@
|
|||
"announcement.announcement": "Announcement",
|
||||
"attachments_list.unprocessed": "(unprocessed)",
|
||||
"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.show_less": "Show less",
|
||||
"block_modal.show_more": "Show more",
|
||||
"block_modal.they_cant_mention": "They can't mention or follow you.",
|
||||
"block_modal.they_cant_see_posts": "They can't see your posts and you won't see theirs.",
|
||||
"block_modal.they_will_know": "They can see that they're blocked.",
|
||||
"block_modal.title": "Block user?",
|
||||
"block_modal.you_wont_see_mentions": "You won't see posts that mention them.",
|
||||
"boost_modal.combo": "You can press {combo} to skip this next time",
|
||||
"bundle_column_error.copy_stacktrace": "Copy error report",
|
||||
"bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
|
||||
|
@ -169,6 +177,7 @@
|
|||
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
|
||||
"confirmations.discard_edit_media.confirm": "Discard",
|
||||
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
|
||||
"confirmations.domain_block.confirm": "Block server",
|
||||
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
|
||||
"confirmations.edit.confirm": "Edit",
|
||||
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
|
||||
|
@ -431,6 +440,7 @@
|
|||
"notifications.column_settings.admin.sign_up": "New sign-ups:",
|
||||
"notifications.column_settings.alert": "Desktop notifications",
|
||||
"notifications.column_settings.favourite": "Favourites:",
|
||||
"notifications.column_settings.filter_bar.category": "Quick filter bar",
|
||||
"notifications.column_settings.follow": "New followers:",
|
||||
"notifications.column_settings.follow_request": "New follow requests:",
|
||||
"notifications.column_settings.mention": "Mentions:",
|
||||
|
@ -456,6 +466,15 @@
|
|||
"notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
|
||||
"notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
|
||||
"notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
|
||||
"notifications.policy.filter_new_accounts.hint": "Created within the past {days, plural, one {one day} other {# days}}",
|
||||
"notifications.policy.filter_new_accounts_title": "New accounts",
|
||||
"notifications.policy.filter_not_followers_hint": "Including people who have been following you fewer than {days, plural, one {one day} other {# days}}",
|
||||
"notifications.policy.filter_not_followers_title": "People not following you",
|
||||
"notifications.policy.filter_not_following_hint": "Until you manually approve them",
|
||||
"notifications.policy.filter_not_following_title": "People you don't follow",
|
||||
"notifications.policy.filter_private_mentions_hint": "Filtered unless it's in reply to your own mention or if you follow the sender",
|
||||
"notifications.policy.filter_private_mentions_title": "Unsolicited private mentions",
|
||||
"notifications.policy.title": "Filter out notifications from…",
|
||||
"notifications_permission_banner.enable": "Enable desktop notifications",
|
||||
"notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
|
||||
"notifications_permission_banner.title": "Never miss a thing",
|
||||
|
@ -632,9 +651,11 @@
|
|||
"status.direct": "Privately mention @{name}",
|
||||
"status.direct_indicator": "Private mention",
|
||||
"status.edit": "Edit",
|
||||
"status.edited": "Last edited {date}",
|
||||
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
|
||||
"status.embed": "Embed",
|
||||
"status.favourite": "Favourite",
|
||||
"status.favourites": "{count, plural, one {favorite} other {favorites}}",
|
||||
"status.filter": "Filter this post",
|
||||
"status.filtered": "Filtered",
|
||||
"status.hide": "Hide post",
|
||||
|
@ -655,6 +676,7 @@
|
|||
"status.reblog": "Boost",
|
||||
"status.reblog_private": "Boost with original visibility",
|
||||
"status.reblogged_by": "{name} boosted",
|
||||
"status.reblogs": "{count, plural, one {boost} other {boosts}}",
|
||||
"status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
|
||||
"status.redraft": "Delete & re-draft",
|
||||
"status.remove_bookmark": "Remove bookmark",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Use an existing category or create a new one",
|
||||
"filter_modal.select_filter.title": "Filter this post",
|
||||
"filter_modal.title.status": "Filter a post",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notifications from {count, plural, =0 {no one} one {one person} other {# people}} you may know",
|
||||
"filtered_notifications_banner.title": "Filtered notifications",
|
||||
"firehose.all": "All",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "Your poll has ended",
|
||||
"notification.poll": "A poll you have voted in has ended",
|
||||
"notification.reblog": "{name} boosted your post",
|
||||
"notification.severed_relationships": "Relationships with {name} severed",
|
||||
"notification.relationships_severance_event": "Lost connections with {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.",
|
||||
"notification.relationships_severance_event.domain_block": "An admin from {from} has blocked {target}, including {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.",
|
||||
"notification.relationships_severance_event.learn_more": "Learn more",
|
||||
"notification.relationships_severance_event.user_domain_block": "You have blocked {target}, removing {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.",
|
||||
"notification.status": "{name} just posted",
|
||||
"notification.update": "{name} edited a post",
|
||||
"notification_requests.accept": "Accept",
|
||||
|
@ -590,12 +595,6 @@
|
|||
"refresh": "Refresh",
|
||||
"regeneration_indicator.label": "Loading…",
|
||||
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
|
||||
"relationship_severance_notification.purged_data": "purged by administrators",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# relationship} other {# relationships}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Account has been suspended",
|
||||
"relationship_severance_notification.types.domain_block": "Domain has been suspended",
|
||||
"relationship_severance_notification.types.user_domain_block": "You blocked this domain",
|
||||
"relationship_severance_notification.view": "View",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
|
||||
"relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar una categoría existente o crear una nueva",
|
||||
"filter_modal.select_filter.title": "Filtrar este mensaje",
|
||||
"filter_modal.title.status": "Filtrar un mensaje",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {menciones}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificaciones de {count, plural, =0 {nadie} one {una persona} other {# personas}} que podrías conocer",
|
||||
"filtered_notifications_banner.title": "Notificaciones filtradas",
|
||||
"firehose.all": "Todos",
|
||||
|
@ -427,7 +428,7 @@
|
|||
"loading_indicator.label": "Cargando…",
|
||||
"media_gallery.toggle_visible": "Ocultar {number, plural, one {imagen} other {imágenes}}",
|
||||
"moved_to_account_banner.text": "Tu cuenta {disabledAccount} está actualmente deshabilitada porque te mudaste a {movedToAccount}.",
|
||||
"mute_modal.hide_from_notifications": "Ocultar de las notificaciones",
|
||||
"mute_modal.hide_from_notifications": "Ocultar en las notificaciones",
|
||||
"mute_modal.hide_options": "Ocultar opciones",
|
||||
"mute_modal.indefinite": "Hasta que deje de silenciarlos",
|
||||
"mute_modal.show_options": "Mostrar opciones",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "Tu encuesta finalizó",
|
||||
"notification.poll": "Finalizó una encuesta en la que votaste",
|
||||
"notification.reblog": "{name} adhirió a tu mensaje",
|
||||
"notification.severed_relationships": "Relaciones con {name} cortadas",
|
||||
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Un administrador de {from} suspendió a {target}, lo que significa que ya no podés recibir actualizaciones de esa cuenta o interactuar con la misma.",
|
||||
"notification.relationships_severance_event.domain_block": "Un administrador de {from} bloqueó a {target}, incluyendo {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que seguís.",
|
||||
"notification.relationships_severance_event.learn_more": "Aprendé más",
|
||||
"notification.relationships_severance_event.user_domain_block": "Bloqueaste a {target}, eliminando {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que seguís.",
|
||||
"notification.status": "{name} acaba de enviar un mensaje",
|
||||
"notification.update": "{name} editó un mensaje",
|
||||
"notification_requests.accept": "Aceptar",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nuevos registros:",
|
||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||
"notifications.column_settings.favourite": "Favoritos:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||
"notifications.column_settings.follow": "Nuevos seguidores:",
|
||||
"notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
|
||||
"notifications.column_settings.mention": "Menciones:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Refrescar",
|
||||
"regeneration_indicator.label": "Cargando…",
|
||||
"regeneration_indicator.sublabel": "¡Se está preparando tu línea temporal principal!",
|
||||
"relationship_severance_notification.purged_data": "purgada por administradores",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# relación} other {# relaciones}}",
|
||||
"relationship_severance_notification.types.account_suspension": "La cuenta fue suspendida",
|
||||
"relationship_severance_notification.types.domain_block": "El dominio fue suspendido",
|
||||
"relationship_severance_notification.types.user_domain_block": "Bloqueaste este dominio",
|
||||
"relationship_severance_notification.view": "Ver",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.full.days": "{number, plural,one {hace # día} other {hace # días}}",
|
||||
"relative_time.full.hours": "{number, plural,one {hace # hora} other {hace # horas}}",
|
||||
|
|
|
@ -471,6 +471,11 @@
|
|||
"notification.own_poll": "Tu encuesta ha terminado",
|
||||
"notification.poll": "Una encuesta en la que has votado ha terminado",
|
||||
"notification.reblog": "{name} ha retooteado tu estado",
|
||||
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspendido {target}, lo que significa que ya no puedes recibir actualizaciones de sus cuentas o interactuar con ellas.",
|
||||
"notification.relationships_severance_event.domain_block": "Un administrador de {from} ha bloqueado {target}, incluyendo {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que sigues.",
|
||||
"notification.relationships_severance_event.learn_more": "Más información",
|
||||
"notification.relationships_severance_event.user_domain_block": "Has bloqueado {target}, eliminando {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que sigues.",
|
||||
"notification.status": "{name} acaba de publicar",
|
||||
"notification.update": "{name} editó una publicación",
|
||||
"notification_requests.accept": "Aceptar",
|
||||
|
@ -483,6 +488,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Registros nuevos:",
|
||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||
"notifications.column_settings.favourite": "Favoritos:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||
"notifications.column_settings.follow": "Nuevos seguidores:",
|
||||
"notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
|
||||
"notifications.column_settings.mention": "Menciones:",
|
||||
|
|
|
@ -471,6 +471,11 @@
|
|||
"notification.own_poll": "Tu encuesta ha terminado",
|
||||
"notification.poll": "Una encuesta en la que has votado ha terminado",
|
||||
"notification.reblog": "{name} ha impulsado tu publicación",
|
||||
"notification.relationships_severance_event": "Conexiones perdidas con {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Un administrador de {from} ha suspendido {target}, lo que significa que ya no puedes recibir actualizaciones de sus cuentas o interactuar con ellas.",
|
||||
"notification.relationships_severance_event.domain_block": "Un administrador de {from} ha bloqueado {target}, incluyendo {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que sigues.",
|
||||
"notification.relationships_severance_event.learn_more": "Más información",
|
||||
"notification.relationships_severance_event.user_domain_block": "Has bloqueado {target}, eliminando {followersCount} de tus seguidores y {followingCount, plural, one {# cuenta} other {# cuentas}} que sigues.",
|
||||
"notification.status": "{name} acaba de publicar",
|
||||
"notification.update": "{name} editó una publicación",
|
||||
"notification_requests.accept": "Aceptar",
|
||||
|
@ -483,6 +488,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nuevos registros:",
|
||||
"notifications.column_settings.alert": "Notificaciones de escritorio",
|
||||
"notifications.column_settings.favourite": "Favoritos:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías",
|
||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||
"notifications.column_settings.follow": "Nuevos seguidores:",
|
||||
"notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
|
||||
"notifications.column_settings.mention": "Menciones:",
|
||||
|
|
|
@ -92,7 +92,11 @@
|
|||
"block_modal.remote_users_caveat": "Serverile {domain} edastatakse palve otsust järgida. Ometi pole see tagatud, kuna mõned serverid võivad blokeeringuid käsitleda omal moel. Avalikud postitused võivad tuvastamata kasutajatele endiselt näha olla.",
|
||||
"block_modal.show_less": "Kuva vähem",
|
||||
"block_modal.show_more": "Kuva rohkem",
|
||||
"block_modal.they_cant_mention": "Ta ei saa mainida sind ega jälgida.",
|
||||
"block_modal.they_cant_see_posts": "Ta ei näe sinu postitusi ja sa ei näe tema omi.",
|
||||
"block_modal.they_will_know": "Ta näeb, et ta on blokeeritud.",
|
||||
"block_modal.title": "Blokeeri kasutaja?",
|
||||
"block_modal.you_wont_see_mentions": "Sa ei näe postitusi, mis mainivad teda.",
|
||||
"boost_modal.combo": "Vajutades {combo}, saab selle edaspidi vahele jätta",
|
||||
"bundle_column_error.copy_stacktrace": "Kopeeri veateade",
|
||||
"bundle_column_error.error.body": "Soovitud lehte ei õnnestunud esitada. See võib olla meie koodiviga või probleem brauseri ühilduvusega.",
|
||||
|
@ -206,8 +210,26 @@
|
|||
"dismissable_banner.explore_tags": "Need sildid siit ja teistes serveritest detsentraliseeritud võrgus koguvad tähelepanu just praegu selles serveris.",
|
||||
"dismissable_banner.public_timeline": "Need on kõige uuemad avalikud postitused inimestelt sotsiaalvõrgustikus, mida {domain} inimesed jälgivad.",
|
||||
"domain_block_modal.block": "Blokeeri server",
|
||||
"domain_block_modal.block_account_instead": "Selle asemel blokeeri @{name}",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Inimesed sellest serverist saavad interakteeruda sinu vanade postitustega.",
|
||||
"domain_block_modal.they_cant_follow": "Sellest serverist ei saa keegi sind jälgida.",
|
||||
"domain_block_modal.they_wont_know": "Nad ei tea, et nad on blokeeritud.",
|
||||
"domain_block_modal.title": "Blokeerida domeen?",
|
||||
"domain_block_modal.you_will_lose_followers": "Kõik sinu sellest serverist pärit jälgijad eemaldatakse.",
|
||||
"domain_block_modal.you_wont_see_posts": "Sa ei näe selle serveri kasutajate postitusi ega teavitusi.",
|
||||
"domain_pill.activitypub_lets_connect": "See võimaldab sul ühenduda inimestega ja nendega suhelda mitte ainult Mastodonis, vaid ka teistes suhtlusrakendustes.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub on nagu keel, mida Mastodon räägib teiste suhtlusvõrgustikega.",
|
||||
"domain_pill.server": "Server",
|
||||
"domain_pill.their_handle": "Tema tunnus:",
|
||||
"domain_pill.their_server": "Tema digitaalne kodu, kus kõik tema postitused on.",
|
||||
"domain_pill.their_username": "Tema unikaalne tunnus tema serveris. On võimalik, et mingites teistes serverites on sama kasutajanimega kasutajaid.",
|
||||
"domain_pill.username": "Kasutajanimi",
|
||||
"domain_pill.whats_in_a_handle": "Mis on tunnuses?",
|
||||
"domain_pill.who_they_are": "Kuna tunnus ütleb, kes keegi on ja kus, saad suhelda inimestega üle <button>ActivityPub-poolt toetatud sotsiaalvõrkude platvormide</button>.",
|
||||
"domain_pill.who_you_are": "Kuna tunnus ütleb, kes sa oled ja kus, saavad inimesed sinuga suhelda üle <button>ActivityPub-poolt toetatud sotsiaalvõrkude platvormide</button>.",
|
||||
"domain_pill.your_handle": "Sinu tunnus:",
|
||||
"domain_pill.your_server": "Sinu digitaalne kodu, kus on kõik sinu postitused. Sulle ei meeldi see? Vaheta mistahes ajal serverit ja võta jälgijad ka.",
|
||||
"domain_pill.your_username": "Sinu unikaalne identifikaator siin serveris. On võimalik, et leiad teistes serverites samasuguse kasutajanimega kasutajaid.",
|
||||
"embed.instructions": "Lisa see postitus oma veebilehele, kopeerides alloleva koodi.",
|
||||
"embed.preview": "Nii näeb see välja:",
|
||||
"emoji_button.activity": "Tegevus",
|
||||
|
@ -244,6 +266,7 @@
|
|||
"empty_column.list": "Siin loetelus pole veel midagi. Kui loetelu liikmed teevad uusi postitusi, näed neid siin.",
|
||||
"empty_column.lists": "Pole veel ühtegi nimekirja. Kui lood mõne, näed neid siin.",
|
||||
"empty_column.mutes": "Sa pole veel ühtegi kasutajat vaigistanud.",
|
||||
"empty_column.notification_requests": "Kõik tühi! Siin pole mitte midagi. Kui saad uusi teavitusi, ilmuvad need siin vastavalt sinu seadistustele.",
|
||||
"empty_column.notifications": "Ei ole veel teateid. Kui keegi suhtleb sinuga, näed seda siin.",
|
||||
"empty_column.public": "Siin pole midagi! Kirjuta midagi avalikku või jälgi ise kasutajaid täitmaks seda ruumi",
|
||||
"error.unexpected_crash.explanation": "Meie poolse probleemi või veebilehitseja ühilduvusprobleemi tõttu ei suutnud me seda lehekülge korrektselt näidata.",
|
||||
|
@ -275,6 +298,7 @@
|
|||
"filter_modal.select_filter.title": "Filtreeri seda postitust",
|
||||
"filter_modal.title.status": "Postituse filtreerimine",
|
||||
"filtered_notifications_banner.pending_requests": "Teateid {count, plural, =0 {mitte üheltki} one {ühelt} other {#}} inimeselt, keda võid teada",
|
||||
"filtered_notifications_banner.title": "Filtreeritud teavitused",
|
||||
"firehose.all": "Kõik",
|
||||
"firehose.local": "See server",
|
||||
"firehose.remote": "Teised serverid",
|
||||
|
@ -403,8 +427,15 @@
|
|||
"loading_indicator.label": "Laadimine…",
|
||||
"media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}",
|
||||
"moved_to_account_banner.text": "Kontot {disabledAccount} ei ole praegu võimalik kasutada, sest kolisid kontole {movedToAccount}.",
|
||||
"mute_modal.hide_from_notifications": "Peida teavituste hulgast",
|
||||
"mute_modal.hide_options": "Peida valikud",
|
||||
"mute_modal.indefinite": "Kuni eemaldan neilt vaigistuse",
|
||||
"mute_modal.show_options": "Kuva valikud",
|
||||
"mute_modal.they_can_mention_and_follow": "Ta saab sind mainida ja sind jälgida, kuid sa ei näe teda.",
|
||||
"mute_modal.they_wont_know": "Ta ei tea, et ta on vaigistatud.",
|
||||
"mute_modal.title": "Vaigistada kasutaja?",
|
||||
"mute_modal.you_wont_see_mentions": "Sa ei näe postitusi, mis teda mainivad.",
|
||||
"mute_modal.you_wont_see_posts": "Ta näeb jätkuvalt sinu postitusi, kuid sa ei näe tema omi.",
|
||||
"navigation_bar.about": "Teave",
|
||||
"navigation_bar.advanced_interface": "Ava kohandatud veebiliides",
|
||||
"navigation_bar.blocks": "Blokeeritud kasutajad",
|
||||
|
@ -440,16 +471,25 @@
|
|||
"notification.own_poll": "Su küsitlus on lõppenud",
|
||||
"notification.poll": "Küsitlus, milles osalesid, on lõppenud",
|
||||
"notification.reblog": "{name} jagas edasi postitust",
|
||||
"notification.relationships_severance_event": "Kadunud ühendus kasutajaga {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "{from} admin on kustutanud {target}, mis tähendab, et sa ei saa enam neilt uuendusi või suhelda nendega.",
|
||||
"notification.relationships_severance_event.domain_block": "{from} admin on blokeerinud {target}, sealhulgas {followersCount} sinu jälgijat ja {followingCount, plural, one {# konto} other {# kontot}}, mida jälgid.",
|
||||
"notification.relationships_severance_event.learn_more": "Saa rohkem teada",
|
||||
"notification.relationships_severance_event.user_domain_block": "Blokeerisid {target}, eemaldades oma jälgijate hulgast {followersCount} ja jälgitavate hulgast {followingCount, plural, one {# konto} other {# kontot}}.",
|
||||
"notification.status": "{name} just postitas",
|
||||
"notification.update": "{name} muutis postitust",
|
||||
"notification_requests.accept": "Nõus",
|
||||
"notification_requests.dismiss": "Hülga",
|
||||
"notification_requests.notifications_from": "Teavitus kasutajalt {name}",
|
||||
"notification_requests.title": "Filtreeritud teavitused",
|
||||
"notifications.clear": "Puhasta teated",
|
||||
"notifications.clear_confirmation": "Oled kindel, et soovid püsivalt kõik oma teated eemaldada?",
|
||||
"notifications.column_settings.admin.report": "Uued teavitused:",
|
||||
"notifications.column_settings.admin.sign_up": "Uued kasutajad:",
|
||||
"notifications.column_settings.alert": "Töölauateated",
|
||||
"notifications.column_settings.favourite": "Lemmikud:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Näita kõiki kategooriaid",
|
||||
"notifications.column_settings.filter_bar.category": "Kiirfiltri riba",
|
||||
"notifications.column_settings.follow": "Uued jälgijad:",
|
||||
"notifications.column_settings.follow_request": "Uued jälgimistaotlused:",
|
||||
"notifications.column_settings.mention": "Mainimised:",
|
||||
|
@ -475,7 +515,15 @@
|
|||
"notifications.permission_denied": "Töölauamärguanded pole saadaval, kuna eelnevalt keelduti lehitsejale teavituste luba andmast",
|
||||
"notifications.permission_denied_alert": "Töölaua märguandeid ei saa lubada, kuna brauseri luba on varem keeldutud",
|
||||
"notifications.permission_required": "Töölaua märguanded ei ole saadaval, kuna vajalik luba pole antud.",
|
||||
"notifications.policy.filter_new_accounts.hint": "Loodud viimase {days, plural, one {ühe päeva} other {# päeva}} jooksul",
|
||||
"notifications.policy.filter_new_accounts_title": "Uued kontod",
|
||||
"notifications.policy.filter_not_followers_hint": "Kaasates kasutajad, kes on sind jälginud vähem kui {days, plural, one {ühe päeva} other {# päeva}}",
|
||||
"notifications.policy.filter_not_followers_title": "Sind mittejälgivad kasutajad",
|
||||
"notifications.policy.filter_not_following_hint": "Kuni sa nad käsitsi kinnitad",
|
||||
"notifications.policy.filter_not_following_title": "Inimesed, keda sa ei jälgi",
|
||||
"notifications.policy.filter_private_mentions_hint": "Filtreeritud, kui see pole vastus sinupoolt mainimisele või kui jälgid saatjat",
|
||||
"notifications.policy.filter_private_mentions_title": "Soovimatud privaatsed mainimised",
|
||||
"notifications.policy.title": "Filtreeri välja teavitused kohast…",
|
||||
"notifications_permission_banner.enable": "Luba töölaua märguanded",
|
||||
"notifications_permission_banner.how_to_control": "Et saada teateid, ajal mil Mastodon pole avatud, luba töölauamärguanded. Saad täpselt määrata, mis tüüpi tegevused tekitavad märguandeid, kasutates peale teadaannete sisse lülitamist üleval olevat nuppu {icon}.",
|
||||
"notifications_permission_banner.title": "Ära jää millestki ilma",
|
||||
|
@ -652,9 +700,11 @@
|
|||
"status.direct": "Maini privaatselt @{name}",
|
||||
"status.direct_indicator": "Privaatne mainimine",
|
||||
"status.edit": "Muuda",
|
||||
"status.edited": "Viimati muudetud {date}",
|
||||
"status.edited_x_times": "Muudetud {count, plural, one{{count} kord} other {{count} korda}}",
|
||||
"status.embed": "Manustamine",
|
||||
"status.favourite": "Lemmik",
|
||||
"status.favourites": "{count, plural, one {lemmik} other {lemmikud}}",
|
||||
"status.filter": "Filtreeri seda postitust",
|
||||
"status.filtered": "Filtreeritud",
|
||||
"status.hide": "Peida postitus",
|
||||
|
@ -675,6 +725,7 @@
|
|||
"status.reblog": "Jaga",
|
||||
"status.reblog_private": "Jaga algse nähtavusega",
|
||||
"status.reblogged_by": "{name} jagas",
|
||||
"status.reblogs": "{count, plural, one {jagamine} other {jagamist}}",
|
||||
"status.reblogs.empty": "Keegi pole seda postitust veel jaganud. Kui keegi seda teeb, näeb seda siin.",
|
||||
"status.redraft": "Kustuta & alga uuesti",
|
||||
"status.remove_bookmark": "Eemalda järjehoidja",
|
||||
|
|
|
@ -148,7 +148,7 @@
|
|||
"compose.published.open": "Ireki",
|
||||
"compose.saved.body": "Argitalpena gorde da.",
|
||||
"compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
|
||||
"compose_form.encryption_warning": "Mastodoneko bidalketak ez daude muturretik muturrera enkriptatuta. Ez partekatu informazio sentikorrik Mastodonen.",
|
||||
"compose_form.encryption_warning": "Mastodon-go bidalketak ez daude muturretik muturrera enkriptatuta. Ez partekatu informazio sentikorrik Mastodonen.",
|
||||
"compose_form.hashtag_warning": "Tut hau ez da inolako traolatan zerrendatuko, ez baita publikoa. Tut publikoak soilik traolen bitartez bila daitezke.",
|
||||
"compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.",
|
||||
"compose_form.lock_disclaimer.lock": "giltzapetuta",
|
||||
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Hautatu lehendik dagoen kategoria bat edo sortu berria",
|
||||
"filter_modal.select_filter.title": "Iragazi bidalketa hau",
|
||||
"filter_modal.title.status": "Iragazi bidalketa bat",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {aipamen} other {aipamen}}",
|
||||
"filtered_notifications_banner.pending_requests": "Ezagutu {count, plural, =0 {dezakezun inoren} one {dezakezun pertsona baten} other {ditzakezun # pertsonen}} jakinarazpenak",
|
||||
"filtered_notifications_banner.title": "Iragazitako jakinarazpenak",
|
||||
"firehose.all": "Guztiak",
|
||||
|
@ -345,7 +346,7 @@
|
|||
"home.column_settings.show_reblogs": "Erakutsi bultzadak",
|
||||
"home.column_settings.show_replies": "Erakutsi erantzunak",
|
||||
"home.hide_announcements": "Ezkutatu iragarpenak",
|
||||
"home.pending_critical_update.body": "Eguneratu zure Mastodoneko zerbitzaria leheinbailehen!",
|
||||
"home.pending_critical_update.body": "Eguneratu zure Mastodon-go zerbitzaria leheinbailehen!",
|
||||
"home.pending_critical_update.link": "Ikusi eguneraketak",
|
||||
"home.pending_critical_update.title": "Segurtasun eguneraketa kritikoa eskuragarri!",
|
||||
"home.show_announcements": "Erakutsi iragarpenak",
|
||||
|
@ -408,7 +409,7 @@
|
|||
"lightbox.previous": "Aurrekoa",
|
||||
"limited_account_hint.action": "Erakutsi profila hala ere",
|
||||
"limited_account_hint.title": "Profil hau ezkutatu egin dute {domain} zerbitzariko moderatzaileek.",
|
||||
"link_preview.author": "{name}(r)en eskutik",
|
||||
"link_preview.author": "Egilea: {name}",
|
||||
"lists.account.add": "Gehitu zerrendara",
|
||||
"lists.account.remove": "Kendu zerrendatik",
|
||||
"lists.delete": "Ezabatu zerrenda",
|
||||
|
@ -471,7 +472,9 @@
|
|||
"notification.own_poll": "Zure inkesta amaitu da",
|
||||
"notification.poll": "Zuk erantzun duzun inkesta bat bukatu da",
|
||||
"notification.reblog": "{name}(e)k bultzada eman dio zure bidalketari",
|
||||
"notification.severed_relationships": "{name} erabiltzailearekin zenuen erlazioa galdu da",
|
||||
"notification.relationships_severance_event": "{name} erabiltzailearekin galdutako konexioak",
|
||||
"notification.relationships_severance_event.account_suspension": "{from} zerbitzariko administratzaile batek {target} bertan behera utzi du, hau da, ezin izango dituzu jaso hango eguneratzerik edo hangoekin elkarreragin.",
|
||||
"notification.relationships_severance_event.learn_more": "Informazio gehiago",
|
||||
"notification.status": "{name} erabiltzaileak bidalketa egin berri du",
|
||||
"notification.update": "{name} erabiltzaileak bidalketa bat editatu du",
|
||||
"notification_requests.accept": "Onartu",
|
||||
|
@ -484,6 +487,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Izen-emate berriak:",
|
||||
"notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
|
||||
"notifications.column_settings.favourite": "Gogokoak:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Bistaratu kategoria guztiak",
|
||||
"notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra",
|
||||
"notifications.column_settings.follow": "Jarraitzaile berriak:",
|
||||
"notifications.column_settings.follow_request": "Jarraitzeko eskaera berriak:",
|
||||
"notifications.column_settings.mention": "Aipamenak:",
|
||||
|
@ -544,7 +549,7 @@
|
|||
"onboarding.share.message": "{username} naiz #Mastodon-en! Jarrai nazazu hemen: {url}",
|
||||
"onboarding.share.next_steps": "Hurrengo urrats posibleak:",
|
||||
"onboarding.share.title": "Partekatu zure profila",
|
||||
"onboarding.start.lead": "Mastodonen parte zara orain, bakarra eta deszentralizatua den sare-sozialaren plataforma, non zuk, eta ez algoritmo batek, zeure esperientzia pertsonaliza dezakezun. Igaro ezazu muga soziala:",
|
||||
"onboarding.start.lead": "Mastodon-en parte zara orain, bakarra eta deszentralizatua den sare sozialaren plataforma, non zuk, eta ez algoritmo batek, zeure esperientzia pertsonaliza dezakezun. Igaro ezazu muga soziala:",
|
||||
"onboarding.start.skip": "Urrats guztiak saltatu nahi dituzu?",
|
||||
"onboarding.start.title": "Lortu duzu!",
|
||||
"onboarding.steps.follow_people.body": "Zure jarioa zuk pertsonalizatzen duzu. Bete dezagun jende interesgarriaz.",
|
||||
|
@ -558,7 +563,7 @@
|
|||
"onboarding.tips.2fa": "<strong>Bazenekien?</strong> Zure kontua babes dezakezu, bi faktoreko autentifikazioa zure kontuko ezarpenetan ezarriaz. Edozein TOTP aplikaziorekin dabil, ez da telefono-zenbakirik behar!",
|
||||
"onboarding.tips.accounts_from_other_servers": "<strong>Badakizu?</strong> Mastodon deszentralizatua denez, beste zerbitzarietako profilak topatuko dituzu. Eta, hala ere, arazorik gabe jardun dezakezu haiekin! Haien zerbitzaria erabiltzaile-izenaren bigarren erdian dago!",
|
||||
"onboarding.tips.migration": "<strong>Bazenekien?</strong> Uste baduzu {domain} ez dela aukera on bat zuretzako etorkizunari begira, beste Mastodon zerbitzari batera alda zaitezke, zure jarraitzaileak galdu gabe. Zure zerbitzaria propioa ere ostata dezakezu!",
|
||||
"onboarding.tips.verification": "<strong>Bazenekien?</strong> Zure kontua egiazta dezakezu zure webgunean zure Mastodoneko profilaren esteka jarriz, eta profilean webgunea gehituz. Ordainketa edo dokumenturik gabe!",
|
||||
"onboarding.tips.verification": "<strong>Bazenekien?</strong> Zure kontua egiazta dezakezu zure webgunean zure Mastodon-go profilaren esteka jarriz, eta profilean webgunea gehituz. Ordainketa edo dokumenturik gabe!",
|
||||
"password_confirmation.exceeds_maxlength": "Pasahitzaren berrespenak pasahitzaren gehienezko luzera gainditzen du",
|
||||
"password_confirmation.mismatching": "Pasahitzaren berrespena ez dator bat",
|
||||
"picture_in_picture.restore": "Leheneratu",
|
||||
|
@ -588,12 +593,6 @@
|
|||
"refresh": "Berritu",
|
||||
"regeneration_indicator.label": "Kargatzen…",
|
||||
"regeneration_indicator.sublabel": "Zure hasiera-jarioa prestatzen ari da!",
|
||||
"relationship_severance_notification.purged_data": "administratzaileek kendua",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {Erlazio #} other {# erlazio}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Kontua bertan behera utzi da",
|
||||
"relationship_severance_notification.types.domain_block": "Domeinua bertan behera utzi da",
|
||||
"relationship_severance_notification.types.user_domain_block": "Domeinu hau blokeatu duzu",
|
||||
"relationship_severance_notification.view": "Ikusi",
|
||||
"relative_time.days": "{number}e",
|
||||
"relative_time.full.days": "Duela {number, plural, one {egun #} other {# egun}}",
|
||||
"relative_time.full.hours": "Duela {number, plural, one {ordu #} other {# ordu}}",
|
||||
|
|
|
@ -462,6 +462,8 @@
|
|||
"notifications.permission_denied": "آگاهیهای میزکار به دلیل رد کردن درخواست اجازهٔ پیشین مرورگر، در دسترس نیستند",
|
||||
"notifications.permission_denied_alert": "از آنجا که پیش از این اجازهٔ مرورگر رد شده است، آگاهیهای میزکار نمیتوانند به کار بیفتند",
|
||||
"notifications.permission_required": "آگاهیهای میزکار در دسترس نیستند زیرا اجازههای لازم، اعطا نشده.",
|
||||
"notifications.policy.filter_not_followers_title": "کسانی که شما را دنبال میکنند",
|
||||
"notifications.policy.filter_not_following_hint": "",
|
||||
"notifications_permission_banner.enable": "به کار انداختن آگاهیهای میزکار",
|
||||
"notifications_permission_banner.how_to_control": "برای دریافت آگاهیها هنگام باز نبودن ماستودون، آگاهیهای میزکار را به کار بیندازید. پس از به کار افتادنشان میتوانید گونههای دقیق برهمکنشهایی که آگاهیهای میزکار تولید میکنند را از {icon} بالا واپایید.",
|
||||
"notifications_permission_banner.title": "هرگز چیزی را از دست ندهید",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Käytä olemassa olevaa luokkaa tai luo uusi",
|
||||
"filter_modal.select_filter.title": "Suodata tämä julkaisu",
|
||||
"filter_modal.title.status": "Suodata julkaisu",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {maininta} other {mainintaa}}",
|
||||
"filtered_notifications_banner.pending_requests": "Ilmoitukset {count, plural, =0 {ei keltään} one {yhdeltä henkilöltä} other {# henkilöltä}}, jonka saatat tuntea",
|
||||
"filtered_notifications_banner.title": "Suodatetut ilmoitukset",
|
||||
"firehose.all": "Kaikki",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "Äänestyksesi on päättynyt",
|
||||
"notification.poll": "Kysely, johon osallistuit, on päättynyt",
|
||||
"notification.reblog": "{name} tehosti julkaisuasi",
|
||||
"notification.severed_relationships": "Suhteet palvelimeen {name} katkenneet",
|
||||
"notification.relationships_severance_event": "Menetettiin yhteydet palvelimeen {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Palvelimen {from} ylläpitäjä on jäädyttänyt verkkotunnuksen {target}, minkä takia et voi enää vastaanottaa heidän päivityksiään tai olla vuorovaikutuksessa heidän kanssaan.",
|
||||
"notification.relationships_severance_event.domain_block": "Palvelimen {from} ylläpitäjä on estänyt verkkotunnuksen {target}, mukaan lukien {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.",
|
||||
"notification.relationships_severance_event.learn_more": "Lue lisää",
|
||||
"notification.relationships_severance_event.user_domain_block": "Olet estänyt verkkotunnuksen {target}, mikä poisti {followersCount} seuraajistasi ja {followingCount, plural, one {# seuratuistasi} other {# seuratuistasi}}.",
|
||||
"notification.status": "{name} julkaisi juuri",
|
||||
"notification.update": "{name} muokkasi julkaisua",
|
||||
"notification_requests.accept": "Hyväksy",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Uudet rekisteröitymiset:",
|
||||
"notifications.column_settings.alert": "Työpöytäilmoitukset",
|
||||
"notifications.column_settings.favourite": "Suosikit:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Näytä kaikki luokat",
|
||||
"notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki",
|
||||
"notifications.column_settings.follow": "Uudet seuraajat:",
|
||||
"notifications.column_settings.follow_request": "Uudet seuraamispyynnöt:",
|
||||
"notifications.column_settings.mention": "Maininnat:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Päivitä",
|
||||
"regeneration_indicator.label": "Ladataan…",
|
||||
"regeneration_indicator.sublabel": "Kotisyötettäsi valmistellaan!",
|
||||
"relationship_severance_notification.purged_data": "ylläpitäjien tyhjentämä",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# suhde} other {# suhdetta}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Tili on jäädytetty",
|
||||
"relationship_severance_notification.types.domain_block": "Verkkotunnus on jäädytetty",
|
||||
"relationship_severance_notification.types.user_domain_block": "Estit tämän verkkotunnuksen",
|
||||
"relationship_severance_notification.view": "Näytä",
|
||||
"relative_time.days": "{number} pv",
|
||||
"relative_time.full.days": "{number, plural, one {# päivä} other {# päivää}} sitten",
|
||||
"relative_time.full.hours": "{number, plural, one {# tunti} other {# tuntia}} sitten",
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
"admin.dashboard.retention.cohort_size": "Mga bagong tagagamit",
|
||||
"alert.rate_limited.message": "Mangyaring subukan muli pagkatapos ng {retry_time, time, medium}.",
|
||||
"audio.hide": "Itago ang tunog",
|
||||
"block_modal.title": "Harangan ang tagagamit?",
|
||||
"bundle_column_error.error.title": "Naku!",
|
||||
"bundle_column_error.network.body": "Nagkaroon ng kamalian habang sinusubukang i-karga ang pahinang ito. Maaaring dahil ito sa pansamantalang problema ng iyong koneksyon sa internet o ang server na ito.",
|
||||
"bundle_column_error.network.title": "Kamaliang network",
|
||||
|
@ -104,6 +105,7 @@
|
|||
"compose_form.poll.multiple": "Maraming pagpipilian",
|
||||
"compose_form.poll.single": "Piliin ang isa",
|
||||
"compose_form.reply": "Tumugon",
|
||||
"compose_form.spoiler.marked": "Tanggalin ang babala sa nilalaman",
|
||||
"compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman",
|
||||
"confirmation_modal.cancel": "Pagpaliban",
|
||||
"confirmations.block.confirm": "Harangan",
|
||||
|
@ -115,6 +117,7 @@
|
|||
"confirmations.discard_edit_media.confirm": "Ipagpaliban",
|
||||
"confirmations.edit.confirm": "Baguhin",
|
||||
"confirmations.reply.confirm": "Tumugon",
|
||||
"conversation.mark_as_read": "Markahan bilang nabasa na",
|
||||
"copy_icon_button.copied": "Sinipi sa clipboard",
|
||||
"copypaste.copied": "Sinipi",
|
||||
"copypaste.copy_to_clipboard": "I-sipi sa clipboard",
|
||||
|
@ -130,6 +133,10 @@
|
|||
"dismissable_banner.explore_statuses": "Ito ang mga sumisikat na mga post sa iba't ibang bahagi ng social web ngayon. Ang mga mas bagong post na mas marami ang mga pagpapalakas at paborito ay tinataasan ng antas.",
|
||||
"dismissable_banner.explore_tags": "Ito ang mga sumisikat na mga hashtag sa iba't ibang bahagi ng social web ngayon. Ang mga hashtag ginagamit ng mas maraming mga iba't ibang tao ay tinataasan ng antas.",
|
||||
"dismissable_banner.public_timeline": "Ito ang mga pinakamakailang nakapublikong post mula sa mga taong nasa social web na sinusundan ng mga tao sa {domain}.",
|
||||
"domain_block_modal.block": "Harangan ang serbiro",
|
||||
"domain_block_modal.title": "Harangan ang domain?",
|
||||
"domain_block_modal.you_will_lose_followers": "Mabubura ang iyong mga tagasunod mula sa serbirong ito.",
|
||||
"domain_pill.server": "Serbiro",
|
||||
"embed.instructions": "I-embed ang post na ito sa iyong pook-sapot sa pamamagitan ng pagsipi ng kodigo sa ilalim.",
|
||||
"embed.preview": "Ito ang magiging itsura:",
|
||||
"emoji_button.activity": "Aktibidad",
|
||||
|
@ -166,6 +173,8 @@
|
|||
"empty_column.list": "Wala pang laman ang listahang ito. Kapag naglathala ng mga bagong post ang mga miyembro ng listahang ito, makikita iyon dito.",
|
||||
"empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito.",
|
||||
"explore.search_results": "Mga resulta ng paghahanap",
|
||||
"explore.title": "Tuklasin",
|
||||
"explore.trending_links": "Mga balita",
|
||||
"filter_modal.select_filter.search": "Hanapin o gumawa",
|
||||
"firehose.all": "Lahat",
|
||||
"firehose.local": "Itong serbiro",
|
||||
|
@ -180,6 +189,7 @@
|
|||
"generic.saved": "Nakaimbak",
|
||||
"hashtag.column_header.tag_mode.all": "at {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "o {additional}",
|
||||
"home.column_settings.show_replies": "Ipakita ang mga tugon",
|
||||
"home.pending_critical_update.body": "Mangyaring i-update ang iyong serbiro ng Mastodon sa lalong madaling panahon!",
|
||||
"interaction_modal.login.action": "Iuwi mo ako",
|
||||
"interaction_modal.no_account_yet": "Wala sa Mastodon?",
|
||||
|
@ -216,14 +226,21 @@
|
|||
"notification.follow": "Sinundan ka ni {name}",
|
||||
"notification.follow_request": "Hinihiling ni {name} na sundan ka",
|
||||
"notification.mention": "Binanggit ka ni {name}",
|
||||
"notification.relationships_severance_event.learn_more": "Matuto nang higit pa",
|
||||
"notification_requests.accept": "Tanggapin",
|
||||
"notification_requests.notifications_from": "Mga abiso mula kay/sa {name}",
|
||||
"notifications.clear": "Burahin mga abiso",
|
||||
"notifications.column_settings.admin.report": "Mga bagong ulat:",
|
||||
"notifications.column_settings.alert": "Mga abiso sa Desktop",
|
||||
"notifications.column_settings.favourite": "Mga paborito:",
|
||||
"notifications.column_settings.follow": "Mga bagong tagasunod:",
|
||||
"notifications.column_settings.unread_notifications.category": "Hindi Nabasang mga Abiso",
|
||||
"notifications.column_settings.update": "Mga pagbago:",
|
||||
"notifications.filter.all": "Lahat",
|
||||
"notifications.filter.favourites": "Mga paborito",
|
||||
"notifications.mark_as_read": "Markahan lahat ng abiso bilang nabasa na",
|
||||
"notifications.policy.filter_not_followers_title": "Mga taong hindi ka susundan",
|
||||
"notifications.policy.filter_not_following_title": "Mga taong hindi mo sinusundan",
|
||||
"onboarding.action.back": "Ibalik mo ako",
|
||||
"onboarding.actions.back": "Ibalik mo ako",
|
||||
"onboarding.profile.note_hint": "Maaari mong @bangitin ang ibang mga tao o mga #hashtag…",
|
||||
|
@ -236,6 +253,8 @@
|
|||
"privacy.direct.long": "Lahat ng mga binanggit sa post",
|
||||
"privacy.private.long": "Mga tagasunod mo lamang",
|
||||
"privacy.private.short": "Mga tagasunod",
|
||||
"privacy.public.long": "Sinumang nasa loob at labas ng Mastodon",
|
||||
"regeneration_indicator.label": "Kumakarga…",
|
||||
"relative_time.days": "{number}a",
|
||||
"relative_time.full.days": "{number, plural, one {# araw} other {# na araw}} ang nakalipas",
|
||||
"relative_time.full.hours": "{number, plural, one {# oras} other {# na oras}} ang nakalipas",
|
||||
|
@ -261,6 +280,10 @@
|
|||
"report.thanks.title": "Ayaw mo bang makita ito?",
|
||||
"report.thanks.title_actionable": "Salamat sa pag-uulat, titingnan namin ito.",
|
||||
"report_notification.categories.other": "Iba pa",
|
||||
"search.quick_action.open_url": "Buksan ang URL sa Mastodon",
|
||||
"search.search_or_paste": "Maghanap o ilagay ang URL",
|
||||
"search_popout.full_text_search_disabled_message": "Hindi magagamit sa {domain}.",
|
||||
"search_popout.full_text_search_logged_out_message": "Magagamit lamang kapag naka-log in.",
|
||||
"search_results.all": "Lahat",
|
||||
"search_results.see_all": "Ipakita lahat",
|
||||
"server_banner.learn_more": "Matuto nang higit pa",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Brúka ein verandi bólk ella skapa ein nýggjan",
|
||||
"filter_modal.select_filter.title": "Filtrera hendan postin",
|
||||
"filter_modal.title.status": "Filtrera ein post",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {umrøða} other {umrøður}}",
|
||||
"filtered_notifications_banner.pending_requests": "Fráboðanir frá {count, plural, =0 {ongum} one {einum persóni} other {# persónum}}, sum tú kanska kennir",
|
||||
"filtered_notifications_banner.title": "Sáldaðar fráboðanir",
|
||||
"firehose.all": "Allar",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "Tín atkvøðugreiðsla er endað",
|
||||
"notification.poll": "Ein atkvøðugreiðsla, har tú hevur atkvøtt, er endað",
|
||||
"notification.reblog": "{name} lyfti tín post",
|
||||
"notification.severed_relationships": "Tilknýti við {name} avbrotið",
|
||||
"notification.relationships_severance_event": "Mist sambond við {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Ein umsitari frá {from} hevur gjørt {target} óvirkna, sum merkir, at tú ikki kanst móttaka dagføringar ella virka saman við teimum longur.",
|
||||
"notification.relationships_severance_event.domain_block": "Ein umsitari frá {from} hevur blokerað {target}, íroknað {followersCount} av tínum fylgjarum og {followingCount, plural, one {# kontu} other {# kontur}}, sum tú fylgir.",
|
||||
"notification.relationships_severance_event.learn_more": "Lær meira",
|
||||
"notification.relationships_severance_event.user_domain_block": "Tú hevur blokerað {target}, strikað {followersCount} av tínum fylgjarum og {followingCount, plural, one {# kontu} other {# kontur}}, sum tú fylgir.",
|
||||
"notification.status": "{name} hevur júst postað",
|
||||
"notification.update": "{name} rættaði ein post",
|
||||
"notification_requests.accept": "Góðtak",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nýggjar tilmeldingar:",
|
||||
"notifications.column_settings.alert": "Skriviborðsfráboðanir",
|
||||
"notifications.column_settings.favourite": "Dámdir postar:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Vís allar bólkar",
|
||||
"notifications.column_settings.filter_bar.category": "Skjótfilturbjálki",
|
||||
"notifications.column_settings.follow": "Nýggir fylgjarar:",
|
||||
"notifications.column_settings.follow_request": "Nýggjar umbønir um at fylgja:",
|
||||
"notifications.column_settings.mention": "Umrøður:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Endurles",
|
||||
"regeneration_indicator.label": "Innlesur…",
|
||||
"regeneration_indicator.sublabel": "Tín heimarás verður gjørd klár!",
|
||||
"relationship_severance_notification.purged_data": "reinsað av umsitarum",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# tilknýti} other {# tilknýti}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Kontan er ógildað",
|
||||
"relationship_severance_notification.types.domain_block": "Økisnavn er ógildað",
|
||||
"relationship_severance_notification.types.user_domain_block": "Tú hevur forðað hesum økisnavni",
|
||||
"relationship_severance_notification.view": "Vís",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.full.days": "{number, plural, one {# dagur} other {# dagar}} síðani",
|
||||
"relative_time.full.hours": "{number, plural, one {# tími} other {# tímar}} síðani",
|
||||
|
|
|
@ -222,14 +222,14 @@
|
|||
"domain_pill.server": "Serveur",
|
||||
"domain_pill.their_handle": "Son identifiant :",
|
||||
"domain_pill.their_server": "Son foyer numérique, là où tous ses posts résident.",
|
||||
"domain_pill.their_username": "Son identifiant unique sur leur serveur. Il est possible de rencontrer des utilisateurs avec le même nom sur différents serveurs.",
|
||||
"domain_pill.their_username": "Son identifiant unique sur leur serveur. Il est possible de rencontrer des utilisateur·rice·s avec le même nom sur différents serveurs.",
|
||||
"domain_pill.username": "Nom d’utilisateur",
|
||||
"domain_pill.whats_in_a_handle": "Qu'est-ce qu'un identifiant ?",
|
||||
"domain_pill.who_they_are": "Comme un identifiant contient le nom et le service hébergeant une personne, vous pouvez interagir sur <button>les plateformes sociales implémentant ActivityPub</button>.",
|
||||
"domain_pill.who_you_are": "Comme un identifiant indique votre nom et le service vous hébergeant, vous pouvez interagir avec <button>les autres plateformes sociales implémentant ActivityPub</button>.",
|
||||
"domain_pill.your_handle": "Votre identifiant :",
|
||||
"domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.",
|
||||
"domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de trouver des utilisateurs ayant le même nom d'utilisateur sur différents serveurs.",
|
||||
"domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de rencontrer des utilisateur·rice·s ayant le même nom d'utilisateur sur différents serveurs.",
|
||||
"embed.instructions": "Intégrez cette publication à votre site en copiant le code ci-dessous.",
|
||||
"embed.preview": "Voici comment il apparaîtra:",
|
||||
"emoji_button.activity": "Activité",
|
||||
|
@ -471,7 +471,11 @@
|
|||
"notification.own_poll": "Votre sondage est terminé",
|
||||
"notification.poll": "Un sondage auquel vous avez participé est terminé",
|
||||
"notification.reblog": "{name} a boosté votre message",
|
||||
"notification.severed_relationships": "Relation avec {name} rompues",
|
||||
"notification.relationships_severance_event": "Connexions perdues avec {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Un·e administrateur·rice de {from} a suspendu {target}, ce qui signifie que vous ne pourrez plus recevoir de mises à jour ou interagir avec lui.",
|
||||
"notification.relationships_severance_event.domain_block": "Un·e administrateur·rice de {from} en a bloqué {target}, comprenant {followersCount} de vos abonné·e·s et {followingCount, plural, one {# compte} other {# comptes}} vous suivez.",
|
||||
"notification.relationships_severance_event.learn_more": "En savoir plus",
|
||||
"notification.relationships_severance_event.user_domain_block": "Vous avez bloqué {target}, en supprimant {followersCount} de vos abonnés et {followingCount, plural, one {# compte} other {# comptes}} que vous suivez.",
|
||||
"notification.status": "{name} vient de publier",
|
||||
"notification.update": "{name} a modifié une publication",
|
||||
"notification_requests.accept": "Accepter",
|
||||
|
@ -484,6 +488,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions:",
|
||||
"notifications.column_settings.alert": "Notifications navigateur",
|
||||
"notifications.column_settings.favourite": "Favoris:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
|
||||
"notifications.column_settings.filter_bar.category": "Barre de filtre rapide",
|
||||
"notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e⋅s:",
|
||||
"notifications.column_settings.follow_request": "Nouvelles demandes d’abonnement:",
|
||||
"notifications.column_settings.mention": "Mentions:",
|
||||
|
@ -588,12 +594,6 @@
|
|||
"refresh": "Actualiser",
|
||||
"regeneration_indicator.label": "Chargement…",
|
||||
"regeneration_indicator.sublabel": "Votre fil d'accueil est en cours de préparation!",
|
||||
"relationship_severance_notification.purged_data": "supprimées par les administrateurs",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# relation} other {# relations}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Le compte a été suspendu",
|
||||
"relationship_severance_notification.types.domain_block": "Le domaine a été suspendu",
|
||||
"relationship_severance_notification.types.user_domain_block": "Vous avez bloqué ce domaine",
|
||||
"relationship_severance_notification.view": "Afficher",
|
||||
"relative_time.days": "{number} j",
|
||||
"relative_time.full.days": "il y a {number, plural, one {# jour} other {# jours}}",
|
||||
"relative_time.full.hours": "il y a {number, plural, one {# heure} other {# heures}}",
|
||||
|
|
|
@ -222,14 +222,14 @@
|
|||
"domain_pill.server": "Serveur",
|
||||
"domain_pill.their_handle": "Son identifiant :",
|
||||
"domain_pill.their_server": "Son foyer numérique, là où tous ses posts résident.",
|
||||
"domain_pill.their_username": "Son identifiant unique sur leur serveur. Il est possible de rencontrer des utilisateurs avec le même nom sur différents serveurs.",
|
||||
"domain_pill.their_username": "Son identifiant unique sur leur serveur. Il est possible de rencontrer des utilisateur·rice·s avec le même nom sur différents serveurs.",
|
||||
"domain_pill.username": "Nom d’utilisateur",
|
||||
"domain_pill.whats_in_a_handle": "Qu'est-ce qu'un identifiant ?",
|
||||
"domain_pill.who_they_are": "Comme un identifiant contient le nom et le service hébergeant une personne, vous pouvez interagir sur <button>les plateformes sociales implémentant ActivityPub</button>.",
|
||||
"domain_pill.who_you_are": "Comme un identifiant indique votre nom et le service vous hébergeant, vous pouvez interagir avec <button>les autres plateformes sociales implémentant ActivityPub</button>.",
|
||||
"domain_pill.your_handle": "Votre identifiant :",
|
||||
"domain_pill.your_server": "Votre foyer numérique, là où vos messages résident. Vous souhaitez changer ? Lancez un transfert vers un autre serveur quand vous le voulez et vos abonné·e·s suivront automatiquement.",
|
||||
"domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de trouver des utilisateurs ayant le même nom d'utilisateur sur différents serveurs.",
|
||||
"domain_pill.your_username": "Votre identifiant unique sur ce serveur. Il est possible de rencontrer des utilisateur·rice·s ayant le même nom d'utilisateur sur différents serveurs.",
|
||||
"embed.instructions": "Intégrez ce message à votre site en copiant le code ci-dessous.",
|
||||
"embed.preview": "Il apparaîtra comme cela :",
|
||||
"emoji_button.activity": "Activités",
|
||||
|
@ -471,7 +471,11 @@
|
|||
"notification.own_poll": "Votre sondage est terminé",
|
||||
"notification.poll": "Un sondage auquel vous avez participé vient de se terminer",
|
||||
"notification.reblog": "{name} a partagé votre message",
|
||||
"notification.severed_relationships": "Relation avec {name} rompues",
|
||||
"notification.relationships_severance_event": "Connexions perdues avec {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Un·e administrateur·rice de {from} a suspendu {target}, ce qui signifie que vous ne pourrez plus recevoir de mises à jour ou interagir avec lui.",
|
||||
"notification.relationships_severance_event.domain_block": "Un·e administrateur·rice de {from} en a bloqué {target}, comprenant {followersCount} de vos abonné·e·s et {followingCount, plural, one {# compte} other {# comptes}} vous suivez.",
|
||||
"notification.relationships_severance_event.learn_more": "En savoir plus",
|
||||
"notification.relationships_severance_event.user_domain_block": "Vous avez bloqué {target}, en supprimant {followersCount} de vos abonnés et {followingCount, plural, one {# compte} other {# comptes}} que vous suivez.",
|
||||
"notification.status": "{name} vient de publier",
|
||||
"notification.update": "{name} a modifié un message",
|
||||
"notification_requests.accept": "Accepter",
|
||||
|
@ -484,6 +488,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nouvelles inscriptions :",
|
||||
"notifications.column_settings.alert": "Notifications du navigateur",
|
||||
"notifications.column_settings.favourite": "Favoris :",
|
||||
"notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
|
||||
"notifications.column_settings.filter_bar.category": "Barre de filtre rapide",
|
||||
"notifications.column_settings.follow": "Nouveaux·elles abonné·e·s :",
|
||||
"notifications.column_settings.follow_request": "Nouvelles demandes d’abonnement :",
|
||||
"notifications.column_settings.mention": "Mentions :",
|
||||
|
@ -527,7 +533,7 @@
|
|||
"onboarding.actions.go_to_home": "Allers vers mon flux principal",
|
||||
"onboarding.compose.template": "Bonjour #Mastodon !",
|
||||
"onboarding.follows.empty": "Malheureusement, aucun résultat ne peut être affiché pour le moment. Vous pouvez essayer d'utiliser la recherche ou parcourir la page de découverte pour trouver des personnes à suivre, ou réessayez plus tard.",
|
||||
"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": "Votre flux principal est le principal moyen de découvrir Mastodon. Plus vous suivez de personnes, plus il sera actif et intéressant. Pour commencer, voici quelques suggestions :",
|
||||
"onboarding.follows.title": "Personnaliser votre flux principal",
|
||||
"onboarding.profile.discoverable": "Rendre mon profil découvrable",
|
||||
"onboarding.profile.discoverable_hint": "Lorsque vous acceptez d'être découvert sur Mastodon, vos messages peuvent apparaître dans les résultats de recherche et les tendances, et votre profil peut être suggéré à des personnes ayant des intérêts similaires aux vôtres.",
|
||||
|
@ -588,12 +594,6 @@
|
|||
"refresh": "Actualiser",
|
||||
"regeneration_indicator.label": "Chargement…",
|
||||
"regeneration_indicator.sublabel": "Votre fil principal est en cours de préparation !",
|
||||
"relationship_severance_notification.purged_data": "supprimées par les administrateurs",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# relation} other {# relations}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Le compte a été suspendu",
|
||||
"relationship_severance_notification.types.domain_block": "Le domaine a été suspendu",
|
||||
"relationship_severance_notification.types.user_domain_block": "Vous avez bloqué ce domaine",
|
||||
"relationship_severance_notification.view": "Afficher",
|
||||
"relative_time.days": "{number} j",
|
||||
"relative_time.full.days": "il y a {number, plural, one {# jour} other {# jours}}",
|
||||
"relative_time.full.hours": "il y a {number, plural, one {# heure} other {# heures}}",
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
"about.rules": "Serverrigels",
|
||||
"account.account_note_header": "Opmerking",
|
||||
"account.add_or_remove_from_list": "Tafoegje oan of fuortsmite út listen",
|
||||
"account.badges.bot": "Bot",
|
||||
"account.badges.bot": "Automatisearre",
|
||||
"account.badges.group": "Groep",
|
||||
"account.block": "@{name} blokkearje",
|
||||
"account.block_domain": "Domein {domain} blokkearje",
|
||||
|
@ -89,6 +89,11 @@
|
|||
"announcement.announcement": "Oankundiging",
|
||||
"attachments_list.unprocessed": "(net ferwurke)",
|
||||
"audio.hide": "Audio ferstopje",
|
||||
"block_modal.show_less": "Minder toane",
|
||||
"block_modal.show_more": "Mear toane",
|
||||
"block_modal.they_cant_mention": "Sy kinne jo net fermelde of folgje.",
|
||||
"block_modal.title": "Brûker blokkearje?",
|
||||
"block_modal.you_wont_see_mentions": "Jo sjogge gjin berjochten mear dy’t dizze account fermelde.",
|
||||
"boost_modal.combo": "Jo kinne op {combo} drukke om dit de folgjende kear oer te slaan",
|
||||
"bundle_column_error.copy_stacktrace": "Flaterrapport kopiearje",
|
||||
"bundle_column_error.error.body": "De opfrege side koe net werjûn wurde. It kin wêze troch in flater yn ús koade, of in probleem mei browserkompatibiliteit.",
|
||||
|
@ -169,6 +174,7 @@
|
|||
"confirmations.delete_list.message": "Binne jo wis dat jo dizze list foar permanint fuortsmite wolle?",
|
||||
"confirmations.discard_edit_media.confirm": "Fuortsmite",
|
||||
"confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?",
|
||||
"confirmations.domain_block.confirm": "Server blokkearje",
|
||||
"confirmations.domain_block.message": "Binne jo echt wis dat jo alles fan {domain} negearje wolle? Yn de measte gefallen is it blokkearjen of negearjen fan in pear spesifike persoanen genôch en better. Jo sille gjin berjochten fan dizze server op iepenbiere tiidlinen sjen of yn jo meldingen. Jo folgers fan dizze server wurde fuortsmiten.",
|
||||
"confirmations.edit.confirm": "Bewurkje",
|
||||
"confirmations.edit.message": "Troch no te bewurkjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
|
||||
|
@ -200,6 +206,20 @@
|
|||
"dismissable_banner.explore_statuses": "Dizze berjochten winne oan populariteit op dizze en oare servers binnen it desintrale netwurk. Nijere berjochten mei mear boosts en favoriten stean heger.",
|
||||
"dismissable_banner.explore_tags": "Dizze hashtags winne oan populariteit op dizze en oare servers binnen it desintrale netwurk.",
|
||||
"dismissable_banner.public_timeline": "Dit binne de meast resinte iepenbiere berjochten fan accounts op it sosjale web dy’t troch minsken op {domain} folge wurde.",
|
||||
"domain_block_modal.block": "Server blokkearje",
|
||||
"domain_block_modal.block_account_instead": "Yn stee hjirfan {name} blokkearje",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Minsken op dizze server kinne ynteraksje hawwe mei jo âlde berjochten.",
|
||||
"domain_block_modal.they_cant_follow": "Net ien op dizze server kin jo folgje.",
|
||||
"domain_block_modal.they_wont_know": "Se krije net te witten dat se blokkearre wurde.",
|
||||
"domain_block_modal.title": "Domein blokkearje?",
|
||||
"domain_block_modal.you_will_lose_followers": "Al jo folgers fan dizze server wurde ûntfolge.",
|
||||
"domain_block_modal.you_wont_see_posts": "Jo sjogge gjin berjochten of meldingen mear fan brûkers op dizze server.",
|
||||
"domain_pill.server": "Server",
|
||||
"domain_pill.their_handle": "Harren fediverse-adres:",
|
||||
"domain_pill.their_server": "Harren digitale thús, wer’t al harren berjochten binne.",
|
||||
"domain_pill.username": "Brûkersnamme",
|
||||
"domain_pill.whats_in_a_handle": "Wat is in fediverse-adres?",
|
||||
"domain_pill.your_handle": "Jo fediverse-adres:",
|
||||
"embed.instructions": "Embed this status on your website by copying the code below.",
|
||||
"embed.preview": "Sa komt it der út te sjen:",
|
||||
"emoji_button.activity": "Aktiviteiten",
|
||||
|
@ -266,6 +286,7 @@
|
|||
"filter_modal.select_filter.subtitle": "In besteande kategory brûke of in nije oanmeitsje",
|
||||
"filter_modal.select_filter.title": "Dit berjocht filterje",
|
||||
"filter_modal.title.status": "In berjocht filterje",
|
||||
"filtered_notifications_banner.title": "Filtere meldingen",
|
||||
"firehose.all": "Alles",
|
||||
"firehose.local": "Dizze server",
|
||||
"firehose.remote": "Oare servers",
|
||||
|
@ -394,6 +415,9 @@
|
|||
"loading_indicator.label": "Lade…",
|
||||
"media_gallery.toggle_visible": "{number, plural, one {ôfbylding ferstopje} other {ôfbyldingen ferstopje}}",
|
||||
"moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.",
|
||||
"mute_modal.hide_options": "Opsjes ferstopje",
|
||||
"mute_modal.indefinite": "Oant ik se net mear negearje",
|
||||
"mute_modal.show_options": "Opsjes toane",
|
||||
"navigation_bar.about": "Oer",
|
||||
"navigation_bar.advanced_interface": "Yn avansearre webomjouwing iepenje",
|
||||
"navigation_bar.blocks": "Blokkearre brûkers",
|
||||
|
@ -429,14 +453,20 @@
|
|||
"notification.own_poll": "Jo poll is beëinige",
|
||||
"notification.poll": "In enkête dêr’t jo yn stimd hawwe is beëinige",
|
||||
"notification.reblog": "{name} hat jo berjocht boost",
|
||||
"notification.relationships_severance_event.learn_more": "Mear ynfo",
|
||||
"notification.status": "{name} hat in berjocht pleatst",
|
||||
"notification.update": "{name} hat in berjocht bewurke",
|
||||
"notification_requests.accept": "Akseptearje",
|
||||
"notification_requests.dismiss": "Ofwize",
|
||||
"notification_requests.notifications_from": "Meldingen fan {name}",
|
||||
"notification_requests.title": "Filtere meldingen",
|
||||
"notifications.clear": "Meldingen wiskje",
|
||||
"notifications.clear_confirmation": "Binne jo wis dat jo al jo meldingen permanint fuortsmite wolle?",
|
||||
"notifications.column_settings.admin.report": "Nije rapportaazjes:",
|
||||
"notifications.column_settings.admin.sign_up": "Nije registraasjes:",
|
||||
"notifications.column_settings.alert": "Desktopmeldingen",
|
||||
"notifications.column_settings.favourite": "Favoriten:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Alle kategoryen toane",
|
||||
"notifications.column_settings.follow": "Nije folgers:",
|
||||
"notifications.column_settings.follow_request": "Nij folchfersyk:",
|
||||
"notifications.column_settings.mention": "Fermeldingen:",
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
"about.powered_by": "Lìonra sòisealta sgaoilte le cumhachd {mastodon}",
|
||||
"about.rules": "Riaghailtean an fhrithealaiche",
|
||||
"account.account_note_header": "Nòta",
|
||||
"account.add_or_remove_from_list": "Cuir ris no thoir air falbh o na liostaichean",
|
||||
"account.add_or_remove_from_list": "Cuir ris no thoir air falbh o liostaichean",
|
||||
"account.badges.bot": "Fèin-obrachail",
|
||||
"account.badges.group": "Buidheann",
|
||||
"account.block": "Bac @{name}",
|
||||
|
@ -471,7 +471,11 @@
|
|||
"notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch",
|
||||
"notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch",
|
||||
"notification.reblog": "Bhrosnaich {name} am post agad",
|
||||
"notification.severed_relationships": "Chaidh na dàimhean le {name} a dhealachadh",
|
||||
"notification.relationships_severance_event": "Chaill thu dàimhean le {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Chuir rianaire aig {from} {target} à rèim agus is ciall dha sin nach fhaigh thu naidheachdan uapa ’s nach urrainn dhut conaltradh leotha.",
|
||||
"notification.relationships_severance_event.domain_block": "Bhac rianaire aig {from} {target}, a’ gabhail a-staigh {followersCount} dhen luchd-leantainn agad agus {followingCount, plural, one {# chunntas} two {# chunntas} few {# cunntasan} other {# cunntas}} a tha thu fhèin a’ leantainn.",
|
||||
"notification.relationships_severance_event.learn_more": "Barrachd fiosrachaidh",
|
||||
"notification.relationships_severance_event.user_domain_block": "Bhac thu {target} agus thug sin air falbh {followersCount} dhen luchd-leantainn agad agus {followingCount, plural, one {# chunntas} two {# chunntas} few {# cunntasan} other {# cunntas}} a tha thu fhèin a’ leantainn.",
|
||||
"notification.status": "Phostaich {name} rud",
|
||||
"notification.update": "Dheasaich {name} post",
|
||||
"notification_requests.accept": "Gabh ris",
|
||||
|
@ -484,6 +488,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Clàraidhean ùra:",
|
||||
"notifications.column_settings.alert": "Brathan deasga",
|
||||
"notifications.column_settings.favourite": "Annsachdan:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Seall a h-uile roinn-seòrsa",
|
||||
"notifications.column_settings.filter_bar.category": "Bàr-criathraidh luath",
|
||||
"notifications.column_settings.follow": "Luchd-leantainn ùr:",
|
||||
"notifications.column_settings.follow_request": "Iarrtasan leantainn ùra:",
|
||||
"notifications.column_settings.mention": "Iomraidhean:",
|
||||
|
@ -509,7 +515,7 @@
|
|||
"notifications.permission_denied": "Chan eil brathan deasga ri fhaighinn on a chaidh iarrtas ceadan a’ bhrabhsair a dhiùltadh cheana",
|
||||
"notifications.permission_denied_alert": "Cha ghabh brathan deasga a chur an comas on a chaidh iarrtas ceadan a’ bhrabhsair a dhiùltadh cheana",
|
||||
"notifications.permission_required": "Chan eil brathan deasga ri fhaighinn on nach deach an cead riatanach a thoirt seachad.",
|
||||
"notifications.policy.filter_new_accounts.hint": "Chaidh a chruthachadh o chionn {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}",
|
||||
"notifications.policy.filter_new_accounts.hint": "A chaidh a chruthachadh o chionn {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}}",
|
||||
"notifications.policy.filter_new_accounts_title": "Cunntasan ùra",
|
||||
"notifications.policy.filter_not_followers_hint": "A’ gabhail a-staigh an fheadhainn a lean ort nas lugha na {days, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} seo chaidh",
|
||||
"notifications.policy.filter_not_followers_title": "Daoine nach eil gad leantainn",
|
||||
|
@ -588,12 +594,6 @@
|
|||
"refresh": "Ath-nuadhaich",
|
||||
"regeneration_indicator.label": "’Ga luchdadh…",
|
||||
"regeneration_indicator.sublabel": "Tha do dhachaigh ’ga ullachadh!",
|
||||
"relationship_severance_notification.purged_data": "chaidh a phurgaideachadh leis na rianairean",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# dàimh} two {# dhàimh} few {# dàimhean} other {# dàimh}}",
|
||||
"relationship_severance_notification.types.account_suspension": "Chaidh cunntas a chur à rèim",
|
||||
"relationship_severance_notification.types.domain_block": "Chaidh àrainn a chur à rèim",
|
||||
"relationship_severance_notification.types.user_domain_block": "Bhac thu an àrainn seo",
|
||||
"relationship_severance_notification.view": "Seall",
|
||||
"relative_time.days": "{number}l",
|
||||
"relative_time.full.days": "{number, plural, one {# latha} two {# latha} few {# làithean} other {# latha}} air ais",
|
||||
"relative_time.full.hours": "{number, plural, one {# uair a thìde} two {# uair a thìde} few {# uairean a thìde} other {# uair a thìde}} air ais",
|
||||
|
@ -701,10 +701,10 @@
|
|||
"status.direct_indicator": "Iomradh prìobhaideach",
|
||||
"status.edit": "Deasaich",
|
||||
"status.edited": "An deasachadh mu dheireadh {date}",
|
||||
"status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{counter} turas} two {{counter} thuras} few {{counter} tursan} other {{counter} turas}}",
|
||||
"status.edited_x_times": "Chaidh a dheasachadh {count, plural, one {{count} turas} two {{count} thuras} few {{count} tursan} other {{count} turas}}",
|
||||
"status.embed": "Leabaich",
|
||||
"status.favourite": "Cuir ris na h-annsachdan",
|
||||
"status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}",
|
||||
"status.favourites": "{count, plural, one {annsachd} two {annsachd} few {annsachdan} other {annsachd}}",
|
||||
"status.filter": "Criathraich am post seo",
|
||||
"status.filtered": "Criathraichte",
|
||||
"status.hide": "Falaich am post",
|
||||
|
@ -725,7 +725,7 @@
|
|||
"status.reblog": "Brosnaich",
|
||||
"status.reblog_private": "Brosnaich leis an t-so-fhaicsinneachd tùsail",
|
||||
"status.reblogged_by": "’Ga bhrosnachadh le {name}",
|
||||
"status.reblogs": "{count, plural, one {bhrosnachadh} two {bhrosnachadh} few {brosnachaidhean} other {brosnachadh}",
|
||||
"status.reblogs": "{count, plural, one {bhrosnachadh} two {bhrosnachadh} few {brosnachaidhean} other {brosnachadh}}",
|
||||
"status.reblogs.empty": "Chan deach am post seo a bhrosnachadh le duine sam bith fhathast. Nuair a bhrosnaicheas cuideigin e, nochdaidh iad an-seo.",
|
||||
"status.redraft": "Sguab às ⁊ dèan dreachd ùr",
|
||||
"status.remove_bookmark": "Thoir an comharra-lìn air falbh",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar unha categoría existente ou crear unha nova",
|
||||
"filter_modal.select_filter.title": "Filtrar esta publicación",
|
||||
"filter_modal.title.status": "Filtrar unha publicación",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {mención} other {mencións}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notificacións de {count, plural, =0 {ninguén} one {unha persoa} other {# persoas}} que poderías coñecer",
|
||||
"filtered_notifications_banner.title": "Notificacións filtradas",
|
||||
"firehose.all": "Todo",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "A túa enquisa rematou",
|
||||
"notification.poll": "Rematou a enquisa na que votaches",
|
||||
"notification.reblog": "{name} compartiu a túa publicación",
|
||||
"notification.severed_relationships": "Cortouse a relación con {name}",
|
||||
"notification.relationships_severance_event": "Perdeuse a conexión con {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "A administración de {from} suspendeu a {target}, o que significa que xa non vas recibir actualizacións de esa conta ou interactuar con ela.",
|
||||
"notification.relationships_severance_event.domain_block": "A administración de {from} bloqueou a {target}, que inclúe a {followersCount} das túas seguidoras e a {followingCount, plural, one {# conta} other {# contas}} que sigues.",
|
||||
"notification.relationships_severance_event.learn_more": "Saber máis",
|
||||
"notification.relationships_severance_event.user_domain_block": "Bloqueaches a {target}, eliminando a {followersCount} das túas seguidoras e a {followingCount, plural, one {# conta} other {# contas}} que sigues.",
|
||||
"notification.status": "{name} publicou",
|
||||
"notification.update": "{name} editou unha publicación",
|
||||
"notification_requests.accept": "Aceptar",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Novas usuarias:",
|
||||
"notifications.column_settings.alert": "Notificacións de escritorio",
|
||||
"notifications.column_settings.favourite": "Favoritas:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorías",
|
||||
"notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
|
||||
"notifications.column_settings.follow": "Novas seguidoras:",
|
||||
"notifications.column_settings.follow_request": "Novas peticións de seguimento:",
|
||||
"notifications.column_settings.mention": "Mencións:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Actualizar",
|
||||
"regeneration_indicator.label": "Estase a cargar…",
|
||||
"regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!",
|
||||
"relationship_severance_notification.purged_data": "purgada pola administración",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# relación} other {# relacións}}",
|
||||
"relationship_severance_notification.types.account_suspension": "A conta foi suspendida",
|
||||
"relationship_severance_notification.types.domain_block": "O dominio foi suspendido",
|
||||
"relationship_severance_notification.types.user_domain_block": "Bloqueaches este dominio",
|
||||
"relationship_severance_notification.view": "Ver",
|
||||
"relative_time.days": "{number}d",
|
||||
"relative_time.full.days": "hai {number, plural, one {# día} other {# días}}",
|
||||
"relative_time.full.hours": "hai {number, plural, one {# hora} other {# horas}}",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "שימוש בקטגורייה קיימת או יצירת אחת חדשה",
|
||||
"filter_modal.select_filter.title": "סינון ההודעה הזו",
|
||||
"filter_modal.title.status": "סנן הודעה",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {איזכור} other {איזכורים} two {איזכוריים}}",
|
||||
"filtered_notifications_banner.pending_requests": "{count, plural,=0 {אין התראות ממשתמשים ה}one {התראה אחת ממישהו/מישהי ה}two {יש התראותיים ממשתמשים }other {יש # התראות ממשתמשים }}מוכרים לך",
|
||||
"filtered_notifications_banner.title": "התראות מסוננות",
|
||||
"firehose.all": "הכל",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "הסקר שלך הסתיים",
|
||||
"notification.poll": "סקר שהצבעת בו הסתיים",
|
||||
"notification.reblog": "הודעתך הודהדה על ידי {name}",
|
||||
"notification.severed_relationships": "חתכתם כל קשר עם {name}",
|
||||
"notification.relationships_severance_event": "אבד הקשר עם {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "מנהל.ת משרת {from} השע(ת)ה את {target}, ולפיכך לא תעודכנו יותר על ידם ולא תוכלו להיות איתם בקשר.",
|
||||
"notification.relationships_severance_event.domain_block": "מנהל.ת מאתר {from} חסמו את {target} ובכלל זה {followersCount} מעוקביך וגם {followingCount, plural, one {חשבון אחד} two {שני חשבונות} many {# חשבונות} other {# חשבונות}} מבין נעקביך.",
|
||||
"notification.relationships_severance_event.learn_more": "למידע נוסף",
|
||||
"notification.relationships_severance_event.user_domain_block": "חסמת את {target} ובכלל זה {followersCount} מעוקביך וגם {followingCount, plural, one {חשבון אחד} two {שני חשבונות} many {# חשבונות} other {# חשבונות}} מבין נעקביך.",
|
||||
"notification.status": "{name} הרגע פרסמו",
|
||||
"notification.update": "{name} ערכו הודעה",
|
||||
"notification_requests.accept": "לקבל",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "הרשמות חדשות:",
|
||||
"notifications.column_settings.alert": "התראות לשולחן העבודה",
|
||||
"notifications.column_settings.favourite": "חיבובים:",
|
||||
"notifications.column_settings.filter_bar.advanced": "להציג את כל הקטגוריות",
|
||||
"notifications.column_settings.filter_bar.category": "שורת סינון מהיר",
|
||||
"notifications.column_settings.follow": "עוקבים חדשים:",
|
||||
"notifications.column_settings.follow_request": "בקשות מעקב חדשות:",
|
||||
"notifications.column_settings.mention": "פניות:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "רענון",
|
||||
"regeneration_indicator.label": "טוען…",
|
||||
"regeneration_indicator.sublabel": "פיד הבית שלך בהכנה!",
|
||||
"relationship_severance_notification.purged_data": "המידע נמחק על ידי ההנהלה",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {קשר אחד} other {# קשרים}}",
|
||||
"relationship_severance_notification.types.account_suspension": "החשבון הושעה",
|
||||
"relationship_severance_notification.types.domain_block": "השרת הושעה",
|
||||
"relationship_severance_notification.types.user_domain_block": "חסמת שרת זה",
|
||||
"relationship_severance_notification.view": "הצג",
|
||||
"relative_time.days": "{number} ימים",
|
||||
"relative_time.full.days": "לפני {number, plural, one {# יום} other {# ימים}}",
|
||||
"relative_time.full.hours": "לפני {number, plural, one {# שעה} other {# שעות}}",
|
||||
|
|
|
@ -124,7 +124,7 @@
|
|||
"column.domain_blocks": "Letiltott domainek",
|
||||
"column.favourites": "Kedvencek",
|
||||
"column.firehose": "Hírfolyamok",
|
||||
"column.follow_requests": "Követési kérelmek",
|
||||
"column.follow_requests": "Követési kérések",
|
||||
"column.home": "Kezdőlap",
|
||||
"column.lists": "Listák",
|
||||
"column.mutes": "Némított felhasználók",
|
||||
|
@ -133,8 +133,8 @@
|
|||
"column.public": "Föderációs idővonal",
|
||||
"column_back_button.label": "Vissza",
|
||||
"column_header.hide_settings": "Beállítások elrejtése",
|
||||
"column_header.moveLeft_settings": "Oszlop elmozdítása balra",
|
||||
"column_header.moveRight_settings": "Oszlop elmozdítása jobbra",
|
||||
"column_header.moveLeft_settings": "Oszlop áthelyezése balra",
|
||||
"column_header.moveRight_settings": "Oszlop áthelyezése jobbra",
|
||||
"column_header.pin": "Kitűzés",
|
||||
"column_header.show_settings": "Beállítások megjelenítése",
|
||||
"column_header.unpin": "Kitűzés eltávolítása",
|
||||
|
@ -143,7 +143,7 @@
|
|||
"community.column_settings.media_only": "Csak média",
|
||||
"community.column_settings.remote_only": "Csak távoli",
|
||||
"compose.language.change": "Nyelv megváltoztatása",
|
||||
"compose.language.search": "Nyelv keresése...",
|
||||
"compose.language.search": "Nyelvek keresése…",
|
||||
"compose.published.body": "A bejegyzés publikálásra került.",
|
||||
"compose.published.open": "Megnyitás",
|
||||
"compose.saved.body": "A bejegyzés mentve.",
|
||||
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Válassz egy meglévő kategóriát, vagy hozz létre egy újat",
|
||||
"filter_modal.select_filter.title": "E bejegyzés szűrése",
|
||||
"filter_modal.title.status": "Egy bejegyzés szűrése",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {említés} other {említés}}",
|
||||
"filtered_notifications_banner.pending_requests": "Értesítések {count, plural, =0 {nincsenek} one {egy valósztínűleg ismerős személytől} other {# valószínűleg ismerős személytől}}",
|
||||
"filtered_notifications_banner.title": "Szűrt értesítések",
|
||||
"firehose.all": "Összes",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "A szavazásod véget ért",
|
||||
"notification.poll": "Egy szavazás, melyben részt vettél, véget ért",
|
||||
"notification.reblog": "{name} megtolta a bejegyzésedet",
|
||||
"notification.severed_relationships": "A kapcsolatok megszakítva ezzel: {name}",
|
||||
"notification.relationships_severance_event": "Elvesztek a kapcsolatok vele: {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Egy admin a(z) {from} kiszolgálóról felfüggesztette {target} fiókját, ami azt jelenti, hogy mostantól nem fogsz róla értesítést kapni, és nem fogsz tudni vele kapcsolatba lépni.",
|
||||
"notification.relationships_severance_event.domain_block": "Egy admin a(z) {from} kiszolgálón letiltotta {target} domaint, beleértve {followersCount} követőt és {followingCount, plural, one {#} other {#}} követett fiókot.",
|
||||
"notification.relationships_severance_event.learn_more": "További információk",
|
||||
"notification.relationships_severance_event.user_domain_block": "Letiltottad a(z) {target} domaint, ezzel eltávolítva {followersCount} követőt és {followingCount, plural, one {#} other {#}} követett fiókot.",
|
||||
"notification.status": "{name} bejegyzést tett közzé",
|
||||
"notification.update": "{name} szerkesztett egy bejegyzést",
|
||||
"notification_requests.accept": "Elfogadás",
|
||||
|
@ -484,8 +489,10 @@
|
|||
"notifications.column_settings.admin.sign_up": "Új regisztrálók:",
|
||||
"notifications.column_settings.alert": "Asztali értesítések",
|
||||
"notifications.column_settings.favourite": "Kedvencek:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése",
|
||||
"notifications.column_settings.filter_bar.category": "Gyorsszűrő sáv",
|
||||
"notifications.column_settings.follow": "Új követők:",
|
||||
"notifications.column_settings.follow_request": "Új követési kérelmek:",
|
||||
"notifications.column_settings.follow_request": "Új követési kérések:",
|
||||
"notifications.column_settings.mention": "Megemlítések:",
|
||||
"notifications.column_settings.poll": "Szavazási eredmények:",
|
||||
"notifications.column_settings.push": "Leküldéses értesítések",
|
||||
|
@ -545,14 +552,14 @@
|
|||
"onboarding.share.next_steps": "Lehetséges következő lépések:",
|
||||
"onboarding.share.title": "Profil megosztása",
|
||||
"onboarding.start.lead": "Az új Mastodon-fiók használatra kész. Így hozhatod ki belőle a legtöbbet:",
|
||||
"onboarding.start.skip": "Szeretnél előreugrani?",
|
||||
"onboarding.start.skip": "Nincs szükséged segítségre a kezdéshez?",
|
||||
"onboarding.start.title": "Ez sikerült!",
|
||||
"onboarding.steps.follow_people.body": "A Mastodon az érdekes emberek követéséről szól.",
|
||||
"onboarding.steps.follow_people.title": "{count, plural, one {egy ember} other {# ember}} követése",
|
||||
"onboarding.steps.publish_status.body": "Üdvözöljük a világot.",
|
||||
"onboarding.steps.follow_people.title": "Szabd személyre a kezdőlapodat",
|
||||
"onboarding.steps.publish_status.body": "Köszöntsd a világot szöveggel, fotókkal, videókkal vagy szavazásokkal {emoji}",
|
||||
"onboarding.steps.publish_status.title": "Az első bejegyzés létrehozása",
|
||||
"onboarding.steps.setup_profile.body": "Mások nagyobb valószínűséggel lépnek kapcsolatba veled egy kitöltött profil esetén.",
|
||||
"onboarding.steps.setup_profile.title": "Profilod testreszabása",
|
||||
"onboarding.steps.setup_profile.body": "Növeld az interakciók számát a profilod részletesebb kitöltésével.",
|
||||
"onboarding.steps.setup_profile.title": "Szabd személyre a profilodat",
|
||||
"onboarding.steps.share_profile.body": "Tudasd az ismerőseiddel, hogyan találhatnak meg a Mastodonon",
|
||||
"onboarding.steps.share_profile.title": "Oszd meg a Mastodon profilodat",
|
||||
"onboarding.tips.2fa": "<strong>Tudtad?</strong> A fiókod biztonságossá teheted, ha a fiók beállításaiban beállítod a kétlépcsős hitelesítést. Bármilyen választott TOTP alkalmazással működik, nincs szükség telefonszámra!",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Frissítés",
|
||||
"regeneration_indicator.label": "Betöltés…",
|
||||
"regeneration_indicator.sublabel": "A saját idővonalad épp készül!",
|
||||
"relationship_severance_notification.purged_data": "rendszergazdák által véglegesen törölve",
|
||||
"relationship_severance_notification.relationships": "{count, plural, one {# kapcsolat} other {# kapcsolat}}",
|
||||
"relationship_severance_notification.types.account_suspension": "A fiók fel van függesztve",
|
||||
"relationship_severance_notification.types.domain_block": "A domain fel van függesztve",
|
||||
"relationship_severance_notification.types.user_domain_block": "Blokkoltad ezt a domaint",
|
||||
"relationship_severance_notification.view": "Megtekintés",
|
||||
"relative_time.days": "{number}n",
|
||||
"relative_time.full.days": "{number, plural, one {# napja} other {# napja}}",
|
||||
"relative_time.full.hours": "{number, plural, one {# órája} other {# órája}}",
|
||||
|
@ -786,9 +787,9 @@
|
|||
"upload_modal.hint": "Kattints vagy húzd a kört az előnézetben arra a fókuszpontra, mely minden bélyegképen látható kell, hogy legyen.",
|
||||
"upload_modal.preparing_ocr": "OCR előkészítése…",
|
||||
"upload_modal.preview_label": "Előnézet ({ratio})",
|
||||
"upload_progress.label": "Feltöltés...",
|
||||
"upload_progress.label": "Feltöltés…",
|
||||
"upload_progress.processing": "Feldolgozás…",
|
||||
"username.taken": "Ez a felhasználónév foglalt. Válassz másikat",
|
||||
"username.taken": "Ez a felhasználónév foglalt. Válassz másikat.",
|
||||
"video.close": "Videó bezárása",
|
||||
"video.download": "Fájl letöltése",
|
||||
"video.exit_fullscreen": "Kilépés teljes képernyőből",
|
||||
|
@ -798,5 +799,5 @@
|
|||
"video.mute": "Hang némítása",
|
||||
"video.pause": "Szünet",
|
||||
"video.play": "Lejátszás",
|
||||
"video.unmute": "Hang némításának vége"
|
||||
"video.unmute": "Hang némításának feloldása"
|
||||
}
|
||||
|
|
|
@ -3,47 +3,51 @@
|
|||
"about.contact": "Contacto:",
|
||||
"about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.",
|
||||
"about.domain_blocks.no_reason_available": "Ration non disponibile",
|
||||
"about.domain_blocks.preamble": "Mastodon generalmente permitte vider contento ab e interacter con usatores ab ulle altere servitor in le fediverso. Iste es le exceptiones que ha essite facite in iste servitor particular.",
|
||||
"about.domain_blocks.silenced.explanation": "Generalmente non videras perfiles e contento de iste servitor, a minus que tu expressemente lo cerca o opta pro lo per sequer.",
|
||||
"about.domain_blocks.preamble": "Mastodon generalmente permitte vider le contento de, e interager con, usatores de qualcunque altere servitor in le fediverso. Istes es le exceptiones que ha essite facite sur iste servitor particular.",
|
||||
"about.domain_blocks.silenced.explanation": "Generalmente, tu non videra le profilos e le contento de iste servitor, excepte si tu expressemente cerca le contento o seque le profilos.",
|
||||
"about.domain_blocks.silenced.title": "Limitate",
|
||||
"about.domain_blocks.suspended.explanation": "Nulle data de iste servitor essera processate, immagazinate o scambiate, faciente qualcunque interaction o communication con usatores de iste servitor impossibile.",
|
||||
"about.domain_blocks.suspended.explanation": "Nulle datos de iste servitor essera processate, immagazinate o excambiate, rendente omne interaction o communication con usatores de iste servitor impossibile.",
|
||||
"about.domain_blocks.suspended.title": "Suspendite",
|
||||
"about.not_available": "Iste information non faceva disponibile in iste servitor.",
|
||||
"about.not_available": "Iste information non ha essite rendite disponibile sur iste servitor.",
|
||||
"about.powered_by": "Rete social decentralisate, actionate per {mastodon}",
|
||||
"about.rules": "Regulas del servitor",
|
||||
"account.account_note_header": "Nota",
|
||||
"account.add_or_remove_from_list": "Adder o remover ab listas",
|
||||
"account.add_or_remove_from_list": "Adder a, o remover de listas",
|
||||
"account.badges.bot": "Automatisate",
|
||||
"account.badges.group": "Gruppo",
|
||||
"account.block": "Blocar @{name}",
|
||||
"account.block_domain": "Blocar dominio {domain}",
|
||||
"account.block_short": "Blocar",
|
||||
"account.blocked": "Blocate",
|
||||
"account.browse_more_on_origin_server": "Navigar plus sur le profilo original",
|
||||
"account.cancel_follow_request": "Cancellar sequimento",
|
||||
"account.copy": "Copiar ligamine a profilo",
|
||||
"account.direct": "Mentionar privatemente a @{name}",
|
||||
"account.disable_notifications": "Stoppar le notificationes quando @{name} publica",
|
||||
"account.direct": "Mentionar privatemente @{name}",
|
||||
"account.disable_notifications": "Non plus notificar me quando @{name} publica",
|
||||
"account.domain_blocked": "Dominio blocate",
|
||||
"account.edit_profile": "Modificar profilo",
|
||||
"account.enable_notifications": "Notifica me quando @{name} publica",
|
||||
"account.enable_notifications": "Notificar me quando @{name} publica",
|
||||
"account.endorse": "Evidentiar sur le profilo",
|
||||
"account.featured_tags.last_status_at": "Ultime message in {date}",
|
||||
"account.featured_tags.last_status_never": "Necun messages",
|
||||
"account.featured_tags.last_status_at": "Ultime message publicate le {date}",
|
||||
"account.featured_tags.last_status_never": "Necun message",
|
||||
"account.featured_tags.title": "Hashtags eminente de {name}",
|
||||
"account.follow": "Sequer",
|
||||
"account.follow_back": "Sequer etiam",
|
||||
"account.follow_back": "Sequer in retorno",
|
||||
"account.followers": "Sequitores",
|
||||
"account.followers.empty": "Iste usator ancora non ha sequitores.",
|
||||
"account.followers.empty": "Necuno seque ancora iste usator.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} sequitor} other {{counter} sequitores}}",
|
||||
"account.following": "Sequente",
|
||||
"account.follows.empty": "Iste usator ancora non seque nemo.",
|
||||
"account.following_counter": "{count, plural, one {{counter} sequite} other {{counter} sequites}}",
|
||||
"account.follows.empty": "Iste usator non seque ancora alcuno.",
|
||||
"account.go_to_profile": "Vader al profilo",
|
||||
"account.hide_reblogs": "Celar boosts de @{name}",
|
||||
"account.in_memoriam": "In Memoriam.",
|
||||
"account.hide_reblogs": "Celar impulsos de @{name}",
|
||||
"account.in_memoriam": "In memoriam.",
|
||||
"account.languages": "Cambiar le linguas subscribite",
|
||||
"account.link_verified_on": "Le proprietate de iste ligamine esseva verificate le {date}",
|
||||
"account.locked_info": "Le stato de confidentialitate de iste conto es definite a blocate. Le proprietario revisa manualmente qui pote sequer lo.",
|
||||
"account.link_verified_on": "Le proprietate de iste ligamine ha essite verificate le {date}",
|
||||
"account.locked_info": "Le stato de confidentialitate de iste conto es definite como serrate. Le proprietario determina manualmente qui pote sequer le.",
|
||||
"account.media": "Multimedia",
|
||||
"account.mention": "Mentionar @{name}",
|
||||
"account.moved_to": "{name} indicava que lor nove conto ora es:",
|
||||
"account.moved_to": "{name} ha indicate que su nove conto ora es:",
|
||||
"account.mute": "Silentiar @{name}",
|
||||
"account.mute_notifications_short": "Silentiar le notificationes",
|
||||
"account.mute_short": "Silentiar",
|
||||
|
@ -53,9 +57,9 @@
|
|||
"account.posts": "Messages",
|
||||
"account.posts_with_replies": "Messages e responsas",
|
||||
"account.requested": "Attendente le approbation. Clicca pro cancellar le requesta de sequer",
|
||||
"account.requested_follow": "{name} habeva requestate sequer te",
|
||||
"account.requested_follow": "{name} ha requestate de sequer te",
|
||||
"account.share": "Compartir profilo de @{name}",
|
||||
"account.show_reblogs": "Monstrar responsas de @{name}",
|
||||
"account.show_reblogs": "Monstrar impulsos de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}",
|
||||
"account.unblock": "Disblocar @{name}",
|
||||
"account.unblock_domain": "Disblocar dominio {domain}",
|
||||
|
@ -66,23 +70,30 @@
|
|||
"account.unmute_notifications_short": "Non plus silentiar le notificationes",
|
||||
"account.unmute_short": "Non plus silentiar",
|
||||
"account_note.placeholder": "Clicca pro adder un nota",
|
||||
"admin.dashboard.retention.average": "Median",
|
||||
"admin.dashboard.retention.average": "Media",
|
||||
"admin.dashboard.retention.cohort_size": "Nove usatores",
|
||||
"admin.impact_report.instance_followers": "Sequitores que nostre usatores poterea perder",
|
||||
"admin.impact_report.instance_follows": "Sequitores que lor usatores poterea perder",
|
||||
"alert.rate_limited.message": "Retenta depost {retry_time, time, medium}.",
|
||||
"alert.unexpected.message": "Ocurreva un error inexpectate.",
|
||||
"admin.impact_report.instance_followers": "Sequitores que nostre usatores perderea",
|
||||
"admin.impact_report.instance_follows": "Sequitores que lor usatores perderea",
|
||||
"alert.rate_limited.message": "Per favor retenta post {retry_time, time, medium}.",
|
||||
"alert.unexpected.message": "Un error inexpectate ha occurrite.",
|
||||
"announcement.announcement": "Annuncio",
|
||||
"audio.hide": "Celar audio",
|
||||
"bundle_column_error.error.title": "Oh, non!",
|
||||
"block_modal.remote_users_caveat": "Nos demandera al servitor {domain} de respectar tu decision. Nonobstante, le conformitate non es garantite perque alcun servitores pote tractar le blocadas de maniera differente. Le messages public pote esser totevia visibile pro le usatores non authenticate.",
|
||||
"block_modal.show_less": "Monstrar minus",
|
||||
"block_modal.show_more": "Monstrar plus",
|
||||
"block_modal.they_cant_see_posts": "Iste persona non potera vider tu messages e tu non videra le sues.",
|
||||
"block_modal.title": "Blocar usator?",
|
||||
"block_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.",
|
||||
"boost_modal.combo": "Tu pote premer {combo} pro saltar isto le proxime vice",
|
||||
"bundle_column_error.error.title": "Oh, no!",
|
||||
"bundle_column_error.network.title": "Error de rete",
|
||||
"bundle_column_error.retry": "Tentar novemente",
|
||||
"bundle_column_error.return": "Retornar al initio",
|
||||
"bundle_modal_error.close": "Clauder",
|
||||
"bundle_modal_error.retry": "Tentar novemente",
|
||||
"closed_registrations_modal.description": "Crear un conto in {domain} actualmente non es possibile, ma considera que tu non besonia un conto specific in {domain} pro usar Mastodon.",
|
||||
"closed_registrations_modal.find_another_server": "Trovar altere servitor",
|
||||
"column.about": "A proposito de",
|
||||
"closed_registrations_modal.description": "Crear un conto in {domain} actualmente non es possibile, ma considera que non es necessari haber un conto specificamente sur {domain} pro usar Mastodon.",
|
||||
"closed_registrations_modal.find_another_server": "Cercar un altere servitor",
|
||||
"column.about": "A proposito",
|
||||
"column.blocks": "Usatores blocate",
|
||||
"column.bookmarks": "Marcapaginas",
|
||||
"column.community": "Chronologia local",
|
||||
|
@ -90,11 +101,12 @@
|
|||
"column.directory": "Navigar profilos",
|
||||
"column.domain_blocks": "Dominios blocate",
|
||||
"column.favourites": "Favoritos",
|
||||
"column.firehose": "Fluxos in directe",
|
||||
"column.firehose": "Fluxos in directo",
|
||||
"column.home": "Initio",
|
||||
"column.lists": "Listas",
|
||||
"column.mutes": "Usatores silentiate",
|
||||
"column.notifications": "Notificationes",
|
||||
"column.pins": "Messages fixate",
|
||||
"column.public": "Chronologia federate",
|
||||
"column_back_button.label": "Retro",
|
||||
"column_header.hide_settings": "Celar le parametros",
|
||||
|
@ -103,22 +115,24 @@
|
|||
"column_header.show_settings": "Monstrar le parametros",
|
||||
"column_subheading.settings": "Parametros",
|
||||
"community.column_settings.local_only": "Solmente local",
|
||||
"community.column_settings.media_only": "Solmente medios",
|
||||
"community.column_settings.media_only": "Solmente multimedia",
|
||||
"compose.language.change": "Cambiar le lingua",
|
||||
"compose.language.search": "Cercar linguas...",
|
||||
"compose.published.body": "Message publicate.",
|
||||
"compose.published.open": "Aperir",
|
||||
"compose.saved.body": "Message salvate.",
|
||||
"compose_form.direct_message_warning_learn_more": "Apprender plus",
|
||||
"compose_form.encryption_warning": "Le messages sur Mastodon non es cryptate de puncta a puncta. Non condivide alcun information sensibile usante Mastodon.",
|
||||
"compose_form.hashtag_warning": "Iste message non essera listate sub alcun hashtag perque illo non es public. Solmente le messages public pote esser cercate per hashtag.",
|
||||
"compose_form.lock_disclaimer": "Tu conto non es {locked}. Quicunque pote sequer te pro vider tu messages solo pro sequitores.",
|
||||
"compose_form.lock_disclaimer.lock": "blocate",
|
||||
"compose_form.poll.duration": "Duration del inquesta",
|
||||
"compose_form.lock_disclaimer.lock": "serrate",
|
||||
"compose_form.poll.duration": "Durata del sondage",
|
||||
"compose_form.poll.multiple": "Selection multiple",
|
||||
"compose_form.poll.option_placeholder": "Option {number}",
|
||||
"compose_form.poll.single": "Seliger un",
|
||||
"compose_form.poll.switch_to_multiple": "Cambiar inquesta pro permitter selectiones multiple",
|
||||
"compose_form.poll.switch_to_single": "Cambiar inquesta pro permitter selection singule",
|
||||
"compose_form.poll.type": "Stylo",
|
||||
"compose_form.poll.switch_to_multiple": "Cambiar le sondage pro permitter selectiones multiple",
|
||||
"compose_form.poll.switch_to_single": "Cambiar le sondage pro permitter selection singule",
|
||||
"compose_form.poll.type": "Stilo",
|
||||
"compose_form.publish": "Publicar",
|
||||
"compose_form.publish_form": "Nove message",
|
||||
"compose_form.reply": "Responder",
|
||||
|
@ -129,18 +143,20 @@
|
|||
"confirmation_modal.cancel": "Cancellar",
|
||||
"confirmations.block.confirm": "Blocar",
|
||||
"confirmations.cancel_follow_request.confirm": "Retirar requesta",
|
||||
"confirmations.cancel_follow_request.message": "Es tu secur que tu vole retirar tu requesta a sequer a {name}?",
|
||||
"confirmations.cancel_follow_request.message": "Es tu secur que tu vole retirar tu requesta de sequer {name}?",
|
||||
"confirmations.delete.confirm": "Deler",
|
||||
"confirmations.delete.message": "Es tu secur que tu vole deler iste message?",
|
||||
"confirmations.delete_list.confirm": "Deler",
|
||||
"confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?",
|
||||
"confirmations.domain_block.confirm": "Blocar le servitor",
|
||||
"confirmations.edit.confirm": "Modificar",
|
||||
"confirmations.logout.confirm": "Clauder le session",
|
||||
"confirmations.logout.confirm": "Clauder session",
|
||||
"confirmations.logout.message": "Es tu secur que tu vole clauder le session?",
|
||||
"confirmations.mute.confirm": "Silentiar",
|
||||
"confirmations.redraft.message": "Es tu secur de voler deler iste message e rescriber lo? Le favorites e le impulsos essera perdite, e le responsas al message original essera orphanate.",
|
||||
"confirmations.reply.confirm": "Responder",
|
||||
"confirmations.unfollow.confirm": "Non plus sequer",
|
||||
"confirmations.unfollow.message": "Es tu secur que tu vole non plus sequer {name}?",
|
||||
"confirmations.unfollow.message": "Es tu secur que tu vole cessar de sequer {name}?",
|
||||
"conversation.delete": "Deler conversation",
|
||||
"conversation.mark_as_read": "Marcar como legite",
|
||||
"conversation.open": "Vider conversation",
|
||||
|
@ -154,9 +170,25 @@
|
|||
"directory.recently_active": "Recentemente active",
|
||||
"disabled_account_banner.account_settings": "Parametros de conto",
|
||||
"disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.",
|
||||
"dismissable_banner.community_timeline": "Ecce le messages public le plus recente del personas con contos sur {domain}.",
|
||||
"dismissable_banner.dismiss": "Dimitter",
|
||||
"dismissable_banner.explore_links": "Istes es le articulos de novas que se condivide le plus sur le rete social hodie. Le articulos de novas le plus recente, publicate per plus personas differente, se classifica plus in alto.",
|
||||
"dismissable_banner.explore_statuses": "Ecce le messages de tote le rete social que gania popularitate hodie. Le messages plus nove con plus impulsos e favorites se classifica plus in alto.",
|
||||
"dismissable_banner.public_timeline": "Istes es le messages public le plus recente del personas sur le rete social que le gente sur {domain} seque.",
|
||||
"domain_block_modal.block": "Blocar le servitor",
|
||||
"domain_block_modal.block_account_instead": "Blocar @{name} in su loco",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Le personas de iste servitor pote interager con tu messages ancian.",
|
||||
"domain_block_modal.they_cant_follow": "Nulle persona ab iste servitor pote sequer te.",
|
||||
"domain_block_modal.they_wont_know": "Illes non sapera que illes ha essite blocate.",
|
||||
"domain_block_modal.title": "Blocar dominio?",
|
||||
"domain_block_modal.you_will_lose_followers": "Omne sequitores ab iste servitor essera removite.",
|
||||
"domain_block_modal.you_wont_see_posts": "Tu non videra messages e notificationes ab usatores sur iste servitor.",
|
||||
"domain_pill.server": "Servitor",
|
||||
"domain_pill.their_server": "Su casa digital, ubi vive tote su messages.",
|
||||
"domain_pill.username": "Nomine de usator",
|
||||
"embed.preview": "Hic es como il parera:",
|
||||
"domain_pill.your_server": "Tu casa digital, ubi vive tote tu messages. Non te place? Cambia de servitor a omne momento e porta tu sequitores con te.",
|
||||
"embed.instructions": "Incorpora iste message sur tu sito web con le codice sequente.",
|
||||
"embed.preview": "Ecce como illlo parera:",
|
||||
"emoji_button.activity": "Activitate",
|
||||
"emoji_button.clear": "Rader",
|
||||
"emoji_button.custom": "Personalisate",
|
||||
|
@ -170,16 +202,20 @@
|
|||
"emoji_button.search_results": "Resultatos de recerca",
|
||||
"emoji_button.symbols": "Symbolos",
|
||||
"emoji_button.travel": "Viages e locos",
|
||||
"empty_column.account_hides_collections": "Le usator ha seligite non facer iste information disponibile",
|
||||
"empty_column.account_hides_collections": "Le usator non ha rendite iste information disponibile",
|
||||
"empty_column.account_suspended": "Conto suspendite",
|
||||
"empty_column.account_timeline": "Nulle messages hic!",
|
||||
"empty_column.account_unavailable": "Profilo non disponibile",
|
||||
"empty_column.blocks": "Tu non ha blocate alcun usator ancora.",
|
||||
"empty_column.bookmarked_statuses": "Tu non ha ancora messages in marcapaginas. Quando tu adde un message al marcapaginas, illo apparera hic.",
|
||||
"empty_column.domain_blocks": "Il non ha dominios blocate ancora.",
|
||||
"empty_column.explore_statuses": "Nihil es in tendentias ora mesme. Retorna postea!",
|
||||
"empty_column.favourited_statuses": "Tu non ha necun messages favorite ancora. Quando tu marca un como favorito, ille essera monstrate hic.",
|
||||
"empty_column.followed_tags": "Tu ancora non ha sequite necun hashtags. Quando tu lo face, illes essera monstrate hic.",
|
||||
"empty_column.hashtag": "Ancora non il ha nihil in iste hashtag.",
|
||||
"empty_column.explore_statuses": "Il non ha tendentias in iste momento. Reveni plus tarde!",
|
||||
"empty_column.favourited_statuses": "Tu non ha alcun message favorite ancora. Quando tu marca un message como favorite, illo apparera hic.",
|
||||
"empty_column.favourites": "Necuno ha ancora marcate iste message como favorite. Quando alcuno lo face, ille apparera hic.",
|
||||
"empty_column.followed_tags": "Tu non ha ancora sequite alcun hashtags. Quando tu lo face, illos apparera hic.",
|
||||
"empty_column.hashtag": "Il non ha ancora alcun cosa in iste hashtag.",
|
||||
"empty_column.home": "Tu chronologia de initio es vacue! Seque plus personas pro plenar lo.",
|
||||
"empty_column.list": "Iste lista es ancora vacue. Quando le membros de iste lista publica nove messages, illos apparera hic.",
|
||||
"errors.unexpected_crash.report_issue": "Signalar un defecto",
|
||||
"explore.search_results": "Resultatos de recerca",
|
||||
"explore.suggested_follows": "Personas",
|
||||
|
@ -187,14 +223,16 @@
|
|||
"explore.trending_links": "Novas",
|
||||
"explore.trending_statuses": "Messages",
|
||||
"explore.trending_tags": "Hashtags",
|
||||
"filter_modal.added.context_mismatch_explanation": "Iste categoria de filtros non se applica al contexto in le qual tu ha accedite a iste message. Pro filtrar le message in iste contexto tamben, modifica le filtro.",
|
||||
"filter_modal.added.review_and_configure_title": "Parametros de filtro",
|
||||
"filter_modal.added.settings_link": "pagina de parametros",
|
||||
"filter_modal.added.short_explanation": "Iste message esseva addite al sequente categoria de filtros: {title}.",
|
||||
"filter_modal.added.short_explanation": "Iste message ha essite addite al sequente categoria de filtros: {title}.",
|
||||
"filter_modal.added.title": "Filtro addite!",
|
||||
"filter_modal.select_filter.prompt_new": "Nove categoria: {name}",
|
||||
"filter_modal.select_filter.search": "Cercar o crear",
|
||||
"filter_modal.select_filter.title": "Filtrar iste message",
|
||||
"filter_modal.title.status": "Filtrar un message",
|
||||
"filtered_notifications_banner.pending_requests": "Notificationes ab {count, plural, =0 {nemo} one {un persona} other {# personas}} tu poterea cognoscer",
|
||||
"firehose.all": "Toto",
|
||||
"firehose.local": "Iste servitor",
|
||||
"firehose.remote": "Altere servitores",
|
||||
|
@ -203,9 +241,9 @@
|
|||
"follow_suggestions.personalized_suggestion": "Suggestion personalisate",
|
||||
"follow_suggestions.popular_suggestion": "Suggestion personalisate",
|
||||
"follow_suggestions.view_all": "Vider toto",
|
||||
"footer.about": "A proposito de",
|
||||
"footer.about": "A proposito",
|
||||
"footer.directory": "Directorio de profilos",
|
||||
"footer.get_app": "Obtene le application",
|
||||
"footer.get_app": "Obtener le application",
|
||||
"footer.invite": "Invitar personas",
|
||||
"footer.keyboard_shortcuts": "Accessos directe de claviero",
|
||||
"footer.privacy_policy": "Politica de confidentialitate",
|
||||
|
@ -218,51 +256,65 @@
|
|||
"hashtag.column_header.tag_mode.none": "sin {additional}",
|
||||
"hashtag.column_settings.select.no_options_message": "Nulle suggestiones trovate",
|
||||
"hashtag.column_settings.select.placeholder": "Insere hashtags…",
|
||||
"hashtag.counter_by_uses": "{count, plural, one {{counter} message} other {{counter} messages}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} hodie",
|
||||
"hashtag.follow": "Sequer hashtag",
|
||||
"hashtag.unfollow": "Non sequer plus le hashtag",
|
||||
"hashtags.and_other": "…e {count, plural, one {}other {# plus}}",
|
||||
"home.column_settings.show_reblogs": "Monstrar boosts",
|
||||
"home.column_settings.show_reblogs": "Monstrar impulsos",
|
||||
"home.column_settings.show_replies": "Monstrar responsas",
|
||||
"home.hide_announcements": "Celar annuncios",
|
||||
"home.pending_critical_update.body": "Actualisa tu servitor de Mastodon le plus tosto possibile!",
|
||||
"home.pending_critical_update.link": "Vider actualisationes",
|
||||
"home.pending_critical_update.title": "Actualisation de securitate critic disponibile!",
|
||||
"home.show_announcements": "Monstrar annuncios",
|
||||
"interaction_modal.login.prompt": "Dominio de tu servitor, p.e. mastodon.social",
|
||||
"interaction_modal.description.favourite": "Con un conto sur Mastodon, tu pote marcar iste message como favorite pro informar le autor que tu lo apprecia e salveguarda pro plus tarde.",
|
||||
"interaction_modal.description.follow": "Con un conto sur Mastodon, tu pote sequer {name} e reciper su messages in tu fluxo de initio.",
|
||||
"interaction_modal.description.reblog": "Con un conto sur Mastodon, tu pote impulsar iste message pro condivider lo con tu proprie sequitores.",
|
||||
"interaction_modal.description.reply": "Con un conto sur Mastodon, tu pote responder a iste message.",
|
||||
"interaction_modal.login.action": "Porta me a casa",
|
||||
"interaction_modal.login.prompt": "Dominio de tu servitor, p.ex. mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Non sur Mstodon?",
|
||||
"interaction_modal.on_another_server": "In un servitor differente",
|
||||
"interaction_modal.on_this_server": "In iste servitor",
|
||||
"interaction_modal.on_another_server": "Sur un altere servitor",
|
||||
"interaction_modal.on_this_server": "Sur iste servitor",
|
||||
"interaction_modal.title.favourite": "Marcar le message de {name} como favorite",
|
||||
"interaction_modal.title.follow": "Sequer {name}",
|
||||
"interaction_modal.title.reblog": "Facer boost al message de {name}",
|
||||
"interaction_modal.title.reblog": "Impulsar le message de {name}",
|
||||
"interaction_modal.title.reply": "Responder al message de {name}",
|
||||
"keyboard_shortcuts.blocked": "Aperir lista de usatores blocate",
|
||||
"keyboard_shortcuts.boost": "Facer boost al message",
|
||||
"keyboard_shortcuts.boost": "Impulsar le message",
|
||||
"keyboard_shortcuts.description": "Description",
|
||||
"keyboard_shortcuts.enter": "Aperir message",
|
||||
"keyboard_shortcuts.favourite": "Message favorite",
|
||||
"keyboard_shortcuts.favourites": "Aperir lista de favoritos",
|
||||
"keyboard_shortcuts.federated": "Aperir le chronologia federate",
|
||||
"keyboard_shortcuts.heading": "Accessos directe de claviero",
|
||||
"keyboard_shortcuts.home": "Aperir le chronologia de initio",
|
||||
"keyboard_shortcuts.legend": "Monstrar iste legenda",
|
||||
"keyboard_shortcuts.local": "Aperir le chronologia local",
|
||||
"keyboard_shortcuts.mention": "Mentionar le author",
|
||||
"keyboard_shortcuts.muted": "Aperir lista de usatores silentiate",
|
||||
"keyboard_shortcuts.my_profile": "Aperir tu profilo",
|
||||
"keyboard_shortcuts.notifications": "Aperir columna de notificationes",
|
||||
"keyboard_shortcuts.open_media": "Aperir medio",
|
||||
"keyboard_shortcuts.open_media": "Aperir multimedia",
|
||||
"keyboard_shortcuts.pinned": "Aperir le lista de messages fixate",
|
||||
"keyboard_shortcuts.profile": "Aperir le profilo del autor",
|
||||
"keyboard_shortcuts.reply": "Responder al message",
|
||||
"keyboard_shortcuts.spoilers": "Monstrar/celar le campo CW",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Monstrar/celar medios",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Monstrar/celar multimedia",
|
||||
"keyboard_shortcuts.toot": "Initiar un nove message",
|
||||
"lightbox.close": "Clauder",
|
||||
"lightbox.next": "Sequente",
|
||||
"lightbox.previous": "Precedente",
|
||||
"limited_account_hint.action": "Monstrar profilo in omne caso",
|
||||
"limited_account_hint.title": "Iste profilo esseva celate per le moderatores de {domain}.",
|
||||
"link_preview.author": "Per {name}",
|
||||
"lists.account.add": "Adder al lista",
|
||||
"lists.account.remove": "Remover ab le lista",
|
||||
"lists.account.remove": "Remover del lista",
|
||||
"lists.delete": "Deler lista",
|
||||
"lists.edit": "Modificar lista",
|
||||
"lists.edit.submit": "Cambiar titulo",
|
||||
"lists.exclusive": "Celar iste messages ab le initio",
|
||||
"lists.exclusive": "Celar iste messages sur le pagina de initio",
|
||||
"lists.new.create": "Adder lista",
|
||||
"lists.new.title_placeholder": "Nove titulo del lista",
|
||||
"lists.replies_policy.none": "Nemo",
|
||||
|
@ -270,8 +322,16 @@
|
|||
"lists.subheading": "Tu listas",
|
||||
"loading_indicator.label": "Cargante…",
|
||||
"media_gallery.toggle_visible": "{number, plural, one {Celar imagine} other {Celar imagines}}",
|
||||
"navigation_bar.about": "A proposito de",
|
||||
"navigation_bar.advanced_interface": "Aperir in un interfacie web avantiate",
|
||||
"mute_modal.hide_from_notifications": "Celar ab notificationes",
|
||||
"mute_modal.hide_options": "Celar optiones",
|
||||
"mute_modal.show_options": "Monstrar optiones",
|
||||
"mute_modal.they_can_mention_and_follow": "Illes pote mentionar te e sequer te, ma tu non potera vider los.",
|
||||
"mute_modal.they_wont_know": "Illes non sapera que illes ha essite silentiate.",
|
||||
"mute_modal.title": "Silentiar le usator?",
|
||||
"mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.",
|
||||
"mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.",
|
||||
"navigation_bar.about": "A proposito",
|
||||
"navigation_bar.advanced_interface": "Aperir in le interfacie web avantiate",
|
||||
"navigation_bar.blocks": "Usatores blocate",
|
||||
"navigation_bar.bookmarks": "Marcapaginas",
|
||||
"navigation_bar.community_timeline": "Chronologia local",
|
||||
|
@ -287,63 +347,92 @@
|
|||
"navigation_bar.mutes": "Usatores silentiate",
|
||||
"navigation_bar.opened_in_classic_interface": "Messages, contos e altere paginas specific es aperite per predefinition in le interfacie web classic.",
|
||||
"navigation_bar.personal": "Personal",
|
||||
"navigation_bar.pins": "Messages fixate",
|
||||
"navigation_bar.preferences": "Preferentias",
|
||||
"navigation_bar.public_timeline": "Chronologia federate",
|
||||
"navigation_bar.search": "Cercar",
|
||||
"navigation_bar.security": "Securitate",
|
||||
"notification.own_poll": "Tu inquesta finiva",
|
||||
"notification.update": "{name} modificava un message",
|
||||
"notification.favourite": "{name} ha marcate tu message como favorite",
|
||||
"notification.own_poll": "Tu sondage ha finite",
|
||||
"notification.reblog": "{name} ha impulsate tu message",
|
||||
"notification.relationships_severance_event.learn_more": "Apprender plus",
|
||||
"notification.status": "{name} ha justo ora publicate",
|
||||
"notification.update": "{name} ha modificate un message",
|
||||
"notification_requests.accept": "Acceptar",
|
||||
"notification_requests.dismiss": "Dimitter",
|
||||
"notification_requests.notifications_from": "Notificationes de {name}",
|
||||
"notification_requests.title": "Notificationes filtrate",
|
||||
"notifications.clear": "Rader notificationes",
|
||||
"notifications.clear_confirmation": "Es tu secur que tu vole rader permanentemente tote tu notificationes?",
|
||||
"notifications.column_settings.alert": "Notificationes de scriptorio",
|
||||
"notifications.column_settings.favourite": "Favoritos:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias",
|
||||
"notifications.column_settings.follow": "Nove sequitores:",
|
||||
"notifications.column_settings.mention": "Mentiones:",
|
||||
"notifications.column_settings.poll": "Resultatos del inquesta:",
|
||||
"notifications.column_settings.poll": "Resultatos del sondage:",
|
||||
"notifications.column_settings.push": "Notificationes push",
|
||||
"notifications.column_settings.reblog": "Impulsos:",
|
||||
"notifications.column_settings.show": "Monstrar in columna",
|
||||
"notifications.column_settings.sound": "Reproducer sono",
|
||||
"notifications.column_settings.status": "Nove messages:",
|
||||
"notifications.column_settings.unread_notifications.category": "Notificationes non legite",
|
||||
"notifications.filter.all": "Toto",
|
||||
"notifications.filter.boosts": "Impulsos",
|
||||
"notifications.filter.favourites": "Favoritos",
|
||||
"notifications.filter.mentions": "Mentiones",
|
||||
"notifications.filter.polls": "Resultatos del inquesta",
|
||||
"notifications.filter.polls": "Resultatos del sondage",
|
||||
"notifications.filter.statuses": "Actualisationes de personas que tu seque",
|
||||
"notifications.grant_permission": "Conceder permission.",
|
||||
"notifications.group": "{count} notificationes",
|
||||
"notifications.mark_as_read": "Marcar cata notification como legite",
|
||||
"notifications.policy.filter_new_accounts_title": "Nove contos",
|
||||
"notifications_permission_banner.enable": "Activar notificationes de scriptorio",
|
||||
"onboarding.actions.go_to_home": "Porta me a mi fluxo de initio",
|
||||
"onboarding.compose.template": "Salute #Mastodon!",
|
||||
"onboarding.follows.lead": "Le fluxo de initio es le maniera principal de discoperir Mastodon. Quanto plus personas tu seque, tanto plus active e interessante illo essera. Pro comenciar, ecce alcun suggestiones:",
|
||||
"onboarding.follows.title": "Personalisar tu fluxo de initio",
|
||||
"onboarding.profile.discoverable_hint": "Quando tu opta pro devenir discoperibile sur Mastodon, tu messages pote apparer in resultatos de recerca e in tendentias, e tu profilo pote esser suggerite al personas con interesses simile al tues.",
|
||||
"onboarding.profile.save_and_continue": "Salvar e continuar",
|
||||
"onboarding.share.next_steps": "Sequente passos possibile:",
|
||||
"onboarding.share.title": "Compartir tu profilo",
|
||||
"onboarding.steps.follow_people.title": "Personalisa tu fluxo de initio",
|
||||
"onboarding.steps.follow_people.title": "Personalisar tu fluxo de initio",
|
||||
"onboarding.steps.publish_status.title": "Face tu prime message",
|
||||
"onboarding.steps.setup_profile.body": "Impulsa tu interactiones con un profilo comprehensive.",
|
||||
"onboarding.steps.setup_profile.title": "Personalisa tu profilo",
|
||||
"onboarding.steps.share_profile.title": "Compartir tu profilo de Mastodon",
|
||||
"poll.closed": "Claudite",
|
||||
"poll.reveal": "Vider le resultatos",
|
||||
"privacy.change": "Cambiar privacitate del message",
|
||||
"privacy.change": "Cambiar le confidentialitate del message",
|
||||
"privacy.direct.long": "Tote le personas mentionate in le message",
|
||||
"privacy.public.short": "Public",
|
||||
"privacy.unlisted.additional": "Isto es exactemente como public, excepte que le message non apparera in fluxos in directo, in hashtags, in Explorar, o in le recerca de Mastodon, mesmo si tu ha optate pro render tote le conto discoperibile.",
|
||||
"privacy_policy.last_updated": "Ultime actualisation {date}",
|
||||
"privacy_policy.title": "Politica de confidentialitate",
|
||||
"regeneration_indicator.sublabel": "Tu fluxo de initio es in preparation!",
|
||||
"relative_time.just_now": "ora",
|
||||
"relative_time.today": "hodie",
|
||||
"reply_indicator.cancel": "Cancellar",
|
||||
"report.block": "Blocar",
|
||||
"report.block_explanation": "Tu non videra le messages de iste persona. Ille non potera vider tu messages o sequer te. Ille potera saper de esser blocate.",
|
||||
"report.categories.other": "Alteres",
|
||||
"report.category.title_account": "profilo",
|
||||
"report.category.title_status": "message",
|
||||
"report.close": "Preste",
|
||||
"report.close": "Facite",
|
||||
"report.mute": "Silentiar",
|
||||
"report.mute_explanation": "Tu non videra le messages de iste persona. Ille pote totevia sequer te e vider tu messages e non sapera de esser silentiate.",
|
||||
"report.next": "Sequente",
|
||||
"report.placeholder": "Commentos additional",
|
||||
"report.reasons.dislike": "Non me place",
|
||||
"report.statuses.title": "Existe alcun messages que appoia iste reporto?",
|
||||
"report.unfollow_explanation": "Tu seque iste conto. Pro non plus vider su messages in tu fluxo de initio, cessa de sequer lo.",
|
||||
"report_notification.attached_statuses": "{count, plural, one {{count} message} other {{count} messages}} annexate",
|
||||
"report_notification.categories.other": "Alteres",
|
||||
"report_notification.open": "Aperir reporto",
|
||||
"search.no_recent_searches": "Nulle recercas recente",
|
||||
"search.quick_action.go_to_account": "Vader al profilo {x}",
|
||||
"search.quick_action.go_to_hashtag": "Vader al hashtag {x}",
|
||||
"search.quick_action.open_url": "Aperir URL in Mastodon",
|
||||
"search.quick_action.status_search": "Messages correspondente a {x}",
|
||||
"search_popout.full_text_search_disabled_message": "Non disponibile sur {domain}.",
|
||||
"search_popout.language_code": "Codice de lingua ISO",
|
||||
"search_popout.options": "Optiones de recerca",
|
||||
|
@ -358,14 +447,18 @@
|
|||
"server_banner.learn_more": "Apprender plus",
|
||||
"server_banner.server_stats": "Statos del servitor:",
|
||||
"sign_in_banner.create_account": "Crear un conto",
|
||||
"sign_in_banner.sign_in": "Initiar le session",
|
||||
"sign_in_banner.sign_in": "Aperir session",
|
||||
"sign_in_banner.text": "Aperi session pro sequer profilos o hashtags, marcar messages como favorite, e condivider e responder a messages. Tu pote etiam interager desde tu conto sur un altere servitor.",
|
||||
"status.admin_status": "Aperir iste message in le interfacie de moderation",
|
||||
"status.block": "Blocar @{name}",
|
||||
"status.cancel_reblog_private": "Disfacer impulso",
|
||||
"status.cannot_reblog": "Iste message non pote esser impulsate",
|
||||
"status.copy": "Copiar ligamine a message",
|
||||
"status.delete": "Deler",
|
||||
"status.direct": "Mentionar privatemente a @{name}",
|
||||
"status.direct": "Mentionar privatemente @{name}",
|
||||
"status.direct_indicator": "Mention private",
|
||||
"status.edit": "Modificar",
|
||||
"status.edited_x_times": "Modificate {count, plural, one {{count} tempore} other {{count} tempores}}",
|
||||
"status.edited_x_times": "Modificate {count, plural, one {{count} vice} other {{count} vices}}",
|
||||
"status.favourite": "Adder al favoritos",
|
||||
"status.filter": "Filtrar iste message",
|
||||
"status.hide": "Celar le message",
|
||||
|
@ -375,21 +468,44 @@
|
|||
"status.media.show": "Clicca pro monstrar",
|
||||
"status.more": "Plus",
|
||||
"status.mute_conversation": "Silentiar conversation",
|
||||
"status.open": "Expander iste message",
|
||||
"status.pinned": "Message fixate",
|
||||
"status.read_more": "Leger plus",
|
||||
"status.reblog": "Impulsar",
|
||||
"status.reblog_private": "Impulsar con visibilitate original",
|
||||
"status.reblogged_by": "Impulsate per {name}",
|
||||
"status.reblogs": "{count, plural, one {impulso} other {impulsos}}",
|
||||
"status.reblogs.empty": "Necuno ha ancora impulsate iste message. Quando alcuno lo face, le impulsos apparera hic.",
|
||||
"status.redraft": "Deler e reconciper",
|
||||
"status.remove_bookmark": "Remover marcapagina",
|
||||
"status.replied_to": "Respondite a {name}",
|
||||
"status.reply": "Responder",
|
||||
"status.replyAll": "Responder al discussion",
|
||||
"status.report": "Signalar @{name}",
|
||||
"status.sensitive_warning": "Contento sensibile",
|
||||
"status.share": "Compartir",
|
||||
"status.show_filter_reason": "Monstrar in omne caso",
|
||||
"status.show_less": "Monstrar minus",
|
||||
"status.show_less_all": "Monstrar minus pro totes",
|
||||
"status.show_more": "Monstrar plus",
|
||||
"status.show_more_all": "Monstrar plus pro totes",
|
||||
"status.show_original": "Monstrar original",
|
||||
"status.title.with_attachments": "{user} ha publicate {attachmentCount, plural, one {un annexo} other {{attachmentCount} annexos}}",
|
||||
"status.translate": "Traducer",
|
||||
"status.translated_from_with": "Traducite ab {lang} usante {provider}",
|
||||
"status.uncached_media_warning": "Previsualisation non disponibile",
|
||||
"status.unmute_conversation": "Non plus silentiar conversation",
|
||||
"status.unpin": "Disfixar del profilo",
|
||||
"subscribed_languages.lead": "Solmente le messages in le linguas seligite apparera in tu chronologias de initio e de listas post le cambiamento. Selige necun pro reciper messages in tote le linguas.",
|
||||
"subscribed_languages.save": "Salveguardar le cambiamentos",
|
||||
"subscribed_languages.target": "Cambiar le linguas subscribite pro {target}",
|
||||
"tabs_bar.home": "Initio",
|
||||
"tabs_bar.notifications": "Notificationes",
|
||||
"timeline_hint.resources.statuses": "Messages ancian",
|
||||
"trends.trending_now": "Ora in tendentias",
|
||||
"upload_button.label": "Adde imagines, un video o un file de audio",
|
||||
"upload_modal.choose_image": "Seliger un imagine",
|
||||
"upload_modal.detect_text": "Deteger texto ab un pictura",
|
||||
"upload_modal.detect_text": "Deteger texto de un imagine",
|
||||
"video.close": "Clauder le video",
|
||||
"video.download": "Discargar le file",
|
||||
"video.fullscreen": "Schermo plen",
|
||||
|
|
|
@ -91,6 +91,9 @@
|
|||
"audio.hide": "Celar audio",
|
||||
"block_modal.show_less": "Monstrar minu",
|
||||
"block_modal.show_more": "Monstrar plu",
|
||||
"block_modal.they_cant_mention": "Ne posse mentionar ni sequer te.",
|
||||
"block_modal.they_cant_see_posts": "Ne posse vider tui postas e inversi.",
|
||||
"block_modal.they_will_know": "Va esser conscient que tu ha bloccat.",
|
||||
"block_modal.title": "Bloccar usator?",
|
||||
"block_modal.you_wont_see_mentions": "Tu ne va vider postas mentionant li usator.",
|
||||
"boost_modal.combo": "Li proxim vez tu posse pressar {combo} por passar to-ci",
|
||||
|
@ -206,6 +209,16 @@
|
|||
"dismissable_banner.explore_tags": "Tis-ci es hashtags queles es popular che li social retage hodie. Hashtags usat de plu mult persones diferent es monstrat plu alt.",
|
||||
"dismissable_banner.public_timeline": "Tis-ci es li max recent public postas de persones che li social retage quem gente che {domain} seque.",
|
||||
"domain_block_modal.block": "Bloccar servitor",
|
||||
"domain_block_modal.block_account_instead": "Altrimen, bloccar @{name}",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Persones de ti servitor posse interacter con tui old postas.",
|
||||
"domain_block_modal.they_cant_follow": "Nequi de ti-ci servitor posse sequer te.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub es li lingue usat de Mastodon por parlar con altri social retages.",
|
||||
"domain_pill.server": "Servitor",
|
||||
"domain_pill.their_handle": "Identificator:",
|
||||
"domain_pill.their_server": "Su digital hem e omni su postas.",
|
||||
"domain_pill.username": "Usator-nómine",
|
||||
"domain_pill.whats_in_a_handle": "Ex quo consiste un identificator?",
|
||||
"domain_pill.your_handle": "Tui identificator:",
|
||||
"embed.instructions": "Inbedar ti-ci posta per copiar li code in infra.",
|
||||
"embed.preview": "Vi qualmen it va aspecter:",
|
||||
"emoji_button.activity": "Activitá",
|
||||
|
@ -242,6 +255,7 @@
|
|||
"empty_column.list": "Ancor ne hay quocunc in ti-ci liste. Quande membres de ti-ci liste publica nov postas, ili va aparir ci.",
|
||||
"empty_column.lists": "Tu ancor have null listes. Quande tu crea un, it va aparir ci.",
|
||||
"empty_column.mutes": "Tu ancor ha silentiat null usatores.",
|
||||
"empty_column.notification_requests": "Omnicos clar! Hay necos ci. Nov notificationes va venir ci quande tu recive les secun tui parametres.",
|
||||
"empty_column.notifications": "Tu have null notificationes. Quande altri persones interacte con te, tu va vider it ci.",
|
||||
"empty_column.public": "Hay nullcos ci! Scri alquo publicmen, o manualmen seque usatores de altri servitores por plenar to-ci",
|
||||
"error.unexpected_crash.explanation": "Pro un error in nor code o un problema de compatibilitá in li navigator, ti-ci págine ne posset esser monstrat correctmen.",
|
||||
|
@ -272,6 +286,8 @@
|
|||
"filter_modal.select_filter.subtitle": "Usar un existent categorie o crear nov",
|
||||
"filter_modal.select_filter.title": "Filtrar ti-ci posta",
|
||||
"filter_modal.title.status": "Filtrar un posta",
|
||||
"filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse",
|
||||
"filtered_notifications_banner.title": "Filtrat notificationes",
|
||||
"firehose.all": "Omno",
|
||||
"firehose.local": "Ti-ci servitor",
|
||||
"firehose.remote": "Altri servitores",
|
||||
|
@ -400,6 +416,13 @@
|
|||
"loading_indicator.label": "Cargant…",
|
||||
"media_gallery.toggle_visible": "{number, plural, one {Celar image} other {Celar images}}",
|
||||
"moved_to_account_banner.text": "Tui conto {disabledAccount} es actualmen desactivisat pro que tu movet te a {movedToAccount}.",
|
||||
"mute_modal.hide_from_notifications": "Celar de notificationes",
|
||||
"mute_modal.hide_options": "Celar optiones",
|
||||
"mute_modal.indefinite": "Til quande yo dessilentia li usator",
|
||||
"mute_modal.show_options": "Monstrar optiones",
|
||||
"mute_modal.they_can_mention_and_follow": "Posse mentionar e sequer te, ma va esser ínvisibil a te.",
|
||||
"mute_modal.they_wont_know": "Ne va esser conscient pri li silentation.",
|
||||
"mute_modal.title": "Silentiar usator?",
|
||||
"navigation_bar.about": "Information",
|
||||
"navigation_bar.advanced_interface": "Aperter in li web-interfacie avansat",
|
||||
"navigation_bar.blocks": "Bloccat usatores",
|
||||
|
@ -435,14 +458,20 @@
|
|||
"notification.own_poll": "Tui balotation ha finit",
|
||||
"notification.poll": "Un balotation in quel tu votat ha finit",
|
||||
"notification.reblog": "{name} boostat tui posta",
|
||||
"notification.relationships_severance_event.learn_more": "Aprender plu",
|
||||
"notification.status": "{name} just postat",
|
||||
"notification.update": "{name} modificat un posta",
|
||||
"notification_requests.accept": "Acceptar",
|
||||
"notification_requests.dismiss": "Demisser",
|
||||
"notification_requests.notifications_from": "Notificationes de {name}",
|
||||
"notification_requests.title": "Filtrat notificationes",
|
||||
"notifications.clear": "Aclarar notificationes",
|
||||
"notifications.clear_confirmation": "Vole tu vermen permanentmen aclarar omni tui notificationes?",
|
||||
"notifications.column_settings.admin.report": "Nov raportas:",
|
||||
"notifications.column_settings.admin.sign_up": "Nov registrationes:",
|
||||
"notifications.column_settings.alert": "Notificationes sur li computator",
|
||||
"notifications.column_settings.favourite": "Favorites:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Monstrar omni categories",
|
||||
"notifications.column_settings.follow": "Nov sequitores:",
|
||||
"notifications.column_settings.follow_request": "Nov petitiones de sequer:",
|
||||
"notifications.column_settings.mention": "Mentiones:",
|
||||
|
@ -468,6 +497,15 @@
|
|||
"notifications.permission_denied": "Notificationes sur li computator es índisponibil pro que on ha previamen rejectet un petition por navigator-permissiones",
|
||||
"notifications.permission_denied_alert": "Notificationes sur li computator ne posse esser activisat, pro que navigator-permission ha esset previamen rejectet",
|
||||
"notifications.permission_required": "Notificationes sur li computator es índisponibil pro que li besonat permission ne ha esset dat.",
|
||||
"notifications.policy.filter_new_accounts.hint": "Creat durant li passat {days, plural, one {un die} other {# dies}}",
|
||||
"notifications.policy.filter_new_accounts_title": "Nov contos",
|
||||
"notifications.policy.filter_not_followers_hint": "Includente tis qui ha sequet te minu quam {days, plural, one {un die} other {# dies}}",
|
||||
"notifications.policy.filter_not_followers_title": "Persones qui ne seque te",
|
||||
"notifications.policy.filter_not_following_hint": "Til quande tu manualmen aproba",
|
||||
"notifications.policy.filter_not_following_title": "Persones queles tu ne seque",
|
||||
"notifications.policy.filter_private_mentions_hint": "Filtrat except si it es un response a tui propri mention o si tu seque li missor",
|
||||
"notifications.policy.filter_private_mentions_title": "Ínsolicitat privat mentiones",
|
||||
"notifications.policy.title": "Filtrar notificationes de…",
|
||||
"notifications_permission_banner.enable": "Activisar notificationes sur li computator",
|
||||
"notifications_permission_banner.how_to_control": "Por reciver notificationes quande Mastodon ne es apert, activisa notificationes sur li computator. Tu posse decider precisimen quel species de interactiones genera notificationes per li buton {icon} in-supra quande ili es activisat.",
|
||||
"notifications_permission_banner.title": "Nequande preterlassa quocunc",
|
||||
|
@ -644,9 +682,11 @@
|
|||
"status.direct": "Privatmen mentionar @{name}",
|
||||
"status.direct_indicator": "Privat mention",
|
||||
"status.edit": "Modificar",
|
||||
"status.edited": "Ultimmen actualisat ye {date}",
|
||||
"status.edited_x_times": "Modificat {count, plural, one {{count} vez} other {{count} vezes}}",
|
||||
"status.embed": "Inbedar",
|
||||
"status.favourite": "Favoritisar",
|
||||
"status.favourites": "{count, plural, one {favorit} other {favorites}}",
|
||||
"status.filter": "Filtrar ti-ci posta",
|
||||
"status.filtered": "Filtrat",
|
||||
"status.hide": "Celar posta",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Notaðu fyrirliggjandi flokk eða útbúðu nýjan",
|
||||
"filter_modal.select_filter.title": "Sía þessa færslu",
|
||||
"filter_modal.title.status": "Sía færslu",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {tilvísun} other {tilvísanir}}",
|
||||
"filtered_notifications_banner.pending_requests": "Tilkynningar frá {count, plural, =0 {engum} one {einum aðila} other {# aðilum}} sem þú gætir þekkt",
|
||||
"filtered_notifications_banner.title": "Síaðar tilkynningar",
|
||||
"firehose.all": "Allt",
|
||||
|
@ -471,6 +472,11 @@
|
|||
"notification.own_poll": "Könnuninni þinni er lokið",
|
||||
"notification.poll": "Könnun sem þú tókst þátt í er lokið",
|
||||
"notification.reblog": "{name} endurbirti færsluna þína",
|
||||
"notification.relationships_severance_event": "Missti tengingar við {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Stjórnandi á {from} hefur fryst {target}, sem þýðir að þú færð ekki lengur skilaboð frá viðkomandi né átt í samskiptum við viðkomandi.",
|
||||
"notification.relationships_severance_event.domain_block": "Stjórnandi á {from} hefur lokað á {target} og þar með {followersCount} fylgjendur þína auk {followingCount, plural, one {# aðgangs} other {# aðganga}} sem þú fylgist með.",
|
||||
"notification.relationships_severance_event.learn_more": "Kanna nánar",
|
||||
"notification.relationships_severance_event.user_domain_block": "Þú hefur lokað á {target} og þar með fjarlægt {followersCount} fylgjendur þína auk {followingCount, plural, one {# aðgangs} other {# aðganga}} sem þú fylgist með.",
|
||||
"notification.status": "{name} sendi inn rétt í þessu",
|
||||
"notification.update": "{name} breytti færslu",
|
||||
"notification_requests.accept": "Samþykkja",
|
||||
|
@ -483,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nýjar skráningar:",
|
||||
"notifications.column_settings.alert": "Tilkynningar á skjáborði",
|
||||
"notifications.column_settings.favourite": "Eftirlæti:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Birta alla flokka",
|
||||
"notifications.column_settings.filter_bar.category": "Skyndisíustika",
|
||||
"notifications.column_settings.follow": "Nýir fylgjendur:",
|
||||
"notifications.column_settings.follow_request": "Nýjar beiðnir um að fylgjast með:",
|
||||
"notifications.column_settings.mention": "Tilvísanir:",
|
||||
|
|
|
@ -83,7 +83,7 @@
|
|||
"admin.impact_report.instance_follows": "I seguaci che i loro utenti perderebbero",
|
||||
"admin.impact_report.title": "Riepilogo dell'impatto",
|
||||
"alert.rate_limited.message": "Sei pregato di riprovare dopo le {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Tasso limitato",
|
||||
"alert.rate_limited.title": "Limitazione per eccesso di richieste",
|
||||
"alert.unexpected.message": "Si è verificato un errore imprevisto.",
|
||||
"alert.unexpected.title": "Oops!",
|
||||
"announcement.announcement": "Annuncio",
|
||||
|
@ -174,7 +174,7 @@
|
|||
"confirmations.delete.confirm": "Elimina",
|
||||
"confirmations.delete.message": "Sei sicuro di voler eliminare questo post?",
|
||||
"confirmations.delete_list.confirm": "Elimina",
|
||||
"confirmations.delete_list.message": "Sei sicuro di voler eliminare permanentemente questa lista?",
|
||||
"confirmations.delete_list.message": "Sei sicuro/a di voler eliminare permanentemente questo elenco?",
|
||||
"confirmations.discard_edit_media.confirm": "Scarta",
|
||||
"confirmations.discard_edit_media.message": "Hai delle modifiche non salvate alla descrizione o anteprima del media, scartarle comunque?",
|
||||
"confirmations.domain_block.confirm": "Blocca il server",
|
||||
|
@ -263,8 +263,8 @@
|
|||
"empty_column.followed_tags": "Non hai ancora seguito alcun hashtag. Quando lo farai, appariranno qui.",
|
||||
"empty_column.hashtag": "Non c'è ancora nulla in questo hashtag.",
|
||||
"empty_column.home": "La cronologia della tua home è vuota! Segui altre persone per riempirla. {suggestions}",
|
||||
"empty_column.list": "Non c'è ancora nulla in questa lista. Quando i membri di questa lista pubblicheranno dei nuovi post, appariranno qui.",
|
||||
"empty_column.lists": "Non hai ancora alcuna lista. Quando ne creerai una, apparirà qui.",
|
||||
"empty_column.list": "Non c'è ancora nulla in questo elenco. Quando i membri di questo elenco pubblicheranno nuovi post, appariranno qui.",
|
||||
"empty_column.lists": "Non hai ancora nessun elenco. Quando ne creerai uno, apparirà qui.",
|
||||
"empty_column.mutes": "Non hai ancora silenziato alcun utente.",
|
||||
"empty_column.notification_requests": "Tutto chiaro! Non c'è niente qui. Quando ricevi nuove notifiche, verranno visualizzate qui in base alle tue impostazioni.",
|
||||
"empty_column.notifications": "Non hai ancora nessuna notifica. Quando altre persone interagiranno con te, le vedrai qui.",
|
||||
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "Usa una categoria esistente o creane una nuova",
|
||||
"filter_modal.select_filter.title": "Filtra questo post",
|
||||
"filter_modal.title.status": "Filtra un post",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, one {menzione} other {menzioni}}",
|
||||
"filtered_notifications_banner.pending_requests": "Notifiche da {count, plural, =0 {nessuno} one {una persona} other {# persone}} che potresti conoscere",
|
||||
"filtered_notifications_banner.title": "Notifiche filtrate",
|
||||
"firehose.all": "Tutto",
|
||||
|
@ -353,7 +354,7 @@
|
|||
"interaction_modal.description.follow": "Con un profilo di Mastodon, puoi seguire {name} per ricevere i suoi post nel feed della tua home.",
|
||||
"interaction_modal.description.reblog": "Con un profilo di Mastodon, puoi rebloggare questo post per condividerlo con i tuoi seguaci.",
|
||||
"interaction_modal.description.reply": "Con un profilo di Mastodon, puoi rispondere a questo post.",
|
||||
"interaction_modal.login.action": "Torna all’inizio",
|
||||
"interaction_modal.login.action": "Portami alla pagina iniziale",
|
||||
"interaction_modal.login.prompt": "Dominio del tuo server principale, ad esempio mastodon.social",
|
||||
"interaction_modal.no_account_yet": "Non su Mastodon?",
|
||||
"interaction_modal.on_another_server": "Su un altro server",
|
||||
|
@ -409,20 +410,20 @@
|
|||
"limited_account_hint.action": "Mostra comunque il profilo",
|
||||
"limited_account_hint.title": "Questo profilo è stato nascosto dai moderatori di {domain}.",
|
||||
"link_preview.author": "Di {name}",
|
||||
"lists.account.add": "Aggiungi alla lista",
|
||||
"lists.account.remove": "Togli dalla lista",
|
||||
"lists.delete": "Elimina lista",
|
||||
"lists.edit": "Modifica lista",
|
||||
"lists.account.add": "Aggiungi all'elenco",
|
||||
"lists.account.remove": "Rimuovi dall'elenco",
|
||||
"lists.delete": "Elimina elenco",
|
||||
"lists.edit": "Modifica elenco",
|
||||
"lists.edit.submit": "Cambia il titolo",
|
||||
"lists.exclusive": "Nascondi questi post dalla home",
|
||||
"lists.new.create": "Aggiungi lista",
|
||||
"lists.new.title_placeholder": "Titolo della nuova lista",
|
||||
"lists.new.title_placeholder": "Titolo del nuovo elenco",
|
||||
"lists.replies_policy.followed": "Qualsiasi utente seguito",
|
||||
"lists.replies_policy.list": "Membri della lista",
|
||||
"lists.replies_policy.list": "Membri dell'elenco",
|
||||
"lists.replies_policy.none": "Nessuno",
|
||||
"lists.replies_policy.title": "Mostra risposte a:",
|
||||
"lists.search": "Cerca tra le persone che segui",
|
||||
"lists.subheading": "Le tue liste",
|
||||
"lists.subheading": "I tuoi elenchi",
|
||||
"load_pending": "{count, plural, one {# nuovo oggetto} other {# nuovi oggetti}}",
|
||||
"loading_indicator.label": "Caricamento…",
|
||||
"media_gallery.toggle_visible": "{number, plural, one {Nascondi immagine} other {Nascondi immagini}}",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "Il tuo sondaggio è terminato",
|
||||
"notification.poll": "Un sondaggio in cui hai votato è terminato",
|
||||
"notification.reblog": "{name} ha rebloggato il tuo post",
|
||||
"notification.severed_relationships": "Relazioni interrotte con {name}",
|
||||
"notification.relationships_severance_event": "Connessioni perse con {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Un amministratore da {from} ha sospeso {target}, il che significa che non puoi più ricevere aggiornamenti da loro o interagire con loro.",
|
||||
"notification.relationships_severance_event.domain_block": "Un amministratore da {from} ha bloccato {target}, inclusi {followersCount} dei tuoi seguaci e {followingCount, plural, one {# account} other {# account}} che segui.",
|
||||
"notification.relationships_severance_event.learn_more": "Scopri di più",
|
||||
"notification.relationships_severance_event.user_domain_block": "Tu hai bloccato {target}, rimuovendo {followersCount} dei tuoi seguaci e {followingCount, plural, one {# account} other {# account}} che segui.",
|
||||
"notification.status": "{name} ha appena pubblicato un post",
|
||||
"notification.update": "{name} ha modificato un post",
|
||||
"notification_requests.accept": "Accetta",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Nuove iscrizioni:",
|
||||
"notifications.column_settings.alert": "Notifiche desktop",
|
||||
"notifications.column_settings.favourite": "Preferiti:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Mostra tutte le categorie",
|
||||
"notifications.column_settings.filter_bar.category": "Barra del filtro veloce",
|
||||
"notifications.column_settings.follow": "Nuovi seguaci:",
|
||||
"notifications.column_settings.follow_request": "Nuove richieste di seguirti:",
|
||||
"notifications.column_settings.mention": "Menzioni:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "Ricarica",
|
||||
"regeneration_indicator.label": "Caricamento…",
|
||||
"regeneration_indicator.sublabel": "Il feed della tua home è in preparazione!",
|
||||
"relationship_severance_notification.purged_data": "rimossi dagli amministratori",
|
||||
"relationship_severance_notification.relationships": "{count, plural,one {# relazione} other {# relazioni}}",
|
||||
"relationship_severance_notification.types.account_suspension": "L'account è stato sospeso",
|
||||
"relationship_severance_notification.types.domain_block": "Il dominio è stato sospeso",
|
||||
"relationship_severance_notification.types.user_domain_block": "Hai bloccato questo dominio",
|
||||
"relationship_severance_notification.view": "Visualizza",
|
||||
"relative_time.days": "{number}g",
|
||||
"relative_time.full.days": "{number, plural, one {# giorno} other {# giorni}} fa",
|
||||
"relative_time.full.hours": "{number, plural, one {# ora} other {# ore}} fa",
|
||||
|
|
|
@ -89,6 +89,14 @@
|
|||
"announcement.announcement": "お知らせ",
|
||||
"attachments_list.unprocessed": "(未処理)",
|
||||
"audio.hide": "音声を閉じる",
|
||||
"block_modal.remote_users_caveat": "このサーバーはあなたのブロックの意思を尊重するように {domain} へ通知します。しかしながら、ブロックの扱い方はサーバーによってさまざまで、相手のサーバーは必ずしもこのブロックを適切に取り扱うものではないことに留意が必要です。また、あなたの公開投稿はサーバーからログアウトすれば誰からも見ることができます。",
|
||||
"block_modal.show_less": "注意事項を閉じる",
|
||||
"block_modal.show_more": "注意事項",
|
||||
"block_modal.they_cant_mention": "相手はあなたへの返信やフォローができなくなります。",
|
||||
"block_modal.they_cant_see_posts": "相手はあなたの投稿を閲覧できなくなり、あなたも相手の投稿を閲覧できなくなります。",
|
||||
"block_modal.they_will_know": "ブロックは相手からわかります。",
|
||||
"block_modal.title": "ユーザーをブロックしますか?",
|
||||
"block_modal.you_wont_see_mentions": "宛先に相手が入っている投稿も閲覧できなくなります。",
|
||||
"boost_modal.combo": "次からは{combo}を押せばスキップできます",
|
||||
"bundle_column_error.copy_stacktrace": "エラーレポートをコピー",
|
||||
"bundle_column_error.error.body": "要求されたページをレンダリングできませんでした。コードのバグ、またはブラウザの互換性の問題が原因である可能性があります。",
|
||||
|
@ -169,6 +177,7 @@
|
|||
"confirmations.delete_list.message": "本当にこのリストを完全に削除しますか?",
|
||||
"confirmations.discard_edit_media.confirm": "破棄",
|
||||
"confirmations.discard_edit_media.message": "メディアの説明またはプレビューに保存されていない変更があります。それでも破棄しますか?",
|
||||
"confirmations.domain_block.confirm": "サーバーをブロック",
|
||||
"confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。公開タイムラインにそのドメインのコンテンツが表示されなくなり、通知も届かなくなります。そのドメインのフォロワーはアンフォローされます。",
|
||||
"confirmations.edit.confirm": "編集",
|
||||
"confirmations.edit.message": "今編集すると現在作成中のメッセージが上書きされます。本当に実行しますか?",
|
||||
|
@ -200,6 +209,27 @@
|
|||
"dismissable_banner.explore_statuses": "ネットワーク上で注目を集めている投稿です。ブーストやお気に入り登録の多い新しい投稿が上位に表示されます。",
|
||||
"dismissable_banner.explore_tags": "ネットワーク上でトレンドになっているハッシュタグです。たくさんのユーザーに使われたタグほど上位に表示されます。",
|
||||
"dismissable_banner.public_timeline": "{domain}のユーザーがリモートフォローしているアカウントからの公開投稿のタイムラインです。",
|
||||
"domain_block_modal.block": "サーバーをブロック",
|
||||
"domain_block_modal.block_account_instead": "@{name} さんのみをブロック",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "あなたの今までの投稿は、引き続きこのサーバーのユーザーが閲覧できます。",
|
||||
"domain_block_modal.they_cant_follow": "このサーバーのユーザーはあなたをフォローできなくなります。",
|
||||
"domain_block_modal.they_wont_know": "ドメインブロックは相手からはわかりません。",
|
||||
"domain_block_modal.title": "ドメインをブロックしますか?",
|
||||
"domain_block_modal.you_will_lose_followers": "このサーバーのフォロワーはすべてフォロー解除されます。",
|
||||
"domain_block_modal.you_wont_see_posts": "このサーバーのユーザーからの投稿や通知が閲覧できなくなります。",
|
||||
"domain_pill.activitypub_lets_connect": "Mastodonからほかのソーシャルアプリのユーザーへ、そのまた別のアプリのユーザーへと、それぞれが互いにつながり関わり合うことをこのActivityPubの仕組みが実現しています。",
|
||||
"domain_pill.activitypub_like_language": "ActivityPubとは、Mastodonがほかのサーバーと会話をするときにしゃべる「言葉」のようなものです。",
|
||||
"domain_pill.server": "サーバー",
|
||||
"domain_pill.their_handle": "このユーザーのユーザーID:",
|
||||
"domain_pill.their_server": "ユーザーの仮想の住所です。そのユーザーIDによるすべての投稿を保持しています。",
|
||||
"domain_pill.their_username": "ユーザーを識別する名前です。ユーザー名はひとつのサーバー内においては唯一無二の名前ですが、ほかのサーバーには同名のユーザーがいることもあります。",
|
||||
"domain_pill.username": "ユーザー名",
|
||||
"domain_pill.whats_in_a_handle": "ユーザーIDについて",
|
||||
"domain_pill.who_they_are": "そのユーザーが「誰であるか」「どこに住んでいるか」はユーザーIDから知ることができます。これにより<button>いくつものActivityPub対応のプラットフォーム</button>の集まりからなるネットワークを介してそれぞれのユーザーと関わり合うことができます。",
|
||||
"domain_pill.who_you_are": "ほかのユーザーはあなたが「誰であるか」「どこに住んでいるか」をユーザーIDから認識でき、これにより<button>いくつものActivityPub対応のプラットフォーム</button>の集まりからなるネットワークを介してあなたと関わり合うことができます。",
|
||||
"domain_pill.your_handle": "あなたのユーザーID:",
|
||||
"domain_pill.your_server": "あなたの仮想の住所です。投稿した内容はすべてここに保持されます。もし今いるサーバーが気に入っていない場合は、フォロワーを引き継いで別のサーバーに引っ越すこともできます。",
|
||||
"domain_pill.your_username": "あなたを識別する名前です。ユーザー名はひとつのサーバー内においては唯一無二の名前ですが、ほかのサーバーには同名のユーザーがいることもあります。",
|
||||
"embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。",
|
||||
"embed.preview": "表示例:",
|
||||
"emoji_button.activity": "活動",
|
||||
|
@ -397,6 +427,15 @@
|
|||
"loading_indicator.label": "読み込み中…",
|
||||
"media_gallery.toggle_visible": "{number, plural, one {画像を閉じる} other {画像を閉じる}}",
|
||||
"moved_to_account_banner.text": "あなたのアカウント『{disabledAccount}』は『{movedToAccount}』に移動したため現在無効になっています。",
|
||||
"mute_modal.hide_from_notifications": "通知をオフにする",
|
||||
"mute_modal.hide_options": "オプションを閉じる",
|
||||
"mute_modal.indefinite": "無期限",
|
||||
"mute_modal.show_options": "オプションを表示",
|
||||
"mute_modal.they_can_mention_and_follow": "相手はあなたへの返信やフォローができますが、あなたには見えません。",
|
||||
"mute_modal.they_wont_know": "ミュートは相手からはわかりません。",
|
||||
"mute_modal.title": "ユーザーをミュートしますか?",
|
||||
"mute_modal.you_wont_see_mentions": "宛先に相手が入っている投稿も閲覧できなくなります。",
|
||||
"mute_modal.you_wont_see_posts": "相手はあなたの投稿を今までどおり閲覧できますが、あなたは相手の投稿を閲覧できなくなります。",
|
||||
"navigation_bar.about": "概要",
|
||||
"navigation_bar.advanced_interface": "上級者向けUIに戻る",
|
||||
"navigation_bar.blocks": "ブロックしたユーザー",
|
||||
|
@ -432,6 +471,11 @@
|
|||
"notification.own_poll": "アンケートが終了しました",
|
||||
"notification.poll": "アンケートが終了しました",
|
||||
"notification.reblog": "{name}さんがあなたの投稿をブーストしました",
|
||||
"notification.relationships_severance_event": "{name} との関係が失われました",
|
||||
"notification.relationships_severance_event.account_suspension": "{from} の管理者が {target} さんを停止したため、今後このユーザーとの交流や新しい投稿の受け取りができなくなりました。",
|
||||
"notification.relationships_severance_event.domain_block": "{from} の管理者が {target} をブロックしました。これにより{followersCount}フォロワーと{followingCount, plural, other {#フォロー}}が失われました。",
|
||||
"notification.relationships_severance_event.learn_more": "詳細を確認",
|
||||
"notification.relationships_severance_event.user_domain_block": "{target} のブロックにより{followersCount}フォロワーと{followingCount, plural, other {#フォロー}}が解除されました。",
|
||||
"notification.status": "{name}さんが投稿しました",
|
||||
"notification.update": "{name}さんが投稿を編集しました",
|
||||
"notification_requests.accept": "受け入れる",
|
||||
|
|
|
@ -221,6 +221,7 @@
|
|||
"filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}",
|
||||
"filter_modal.select_filter.search": "Nadi neɣ snulfu-d",
|
||||
"filter_modal.select_filter.title": "Sizdeg tassufeɣt-a",
|
||||
"filter_modal.title.status": "Sizdeg tassufeɣt",
|
||||
"firehose.all": "Akk",
|
||||
"firehose.local": "Deg uqeddac-ayi",
|
||||
"firehose.remote": "Iqeddacen nniḍen",
|
||||
|
@ -335,6 +336,7 @@
|
|||
"mute_modal.show_options": "Sken-d tinefrunin",
|
||||
"mute_modal.title": "Sgugem aseqdac?",
|
||||
"navigation_bar.about": "Ɣef",
|
||||
"navigation_bar.advanced_interface": "Ldi deg ugrudem n web leqqayen",
|
||||
"navigation_bar.blocks": "Iseqdacen yettusḥebsen",
|
||||
"navigation_bar.bookmarks": "Ticraḍ",
|
||||
"navigation_bar.community_timeline": "Tasuddemt tadigant",
|
||||
|
@ -364,6 +366,7 @@
|
|||
"notification.own_poll": "Tafrant-ik·im tfuk",
|
||||
"notification.poll": "Tfukk tefrant ideg tettekkaḍ",
|
||||
"notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
|
||||
"notification.relationships_severance_event.learn_more": "Issin ugar",
|
||||
"notification.status": "{name} akken i d-yessufeɣ",
|
||||
"notification_requests.accept": "Qbel",
|
||||
"notification_requests.dismiss": "Agi",
|
||||
|
@ -372,6 +375,8 @@
|
|||
"notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
|
||||
"notifications.column_settings.alert": "Tilɣa n tnarit",
|
||||
"notifications.column_settings.favourite": "Imenyafen:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Sken-d akk taggayin",
|
||||
"notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib",
|
||||
"notifications.column_settings.follow": "Imeḍfaṛen imaynuten:",
|
||||
"notifications.column_settings.follow_request": "Isuturen imaynuten n teḍfeṛt:",
|
||||
"notifications.column_settings.mention": "Abdar:",
|
||||
|
|
|
@ -297,6 +297,7 @@
|
|||
"filter_modal.select_filter.subtitle": "기존의 카테고리를 사용하거나 새로 하나를 만듧니다",
|
||||
"filter_modal.select_filter.title": "이 게시물을 필터",
|
||||
"filter_modal.title.status": "게시물 필터",
|
||||
"filtered_notifications_banner.mentions": "{count, plural, other {멘션}}",
|
||||
"filtered_notifications_banner.pending_requests": "알 수도 있는 {count, plural, =0 {0 명} one {한 명} other {# 명}}의 사람들로부터의 알림",
|
||||
"filtered_notifications_banner.title": "걸러진 알림",
|
||||
"firehose.all": "모두",
|
||||
|
@ -471,7 +472,11 @@
|
|||
"notification.own_poll": "설문을 마침",
|
||||
"notification.poll": "참여한 설문이 종료됨",
|
||||
"notification.reblog": "{name} 님이 부스트했습니다",
|
||||
"notification.severed_relationships": "{name} 님과의 관계가 단절되었습니다",
|
||||
"notification.relationships_severance_event": "{name} 님과의 연결이 끊어졌습니다",
|
||||
"notification.relationships_severance_event.account_suspension": "{from}의 관리자가 {target}를 정지시켰기 때문에 그들과 더이상 상호작용 할 수 없고 정보를 받아볼 수 없습니다.",
|
||||
"notification.relationships_severance_event.domain_block": "{from}의 관리자가 {target}를 차단하였고 여기에는 나의 {followersCount} 명의 팔로워와 {followingCount, plural, other {#}} 명의 팔로우가 포함되었습니다.",
|
||||
"notification.relationships_severance_event.learn_more": "더 알아보기",
|
||||
"notification.relationships_severance_event.user_domain_block": "내가 {target}를 차단하여 {followersCount} 명의 팔로워와 {followingCount, plural, other {#}} 명의 팔로우가 제거되었습니다.",
|
||||
"notification.status": "{name} 님이 방금 게시물을 올렸습니다",
|
||||
"notification.update": "{name} 님이 게시물을 수정했습니다",
|
||||
"notification_requests.accept": "수락",
|
||||
|
@ -484,6 +489,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "새로운 가입:",
|
||||
"notifications.column_settings.alert": "데스크탑 알림",
|
||||
"notifications.column_settings.favourite": "좋아요:",
|
||||
"notifications.column_settings.filter_bar.advanced": "모든 범주 표시",
|
||||
"notifications.column_settings.filter_bar.category": "빠른 필터 막대",
|
||||
"notifications.column_settings.follow": "새 팔로워:",
|
||||
"notifications.column_settings.follow_request": "새 팔로우 요청:",
|
||||
"notifications.column_settings.mention": "멘션:",
|
||||
|
@ -588,12 +595,6 @@
|
|||
"refresh": "새로고침",
|
||||
"regeneration_indicator.label": "불러오는 중…",
|
||||
"regeneration_indicator.sublabel": "홈 피드를 준비하고 있습니다!",
|
||||
"relationship_severance_notification.purged_data": "관리자에 의해 제거되었습니다",
|
||||
"relationship_severance_notification.relationships": "{count, plural, other {# 건의 관계}}",
|
||||
"relationship_severance_notification.types.account_suspension": "계정이 정지되었습니다",
|
||||
"relationship_severance_notification.types.domain_block": "도메인이 정지되었습니다",
|
||||
"relationship_severance_notification.types.user_domain_block": "내가 이 도메인을 차단했습니다",
|
||||
"relationship_severance_notification.view": "보기",
|
||||
"relative_time.days": "{number}일 전",
|
||||
"relative_time.full.days": "{number} 일 전",
|
||||
"relative_time.full.hours": "{number} 시간 전",
|
||||
|
@ -700,7 +701,7 @@
|
|||
"status.direct": "@{name} 님에게 개인적으로 멘션",
|
||||
"status.direct_indicator": "개인적인 멘션",
|
||||
"status.edit": "수정",
|
||||
"status.edited": "%{date}에 마지막으로 편집됨",
|
||||
"status.edited": "{date}에 마지막으로 편집됨",
|
||||
"status.edited_x_times": "{count}번 수정됨",
|
||||
"status.embed": "임베드",
|
||||
"status.favourite": "좋아요",
|
||||
|
|
|
@ -457,6 +457,8 @@
|
|||
"notification.own_poll": "Tu anketa eskapo",
|
||||
"notification.poll": "Anketa en ke votates eskapo",
|
||||
"notification.reblog": "{name} repartajo tu publikasyon",
|
||||
"notification.relationships_severance_event": "Koneksyones pedridas kon {name}",
|
||||
"notification.relationships_severance_event.learn_more": "Ambezate mas",
|
||||
"notification.status": "{name} publiko algo",
|
||||
"notification.update": "{name} edito una publikasyon",
|
||||
"notification_requests.accept": "Acheta",
|
||||
|
@ -469,6 +471,8 @@
|
|||
"notifications.column_settings.admin.sign_up": "Muevas enrejistrasyones:",
|
||||
"notifications.column_settings.alert": "Avizos de ensimameza",
|
||||
"notifications.column_settings.favourite": "Te plazen:",
|
||||
"notifications.column_settings.filter_bar.advanced": "Amostra todas las kategorias",
|
||||
"notifications.column_settings.filter_bar.category": "Vara de filtrado rapido",
|
||||
"notifications.column_settings.follow": "Muevos suivantes:",
|
||||
"notifications.column_settings.follow_request": "Muevas solisitudes de segimiento:",
|
||||
"notifications.column_settings.mention": "Enmentaduras:",
|
||||
|
@ -571,8 +575,6 @@
|
|||
"refresh": "Arefreska",
|
||||
"regeneration_indicator.label": "Eskargando…",
|
||||
"regeneration_indicator.sublabel": "Tu linya de tiempo prinsipala esta preparando!",
|
||||
"relationship_severance_notification.types.user_domain_block": "Blokates este domeno",
|
||||
"relationship_severance_notification.view": "Mira",
|
||||
"relative_time.days": "{number} d",
|
||||
"relative_time.full.days": "antes {number, plural, one {# diya} other {# diyas}}",
|
||||
"relative_time.full.hours": "antes {number, plural, one {# ora} other {# oras}}",
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue