mirror of
https://github.com/mastodon/mastodon.git
synced 2025-11-27 18:10:58 +00:00
Merge branch 'main' into translate-toots
This commit is contained in:
commit
35596627b0
19
CHANGELOG.md
19
CHANGELOG.md
|
|
@ -6,11 +6,12 @@ All notable changes to this project will be documented in this file.
|
|||
|
||||
### Added
|
||||
|
||||
- **Add support for allowing and authoring quotes** (#35355, #35578, #35614, #35618, #35624, #35626, #35652, #35629, #35665, #35653, #35670, #35677, #35690, #35697, #35689, #35699, #35700, #35701, #35709, #35714, #35713, #35715, #35725, #35749, #35769, #35780, #35762, #35804, #35808, #35805, #35819, #35824, #35828, #35822, #35835, #35865, #35860, #35832, #35891, #35894, #35895, #35820, #35917, #35924, #35925, #35914, #35930, #35941, #35939, #35948, #35955, #35967, #35990, #35991, #35975, #35971, #36002, #35986, #36031, #36034, #36038, #36054, #36052, #36055, #36065, #36068, #36083, #36087, #36080, #36091, #36090, #36118, #36119, #36128, #36094, #36129, #36138, #36132, #36151, #36158, #36171, #36194, #36220, #36169, #36130, #36249, #36153, #36299, #36291, #36301, #36315, #36317, #36364, #36383, #36381, #36459, #36464, and #36461 by @ChaosExAnima, @ClearlyClaire, @Lycolia, @diondiondion, and @tribela)\
|
||||
- **Add support for allowing and authoring quotes** (#35355, #35578, #35614, #35618, #35624, #35626, #35652, #35629, #35665, #35653, #35670, #35677, #35690, #35697, #35689, #35699, #35700, #35701, #35709, #35714, #35713, #35715, #35725, #35749, #35769, #35780, #35762, #35804, #35808, #35805, #35819, #35824, #35828, #35822, #35835, #35865, #35860, #35832, #35891, #35894, #35895, #35820, #35917, #35924, #35925, #35914, #35930, #35941, #35939, #35948, #35955, #35967, #35990, #35991, #35975, #35971, #36002, #35986, #36031, #36034, #36038, #36054, #36052, #36055, #36065, #36068, #36083, #36087, #36080, #36091, #36090, #36118, #36119, #36128, #36094, #36129, #36138, #36132, #36151, #36158, #36171, #36194, #36220, #36169, #36130, #36249, #36153, #36299, #36291, #36301, #36315, #36317, #36364, #36383, #36381, #36459, #36464, #36461, #36516 and #36528 by @ChaosExAnima, @ClearlyClaire, @Lycolia, @diondiondion, and @tribela)\
|
||||
This includes a revamp of the composer interface.\
|
||||
See https://blog.joinmastodon.org/2025/09/introducing-quote-posts/ for a user-centric overview of the feature, and https://docs.joinmastodon.org/client/quotes/ for API documentation.
|
||||
- **Add support for fetching and refreshing replies to the web UI** (#35210, #35496, #35575, #35500, #35577, #35602, #35603, #35654, #36141, #36237, #36172, #36256, #36271, #36334, #36382, and #36239 by @ClearlyClaire, @Gargron, and @diondiondion)
|
||||
- **Add support for fetching and refreshing replies to the web UI** (#35210, #35496, #35575, #35500, #35577, #35602, #35603, #35654, #36141, #36237, #36172, #36256, #36271, #36334, #36382, #36239, #36484 and #36481 by @ClearlyClaire, @Gargron, and @diondiondion)
|
||||
- **Add ability to block words in usernames** (#35407, #35655, and #35806 by @ClearlyClaire and @Gargron)
|
||||
- Add support for displaying of quote posts in Moderator UI (#35964 by @ThisIsMissEm)
|
||||
- Add support for displaying link previews for Admin UI (#35958 by @ThisIsMissEm)
|
||||
- Add support for dynamic viewport height (#36272 by @e1berd)
|
||||
- Add support for numeric-based URIs for new local accounts (#32724, #36304, #36316, and #36365 by @ClearlyClaire)
|
||||
|
|
@ -26,18 +27,20 @@ All notable changes to this project will be documented in this file.
|
|||
- Add delivery failure tracking and handling to FASP jobs (#35625, #35628, and #35723 by @oneiros)
|
||||
- Add example of quote post with a preview card to development sample data (#35616 by @ClearlyClaire)
|
||||
- Add second set of blocked text that applies to accounts regardless of account age for spam-blocking (#35563 by @ClearlyClaire)
|
||||
- Add experimental feature to select custom emoji rendering (#35229, #35282, #35253, #35424, #35473, #35483, #35505, #35568, #35605, #35659, #35664, #35739, #35985, #36051, #36071, #36137, #36165, #36248, #36262, #36275, #36293, #36341, #36342, #36366, #36377, #36378, #36385, #36393, #36397, #36403, #36413, #36410, #36454, and #36402 by @ChaosExAnima and @braddunbar)\
|
||||
- Added emoji from Twemoji v16 (#36501 and #36530 by @ChaosExAnima)
|
||||
- Add experimental feature to select custom emoji rendering (#35229, #35282, #35253, #35424, #35473, #35483, #35505, #35568, #35605, #35659, #35664, #35739, #35985, #36051, #36071, #36137, #36165, #36248, #36262, #36275, #36293, #36341, #36342, #36366, #36377, #36378, #36385, #36393, #36397, #36403, #36413, #36410, #36454, #36402, #36503, #36502 and #36532 by @ChaosExAnima and @braddunbar)\
|
||||
This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places.
|
||||
|
||||
### Changed
|
||||
|
||||
- Change confirmation dialogs for follow button actions “unfollow”, “unblock”, and “withdraw request” (#36289 by @diondiondion)
|
||||
- Change “Follow” button labels (#36264 by @diondiondion)
|
||||
- Change appearance settings to introduce new Advanced settings section (#36496 and #36506 by @diondiondion)
|
||||
- Change display of content warnings in Admin UI (#35935 by @ThisIsMissEm)
|
||||
- Change index on `follows` table to improve performance of some queries (#36374 by @ClearlyClaire)
|
||||
- Change links to accounts in settings and moderation views to link to local view unless account is suspended (#36340 by @diondiondion)
|
||||
- Change redirection for denied registration from web app to sign-in page with error message (#36384 by @ClearlyClaire)
|
||||
- Change `timeline_preview` setting into four more granular settings (#36338 and #36467 by @ClearlyClaire)
|
||||
- Change `timeline_preview` setting into four more granular settings (#36338, #36467 and #36497 by @ClearlyClaire)
|
||||
- Change wording and design of interaction dialog to simplify it (#36124 by @diondiondion)
|
||||
- Change dropdown menus to allow disabled items to be focused (#36078 by @diondiondion)
|
||||
- Change modal background colours in light mode (#36069 by @diondiondion)
|
||||
|
|
@ -49,9 +52,11 @@ All notable changes to this project will be documented in this file.
|
|||
- Change auditable accounts to be sorted by username in admin action logs interface (#35272 by @breadtk)
|
||||
- Change order of translation restoration and service credit on post card (#33619 by @colindean)
|
||||
- Change position of ‘add more’ to be inside table toolbar on reports (#35963 by @ThisIsMissEm)
|
||||
- Change docker-compose.yml sidekiq health check to work for both 4.4 and 4.5 (#36498 by @ClearlyClaire)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix relationship not being fetched to evaluate whether to show a quote post (#36517 by @ClearlyClaire)
|
||||
- Fix rendering of poll options in status history modal (#35633 by @ThisIsMissEm)
|
||||
- Fix “mute” button being displayed to unauthenticated visitors in hashtag dropdown (#36353 by @mkljczk)
|
||||
- Fix overflow handling of `.more-from-author` (#36310 by @edent)
|
||||
|
|
@ -76,6 +81,12 @@ All notable changes to this project will be documented in this file.
|
|||
- Fix glitchy status keyboard navigation (#35455 and #35504 by @diondiondion)
|
||||
- Fix post being submitted when pressing “Enter” in the CW field (#35445 by @diondiondion)
|
||||
|
||||
## [4.4.8] - 2025-10-21
|
||||
|
||||
### Security
|
||||
|
||||
- Fix quote control bypass ([GHSA-8h43-rcqj-wpc6](https://github.com/mastodon/mastodon/security/advisories/GHSA-8h43-rcqj-wpc6))
|
||||
|
||||
## [4.4.7] - 2025-10-15
|
||||
|
||||
### Fixed
|
||||
|
|
|
|||
|
|
@ -14,9 +14,9 @@ ARG BASE_REGISTRY="docker.io"
|
|||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.4.x"]
|
||||
# renovate: datasource=docker depName=docker.io/ruby
|
||||
ARG RUBY_VERSION="3.4.7"
|
||||
# # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||
# # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="22"]
|
||||
# renovate: datasource=node-version depName=node
|
||||
ARG NODE_MAJOR_VERSION="22"
|
||||
ARG NODE_MAJOR_VERSION="24"
|
||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"]
|
||||
ARG DEBIAN_VERSION="trixie"
|
||||
# Node.js image to use for base image based on combined variables (ex: 20-trixie-slim)
|
||||
|
|
|
|||
26
Gemfile
26
Gemfile
|
|
@ -106,19 +106,19 @@ gem 'opentelemetry-api', '~> 1.7.0'
|
|||
|
||||
group :opentelemetry do
|
||||
gem 'opentelemetry-exporter-otlp', '~> 0.31.0', require: false
|
||||
gem 'opentelemetry-instrumentation-active_job', '~> 0.9.0', require: false
|
||||
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.23.0', require: false
|
||||
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.23.0', require: false
|
||||
gem 'opentelemetry-instrumentation-excon', '~> 0.25.0', require: false
|
||||
gem 'opentelemetry-instrumentation-faraday', '~> 0.29.0', require: false
|
||||
gem 'opentelemetry-instrumentation-http', '~> 0.26.0', require: false
|
||||
gem 'opentelemetry-instrumentation-http_client', '~> 0.25.0', require: false
|
||||
gem 'opentelemetry-instrumentation-net_http', '~> 0.25.0', require: false
|
||||
gem 'opentelemetry-instrumentation-pg', '~> 0.31.0', require: false
|
||||
gem 'opentelemetry-instrumentation-rack', '~> 0.28.0', require: false
|
||||
gem 'opentelemetry-instrumentation-rails', '~> 0.38.0', require: false
|
||||
gem 'opentelemetry-instrumentation-redis', '~> 0.27.0', require: false
|
||||
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.27.0', require: false
|
||||
gem 'opentelemetry-instrumentation-active_job', '~> 0.10.0', require: false
|
||||
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.24.0', require: false
|
||||
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.24.0', require: false
|
||||
gem 'opentelemetry-instrumentation-excon', '~> 0.26.0', require: false
|
||||
gem 'opentelemetry-instrumentation-faraday', '~> 0.30.0', require: false
|
||||
gem 'opentelemetry-instrumentation-http', '~> 0.27.0', require: false
|
||||
gem 'opentelemetry-instrumentation-http_client', '~> 0.26.0', require: false
|
||||
gem 'opentelemetry-instrumentation-net_http', '~> 0.26.0', require: false
|
||||
gem 'opentelemetry-instrumentation-pg', '~> 0.32.0', require: false
|
||||
gem 'opentelemetry-instrumentation-rack', '~> 0.29.0', require: false
|
||||
gem 'opentelemetry-instrumentation-rails', '~> 0.39.0', require: false
|
||||
gem 'opentelemetry-instrumentation-redis', '~> 0.28.0', require: false
|
||||
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.28.0', require: false
|
||||
gem 'opentelemetry-sdk', '~> 1.4', require: false
|
||||
end
|
||||
|
||||
|
|
|
|||
145
Gemfile.lock
145
Gemfile.lock
|
|
@ -426,7 +426,8 @@ GEM
|
|||
loofah (2.24.1)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
mail (2.8.1)
|
||||
mail (2.9.0)
|
||||
logger
|
||||
mini_mime (>= 0.1.1)
|
||||
net-imap
|
||||
net-pop
|
||||
|
|
@ -498,74 +499,74 @@ GEM
|
|||
tzinfo
|
||||
validate_url
|
||||
webfinger (~> 2.0)
|
||||
openssl (3.3.1)
|
||||
openssl (3.3.2)
|
||||
openssl-signature_algorithm (1.3.0)
|
||||
openssl (> 2.0)
|
||||
opentelemetry-api (1.7.0)
|
||||
opentelemetry-common (0.23.0)
|
||||
opentelemetry-api (~> 1.0)
|
||||
opentelemetry-exporter-otlp (0.31.0)
|
||||
opentelemetry-exporter-otlp (0.31.1)
|
||||
google-protobuf (>= 3.18)
|
||||
googleapis-common-protos-types (~> 1.3)
|
||||
opentelemetry-api (~> 1.1)
|
||||
opentelemetry-common (~> 0.20)
|
||||
opentelemetry-sdk (~> 1.2)
|
||||
opentelemetry-sdk (~> 1.10)
|
||||
opentelemetry-semantic_conventions
|
||||
opentelemetry-helpers-sql (0.2.0)
|
||||
opentelemetry-api (~> 1.7)
|
||||
opentelemetry-helpers-sql-obfuscation (0.3.0)
|
||||
opentelemetry-helpers-sql-obfuscation (0.4.0)
|
||||
opentelemetry-common (~> 0.21)
|
||||
opentelemetry-instrumentation-action_mailer (0.5.0)
|
||||
opentelemetry-instrumentation-active_support (~> 0.7)
|
||||
opentelemetry-instrumentation-action_pack (0.14.1)
|
||||
opentelemetry-instrumentation-rack (~> 0.21)
|
||||
opentelemetry-instrumentation-action_view (0.10.0)
|
||||
opentelemetry-instrumentation-active_support (~> 0.7)
|
||||
opentelemetry-instrumentation-active_job (0.9.2)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-active_model_serializers (0.23.0)
|
||||
opentelemetry-instrumentation-action_mailer (0.6.1)
|
||||
opentelemetry-instrumentation-active_support (~> 0.10)
|
||||
opentelemetry-instrumentation-action_pack (0.15.1)
|
||||
opentelemetry-instrumentation-rack (~> 0.29)
|
||||
opentelemetry-instrumentation-action_view (0.11.1)
|
||||
opentelemetry-instrumentation-active_support (~> 0.10)
|
||||
opentelemetry-instrumentation-active_job (0.10.1)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-active_model_serializers (0.24.0)
|
||||
opentelemetry-instrumentation-active_support (>= 0.7.0)
|
||||
opentelemetry-instrumentation-active_record (0.10.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-active_storage (0.2.0)
|
||||
opentelemetry-instrumentation-active_support (~> 0.7)
|
||||
opentelemetry-instrumentation-active_support (0.9.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-base (0.24.0)
|
||||
opentelemetry-instrumentation-active_record (0.11.1)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-active_storage (0.3.1)
|
||||
opentelemetry-instrumentation-active_support (~> 0.10)
|
||||
opentelemetry-instrumentation-active_support (0.10.1)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-base (0.25.0)
|
||||
opentelemetry-api (~> 1.7)
|
||||
opentelemetry-common (~> 0.21)
|
||||
opentelemetry-registry (~> 0.1)
|
||||
opentelemetry-instrumentation-concurrent_ruby (0.23.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-excon (0.25.2)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-faraday (0.29.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-http (0.26.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-http_client (0.25.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-net_http (0.25.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-pg (0.31.1)
|
||||
opentelemetry-instrumentation-concurrent_ruby (0.24.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-excon (0.26.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-faraday (0.30.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-http (0.27.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-http_client (0.26.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-net_http (0.26.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-pg (0.32.0)
|
||||
opentelemetry-helpers-sql
|
||||
opentelemetry-helpers-sql-obfuscation
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-rack (0.28.2)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-rails (0.38.0)
|
||||
opentelemetry-instrumentation-action_mailer (~> 0.4)
|
||||
opentelemetry-instrumentation-action_pack (~> 0.13)
|
||||
opentelemetry-instrumentation-action_view (~> 0.9)
|
||||
opentelemetry-instrumentation-active_job (~> 0.8)
|
||||
opentelemetry-instrumentation-active_record (~> 0.9)
|
||||
opentelemetry-instrumentation-active_storage (~> 0.1)
|
||||
opentelemetry-instrumentation-active_support (~> 0.8)
|
||||
opentelemetry-instrumentation-concurrent_ruby (~> 0.22)
|
||||
opentelemetry-instrumentation-redis (0.27.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-sidekiq (0.27.1)
|
||||
opentelemetry-instrumentation-base (~> 0.24)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-rack (0.29.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-rails (0.39.1)
|
||||
opentelemetry-instrumentation-action_mailer (~> 0.6)
|
||||
opentelemetry-instrumentation-action_pack (~> 0.15)
|
||||
opentelemetry-instrumentation-action_view (~> 0.11)
|
||||
opentelemetry-instrumentation-active_job (~> 0.10)
|
||||
opentelemetry-instrumentation-active_record (~> 0.11)
|
||||
opentelemetry-instrumentation-active_storage (~> 0.3)
|
||||
opentelemetry-instrumentation-active_support (~> 0.10)
|
||||
opentelemetry-instrumentation-concurrent_ruby (~> 0.23)
|
||||
opentelemetry-instrumentation-redis (0.28.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-instrumentation-sidekiq (0.28.0)
|
||||
opentelemetry-instrumentation-base (~> 0.25)
|
||||
opentelemetry-registry (0.4.0)
|
||||
opentelemetry-api (~> 1.1)
|
||||
opentelemetry-sdk (1.10.0)
|
||||
|
|
@ -603,7 +604,7 @@ GEM
|
|||
net-smtp
|
||||
premailer (~> 1.7, >= 1.7.9)
|
||||
prettyprint (0.2.0)
|
||||
prism (1.5.1)
|
||||
prism (1.5.2)
|
||||
prometheus_exporter (2.3.0)
|
||||
webrick
|
||||
propshaft (1.3.1)
|
||||
|
|
@ -614,14 +615,14 @@ GEM
|
|||
date
|
||||
stringio
|
||||
public_suffix (6.0.2)
|
||||
puma (7.0.4)
|
||||
puma (7.1.0)
|
||||
nio4r (~> 2.0)
|
||||
pundit (2.5.2)
|
||||
activesupport (>= 3.0.0)
|
||||
raabro (1.4.0)
|
||||
racc (1.8.1)
|
||||
rack (3.2.3)
|
||||
rack-attack (6.7.0)
|
||||
rack-attack (6.8.0)
|
||||
rack (>= 1.0, < 4)
|
||||
rack-cors (3.0.0)
|
||||
logger
|
||||
|
|
@ -744,7 +745,7 @@ GEM
|
|||
rspec-mocks (~> 3.0)
|
||||
sidekiq (>= 5, < 9)
|
||||
rspec-support (3.13.6)
|
||||
rubocop (1.81.1)
|
||||
rubocop (1.81.6)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (~> 3.17.0.2)
|
||||
lint_roller (~> 1.1.0)
|
||||
|
|
@ -764,10 +765,10 @@ GEM
|
|||
rubocop-i18n (3.2.3)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop (>= 1.72.1)
|
||||
rubocop-performance (1.26.0)
|
||||
rubocop-performance (1.26.1)
|
||||
lint_roller (~> 1.1)
|
||||
rubocop (>= 1.75.0, < 2.0)
|
||||
rubocop-ast (>= 1.44.0, < 2.0)
|
||||
rubocop-ast (>= 1.47.1, < 2.0)
|
||||
rubocop-rails (2.33.4)
|
||||
activesupport (>= 4.2.0)
|
||||
lint_roller (~> 1.1)
|
||||
|
|
@ -790,7 +791,7 @@ GEM
|
|||
ruby-vips (2.2.5)
|
||||
ffi (~> 1.12)
|
||||
logger
|
||||
rubyzip (3.1.1)
|
||||
rubyzip (3.2.1)
|
||||
rufus-scheduler (3.9.2)
|
||||
fugit (~> 1.1, >= 1.11.1)
|
||||
safety_net_attestation (0.5.0)
|
||||
|
|
@ -834,7 +835,7 @@ GEM
|
|||
stackprof (0.2.27)
|
||||
starry (0.2.0)
|
||||
base64
|
||||
stoplight (5.3.8)
|
||||
stoplight (5.4.0)
|
||||
zeitwerk
|
||||
stringio (3.1.7)
|
||||
strong_migrations (2.5.1)
|
||||
|
|
@ -898,7 +899,7 @@ GEM
|
|||
zeitwerk (~> 2.2)
|
||||
warden (1.2.9)
|
||||
rack (>= 2.0.9)
|
||||
webauthn (3.4.2)
|
||||
webauthn (3.4.3)
|
||||
android_key_attestation (~> 0.3.0)
|
||||
bindata (~> 2.4)
|
||||
cbor (~> 0.5.9)
|
||||
|
|
@ -1009,19 +1010,19 @@ DEPENDENCIES
|
|||
omniauth_openid_connect (~> 0.8.0)
|
||||
opentelemetry-api (~> 1.7.0)
|
||||
opentelemetry-exporter-otlp (~> 0.31.0)
|
||||
opentelemetry-instrumentation-active_job (~> 0.9.0)
|
||||
opentelemetry-instrumentation-active_model_serializers (~> 0.23.0)
|
||||
opentelemetry-instrumentation-concurrent_ruby (~> 0.23.0)
|
||||
opentelemetry-instrumentation-excon (~> 0.25.0)
|
||||
opentelemetry-instrumentation-faraday (~> 0.29.0)
|
||||
opentelemetry-instrumentation-http (~> 0.26.0)
|
||||
opentelemetry-instrumentation-http_client (~> 0.25.0)
|
||||
opentelemetry-instrumentation-net_http (~> 0.25.0)
|
||||
opentelemetry-instrumentation-pg (~> 0.31.0)
|
||||
opentelemetry-instrumentation-rack (~> 0.28.0)
|
||||
opentelemetry-instrumentation-rails (~> 0.38.0)
|
||||
opentelemetry-instrumentation-redis (~> 0.27.0)
|
||||
opentelemetry-instrumentation-sidekiq (~> 0.27.0)
|
||||
opentelemetry-instrumentation-active_job (~> 0.10.0)
|
||||
opentelemetry-instrumentation-active_model_serializers (~> 0.24.0)
|
||||
opentelemetry-instrumentation-concurrent_ruby (~> 0.24.0)
|
||||
opentelemetry-instrumentation-excon (~> 0.26.0)
|
||||
opentelemetry-instrumentation-faraday (~> 0.30.0)
|
||||
opentelemetry-instrumentation-http (~> 0.27.0)
|
||||
opentelemetry-instrumentation-http_client (~> 0.26.0)
|
||||
opentelemetry-instrumentation-net_http (~> 0.26.0)
|
||||
opentelemetry-instrumentation-pg (~> 0.32.0)
|
||||
opentelemetry-instrumentation-rack (~> 0.29.0)
|
||||
opentelemetry-instrumentation-rails (~> 0.39.0)
|
||||
opentelemetry-instrumentation-redis (~> 0.28.0)
|
||||
opentelemetry-instrumentation-sidekiq (~> 0.28.0)
|
||||
opentelemetry-sdk (~> 1.4)
|
||||
ox (~> 2.14)
|
||||
parslet
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ Mastodon is a **free, open-source social network server** based on [ActivityPub]
|
|||
### Requirements
|
||||
|
||||
- **Ruby** 3.2+
|
||||
- **PostgreSQL** 13+
|
||||
- **PostgreSQL** 14+
|
||||
- **Redis** 7.0+
|
||||
- **Node.js** 20+
|
||||
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ class Api::V1::StatusesController < Api::BaseController
|
|||
end
|
||||
|
||||
def set_quoted_status
|
||||
@quoted_status = Status.find(status_params[:quoted_status_id]) if status_params[:quoted_status_id].present?
|
||||
@quoted_status = Status.find(status_params[:quoted_status_id])&.proper if status_params[:quoted_status_id].present?
|
||||
authorize(@quoted_status, :quote?) if @quoted_status.present?
|
||||
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
|
||||
# TODO: distinguish between non-existing and non-quotable posts
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
def material_symbol(icon, attributes = {})
|
||||
whitespace = attributes.delete(:whitespace) { true }
|
||||
safe_join(
|
||||
[
|
||||
inline_svg_tag(
|
||||
|
|
@ -121,7 +122,7 @@ module ApplicationHelper
|
|||
role: :img,
|
||||
data: attributes[:data]
|
||||
),
|
||||
' ',
|
||||
whitespace ? ' ' : '',
|
||||
]
|
||||
)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -46,6 +46,14 @@ module StatusesHelper
|
|||
status.preloadable_poll.options.map { |o| "[ ] #{o}" }.join("\n")
|
||||
end
|
||||
|
||||
def status_classnames(status, is_quote)
|
||||
if is_quote
|
||||
'status--is-quote'
|
||||
elsif status.quote.present?
|
||||
'status--has-quote'
|
||||
end
|
||||
end
|
||||
|
||||
def status_description(status)
|
||||
components = [[media_summary(status), status_text_summary(status)].compact_blank.join(' · ')]
|
||||
|
||||
|
|
|
|||
|
|
@ -622,6 +622,7 @@ export function fetchComposeSuggestions(token) {
|
|||
fetchComposeSuggestionsEmojis(dispatch, getState, token);
|
||||
break;
|
||||
case '#':
|
||||
case '#':
|
||||
fetchComposeSuggestionsTags(dispatch, getState, token);
|
||||
break;
|
||||
default:
|
||||
|
|
@ -663,11 +664,11 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
|
|||
|
||||
dispatch(useEmoji(suggestion));
|
||||
} else if (suggestion.type === 'hashtag') {
|
||||
completion = `#${suggestion.name}`;
|
||||
startPosition = position - 1;
|
||||
completion = suggestion.name.slice(token.length - 1);
|
||||
startPosition = position + token.length;
|
||||
} else if (suggestion.type === 'account') {
|
||||
completion = getState().getIn(['accounts', suggestion.id, 'acct']);
|
||||
startPosition = position;
|
||||
completion = `@${getState().getIn(['accounts', suggestion.id, 'acct'])}`;
|
||||
startPosition = position - 1;
|
||||
}
|
||||
|
||||
// We don't want to replace hashtags that vary only in case due to accessibility, but we need to fire off an event so that
|
||||
|
|
@ -727,7 +728,7 @@ function insertIntoTagHistory(recognizedTags, text) {
|
|||
// complicated because of new normalization rules, it's no longer just
|
||||
// a case sensitivity issue
|
||||
const names = recognizedTags.map(tag => {
|
||||
const matches = text.match(new RegExp(`#${tag.name}`, 'i'));
|
||||
const matches = text.match(new RegExp(`[##]${tag.name}`, 'i'));
|
||||
|
||||
if (matches && matches.length > 0) {
|
||||
return matches[0].slice(1);
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
|||
|
||||
static defaultProps = {
|
||||
autoFocus: true,
|
||||
searchTokens: ['@', ':', '#'],
|
||||
searchTokens: ['@', '@', ':', '#', '#'],
|
||||
};
|
||||
|
||||
state = {
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ const textAtCursorMatchesToken = (str, caretPosition) => {
|
|||
word = str.slice(left, right + caretPosition);
|
||||
}
|
||||
|
||||
if (!word || word.trim().length < 3 || ['@', ':', '#'].indexOf(word[0]) === -1) {
|
||||
if (!word || word.trim().length < 3 || ['@', '@', ':', '#', '#'].indexOf(word[0]) === -1) {
|
||||
return [null, null];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ export const AnimateEmojiProvider = polymorphicForwardRef<
|
|||
|
||||
// If there's a parent context or GIFs autoplay, we don't need handlers.
|
||||
const parentContext = useContext(AnimateEmojiContext);
|
||||
if (parentContext !== null || autoPlayGif === true) {
|
||||
if (parentContext !== null) {
|
||||
return (
|
||||
<Wrapper
|
||||
{...props}
|
||||
|
|
|
|||
|
|
@ -139,24 +139,24 @@ export const Default = {
|
|||
Last pressed hotkey: <output>{matchedHotkey ?? 'None'}</output>
|
||||
</p>
|
||||
<p>
|
||||
Click within the dashed border and press the "<kbd>n</kbd>
|
||||
" or "<kbd>/</kbd>" key. Press "
|
||||
<kbd>Backspace</kbd>" to clear the displayed hotkey.
|
||||
Click within the dashed border and press the <kbd>n</kbd>
|
||||
or <kbd>/</kbd> key. Press
|
||||
<kbd>Backspace</kbd> to clear the displayed hotkey.
|
||||
</p>
|
||||
<p>
|
||||
Try typing a sequence, like "<kbd>g</kbd>" shortly
|
||||
followed by "<kbd>h</kbd>", "<kbd>n</kbd>", or
|
||||
"<kbd>f</kbd>"
|
||||
Try typing a sequence, like <kbd>g</kbd> shortly followed by{' '}
|
||||
<kbd>h</kbd>, <kbd>n</kbd>, or
|
||||
<kbd>f</kbd>
|
||||
</p>
|
||||
<p>
|
||||
Note that this playground doesn't support all hotkeys we use in
|
||||
the app.
|
||||
</p>
|
||||
<p>
|
||||
When a <button>Button</button> is focused, "
|
||||
When a <button>Button</button> is focused,
|
||||
<kbd>Enter</kbd>
|
||||
" should not trigger "open", but "<kbd>o</kbd>
|
||||
" should.
|
||||
should not trigger open, but <kbd>o</kbd>
|
||||
should.
|
||||
</p>
|
||||
<p>
|
||||
When an input element is focused, hotkeys should not interfere with
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { useCallback, useMemo } from 'react';
|
||||
import type { FC, KeyboardEvent, MouseEvent } from 'react';
|
||||
import type { FC, KeyboardEvent, MouseEvent, MouseEventHandler } from 'react';
|
||||
|
||||
import { useIntl } from 'react-intl';
|
||||
|
||||
|
|
@ -8,6 +8,7 @@ import classNames from 'classnames';
|
|||
import { quoteComposeById } from '@/mastodon/actions/compose_typed';
|
||||
import { toggleReblog } from '@/mastodon/actions/interactions';
|
||||
import { openModal } from '@/mastodon/actions/modal';
|
||||
import { quickBoosting } from '@/mastodon/initial_state';
|
||||
import type { ActionMenuItem } from '@/mastodon/models/dropdown_menu';
|
||||
import type { Status } from '@/mastodon/models/status';
|
||||
import { useAppDispatch, useAppSelector } from '@/mastodon/store';
|
||||
|
|
@ -24,6 +25,55 @@ import {
|
|||
selectStatusState,
|
||||
} from './boost_button_utils';
|
||||
|
||||
const StandaloneBoostButton: FC<ReblogButtonProps> = ({ status, counters }) => {
|
||||
const intl = useIntl();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const statusState = useAppSelector((state) =>
|
||||
selectStatusState(state, status),
|
||||
);
|
||||
const { title, meta, iconComponent, disabled } = useMemo(
|
||||
() => boostItemState(statusState),
|
||||
[statusState],
|
||||
);
|
||||
|
||||
const handleClick: MouseEventHandler = useCallback(
|
||||
(event) => {
|
||||
if (statusState.isLoggedIn) {
|
||||
dispatch(toggleReblog(status.get('id') as string, event.shiftKey));
|
||||
} else {
|
||||
dispatch(
|
||||
openModal({
|
||||
modalType: 'INTERACTION',
|
||||
modalProps: {
|
||||
accountId: status.getIn(['account', 'id']),
|
||||
url: status.get('uri'),
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
},
|
||||
[dispatch, status, statusState.isLoggedIn],
|
||||
);
|
||||
|
||||
return (
|
||||
<IconButton
|
||||
disabled={disabled}
|
||||
active={!!status.get('reblogged')}
|
||||
title={intl.formatMessage(meta ?? title)}
|
||||
icon='retweet'
|
||||
iconComponent={iconComponent}
|
||||
onClick={!disabled ? handleClick : undefined}
|
||||
counter={
|
||||
counters
|
||||
? (status.get('reblogs_count') as number) +
|
||||
(status.get('quotes_count') as number)
|
||||
: undefined
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const renderMenuItem: RenderItemFn<ActionMenuItem> = (
|
||||
item,
|
||||
index,
|
||||
|
|
@ -46,7 +96,7 @@ interface ReblogButtonProps {
|
|||
|
||||
type ActionMenuItemWithIcon = SomeRequired<ActionMenuItem, 'icon'>;
|
||||
|
||||
export const BoostButton: FC<ReblogButtonProps> = ({ status, counters }) => {
|
||||
const BoostOrQuoteMenu: FC<ReblogButtonProps> = ({ status, counters }) => {
|
||||
const intl = useIntl();
|
||||
const dispatch = useAppDispatch();
|
||||
const statusState = useAppSelector((state) =>
|
||||
|
|
@ -188,3 +238,9 @@ const ReblogMenuItem: FC<ReblogMenuItemProps> = ({
|
|||
</li>
|
||||
);
|
||||
};
|
||||
|
||||
// Switch between the standalone boost button or the
|
||||
// "Boost or quote" menu based on the quickBoosting preference
|
||||
export const BoostButton = quickBoosting
|
||||
? StandaloneBoostButton
|
||||
: BoostOrQuoteMenu;
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ export const HandledLink: FC<HandledLinkProps & ComponentProps<'a'>> = ({
|
|||
{children}
|
||||
</Link>
|
||||
);
|
||||
} else if ((text.startsWith('@') || prevText?.endsWith('@')) && mention) {
|
||||
} else if (mention) {
|
||||
// Handle mentions
|
||||
return (
|
||||
<Link
|
||||
|
|
|
|||
|
|
@ -20,11 +20,12 @@ import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/
|
|||
import { WithRouterPropTypes } from 'mastodon/utils/react_router';
|
||||
|
||||
import { Dropdown } from 'mastodon/components/dropdown_menu';
|
||||
import { me } from '../../initial_state';
|
||||
import { me, quickBoosting } from '../../initial_state';
|
||||
|
||||
import { IconButton } from '../icon_button';
|
||||
import { BoostButton } from '../status/boost_button';
|
||||
import { RemoveQuoteHint } from './remove_quote_hint';
|
||||
import { quoteItemState, selectStatusState } from '../status/boost_button_utils';
|
||||
|
||||
const messages = defineMessages({
|
||||
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
||||
|
|
@ -68,6 +69,7 @@ const mapStateToProps = (state, { status }) => {
|
|||
return ({
|
||||
relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
|
||||
quotedAccountId: quotedStatusId ? state.getIn(['statuses', quotedStatusId, 'account']) : null,
|
||||
statusQuoteState: selectStatusState(state, status),
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -76,6 +78,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
identity: identityContextPropShape,
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
relationship: ImmutablePropTypes.record,
|
||||
statusQuoteState: PropTypes.object,
|
||||
quotedAccountId: PropTypes.string,
|
||||
contextType: PropTypes.string,
|
||||
onReply: PropTypes.func,
|
||||
|
|
@ -125,6 +128,10 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
}
|
||||
};
|
||||
|
||||
handleQuoteClick = () => {
|
||||
this.props.onQuote(this.props.status);
|
||||
};
|
||||
|
||||
handleShareClick = () => {
|
||||
navigator.share({
|
||||
url: this.props.status.get('url'),
|
||||
|
|
@ -241,7 +248,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
};
|
||||
|
||||
render () {
|
||||
const { status, relationship, quotedAccountId, contextType, intl, withDismiss, withCounters, scrollKey } = this.props;
|
||||
const { status, relationship, statusQuoteState, quotedAccountId, contextType, intl, withDismiss, withCounters, scrollKey } = this.props;
|
||||
const { signedIn, permissions } = this.props.identity;
|
||||
|
||||
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
|
||||
|
|
@ -270,6 +277,19 @@ class StatusActionBar extends ImmutablePureComponent {
|
|||
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
|
||||
}
|
||||
|
||||
if (quickBoosting && signedIn) {
|
||||
const quoteItem = quoteItemState(statusQuoteState);
|
||||
menu.push(null);
|
||||
menu.push({
|
||||
text: intl.formatMessage(quoteItem.title),
|
||||
description: quoteItem.meta
|
||||
? intl.formatMessage(quoteItem.meta)
|
||||
: undefined,
|
||||
disabled: quoteItem.disabled,
|
||||
action: this.handleQuoteClick,
|
||||
});
|
||||
}
|
||||
|
||||
if (signedIn) {
|
||||
menu.push(null);
|
||||
|
||||
|
|
|
|||
|
|
@ -76,6 +76,17 @@ const mapStateToProps = state => ({
|
|||
languages: supportsTranslator ? new Map() : state.getIn(['server', 'translationLanguages', 'items']),
|
||||
});
|
||||
|
||||
const compareUrls = (href1, href2) => {
|
||||
try {
|
||||
const url1 = new URL(href1);
|
||||
const url2 = new URL(href2);
|
||||
|
||||
return url1.origin === url2.origin && url1.path === url2.path && url1.search === url2.search;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class StatusContent extends PureComponent {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
|
@ -139,7 +150,7 @@ class StatusContent extends PureComponent {
|
|||
|
||||
link.classList.add('status-link');
|
||||
|
||||
mention = this.props.status.get('mentions').find(item => link.href === item.get('url'));
|
||||
mention = this.props.status.get('mentions').find(item => compareUrls(link, item.get('url')));
|
||||
|
||||
if (mention) {
|
||||
link.addEventListener('click', this.onMentionClick.bind(this, mention), false);
|
||||
|
|
@ -275,7 +286,7 @@ class StatusContent extends PureComponent {
|
|||
|
||||
handleElement = (element, { key, ...props }, children) => {
|
||||
if (element instanceof HTMLAnchorElement) {
|
||||
const mention = this.props.status.get('mentions').find(item => element.href === item.get('url'));
|
||||
const mention = this.props.status.get('mentions').find(item => compareUrls(element.href, item.get('url')));
|
||||
return (
|
||||
<HandledLink
|
||||
{...props}
|
||||
|
|
@ -288,7 +299,7 @@ class StatusContent extends PureComponent {
|
|||
{children}
|
||||
</HandledLink>
|
||||
);
|
||||
} else if (element instanceof HTMLParagraphElement && element.classList.contains('quote-inline')) {
|
||||
} else if (element.classList.contains('quote-inline')) {
|
||||
return null;
|
||||
}
|
||||
return undefined;
|
||||
|
|
@ -335,7 +346,7 @@ class StatusContent extends PureComponent {
|
|||
lang={language}
|
||||
htmlString={content}
|
||||
extraEmojis={status.get('emojis')}
|
||||
onElement={this.handleElement.bind(this)}
|
||||
onElement={this.handleElement}
|
||||
/>
|
||||
|
||||
{poll}
|
||||
|
|
@ -353,7 +364,7 @@ class StatusContent extends PureComponent {
|
|||
lang={language}
|
||||
htmlString={content}
|
||||
extraEmojis={status.get('emojis')}
|
||||
onElement={this.handleElement.bind(this)}
|
||||
onElement={this.handleElement}
|
||||
/>
|
||||
|
||||
{poll}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import type { Status } from 'mastodon/models/status';
|
|||
import type { RootState } from 'mastodon/store';
|
||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||
|
||||
import { fetchRelationships } from '../actions/accounts';
|
||||
import { revealAccount } from '../actions/accounts_typed';
|
||||
import { fetchStatus } from '../actions/statuses';
|
||||
import { makeGetStatusWithExtraInfo } from '../selectors';
|
||||
|
|
@ -148,6 +149,10 @@ export const QuotedStatus: React.FC<QuotedStatusProps> = ({
|
|||
}
|
||||
}, [shouldFetchQuote, quotedStatusId, parentQuotePostId, dispatch]);
|
||||
|
||||
useEffect(() => {
|
||||
if (accountId && hiddenAccount) dispatch(fetchRelationships([accountId]));
|
||||
}, [accountId, hiddenAccount, dispatch]);
|
||||
|
||||
const isFilteredAndHidden = loadingState === 'filtered';
|
||||
|
||||
let quoteError: React.ReactNode = null;
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@ import { connect } from 'react-redux';
|
|||
import PeopleIcon from '@/material-icons/400-24px/group.svg?react';
|
||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
|
||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
import { domain } from 'mastodon/initial_state';
|
||||
import { domain, localLiveFeedAccess } from 'mastodon/initial_state';
|
||||
import { canViewFeed } from 'mastodon/permissions';
|
||||
|
||||
import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
|
||||
import { connectCommunityStream } from '../../actions/streaming';
|
||||
|
|
@ -120,8 +121,21 @@ class CommunityTimeline extends PureComponent {
|
|||
|
||||
render () {
|
||||
const { intl, hasUnread, columnId, multiColumn, onlyMedia } = this.props;
|
||||
const { signedIn, permissions } = this.props.identity;
|
||||
const pinned = !!columnId;
|
||||
|
||||
const emptyMessage = canViewFeed(signedIn, permissions, localLiveFeedAccess) ? (
|
||||
<FormattedMessage
|
||||
id='empty_column.community'
|
||||
defaultMessage='The local timeline is empty. Write something publicly to get the ball rolling!'
|
||||
/>
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='empty_column.disabled_feed'
|
||||
defaultMessage='This feed has been disabled by your server administrators.'
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
|
||||
<ColumnHeader
|
||||
|
|
@ -144,7 +158,7 @@ class CommunityTimeline extends PureComponent {
|
|||
scrollKey={`community_timeline-${columnId}`}
|
||||
timelineId={`community${onlyMedia ? ':media' : ''}`}
|
||||
onLoadMore={this.handleLoadMore}
|
||||
emptyMessage={<FormattedMessage id='empty_column.community' defaultMessage='The local timeline is empty. Write something publicly to get the ball rolling!' />}
|
||||
emptyMessage={emptyMessage}
|
||||
bindToDocument={!multiColumn}
|
||||
/>
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -9,7 +9,7 @@ import { EMOJI_MODE_NATIVE } from './constants';
|
|||
import EmojiData from './emoji_data.json';
|
||||
import { useEmojiAppState } from './mode';
|
||||
|
||||
const backgroundImageFnDefault = () => `${assetHost}/emoji/sheet_15_1.png`;
|
||||
const backgroundImageFnDefault = () => `${assetHost}/emoji/sheet_16_0.png`;
|
||||
|
||||
const Emoji = ({
|
||||
set = 'twitter',
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import { initialState } from '@/mastodon/initial_state';
|
||||
import { loadWorker } from '@/mastodon/utils/workers';
|
||||
|
||||
import { toSupportedLocale } from './locale';
|
||||
import { emojiLogger } from './utils';
|
||||
// eslint-disable-next-line import/default -- Importing via worker loader.
|
||||
import EmojiWorker from './worker?worker&inline';
|
||||
|
||||
const userLocale = toSupportedLocale(initialState?.meta.locale ?? 'en');
|
||||
|
||||
|
|
@ -16,9 +17,7 @@ export function initializeEmoji() {
|
|||
log('initializing emojis');
|
||||
if (!worker && 'Worker' in window) {
|
||||
try {
|
||||
worker = loadWorker(new URL('./worker', import.meta.url), {
|
||||
type: 'module',
|
||||
});
|
||||
worker = new EmojiWorker();
|
||||
} catch (err) {
|
||||
console.warn('Error creating web worker:', err);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ function testEmojiSupport(text: string) {
|
|||
return compareFeatures(feature1, feature2);
|
||||
}
|
||||
|
||||
const EMOJI_VERSION_TEST_EMOJI = '🫨'; // shaking head, from v15
|
||||
const EMOJI_VERSION_TEST_EMOJI = ''; // face with bags under eyes, from Unicode 16.0.
|
||||
const EMOJI_FLAG_TEST_EMOJI = '🇨🇭';
|
||||
|
||||
export function determineEmojiMode(style: string): EmojiMode {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ import { changeSetting } from 'mastodon/actions/settings';
|
|||
import { connectPublicStream, connectCommunityStream } from 'mastodon/actions/streaming';
|
||||
import { expandPublicTimeline, expandCommunityTimeline } from 'mastodon/actions/timelines';
|
||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
|
||||
import { localLiveFeedAccess, remoteLiveFeedAccess, me, domain } from 'mastodon/initial_state';
|
||||
import { localLiveFeedAccess, remoteLiveFeedAccess, domain } from 'mastodon/initial_state';
|
||||
import { canViewFeed } from 'mastodon/permissions';
|
||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||
|
||||
import Column from '../../components/column';
|
||||
|
|
@ -52,7 +53,7 @@ const ColumnSettings = () => {
|
|||
const Firehose = ({ feedType, multiColumn }) => {
|
||||
const dispatch = useAppDispatch();
|
||||
const intl = useIntl();
|
||||
const { signedIn } = useIdentity();
|
||||
const { signedIn, permissions } = useIdentity();
|
||||
const columnRef = useRef(null);
|
||||
|
||||
const onlyMedia = useAppSelector((state) => state.getIn(['settings', 'firehose', 'onlyMedia'], false));
|
||||
|
|
@ -151,6 +152,15 @@ const Firehose = ({ feedType, multiColumn }) => {
|
|||
/>
|
||||
);
|
||||
|
||||
const canViewSelectedFeed = canViewFeed(signedIn, permissions, feedType === 'community' ? localLiveFeedAccess : remoteLiveFeedAccess);
|
||||
|
||||
const disabledTimelineMessage = (
|
||||
<FormattedMessage
|
||||
id='empty_column.disabled_feed'
|
||||
defaultMessage='This feed has been disabled by your server administrators.'
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={columnRef} label={intl.formatMessage(messages.title)}>
|
||||
<ColumnHeader
|
||||
|
|
@ -165,7 +175,7 @@ const Firehose = ({ feedType, multiColumn }) => {
|
|||
<ColumnSettings />
|
||||
</ColumnHeader>
|
||||
|
||||
{(signedIn || (localLiveFeedAccess === 'public' && remoteLiveFeedAccess === 'public')) && (
|
||||
{(canViewFeed(signedIn, permissions, localLiveFeedAccess) && canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) && (
|
||||
<div className='account__section-headline'>
|
||||
<NavLink exact to='/public/local'>
|
||||
<FormattedMessage tagName='div' id='firehose.local' defaultMessage='This server' />
|
||||
|
|
@ -187,7 +197,7 @@ const Firehose = ({ feedType, multiColumn }) => {
|
|||
onLoadMore={handleLoadMore}
|
||||
trackScroll
|
||||
scrollKey='firehose'
|
||||
emptyMessage={emptyMessage}
|
||||
emptyMessage={canViewSelectedFeed ? emptyMessage : disabledTimelineMessage}
|
||||
bindToDocument={!multiColumn}
|
||||
/>
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ import {
|
|||
me,
|
||||
} from 'mastodon/initial_state';
|
||||
import { transientSingleColumn } from 'mastodon/is_mobile';
|
||||
import { canViewFeed } from 'mastodon/permissions';
|
||||
import { selectUnreadNotificationGroupsCount } from 'mastodon/selectors/notifications';
|
||||
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||
|
||||
|
|
@ -194,7 +195,7 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({
|
|||
multiColumn = false,
|
||||
}) => {
|
||||
const intl = useIntl();
|
||||
const { signedIn, disabledAccountId } = useIdentity();
|
||||
const { signedIn, permissions, disabledAccountId } = useIdentity();
|
||||
const location = useLocation();
|
||||
const showSearch = useBreakpoint('full') && !multiColumn;
|
||||
|
||||
|
|
@ -262,13 +263,12 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({
|
|||
/>
|
||||
)}
|
||||
|
||||
{(signedIn ||
|
||||
localLiveFeedAccess === 'public' ||
|
||||
remoteLiveFeedAccess === 'public') && (
|
||||
{(canViewFeed(signedIn, permissions, localLiveFeedAccess) ||
|
||||
canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) && (
|
||||
<ColumnLink
|
||||
transparent
|
||||
to={
|
||||
signedIn || localLiveFeedAccess === 'public'
|
||||
canViewFeed(signedIn, permissions, localLiveFeedAccess)
|
||||
? '/public/local'
|
||||
: '/public/remote'
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,11 +46,15 @@ export const EmbeddedStatusContent: React.FC<{
|
|||
() => (status.get('mentions') as List<Mention>).toJS(),
|
||||
[status],
|
||||
);
|
||||
const htmlHandlers = useElementHandledLink({
|
||||
hashtagAccountId: status.get('account') as string | undefined,
|
||||
hrefToMention(href) {
|
||||
const hrefToMention = useCallback(
|
||||
(href: string) => {
|
||||
return mentions.find((item) => item.url === href);
|
||||
},
|
||||
[mentions],
|
||||
);
|
||||
const htmlHandlers = useElementHandledLink({
|
||||
hashtagAccountId: status.get('account') as string | undefined,
|
||||
hrefToMention,
|
||||
});
|
||||
|
||||
const handleContentRef = useCallback(
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@ import { connect } from 'react-redux';
|
|||
import PublicIcon from '@/material-icons/400-24px/public.svg?react';
|
||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
|
||||
import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
|
||||
import { domain } from 'mastodon/initial_state';
|
||||
import { domain, localLiveFeedAccess, remoteLiveFeedAccess } from 'mastodon/initial_state';
|
||||
import { canViewFeed } from 'mastodon/permissions';
|
||||
|
||||
import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
|
||||
import { connectPublicStream } from '../../actions/streaming';
|
||||
|
|
@ -123,8 +124,21 @@ class PublicTimeline extends PureComponent {
|
|||
|
||||
render () {
|
||||
const { intl, columnId, hasUnread, multiColumn, onlyMedia, onlyRemote } = this.props;
|
||||
const { signedIn, permissions } = this.props.identity;
|
||||
const pinned = !!columnId;
|
||||
|
||||
const emptyMessage = (canViewFeed(signedIn, permissions, localLiveFeedAccess) || canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) ? (
|
||||
<FormattedMessage
|
||||
id='empty_column.public'
|
||||
defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up'
|
||||
/>
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='empty_column.disabled_feed'
|
||||
defaultMessage='This feed has been disabled by your server administrators.'
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
|
||||
<ColumnHeader
|
||||
|
|
@ -147,7 +161,7 @@ class PublicTimeline extends PureComponent {
|
|||
onLoadMore={this.handleLoadMore}
|
||||
trackScroll={!pinned}
|
||||
scrollKey={`public_timeline-${columnId}`}
|
||||
emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' />}
|
||||
emptyMessage={emptyMessage}
|
||||
bindToDocument={!multiColumn}
|
||||
/>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,8 +18,9 @@ import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/
|
|||
|
||||
import { IconButton } from '../../../components/icon_button';
|
||||
import { Dropdown } from 'mastodon/components/dropdown_menu';
|
||||
import { me } from '../../../initial_state';
|
||||
import { me, quickBoosting } from '../../../initial_state';
|
||||
import { BoostButton } from '@/mastodon/components/status/boost_button';
|
||||
import { quoteItemState, selectStatusState } from '@/mastodon/components/status/boost_button_utils';
|
||||
|
||||
const messages = defineMessages({
|
||||
delete: { id: 'status.delete', defaultMessage: 'Delete' },
|
||||
|
|
@ -60,6 +61,7 @@ const mapStateToProps = (state, { status }) => {
|
|||
return ({
|
||||
relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),
|
||||
quotedAccountId: quotedStatusId ? state.getIn(['statuses', quotedStatusId, 'account']) : null,
|
||||
statusQuoteState: selectStatusState(state, status),
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -68,6 +70,7 @@ class ActionBar extends PureComponent {
|
|||
identity: identityContextPropShape,
|
||||
status: ImmutablePropTypes.map.isRequired,
|
||||
relationship: ImmutablePropTypes.record,
|
||||
statusQuoteState: PropTypes.object,
|
||||
quotedAccountId: ImmutablePropTypes.string,
|
||||
onReply: PropTypes.func.isRequired,
|
||||
onReblog: PropTypes.func.isRequired,
|
||||
|
|
@ -116,6 +119,10 @@ class ActionBar extends PureComponent {
|
|||
this.props.onRevokeQuote(this.props.status);
|
||||
};
|
||||
|
||||
handleQuoteClick = () => {
|
||||
this.props.onQuote(this.props.status);
|
||||
};
|
||||
|
||||
handleQuotePolicyChange = () => {
|
||||
this.props.onQuotePolicyChange(this.props.status);
|
||||
};
|
||||
|
|
@ -200,7 +207,7 @@ class ActionBar extends PureComponent {
|
|||
};
|
||||
|
||||
render () {
|
||||
const { status, relationship, quotedAccountId, intl } = this.props;
|
||||
const { status, relationship, statusQuoteState, quotedAccountId, intl } = this.props;
|
||||
const { signedIn, permissions } = this.props.identity;
|
||||
|
||||
const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
|
||||
|
|
@ -226,6 +233,19 @@ class ActionBar extends PureComponent {
|
|||
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
|
||||
}
|
||||
|
||||
if (quickBoosting && signedIn) {
|
||||
const quoteItem = quoteItemState(statusQuoteState);
|
||||
menu.push(null);
|
||||
menu.push({
|
||||
text: intl.formatMessage(quoteItem.title),
|
||||
description: quoteItem.meta
|
||||
? intl.formatMessage(quoteItem.meta)
|
||||
: undefined,
|
||||
disabled: quoteItem.disabled,
|
||||
action: this.handleQuoteClick,
|
||||
});
|
||||
}
|
||||
|
||||
if (signedIn) {
|
||||
menu.push(null);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import { useEffect, useState, useCallback } from 'react';
|
||||
import { useEffect, useState, useCallback, useMemo } from 'react';
|
||||
|
||||
import { useIntl, defineMessages } from 'react-intl';
|
||||
|
||||
import { useDebouncedCallback } from 'use-debounce';
|
||||
|
||||
import {
|
||||
fetchContext,
|
||||
completeContextRefresh,
|
||||
|
|
@ -13,6 +15,8 @@ import { apiGetAsyncRefresh } from 'mastodon/api/async_refreshes';
|
|||
import { Alert } from 'mastodon/components/alert';
|
||||
import { ExitAnimationWrapper } from 'mastodon/components/exit_animation_wrapper';
|
||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
|
||||
import { useInterval } from 'mastodon/hooks/useInterval';
|
||||
import { useIsDocumentVisible } from 'mastodon/hooks/useIsDocumentVisible';
|
||||
import { useAppSelector, useAppDispatch } from 'mastodon/store';
|
||||
|
||||
const AnimatedAlert: React.FC<
|
||||
|
|
@ -52,14 +56,151 @@ const messages = defineMessages({
|
|||
|
||||
type LoadingState = 'idle' | 'more-available' | 'loading' | 'success' | 'error';
|
||||
|
||||
/**
|
||||
* Age of thread below which we consider it new & fetch
|
||||
* replies more frequently
|
||||
*/
|
||||
const NEW_THREAD_AGE_THRESHOLD = 30 * 60_000;
|
||||
/**
|
||||
* Interval at which we check for new replies for old threads
|
||||
*/
|
||||
const LONG_AUTO_FETCH_REPLIES_INTERVAL = 5 * 60_000;
|
||||
/**
|
||||
* Interval at which we check for new replies for new threads.
|
||||
* Also used as a threshold to throttle repeated fetch calls
|
||||
*/
|
||||
const SHORT_AUTO_FETCH_REPLIES_INTERVAL = 60_000;
|
||||
/**
|
||||
* Number of refresh_async checks at which an early fetch
|
||||
* will be triggered if there are results
|
||||
*/
|
||||
const LONG_RUNNING_FETCH_THRESHOLD = 3;
|
||||
|
||||
/**
|
||||
* Returns whether the thread is new, based on NEW_THREAD_AGE_THRESHOLD
|
||||
*/
|
||||
function getIsThreadNew(statusCreatedAt: string) {
|
||||
const now = new Date();
|
||||
const newThreadThreshold = new Date(now.getTime() - NEW_THREAD_AGE_THRESHOLD);
|
||||
|
||||
return new Date(statusCreatedAt) > newThreadThreshold;
|
||||
}
|
||||
|
||||
/**
|
||||
* This hook kicks off a background check for the async refresh job
|
||||
* and loads any newly found replies once the job has finished,
|
||||
* and when LONG_RUNNING_FETCH_THRESHOLD was reached and replies were found
|
||||
*/
|
||||
function useCheckForRemoteReplies({
|
||||
statusId,
|
||||
refreshHeader,
|
||||
isEnabled,
|
||||
onChangeLoadingState,
|
||||
}: {
|
||||
statusId: string;
|
||||
refreshHeader?: AsyncRefreshHeader;
|
||||
isEnabled: boolean;
|
||||
onChangeLoadingState: React.Dispatch<React.SetStateAction<LoadingState>>;
|
||||
}) {
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
useEffect(() => {
|
||||
let timeoutId: ReturnType<typeof setTimeout>;
|
||||
|
||||
const scheduleRefresh = (
|
||||
refresh: AsyncRefreshHeader,
|
||||
iteration: number,
|
||||
) => {
|
||||
timeoutId = setTimeout(() => {
|
||||
void apiGetAsyncRefresh(refresh.id).then((result) => {
|
||||
const { status, result_count } = result.async_refresh;
|
||||
|
||||
// At three scheduled refreshes, we consider the job
|
||||
// long-running and attempt to fetch any new replies so far
|
||||
const isLongRunning = iteration === LONG_RUNNING_FETCH_THRESHOLD;
|
||||
|
||||
// If the refresh status is not finished and not long-running,
|
||||
// we just schedule another refresh and exit
|
||||
if (status === 'running' && !isLongRunning) {
|
||||
scheduleRefresh(refresh, iteration + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
// If refresh status is finished, clear `refreshHeader`
|
||||
// (we don't want to do this if it's just a long-running job)
|
||||
if (status === 'finished') {
|
||||
dispatch(completeContextRefresh({ statusId }));
|
||||
}
|
||||
|
||||
// Exit if there's nothing to fetch
|
||||
if (result_count === 0) {
|
||||
if (status === 'finished') {
|
||||
onChangeLoadingState('idle');
|
||||
} else {
|
||||
scheduleRefresh(refresh, iteration + 1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// A positive result count means there _might_ be new replies,
|
||||
// so we fetch the context in the background to check if there
|
||||
// are any new replies.
|
||||
// If so, they will populate `contexts.pendingReplies[statusId]`
|
||||
void dispatch(fetchContext({ statusId, prefetchOnly: true }))
|
||||
.then(() => {
|
||||
// Reset loading state to `idle`. If the fetch has
|
||||
// resulted in new pending replies, the `hasPendingReplies`
|
||||
// flag will switch the loading state to 'more-available'
|
||||
if (status === 'finished') {
|
||||
onChangeLoadingState('idle');
|
||||
} else {
|
||||
// Keep background fetch going if `isLongRunning` is true
|
||||
scheduleRefresh(refresh, iteration + 1);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// Show an error if the fetch failed
|
||||
onChangeLoadingState('error');
|
||||
});
|
||||
});
|
||||
}, refresh.retry * 1000);
|
||||
};
|
||||
|
||||
// Initialise a refresh
|
||||
if (refreshHeader && isEnabled) {
|
||||
scheduleRefresh(refreshHeader, 1);
|
||||
onChangeLoadingState('loading');
|
||||
}
|
||||
|
||||
return () => {
|
||||
clearTimeout(timeoutId);
|
||||
};
|
||||
}, [onChangeLoadingState, dispatch, statusId, refreshHeader, isEnabled]);
|
||||
}
|
||||
|
||||
/**
|
||||
* This component fetches new post replies in the background
|
||||
* and gives users the option to show them.
|
||||
*
|
||||
* The following three scenarios are handled:
|
||||
*
|
||||
* 1. When the browser tab is visible, replies are refetched periodically
|
||||
* (more frequently for new posts, less frequently for old ones)
|
||||
* 2. Replies are refetched when the browser tab is refocused
|
||||
* after it was hidden or minimised
|
||||
* 3. For remote posts, remote replies that might not yet be known to the
|
||||
* server are imported & fetched using the AsyncRefresh API.
|
||||
*/
|
||||
export const RefreshController: React.FC<{
|
||||
statusId: string;
|
||||
}> = ({ statusId }) => {
|
||||
statusCreatedAt: string;
|
||||
isLocal: boolean;
|
||||
}> = ({ statusId, statusCreatedAt, isLocal }) => {
|
||||
const dispatch = useAppDispatch();
|
||||
const intl = useIntl();
|
||||
|
||||
const refreshHeader = useAppSelector(
|
||||
(state) => state.contexts.refreshing[statusId],
|
||||
const refreshHeader = useAppSelector((state) =>
|
||||
isLocal ? undefined : state.contexts.refreshing[statusId],
|
||||
);
|
||||
const hasPendingReplies = useAppSelector(
|
||||
(state) => !!state.contexts.pendingReplies[statusId]?.length,
|
||||
|
|
@ -78,78 +219,52 @@ export const RefreshController: React.FC<{
|
|||
dispatch(clearPendingReplies({ statusId }));
|
||||
}, [dispatch, statusId]);
|
||||
|
||||
useEffect(() => {
|
||||
let timeoutId: ReturnType<typeof setTimeout>;
|
||||
// Prevent too-frequent context calls
|
||||
const debouncedFetchContext = useDebouncedCallback(
|
||||
() => {
|
||||
void dispatch(fetchContext({ statusId, prefetchOnly: true }));
|
||||
},
|
||||
// Ensure the debounce is a bit shorter than the auto-fetch interval
|
||||
SHORT_AUTO_FETCH_REPLIES_INTERVAL - 500,
|
||||
{
|
||||
leading: true,
|
||||
trailing: false,
|
||||
},
|
||||
);
|
||||
|
||||
const scheduleRefresh = (
|
||||
refresh: AsyncRefreshHeader,
|
||||
iteration: number,
|
||||
) => {
|
||||
timeoutId = setTimeout(() => {
|
||||
void apiGetAsyncRefresh(refresh.id).then((result) => {
|
||||
// At three scheduled refreshes, we consider the job
|
||||
// long-running and attempt to fetch any new replies so far
|
||||
const isLongRunning = iteration === 3;
|
||||
const isDocumentVisible = useIsDocumentVisible({
|
||||
onChange: (isVisible) => {
|
||||
// Auto-fetch new replies when the page is refocused
|
||||
if (isVisible && partialLoadingState !== 'loading' && !wasDismissed) {
|
||||
debouncedFetchContext();
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const { status, result_count } = result.async_refresh;
|
||||
// Check for remote replies
|
||||
useCheckForRemoteReplies({
|
||||
statusId,
|
||||
refreshHeader,
|
||||
isEnabled: isDocumentVisible && !isLocal && !wasDismissed,
|
||||
onChangeLoadingState: setLoadingState,
|
||||
});
|
||||
|
||||
// If the refresh status is not finished and not long-running,
|
||||
// we just schedule another refresh and exit
|
||||
if (status === 'running' && !isLongRunning) {
|
||||
scheduleRefresh(refresh, iteration + 1);
|
||||
return;
|
||||
}
|
||||
// Only auto-fetch new replies if there's no ongoing remote replies check
|
||||
const shouldAutoFetchReplies =
|
||||
isDocumentVisible && partialLoadingState !== 'loading' && !wasDismissed;
|
||||
|
||||
// If refresh status is finished, clear `refreshHeader`
|
||||
// (we don't want to do this if it's just a long-running job)
|
||||
if (status === 'finished') {
|
||||
dispatch(completeContextRefresh({ statusId }));
|
||||
}
|
||||
const autoFetchInterval = useMemo(
|
||||
() =>
|
||||
getIsThreadNew(statusCreatedAt)
|
||||
? SHORT_AUTO_FETCH_REPLIES_INTERVAL
|
||||
: LONG_AUTO_FETCH_REPLIES_INTERVAL,
|
||||
[statusCreatedAt],
|
||||
);
|
||||
|
||||
// Exit if there's nothing to fetch
|
||||
if (result_count === 0) {
|
||||
if (status === 'finished') {
|
||||
setLoadingState('idle');
|
||||
} else {
|
||||
scheduleRefresh(refresh, iteration + 1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// A positive result count means there _might_ be new replies,
|
||||
// so we fetch the context in the background to check if there
|
||||
// are any new replies.
|
||||
// If so, they will populate `contexts.pendingReplies[statusId]`
|
||||
void dispatch(fetchContext({ statusId, prefetchOnly: true }))
|
||||
.then(() => {
|
||||
// Reset loading state to `idle`. If the fetch has
|
||||
// resulted in new pending replies, the `hasPendingReplies`
|
||||
// flag will switch the loading state to 'more-available'
|
||||
if (status === 'finished') {
|
||||
setLoadingState('idle');
|
||||
} else {
|
||||
// Keep background fetch going if `isLongRunning` is true
|
||||
scheduleRefresh(refresh, iteration + 1);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// Show an error if the fetch failed
|
||||
setLoadingState('error');
|
||||
});
|
||||
});
|
||||
}, refresh.retry * 1000);
|
||||
};
|
||||
|
||||
// Initialise a refresh
|
||||
if (refreshHeader && !wasDismissed) {
|
||||
scheduleRefresh(refreshHeader, 1);
|
||||
setLoadingState('loading');
|
||||
}
|
||||
|
||||
return () => {
|
||||
clearTimeout(timeoutId);
|
||||
};
|
||||
}, [dispatch, statusId, refreshHeader, wasDismissed]);
|
||||
useInterval(debouncedFetchContext, {
|
||||
delay: autoFetchInterval,
|
||||
isEnabled: shouldAutoFetchReplies,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
// Hide success message after a short delay
|
||||
|
|
@ -172,7 +287,7 @@ export const RefreshController: React.FC<{
|
|||
};
|
||||
}, [dispatch, statusId]);
|
||||
|
||||
const handleClick = useCallback(() => {
|
||||
const showPending = useCallback(() => {
|
||||
dispatch(showPendingReplies({ statusId }));
|
||||
setLoadingState('success');
|
||||
}, [dispatch, statusId]);
|
||||
|
|
@ -196,7 +311,7 @@ export const RefreshController: React.FC<{
|
|||
isActive={loadingState === 'more-available'}
|
||||
message={intl.formatMessage(messages.moreFound)}
|
||||
action={intl.formatMessage(messages.show)}
|
||||
onActionClick={handleClick}
|
||||
onActionClick={showPending}
|
||||
onDismiss={dismissPrompt}
|
||||
animateFrom='below'
|
||||
/>
|
||||
|
|
@ -205,7 +320,7 @@ export const RefreshController: React.FC<{
|
|||
isActive={loadingState === 'error'}
|
||||
message={intl.formatMessage(messages.error)}
|
||||
action={intl.formatMessage(messages.retry)}
|
||||
onActionClick={handleClick}
|
||||
onActionClick={showPending}
|
||||
onDismiss={dismissPrompt}
|
||||
animateFrom='below'
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -504,12 +504,14 @@ class Status extends ImmutablePureComponent {
|
|||
componentDidUpdate (prevProps) {
|
||||
const { status, ancestorsIds, descendantsIds } = this.props;
|
||||
|
||||
if (status && (ancestorsIds.length > prevProps.ancestorsIds.length || prevProps.status?.get('id') !== status.get('id'))) {
|
||||
const isSameStatus = status && (prevProps.status?.get('id') === status.get('id'));
|
||||
|
||||
if (status && (ancestorsIds.length > prevProps.ancestorsIds.length || !isSameStatus)) {
|
||||
this._scrollStatusIntoView();
|
||||
}
|
||||
|
||||
// Only highlight replies after the initial load
|
||||
if (prevProps.descendantsIds.length) {
|
||||
if (prevProps.descendantsIds.length && isSameStatus) {
|
||||
const newRepliesIds = difference(descendantsIds, prevProps.descendantsIds);
|
||||
|
||||
if (newRepliesIds.length) {
|
||||
|
|
@ -571,14 +573,6 @@ class Status extends ImmutablePureComponent {
|
|||
const isLocal = status.getIn(['account', 'acct'], '').indexOf('@') === -1;
|
||||
const isIndexable = !status.getIn(['account', 'noindex']);
|
||||
|
||||
if (!isLocal) {
|
||||
remoteHint = (
|
||||
<RefreshController
|
||||
statusId={status.get('id')}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
const handlers = {
|
||||
reply: this.handleHotkeyReply,
|
||||
favourite: this.handleHotkeyFavourite,
|
||||
|
|
@ -649,7 +643,12 @@ class Status extends ImmutablePureComponent {
|
|||
</Hotkeys>
|
||||
|
||||
{descendants}
|
||||
{remoteHint}
|
||||
|
||||
<RefreshController
|
||||
isLocal={isLocal}
|
||||
statusId={status.get('id')}
|
||||
statusCreatedAt={status.get('created_at')}
|
||||
/>
|
||||
</div>
|
||||
</ScrollContainer>
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../act
|
|||
import { clearHeight } from '../../actions/height_cache';
|
||||
import { fetchServer, fetchServerTranslationLanguages } from '../../actions/server';
|
||||
import { expandHomeTimeline } from '../../actions/timelines';
|
||||
import { initialState, me, owner, singleUserMode, trendsEnabled, trendsAsLanding, disableHoverCards, autoPlayGif } from '../../initial_state';
|
||||
import { initialState, me, owner, singleUserMode, trendsEnabled, landingPage, localLiveFeedAccess, disableHoverCards, autoPlayGif } from '../../initial_state';
|
||||
|
||||
import BundleColumnError from './components/bundle_column_error';
|
||||
import { NavigationBar } from './components/navigation_bar';
|
||||
|
|
@ -148,8 +148,10 @@ class SwitchingColumnsArea extends PureComponent {
|
|||
}
|
||||
} else if (singleUserMode && owner && initialState?.accounts[owner]) {
|
||||
redirect = <Redirect from='/' to={`/@${initialState.accounts[owner].username}`} exact />;
|
||||
} else if (trendsEnabled && trendsAsLanding) {
|
||||
} else if (trendsEnabled && landingPage === 'trends') {
|
||||
redirect = <Redirect from='/' to='/explore' exact />;
|
||||
} else if (localLiveFeedAccess === 'public' && landingPage === 'local_feed') {
|
||||
redirect = <Redirect from='/' to='/public/local' exact />;
|
||||
} else {
|
||||
redirect = <Redirect from='/' to='/about' exact />;
|
||||
}
|
||||
|
|
|
|||
39
app/javascript/mastodon/hooks/useInterval.ts
Normal file
39
app/javascript/mastodon/hooks/useInterval.ts
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
import { useEffect, useLayoutEffect, useRef } from 'react';
|
||||
|
||||
/**
|
||||
* Hook to create an interval that invokes a callback function
|
||||
* at a specified delay using the setInterval API.
|
||||
* Based on https://usehooks-ts.com/react-hook/use-interval
|
||||
*/
|
||||
export function useInterval(
|
||||
callback: () => void,
|
||||
{
|
||||
delay,
|
||||
isEnabled = true,
|
||||
}: {
|
||||
delay: number;
|
||||
isEnabled?: boolean;
|
||||
},
|
||||
) {
|
||||
// Write callback to a ref so we can omit it from
|
||||
// the interval effect's dependency array
|
||||
const callbackRef = useRef(callback);
|
||||
useLayoutEffect(() => {
|
||||
callbackRef.current = callback;
|
||||
}, [callback]);
|
||||
|
||||
// Set up the interval.
|
||||
useEffect(() => {
|
||||
if (!isEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
const intervalId = setInterval(() => {
|
||||
callbackRef.current();
|
||||
}, delay);
|
||||
|
||||
return () => {
|
||||
clearInterval(intervalId);
|
||||
};
|
||||
}, [delay, isEnabled]);
|
||||
}
|
||||
32
app/javascript/mastodon/hooks/useIsDocumentVisible.ts
Normal file
32
app/javascript/mastodon/hooks/useIsDocumentVisible.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
export function useIsDocumentVisible({
|
||||
onChange,
|
||||
}: {
|
||||
onChange?: (isVisible: boolean) => void;
|
||||
} = {}) {
|
||||
const [isDocumentVisible, setIsDocumentVisible] = useState(
|
||||
() => document.visibilityState === 'visible',
|
||||
);
|
||||
|
||||
const onChangeRef = useRef(onChange);
|
||||
useEffect(() => {
|
||||
onChangeRef.current = onChange;
|
||||
}, [onChange]);
|
||||
|
||||
useEffect(() => {
|
||||
function handleVisibilityChange() {
|
||||
const isVisible = document.visibilityState === 'visible';
|
||||
|
||||
setIsDocumentVisible(isVisible);
|
||||
onChangeRef.current?.(isVisible);
|
||||
}
|
||||
window.addEventListener('visibilitychange', handleVisibilityChange);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('visibilitychange', handleVisibilityChange);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return isDocumentVisible;
|
||||
}
|
||||
|
|
@ -9,6 +9,7 @@ interface InitialStateMeta {
|
|||
activity_api_enabled: boolean;
|
||||
admin: string;
|
||||
boost_modal?: boolean;
|
||||
quick_boosting?: boolean;
|
||||
delete_modal?: boolean;
|
||||
missing_alt_text_modal?: boolean;
|
||||
disable_swiping?: boolean;
|
||||
|
|
@ -32,13 +33,13 @@ interface InitialStateMeta {
|
|||
single_user_mode: boolean;
|
||||
source_url: string;
|
||||
streaming_api_base_url: string;
|
||||
local_live_feed_access: 'public' | 'authenticated';
|
||||
remote_live_feed_access: 'public' | 'authenticated';
|
||||
local_topic_feed_access: 'public' | 'authenticated';
|
||||
remote_topic_feed_access: 'public' | 'authenticated';
|
||||
local_live_feed_access: 'public' | 'authenticated' | 'disabled';
|
||||
remote_live_feed_access: 'public' | 'authenticated' | 'disabled';
|
||||
local_topic_feed_access: 'public' | 'authenticated' | 'disabled';
|
||||
remote_topic_feed_access: 'public' | 'authenticated' | 'disabled';
|
||||
title: string;
|
||||
show_trends: boolean;
|
||||
trends_as_landing_page: boolean;
|
||||
landing_page: 'about' | 'trends' | 'local_feed';
|
||||
use_blurhash: boolean;
|
||||
use_pending_items?: boolean;
|
||||
version: string;
|
||||
|
|
@ -89,6 +90,7 @@ function getMeta<K extends keyof InitialStateMeta>(
|
|||
export const activityApiEnabled = getMeta('activity_api_enabled');
|
||||
export const autoPlayGif = getMeta('auto_play_gif');
|
||||
export const boostModal = getMeta('boost_modal');
|
||||
export const quickBoosting = getMeta('quick_boosting');
|
||||
export const deleteModal = getMeta('delete_modal');
|
||||
export const missingAltTextModal = getMeta('missing_alt_text_modal');
|
||||
export const disableSwiping = getMeta('disable_swiping');
|
||||
|
|
@ -118,7 +120,7 @@ export const remoteLiveFeedAccess = getMeta('remote_live_feed_access');
|
|||
export const localTopicFeedAccess = getMeta('local_topic_feed_access');
|
||||
export const remoteTopicFeedAccess = getMeta('remote_topic_feed_access');
|
||||
export const title = getMeta('title');
|
||||
export const trendsAsLanding = getMeta('trends_as_landing_page');
|
||||
export const landingPage = getMeta('landing_page');
|
||||
export const useBlurhash = getMeta('use_blurhash');
|
||||
export const usePendingItems = getMeta('use_pending_items');
|
||||
export const version = getMeta('version');
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
"account.edit_profile_short": "Рэдагаваць",
|
||||
"account.enable_notifications": "Апавяшчаць мяне пра допісы @{name}",
|
||||
"account.endorse": "Паказваць у профілі",
|
||||
"account.familiar_followers_many": "Мае сярод падпісчыкаў {name1}, {name2}, і {othersCount, plural, one {яшчэ # чалавека, знаёмага вам} few {яшчэ # чалавекі, знаёмыя вам} many {яшчэ # чалавек, знаёмых вам} other {яшчэ # чалавекі, знаёмыя вам}}",
|
||||
"account.familiar_followers_many": "Мае сярод падпісчыкаў {name1}, {name2}, і {othersCount, plural, one {яшчэ # чалавека, знаёмага Вам} few {яшчэ # чалавекі, знаёмыя Вам} many {яшчэ # чалавек, знаёмых Вам} other {яшчэ # чалавекі, знаёмыя Вам}}",
|
||||
"account.familiar_followers_one": "Мае сярод падпісчыкаў {name1}",
|
||||
"account.familiar_followers_two": "Мае сярод падпісчыкаў {name1} і {name2}",
|
||||
"account.featured": "Рэкамендаванае",
|
||||
|
|
@ -49,7 +49,7 @@
|
|||
"account.followers": "Падпісчыкі",
|
||||
"account.followers.empty": "Ніхто пакуль не падпісаны на гэтага карыстальніка.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} падпісчык} few {{counter} падпісчыкі} many {{counter} падпісчыкаў} other {{counter} падпісчыка}}",
|
||||
"account.followers_you_know_counter": "{count, plural, one {{counter}, знаёмы вам} other {{counter}, знаёмых вам}}",
|
||||
"account.followers_you_know_counter": "{count, plural, one {{counter} знаёмы Вам} few {{counter} знаёмыя Вам} other {{counter} знаёмых Вам}}",
|
||||
"account.following": "Падпіскі",
|
||||
"account.following_counter": "{count, plural, one {{counter} падпіска} few {{counter} падпіскі} many {{counter} падпісак} other {{counter} падпіскі}}",
|
||||
"account.follows.empty": "Карыстальнік ні на каго не падпісаны.",
|
||||
|
|
@ -249,7 +249,7 @@
|
|||
"confirmations.quiet_post_quote_info.message": "Калі будзеце цытаваць ціхі публічны допіс, Ваш допіс будзе схаваны ад трэндавых стужак.",
|
||||
"confirmations.quiet_post_quote_info.title": "Цытаванне ціхіх публічных допісаў",
|
||||
"confirmations.redraft.confirm": "Выдаліць і перапісаць",
|
||||
"confirmations.redraft.message": "Вы ўпэўнены, што хочаце выдаліць допіс і перапісаць яго? Упадабанні і пашырэнні згубяцца, а адказы да арыгінальнага допісу асірацеюць.",
|
||||
"confirmations.redraft.message": "Вы ўпэўненыя, што хочаце выдаліць допіс і перапісаць яго? Упадабанні і пашырэнні згубяцца, а адказы да арыгінальнага допісу асірацеюць.",
|
||||
"confirmations.redraft.title": "Выдаліць і перапісаць допіс?",
|
||||
"confirmations.remove_from_followers.confirm": "Выдаліць падпісчыка",
|
||||
"confirmations.remove_from_followers.message": "{name} больш не будзе падпісаны(-ая) на Вас. Упэўненыя, што хочаце працягнуць?",
|
||||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "У Вашых закладках яшчэ няма допісаў. Калі Вы дадасце закладку, яна з’явіцца тут.",
|
||||
"empty_column.community": "Мясцовая стужка пустая. Напішыце нешта публічнае, каб разварушыць справу!",
|
||||
"empty_column.direct": "Пакуль у Вас няма асабістых згадванняў. Калі Вы дашляце або атрымаеце штосьці, яно з’явіцца тут.",
|
||||
"empty_column.disabled_feed": "Гэта стужка была адключаная Вашымі адміністратарамі сервера.",
|
||||
"empty_column.domain_blocks": "Заблакіраваных даменаў пакуль няма.",
|
||||
"empty_column.explore_statuses": "Зараз не ў трэндзе. Праверце пазней",
|
||||
"empty_column.favourited_statuses": "Вы яшчэ не ўпадабалі ніводны допіс. Калі гэта адбудзецца, Вы ўбачыце яго тут.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Утрымлівае цытату",
|
||||
"status.context.loading": "Загружаюцца іншыя адказы",
|
||||
"status.context.loading_error": "Немагчыма загрузіць новыя адказы",
|
||||
"status.context.loading_success": "Усе адказы загружаныя",
|
||||
"status.context.loading_success": "Новыя адказы загружаныя",
|
||||
"status.context.more_replies_found": "Знойдзеныя іншыя адказы",
|
||||
"status.context.retry": "Паспрабаваць зноў",
|
||||
"status.context.show": "Паказаць",
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
"account.disable_notifications": "Спиране на известяване при публикуване от @{name}",
|
||||
"account.domain_blocking": "Блокиране на домейн",
|
||||
"account.edit_profile": "Редактиране на профила",
|
||||
"account.edit_profile_short": "Редактиране",
|
||||
"account.enable_notifications": "Известяване при публикуване от @{name}",
|
||||
"account.endorse": "Представи в профила",
|
||||
"account.familiar_followers_many": "Последвано от {name1}, {name2}, и {othersCount, plural, one {един друг, когото познавате} other {# други, които познавате}}",
|
||||
|
|
@ -40,6 +41,9 @@
|
|||
"account.featured_tags.last_status_never": "Няма публикации",
|
||||
"account.follow": "Последване",
|
||||
"account.follow_back": "Последване взаимно",
|
||||
"account.follow_request_cancel": "Отказване на заявката",
|
||||
"account.follow_request_cancel_short": "Отказ",
|
||||
"account.follow_request_short": "Заявка",
|
||||
"account.followers": "Последователи",
|
||||
"account.followers.empty": "Още никой не следва потребителя.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} последовател} other {{counter} последователи}}",
|
||||
|
|
@ -238,6 +242,9 @@
|
|||
"confirmations.missing_alt_text.secondary": "Все пак да се публикува",
|
||||
"confirmations.missing_alt_text.title": "Добавяте ли алтернативен текст?",
|
||||
"confirmations.mute.confirm": "Заглушаване",
|
||||
"confirmations.quiet_post_quote_info.dismiss": "Без друго напомняне",
|
||||
"confirmations.quiet_post_quote_info.got_it": "Схванах",
|
||||
"confirmations.quiet_post_quote_info.title": "Цитиране на публикации за тиха публика",
|
||||
"confirmations.redraft.confirm": "Изтриване и преработване",
|
||||
"confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.",
|
||||
"confirmations.redraft.title": "Изтривате и преработвате ли публикацията?",
|
||||
|
|
@ -247,7 +254,11 @@
|
|||
"confirmations.revoke_quote.confirm": "Премахване на публикация",
|
||||
"confirmations.revoke_quote.message": "Действието е неотменимо.",
|
||||
"confirmations.revoke_quote.title": "Премахвате ли публикацията?",
|
||||
"confirmations.unblock.confirm": "Отблокиране",
|
||||
"confirmations.unblock.title": "Отблокирате ли @{name}?",
|
||||
"confirmations.unfollow.confirm": "Без следване",
|
||||
"confirmations.unfollow.title": "Спирате ли следване на {name}?",
|
||||
"confirmations.withdraw_request.confirm": "Оттегляне на заявката",
|
||||
"content_warning.hide": "Скриване на публ.",
|
||||
"content_warning.show": "Нека се покаже",
|
||||
"content_warning.show_more": "Показване на още",
|
||||
|
|
@ -442,10 +453,12 @@
|
|||
"ignore_notifications_modal.private_mentions_title": "Пренебрегвате ли известия от непоискани лични споменавания?",
|
||||
"info_button.label": "Помощ",
|
||||
"info_button.what_is_alt_text": "<h1>Какво е алтернативен текст?</h1> <p>Алтернативният текст осигурява описания на изображение за хора със зрителни увреждания, връзки с ниска честотна лента или търсещите допълнителен контекст.</p> <p>Може да подобрите достъпността и разбираемостта за всеки, пишейки ясен, кратък и обективен алтернативен текст.</p> <ul> <li>Уловете важните елементи</li> <li>Обобщете текста в образите</li> <li>Употребявайте правилна структура на изречението</li> <li>Избягвайте излишна информация</li> <li>Съсредоточете се върху тенденциите и ключови констатации в сложни онагледявания (като диаграми и карти)</li> </ul>",
|
||||
"interaction_modal.action": "Трябва да влезете с акаунта си, в който и да е сървър на Mastodon, когото използвате, за да взаимодействате с публикация на {name}.",
|
||||
"interaction_modal.go": "Напред",
|
||||
"interaction_modal.no_account_yet": "Още ли нямате акаунт?",
|
||||
"interaction_modal.on_another_server": "На различен сървър",
|
||||
"interaction_modal.on_this_server": "На този сървър",
|
||||
"interaction_modal.title": "Влезте, за да продължите",
|
||||
"interaction_modal.username_prompt": "Напр. {example}",
|
||||
"intervals.full.days": "{number, plural, one {# ден} other {# дни}}",
|
||||
"intervals.full.hours": "{number, plural, one {# час} other {# часа}}",
|
||||
|
|
@ -596,6 +609,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Вашият акаунт е спрян.",
|
||||
"notification.own_poll": "Анкетата ви приключи",
|
||||
"notification.poll": "Анкета, в която гласувахте, приключи",
|
||||
"notification.quoted_update": "{name} редактира публикация, която цитирахте",
|
||||
"notification.reblog": "{name} подсили ваша публикация",
|
||||
"notification.reblog.name_and_others_with_link": "{name} и <a>{count, plural, one {# друг} other {# други}}</a> подсилиха ваша публикация",
|
||||
"notification.relationships_severance_event": "Изгуби се връзката с {name}",
|
||||
|
|
@ -715,10 +729,17 @@
|
|||
"privacy.private.short": "Последователи",
|
||||
"privacy.public.long": "Всеки във и извън Mastodon",
|
||||
"privacy.public.short": "Публично",
|
||||
"privacy.quote.anyone": "{visibility}, всеки може да цитира",
|
||||
"privacy.quote.disabled": "{visibility}, цитатите са изключени",
|
||||
"privacy.quote.limited": "{visibility}, цитатите са ограничени",
|
||||
"privacy.unlisted.additional": "Това действие е точно като публичното, с изключение на това, че публикацията няма да се появява в каналите на живо, хаштаговете, разглеждането или търсенето в Mastodon, дори ако сте избрали да се публично видими на ниво акаунт.",
|
||||
"privacy.unlisted.short": "Тиха публика",
|
||||
"privacy_policy.last_updated": "Последно осъвременяване на {date}",
|
||||
"privacy_policy.title": "Политика за поверителност",
|
||||
"quote_error.edit": "Не може да се добавят цитати, редайтирайки публикация.",
|
||||
"quote_error.poll": "Не може да се цитира при анкетиране.",
|
||||
"quote_error.unauthorized": "Нямате право да цитирате тази публикация.",
|
||||
"quote_error.upload": "Цитирането не е позволено с мултимедийни прикачвания.",
|
||||
"recommended": "Препоръчано",
|
||||
"refresh": "Опресняване",
|
||||
"regeneration_indicator.please_stand_by": "Изчакайте.",
|
||||
|
|
@ -734,6 +755,8 @@
|
|||
"relative_time.minutes": "{number}м.",
|
||||
"relative_time.seconds": "{number}с.",
|
||||
"relative_time.today": "днес",
|
||||
"remove_quote_hint.button_label": "Схванах",
|
||||
"remove_quote_hint.message": "Може да го направите от менюто възможности {icon}.",
|
||||
"reply_indicator.attachments": "{count, plural, one {# прикаване} other {# прикачвания}}",
|
||||
"reply_indicator.cancel": "Отказ",
|
||||
"reply_indicator.poll": "Анкета",
|
||||
|
|
@ -825,13 +848,22 @@
|
|||
"status.admin_account": "Отваряне на интерфейс за модериране за @{name}",
|
||||
"status.admin_domain": "Отваряне на модериращия интерфейс за {domain}",
|
||||
"status.admin_status": "Отваряне на публикацията в модериращия интерфейс",
|
||||
"status.all_disabled": "Подсилването и цитатите са изключени",
|
||||
"status.block": "Блокиране на @{name}",
|
||||
"status.bookmark": "Отмятане",
|
||||
"status.cancel_reblog_private": "Край на подсилването",
|
||||
"status.cannot_quote": "Не е позволено да цитирате тази публикация",
|
||||
"status.cannot_reblog": "Публикацията не може да се подсилва",
|
||||
"status.context.loading": "Зареждане на още отговори",
|
||||
"status.context.loading_error": "Не можаха да се заредят нови отговори",
|
||||
"status.context.loading_success": "Новите отговори заредени",
|
||||
"status.context.more_replies_found": "Още намерени отговори",
|
||||
"status.context.retry": "Друг опит",
|
||||
"status.context.show": "Показване",
|
||||
"status.continued_thread": "Продължена нишка",
|
||||
"status.copy": "Копиране на връзката към публикация",
|
||||
"status.delete": "Изтриване",
|
||||
"status.delete.success": "Публикацията е изтрита",
|
||||
"status.detailed_status": "Подробен изглед на разговора",
|
||||
"status.direct": "Частно споменаване на @{name}",
|
||||
"status.direct_indicator": "Частно споменаване",
|
||||
|
|
@ -855,23 +887,32 @@
|
|||
"status.open": "Разширяване на публикацията",
|
||||
"status.pin": "Закачане в профила",
|
||||
"status.quote_error.filtered": "Скрито поради един от филтрите ви",
|
||||
"status.quote_error.limited_account_hint.title": "Този акаунт е бил скрит от модераторите на {domain}.",
|
||||
"status.quote_error.not_available": "Неналична публикация",
|
||||
"status.quote_error.pending_approval": "Публикацията чака одобрение",
|
||||
"status.quote_error.revoked": "Премахната публикация от автора",
|
||||
"status.quote_followers_only": "Само последователи могат да цитират тази публикация",
|
||||
"status.quote_manual_review": "Авторът ще преглежда ръчно",
|
||||
"status.quote_policy_change": "Промяна кой може да цитира",
|
||||
"status.quote_post_author": "Цитирах публикация от @{name}",
|
||||
"status.quote_private": "Частните публикации не може да се цитират",
|
||||
"status.read_more": "Още за четене",
|
||||
"status.reblog": "Подсилване",
|
||||
"status.reblog_or_quote": "Подсилване или цитиране",
|
||||
"status.reblog_private": "Споделете пак с последователите си",
|
||||
"status.reblogged_by": "{name} подсили",
|
||||
"status.reblogs": "{count, plural, one {подсилване} other {подсилвания}}",
|
||||
"status.reblogs.empty": "Още никого не е подсилвал публикацията. Подсилващият ще се покаже тук.",
|
||||
"status.redraft": "Изтриване и преработване",
|
||||
"status.remove_bookmark": "Премахване на отметката",
|
||||
"status.remove_favourite": "Премахване от любими",
|
||||
"status.remove_quote": "Премахване",
|
||||
"status.replied_in_thread": "Отговорено в нишката",
|
||||
"status.replied_to": "В отговор до {name}",
|
||||
"status.reply": "Отговор",
|
||||
"status.replyAll": "Отговор на нишка",
|
||||
"status.report": "Докладване на @{name}",
|
||||
"status.request_quote": "Заявка за цитиране",
|
||||
"status.revoke_quote": "Премахване на моя публикация от публикацията на @{name}",
|
||||
"status.sensitive_warning": "Деликатно съдържание",
|
||||
"status.share": "Споделяне",
|
||||
|
|
@ -910,6 +951,7 @@
|
|||
"upload_button.label": "Добавете файл с образ, видео или звук",
|
||||
"upload_error.limit": "Превишено ограничението за качване на файлове.",
|
||||
"upload_error.poll": "Качването на файлове не е позволено с анкети.",
|
||||
"upload_error.quote": "Цитирайки, не може да качвате файл.",
|
||||
"upload_form.drag_and_drop.instructions": "Натиснете интервал или enter, за да подберете мултимедийно прикачване. Провлачвайки, ползвайте клавишите със стрелки, за да премествате мултимедията във всяка дадена посока. Натиснете пак интервал или enter, за да се стовари мултимедийното прикачване в новото си положение или натиснете Esc за отмяна.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Провлачването е отменено. Мултимедийното прикачване {item} е спуснато.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Мултимедийното прикачване {item} е спуснато.",
|
||||
|
|
@ -935,6 +977,11 @@
|
|||
"video.volume_up": "Увеличаване на звука",
|
||||
"visibility_modal.button_title": "Задаване на видимост",
|
||||
"visibility_modal.header": "Видимост и взаимодействие",
|
||||
"visibility_modal.helper.privacy_editing": "Видимостта не може да се променя след публикуване на публикацията.",
|
||||
"visibility_modal.privacy_label": "Видимост",
|
||||
"visibility_modal.quote_followers": "Само последователи",
|
||||
"visibility_modal.quote_public": "Някой"
|
||||
"visibility_modal.quote_label": "Кой може да цитира",
|
||||
"visibility_modal.quote_nobody": "Само аз",
|
||||
"visibility_modal.quote_public": "Някой",
|
||||
"visibility_modal.save": "Запазване"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -871,7 +871,6 @@
|
|||
"status.contains_quote": "Conté una cita",
|
||||
"status.context.loading": "Es carreguen més respostes",
|
||||
"status.context.loading_error": "No s'han pogut carregar respostes noves",
|
||||
"status.context.loading_success": "S'han carregat totes les respostes",
|
||||
"status.context.more_replies_found": "S'han trobat més respostes",
|
||||
"status.context.retry": "Torna-ho a provar",
|
||||
"status.context.show": "Mostra",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Zatím v záložkách nemáte žádné příspěvky. Až si do nich nějaký přidáte, zobrazí se zde.",
|
||||
"empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!",
|
||||
"empty_column.direct": "Zatím nemáte žádné soukromé zmínky. Až nějakou pošlete nebo dostanete, zobrazí se zde.",
|
||||
"empty_column.disabled_feed": "Tento kanál byl zakázán administrátory vašeho serveru.",
|
||||
"empty_column.domain_blocks": "Ještě nemáte žádné zablokované domény.",
|
||||
"empty_column.explore_statuses": "Momentálně není nic populární. Vraťte se později!",
|
||||
"empty_column.favourited_statuses": "Zatím nemáte žádné oblíbené příspěvky. Až si nějaký oblíbíte, zobrazí se zde.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Obsahuje citaci",
|
||||
"status.context.loading": "Načítání dalších odpovědí",
|
||||
"status.context.loading_error": "Nelze načíst nové odpovědi",
|
||||
"status.context.loading_success": "Všechny odpovědi načteny",
|
||||
"status.context.loading_success": "Nové odpovědi načteny",
|
||||
"status.context.more_replies_found": "Nalezeny další odpovědi",
|
||||
"status.context.retry": "Zkusit znovu",
|
||||
"status.context.show": "Zobrazit",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Does gennych chi ddim unrhyw bostiad wedi'u cadw fel nod tudalen eto. Pan fyddwch yn gosod nod tudalen i un, mi fydd yn ymddangos yma.",
|
||||
"empty_column.community": "Mae'r ffrwd lleol yn wag. Beth am ysgrifennu rhywbeth cyhoeddus!",
|
||||
"empty_column.direct": "Does gennych chi unrhyw grybwylliadau preifat eto. Pan fyddwch chi'n anfon neu'n derbyn un, bydd yn ymddangos yma.",
|
||||
"empty_column.disabled_feed": "Mae'r ffrwd hon wedi'i hanalluogi gan weinyddwyr eich gweinydd.",
|
||||
"empty_column.domain_blocks": "Does dim parthau wedi'u rhwystro eto.",
|
||||
"empty_column.explore_statuses": "Does dim pynciau llosg ar hyn o bryd. Dewch nôl nes ymlaen!",
|
||||
"empty_column.favourited_statuses": "Rydych chi heb ffafrio unrhyw bostiadau eto. Pan byddwch chi'n ffafrio un, bydd yn ymddangos yma.",
|
||||
|
|
@ -753,6 +754,7 @@
|
|||
"privacy.unlisted.short": "Tewi'r cyhoeddus",
|
||||
"privacy_policy.last_updated": "Diweddarwyd ddiwethaf ar {date}",
|
||||
"privacy_policy.title": "Polisi Preifatrwydd",
|
||||
"quote_error.edit": "Does dim modd ychwanegu dyfyniadau wrth olygu postiad.",
|
||||
"quote_error.poll": "Dyw dyfynnu ddim yn cael ei ganiatáu gyda pholau.",
|
||||
"quote_error.quote": "Dim ond un dyfyniad ar y tro sy'n cael ei ganiatáu.",
|
||||
"quote_error.unauthorized": "Does gennych chi ddim awdurdod i ddyfynnu'r postiad hwn.",
|
||||
|
|
@ -875,7 +877,7 @@
|
|||
"status.contains_quote": "Yn cynnwys dyfyniad",
|
||||
"status.context.loading": "Yn llwytho mwy o atebion",
|
||||
"status.context.loading_error": "Wedi methu llwytho atebion newydd",
|
||||
"status.context.loading_success": "Wedi llwytho'r holl atebion",
|
||||
"status.context.loading_success": "Atebion newydd wedi'u llwytho",
|
||||
"status.context.more_replies_found": "Mwy o atebion wedi'u canfod",
|
||||
"status.context.retry": "Ceisio eto",
|
||||
"status.context.show": "Dangos",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.",
|
||||
"empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!",
|
||||
"empty_column.direct": "Du har ikke nogen private omtaler endnu. Når du sender eller modtager en, vil den blive vist her.",
|
||||
"empty_column.disabled_feed": "Dette feed er blevet deaktiveret af dine serveradministratorer.",
|
||||
"empty_column.domain_blocks": "Ingen blokerede domæner endnu.",
|
||||
"empty_column.explore_statuses": "Ingen nye trends lige nu. Tjek igen senere!",
|
||||
"empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du føjer et opslag til favoritter, vil det dukke op her.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Indeholder citat",
|
||||
"status.context.loading": "Indlæser flere svar",
|
||||
"status.context.loading_error": "Kunne ikke indlæse nye svar",
|
||||
"status.context.loading_success": "Alle svar indlæst",
|
||||
"status.context.loading_success": "Nye svar indlæst",
|
||||
"status.context.more_replies_found": "Flere svar fundet",
|
||||
"status.context.retry": "Prøv igen",
|
||||
"status.context.show": "Vis",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Du hast bisher keine Beiträge als Lesezeichen abgelegt. Sobald du einen Beitrag als Lesezeichen speicherst, wird er hier erscheinen.",
|
||||
"empty_column.community": "Die lokale Timeline ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!",
|
||||
"empty_column.direct": "Du hast noch keine privaten Erwähnungen. Sobald du eine sendest oder erhältst, wird sie hier erscheinen.",
|
||||
"empty_column.disabled_feed": "Diesen Feed haben deine Server-Administrator*innen deaktiviert.",
|
||||
"empty_column.domain_blocks": "Du hast noch keine Domains blockiert.",
|
||||
"empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder vorbei!",
|
||||
"empty_column.favourited_statuses": "Du hast noch keine Beiträge favorisiert. Sobald du einen favorisierst, wird er hier erscheinen.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Enthält Zitat",
|
||||
"status.context.loading": "Weitere Antworten laden",
|
||||
"status.context.loading_error": "Weitere Antworten konnten nicht geladen werden",
|
||||
"status.context.loading_success": "Alle weiteren Antworten geladen",
|
||||
"status.context.loading_success": "Neue Antworten geladen",
|
||||
"status.context.more_replies_found": "Weitere Antworten verfügbar",
|
||||
"status.context.retry": "Erneut versuchen",
|
||||
"status.context.show": "Anzeigen",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Δεν έχεις καμία ανάρτηση με σελιδοδείκτη ακόμα. Μόλις βάλεις κάποιον, θα εμφανιστεί εδώ.",
|
||||
"empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσια για να αρχίσει να κυλά η μπάλα!",
|
||||
"empty_column.direct": "Δεν έχεις καμία προσωπική επισήμανση ακόμα. Όταν στείλεις ή λάβεις μία, θα εμφανιστεί εδώ.",
|
||||
"empty_column.disabled_feed": "Αυτή η ροή έχει απενεργοποιηθεί από τους διαχειριστές του διακομιστή σας.",
|
||||
"empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.",
|
||||
"empty_column.explore_statuses": "Τίποτα δεν βρίσκεται στις τάσεις αυτή τη στιγμή. Έλεγξε αργότερα!",
|
||||
"empty_column.favourited_statuses": "Δεν έχεις καμία αγαπημένη ανάρτηση ακόμα. Μόλις αγαπήσεις κάποια, θα εμφανιστεί εδώ.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Περιέχει παράθεση",
|
||||
"status.context.loading": "Φόρτωση περισσότερων απαντήσεων",
|
||||
"status.context.loading_error": "Αδυναμία φόρτωσης νέων απαντήσεων",
|
||||
"status.context.loading_success": "Όλες οι απαντήσεις φορτώθηκαν",
|
||||
"status.context.loading_success": "Νέες απαντήσεις φορτώθηκαν",
|
||||
"status.context.more_replies_found": "Βρέθηκαν περισσότερες απαντήσεις",
|
||||
"status.context.retry": "Επανάληψη",
|
||||
"status.context.show": "Εμφάνιση",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
|
||||
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
|
||||
"empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.",
|
||||
"empty_column.disabled_feed": "This feed has been disabled by your server administrators.",
|
||||
"empty_column.domain_blocks": "There are no blocked domains yet.",
|
||||
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
|
||||
"empty_column.favourited_statuses": "You don't have any favorite posts yet. When you favorite one, it will show up here.",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Todavía no tenés mensajes guardados en \"Marcadores\". Cuando guardés uno en \"Marcadores\", se mostrará acá.",
|
||||
"empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!",
|
||||
"empty_column.direct": "Todavía no tenés ninguna mención privada. Cuando enviés o recibás una, se mostrará acá.",
|
||||
"empty_column.disabled_feed": "Esta línea temporal fue deshabilitada por los administradores de tu servidor.",
|
||||
"empty_column.domain_blocks": "Todavía no hay dominios bloqueados.",
|
||||
"empty_column.explore_statuses": "No hay nada en tendencia ahora mismo. ¡Volvé a revisar más tarde!",
|
||||
"empty_column.favourited_statuses": "Todavía no tenés mensajes favoritos. Cuando marqués uno como favorito, se mostrará acá.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Contiene cita",
|
||||
"status.context.loading": "Cargando más respuestas",
|
||||
"status.context.loading_error": "No se pudieron cargar nuevas respuestas",
|
||||
"status.context.loading_success": "Se cargaron todas las respuestas",
|
||||
"status.context.loading_success": "Se cargaron nuevas respuestas",
|
||||
"status.context.more_replies_found": "Se encontraron más respuestas",
|
||||
"status.context.retry": "Reintentar",
|
||||
"status.context.show": "Mostrar",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.",
|
||||
"empty_column.community": "La cronología local está vacía. ¡Escribe algo públicamente para ponerla en marcha!",
|
||||
"empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.",
|
||||
"empty_column.disabled_feed": "Esta cronología ha sido desactivada por los administradores del servidor.",
|
||||
"empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
|
||||
"empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!",
|
||||
"empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando le des favorito a una publicación se mostrarán acá.",
|
||||
|
|
@ -753,7 +754,7 @@
|
|||
"privacy.unlisted.short": "Pública, pero discreta",
|
||||
"privacy_policy.last_updated": "Actualizado por última vez {date}",
|
||||
"privacy_policy.title": "Política de Privacidad",
|
||||
"quote_error.edit": "No se pueden añadir citas mientras se edita una publicación.",
|
||||
"quote_error.edit": "No se pueden añadir citas cuando se edita una publicación.",
|
||||
"quote_error.poll": "No se permite citar encuestas.",
|
||||
"quote_error.quote": "Solo se permite una cita a la vez.",
|
||||
"quote_error.unauthorized": "No estás autorizado a citar esta publicación.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Contiene cita",
|
||||
"status.context.loading": "Cargando más respuestas",
|
||||
"status.context.loading_error": "No se pudieron cargar nuevas respuestas",
|
||||
"status.context.loading_success": "Todas las respuestas cargadas",
|
||||
"status.context.loading_success": "Cargadas nuevas respuestas",
|
||||
"status.context.more_replies_found": "Se han encontrado más respuestas",
|
||||
"status.context.retry": "Reintentar",
|
||||
"status.context.show": "Mostrar",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.",
|
||||
"empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
|
||||
"empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.",
|
||||
"empty_column.disabled_feed": "Esta cronología ha sido desactivada por los administradores del servidor.",
|
||||
"empty_column.domain_blocks": "Todavía no hay dominios bloqueados.",
|
||||
"empty_column.explore_statuses": "No hay nada en tendencia en este momento. ¡Revisa más tarde!",
|
||||
"empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando marques una publicación como favorita, se mostrarán aquí.",
|
||||
|
|
@ -753,7 +754,7 @@
|
|||
"privacy.unlisted.short": "Pública silenciosa",
|
||||
"privacy_policy.last_updated": "Actualizado por última vez {date}",
|
||||
"privacy_policy.title": "Política de Privacidad",
|
||||
"quote_error.edit": "No se pueden añadir citas mientras se edita una publicación.",
|
||||
"quote_error.edit": "No se pueden añadir citas cuando se edita una publicación.",
|
||||
"quote_error.poll": "No es posible citar encuestas.",
|
||||
"quote_error.quote": "Solo se permite una cita a la vez.",
|
||||
"quote_error.unauthorized": "No tienes permiso para citar esta publicación.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Contiene cita",
|
||||
"status.context.loading": "Cargando más respuestas",
|
||||
"status.context.loading_error": "No se pudieron cargar nuevas respuestas",
|
||||
"status.context.loading_success": "Se cargaron todas las respuestas",
|
||||
"status.context.loading_success": "Cargadas nuevas respuestas",
|
||||
"status.context.more_replies_found": "Se encontraron más respuestas",
|
||||
"status.context.retry": "Reintentar",
|
||||
"status.context.show": "Mostrar",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Järjehoidjatesse pole veel lisatud postitusi. Kui lisad mõne, näed neid siin.",
|
||||
"empty_column.community": "Kohalik ajajoon on tühi. Kirjuta midagi avalikult, et pall veerema ajada!",
|
||||
"empty_column.direct": "Sul pole veel ühtegi privaatset mainimist. Kui saadad või saad mõne, ilmuvad need siin.",
|
||||
"empty_column.disabled_feed": "See infovoog on serveri peakasutajate poolt välja lülitatud.",
|
||||
"empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.",
|
||||
"empty_column.explore_statuses": "Praegu pole ühtegi trendi. Tule hiljem tagasi!",
|
||||
"empty_column.favourited_statuses": "Pole veel lemmikpostitusi. Kui märgid mõne, näed neid siin.",
|
||||
|
|
@ -753,6 +754,7 @@
|
|||
"privacy.unlisted.short": "Vaikselt avalik",
|
||||
"privacy_policy.last_updated": "Viimati uuendatud {date}",
|
||||
"privacy_policy.title": "Isikuandmete kaitse",
|
||||
"quote_error.edit": "Postituse muutmisel ei saa tsitaati lisada.",
|
||||
"quote_error.poll": "Tsiteerimine pole küsitlustes lubatud.",
|
||||
"quote_error.quote": "Korraga on lubatud vaid üks tsitaat.",
|
||||
"quote_error.unauthorized": "Sul pole õigust seda postitust tsiteerida.",
|
||||
|
|
@ -875,7 +877,7 @@
|
|||
"status.contains_quote": "Sisaldab tsitaati",
|
||||
"status.context.loading": "Laadin veel vastuseid",
|
||||
"status.context.loading_error": "Uute vastuste laadimine ei õnnestunud",
|
||||
"status.context.loading_success": "Kõik vastused on laaditud",
|
||||
"status.context.loading_success": "Uued vastused on laaditud",
|
||||
"status.context.more_replies_found": "Leidub veel vastuseid",
|
||||
"status.context.retry": "Proovi uuesti",
|
||||
"status.context.show": "Näita",
|
||||
|
|
|
|||
|
|
@ -876,7 +876,7 @@
|
|||
"status.contains_quote": "Sisältää lainauksen",
|
||||
"status.context.loading": "Ladataan lisää vastauksia",
|
||||
"status.context.loading_error": "Ei voitu ladata lisää vastauksia",
|
||||
"status.context.loading_success": "Kaikki vastaukset ladattu",
|
||||
"status.context.loading_success": "Uudet vastaukset ladattu",
|
||||
"status.context.more_replies_found": "Löytyi lisää vastauksia",
|
||||
"status.context.retry": "Yritä uudelleen",
|
||||
"status.context.show": "Näytä",
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
"account.follows.empty": "Hesin brúkari fylgir ongum enn.",
|
||||
"account.follows_you": "Fylgir tær",
|
||||
"account.go_to_profile": "Far til vanga",
|
||||
"account.hide_reblogs": "Fjal lyft frá @{name}",
|
||||
"account.hide_reblogs": "Fjal stimbran frá @{name}",
|
||||
"account.in_memoriam": "In memoriam.",
|
||||
"account.joined_short": "Gjørdist limur",
|
||||
"account.languages": "Broyt fylgd mál",
|
||||
|
|
@ -79,7 +79,7 @@
|
|||
"account.requested_follow": "{name} hevur biðið um at fylgja tær",
|
||||
"account.requests_to_follow_you": "Umbønir um at fylgja tær",
|
||||
"account.share": "Deil vanga @{name}'s",
|
||||
"account.show_reblogs": "Vís lyft frá @{name}",
|
||||
"account.show_reblogs": "Vís stimbran frá @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} postur} other {{counter} postar}}",
|
||||
"account.unblock": "Banna ikki @{name}",
|
||||
"account.unblock_domain": "Banna ikki økisnavnið {domain}",
|
||||
|
|
@ -122,7 +122,7 @@
|
|||
"annual_report.summary.followers.total": "{count} íalt",
|
||||
"annual_report.summary.here_it_is": "Her er ein samandráttur av {year}:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "mest dámdi postur",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "oftast lyfti postur",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "oftast stimbraði postur",
|
||||
"annual_report.summary.highlighted_post.by_replies": "postur við flestum svarum",
|
||||
"annual_report.summary.highlighted_post.possessive": "hjá {name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "mest brúkta app",
|
||||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Tú hevur enn einki goymt uppslag. Tú tú goymir eitt uppslag, kemur tað her.",
|
||||
"empty_column.community": "Lokala tíðarlinjan er tóm. Skriva okkurt alment fyri at fáa boltin á rull!",
|
||||
"empty_column.direct": "Tú hevur ongar privatar umrøður enn. Tá tú sendir ella móttekur eina privata umrøðu, so verður hon sjónlig her.",
|
||||
"empty_column.disabled_feed": "Hendan rásin er gjørd óvirkin av ambætaraumsitarunum hjá tær.",
|
||||
"empty_column.domain_blocks": "Enn eru eingi blokeraði domenir.",
|
||||
"empty_column.explore_statuses": "Einki rák er beint nú. Royn aftur seinni!",
|
||||
"empty_column.favourited_statuses": "Tú hevur ongar yndispostar enn. Tá tú gevur einum posti yndismerki, so sært tú hann her.",
|
||||
|
|
@ -441,7 +442,7 @@
|
|||
"hints.profiles.see_more_follows": "Sí fleiri, ið viðkomandi fylgir, á {domain}",
|
||||
"hints.profiles.see_more_posts": "Sí fleiri postar á {domain}",
|
||||
"home.column_settings.show_quotes": "Vís siteringar",
|
||||
"home.column_settings.show_reblogs": "Vís lyft",
|
||||
"home.column_settings.show_reblogs": "Vís stimbranir",
|
||||
"home.column_settings.show_replies": "Vís svar",
|
||||
"home.hide_announcements": "Fjal kunngerðir",
|
||||
"home.pending_critical_update.body": "Vinarliga dagfør Mastodon ambætaran hjá tær so skjótt sum møguligt!",
|
||||
|
|
@ -473,7 +474,7 @@
|
|||
"intervals.full.minutes": "{number, plural, one {# minuttur} other {# minuttir}}",
|
||||
"keyboard_shortcuts.back": "Bakka",
|
||||
"keyboard_shortcuts.blocked": "Siggj listan við bannaðum brúkarum",
|
||||
"keyboard_shortcuts.boost": "Lyft post",
|
||||
"keyboard_shortcuts.boost": "Stimbra post",
|
||||
"keyboard_shortcuts.column": "Fá teig í miðdepilin",
|
||||
"keyboard_shortcuts.compose": "Fá skriviøkið í miðdeplin",
|
||||
"keyboard_shortcuts.description": "Frágreiðing",
|
||||
|
|
@ -626,7 +627,7 @@
|
|||
"notification.own_poll": "Tín atkvøðugreiðsla er endað",
|
||||
"notification.poll": "Ein atkvøðugreiðsla, har tú atkvøddi, er endað",
|
||||
"notification.quoted_update": "{name} rættaði ein post, sum tú hevur siterað",
|
||||
"notification.reblog": "{name} lyfti tín post",
|
||||
"notification.reblog": "{name} stimbraði tín post",
|
||||
"notification.reblog.name_and_others_with_link": "{name} og <a>{count, plural, one {# annar/onnur} other {# onnur}}</a> framhevjaðu tín post",
|
||||
"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.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Inniheldur sitat",
|
||||
"status.context.loading": "Tekur fleiri svar niður",
|
||||
"status.context.loading_error": "Fekk ikki tikið nýggj svar niður",
|
||||
"status.context.loading_success": "Øll svar tikin niður",
|
||||
"status.context.loading_success": "Nýggj svar tikin niður",
|
||||
"status.context.more_replies_found": "Fleiri svar funnin",
|
||||
"status.context.retry": "Royn aftur",
|
||||
"status.context.show": "Vís",
|
||||
|
|
|
|||
|
|
@ -869,7 +869,6 @@
|
|||
"status.contains_quote": "Contient la citation",
|
||||
"status.context.loading": "Chargement de réponses supplémentaires",
|
||||
"status.context.loading_error": "Impossible de charger les nouvelles réponses",
|
||||
"status.context.loading_success": "Toutes les réponses sont chargées",
|
||||
"status.context.more_replies_found": "Plus de réponses trouvées",
|
||||
"status.context.retry": "Réessayer",
|
||||
"status.context.show": "Montrer",
|
||||
|
|
|
|||
|
|
@ -869,7 +869,6 @@
|
|||
"status.contains_quote": "Contient la citation",
|
||||
"status.context.loading": "Chargement de réponses supplémentaires",
|
||||
"status.context.loading_error": "Impossible de charger les nouvelles réponses",
|
||||
"status.context.loading_success": "Toutes les réponses sont chargées",
|
||||
"status.context.more_replies_found": "Plus de réponses trouvées",
|
||||
"status.context.retry": "Réessayer",
|
||||
"status.context.show": "Montrer",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Níl aon phostáil leabharmharcaithe agat fós. Nuair a dhéanann tú leabharmharc, beidh sé le feiceáil anseo.",
|
||||
"empty_column.community": "Tá an amlíne áitiúil folamh. Foilsigh rud éigin go poiblí le tús a chur le cúrsaí!",
|
||||
"empty_column.direct": "Níl aon tagairtí príobháideacha agat fós. Nuair a sheolann tú nó a gheobhaidh tú ceann, beidh sé le feiceáil anseo.",
|
||||
"empty_column.disabled_feed": "Tá an fotha seo díchumasaithe ag riarthóirí do fhreastalaí.",
|
||||
"empty_column.domain_blocks": "Níl aon fearainn bhactha ann go fóill.",
|
||||
"empty_column.explore_statuses": "Níl rud ar bith ag treochtáil faoi láthair. Tar ar ais ar ball!",
|
||||
"empty_column.favourited_statuses": "Níl aon postálacha is fearr leat fós. Nuair is fearr leat ceann, beidh sé le feiceáil anseo.",
|
||||
|
|
@ -753,6 +754,7 @@
|
|||
"privacy.unlisted.short": "Poiblí ciúin",
|
||||
"privacy_policy.last_updated": "Nuashonraithe {date}",
|
||||
"privacy_policy.title": "Polasaí príobháideachais",
|
||||
"quote_error.edit": "Ní féidir Sleachta a chur leis agus post á chur in eagar.",
|
||||
"quote_error.poll": "Ní cheadaítear lua le pobalbhreitheanna.",
|
||||
"quote_error.quote": "Ní cheadaítear ach luachan amháin ag an am.",
|
||||
"quote_error.unauthorized": "Níl údarás agat an post seo a lua.",
|
||||
|
|
@ -875,7 +877,7 @@
|
|||
"status.contains_quote": "Tá luachan ann",
|
||||
"status.context.loading": "Ag lódáil tuilleadh freagraí",
|
||||
"status.context.loading_error": "Níorbh fhéidir freagraí nua a lódáil",
|
||||
"status.context.loading_success": "Luchtaithe na freagraí uile",
|
||||
"status.context.loading_success": "Freagraí nua luchtaithe",
|
||||
"status.context.more_replies_found": "Tuilleadh freagraí aimsithe",
|
||||
"status.context.retry": "Déan iarracht arís",
|
||||
"status.context.show": "Taispeáin",
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
"account.disable_notifications": "Na cuir brath thugam tuilleadh nuair a chuireas @{name} post ris",
|
||||
"account.domain_blocking": "Àrainn ’ga bacadh",
|
||||
"account.edit_profile": "Deasaich a’ phròifil",
|
||||
"account.edit_profile_short": "Deasaich",
|
||||
"account.enable_notifications": "Cuir brath thugam nuair a chuireas @{name} post ris",
|
||||
"account.endorse": "Brosnaich air a’ phròifil",
|
||||
"account.familiar_followers_many": "’Ga leantainn le {name1}, {name2}, and {othersCount, plural, one {# eile air a bheil thu eòlach} other {# eile air a bheil thu eòlach}}",
|
||||
|
|
@ -40,6 +41,11 @@
|
|||
"account.featured_tags.last_status_never": "Gun phost",
|
||||
"account.follow": "Lean",
|
||||
"account.follow_back": "Lean air ais",
|
||||
"account.follow_back_short": "Lean air ais",
|
||||
"account.follow_request": "Iarr leantainn",
|
||||
"account.follow_request_cancel": "Sguir dhen iarrtas",
|
||||
"account.follow_request_cancel_short": "Sguir dheth",
|
||||
"account.follow_request_short": "Iarr",
|
||||
"account.followers": "Luchd-leantainn",
|
||||
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}",
|
||||
|
|
@ -125,7 +131,7 @@
|
|||
"annual_report.summary.new_posts.new_posts": "postaichean ùra",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Tha thu am measg</topLabel><percentage></percentage><bottomLabel>dhen luchd-cleachdaidh as cliùitiche air {domain}.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Ainmeil ’nad latha ’s ’nad linn.",
|
||||
"annual_report.summary.thanks": "Mòran taing airson conaltradh air Mastodon.",
|
||||
"annual_report.summary.thanks": "Mòran taing airson conaltradh air Mastodon!",
|
||||
"attachments_list.unprocessed": "(gun phròiseasadh)",
|
||||
"audio.hide": "Falaich an fhuaim",
|
||||
"block_modal.remote_users_caveat": "Iarraidh sinn air an fhrithealaiche {domain} gun gèill iad ri do cho-dhùnadh. Gidheadh, chan eil barantas gun gèill iad on a làimhsicheas cuid a fhrithealaichean bacaidhean air dòigh eadar-dhealaichte. Dh’fhaoidte gum faic daoine gun chlàradh a-steach na postaichean poblach agad fhathast.",
|
||||
|
|
@ -251,7 +257,12 @@
|
|||
"confirmations.revoke_quote.confirm": "Thoir am post air falbh",
|
||||
"confirmations.revoke_quote.message": "Cha ghabh seo a neo-dhèanamh.",
|
||||
"confirmations.revoke_quote.title": "A bheil thu airson am post a thoirt air falbh?",
|
||||
"confirmations.unblock.confirm": "Dì-bhac",
|
||||
"confirmations.unblock.title": "A bheil thu airson {name} a dhì-bhacadh?",
|
||||
"confirmations.unfollow.confirm": "Na lean tuilleadh",
|
||||
"confirmations.unfollow.title": "A bheil thu airson sgur de {name} a leantainn?",
|
||||
"confirmations.withdraw_request.confirm": "Cuir d’ iarrtas dhan dàrna taobh",
|
||||
"confirmations.withdraw_request.title": "A bheil thu airson d’ iarrtas gus {name} a leantainn a chur dhan dàrna taobh?",
|
||||
"content_warning.hide": "Falaich am post",
|
||||
"content_warning.show": "Seall e co-dhiù",
|
||||
"content_warning.show_more": "Seall barrachd dheth",
|
||||
|
|
@ -734,14 +745,15 @@
|
|||
"privacy.private.short": "Luchd-leantainn",
|
||||
"privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon",
|
||||
"privacy.public.short": "Poblach",
|
||||
"privacy.quote.anyone": "{visibility}, faodaidh neach sam bith a luaidh",
|
||||
"privacy.quote.disabled": "{visibility}, luaidhean à comas",
|
||||
"privacy.quote.limited": "{visibility}, luaidhean cuingichte",
|
||||
"privacy.quote.anyone": "{visibility}, luaidhidh neach sam bith e",
|
||||
"privacy.quote.disabled": "{visibility}, luaidh à comas",
|
||||
"privacy.quote.limited": "{visibility}, luaidh cuingichte",
|
||||
"privacy.unlisted.additional": "Tha seo coltach ris an fhaicsinneachd phoblach ach cha nochd am post air loidhnichean-ama an t-saoghail phoblaich, nan tagaichean hais no an rùrachaidh no ann an toraidhean luirg Mhastodon fiù ’s ma thug thu ro-aonta airson sin seachad.",
|
||||
"privacy.unlisted.long": "Falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach",
|
||||
"privacy.unlisted.short": "Poblach ach sàmhach",
|
||||
"privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}",
|
||||
"privacy_policy.title": "Poileasaidh prìobhaideachd",
|
||||
"quote_error.edit": "Chan urrainn dhut luaidh a chur ris nuair a bhios tu ri deasachadh puist.",
|
||||
"quote_error.poll": "Chan fhaod thu luaidh a chur an cois cunntais-bheachd.",
|
||||
"quote_error.quote": "Chan eil taic ach ri aon luaidh aig an aon àm.",
|
||||
"quote_error.unauthorized": "Chan fhaod thu am post seo a luaidh.",
|
||||
|
|
@ -861,6 +873,13 @@
|
|||
"status.cancel_reblog_private": "Na brosnaich tuilleadh",
|
||||
"status.cannot_quote": "Chan fhaod thu am post seo a luaidh",
|
||||
"status.cannot_reblog": "Cha ghabh am post seo brosnachadh",
|
||||
"status.contains_quote": "Tha luaidh na bhroinn",
|
||||
"status.context.loading": "A’ luchdadh barrachd fhreagairtean",
|
||||
"status.context.loading_error": "Cha b’ urrainn dhuinn nam freagairtean ùra a luchdadh",
|
||||
"status.context.loading_success": "Chaidh na freagairtean ùra a luchdadh",
|
||||
"status.context.more_replies_found": "Fhuair sinn lorg air barrachd fhreagairtean",
|
||||
"status.context.retry": "Feuch ris a-rithist",
|
||||
"status.context.show": "Seall",
|
||||
"status.continued_thread": "Pàirt de shnàithlean",
|
||||
"status.copy": "Dèan lethbhreac dhen cheangal dhan phost",
|
||||
"status.delete": "Sguab às",
|
||||
|
|
@ -890,17 +909,22 @@
|
|||
"status.quote": "Luaidh",
|
||||
"status.quote.cancel": "Sguir dhen luaidh",
|
||||
"status.quote_error.filtered": "Falaichte le criathrag a th’ agad",
|
||||
"status.quote_error.limited_account_hint.action": "Seall e co-dhiù",
|
||||
"status.quote_error.limited_account_hint.title": "Chaidh an cunntas seo fhalach le maoir {domain}.",
|
||||
"status.quote_error.not_available": "Chan eil am post ri fhaighinn",
|
||||
"status.quote_error.pending_approval": "Cha deach dèiligeadh ris a’ phost fhathast",
|
||||
"status.quote_error.pending_approval_popout.body": "Air Mastodon, ’s urrainn dhut stiùireadh am faod cuideigin do luaidh gus nach fhaod. Tha am post seo a’ feitheamh air aonta an ùghdair thùsail.",
|
||||
"status.quote_error.revoked": "Chaidh am post a thoirt air falbh leis an ùghdar",
|
||||
"status.quote_followers_only": "Chan fhaod ach luchd-leantainn am post seo a luaidh",
|
||||
"status.quote_manual_review": "Nì an t-ùghdar lèirmheas air a làimh",
|
||||
"status.quote_noun": "Luaidh",
|
||||
"status.quote_policy_change": "Atharraich cò dh’fhaodas luaidh",
|
||||
"status.quote_post_author": "Luaidh air post le @{name}",
|
||||
"status.quote_private": "Chan fhaodar postaichean prìobhaideach a luaidh",
|
||||
"status.quotes": "{count, plural, one {luaidh} two {luaidh} few {luaidhean} other {luaidh}}",
|
||||
"status.quotes.empty": "Chan deach am post seo a luaidh le duine sam bith fhathast. Nuair a luaidheas cuideigin e, nochdaidh iad an-seo.",
|
||||
"status.quotes.local_other_disclaimer": "Cha tèid luaidhean a dhiùilt an ùghdar a shealltainn.",
|
||||
"status.quotes.remote_other_disclaimer": "Cha dèid ach luaidhean o {domain} a shealltainn an-seo le cinnt. Cha dèid luaidhean a dhiùilt an ùghdar a shealltainn.",
|
||||
"status.read_more": "Leugh an còrr",
|
||||
"status.reblog": "Brosnaich",
|
||||
"status.reblog_or_quote": "Brosnaich no luaidh",
|
||||
|
|
@ -987,11 +1011,11 @@
|
|||
"visibility_modal.helper.privacy_private_self_quote": "Chan fhaodar fèin-luaidhean air postaichean prìobhaideach a dhèanamh poblach.",
|
||||
"visibility_modal.helper.private_quoting": "Chan urrainn do chàch postaichean dhan luchd-leantainn a-mhàin a chaidh a sgrìobhadh le Mastodon a luaidh.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Nuair a luaidheas daoine thu, thèid am post aca-san fhalach o loidhnichean-ama nan treandaichean.",
|
||||
"visibility_modal.instructions": "Stiùirich cò dh’fhaodas eadar-ghabhahil leis a’ phost seo. ’S urrainn dhut do roghainnean airson nam postaichean ri teachd a thaghadh aig <link>Roghainnean > Bun-roghainnean a’ phostaidh</link>",
|
||||
"visibility_modal.instructions": "Stiùirich cò dh’fhaodas eadar-ghabhahil leis a’ phost seo. ’S urrainn dhut do roghainnean airson nam postaichean ri teachd a thaghadh aig <link>Roghainnean > Bun-roghainnean a’ phostaidh</link>.",
|
||||
"visibility_modal.privacy_label": "Faicsinneachd",
|
||||
"visibility_modal.quote_followers": "Luchd-leantainn a-mhàin",
|
||||
"visibility_modal.quote_label": "Cò dh’fhaodas luaidh",
|
||||
"visibility_modal.quote_nobody": "Mi fhìn a-mhàin",
|
||||
"visibility_modal.quote_public": "Duine sam bith",
|
||||
"visibility_modal.quote_public": "Neach sam bith",
|
||||
"visibility_modal.save": "Sàbhail"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Aínda non marcaches ningunha publicación. Cando o fagas, aparecerán aquí.",
|
||||
"empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!",
|
||||
"empty_column.direct": "Aínda non tes mencións privadas. Cando envíes ou recibas unha, aparecerá aquí.",
|
||||
"empty_column.disabled_feed": "A administración do teu servidor desactivou esta canle.",
|
||||
"empty_column.domain_blocks": "Aínda non hai dominios agochados.",
|
||||
"empty_column.explore_statuses": "Non hai temas en voga. Volve máis tarde!",
|
||||
"empty_column.favourited_statuses": "Aínda non tes publicacións favoritas. Cando favorezas unha, aparecerá aquí.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Contén unha cita",
|
||||
"status.context.loading": "Cargando máis respostas",
|
||||
"status.context.loading_error": "Non se puideron mostrar novas respostas",
|
||||
"status.context.loading_success": "Móstranse todas as respostas",
|
||||
"status.context.loading_success": "Móstranse novas respostas",
|
||||
"status.context.more_replies_found": "Existen máis respostas",
|
||||
"status.context.retry": "Volver tentar",
|
||||
"status.context.show": "Mostrar",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "אין עדיין הודעות שחיבבת. כשתחבב את הראשונה, היא תופיע כאן.",
|
||||
"empty_column.community": "פיד השרת המקומי ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
|
||||
"empty_column.direct": "אין לך שום הודעות פרטיות עדיין. כשתשלחו או תקבלו אחת, היא תופיע כאן.",
|
||||
"empty_column.disabled_feed": "פיד זה נחסם לשימוש על ידי מנהלי השרת שלך.",
|
||||
"empty_column.domain_blocks": "אין עדיין קהילות מוסתרות.",
|
||||
"empty_column.explore_statuses": "אין נושאים חמים כרגע. אולי אחר כך!",
|
||||
"empty_column.favourited_statuses": "אין עדיין הודעות שחיבבת. כשתחבב/י את הראשונה, היא תופיע כאן.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "הודעה מכילה ציטוט",
|
||||
"status.context.loading": "נטענות תשובות נוספות",
|
||||
"status.context.loading_error": "טעינת תשובות נוספות נכשלה",
|
||||
"status.context.loading_success": "כל התשובות נטענו",
|
||||
"status.context.loading_success": "תשובות חדשות נטענו",
|
||||
"status.context.more_replies_found": "תשובות נוספות נמצאו",
|
||||
"status.context.retry": "נסה שוב",
|
||||
"status.context.show": "הצג",
|
||||
|
|
@ -919,7 +920,7 @@
|
|||
"status.quote_manual_review": "מחבר.ת ההודעה יחזרו אליך אחרי בדיקה",
|
||||
"status.quote_noun": "ציטוט",
|
||||
"status.quote_policy_change": "הגדרת הרשאה לציטוט הודעותיך",
|
||||
"status.quote_post_author": "ההודעה צוטטה על ידי @{name}",
|
||||
"status.quote_post_author": "ההודעה היא ציטוט של @{name}",
|
||||
"status.quote_private": "הודעות פרטיות לא ניתנות לציטוט",
|
||||
"status.quotes": "{count, plural,one {ציטוט}other {ציטוטים}}",
|
||||
"status.quotes.empty": "עוד לא ציטטו את ההודעה הזו. כאשר זה יקרה, הציטוטים יופיעו כאן.",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Még nincs egyetlen könyvjelzőzött bejegyzésed sem. Ha könyvjelzőzöl egyet, itt fog megjelenni.",
|
||||
"empty_column.community": "A helyi idővonal üres. Tégy közzé valamit nyilvánosan, hogy elindítsd az eseményeket!",
|
||||
"empty_column.direct": "Még nincs egy személyes említésed sem. Küldéskor vagy fogadáskor itt fognak megjelenni.",
|
||||
"empty_column.disabled_feed": "A kiszolgálód rendszergazdái letiltották ezt a hírfolyamot.",
|
||||
"empty_column.domain_blocks": "Még nem lett letiltva egyetlen domain sem.",
|
||||
"empty_column.explore_statuses": "Jelenleg semmi sem felkapott. Nézz vissza később!",
|
||||
"empty_column.favourited_statuses": "Még nincs egyetlen kedvenc bejegyzésed sem. Ha kedvencnek jelölsz egyet, itt fog megjelenni.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Idézést tartalmaz",
|
||||
"status.context.loading": "Több válasz betöltése",
|
||||
"status.context.loading_error": "Az új válaszok nem tölthetőek be",
|
||||
"status.context.loading_success": "Összes válasz betöltve",
|
||||
"status.context.loading_success": "Új válaszok betöltve",
|
||||
"status.context.more_replies_found": "Több válasz található",
|
||||
"status.context.retry": "Újra",
|
||||
"status.context.show": "Megjelenítés",
|
||||
|
|
@ -914,7 +915,7 @@
|
|||
"status.quote_error.not_available": "A bejegyzés nem érhető el",
|
||||
"status.quote_error.pending_approval": "A bejegyzés függőben van",
|
||||
"status.quote_error.pending_approval_popout.body": "A Mastodonon te mondod meg, hogy valaki idézhet-e. Ez a bejegyzés addig függőben marad, amíg az eredeti szerző nem engedélyezi azt.",
|
||||
"status.quote_error.revoked": "A szerző eltávolítta a bejegyzést",
|
||||
"status.quote_error.revoked": "A szerző eltávolította a bejegyzést",
|
||||
"status.quote_followers_only": "Csak a követők idézhetik ezt a bejegyzést",
|
||||
"status.quote_manual_review": "A szerző kézileg fogja jóváhagyni",
|
||||
"status.quote_noun": "Idézés",
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@
|
|||
"column.domain_blocks": "Dominios blocate",
|
||||
"column.edit_list": "Modificar lista",
|
||||
"column.favourites": "Favorites",
|
||||
"column.firehose": "Fluxos in directo",
|
||||
"column.firehose": "Fluxos in vivo",
|
||||
"column.follow_requests": "Requestas de sequimento",
|
||||
"column.home": "Initio",
|
||||
"column.list_members": "Gerer le membros del lista",
|
||||
|
|
@ -257,7 +257,12 @@
|
|||
"confirmations.revoke_quote.confirm": "Remover message",
|
||||
"confirmations.revoke_quote.message": "Iste action non pote esser disfacite.",
|
||||
"confirmations.revoke_quote.title": "Remover message?",
|
||||
"confirmations.unblock.confirm": "Disblocar",
|
||||
"confirmations.unblock.title": "Disblocar {name}?",
|
||||
"confirmations.unfollow.confirm": "Non plus sequer",
|
||||
"confirmations.unfollow.title": "Cessar de sequer {name}?",
|
||||
"confirmations.withdraw_request.confirm": "Retirar requesta",
|
||||
"confirmations.withdraw_request.title": "Retirar le requesta de sequer {name}?",
|
||||
"content_warning.hide": "Celar le message",
|
||||
"content_warning.show": "Monstrar in omne caso",
|
||||
"content_warning.show_more": "Monstrar plus",
|
||||
|
|
@ -328,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Tu non ha ancora messages in marcapaginas. Quando tu adde un message al marcapaginas, illo apparera hic.",
|
||||
"empty_column.community": "Le chronologia local es vacue. Scribe qualcosa public pro poner le cosas in marcha!",
|
||||
"empty_column.direct": "Tu non ha ancora mentiones private. Quando tu invia o recipe un mention, illo apparera hic.",
|
||||
"empty_column.disabled_feed": "Iste canal ha essite disactivate per le adminsistratores de tu servitor.",
|
||||
"empty_column.domain_blocks": "Il non ha dominios blocate ancora.",
|
||||
"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.",
|
||||
|
|
@ -455,7 +461,7 @@
|
|||
"ignore_notifications_modal.not_following_title": "Ignorar notificationes de personas que tu non seque?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Ignorar notificationes de mentiones private non requestate?",
|
||||
"info_button.label": "Adjuta",
|
||||
"info_button.what_is_alt_text": "<h1>Que es texto alternative?</h1><p>Le texto alternative forni descriptiones de imagines a personas con impedimentos visual, con connexiones lente, o qui cerca contexto additional.</p><p>Tu pote meliorar le accessibilitate e le comprension pro totes scribente un texto alternative clar, concise e objective.</p><ul><li>Captura le elementos importante</li><li>Summarisa texto in imagines</li><li>Usa le structura de phrase normal</li><li>Evita information redundante</li><li>In figuras complexe (como diagrammas o mappas), concentra te sur le tendentias e punctos clave</li></ul>",
|
||||
"info_button.what_is_alt_text": "<h1>Que es texto alternative?</h1><p>Le texto alternative forni descriptiones de imagines a personas con impedimentos visual, con connexiones lente a internet, o qui cerca contexto supplementari.</p><p>Tu pote meliorar le accessibilitate e le comprension pro totes si tu scribe un texto alternative clar, concise e objective.</p><ul><li>Captura le elementos importante</li><li>Summarisa texto in imagines</li><li>Usa un structura conventional de phrases</li><li>Evita information redundante</li><li>In figuras complexe (como diagrammas o mappas), concentra te sur le tendentias e punctos clave</li></ul>",
|
||||
"interaction_modal.action": "Pro interager con le message de {name}, tu debe acceder a tu conto sur le servitor Mastodon que tu usa.",
|
||||
"interaction_modal.go": "Revenir",
|
||||
"interaction_modal.no_account_yet": "Tu non ha ancora un conto?",
|
||||
|
|
@ -569,8 +575,8 @@
|
|||
"navigation_bar.follows_and_followers": "Sequites e sequitores",
|
||||
"navigation_bar.import_export": "Importar e exportar",
|
||||
"navigation_bar.lists": "Listas",
|
||||
"navigation_bar.live_feed_local": "Canal in directo (local)",
|
||||
"navigation_bar.live_feed_public": "Canal in directo (public)",
|
||||
"navigation_bar.live_feed_local": "Canal in vivo (local)",
|
||||
"navigation_bar.live_feed_public": "Canal in vivo (public)",
|
||||
"navigation_bar.logout": "Clauder session",
|
||||
"navigation_bar.moderation": "Moderation",
|
||||
"navigation_bar.more": "Plus",
|
||||
|
|
@ -743,11 +749,12 @@
|
|||
"privacy.quote.anyone": "{visibility}, omnes pote citar",
|
||||
"privacy.quote.disabled": "{visibility}, citation disactivate",
|
||||
"privacy.quote.limited": "{visibility}, citation limitate",
|
||||
"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.unlisted.additional": "Isto es exactemente como public, excepte que le message non apparera in fluxos in vivo, in hashtags, in Explorar, o in le recerca de Mastodon, mesmo si tu ha optate pro render tote le conto discoperibile.",
|
||||
"privacy.unlisted.long": "Non apparera in le resultatos de recerca, tendentias e chronologias public de Mastodon",
|
||||
"privacy.unlisted.short": "Public, non listate",
|
||||
"privacy_policy.last_updated": "Ultime actualisation {date}",
|
||||
"privacy_policy.title": "Politica de confidentialitate",
|
||||
"quote_error.edit": "Non es possibile adder citationes quando se modifica un message.",
|
||||
"quote_error.poll": "Non es permittite citar sondages.",
|
||||
"quote_error.quote": "Solmente un citation al vice es permittite.",
|
||||
"quote_error.unauthorized": "Tu non es autorisate a citar iste message.",
|
||||
|
|
@ -870,7 +877,7 @@
|
|||
"status.contains_quote": "Contine un citation",
|
||||
"status.context.loading": "Cargante plus responsas",
|
||||
"status.context.loading_error": "Non poteva cargar nove responsas",
|
||||
"status.context.loading_success": "Tote le responsas cargate",
|
||||
"status.context.loading_success": "Nove responsas cargate",
|
||||
"status.context.more_replies_found": "Plus responsas trovate",
|
||||
"status.context.retry": "Tentar de novo",
|
||||
"status.context.show": "Monstrar",
|
||||
|
|
@ -917,6 +924,8 @@
|
|||
"status.quote_private": "Le messages private non pote esser citate",
|
||||
"status.quotes": "{count, plural, one {citation} other {citationes}}",
|
||||
"status.quotes.empty": "Necuno ha ancora citate iste message. Quando alcuno lo face, illo apparera hic.",
|
||||
"status.quotes.local_other_disclaimer": "Le citationes rejectate per le autor non essera monstrate.",
|
||||
"status.quotes.remote_other_disclaimer": "Solmente le citationes de {domain} se garanti de esser monstrate hic. Citationes rejectate per le autor non essera monstrate.",
|
||||
"status.read_more": "Leger plus",
|
||||
"status.reblog": "Impulsar",
|
||||
"status.reblog_or_quote": "Impulsar o citar",
|
||||
|
|
|
|||
|
|
@ -312,9 +312,9 @@
|
|||
"emoji_button.custom": "Sérsniðin",
|
||||
"emoji_button.flags": "Flögg",
|
||||
"emoji_button.food": "Matur og drykkur",
|
||||
"emoji_button.label": "Setja inn tjáningartákn",
|
||||
"emoji_button.label": "Setja inn lyndistákn",
|
||||
"emoji_button.nature": "Náttúra",
|
||||
"emoji_button.not_found": "Engin samsvarandi tjáningartákn fundust",
|
||||
"emoji_button.not_found": "Engin samsvarandi lyndistákn fundust",
|
||||
"emoji_button.objects": "Hlutir",
|
||||
"emoji_button.people": "Fólk",
|
||||
"emoji_button.recent": "Oft notuð",
|
||||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.",
|
||||
"empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!",
|
||||
"empty_column.direct": "Þú ert ekki ennþá með neitt einkaspjall við neinn. Þegar þú sendir eða tekur við slíku, mun það birtast hér.",
|
||||
"empty_column.disabled_feed": "Þetta streymi hefur verið gert óvirkt af stjórnendum netþjónis þíns.",
|
||||
"empty_column.domain_blocks": "Það eru ennþá engin útilokuð lén.",
|
||||
"empty_column.explore_statuses": "Ekkert er á uppleið í augnablikinu. Athugaðu aftur síðar!",
|
||||
"empty_column.favourited_statuses": "Þú ert ekki ennþá með neinar eftirlætisfærslur. Þegar þú setur færslu í eftirlæti, munu þau birtast hér.",
|
||||
|
|
@ -753,6 +754,7 @@
|
|||
"privacy.unlisted.short": "Hljóðlátt opinbert",
|
||||
"privacy_policy.last_updated": "Síðast uppfært {date}",
|
||||
"privacy_policy.title": "Persónuverndarstefna",
|
||||
"quote_error.edit": "Ekki er hægt að bæta við tilvitnunum þegar færslum er breytt.",
|
||||
"quote_error.poll": "Ekki er leyft að vitna í kannanir.",
|
||||
"quote_error.quote": "Einungis ein tilvitnun er leyfð í einu.",
|
||||
"quote_error.unauthorized": "Þú hefur ekki heimild til að vitna í þessa færslu.",
|
||||
|
|
@ -875,7 +877,7 @@
|
|||
"status.contains_quote": "Inniheldur tilvitnun",
|
||||
"status.context.loading": "Hleð inn fleiri svörum",
|
||||
"status.context.loading_error": "Gat ekki hlaðið inn nýjum svörum",
|
||||
"status.context.loading_success": "Öllum svörum hlaðið inn",
|
||||
"status.context.loading_success": "Nýjum svörum hlaðið inn",
|
||||
"status.context.more_replies_found": "Fleiri svör fundust",
|
||||
"status.context.retry": "Reyna aftur",
|
||||
"status.context.show": "Sýna",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Non hai ancora salvato nei segnalibri alcun post. Quando lo farai, apparirà qui.",
|
||||
"empty_column.community": "La cronologia locale è vuota. Scrivi qualcosa pubblicamente per dare inizio alla festa!",
|
||||
"empty_column.direct": "Non hai ancora alcuna menzione privata. Quando ne invierai o riceverai una, apparirà qui.",
|
||||
"empty_column.disabled_feed": "Questo feed è stato disabilitato dagli amministratori del tuo server.",
|
||||
"empty_column.domain_blocks": "Ancora nessun dominio bloccato.",
|
||||
"empty_column.explore_statuses": "Nulla è in tendenza al momento. Ricontrolla più tardi!",
|
||||
"empty_column.favourited_statuses": "Non hai ancora alcun post preferito. Quando ne salverai uno tra i preferiti, apparirà qui.",
|
||||
|
|
@ -753,6 +754,7 @@
|
|||
"privacy.unlisted.short": "Pubblico silenzioso",
|
||||
"privacy_policy.last_updated": "Ultimo aggiornamento {date}",
|
||||
"privacy_policy.title": "Politica sulla Privacy",
|
||||
"quote_error.edit": "Le citazioni non possono essere aggiunte quando si modifica un post.",
|
||||
"quote_error.poll": "Nei sondaggi non sono consentite le citazioni.",
|
||||
"quote_error.quote": "È consentita una sola citazione alla volta.",
|
||||
"quote_error.unauthorized": "Non sei autorizzato a citare questo post.",
|
||||
|
|
@ -875,7 +877,7 @@
|
|||
"status.contains_quote": "Contiene una citazione",
|
||||
"status.context.loading": "Caricamento di altre risposte",
|
||||
"status.context.loading_error": "Impossibile caricare nuove risposte",
|
||||
"status.context.loading_success": "Tutte le risposte caricate",
|
||||
"status.context.loading_success": "Nuove risposte caricate",
|
||||
"status.context.more_replies_found": "Sono state trovate altre risposte",
|
||||
"status.context.retry": "Riprova",
|
||||
"status.context.show": "Mostra",
|
||||
|
|
|
|||
|
|
@ -742,7 +742,7 @@
|
|||
"privacy_policy.title": "개인정보처리방침",
|
||||
"quote_error.poll": "인용과 투표를 함께 사용할 수 없습니다.",
|
||||
"quote_error.quote": "한 번의 인용만 허용됩니다.",
|
||||
"quote_error.unauthorized": "이 글을 인용할 권한이 없습니다.",
|
||||
"quote_error.unauthorized": "이 게시물을 인용할 권한이 없습니다.",
|
||||
"quote_error.upload": "인용과 미디어 첨부를 함께 사용할 수 없습니다.",
|
||||
"recommended": "추천함",
|
||||
"refresh": "새로고침",
|
||||
|
|
@ -857,7 +857,9 @@
|
|||
"status.block": "@{name} 차단",
|
||||
"status.bookmark": "북마크",
|
||||
"status.cancel_reblog_private": "부스트 취소",
|
||||
"status.cannot_quote": "인용을 비허용한 게시물",
|
||||
"status.cannot_reblog": "이 게시물은 부스트 할 수 없습니다",
|
||||
"status.contains_quote": "인용 포함",
|
||||
"status.continued_thread": "이어지는 글타래",
|
||||
"status.copy": "게시물 링크 복사",
|
||||
"status.delete": "삭제",
|
||||
|
|
@ -889,12 +891,13 @@
|
|||
"status.quote_error.filtered": "필터에 의해 가려짐",
|
||||
"status.quote_error.not_available": "게시물 사용 불가",
|
||||
"status.quote_error.pending_approval": "게시물 대기중",
|
||||
"status.quote_followers_only": "팔로워만 이 게시물을 인용할 수 있습니다",
|
||||
"status.quote_followers_only": "팔로워만 인용할 수 있는 게시물",
|
||||
"status.quote_manual_review": "작성자가 직접 검토합니다",
|
||||
"status.quote_noun": "인용",
|
||||
"status.quote_policy_change": "누가 인용할 수 있는지",
|
||||
"status.quote_post_author": "인용된 @{name} 님의 게시물",
|
||||
"status.quote_private": "비공개 게시물은 인용할 수 없습니다",
|
||||
"status.quotes": "{count, plural, other {#}} 인용",
|
||||
"status.quotes": "{count, plural, other {인용}}",
|
||||
"status.quotes.empty": "아직 아무도 이 게시물을 인용하지 않았습니다. 누군가 인용한다면 여기에 표시됩니다.",
|
||||
"status.read_more": "더 보기",
|
||||
"status.reblog": "부스트",
|
||||
|
|
@ -976,7 +979,8 @@
|
|||
"video.volume_up": "음량 증가",
|
||||
"visibility_modal.button_title": "공개범위 설정",
|
||||
"visibility_modal.header": "공개범위와 반응",
|
||||
"visibility_modal.helper.unlisted_quoting": "사람들이 나를 인용한 경우 그 게시물 또한 유행에서 제외됩니다.",
|
||||
"visibility_modal.helper.unlisted_quoting": "사람들에게 인용된 경우, 인용한 게시물도 유행 타임라인에서 감추게 됩니다.",
|
||||
"visibility_modal.instructions": "누가 이 게시물과 상호작용할 수 있는 지 제어합니다. 또한 <link>환경설정 > 게시물 기본설정</link>으로 이동해 향후 모든 게시물의 설정을 적용할 수 있습니다.",
|
||||
"visibility_modal.privacy_label": "공개 범위",
|
||||
"visibility_modal.quote_followers": "팔로워만",
|
||||
"visibility_modal.quote_label": "인용할 수 있는 사람",
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@
|
|||
"empty_column.explore_statuses": "Tiştek niha di rojevê de tune. Paşê vegere!",
|
||||
"empty_column.follow_requests": "Hê jî daxwaza şopandinê tunne ye. Dema daxwazek hat, yê li vir were nîşan kirin.",
|
||||
"empty_column.hashtag": "Di vê hashtagê de hêj tiştekî tune.",
|
||||
"empty_column.home": "Rojeva demnameya te vala ye! Ji bona tijîkirinê bêtir mirovan bişopîne. {suggestions}",
|
||||
"empty_column.home": "Rojeva demnameya te vala ye! Bo tijîkirina wê bêtir mirovan bişopîne.",
|
||||
"empty_column.list": "Di vê rêzokê de hîn tiştek tune ye. Gava ku endamên vê rêzokê peyamên nû biweşînin, ew ê li vir xuya bibin.",
|
||||
"empty_column.mutes": "Te tu bikarhêner bêdeng nekiriye.",
|
||||
"empty_column.notifications": "Hêj hişyariyên te tunene. Dema ku mirovên din bi we re têkilî danîn, hûn ê wê li vir bibînin.",
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
"account.disable_notifications": "Desha de avizarme sovre publikasyones de @{name}",
|
||||
"account.domain_blocking": "Blokando el domeno",
|
||||
"account.edit_profile": "Edita profil",
|
||||
"account.edit_profile_short": "Edita",
|
||||
"account.enable_notifications": "Avizame kuando @{name} publike",
|
||||
"account.endorse": "Avalia en profil",
|
||||
"account.featured.accounts": "Profiles",
|
||||
|
|
@ -36,6 +37,11 @@
|
|||
"account.featured_tags.last_status_never": "No ay publikasyones",
|
||||
"account.follow": "Sige",
|
||||
"account.follow_back": "Sige tamyen",
|
||||
"account.follow_back_short": "Sige tambyen",
|
||||
"account.follow_request": "Solisita segirle",
|
||||
"account.follow_request_cancel": "Anula solisitud",
|
||||
"account.follow_request_cancel_short": "Anula",
|
||||
"account.follow_request_short": "Solisitud",
|
||||
"account.followers": "Suivantes",
|
||||
"account.followers.empty": "Por agora dingun no sige a este utilizador.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} suivante} other {{counter} suivantes}}",
|
||||
|
|
@ -58,6 +64,7 @@
|
|||
"account.mute_short": "Silensia",
|
||||
"account.muted": "Silensiado",
|
||||
"account.muting": "Silensyando",
|
||||
"account.mutual": "Vos sigesh mutualmente",
|
||||
"account.no_bio": "No ay deskripsion.",
|
||||
"account.open_original_page": "Avre pajina orijnala",
|
||||
"account.posts": "Publikasyones",
|
||||
|
|
@ -93,6 +100,7 @@
|
|||
"alert.unexpected.title": "Atyo!",
|
||||
"alt_text_badge.title": "Teksto alternativo",
|
||||
"alt_text_modal.add_alt_text": "Adjusta teksto alternativo",
|
||||
"alt_text_modal.add_text_from_image": "Adjusta teksto de imaje",
|
||||
"alt_text_modal.cancel": "Anula",
|
||||
"alt_text_modal.change_thumbnail": "Troka minyatura",
|
||||
"alt_text_modal.done": "Fecho",
|
||||
|
|
@ -206,14 +214,22 @@
|
|||
"confirmations.logout.message": "Estas siguro ke keres salir de tu kuento?",
|
||||
"confirmations.logout.title": "Salir?",
|
||||
"confirmations.missing_alt_text.confirm": "Adjusta teksto alternativo",
|
||||
"confirmations.missing_alt_text.secondary": "Puvlika de todos modos",
|
||||
"confirmations.missing_alt_text.title": "Adjustar teksto alternativo?",
|
||||
"confirmations.mute.confirm": "Silensia",
|
||||
"confirmations.quiet_post_quote_info.got_it": "Entyendo",
|
||||
"confirmations.redraft.confirm": "Efasa i reeskrive",
|
||||
"confirmations.redraft.message": "Estas siguro ke keres efasar esta publikasyon i reeskrivirla? Pedreras todos los favoritos i repartajasyones asosiados kon esta publikasyon i repuestas a eya seran guerfanadas.",
|
||||
"confirmations.redraft.title": "Efasar i reeskrivir?",
|
||||
"confirmations.remove_from_followers.confirm": "Kita suivante",
|
||||
"confirmations.remove_from_followers.title": "Kitar suivante?",
|
||||
"confirmations.revoke_quote.confirm": "Kita puvlikasyon",
|
||||
"confirmations.revoke_quote.title": "Kitar puvlikasyon?",
|
||||
"confirmations.unblock.confirm": "Dezbloka",
|
||||
"confirmations.unblock.title": "Dezblokar a @{name}?",
|
||||
"confirmations.unfollow.confirm": "Desige",
|
||||
"confirmations.unfollow.title": "Desegir a @{name}?",
|
||||
"confirmations.withdraw_request.confirm": "Anula solisitud",
|
||||
"content_warning.hide": "Eskonde puvlikasyon",
|
||||
"content_warning.show": "Amostra entanto",
|
||||
"content_warning.show_more": "Amostra mas",
|
||||
|
|
@ -245,6 +261,7 @@
|
|||
"domain_pill.username": "Nombre de utilizador",
|
||||
"domain_pill.whats_in_a_handle": "En ke konsiste el alias?",
|
||||
"domain_pill.your_handle": "Tu alias:",
|
||||
"dropdown.empty": "Eskoje una opsyon",
|
||||
"embed.instructions": "Enkrusta esta publikasyon en tu sitio internetiko kopiando este kodiche.",
|
||||
"embed.preview": "Paresera ansina:",
|
||||
"emoji_button.activity": "Aktivita",
|
||||
|
|
@ -370,6 +387,7 @@
|
|||
"hints.profiles.see_more_followers": "Ve mas suivantes en {domain}",
|
||||
"hints.profiles.see_more_follows": "Ve mas segidos en {domain}",
|
||||
"hints.profiles.see_more_posts": "Ve mas puvlikasyones en {domain}",
|
||||
"home.column_settings.show_quotes": "Muestra sitas",
|
||||
"home.column_settings.show_reblogs": "Amostra repartajasyones",
|
||||
"home.column_settings.show_replies": "Amostra repuestas",
|
||||
"home.hide_announcements": "Eskonde pregones",
|
||||
|
|
@ -384,6 +402,7 @@
|
|||
"ignore_notifications_modal.not_following_title": "Inyorar avizos de personas a las kualas no siges?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Ignorar avizos de mensyones privadas no solisitadas?",
|
||||
"info_button.label": "Ayuda",
|
||||
"interaction_modal.go": "Va",
|
||||
"interaction_modal.on_another_server": "En otro sirvidor",
|
||||
"interaction_modal.on_this_server": "En este sirvidor",
|
||||
"interaction_modal.username_prompt": "Por enshemplo {example}",
|
||||
|
|
@ -414,6 +433,7 @@
|
|||
"keyboard_shortcuts.open_media": "Avre multimedia",
|
||||
"keyboard_shortcuts.pinned": "Avre lista de publikasyones fiksadas",
|
||||
"keyboard_shortcuts.profile": "Avre profil del autor",
|
||||
"keyboard_shortcuts.quote": "Sita puvlikasyon",
|
||||
"keyboard_shortcuts.reply": "Arisponde a publikasyon",
|
||||
"keyboard_shortcuts.requests": "Avre lista de solisitudes de suivantes",
|
||||
"keyboard_shortcuts.search": "Enfoka en la vara de bushkeda",
|
||||
|
|
@ -422,8 +442,10 @@
|
|||
"keyboard_shortcuts.toggle_hidden": "Amostra/eskonde teksto detras de avertensya de kontenido (CW)",
|
||||
"keyboard_shortcuts.toggle_sensitivity": "Amostra/eskonde multimedia",
|
||||
"keyboard_shortcuts.toot": "Eskrive mueva publikasyon",
|
||||
"keyboard_shortcuts.translate": "para trezladar una puvlikasyon",
|
||||
"keyboard_shortcuts.unfocus": "No enfoka en el area de eskrivir/bushkeda",
|
||||
"keyboard_shortcuts.up": "Move verso arriva en la lista",
|
||||
"learn_more_link.got_it": "Entyendo",
|
||||
"learn_more_link.learn_more": "Ambezate mas",
|
||||
"lightbox.close": "Serra",
|
||||
"lightbox.next": "Sigiente",
|
||||
|
|
@ -440,8 +462,13 @@
|
|||
"lists.delete": "Efasa lista",
|
||||
"lists.done": "Fecho",
|
||||
"lists.edit": "Edita lista",
|
||||
"lists.find_users_to_add": "Bushka utilizadores para adjustar",
|
||||
"lists.list_name": "Nombre de lista",
|
||||
"lists.new_list_name": "Nombre de mueva lista",
|
||||
"lists.no_lists_yet": "Ainda no ay listas.",
|
||||
"lists.no_members_yet": "Ainda no ay myembros.",
|
||||
"lists.no_results_found": "No se toparon rezultados.",
|
||||
"lists.remove_member": "Kita",
|
||||
"lists.replies_policy.followed": "Kualseker utilizador segido",
|
||||
"lists.replies_policy.list": "Miembros de la lista",
|
||||
"lists.replies_policy.none": "Dinguno",
|
||||
|
|
@ -461,6 +488,7 @@
|
|||
"navigation_bar.about": "Sovre mozotros",
|
||||
"navigation_bar.administration": "Administrasyon",
|
||||
"navigation_bar.advanced_interface": "Avre en la enterfaz avanzada",
|
||||
"navigation_bar.automated_deletion": "Efasasyon otomatika de publikasyones",
|
||||
"navigation_bar.blocks": "Utilizadores blokados",
|
||||
"navigation_bar.bookmarks": "Markadores",
|
||||
"navigation_bar.direct": "Enmentaduras privadas",
|
||||
|
|
@ -480,6 +508,8 @@
|
|||
"navigation_bar.preferences": "Preferensyas",
|
||||
"navigation_bar.privacy_and_reach": "Privasita i alkanse",
|
||||
"navigation_bar.search": "Bushka",
|
||||
"navigation_bar.search_trends": "Bushka / Trendes",
|
||||
"navigation_panel.expand_lists": "Espande menu de lista",
|
||||
"not_signed_in_indicator.not_signed_in": "Nesesitas konektarse kon tu kuento para akseder este rekurso.",
|
||||
"notification.admin.report": "{name} raporto {target}",
|
||||
"notification.admin.report_statuses": "{name} raporto {target} por {category}",
|
||||
|
|
@ -531,6 +561,7 @@
|
|||
"notifications.column_settings.mention": "Enmentaduras:",
|
||||
"notifications.column_settings.poll": "Rizultados de anketas:",
|
||||
"notifications.column_settings.push": "Avizos arrepushados",
|
||||
"notifications.column_settings.quote": "Sitas:",
|
||||
"notifications.column_settings.reblog": "Repartajasyones:",
|
||||
"notifications.column_settings.show": "Amostra en kolumna",
|
||||
"notifications.column_settings.sound": "Reproduse son",
|
||||
|
|
@ -606,6 +637,7 @@
|
|||
"privacy_policy.title": "Politika de privasita",
|
||||
"recommended": "Rekomendado",
|
||||
"refresh": "Arefreska",
|
||||
"regeneration_indicator.please_stand_by": "Aspera por favor.",
|
||||
"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}}",
|
||||
|
|
@ -617,6 +649,7 @@
|
|||
"relative_time.minutes": "{number} m",
|
||||
"relative_time.seconds": "{number} s",
|
||||
"relative_time.today": "oy",
|
||||
"remove_quote_hint.button_label": "Entyendo",
|
||||
"reply_indicator.attachments": "{count, plural, one {# anekso} other {# aneksos}}",
|
||||
"reply_indicator.cancel": "Anula",
|
||||
"reply_indicator.poll": "Anketa",
|
||||
|
|
@ -707,8 +740,15 @@
|
|||
"status.bookmark": "Marka",
|
||||
"status.cancel_reblog_private": "No repartaja",
|
||||
"status.cannot_reblog": "Esta publikasyon no se puede repartajar",
|
||||
"status.contains_quote": "Kontriene sita",
|
||||
"status.context.loading_success": "Muevas repuestas kargadas",
|
||||
"status.context.more_replies_found": "Se toparon mas repuestas",
|
||||
"status.context.retry": "Reprova",
|
||||
"status.context.show": "Amostra",
|
||||
"status.continued_thread": "Kontinuasion del filo",
|
||||
"status.copy": "Kopia atadijo de publikasyon",
|
||||
"status.delete": "Efasa",
|
||||
"status.delete.success": "Puvlikasyon kitada",
|
||||
"status.detailed_status": "Vista de konversasyon detalyada",
|
||||
"status.direct": "Enmenta a @{name} en privado",
|
||||
"status.direct_indicator": "Enmentadura privada",
|
||||
|
|
@ -729,13 +769,26 @@
|
|||
"status.mute_conversation": "Silensia konversasyon",
|
||||
"status.open": "Espande publikasyon",
|
||||
"status.pin": "Fiksa en profil",
|
||||
"status.quote": "Sita",
|
||||
"status.quote.cancel": "Anula la sita",
|
||||
"status.quote_error.limited_account_hint.action": "Amostra entanto",
|
||||
"status.quote_error.limited_account_hint.title": "Este kuento fue eskondido por los moderadores de {domain}.",
|
||||
"status.quote_error.not_available": "Puvlikasyon no desponivle",
|
||||
"status.quote_error.pending_approval": "Puvlikasyon esta asperando",
|
||||
"status.quote_noun": "Sita",
|
||||
"status.quote_policy_change": "Troka ken puede sitar",
|
||||
"status.quote_post_author": "Sito una puvlikasyon de @{name}",
|
||||
"status.quote_private": "No se puede sitar puvlikasyones privadas",
|
||||
"status.quotes": "{count, plural, one {sita} other {sitas}}",
|
||||
"status.read_more": "Melda mas",
|
||||
"status.reblog": "Repartaja",
|
||||
"status.reblog_or_quote": "Repartaja o partaja",
|
||||
"status.reblogged_by": "{name} repartajo",
|
||||
"status.reblogs.empty": "Ainda nadie tiene repartajado esta publikasyon. Kuando algien lo aga, se amostrara aki.",
|
||||
"status.redraft": "Efasa i eskrive de muevo",
|
||||
"status.remove_bookmark": "Kita markador",
|
||||
"status.remove_favourite": "Kita de los favoritos",
|
||||
"status.remove_quote": "Kita",
|
||||
"status.replied_in_thread": "Arispondo en filo",
|
||||
"status.replied_to": "Arispondio a {name}",
|
||||
"status.reply": "Arisponde",
|
||||
|
|
@ -790,7 +843,12 @@
|
|||
"video.pause": "Pauza",
|
||||
"video.play": "Reproduze",
|
||||
"video.unmute": "Desilensia",
|
||||
"visibility_modal.button_title": "Konfigura la vizibilita",
|
||||
"visibility_modal.header": "Vizibilita i enteraksyon",
|
||||
"visibility_modal.privacy_label": "Vizivilita",
|
||||
"visibility_modal.quote_followers": "Solo suivantes",
|
||||
"visibility_modal.quote_label": "Ken puede sitar",
|
||||
"visibility_modal.quote_nobody": "Solo yo",
|
||||
"visibility_modal.quote_public": "Todos",
|
||||
"visibility_modal.save": "Guadra"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,17 +17,18 @@
|
|||
"account.add_or_remove_from_list": "Pievienot vai Noņemt no sarakstiem",
|
||||
"account.badges.bot": "Automatizēts",
|
||||
"account.badges.group": "Grupa",
|
||||
"account.block": "Bloķēt @{name}",
|
||||
"account.block": "Liegt @{name}",
|
||||
"account.block_domain": "Bloķēt domēnu {domain}",
|
||||
"account.block_short": "Bloķēt",
|
||||
"account.blocked": "Bloķēts",
|
||||
"account.blocking": "Bloķēts",
|
||||
"account.block_short": "Liegt",
|
||||
"account.blocked": "Liegts",
|
||||
"account.blocking": "Liegts",
|
||||
"account.cancel_follow_request": "Atsaukt sekošanas pieprasījumu",
|
||||
"account.copy": "Ievietot saiti uz profilu starpliktuvē",
|
||||
"account.direct": "Pieminēt @{name} privāti",
|
||||
"account.disable_notifications": "Pārtraukt man paziņot, kad @{name} izveido ierakstu",
|
||||
"account.domain_blocking": "Bloķēts domēns",
|
||||
"account.domain_blocking": "Liegts domēns",
|
||||
"account.edit_profile": "Labot profilu",
|
||||
"account.edit_profile_short": "Labot",
|
||||
"account.enable_notifications": "Paziņot man, kad @{name} izveido ierakstu",
|
||||
"account.endorse": "Izcelts profilā",
|
||||
"account.familiar_followers_many": "Kam seko {name1}, {name2}, un {othersCount, plural, zero {pārējie # jums pazīstami} one {vēl viens jums pazīstams} other {pārējie # jums pazīstami}}",
|
||||
|
|
@ -40,6 +41,10 @@
|
|||
"account.featured_tags.last_status_never": "Nav ierakstu",
|
||||
"account.follow": "Sekot",
|
||||
"account.follow_back": "Sekot atpakaļ",
|
||||
"account.follow_request": "Pieprasīt sekot",
|
||||
"account.follow_request_cancel": "Atcelt pieprasījumu",
|
||||
"account.follow_request_cancel_short": "Atcelt",
|
||||
"account.follow_request_short": "Pieprasīt",
|
||||
"account.followers": "Sekotāji",
|
||||
"account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
|
||||
"account.followers_counter": "{count, plural, zero {{count} sekotāju} one {{count} sekotājs} other {{count} sekotāji}}",
|
||||
|
|
@ -75,9 +80,9 @@
|
|||
"account.share": "Dalīties ar @{name} profilu",
|
||||
"account.show_reblogs": "Parādīt @{name} pastiprinātos ierakstus",
|
||||
"account.statuses_counter": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}",
|
||||
"account.unblock": "Atbloķēt @{name}",
|
||||
"account.unblock_domain": "Atbloķēt domēnu {domain}",
|
||||
"account.unblock_domain_short": "Atbloķēt",
|
||||
"account.unblock": "Atcelt liegšanu @{name}",
|
||||
"account.unblock_domain": "Atcelt domēna {domain} liegšanu",
|
||||
"account.unblock_domain_short": "Atcelt liegšanu",
|
||||
"account.unblock_short": "Atbloķēt",
|
||||
"account.unendorse": "Neizcelt profilā",
|
||||
"account.unfollow": "Pārstāt sekot",
|
||||
|
|
@ -131,7 +136,7 @@
|
|||
"block_modal.show_more": "Parādīt mazāk",
|
||||
"block_modal.they_cant_mention": "Nevar Tevi pieminēt vai sekot Tev.",
|
||||
"block_modal.they_cant_see_posts": "Lietotajs nevarēs redzēt Tavus ierakstus, un Tu neredzēsi lietotāja.",
|
||||
"block_modal.title": "Bloķēt lietotāju?",
|
||||
"block_modal.title": "Liegt lietotāju?",
|
||||
"block_modal.you_wont_see_mentions": "Tu neredzēsi ierakstus, kuros ir minēts šis lietotājs.",
|
||||
"boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu",
|
||||
"boost_modal.reblog": "Pastiprināt ierakstu?",
|
||||
|
|
@ -154,13 +159,13 @@
|
|||
"closed_registrations_modal.preamble": "Mastodon ir decentralizēts, tāpēc neatkarīgi no tā, kur Tu izveido savu kontu, varēsi sekot un mijiedarboties ar ikvienu šajā serverī. Tu pat vari to pašizvietot!",
|
||||
"closed_registrations_modal.title": "Reģistrēšanās Mastodon",
|
||||
"column.about": "Par",
|
||||
"column.blocks": "Bloķētie lietotāji",
|
||||
"column.blocks": "Liegtie lietotāji",
|
||||
"column.bookmarks": "Grāmatzīmes",
|
||||
"column.community": "Vietējā laika līnija",
|
||||
"column.create_list": "Izveidot sarakstu",
|
||||
"column.direct": "Privātas pieminēšanas",
|
||||
"column.directory": "Pārlūkot profilus",
|
||||
"column.domain_blocks": "Bloķētie domēni",
|
||||
"column.domain_blocks": "Liegtie domēni",
|
||||
"column.edit_list": "Labot sarakstu",
|
||||
"column.favourites": "Izlase",
|
||||
"column.firehose": "Tiešraides plūsmas",
|
||||
|
|
@ -208,7 +213,7 @@
|
|||
"compose_form.spoiler.unmarked": "Pievienot satura brīdinājumu",
|
||||
"compose_form.spoiler_placeholder": "Satura brīdinājums (pēc izvēles)",
|
||||
"confirmation_modal.cancel": "Atcelt",
|
||||
"confirmations.block.confirm": "Bloķēt",
|
||||
"confirmations.block.confirm": "Liegt",
|
||||
"confirmations.delete.confirm": "Dzēst",
|
||||
"confirmations.delete.message": "Vai tiešām izdzēst šo ierakstu?",
|
||||
"confirmations.delete.title": "Izdzēst ierakstu?",
|
||||
|
|
@ -243,6 +248,8 @@
|
|||
"confirmations.revoke_quote.message": "Šo darbību nevar atsaukt.",
|
||||
"confirmations.revoke_quote.title": "Noņemt ierakstu?",
|
||||
"confirmations.unfollow.confirm": "Pārstāt sekot",
|
||||
"confirmations.unfollow.title": "Pārtraukt sekot {name}?",
|
||||
"confirmations.withdraw_request.confirm": "Atsaukt pieprasījumu",
|
||||
"content_warning.hide": "Paslēpt ierakstu",
|
||||
"content_warning.show": "Tomēr rādīt",
|
||||
"content_warning.show_more": "Rādīt vairāk",
|
||||
|
|
@ -262,11 +269,11 @@
|
|||
"dismissable_banner.community_timeline": "Šie ir jaunākie publiskie ieraksti no cilvēkiem, kuru konti ir mitināti {domain}.",
|
||||
"dismissable_banner.dismiss": "Atcelt",
|
||||
"dismissable_banner.public_timeline": "Šie ir jaunākie Fediverse lietotāju publiskie ieraksti, kuriem {domain} seko cilvēki.",
|
||||
"domain_block_modal.block": "Bloķēt serveri",
|
||||
"domain_block_modal.block": "Liegt serveri",
|
||||
"domain_block_modal.block_account_instead": "Tā vietā liegt @{name}",
|
||||
"domain_block_modal.they_cant_follow": "Neviens šajā serverī nevar Tev sekot.",
|
||||
"domain_block_modal.they_wont_know": "Viņi nezinās, ka tikuši bloķēti.",
|
||||
"domain_block_modal.title": "Bloķēt domēnu?",
|
||||
"domain_block_modal.they_wont_know": "Viņi nezinās, ka tikuši liegti.",
|
||||
"domain_block_modal.title": "Liegt domēnu?",
|
||||
"domain_pill.activitypub_lets_connect": "Tas ļauj savienoties un mijiedarboties ar cilvēkiem ne tikai no Mastodon, bet arī starp dažādām sabiedriskajām lietotnēm.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub ir kā valoda, kurā Mastodon sazināš ar citiem sabiedriskajiem tīkliem.",
|
||||
"domain_pill.server": "Serveris",
|
||||
|
|
@ -299,11 +306,11 @@
|
|||
"empty_column.account_suspended": "Konta darbība ir apturēta",
|
||||
"empty_column.account_timeline": "Šeit nav ierakstu.",
|
||||
"empty_column.account_unavailable": "Profils nav pieejams",
|
||||
"empty_column.blocks": "Pašreiz tu neesi nevienu bloķējis.",
|
||||
"empty_column.blocks": "Pagaidām Tu neesi liedzis nevienu lietotāju.",
|
||||
"empty_column.bookmarked_statuses": "Pašlaik Tev nav neviena grāmatzīmēs pievienota ieraksta. Kad tādu pievienosi, tas parādīsies šeit.",
|
||||
"empty_column.community": "Vietējā laika līnija ir tukša. Uzraksti kaut ko publiski, lai iekustinātu visu!",
|
||||
"empty_column.direct": "Tev vēl nav privātu pieminēšanu. Kad Tu nosūtīsi vai saņemsi kādu, tā pārādīsies šeit.",
|
||||
"empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.",
|
||||
"empty_column.domain_blocks": "Vēl nav neviena liegta domēna.",
|
||||
"empty_column.explore_statuses": "Pašlaik nav nekā aktuāla. Ieskaties šeit vēlāk!",
|
||||
"empty_column.favourited_statuses": "Tev vēl nav izlasei pievienotu ierakstu. Kad pievienosi kādu, tas tiks parādīts šeit.",
|
||||
"empty_column.favourites": "Šo ierakstu vēl neviens nav pievienojis izlasei. Kad kāds to izdarīs, tas parādīsies šeit.",
|
||||
|
|
@ -418,7 +425,7 @@
|
|||
"intervals.full.hours": "{number, plural, one {# stunda} other {# stundas}}",
|
||||
"intervals.full.minutes": "{number, plural, one {# minūte} other {# minūtes}}",
|
||||
"keyboard_shortcuts.back": "Pāriet atpakaļ",
|
||||
"keyboard_shortcuts.blocked": "Atvērt bloķēto lietotāju sarakstu",
|
||||
"keyboard_shortcuts.blocked": "Atvērt liegto lietotāju sarakstu",
|
||||
"keyboard_shortcuts.boost": "Pastiprināt ierakstu",
|
||||
"keyboard_shortcuts.column": "Fokusēt kolonnu",
|
||||
"keyboard_shortcuts.compose": "Fokusēt veidojamā teksta lauku",
|
||||
|
|
@ -492,10 +499,10 @@
|
|||
"navigation_bar.administration": "Pārvaldība",
|
||||
"navigation_bar.advanced_interface": "Atvērt paplašinātā tīmekļa saskarnē",
|
||||
"navigation_bar.automated_deletion": "Automātiska ziņu dzēšana",
|
||||
"navigation_bar.blocks": "Bloķētie lietotāji",
|
||||
"navigation_bar.blocks": "Liegtie lietotāji",
|
||||
"navigation_bar.bookmarks": "Grāmatzīmes",
|
||||
"navigation_bar.direct": "Privātas pieminēšanas",
|
||||
"navigation_bar.domain_blocks": "Bloķētie domēni",
|
||||
"navigation_bar.domain_blocks": "Liegtie domēni",
|
||||
"navigation_bar.favourites": "Izlase",
|
||||
"navigation_bar.filters": "Apklusinātie vārdi",
|
||||
"navigation_bar.follow_requests": "Sekošanas pieprasījumi",
|
||||
|
|
@ -641,8 +648,8 @@
|
|||
"reply_indicator.attachments": "{count, plural, zero{# pielikumu} one {# pielikums} other {# pielikumi}}",
|
||||
"reply_indicator.cancel": "Atcelt",
|
||||
"reply_indicator.poll": "Aptauja",
|
||||
"report.block": "Bloķēt",
|
||||
"report.block_explanation": "Tu neredzēsi viņu ierakstus. Viņi nevarēs redzēt Tavus ierakstus vai sekot tev. Viņi varēs saprast, ka ir liegti.",
|
||||
"report.block": "Liegt",
|
||||
"report.block_explanation": "Tu neredzēsi viņu ierakstus. Viņi nevarēs redzēt Tavus ierakstus vai sekot Tev. Viņi varēs saprast, ka ir liegti.",
|
||||
"report.categories.legal": "Tiesisks",
|
||||
"report.categories.other": "Citi",
|
||||
"report.categories.spam": "Mēstule",
|
||||
|
|
@ -723,7 +730,7 @@
|
|||
"status.admin_account": "Atvērt @{name} satura pārraudzības saskarni",
|
||||
"status.admin_domain": "Atvērt {domain} satura pārraudzības saskarni",
|
||||
"status.admin_status": "Atvērt šo ziņu satura pārraudzības saskarnē",
|
||||
"status.block": "Bloķēt @{name}",
|
||||
"status.block": "Liegt @{name}",
|
||||
"status.bookmark": "Grāmatzīme",
|
||||
"status.cancel_reblog_private": "Nepastiprināt",
|
||||
"status.cannot_reblog": "Šo ierakstu nevar pastiprināt",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Lí iáu無加添任何冊籤。Nā是lí加添冊籤,伊ē佇tsia顯示。",
|
||||
"empty_column.community": "本站時間線是空ê。緊來公開PO文oh!",
|
||||
"empty_column.direct": "Lí iáu無任何ê私人訊息。Nā是lí送á是收著私人訊息,ē佇tsia顯示。.",
|
||||
"empty_column.disabled_feed": "Tsit ê feed已經hōo lí ê服侍器ê管理員停用。",
|
||||
"empty_column.domain_blocks": "Iáu無封鎖任何網域。",
|
||||
"empty_column.explore_statuses": "目前iáu無有流行ê趨勢,請sió等tsi̍t-ē,koh確認。",
|
||||
"empty_column.favourited_statuses": "Lí iáu無加添任何收藏 ê PO文。Nā是lí加收藏,伊ē佇tsia顯示。",
|
||||
|
|
@ -753,6 +754,7 @@
|
|||
"privacy.unlisted.short": "恬靜公開",
|
||||
"privacy_policy.last_updated": "上尾更新tī:{date}",
|
||||
"privacy_policy.title": "隱私權政策",
|
||||
"quote_error.edit": "佇編輯PO文ê時陣bē當加引文。",
|
||||
"quote_error.poll": "有投票ê PO文bē當引用。",
|
||||
"quote_error.quote": "Tsi̍t改kan-ta ē當引用tsi̍t篇PO文。",
|
||||
"quote_error.unauthorized": "Lí bô權利引用tsit篇PO文。",
|
||||
|
|
@ -875,7 +877,7 @@
|
|||
"status.contains_quote": "包含引用",
|
||||
"status.context.loading": "載入其他回應",
|
||||
"status.context.loading_error": "Bē當載入新回應",
|
||||
"status.context.loading_success": "回應lóng載入ah",
|
||||
"status.context.loading_success": "新ê回應載入ah",
|
||||
"status.context.more_replies_found": "Tshuē-tio̍h其他回應",
|
||||
"status.context.retry": "Koh試",
|
||||
"status.context.show": "顯示",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.",
|
||||
"empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!",
|
||||
"empty_column.direct": "Je hebt nog geen privéberichten. Wanneer je er een verstuurt of ontvangt, komen deze hier te staan.",
|
||||
"empty_column.disabled_feed": "Deze tijdlijn is uitgeschakeld door je serverbeheerders.",
|
||||
"empty_column.domain_blocks": "Er zijn nog geen geblokkeerde servers.",
|
||||
"empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!",
|
||||
"empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je een bericht als favoriet markeert, valt deze hier te zien.",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "Bevat citaat",
|
||||
"status.context.loading": "Meer reacties laden",
|
||||
"status.context.loading_error": "Kon geen nieuwe reacties laden",
|
||||
"status.context.loading_success": "Alle reacties zijn geladen",
|
||||
"status.context.loading_success": "Nieuwe reacties geladen",
|
||||
"status.context.more_replies_found": "Meer reacties gevonden",
|
||||
"status.context.retry": "Opnieuw proberen",
|
||||
"status.context.show": "Tonen",
|
||||
|
|
@ -912,7 +913,7 @@
|
|||
"status.quote_error.limited_account_hint.action": "Alsnog tonen",
|
||||
"status.quote_error.limited_account_hint.title": "Dit account is door de moderatoren van {domain} verborgen.",
|
||||
"status.quote_error.not_available": "Bericht niet beschikbaar",
|
||||
"status.quote_error.pending_approval": "Bericht in afwachting",
|
||||
"status.quote_error.pending_approval": "Bericht in afwachting van goedkeuring",
|
||||
"status.quote_error.pending_approval_popout.body": "Op Mastodon kun je bepalen of iemand je mag citeren. Dit bericht is in afwachting van de goedkeuring van de oorspronkelijke auteur.",
|
||||
"status.quote_error.revoked": "Bericht verwijderd door auteur",
|
||||
"status.quote_followers_only": "Alleen volgers mogen dit bericht citeren",
|
||||
|
|
|
|||
|
|
@ -753,6 +753,7 @@
|
|||
"privacy.unlisted.short": "Stille offentleg",
|
||||
"privacy_policy.last_updated": "Sist oppdatert {date}",
|
||||
"privacy_policy.title": "Personvernsreglar",
|
||||
"quote_error.edit": "Du kan ikkje leggja til sitat når du redigerer eit innlegg.",
|
||||
"quote_error.poll": "Du kan ikkje sitera meiningsmålingar.",
|
||||
"quote_error.quote": "Det er berre lov med eitt sitat om gongen.",
|
||||
"quote_error.unauthorized": "Du har ikkje løyve til å sitera dette innlegget.",
|
||||
|
|
@ -875,7 +876,7 @@
|
|||
"status.contains_quote": "Inneheld eit sitat",
|
||||
"status.context.loading": "Lastar fleire svar",
|
||||
"status.context.loading_error": "Kunne ikkje lasta nye svar",
|
||||
"status.context.loading_success": "Alle svara er lasta",
|
||||
"status.context.loading_success": "Dei nye svara er lasta",
|
||||
"status.context.more_replies_found": "Fann fleire svar",
|
||||
"status.context.retry": "Prøv om att",
|
||||
"status.context.show": "Vis",
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
"account.block": "Blokuj @{name}",
|
||||
"account.block_domain": "Blokuj wszystko z {domain}",
|
||||
"account.block_short": "Zablokuj",
|
||||
"account.blocked": "Zablokowany(-a)",
|
||||
"account.blocked": "Zablokowano",
|
||||
"account.blocking": "Blokowanie",
|
||||
"account.cancel_follow_request": "Nie obserwuj",
|
||||
"account.copy": "Skopiuj link do profilu",
|
||||
|
|
@ -28,11 +28,12 @@
|
|||
"account.disable_notifications": "Przestań powiadamiać mnie o wpisach @{name}",
|
||||
"account.domain_blocking": "Blokowanie domeny",
|
||||
"account.edit_profile": "Edytuj profil",
|
||||
"account.edit_profile_short": "Edytuj",
|
||||
"account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}",
|
||||
"account.endorse": "Wyróżnij na profilu",
|
||||
"account.familiar_followers_many": "Obserwowane przez: {name1}, {name2} i {othersCount, plural, one {jeszcze jedną osobę, którą znasz} few {# inne osoby, które znasz} many {# innych osób, które znasz} other {# innych osób, które znasz}}",
|
||||
"account.familiar_followers_one": "Obserwowane przez {name1}",
|
||||
"account.familiar_followers_two": "Obserwowane przez {name1} i {name2}",
|
||||
"account.familiar_followers_many": "To konto jest obserwowane przez {name1}, {name2} i {othersCount, plural, one {jedną inną znaną ci osobę} few {# inne znane ci osoby} many {# innych znanych ci osób} other {# innych znanych ci osób}}",
|
||||
"account.familiar_followers_one": "To konto jest obserwowane przez {name1}",
|
||||
"account.familiar_followers_two": "To konto jest obserwowane przez {name1} i {name2}",
|
||||
"account.featured": "Wyróżnione",
|
||||
"account.featured.accounts": "Profile",
|
||||
"account.featured.hashtags": "Tagi",
|
||||
|
|
@ -40,10 +41,15 @@
|
|||
"account.featured_tags.last_status_never": "Brak postów",
|
||||
"account.follow": "Obserwuj",
|
||||
"account.follow_back": "Również obserwuj",
|
||||
"account.follow_back_short": "Również obserwuj",
|
||||
"account.follow_request": "Poproś o zgodę na obserwowanie",
|
||||
"account.follow_request_cancel": "Anuluj",
|
||||
"account.follow_request_cancel_short": "Anuluj",
|
||||
"account.follow_request_short": "Poproś",
|
||||
"account.followers": "Obserwujący",
|
||||
"account.followers.empty": "Nikt jeszcze nie obserwuje tego użytkownika.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} obserwujący} few {{counter} obserwujących} many {{counter} obserwujących} other {{counter} obserwujących}}",
|
||||
"account.followers_you_know_counter": "{counter} które znasz",
|
||||
"account.followers_you_know_counter": "znasz {counter}",
|
||||
"account.following": "Obserwowani",
|
||||
"account.following_counter": "{count, plural, one {{counter} obserwowany} few {{counter} obserwowanych} many {{counter} obserwowanych} other {{counter} obserwowanych}}",
|
||||
"account.follows.empty": "Ten użytkownik nie obserwuje jeszcze nikogo.",
|
||||
|
|
@ -62,15 +68,15 @@
|
|||
"account.mute_notifications_short": "Wycisz powiadomienia",
|
||||
"account.mute_short": "Wycisz",
|
||||
"account.muted": "Wyciszony",
|
||||
"account.muting": "Wyciszenie",
|
||||
"account.mutual": "Obserwujecie siebie nazwajem",
|
||||
"account.muting": "Wyciszanie",
|
||||
"account.mutual": "Obserwujecie się wzajemnie",
|
||||
"account.no_bio": "Brak opisu.",
|
||||
"account.open_original_page": "Otwórz stronę oryginalną",
|
||||
"account.posts": "Wpisy",
|
||||
"account.posts_with_replies": "Wpisy i odpowiedzi",
|
||||
"account.remove_from_followers": "Usuń {name} z obserwujących",
|
||||
"account.report": "Zgłoś @{name}",
|
||||
"account.requested_follow": "{name} chce cię zaobserwować",
|
||||
"account.requested_follow": "{name} chce cię obserwować",
|
||||
"account.requests_to_follow_you": "Prośby o obserwowanie",
|
||||
"account.share": "Udostępnij profil @{name}",
|
||||
"account.show_reblogs": "Pokazuj podbicia od @{name}",
|
||||
|
|
@ -85,8 +91,8 @@
|
|||
"account.unmute_notifications_short": "Nie wyciszaj powiadomień",
|
||||
"account.unmute_short": "Nie wyciszaj",
|
||||
"account_note.placeholder": "Kliknij, aby dodać notatkę",
|
||||
"admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników po dniach od rejestracji",
|
||||
"admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników po miesiącach od rejestracji",
|
||||
"admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników według dni od rejestracji",
|
||||
"admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników według miesięcy od rejestracji",
|
||||
"admin.dashboard.retention.average": "Średnia",
|
||||
"admin.dashboard.retention.cohort": "Miesiąc rejestracji",
|
||||
"admin.dashboard.retention.cohort_size": "Nowi użytkownicy",
|
||||
|
|
@ -111,10 +117,10 @@
|
|||
"annual_report.summary.archetype.lurker": "Czyhający",
|
||||
"annual_report.summary.archetype.oracle": "Wyrocznia",
|
||||
"annual_report.summary.archetype.pollster": "Ankieter",
|
||||
"annual_report.summary.archetype.replier": "Motyl społeczny",
|
||||
"annual_report.summary.archetype.replier": "Towarzyski motyl",
|
||||
"annual_report.summary.followers.followers": "obserwujących",
|
||||
"annual_report.summary.followers.total": "łącznie {count}",
|
||||
"annual_report.summary.here_it_is": "Oto przegląd Twojego {year} roku:",
|
||||
"annual_report.summary.here_it_is": "Oto przegląd twojego {year} roku:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "najbardziej lubiany wpis",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "najczęściej podbijany wpis",
|
||||
"annual_report.summary.highlighted_post.by_replies": "wpis z największą liczbą komentarzy",
|
||||
|
|
@ -187,7 +193,7 @@
|
|||
"community.column_settings.media_only": "Tylko multimedia",
|
||||
"community.column_settings.remote_only": "Tylko zdalne",
|
||||
"compose.language.change": "Zmień język",
|
||||
"compose.language.search": "Szukaj języków...",
|
||||
"compose.language.search": "Wyszukaj języki...",
|
||||
"compose.published.body": "Wpis został opublikowany.",
|
||||
"compose.published.open": "Otwórz",
|
||||
"compose.saved.body": "Wpis został zapisany.",
|
||||
|
|
@ -220,14 +226,14 @@
|
|||
"confirmations.delete_list.title": "Usunąć listę?",
|
||||
"confirmations.discard_draft.confirm": "Odrzuć i kontynuuj",
|
||||
"confirmations.discard_draft.edit.cancel": "Wznów edytowanie",
|
||||
"confirmations.discard_draft.edit.message": "Kontynuowanie spowoduje utratę wszystkich zmian wprowadzonych przez Ciebie w aktualnie edytowanym poście.",
|
||||
"confirmations.discard_draft.edit.title": "Odrzucić zmiany w poście?",
|
||||
"confirmations.discard_draft.post.cancel": "Wznów wersję roboczą",
|
||||
"confirmations.discard_draft.post.message": "Kontynuacja odrzuci aktualnie tworzony post.",
|
||||
"confirmations.discard_draft.post.title": "Anulować wersję roboczą?",
|
||||
"confirmations.discard_draft.edit.message": "Kontynuowanie spowoduje utratę wszelkich zmian wprowadzonych w aktualnie edytowanym wpisie.",
|
||||
"confirmations.discard_draft.edit.title": "Czy chcesz odrzucić zmiany w swoim wpisie?",
|
||||
"confirmations.discard_draft.post.cancel": "Wznów szkic",
|
||||
"confirmations.discard_draft.post.message": "Kontynuowanie spowoduje usunięcie aktualnie tworzonego wpisu.",
|
||||
"confirmations.discard_draft.post.title": "Odrzucić szkic wpisu?",
|
||||
"confirmations.discard_edit_media.confirm": "Odrzuć",
|
||||
"confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?",
|
||||
"confirmations.follow_to_list.confirm": "Zaobserwuj i dodaj do listy",
|
||||
"confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie multimediów. Czy chcesz je mimo to odrzucić?",
|
||||
"confirmations.follow_to_list.confirm": "Obserwuj i dodaj do listy",
|
||||
"confirmations.follow_to_list.message": "Musisz obserwować {name}, aby dodać do listy.",
|
||||
"confirmations.follow_to_list.title": "Zaobserwować?",
|
||||
"confirmations.logout.confirm": "Wyloguj",
|
||||
|
|
@ -235,19 +241,28 @@
|
|||
"confirmations.logout.title": "Wylogować?",
|
||||
"confirmations.missing_alt_text.confirm": "Dodaj opis pomocniczy",
|
||||
"confirmations.missing_alt_text.message": "Twój wpis zawiera multimedia bez tekstu alternatywnego. Dodanie opisów pomaga zwiększyć dostępność tych treści dla większej liczby osób.",
|
||||
"confirmations.missing_alt_text.secondary": "Opublikuj mimo to ",
|
||||
"confirmations.missing_alt_text.secondary": "Opublikuj mimo wszystko",
|
||||
"confirmations.missing_alt_text.title": "Dodać tekst pomocniczy?",
|
||||
"confirmations.mute.confirm": "Wycisz",
|
||||
"confirmations.quiet_post_quote_info.dismiss": "Nie przypominaj mi ponownie",
|
||||
"confirmations.quiet_post_quote_info.got_it": "Rozumiem",
|
||||
"confirmations.quiet_post_quote_info.message": "Kiedy cytujesz niewidoczny wpis publiczny, twój wpis zostanie ukryty z popularnych osi czasu.",
|
||||
"confirmations.quiet_post_quote_info.title": "Cytowanie niewidocznych wpisów publicznych",
|
||||
"confirmations.redraft.confirm": "Usuń i popraw",
|
||||
"confirmations.redraft.message": "Czy na pewno chcesz usunąć i poprawić ten wpis? Polubienia, podbicia i komentarze pierwotnego wpisu zostaną utracone.",
|
||||
"confirmations.redraft.title": "Usunąć i poprawić wpis?",
|
||||
"confirmations.remove_from_followers.confirm": "Usuń obserwującego",
|
||||
"confirmations.remove_from_followers.message": "{name} przestanie Cię obserwować. Czy na pewno chcesz kontynuować?",
|
||||
"confirmations.remove_from_followers.title": "Usunąć obserwującego?",
|
||||
"confirmations.revoke_quote.confirm": "Usuń post",
|
||||
"confirmations.revoke_quote.message": "Tej akcji nie można cofnąć.",
|
||||
"confirmations.revoke_quote.title": "Usuń post?",
|
||||
"confirmations.remove_from_followers.confirm": "Usuń z obserwujących",
|
||||
"confirmations.remove_from_followers.message": "{name} przestanie cię obserwować. Czy na pewno chcesz kontynuować?",
|
||||
"confirmations.remove_from_followers.title": "Usunąć z obserwujących?",
|
||||
"confirmations.revoke_quote.confirm": "Usuń wpis",
|
||||
"confirmations.revoke_quote.message": "Tej czynności nie można cofnąć.",
|
||||
"confirmations.revoke_quote.title": "Usunąć wpis?",
|
||||
"confirmations.unblock.confirm": "Odblokuj",
|
||||
"confirmations.unblock.title": "Odblokować {name}?",
|
||||
"confirmations.unfollow.confirm": "Nie obserwuj",
|
||||
"confirmations.unfollow.title": "Przestać obserwować {name}?",
|
||||
"confirmations.withdraw_request.confirm": "Wycofaj prośbę",
|
||||
"confirmations.withdraw_request.title": "Wycofać prośbę o zgodę na obserwowanie {name}?",
|
||||
"content_warning.hide": "Ukryj wpis",
|
||||
"content_warning.show": "Pokaż mimo to",
|
||||
"content_warning.show_more": "Pokaż więcej",
|
||||
|
|
@ -281,7 +296,7 @@
|
|||
"domain_pill.server": "Serwer",
|
||||
"domain_pill.their_handle": "Nazwa:",
|
||||
"domain_pill.their_server": "Cyfrowy dom wszystkich wpisów tej osoby.",
|
||||
"domain_pill.their_username": "Unikalny identyfikator na serwerze. Możliwe jest znalezienie użytkowników o tej samej nazwie użytkownika na różnych serwerach.",
|
||||
"domain_pill.their_username": "Unikalny identyfikator na serwerze. Możliwe jest znalezienie użytkowników o tej samej nazwie na różnych serwerach.",
|
||||
"domain_pill.username": "Nazwa użytkownika",
|
||||
"domain_pill.whats_in_a_handle": "Z czego składa się nazwa?",
|
||||
"domain_pill.who_they_are": "Dzięki temu, że nazwy wskazują, kim ktoś jest i gdzie się znajduje, możesz wchodzić w interakcje z innymi z różnych <button>sieci społecznościowych opartych na ActivityPub</button>.",
|
||||
|
|
@ -303,12 +318,12 @@
|
|||
"emoji_button.objects": "Obiekty",
|
||||
"emoji_button.people": "Ludzie",
|
||||
"emoji_button.recent": "Najczęściej używane",
|
||||
"emoji_button.search": "Szukaj…",
|
||||
"emoji_button.search": "Wyszukaj...",
|
||||
"emoji_button.search_results": "Wyniki wyszukiwania",
|
||||
"emoji_button.symbols": "Symbole",
|
||||
"emoji_button.travel": "Podróże i miejsca",
|
||||
"empty_column.account_featured.me": "Niczego jeszcze nie poleciłeś. Czy wiesz, że możesz wyświetlać swoje hashtagi, z których korzystasz najbardziej, a nawet konta znajomego na swoim profilu?",
|
||||
"empty_column.account_featured.other": "{acct} nie wyróżnił jeszcze nic. Czy wiesz, że możesz wyświetlać swoje hashtagi, z których korzystasz najbardziej, a nawet konta znajomego na swoim profilu?",
|
||||
"empty_column.account_featured.me": "Nie dodano jeszcze żadnych polecanych treści. Czy wiesz, że możesz wyróżnić najczęściej używane hashtagi, a nawet konta znajomych na swoim profilu?",
|
||||
"empty_column.account_featured.other": "Konto {acct} nie wyróżniło jeszcze żadnych treści. Czy wiesz, że możesz wyróżnić najczęściej używane hashtagi, a nawet konta znajomych w swoim profilu?",
|
||||
"empty_column.account_featured_other.unknown": "To konto nie zostało jeszcze wyróżnione.",
|
||||
"empty_column.account_hides_collections": "Ta osoba postanowiła nie udostępniać tych informacji",
|
||||
"empty_column.account_suspended": "Konto zawieszone",
|
||||
|
|
@ -318,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Nie dodano jeszcze żadnego wpisu do zakładek. Gdy to zrobisz, pojawi się tutaj.",
|
||||
"empty_column.community": "Lokalna oś czasu jest pusta. Opublikuj coś, by ruszyć z kopyta!",
|
||||
"empty_column.direct": "Nie ma tu jeszcze żadnych wzmianek bezpośrednich. Gdy je wyślesz lub otrzymasz, pojawią się tutaj.",
|
||||
"empty_column.disabled_feed": "Ten kanał został wyłączony przez administratorów serwera.",
|
||||
"empty_column.domain_blocks": "Brak zablokowanych domen.",
|
||||
"empty_column.explore_statuses": "Nic nie cieszy się teraz popularnością. Sprawdź później!",
|
||||
"empty_column.favourited_statuses": "Nie polubiono jeszcze żadnego wpisu. Gdy to zrobisz, pojawi się tutaj.",
|
||||
|
|
@ -342,10 +358,10 @@
|
|||
"explore.trending_links": "Aktualności",
|
||||
"explore.trending_statuses": "Wpisy",
|
||||
"explore.trending_tags": "Hasztagi",
|
||||
"featured_carousel.header": "{count, plural, one {Przypięty post} other {Przypięte posty}}",
|
||||
"featured_carousel.next": "Następny",
|
||||
"featured_carousel.header": "{count, plural, one {przypięty wpis} few {przypięte wpisy} many {przypięte wpisy} other {przypięte wpisy}}",
|
||||
"featured_carousel.next": "Dalej",
|
||||
"featured_carousel.post": "Opublikuj",
|
||||
"featured_carousel.previous": "Poprzedni",
|
||||
"featured_carousel.previous": "Wstecz",
|
||||
"featured_carousel.slide": "{index} z {total}",
|
||||
"filter_modal.added.context_mismatch_explanation": "To filtrowanie nie dotyczy kategorii, w której pojawił się ten wpis. Jeśli chcesz, aby wpis był filtrowany również w tym kontekście, musisz edytować ustawienia filtrowania.",
|
||||
"filter_modal.added.context_mismatch_title": "Niewłaściwy kontekst!",
|
||||
|
|
@ -446,10 +462,12 @@
|
|||
"ignore_notifications_modal.private_mentions_title": "Ignorować powiadomienia od niechcianych wzmianek bezpośrednich?",
|
||||
"info_button.label": "Pomoc",
|
||||
"info_button.what_is_alt_text": "<h1>Czym jest tekst alternatywny?</h1><p>Tekst alternatywny zawiera opisy zdjęć dla osób niedowidzących, korzystających z połączeń o niskiej przepustowości lub szukających dodatkowego kontekstu.</p>\n<p>Możesz poprawić dostępność i czytelność dla wszystkich, pisząc jasny, zwięzły i precyzyjny tekst alternatywny.</p>\n<ul>\n<li>Podkreśl ważne elementy</li>\n<li>Streść tekst widoczny na zdjęciach</li>\n<li>Używaj poprawnej struktury zdań</li>\n<li>Unikaj zbędnych informacji</li>\n<li>Skoncentruj się na kluczowych informacjach zawartych w złożonych wizualizacjach (takich jak diagramy lub mapy)</li>\n</ul>",
|
||||
"interaction_modal.action": "Aby wejść w interakcję z wpisem od {name}, musisz zalogować się na swoje konto na dowolnym serwerze Mastodon, na którym masz już konto.",
|
||||
"interaction_modal.go": "Dalej",
|
||||
"interaction_modal.no_account_yet": "Nie masz jeszcze konta?",
|
||||
"interaction_modal.on_another_server": "Na innym serwerze",
|
||||
"interaction_modal.on_this_server": "Na tym serwerze",
|
||||
"interaction_modal.title": "Zaloguj się, aby kontynuować",
|
||||
"interaction_modal.username_prompt": "Np. {example}",
|
||||
"intervals.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}",
|
||||
"intervals.full.hours": "{number, plural, one {# godzina} few {# godziny} many {# godzin} other {# godzin}}",
|
||||
|
|
@ -470,6 +488,7 @@
|
|||
"keyboard_shortcuts.home": "Otwórz stronę główną",
|
||||
"keyboard_shortcuts.hotkey": "Skrót klawiszowy",
|
||||
"keyboard_shortcuts.legend": "Wyświetl skróty klawiszowe",
|
||||
"keyboard_shortcuts.load_more": "Aktywuj przycisk \"Załaduj więcej\"",
|
||||
"keyboard_shortcuts.local": "Otwórz lokalną oś czasu",
|
||||
"keyboard_shortcuts.mention": "Dodaj wzmiankę",
|
||||
"keyboard_shortcuts.muted": "Otwórz listę wyciszonych",
|
||||
|
|
@ -731,9 +750,15 @@
|
|||
"privacy.quote.disabled": "{visibility}, cytaty wyłączone",
|
||||
"privacy.quote.limited": "{visibility}, cytaty ograniczone",
|
||||
"privacy.unlisted.additional": "Dostępny podobnie jak wpis publiczny, ale nie będzie widoczny w aktualnościach, hashtagach ani wyszukiwarce Mastodon, nawet jeśli twoje konto jest widoczne.",
|
||||
"privacy.unlisted.long": "Ukryte w wynikach wyszukiwania Mastodona, trendach i publicznych osiach czasu",
|
||||
"privacy.unlisted.short": "Niewidoczny",
|
||||
"privacy_policy.last_updated": "Data ostatniej aktualizacji: {date}",
|
||||
"privacy_policy.title": "Polityka prywatności",
|
||||
"quote_error.edit": "Podczas edycji wpisu nie można dodawać cytatów.",
|
||||
"quote_error.poll": "W ankietach nie można cytować.",
|
||||
"quote_error.quote": "Dozwolone jest tylko jedno cytowanie na raz.",
|
||||
"quote_error.unauthorized": "Nie masz uprawnień do cytowania tego wpisu.",
|
||||
"quote_error.upload": "Cytowanie nie jest dozwolone w przypadku załączników multimedialnych.",
|
||||
"recommended": "Zalecane",
|
||||
"refresh": "Odśwież",
|
||||
"regeneration_indicator.please_stand_by": "Proszę czekać.",
|
||||
|
|
@ -750,6 +775,7 @@
|
|||
"relative_time.seconds": "{number} s.",
|
||||
"relative_time.today": "dzisiaj",
|
||||
"remove_quote_hint.button_label": "Rozumiem",
|
||||
"remove_quote_hint.message": "Można to zrobić z poziomu menu opcji {icon}.",
|
||||
"remove_quote_hint.title": "Czy chcesz usunąć swój cytowany post?",
|
||||
"reply_indicator.attachments": "{count, plural, one {# załącznik} few {# załączniki} many {# załączników} other {# załączników}}",
|
||||
"reply_indicator.cancel": "Anuluj",
|
||||
|
|
@ -842,10 +868,19 @@
|
|||
"status.admin_account": "Otwórz interfejs moderacyjny dla @{name}",
|
||||
"status.admin_domain": "Otwórz interfejs moderacyjny dla {domain}",
|
||||
"status.admin_status": "Otwórz ten wpis w interfejsie moderacyjnym",
|
||||
"status.all_disabled": "Podbicia i cytaty są wyłączone",
|
||||
"status.block": "Zablokuj @{name}",
|
||||
"status.bookmark": "Dodaj zakładkę",
|
||||
"status.cancel_reblog_private": "Cofnij podbicie",
|
||||
"status.cannot_quote": "Nie można cytować tego wpisu",
|
||||
"status.cannot_reblog": "Ten wpis nie może zostać podbity",
|
||||
"status.contains_quote": "Zawiera cytat",
|
||||
"status.context.loading": "Wczytywanie kolejnych komentarzy",
|
||||
"status.context.loading_error": "Nie można wczytać nowych komentarzy",
|
||||
"status.context.loading_success": "Wczytano nowe komentarze",
|
||||
"status.context.more_replies_found": "Znaleziono więcej komentarzy",
|
||||
"status.context.retry": "Spróbuj ponownie",
|
||||
"status.context.show": "Pokaż",
|
||||
"status.continued_thread": "Ciąg dalszy wątku",
|
||||
"status.copy": "Skopiuj odnośnik do wpisu",
|
||||
"status.delete": "Usuń",
|
||||
|
|
@ -875,26 +910,39 @@
|
|||
"status.quote": "Cytuj",
|
||||
"status.quote.cancel": "Anuluj cytat",
|
||||
"status.quote_error.filtered": "Ukryte z powodu jednego z Twoich filtrów",
|
||||
"status.quote_error.limited_account_hint.action": "Pokaż mimo wszystko",
|
||||
"status.quote_error.limited_account_hint.title": "To konto zostało ukryte przez moderatorów {domain}.",
|
||||
"status.quote_error.not_available": "Post niedostępny",
|
||||
"status.quote_error.pending_approval": "Post oczekujący",
|
||||
"status.quote_error.pending_approval_popout.body": "Na Mastodon możesz kontrolować, czy ktoś może cytować twoje wpisy. Ten wpis oczekuje na zatwierdzenie przez autora.",
|
||||
"status.quote_error.revoked": "Wpis został usunięty przez autora",
|
||||
"status.quote_followers_only": "Tylko obserwatorzy mogą cytować ten post",
|
||||
"status.quote_manual_review": "Autor zatwierdzi ręcznie",
|
||||
"status.quote_noun": "Cytuj",
|
||||
"status.quote_policy_change": "Zmień kto może cytować",
|
||||
"status.quote_post_author": "Zacytowano post @{name}",
|
||||
"status.quote_private": "Prywatne posty nie mogą być cytowane",
|
||||
"status.quotes": "{count, plural, one {cytat} few {cytaty} many {cytatów} other {cytatów}}",
|
||||
"status.quotes.empty": "Nikt jeszcze nie zacytował tego wpisu. Gdy ktoś to zrobi, pojawi się on tutaj.",
|
||||
"status.quotes.local_other_disclaimer": "Cytaty odrzucone przez autora nie będą wyświetlane.",
|
||||
"status.quotes.remote_other_disclaimer": "Będą tutaj wyświetlane tylko cytaty z {domain}. Cytaty odrzucone przez autora nie będą wyświetlane.",
|
||||
"status.read_more": "Czytaj dalej",
|
||||
"status.reblog": "Podbij",
|
||||
"status.reblog_or_quote": "Podbij lub cytuj",
|
||||
"status.reblog_private": "Udostępnij ponownie swoim obserwującym",
|
||||
"status.reblogged_by": "Podbite przez {name}",
|
||||
"status.reblogs": "{count, plural, one {podbicie} few {podbicia} other {podbić}}",
|
||||
"status.reblogs.empty": "Nikt nie podbił jeszcze tego wpisu. Gdy ktoś to zrobi, pojawi się tutaj.",
|
||||
"status.redraft": "Usuń i przeredaguj",
|
||||
"status.remove_bookmark": "Usuń zakładkę",
|
||||
"status.remove_favourite": "Usuń z ulubionych",
|
||||
"status.remove_quote": "Usuń",
|
||||
"status.replied_in_thread": "Odpowiedź w wątku",
|
||||
"status.replied_to": "Odpowiedź do wpisu użytkownika {name}",
|
||||
"status.reply": "Odpowiedz",
|
||||
"status.replyAll": "Odpowiedz na wątek",
|
||||
"status.report": "Zgłoś @{name}",
|
||||
"status.request_quote": "Poproś o możliwość cytowania",
|
||||
"status.revoke_quote": "Usuń mój wpis z postu @{name}",
|
||||
"status.sensitive_warning": "Wrażliwa zawartość",
|
||||
"status.share": "Udostępnij",
|
||||
|
|
@ -959,6 +1007,12 @@
|
|||
"video.volume_up": "Zwiększ głośność",
|
||||
"visibility_modal.button_title": "Ustaw widoczność",
|
||||
"visibility_modal.header": "Widoczność i interakcja",
|
||||
"visibility_modal.helper.direct_quoting": "Prywatne wzmianki opublikowane na Mastodonie nie mogą być cytowane przez inne osoby.",
|
||||
"visibility_modal.helper.privacy_editing": "Widoczność nie może być zmieniona po opublikowaniu wpisu.",
|
||||
"visibility_modal.helper.privacy_private_self_quote": "Cytaty z prywatnych wpisów nie mogą być publiczne.",
|
||||
"visibility_modal.helper.private_quoting": "Wpisy publikowane na Mastodonie wyłącznie dla obserwujących nie mogą być cytowane przez inne osoby.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Kiedy ktoś cytuje twoje wpisy, będą one również ukryte na popularnych osiach czasu.",
|
||||
"visibility_modal.instructions": "Kontroluj, kto może wchodzić w interakcję z tym wpisem. Możesz również zastosować ustawienia do wszystkich przyszłych wpisów, przechodząc do <link>Preferencje > Domyślne ustawienia publikowania</link>.",
|
||||
"visibility_modal.privacy_label": "Widoczność",
|
||||
"visibility_modal.quote_followers": "Tylko dla obserwujących",
|
||||
"visibility_modal.quote_label": "Kto może cytować",
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
"account.disable_notifications": "Cancelar notificações de @{name}",
|
||||
"account.domain_blocking": "Bloqueando domínio",
|
||||
"account.edit_profile": "Editar perfil",
|
||||
"account.edit_profile_short": "Editar",
|
||||
"account.enable_notifications": "Notificar novos toots de @{name}",
|
||||
"account.endorse": "Recomendar",
|
||||
"account.familiar_followers_many": "Seguido por {name1}, {name2}, e {othersCount, plural, one {um outro que você conhece} other {# outros que você conhece}}",
|
||||
|
|
@ -40,6 +41,11 @@
|
|||
"account.featured_tags.last_status_never": "Sem publicações",
|
||||
"account.follow": "Seguir",
|
||||
"account.follow_back": "Seguir de volta",
|
||||
"account.follow_back_short": "Seguir de volta",
|
||||
"account.follow_request": "Pedir para seguir",
|
||||
"account.follow_request_cancel": "Cancelar solicitação",
|
||||
"account.follow_request_cancel_short": "Cancelar",
|
||||
"account.follow_request_short": "Solicitação",
|
||||
"account.followers": "Seguidores",
|
||||
"account.followers.empty": "Nada aqui.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
|
||||
|
|
@ -240,6 +246,8 @@
|
|||
"confirmations.mute.confirm": "Silenciar",
|
||||
"confirmations.quiet_post_quote_info.dismiss": "Não me lembrar novamente",
|
||||
"confirmations.quiet_post_quote_info.got_it": "Entendi",
|
||||
"confirmations.quiet_post_quote_info.message": "Ao citar uma publicação pública silenciosa, sua postagem será oculta das linhas de tempo em tendência.",
|
||||
"confirmations.quiet_post_quote_info.title": "Citando publicações públicas silenciadas",
|
||||
"confirmations.redraft.confirm": "Excluir e rascunhar",
|
||||
"confirmations.redraft.message": "Você tem certeza de que quer apagar essa postagem e rascunhá-la? Favoritos e impulsos serão perdidos, e respostas à postagem original ficarão órfãs.",
|
||||
"confirmations.redraft.title": "Excluir e rascunhar publicação?",
|
||||
|
|
@ -249,7 +257,12 @@
|
|||
"confirmations.revoke_quote.confirm": "Remover publicação",
|
||||
"confirmations.revoke_quote.message": "Essa ação não pode ser desfeita.",
|
||||
"confirmations.revoke_quote.title": "Remover publicação?",
|
||||
"confirmations.unblock.confirm": "Desbloquear",
|
||||
"confirmations.unblock.title": "Desbloquear {name}?",
|
||||
"confirmations.unfollow.confirm": "Deixar de seguir",
|
||||
"confirmations.unfollow.title": "Deixar de seguir {name}?",
|
||||
"confirmations.withdraw_request.confirm": "Retirar solicitação",
|
||||
"confirmations.withdraw_request.title": "Cancelar solicitação para seguir {name}?",
|
||||
"content_warning.hide": "Ocultar post",
|
||||
"content_warning.show": "Mostrar mesmo assim",
|
||||
"content_warning.show_more": "Mostrar mais",
|
||||
|
|
@ -320,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Nada aqui. Quando você salvar um toot, ele aparecerá aqui.",
|
||||
"empty_column.community": "A linha local está vazia. Publique algo para começar!",
|
||||
"empty_column.direct": "Você ainda não tem mensagens privadas. Quando você enviar ou receber uma, será exibida aqui.",
|
||||
"empty_column.disabled_feed": "Este feed foi desativado pelos administradores do servidor.",
|
||||
"empty_column.domain_blocks": "Nada aqui.",
|
||||
"empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!",
|
||||
"empty_column.favourited_statuses": "Você ainda não tem publicações favoritas. Quanto você marcar uma como favorita, ela aparecerá aqui.",
|
||||
|
|
@ -448,10 +462,12 @@
|
|||
"ignore_notifications_modal.private_mentions_title": "Ignorar notificações de menções privadas não solicitadas?",
|
||||
"info_button.label": "Ajuda",
|
||||
"info_button.what_is_alt_text": "<h1>O que é texto alternativo?</h1><p>O texto alternativo fornece descrições de imagens para pessoas com deficiências visuais, conexões de internet de baixa largura de banda ou aquelas que buscam mais contexto.</p><p>Você pode melhorar a acessibilidade e a compreensão para todos escrevendo texto alternativo claro, conciso e objetivo.</p> <ul> <li>Capture elementos importantes</li> <li>Resuma textos em imagens</li> <li>Use estrutura de frases regular</li> <li>Evite informações redundantes</li> <li>Foque em tendências e descobertas principais em visuais complexos (como diagramas ou mapas)</li> </ul>",
|
||||
"interaction_modal.action": "Para interagir com o post de {name}, você precisa entrar em sua conta em qualquer servidor Mastodon que você use.",
|
||||
"interaction_modal.go": "Ir",
|
||||
"interaction_modal.no_account_yet": "Não possui uma conta ainda?",
|
||||
"interaction_modal.on_another_server": "Em um servidor diferente",
|
||||
"interaction_modal.on_this_server": "Neste servidor",
|
||||
"interaction_modal.title": "Faça login para continuar",
|
||||
"interaction_modal.username_prompt": "p. e.x.: {example}",
|
||||
"intervals.full.days": "{number, plural, one {# dia} other {# dias}}",
|
||||
"intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
|
||||
|
|
@ -734,9 +750,11 @@
|
|||
"privacy.quote.disabled": "{visibility} Citações desabilitadas",
|
||||
"privacy.quote.limited": "{visibility} Citações limitadas",
|
||||
"privacy.unlisted.additional": "Isso se comporta exatamente como público, exceto que a publicação não aparecerá nos _feeds ao vivo_ ou nas _hashtags_, explorar, ou barra de busca, mesmo que você seja escolhido em toda a conta.",
|
||||
"privacy.unlisted.short": "Público (silencioso)",
|
||||
"privacy.unlisted.long": "Oculto para os resultados de pesquisa do Mastodon, tendências e linhas do tempo públicas",
|
||||
"privacy.unlisted.short": "Público silenciado",
|
||||
"privacy_policy.last_updated": "Atualizado {date}",
|
||||
"privacy_policy.title": "Política de privacidade",
|
||||
"quote_error.edit": "Citações não podem ser adicionadas durante a edição de uma publicação.",
|
||||
"quote_error.poll": "Citações não permitidas com enquetes.",
|
||||
"quote_error.quote": "Apenas uma citação por vez é permitido.",
|
||||
"quote_error.unauthorized": "Você não é autorizado a citar essa publicação.",
|
||||
|
|
@ -756,6 +774,9 @@
|
|||
"relative_time.minutes": "{number}m",
|
||||
"relative_time.seconds": "{number}s",
|
||||
"relative_time.today": "hoje",
|
||||
"remove_quote_hint.button_label": "Entendi",
|
||||
"remove_quote_hint.message": "Você pode fazê-lo no menu de opções {icon}.",
|
||||
"remove_quote_hint.title": "Deseja remover sua citação publicada?",
|
||||
"reply_indicator.attachments": "{count, plural, one {# attachment} other {# attachments}}",
|
||||
"reply_indicator.cancel": "Cancelar",
|
||||
"reply_indicator.poll": "Enquete",
|
||||
|
|
@ -851,7 +872,15 @@
|
|||
"status.block": "Bloquear @{name}",
|
||||
"status.bookmark": "Salvar",
|
||||
"status.cancel_reblog_private": "Desfazer boost",
|
||||
"status.cannot_quote": "Você não tem permissão para citar esta publicação",
|
||||
"status.cannot_reblog": "Este toot não pode receber boost",
|
||||
"status.contains_quote": "Contém citação",
|
||||
"status.context.loading": "Carregando mais respostas",
|
||||
"status.context.loading_error": "Não foi possível carregar novas respostas",
|
||||
"status.context.loading_success": "Novas respostas carregadas",
|
||||
"status.context.more_replies_found": "Mais respostas encontradas",
|
||||
"status.context.retry": "Tentar novamente",
|
||||
"status.context.show": "Mostrar",
|
||||
"status.continued_thread": "Continuação da conversa",
|
||||
"status.copy": "Copiar link",
|
||||
"status.delete": "Excluir",
|
||||
|
|
@ -881,24 +910,33 @@
|
|||
"status.quote": "Citar",
|
||||
"status.quote.cancel": "Cancelar citação",
|
||||
"status.quote_error.filtered": "Oculto devido a um dos seus filtros",
|
||||
"status.quote_error.limited_account_hint.action": "Mostrar mesmo assim",
|
||||
"status.quote_error.limited_account_hint.title": "Esta conta foi oculta pelos moderadores do {domain}.",
|
||||
"status.quote_error.not_available": "Publicação indisponível",
|
||||
"status.quote_error.pending_approval": "Publicação pendente",
|
||||
"status.quote_error.pending_approval_popout.body": "No Mastodon, você pode controlar se alguém pode citar você. Esta publicação está pendente enquanto estamos recebendo a aprovação do autor original.",
|
||||
"status.quote_error.revoked": "Publicação removida pelo autor",
|
||||
"status.quote_followers_only": "Apenas seguidores podem citar sua publicação",
|
||||
"status.quote_manual_review": "Autor irá revisar manualmente",
|
||||
"status.quote_noun": "Citar",
|
||||
"status.quote_policy_change": "Mude quem pode citar",
|
||||
"status.quote_post_author": "Publicação citada por @{name}",
|
||||
"status.quote_private": "Publicações privadas não podem ser citadas",
|
||||
"status.quotes": "{count, plural, one {# voto} other {# votos}}",
|
||||
"status.quotes.empty": "Ninguém citou essa publicação até agora. Quando alguém citar aparecerá aqui.",
|
||||
"status.quotes.local_other_disclaimer": "Citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.quotes.remote_other_disclaimer": "Apenas citações do {domain} têm a garantia de serem exibidas aqui. Citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.read_more": "Ler mais",
|
||||
"status.reblog": "Dar boost",
|
||||
"status.reblog_or_quote": "Acelerar ou citar",
|
||||
"status.reblog_private": "Compartilhar novamente com seus seguidores",
|
||||
"status.reblogged_by": "{name} deu boost",
|
||||
"status.reblogs": "{count, plural, one {boost} other {boosts}}",
|
||||
"status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.",
|
||||
"status.redraft": "Excluir e rascunhar",
|
||||
"status.remove_bookmark": "Remover do Salvos",
|
||||
"status.remove_favourite": "Remover dos favoritos",
|
||||
"status.remove_quote": "Remover",
|
||||
"status.replied_in_thread": "Respondido na conversa",
|
||||
"status.replied_to": "Em resposta a {name}",
|
||||
"status.reply": "Responder",
|
||||
|
|
@ -970,6 +1008,8 @@
|
|||
"visibility_modal.button_title": "Selecionar Visibilidade",
|
||||
"visibility_modal.header": "Visibilidade e interação",
|
||||
"visibility_modal.helper.direct_quoting": "Menções privadas escritas no Mastodon.",
|
||||
"visibility_modal.helper.privacy_editing": "A visibilidade não pode ser alterada após uma publicação ser publicada.",
|
||||
"visibility_modal.helper.privacy_private_self_quote": "As auto-citações de publicações privadas não podem ser públicas.",
|
||||
"visibility_modal.helper.private_quoting": "Posts somente para seguidores feitos no Mastodon não podem ser citados por outros.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quando as pessoas citam você, sua publicação também será ocultada das linhas de tempo de tendência.",
|
||||
"visibility_modal.instructions": "Controle quem pode interagir com este post. Você também pode aplicar as configurações para todos os posts futuros navegando para <link>Preferências > Postagem padrão</link>.",
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
"account.follows.empty": "Este utilizador ainda não segue ninguém.",
|
||||
"account.follows_you": "Segue-te",
|
||||
"account.go_to_profile": "Ir para o perfil",
|
||||
"account.hide_reblogs": "Esconder partilhas impulsionadas de @{name}",
|
||||
"account.hide_reblogs": "Esconder partilhas de @{name}",
|
||||
"account.in_memoriam": "Em Memória.",
|
||||
"account.joined_short": "Juntou-se a",
|
||||
"account.languages": "Alterar idiomas subscritos",
|
||||
|
|
@ -79,7 +79,7 @@
|
|||
"account.requested_follow": "{name} pediu para seguir-te",
|
||||
"account.requests_to_follow_you": "Pediu para seguir-te",
|
||||
"account.share": "Partilhar o perfil @{name}",
|
||||
"account.show_reblogs": "Mostrar partilhas impulsionadas de @{name}",
|
||||
"account.show_reblogs": "Mostrar partilhas de @{name}",
|
||||
"account.statuses_counter": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
|
||||
"account.unblock": "Desbloquear @{name}",
|
||||
"account.unblock_domain": "Desbloquear o domínio {domain}",
|
||||
|
|
@ -113,7 +113,7 @@
|
|||
"alt_text_modal.describe_for_people_with_visual_impairments": "Descreve isto para pessoas com problemas de visão…",
|
||||
"alt_text_modal.done": "Concluído",
|
||||
"announcement.announcement": "Mensagem de manutenção",
|
||||
"annual_report.summary.archetype.booster": "O caçador de frescura",
|
||||
"annual_report.summary.archetype.booster": "O caçador de tendências",
|
||||
"annual_report.summary.archetype.lurker": "O espreitador",
|
||||
"annual_report.summary.archetype.oracle": "O oráculo",
|
||||
"annual_report.summary.archetype.pollster": "O sondagens",
|
||||
|
|
@ -122,7 +122,7 @@
|
|||
"annual_report.summary.followers.total": "{count} no total",
|
||||
"annual_report.summary.here_it_is": "Aqui está um resumo do ano {year}:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "publicação mais favorita",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "publicação mais impulsionada",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "publicação mais partilhada",
|
||||
"annual_report.summary.highlighted_post.by_replies": "publicação com o maior número de respostas",
|
||||
"annual_report.summary.highlighted_post.possessive": "{name}",
|
||||
"annual_report.summary.most_used_app.most_used_app": "aplicação mais utilizada",
|
||||
|
|
@ -142,9 +142,9 @@
|
|||
"block_modal.they_will_know": "Ele pode ver que o bloqueaste.",
|
||||
"block_modal.title": "Bloquear utilizador?",
|
||||
"block_modal.you_wont_see_mentions": "Não verás publicações que mencionem este utilizador.",
|
||||
"boost_modal.combo": "Podes premir {combo} para não voltares a ver isto",
|
||||
"boost_modal.reblog": "Impulsionar a publicação?",
|
||||
"boost_modal.undo_reblog": "Não impulsionar a publicação?",
|
||||
"boost_modal.combo": "Pode clicar em {combo} para não voltar a ver isto",
|
||||
"boost_modal.reblog": "Partilhar a publicação?",
|
||||
"boost_modal.undo_reblog": "Deixar de partilhar a publicação?",
|
||||
"bundle_column_error.copy_stacktrace": "Copiar relatório de erros",
|
||||
"bundle_column_error.error.body": "A página solicitada não pôde ser sintetizada. Isto pode ser devido a uma falha no nosso código ou a um problema de compatibilidade com o navegador.",
|
||||
"bundle_column_error.error.title": "Ó, não!",
|
||||
|
|
@ -249,7 +249,7 @@
|
|||
"confirmations.quiet_post_quote_info.message": "Ao citar uma publicação não listada, a sua publicação não será exibida nos destaques.",
|
||||
"confirmations.quiet_post_quote_info.title": "Citação de publicação não listada",
|
||||
"confirmations.redraft.confirm": "Eliminar e reescrever",
|
||||
"confirmations.redraft.message": "Tens a certeza de que queres eliminar e tornar a escrever esta publicação? Os favoritos e as publicações impulsionadas perder-se-ão e as respostas à publicação original ficarão órfãs.",
|
||||
"confirmations.redraft.message": "Tem a certeza que pretende eliminar e tornar a escrever esta publicação? Os favoritos e as partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.",
|
||||
"confirmations.redraft.title": "Eliminar e reescrever publicação?",
|
||||
"confirmations.remove_from_followers.confirm": "Remover seguidor",
|
||||
"confirmations.remove_from_followers.message": "{name} vai parar de seguir-te. Tens a certeza que prentedes continuar?",
|
||||
|
|
@ -257,7 +257,12 @@
|
|||
"confirmations.revoke_quote.confirm": "Remover publicação",
|
||||
"confirmations.revoke_quote.message": "Esta ação é irreversível.",
|
||||
"confirmations.revoke_quote.title": "Remover publicação?",
|
||||
"confirmations.unblock.confirm": "Desbloquear",
|
||||
"confirmations.unblock.title": "Desbloquear {name}?",
|
||||
"confirmations.unfollow.confirm": "Deixar de seguir",
|
||||
"confirmations.unfollow.title": "Deixar de seguir {name}?",
|
||||
"confirmations.withdraw_request.confirm": "Retirar pedido",
|
||||
"confirmations.withdraw_request.title": "Retirar pedido para seguir {name}?",
|
||||
"content_warning.hide": "Ocultar publicação",
|
||||
"content_warning.show": "Mostrar mesmo assim",
|
||||
"content_warning.show_more": "Mostrar mais",
|
||||
|
|
@ -325,9 +330,10 @@
|
|||
"empty_column.account_timeline": "Sem publicações por aqui!",
|
||||
"empty_column.account_unavailable": "Perfil indisponível",
|
||||
"empty_column.blocks": "Ainda não bloqueaste nenhum utilizador.",
|
||||
"empty_column.bookmarked_statuses": "Ainda não tens nenhuma publicação marcada. Quando marcares uma, ela aparecerá aqui.",
|
||||
"empty_column.bookmarked_statuses": "Ainda não tem nenhuma publicação salva. Quando salvar uma, ela aparecerá aqui.",
|
||||
"empty_column.community": "A cronologia local está vazia. Escreve algo publicamente para começar!",
|
||||
"empty_column.direct": "Ainda não tens qualquer menção privada. Quando enviares ou receberes uma, ela irá aparecer aqui.",
|
||||
"empty_column.disabled_feed": "Esta cronologia foi desativada pelos administradores do seu servidor.",
|
||||
"empty_column.domain_blocks": "Ainda não há qualquer domínio bloqueado.",
|
||||
"empty_column.explore_statuses": "Não há nada em destaque neste momento. Volte mais tarde!",
|
||||
"empty_column.favourited_statuses": "Ainda não assinalaste qualquer publicação como favorita. Quando o fizeres, ela aparecerá aqui.",
|
||||
|
|
@ -361,7 +367,7 @@
|
|||
"filter_modal.added.context_mismatch_title": "O contexto não coincide!",
|
||||
"filter_modal.added.expired_explanation": "Esta categoria de filtro expirou, tens de alterar a data de validade para que ele seja aplicado.",
|
||||
"filter_modal.added.expired_title": "Filtro expirado!",
|
||||
"filter_modal.added.review_and_configure": "Para rever e configurar mais detalhadamente esta categoria de filtro, vai a {settings_link}.",
|
||||
"filter_modal.added.review_and_configure": "Para rever e configurar mais detalhadamente esta categoria de filtro, vá a {settings_link}.",
|
||||
"filter_modal.added.review_and_configure_title": "Definições do filtro",
|
||||
"filter_modal.added.settings_link": "página de definições",
|
||||
"filter_modal.added.short_explanation": "Esta publicação foi adicionada à seguinte categoria de filtro: {title}.",
|
||||
|
|
@ -424,10 +430,10 @@
|
|||
"hashtag.counter_by_uses": "{count, plural, one {{counter} publicação} other {{counter} publicações}}",
|
||||
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicação} other {{counter} publicações}} hoje",
|
||||
"hashtag.feature": "Destacar no perfil",
|
||||
"hashtag.follow": "Seguir #etiqueta",
|
||||
"hashtag.follow": "Seguir etiqueta",
|
||||
"hashtag.mute": "Silenciar #{hashtag}",
|
||||
"hashtag.unfeature": "Não destacar no perfil",
|
||||
"hashtag.unfollow": "Deixar de seguir #etiqueta",
|
||||
"hashtag.unfollow": "Deixar de seguir a etiqueta",
|
||||
"hashtags.and_other": "…e {count, plural, other {mais #}}",
|
||||
"hints.profiles.followers_may_be_missing": "É possível que não estejam a ser mostrados todos os seguidores deste perfil.",
|
||||
"hints.profiles.follows_may_be_missing": "É possível que não estejam a ser mostrados todos os seguidos por este perfil.",
|
||||
|
|
@ -436,7 +442,7 @@
|
|||
"hints.profiles.see_more_follows": "Ver mais perfis seguidos em {domain}",
|
||||
"hints.profiles.see_more_posts": "Ver mais publicações em {domain}",
|
||||
"home.column_settings.show_quotes": "Mostrar citações",
|
||||
"home.column_settings.show_reblogs": "Mostrar impulsos",
|
||||
"home.column_settings.show_reblogs": "Mostrar partilhas",
|
||||
"home.column_settings.show_replies": "Mostrar respostas",
|
||||
"home.hide_announcements": "Ocultar mensagens de manutenção",
|
||||
"home.pending_critical_update.body": "Atualiza o teu servidor Mastodon assim que possível!",
|
||||
|
|
@ -468,7 +474,7 @@
|
|||
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
|
||||
"keyboard_shortcuts.back": "voltar atrás",
|
||||
"keyboard_shortcuts.blocked": "abrir a lista de utilizadores bloqueados",
|
||||
"keyboard_shortcuts.boost": "impulsionar a publicação",
|
||||
"keyboard_shortcuts.boost": "Partilhar a publicação",
|
||||
"keyboard_shortcuts.column": "focar uma publicação numa das colunas",
|
||||
"keyboard_shortcuts.compose": "focar área de texto da publicação",
|
||||
"keyboard_shortcuts.description": "Descrição",
|
||||
|
|
@ -559,7 +565,7 @@
|
|||
"navigation_bar.advanced_interface": "Abrir na interface web avançada",
|
||||
"navigation_bar.automated_deletion": "Eliminação automática de publicações",
|
||||
"navigation_bar.blocks": "Utilizadores bloqueados",
|
||||
"navigation_bar.bookmarks": "Marcadores",
|
||||
"navigation_bar.bookmarks": "Itens salvos",
|
||||
"navigation_bar.direct": "Menções privadas",
|
||||
"navigation_bar.domain_blocks": "Domínios escondidos",
|
||||
"navigation_bar.favourites": "Favoritos",
|
||||
|
|
@ -621,8 +627,8 @@
|
|||
"notification.own_poll": "A tua sondagem terminou",
|
||||
"notification.poll": "Terminou uma sondagem em que votaste",
|
||||
"notification.quoted_update": "{name} editou uma publicação que citou",
|
||||
"notification.reblog": "{name} impulsionou a tua publicação",
|
||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# outro} other {# outros}}</a> impulsionaram a tua publicação",
|
||||
"notification.reblog": "{name} partilhou a sua publicação",
|
||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# outro} other {# outros}}</a> partilharam a sua publicação",
|
||||
"notification.relationships_severance_event": "Perdeu as ligações com {name}",
|
||||
"notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que já não podes receber atualizações dele ou interagir com ele.",
|
||||
"notification.relationships_severance_event.domain_block": "Um administrador de {from} bloqueou {target}, incluindo {followersCount} dos teus seguidores e {followingCount, plural, one {# conta} other {# contas}} que segues.",
|
||||
|
|
@ -665,7 +671,7 @@
|
|||
"notifications.column_settings.poll": "Resultados da sondagem:",
|
||||
"notifications.column_settings.push": "Notificações \"push\"",
|
||||
"notifications.column_settings.quote": "Citações:",
|
||||
"notifications.column_settings.reblog": "Impulsos:",
|
||||
"notifications.column_settings.reblog": "Partilhas:",
|
||||
"notifications.column_settings.show": "Mostrar na coluna",
|
||||
"notifications.column_settings.sound": "Reproduzir som",
|
||||
"notifications.column_settings.status": "Novas publicações:",
|
||||
|
|
@ -673,7 +679,7 @@
|
|||
"notifications.column_settings.unread_notifications.highlight": "Destacar notificações por ler",
|
||||
"notifications.column_settings.update": "Edições:",
|
||||
"notifications.filter.all": "Todas",
|
||||
"notifications.filter.boosts": "Impulsos",
|
||||
"notifications.filter.boosts": "Partilhas",
|
||||
"notifications.filter.favourites": "Favoritos",
|
||||
"notifications.filter.follows": "Seguidores",
|
||||
"notifications.filter.mentions": "Menções",
|
||||
|
|
@ -748,6 +754,7 @@
|
|||
"privacy.unlisted.short": "Público silencioso",
|
||||
"privacy_policy.last_updated": "Última atualização em {date}",
|
||||
"privacy_policy.title": "Política de privacidade",
|
||||
"quote_error.edit": "Não é possível adicionar citações ao editar uma publicação.",
|
||||
"quote_error.poll": "Não é permitido citar sondagens.",
|
||||
"quote_error.quote": "Apenas é permitida uma citação de cada vez.",
|
||||
"quote_error.unauthorized": "Não está autorizado a citar esta publicação.",
|
||||
|
|
@ -861,16 +868,16 @@
|
|||
"status.admin_account": "Abrir a interface de moderação para @{name}",
|
||||
"status.admin_domain": "Abrir interface de moderação para {domain}",
|
||||
"status.admin_status": "Abrir esta publicação na interface de moderação",
|
||||
"status.all_disabled": "Impulsos e citações estão desativados",
|
||||
"status.all_disabled": "Partilhas e citações estão desativados",
|
||||
"status.block": "Bloquear @{name}",
|
||||
"status.bookmark": "Guardar nos marcadores",
|
||||
"status.cancel_reblog_private": "Retirar impulso",
|
||||
"status.cancel_reblog_private": "Deixar de partilhar",
|
||||
"status.cannot_quote": "Não lhe é permitido citar esta publicação",
|
||||
"status.cannot_reblog": "Esta publicação não pode ser impulsionada",
|
||||
"status.cannot_reblog": "Esta publicação não pode ser partilhada",
|
||||
"status.contains_quote": "Contém citação",
|
||||
"status.context.loading": "A carregar mais respostas",
|
||||
"status.context.loading_error": "Não foi possível carregar novas respostas",
|
||||
"status.context.loading_success": "Todas as respostas carregadas",
|
||||
"status.context.loading_success": "Novas respostas carregadas",
|
||||
"status.context.more_replies_found": "Foram encontradas mais respostas",
|
||||
"status.context.retry": "Repetir",
|
||||
"status.context.show": "Mostrar",
|
||||
|
|
@ -917,13 +924,15 @@
|
|||
"status.quote_private": "Publicações privadas não podem ser citadas",
|
||||
"status.quotes": "{count, plural, one {citação} other {citações}}",
|
||||
"status.quotes.empty": "Ainda ninguém citou esta publicação. Quando alguém o fizer, aparecerá aqui.",
|
||||
"status.quotes.local_other_disclaimer": "As citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.quotes.remote_other_disclaimer": "Apenas citações de {domain} serão garantidamente exibidas aqui. Citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.read_more": "Ler mais",
|
||||
"status.reblog": "Impulsionar",
|
||||
"status.reblog": "Partilhar",
|
||||
"status.reblog_or_quote": "Partilhe ou cite",
|
||||
"status.reblog_private": "Partilhe novamente com os seus seguidores",
|
||||
"status.reblogged_by": "{name} impulsionou",
|
||||
"status.reblogs": "{count, plural, one {impulso} other {impulsos}}",
|
||||
"status.reblogs.empty": "Ainda ninguém impulsionou esta publicação. Quando alguém o fizer, aparecerá aqui.",
|
||||
"status.reblogged_by": "{name} partilhou",
|
||||
"status.reblogs": "{count, plural, one {partilha} other {partilhas}}",
|
||||
"status.reblogs.empty": "Ainda ninguém partilhou esta publicação. Quando alguém o fizer, aparecerá aqui.",
|
||||
"status.redraft": "Eliminar e reescrever",
|
||||
"status.remove_bookmark": "Retirar dos marcadores",
|
||||
"status.remove_favourite": "Remover dos favoritos",
|
||||
|
|
|
|||
|
|
@ -329,6 +329,7 @@
|
|||
"empty_column.bookmarked_statuses": "S’keni faqeruajtur ende ndonjë mesazh. Kur faqeruani një të tillë, ai do të shfaqet këtu.",
|
||||
"empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!",
|
||||
"empty_column.direct": "S’keni ende ndonjë përmendje private. Kur dërgoni ose merrni një të tillë, do të shfaqet këtu.",
|
||||
"empty_column.disabled_feed": "Kjo prurje është çaktivizuar nga përgjegjësit e shërbyesit tuaj.",
|
||||
"empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.",
|
||||
"empty_column.explore_statuses": "Asgjë në modë tani. Kontrolloni më vonë!",
|
||||
"empty_column.favourited_statuses": "S’keni ende ndonjë postim të parapëlqyer. Kur të parapëlqeni një të tillë, do të shfaqet këtu.",
|
||||
|
|
@ -872,7 +873,7 @@
|
|||
"status.contains_quote": "Përmban citim",
|
||||
"status.context.loading": "Po ngarkohen më tepër përgjigje",
|
||||
"status.context.loading_error": "S’u ngarkuan dot përgjigje të reja",
|
||||
"status.context.loading_success": "Janë ngarkuar krejt përgjigjet",
|
||||
"status.context.loading_success": "U ngarkuan përgjigje të reja",
|
||||
"status.context.more_replies_found": "U gjetën më tepër përgjigje",
|
||||
"status.context.retry": "Riprovoni",
|
||||
"status.context.show": "Shfaqe",
|
||||
|
|
|
|||
|
|
@ -876,7 +876,7 @@
|
|||
"status.contains_quote": "Alıntı içeriyor",
|
||||
"status.context.loading": "Daha fazla yanıt yükleniyor",
|
||||
"status.context.loading_error": "Yeni yanıtlar yüklenemiyor",
|
||||
"status.context.loading_success": "Tüm yanıtlar yüklendi",
|
||||
"status.context.loading_success": "Yeni yanıtlar yüklendi",
|
||||
"status.context.more_replies_found": "Daha fazla yanıt bulundu",
|
||||
"status.context.retry": "Yeniden dene",
|
||||
"status.context.show": "Göster",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,12 @@
|
|||
"account.badges.group": "گۇرۇپپا",
|
||||
"account.block": "@{name} نى توس",
|
||||
"account.block_domain": "{domain} دائىرىنى توس",
|
||||
"account.block_short": "توس",
|
||||
"account.blocked": "توسۇلدى",
|
||||
"account.blocking": "توسۇۋاتىدۇ",
|
||||
"account.cancel_follow_request": "ئەگىشىش ئىلتىماسىدىن ۋاز كەچ",
|
||||
"account.copy": "تەرجىمىھال ئۇلانمىسىنى كۆچۈر",
|
||||
"account.direct": "@{name} نى يوشۇرۇن ئاتا",
|
||||
"account.posts": "يازما",
|
||||
"account.posts_with_replies": "يازما ۋە ئىنكاس",
|
||||
"account.report": "@{name} نى پاش قىل",
|
||||
|
|
|
|||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.",
|
||||
"empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!",
|
||||
"empty_column.direct": "Bạn chưa có tin nhắn riêng nào. Khi bạn gửi hoặc nhận một tin nhắn riêng, nó sẽ xuất hiện ở đây.",
|
||||
"empty_column.disabled_feed": "Bảng tin này bị vô hiệu hóa bởi quản trị viên máy chủ của bạn.",
|
||||
"empty_column.domain_blocks": "Chưa ẩn bất kỳ máy chủ nào.",
|
||||
"empty_column.explore_statuses": "Chưa có gì hot. Kiểm tra lại sau!",
|
||||
"empty_column.favourited_statuses": "Bạn chưa thích tút nào. Hãy thử đi, nó sẽ xuất hiện ở đây.",
|
||||
|
|
@ -753,6 +754,7 @@
|
|||
"privacy.unlisted.short": "Hạn chế",
|
||||
"privacy_policy.last_updated": "Cập nhật lần cuối {date}",
|
||||
"privacy_policy.title": "Chính sách bảo mật",
|
||||
"quote_error.edit": "Không thể thêm trích dẫn khi sửa tút.",
|
||||
"quote_error.poll": "Không thể trích dẫn vốt.",
|
||||
"quote_error.quote": "Chỉ được trích dẫn một lần.",
|
||||
"quote_error.unauthorized": "Bạn không được cấp quyền trích dẫn tút này.",
|
||||
|
|
@ -875,7 +877,7 @@
|
|||
"status.contains_quote": "Chứa trích dẫn",
|
||||
"status.context.loading": "Tải thêm các trả lời",
|
||||
"status.context.loading_error": "Không thể tải những trả lời mới",
|
||||
"status.context.loading_success": "Đã tải toàn bộ trả lời",
|
||||
"status.context.loading_success": "Đã tải những lượt trả lời mới",
|
||||
"status.context.more_replies_found": "Có trả lời mới",
|
||||
"status.context.retry": "Thử lại",
|
||||
"status.context.show": "Hiện",
|
||||
|
|
|
|||
|
|
@ -876,7 +876,7 @@
|
|||
"status.contains_quote": "包含引用",
|
||||
"status.context.loading": "正在加载更多回复",
|
||||
"status.context.loading_error": "无法加载新回复",
|
||||
"status.context.loading_success": "已加载所有回复",
|
||||
"status.context.loading_success": "已加载新回复",
|
||||
"status.context.more_replies_found": "已找到更多回复",
|
||||
"status.context.retry": "重试",
|
||||
"status.context.show": "显示",
|
||||
|
|
|
|||
|
|
@ -105,8 +105,8 @@
|
|||
"alert.unexpected.message": "發生非預期的錯誤。",
|
||||
"alert.unexpected.title": "哎呀!",
|
||||
"alt_text_badge.title": "ALT 說明文字",
|
||||
"alt_text_modal.add_alt_text": "新增說明文字",
|
||||
"alt_text_modal.add_text_from_image": "自圖片新增說明文字",
|
||||
"alt_text_modal.add_alt_text": "新增 ALT 說明文字",
|
||||
"alt_text_modal.add_text_from_image": "自圖片新增 ALT 說明文字",
|
||||
"alt_text_modal.cancel": "取消",
|
||||
"alt_text_modal.change_thumbnail": "變更預覽圖",
|
||||
"alt_text_modal.describe_for_people_with_hearing_impairments": "替聽覺障礙人士描述...",
|
||||
|
|
@ -239,10 +239,10 @@
|
|||
"confirmations.logout.confirm": "登出",
|
||||
"confirmations.logout.message": "您確定要登出嗎?",
|
||||
"confirmations.logout.title": "您確定要登出嗎?",
|
||||
"confirmations.missing_alt_text.confirm": "新增說明文字",
|
||||
"confirmations.missing_alt_text.message": "您的嘟文中的多媒體內容未附上說明文字。添加說明文字描述能幫助更多人存取您的內容。",
|
||||
"confirmations.missing_alt_text.confirm": "新增 ALT 說明文字",
|
||||
"confirmations.missing_alt_text.message": "您的嘟文中的多媒體內容未附上 ALT 說明文字。添加說明文字描述能幫助更多人存取您的內容。",
|
||||
"confirmations.missing_alt_text.secondary": "仍要發嘟",
|
||||
"confirmations.missing_alt_text.title": "是否新增說明文字?",
|
||||
"confirmations.missing_alt_text.title": "是否新增 ALT 說明文字?",
|
||||
"confirmations.mute.confirm": "靜音",
|
||||
"confirmations.quiet_post_quote_info.dismiss": "不要再提醒我",
|
||||
"confirmations.quiet_post_quote_info.got_it": "了解",
|
||||
|
|
@ -333,6 +333,7 @@
|
|||
"empty_column.bookmarked_statuses": "您還沒有新增任何書籤。當您新增書籤時,它將於此顯示。",
|
||||
"empty_column.community": "本站時間軸是空的。快公開嘟些文搶頭香啊!",
|
||||
"empty_column.direct": "您還沒有收到任何私訊。當您私訊別人或收到私訊時,它將於此顯示。",
|
||||
"empty_column.disabled_feed": "此內容已被您的伺服器管理員停用。",
|
||||
"empty_column.domain_blocks": "尚未封鎖任何網域。",
|
||||
"empty_column.explore_statuses": "目前沒有熱門討論,請稍候再回來看看!",
|
||||
"empty_column.favourited_statuses": "您還沒有加過任何嘟文至最愛。當您收藏嘟文時,它將於此顯示。",
|
||||
|
|
@ -876,7 +877,7 @@
|
|||
"status.contains_quote": "包含引用嘟文",
|
||||
"status.context.loading": "讀取更多回嘟",
|
||||
"status.context.loading_error": "無法讀取新回嘟",
|
||||
"status.context.loading_success": "已讀取所有回嘟",
|
||||
"status.context.loading_success": "已讀取新回嘟",
|
||||
"status.context.more_replies_found": "已有更多回嘟",
|
||||
"status.context.retry": "再試一次",
|
||||
"status.context.show": "顯示",
|
||||
|
|
@ -912,8 +913,8 @@
|
|||
"status.quote_error.limited_account_hint.action": "仍要顯示",
|
||||
"status.quote_error.limited_account_hint.title": "此個人檔案已被 {domain} 的管理員隱藏。",
|
||||
"status.quote_error.not_available": "無法取得該嘟文",
|
||||
"status.quote_error.pending_approval": "嘟文正在發送中",
|
||||
"status.quote_error.pending_approval_popout.body": "您能於 Mastodon 控制是否允許引用您的嘟文。此嘟文正在等待原始作者核准。",
|
||||
"status.quote_error.pending_approval": "嘟文正在等候審核中",
|
||||
"status.quote_error.pending_approval_popout.body": "您能於 Mastodon 控制是否允許引用您的嘟文。此嘟文正在等待原始作者審核。",
|
||||
"status.quote_error.revoked": "嘟文已被作者刪除",
|
||||
"status.quote_followers_only": "只有我的跟隨者能引用此嘟文",
|
||||
"status.quote_manual_review": "嘟文作者將人工審閱",
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
export const PEMRISSION_VIEW_FEEDS = 0x0000000000100000;
|
||||
export const PERMISSION_INVITE_USERS = 0x0000000000010000;
|
||||
export const PERMISSION_MANAGE_USERS = 0x0000000000000400;
|
||||
export const PERMISSION_MANAGE_TAXONOMIES = 0x0000000000000100;
|
||||
|
|
@ -22,3 +23,19 @@ export function canManageReports(permissions: number) {
|
|||
(permissions & PERMISSION_MANAGE_REPORTS) === PERMISSION_MANAGE_REPORTS
|
||||
);
|
||||
}
|
||||
|
||||
export const canViewFeed = (
|
||||
signedIn: boolean,
|
||||
permissions: number,
|
||||
setting: 'public' | 'authenticated' | 'disabled' | undefined,
|
||||
) => {
|
||||
switch (setting) {
|
||||
case 'public':
|
||||
return true;
|
||||
case 'authenticated':
|
||||
return signedIn;
|
||||
case 'disabled':
|
||||
default:
|
||||
return (permissions & PEMRISSION_VIEW_FEEDS) === PEMRISSION_VIEW_FEEDS;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2,9 +2,6 @@
|
|||
// If there are no polyfills, then this is just Promise.resolve() which means
|
||||
// it will execute in the same tick of the event loop (i.e. near-instant).
|
||||
|
||||
// eslint-disable-next-line import/extensions -- This file is virtual so it thinks it has an extension
|
||||
import 'vite/modulepreload-polyfill';
|
||||
|
||||
import { loadIntlPolyfills } from './intl';
|
||||
|
||||
function importExtraPolyfills() {
|
||||
|
|
@ -17,6 +14,7 @@ export function loadPolyfills() {
|
|||
const needsExtraPolyfills = !window.requestIdleCallback;
|
||||
|
||||
return Promise.all([
|
||||
loadVitePreloadPolyfill(),
|
||||
loadIntlPolyfills(),
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- those properties might not exist in old browsers, even if they are always here in types
|
||||
needsExtraPolyfills ? importExtraPolyfills() : Promise.resolve(),
|
||||
|
|
@ -31,5 +29,13 @@ async function loadEmojiPolyfills() {
|
|||
}
|
||||
}
|
||||
|
||||
// Loads Vite's module preload polyfill for older browsers, but not in a Worker context.
|
||||
function loadVitePreloadPolyfill() {
|
||||
if (typeof document === 'undefined') return;
|
||||
// @ts-expect-error -- This is a virtual module provided by Vite.
|
||||
// eslint-disable-next-line import/extensions
|
||||
return import('vite/modulepreload-polyfill');
|
||||
}
|
||||
|
||||
// Null unless polyfill is needed.
|
||||
export let emojiRegexPolyfill: RegExp | null = null;
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ export function isProduction() {
|
|||
else return import.meta.env.PROD;
|
||||
}
|
||||
|
||||
export type Features = 'modern_emojis' | 'fasp' | 'http_message_signatures';
|
||||
export type Features = 'modern_emojis' | 'fasp';
|
||||
|
||||
export function isFeatureEnabled(feature: Features) {
|
||||
return initialState?.features.includes(feature) ?? false;
|
||||
|
|
|
|||
|
|
@ -524,3 +524,7 @@ a.sparkline {
|
|||
opacity: 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
kbd {
|
||||
background-color: color.change($ui-highlight-color, $alpha: 0.1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -488,6 +488,14 @@ body,
|
|||
}
|
||||
}
|
||||
|
||||
kbd {
|
||||
font-family: Courier, monospace;
|
||||
background-color: color.change($ui-secondary-color, $alpha: 0.1);
|
||||
padding: 4px;
|
||||
padding-bottom: 2px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.filters {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
|
@ -1955,60 +1963,77 @@ a.sparkline {
|
|||
box-sizing: border-box;
|
||||
min-height: 100%;
|
||||
|
||||
&.status--has-quote {
|
||||
.quote-inline {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.status__quote & {
|
||||
// Remove the border from the .status__card within .status__quote
|
||||
border: none;
|
||||
|
||||
.display-name__account {
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
.status__avatar,
|
||||
.status__avatar .account__avatar {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
.status__prepend {
|
||||
padding: 0 0 15px;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.status__content {
|
||||
padding-top: 0;
|
||||
> details {
|
||||
summary {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
background: var(--nested-card-background);
|
||||
color: var(--nested-card-text);
|
||||
border: var(--nested-card-border);
|
||||
border-radius: 8px;
|
||||
padding: 8px 13px;
|
||||
position: relative;
|
||||
font-size: 15px;
|
||||
line-height: 22px;
|
||||
cursor: pointer;
|
||||
|
||||
> details {
|
||||
summary {
|
||||
&::after {
|
||||
content: attr(data-show, 'Show more');
|
||||
margin-top: 8px;
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
background: var(--nested-card-background);
|
||||
color: var(--nested-card-text);
|
||||
border: var(--nested-card-border);
|
||||
border-radius: 8px;
|
||||
padding: 8px 13px;
|
||||
position: relative;
|
||||
font-size: 15px;
|
||||
line-height: 22px;
|
||||
line-height: 20px;
|
||||
color: $highlight-text-color;
|
||||
cursor: pointer;
|
||||
|
||||
&::after {
|
||||
content: attr(data-show, 'Show more');
|
||||
margin-top: 8px;
|
||||
display: block;
|
||||
font-size: 15px;
|
||||
line-height: 20px;
|
||||
color: $highlight-text-color;
|
||||
cursor: pointer;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
text-decoration: none;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
&::after {
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
}
|
||||
border: 0;
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
text-decoration: none;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
&[open] summary {
|
||||
margin-bottom: 16px;
|
||||
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
&::after {
|
||||
content: attr(data-hide, 'Hide post');
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&[open] summary {
|
||||
margin-bottom: 16px;
|
||||
|
||||
&::after {
|
||||
content: attr(data-hide, 'Hide post');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.preview-card {
|
||||
|
|
@ -2065,6 +2090,14 @@ a.sparkline {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.detailed-status__meta {
|
||||
.detailed-status__application,
|
||||
.detailed-status__datetime,
|
||||
.detailed-status__link {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.admin {
|
||||
|
|
|
|||
|
|
@ -1101,8 +1101,7 @@
|
|||
font-size: inherit;
|
||||
vertical-align: middle;
|
||||
object-fit: contain;
|
||||
margin: -0.2ex 0.15em 0.2ex;
|
||||
width: 16px;
|
||||
margin: -0.2ex 0.15em 0;
|
||||
height: 16px;
|
||||
|
||||
img {
|
||||
|
|
@ -1144,7 +1143,6 @@
|
|||
}
|
||||
|
||||
.emojione {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin: -3px 0 0;
|
||||
}
|
||||
|
|
@ -1367,7 +1365,6 @@
|
|||
overflow-y: auto;
|
||||
|
||||
.emojione {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin: -3px 0 0;
|
||||
}
|
||||
|
|
@ -1794,7 +1791,6 @@
|
|||
line-height: 24px;
|
||||
|
||||
.emojione {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin: -1px 0 0;
|
||||
}
|
||||
|
|
@ -7089,7 +7085,6 @@ a.status-card {
|
|||
line-height: 24px;
|
||||
|
||||
.emojione {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin: -1px 0 0;
|
||||
}
|
||||
|
|
@ -8421,7 +8416,6 @@ noscript {
|
|||
margin-bottom: 16px;
|
||||
|
||||
.emojione {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
}
|
||||
|
||||
|
|
@ -9368,19 +9362,13 @@ noscript {
|
|||
|
||||
&__shared {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
align-items: baseline;
|
||||
color: $darker-text-color;
|
||||
gap: 8px;
|
||||
justify-content: space-between;
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
|
||||
& > span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
&__pill {
|
||||
background: var(--surface-variant-background-color);
|
||||
border-radius: 4px;
|
||||
|
|
@ -9390,6 +9378,7 @@ noscript {
|
|||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
line-height: 16px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
&__author-link {
|
||||
|
|
|
|||
|
|
@ -152,6 +152,9 @@
|
|||
z-index: 1;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
display: inline-flex !important;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&:hover::before {
|
||||
|
|
|
|||
|
|
@ -224,6 +224,10 @@ code {
|
|||
list-style: disc;
|
||||
margin-inline-start: 18px;
|
||||
}
|
||||
|
||||
.icon {
|
||||
vertical-align: -3px;
|
||||
}
|
||||
}
|
||||
|
||||
ul.hint {
|
||||
|
|
@ -755,6 +759,12 @@ code {
|
|||
display: none;
|
||||
}
|
||||
|
||||
&.hidden-on-touch-devices {
|
||||
@media screen and (pointer: coarse) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
display: inline-block;
|
||||
color: $darker-text-color;
|
||||
|
|
|
|||
|
|
@ -356,7 +356,7 @@ a.table-action-link {
|
|||
|
||||
// Reset the status card to not have borders, background or padding when
|
||||
// inline in the table of statuses
|
||||
.status__card {
|
||||
.batch-table__row__content > .status__card {
|
||||
border: none;
|
||||
background: none;
|
||||
padding: 0;
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ class ActivityPub::Activity::QuoteRequest < ActivityPub::Activity
|
|||
return if non_matching_uri_hosts?(@account.uri, @json['id'])
|
||||
|
||||
quoted_status = status_from_uri(object_uri)
|
||||
return if quoted_status.nil? || !quoted_status.account.local? || !quoted_status.distributable?
|
||||
return if quoted_status.nil? || !quoted_status.account.local? || !quoted_status.distributable? || quoted_status.reblog?
|
||||
|
||||
if StatusPolicy.new(@account, quoted_status).quote?
|
||||
accept_quote_request!(quoted_status)
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ module Extractor
|
|||
end
|
||||
|
||||
def extract_hashtags_with_indices(text, _options = {})
|
||||
return [] unless text&.index('#')
|
||||
return [] unless text&.index(/[##]/)
|
||||
|
||||
possible_entries = []
|
||||
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ class SignedRequest
|
|||
'signature-input' => @request.headers['signature-input'],
|
||||
'signature' => @request.headers['signature'],
|
||||
})
|
||||
@message = Linzer::Message.new(@request.rack_request)
|
||||
end
|
||||
|
||||
def key_id
|
||||
|
|
@ -174,7 +175,7 @@ class SignedRequest
|
|||
def verified?(actor)
|
||||
key = Linzer.new_rsa_v1_5_sha256_public_key(actor.public_key)
|
||||
|
||||
Linzer.verify!(@request.rack_request, key:)
|
||||
Linzer.verify(key, @message, @signature)
|
||||
rescue Linzer::VerifyError
|
||||
false
|
||||
end
|
||||
|
|
@ -187,9 +188,9 @@ class SignedRequest
|
|||
|
||||
def verify_body_digest!
|
||||
return unless signed_headers.include?('content-digest')
|
||||
raise Mastodon::SignatureVerificationError, 'Content-Digest header missing' unless @request.headers.key?('content-digest')
|
||||
raise Mastodon::SignatureVerificationError, 'Content-Digest header missing' if @message.header('content-digest').nil?
|
||||
|
||||
digests = Starry.parse_dictionary(@request.headers['content-digest'])
|
||||
digests = Starry.parse_dictionary(@message.header('content-digest'))
|
||||
raise Mastodon::SignatureVerificationError, "Mastodon only supports SHA-256 in Content-Digest header. Offered algorithms: #{digests.keys.join(', ')}" unless digests.key?('sha-256')
|
||||
|
||||
received_digest = Base64.strict_encode64(digests['sha-256'].value)
|
||||
|
|
@ -237,7 +238,7 @@ class SignedRequest
|
|||
|
||||
def initialize(request)
|
||||
@signature =
|
||||
if Mastodon::Feature.http_message_signatures_enabled? && request.headers['signature-input'].present?
|
||||
if request.headers['signature-input'].present?
|
||||
HttpMessageSignature.new(request)
|
||||
else
|
||||
HttpSignature.new(request)
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ class StatusCacheHydrator
|
|||
payload[:filtered] = payload[:reblog][:filtered]
|
||||
payload[:favourited] = payload[:reblog][:favourited]
|
||||
payload[:reblogged] = payload[:reblog][:reblogged]
|
||||
payload[:quote_approval] = payload[:reblog][:quote_approval]
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -17,12 +17,16 @@ class Vacuum::MediaAttachmentsVacuum
|
|||
def vacuum_cached_files!
|
||||
media_attachments_past_retention_period.find_in_batches do |media_attachments|
|
||||
AttachmentBatch.new(MediaAttachment, media_attachments).clear
|
||||
rescue => e
|
||||
Rails.logger.error("Skipping batch while removing cached media attachments due to error: #{e}")
|
||||
end
|
||||
end
|
||||
|
||||
def vacuum_orphaned_records!
|
||||
orphaned_media_attachments.find_in_batches do |media_attachments|
|
||||
AttachmentBatch.new(MediaAttachment, media_attachments).delete
|
||||
rescue => e
|
||||
Rails.logger.error("Skipping batch while removing orphaned media attachments due to error: #{e}")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@ class Vacuum::PreviewCardsVacuum
|
|||
def vacuum_cached_images!
|
||||
preview_cards_past_retention_period.find_in_batches do |preview_card|
|
||||
AttachmentBatch.new(PreviewCard, preview_card).clear
|
||||
rescue => e
|
||||
Rails.logger.error("Skipping batch while removing cached preview cards due to error: #{e}")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ module Status::InteractionPolicyConcern
|
|||
|
||||
# Returns `:automatic`, `:manual`, `:unknown` or `:denied`
|
||||
def quote_policy_for_account(other_account, preloaded_relations: {})
|
||||
return :denied if other_account.nil? || direct_visibility?
|
||||
return :denied if other_account.nil? || direct_visibility? || reblog?
|
||||
|
||||
following_author = nil
|
||||
followed_by_author = nil
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ module User::HasSettings
|
|||
settings['web.reblog_modal']
|
||||
end
|
||||
|
||||
def setting_quick_boosting
|
||||
settings['web.quick_boosting']
|
||||
end
|
||||
|
||||
def setting_delete_modal
|
||||
settings['web.delete_modal']
|
||||
end
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ class Export
|
|||
def to_bookmarks_csv
|
||||
CSV.generate do |csv|
|
||||
account.bookmarks.includes(:status).reorder(id: :desc).each do |bookmark|
|
||||
csv << [ActivityPub::TagManager.instance.uri_for(bookmark.status)]
|
||||
csv << [ActivityPub::TagManager.instance.uri_for(bookmark.status)] if bookmark.status.present?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ class Form::AdminSettings
|
|||
thumbnail
|
||||
mascot
|
||||
trends
|
||||
trends_as_landing_page
|
||||
trendable_by_default
|
||||
show_domain_blocks
|
||||
show_domain_blocks_rationale
|
||||
|
|
@ -44,6 +43,7 @@ class Form::AdminSettings
|
|||
remote_live_feed_access
|
||||
local_topic_feed_access
|
||||
remote_topic_feed_access
|
||||
landing_page
|
||||
).freeze
|
||||
|
||||
INTEGER_KEYS = %i(
|
||||
|
|
@ -61,7 +61,6 @@ class Form::AdminSettings
|
|||
preview_sensitive_media
|
||||
profile_directory
|
||||
trends
|
||||
trends_as_landing_page
|
||||
trendable_by_default
|
||||
noindex
|
||||
require_invite_text
|
||||
|
|
@ -87,7 +86,8 @@ class Form::AdminSettings
|
|||
DESCRIPTION_LIMIT = 200
|
||||
DOMAIN_BLOCK_AUDIENCES = %w(disabled users all).freeze
|
||||
REGISTRATION_MODES = %w(open approved none).freeze
|
||||
FEED_ACCESS_MODES = %w(public authenticated).freeze
|
||||
FEED_ACCESS_MODES = %w(public authenticated disabled).freeze
|
||||
LANDING_PAGE = %w(trends about local_feed).freeze
|
||||
|
||||
attr_accessor(*KEYS)
|
||||
|
||||
|
|
@ -106,6 +106,7 @@ class Form::AdminSettings
|
|||
validates :site_short_description, length: { maximum: DESCRIPTION_LIMIT }, if: -> { defined?(@site_short_description) }
|
||||
validates :status_page_url, url: true, allow_blank: true
|
||||
validate :validate_site_uploads
|
||||
validates :landing_page, inclusion: { in: LANDING_PAGE }, if: -> { defined?(@landing_page) }
|
||||
|
||||
KEYS.each do |key|
|
||||
define_method(key) do
|
||||
|
|
|
|||
|
|
@ -15,18 +15,30 @@ class LinkFeed < PublicFeed
|
|||
# @param [Integer] min_id
|
||||
# @return [Array<Status>]
|
||||
def get(limit, max_id = nil, since_id = nil, min_id = nil)
|
||||
return [] if incompatible_feed_settings?
|
||||
|
||||
scope = public_scope
|
||||
|
||||
scope.merge!(discoverable)
|
||||
scope.merge!(attached_to_preview_card)
|
||||
scope.merge!(account_filters_scope) if account?
|
||||
scope.merge!(language_scope) if account&.chosen_languages.present?
|
||||
scope.merge!(local_only_scope) if local_only?
|
||||
scope.merge!(remote_only_scope) if remote_only?
|
||||
|
||||
scope.to_a_paginated_by_id(limit, max_id: max_id, since_id: since_id, min_id: min_id)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def local_feed_setting
|
||||
Setting.local_topic_feed_access
|
||||
end
|
||||
|
||||
def remote_feed_setting
|
||||
Setting.remote_topic_feed_access
|
||||
end
|
||||
|
||||
def attached_to_preview_card
|
||||
Status.joins(:preview_cards_status).where(preview_cards_status: { preview_card_id: @preview_card.id })
|
||||
end
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ class PublicFeed
|
|||
# @param [Integer] min_id
|
||||
# @return [Array<Status>]
|
||||
def get(limit, max_id = nil, since_id = nil, min_id = nil)
|
||||
return [] if incompatible_feed_settings?
|
||||
|
||||
scope = public_scope
|
||||
|
||||
scope.merge!(without_replies_scope) unless with_replies?
|
||||
|
|
@ -36,6 +38,21 @@ class PublicFeed
|
|||
|
||||
attr_reader :account, :options
|
||||
|
||||
def incompatible_feed_settings?
|
||||
(local_only? && !user_has_access_to_feed?(local_feed_setting)) || (remote_only? && !user_has_access_to_feed?(remote_feed_setting))
|
||||
end
|
||||
|
||||
def user_has_access_to_feed?(setting)
|
||||
case setting
|
||||
when 'public'
|
||||
true
|
||||
when 'authenticated'
|
||||
@account&.user&.functional?
|
||||
when 'disabled'
|
||||
@account&.user&.can?(:view_feeds)
|
||||
end
|
||||
end
|
||||
|
||||
def with_reblogs?
|
||||
options[:with_reblogs]
|
||||
end
|
||||
|
|
@ -44,12 +61,20 @@ class PublicFeed
|
|||
options[:with_replies]
|
||||
end
|
||||
|
||||
def local_feed_setting
|
||||
Setting.local_live_feed_access
|
||||
end
|
||||
|
||||
def remote_feed_setting
|
||||
Setting.remote_live_feed_access
|
||||
end
|
||||
|
||||
def local_only?
|
||||
options[:local] && !options[:remote]
|
||||
(options[:local] && !options[:remote]) || !user_has_access_to_feed?(remote_feed_setting)
|
||||
end
|
||||
|
||||
def remote_only?
|
||||
options[:remote] && !options[:local]
|
||||
(options[:remote] && !options[:local]) || !user_has_access_to_feed?(local_feed_setting)
|
||||
end
|
||||
|
||||
def account?
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ class Quote < ApplicationRecord
|
|||
validates :activity_uri, presence: true, if: -> { account.local? && quoted_account&.remote? }
|
||||
validates :approval_uri, absence: true, if: -> { quoted_account&.local? }
|
||||
validate :validate_visibility
|
||||
validate :validate_original_quoted_status
|
||||
|
||||
after_create_commit :increment_counter_caches!
|
||||
after_destroy_commit :decrement_counter_caches!
|
||||
|
|
@ -85,6 +86,10 @@ class Quote < ApplicationRecord
|
|||
errors.add(:quoted_status_id, :visibility_mismatch)
|
||||
end
|
||||
|
||||
def validate_original_quoted_status
|
||||
errors.add(:quoted_status_id, :reblog_unallowed) if quoted_status&.reblog?
|
||||
end
|
||||
|
||||
def set_activity_uri
|
||||
self.activity_uri = [ActivityPub::TagManager.instance.uri_for(account), '/quote_requests/', SecureRandom.uuid].join
|
||||
end
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class Tag < ApplicationRecord
|
|||
HASHTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)'
|
||||
HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASHTAG_LAST_SEQUENCE}".freeze
|
||||
|
||||
HASHTAG_RE = %r{(?<![=/)\p{Alnum}])#(#{HASHTAG_NAME_PAT})}
|
||||
HASHTAG_RE = %r{(?<![=/)\p{Alnum}])[#|#](#{HASHTAG_NAME_PAT})}
|
||||
HASHTAG_NAME_RE = /\A(#{HASHTAG_NAME_PAT})\z/i
|
||||
HASHTAG_INVALID_CHARS_RE = /[^[:alnum:]\u0E47-\u0E4E#{HASHTAG_SEPARATORS}]/
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user