diff --git a/.env.production.sample b/.env.production.sample index 8ea569fb0..9ff63c49e 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -88,21 +88,3 @@ S3_ALIAS_HOST=files.example.com # ----------------------- IP_RETENTION_PERIOD=31556952 SESSION_RETENTION_PERIOD=31556952 - -# Fetch All Replies Behavior -# -------------------------- - -# Period to wait between fetching replies (in minutes) -FETCH_REPLIES_COOLDOWN_MINUTES=15 - -# Period to wait after a post is first created before fetching its replies (in minutes) -FETCH_REPLIES_INITIAL_WAIT_MINUTES=5 - -# Max number of replies to fetch - total, recursively through a whole reply tree -FETCH_REPLIES_MAX_GLOBAL=1000 - -# Max number of replies to fetch - for a single post -FETCH_REPLIES_MAX_SINGLE=500 - -# Max number of replies Collection pages to fetch - total -FETCH_REPLIES_MAX_PAGES=500 diff --git a/.github/workflows/build-releases.yml b/.github/workflows/build-releases.yml index 7608535f0..245b25a93 100644 --- a/.github/workflows/build-releases.yml +++ b/.github/workflows/build-releases.yml @@ -21,7 +21,7 @@ jobs: # Only tag with latest when ran against the latest stable branch # This needs to be updated after each minor version release flavor: | - latest=${{ startsWith(github.ref, 'refs/tags/v4.4.') }} + latest=${{ startsWith(github.ref, 'refs/tags/v4.5.') }} tags: | type=pep440,pattern={{raw}} type=pep440,pattern=v{{major}}.{{minor}} @@ -39,7 +39,7 @@ jobs: # Only tag with latest when ran against the latest stable branch # This needs to be updated after each minor version release flavor: | - latest=${{ startsWith(github.ref, 'refs/tags/v4.4.') }} + latest=${{ startsWith(github.ref, 'refs/tags/v4.5.') }} tags: | type=pep440,pattern={{raw}} type=pep440,pattern=v{{major}}.{{minor}} diff --git a/.gitignore b/.gitignore index db63bc07f..4727d9ec2 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ /public/packs /public/packs-dev /public/packs-test +stats.html .env .env.production node_modules/ diff --git a/.nvmrc b/.nvmrc index 403f75d03..f666621e5 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.20 +24.10 diff --git a/CHANGELOG.md b/CHANGELOG.md index f63450542..f30b502ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,45 +2,61 @@ All notable changes to this project will be documented in this file. -## [4.5.0] - UNRELEASED +## [4.5.0] - 2025-11-06 ### 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, #36461, #36516 and #36528 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, #36528, #36549, #36550, #36559, #36693, #36704, #36690, #36689, #36696, #36721, #36695 and #36736 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, #36239, #36484 and #36481 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, #36481, #36583, #36627 and #36547 by @ClearlyClaire, @diondiondion, @Gargron and @renchap) - **Add ability to block words in usernames** (#35407, #35655, and #35806 by @ClearlyClaire and @Gargron) +- Add ability to individually disable local or remote feeds for visitors or logged-in users `disabled` value to server setting for live and topic feeds, as well as user permission to bypass that (#36338, #36467, #36497, #36563, #36577, #36585, #36607 and #36703 by @ClearlyClaire)\ + This splits the `timeline_preview` setting into four more granular settings controlling live feeds and topic (hashtag, trending link) feeds.\ + The setting for local topic feeds has 2 values: `public` and `authenticated`. Every other setting has 3 values: `public`, `authenticated`, `disabled`.\ + When `disabled`, users with the “View live and topic feeds” will still be able to view them. - 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 a new server setting to choose the server landing page (#36588 and #36602 by @ClearlyClaire and @renchap) +- Add support for `Update` activities on converted object types (#36322 by @ClearlyClaire) - 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) +- Add default visualizer for audio upload without poster (#36734 by @ChaosExAnima) - Add Traditional Mongolian to posting languages (#36196 by @shimon1024) - Add example post with manual quote approval policy to `dev:populate_sample_data` (#36099 by @ClearlyClaire) - Add server-side support for handling posts with a quote policy allowing followers to quote (#36093 and #36127 by @ClearlyClaire) - Add schema.org markup to SEO-enabled posts (#36075 by @Gargron) - Add migration to fill unset default quote policy based on default post privacy (#36041 by @ClearlyClaire) +- Add “Posting defaults” setting page, moving existing settings from “Other” (#35896, #36033, #35966, #35969, and #36084 by @ClearlyClaire and @diondiondion) +- Added emoji from Twemoji v16 (#36501 and #36530 by @ChaosExAnima) +- Add 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, #36532, #36603, #36409, #36638 and #36750 by @ChaosExAnima, @ClearlyClaire and @braddunbar)\ + This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places. - Add support for exposing conversation context for new public conversations according to FEP-7888 (#35959 and #36064 by @ClearlyClaire and @jesseplusplus) - Add digest re-check before removing followers in synchronization mechanism (#34273 by @ClearlyClaire) -- Add “Posting defaults” setting page, moving existing settings from “Other” (#35896, #36033, #35966, #35969, and #36084 by @ClearlyClaire and @diondiondion) - Add support for displaying Valkey version on admin dashboard (#35785 by @ykzts) - 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) -- 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 blocked and muted quoted users (#36619 by @ClearlyClaire)\ + This adds `blocked_account`, `blocked_domain` and `muted_account` values to the `state` attribute of `Quote` and `ShallowQuote` REST API entities. +- Change submitting an empty post to show an error rather than failing silently (#36650 by @diondiondion) +- Change "Privacy and reach" settings from "Public profile" to their own top-level category (#27294 by @ChaelCodes) +- Change number of times quote verification is retried to better deal with temporary failures (#36698 by @ClearlyClaire) - Change display of content warnings in Admin UI (#35935 by @ThisIsMissEm) +- Change styling of column banners (#36531 by @ClearlyClaire) +- Change recommended Node version to 24 (LTS) (#36539 by @renchap) +- Change min. characters required for logged-out account search from 5 to 3 (#36487 by @Gargron) +- Change browser target to Vite legacy plugin defaults (#36611 by @larouxn) - 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, #36467 and #36497 by @ClearlyClaire) +- Change support for RFC9421 HTTP signatures to be enabled unconditionally (#36610 by @oneiros) - 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) @@ -48,7 +64,7 @@ All notable changes to this project will be documented in this file. - Change description of “Quiet public” (#36032 by @ClearlyClaire) - Change “Boost with original visibility” to “Share again with your followers” (#36035 by @ClearlyClaire) - Change handling of push subscriptions to automatically delete invalid ones on delivery (#35987 by @ThisIsMissEm) -- Change design of quote posts in web UI (#35584 and #35834 by @ClearlyClaire and @Gargron) +- Change design of quote posts in web UI (#35584 and #35834 by @Gargron) - 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) @@ -59,6 +75,16 @@ All notable changes to this project will be documented in this file. - 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 initially selected language in Rules panel, hide selector when no alternative translations exist (#36672 by @diondiondion) +- Fix URL comparison for mentions in case of empty path (#36613 and #36626 by @ClearlyClaire) +- Fix hashtags not being picked up when full-width hash sign is used (#36103 and #36625 by @ClearlyClaire and @Gargron) +- Fix layout of severed relationships when purged events are listed (#36593 by @mejofi) +- Fix Skeleton placeholders being animated when setting to reduce animations is enabled (#36716 by @ClearlyClaire) +- Fix vacuum tasks being interrupted by a single batch failure (#36606 by @Gargron) +- Fix handling of unreachable network error for search services (#36587 by @mjankowski) +- Fix bookmarks export when a bookmarked status is soft-deleted (#36576 by @ClearlyClaire) +- Fix text overflow alignment for long author names in News (#36562 by @diondiondion) +- Fix discovery preamble missing word in admin settings (#36560 by @belatedly) - Fix overflow handling of `.more-from-author` (#36310 by @edent) - Fix unfortunate action button wrapping in admin area (#36247 by @diondiondion) - Fix translate button width in Safari (#36164 and #36216 by @diondiondion) @@ -81,6 +107,10 @@ 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) +### Removed + +- Remove support for PostgreSQL 13 (#36540 by @renchap) + ## [4.4.8] - 2025-10-21 ### Security diff --git a/Dockerfile b/Dockerfile index e457ae362..c64d52991 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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) @@ -183,7 +183,7 @@ FROM build AS libvips # libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"] # renovate: datasource=github-releases depName=libvips packageName=libvips/libvips -ARG VIPS_VERSION=8.17.2 +ARG VIPS_VERSION=8.17.3 # libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"] ARG VIPS_URL=https://github.com/libvips/libvips/releases/download diff --git a/Gemfile b/Gemfile index a12e71692..7d219344b 100644 --- a/Gemfile +++ b/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 diff --git a/Gemfile.lock b/Gemfile.lock index f8d6f3055..417b89ffa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -90,7 +90,7 @@ GEM public_suffix (>= 2.0.2, < 7.0) aes_key_wrap (1.1.0) android_key_attestation (0.3.0) - annotaterb (4.19.0) + annotaterb (4.20.0) activerecord (>= 6.0.0) activesupport (>= 6.0.0) ast (2.4.3) @@ -116,7 +116,7 @@ GEM base64 (0.3.0) bcp47_spec (0.2.1) bcrypt (3.1.20) - benchmark (0.4.1) + benchmark (0.5.0) better_errors (2.10.1) erubi (>= 1.0.0) rack (>= 0.9.0) @@ -128,7 +128,7 @@ GEM blurhash (0.1.8) bootsnap (1.18.6) msgpack (~> 1.2) - brakeman (7.0.2) + brakeman (7.1.1) racc browser (6.2.0) builder (3.3.0) @@ -168,7 +168,7 @@ GEM cose (1.3.1) cbor (~> 0.5.9) openssl-signature_algorithm (~> 1.0) - crack (1.0.0) + crack (1.0.1) bigdecimal rexml crass (1.0.6) @@ -190,10 +190,10 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-two-factor (6.1.0) - activesupport (>= 7.0, < 8.1) + devise-two-factor (6.2.0) + activesupport (>= 7.0, < 8.2) devise (~> 4.0) - railties (>= 7.0, < 8.1) + railties (>= 7.0, < 8.2) rotp (~> 6.0) devise_pam_authenticatable2 (9.2.0) devise (>= 4.0.0) @@ -224,7 +224,7 @@ GEM mail (~> 2.7) email_validator (2.2.4) activemodel - erb (5.0.2) + erb (5.1.3) erubi (1.13.1) et-orbi (1.4.0) tzinfo @@ -337,7 +337,7 @@ GEM activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.8.1) - irb (1.15.2) + irb (1.15.3) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) @@ -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 @@ -442,7 +443,7 @@ GEM mime-types-data (3.2025.0924) mini_mime (1.1.5) mini_portile2 (2.8.9) - minitest (5.25.5) + minitest (5.26.0) msgpack (1.8.0) multi_json (1.17.0) mutex_m (0.3.0) @@ -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) @@ -620,7 +621,7 @@ GEM activesupport (>= 3.0.0) raabro (1.4.0) racc (1.8.1) - rack (3.2.3) + rack (3.2.4) rack-attack (6.8.0) rack (>= 1.0, < 4) rack-cors (3.0.0) @@ -690,7 +691,7 @@ GEM readline (~> 0.0) rdf-normalize (0.7.0) rdf (~> 3.3) - rdoc (6.15.0) + rdoc (6.15.1) erb psych (>= 4.0.0) tsort @@ -705,9 +706,9 @@ GEM io-console (~> 0.5) request_store (1.7.0) rack (>= 1.4) - responders (3.1.1) - actionpack (>= 5.2) - railties (>= 5.2) + responders (3.2.0) + actionpack (>= 7.0) + railties (>= 7.0) rexml (3.4.4) rotp (6.3.0) rouge (4.6.1) @@ -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) @@ -790,7 +791,7 @@ GEM ruby-vips (2.2.5) ffi (~> 1.12) logger - rubyzip (3.2.0) + rubyzip (3.2.2) rufus-scheduler (3.9.2) fugit (~> 1.1, >= 1.11.1) safety_net_attestation (0.5.0) @@ -804,7 +805,7 @@ GEM securerandom (0.4.1) shoulda-matchers (6.5.0) activesupport (>= 5.2.0) - sidekiq (8.0.8) + sidekiq (8.0.9) connection_pool (>= 2.5.0) json (>= 2.9.0) logger (>= 1.6.2) @@ -821,9 +822,9 @@ GEM thor (>= 1.0, < 3.0) simple-navigation (4.4.0) activesupport (>= 2.3.2) - simple_form (5.3.1) - actionpack (>= 5.2) - activemodel (>= 5.2) + simple_form (5.4.0) + actionpack (>= 7.0) + activemodel (>= 7.0) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) @@ -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) @@ -910,7 +911,7 @@ GEM activesupport faraday (~> 2.0) faraday-follow_redirects - webmock (3.25.1) + webmock (3.26.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -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 diff --git a/README.md b/README.md index 575e7e51a..58d457b58 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Click below to **learn more** in a video: ### Requirements - **Ruby** 3.2+ -- **PostgreSQL** 13+ +- **PostgreSQL** 14+ - **Redis** 7.0+ - **Node.js** 20+ diff --git a/SECURITY.md b/SECURITY.md index 19f431fac..385c94651 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -16,6 +16,6 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through | Version | Supported | | ------- | ---------------- | | 4.4.x | Yes | -| 4.3.x | Yes | +| 4.3.x | Until 2026-05-06 | | 4.2.x | Until 2026-01-08 | | < 4.2 | No | diff --git a/app/controllers/activitypub/quote_authorizations_controller.rb b/app/controllers/activitypub/quote_authorizations_controller.rb index f2f5313e1..f4a150555 100644 --- a/app/controllers/activitypub/quote_authorizations_controller.rb +++ b/app/controllers/activitypub/quote_authorizations_controller.rb @@ -9,7 +9,7 @@ class ActivityPub::QuoteAuthorizationsController < ActivityPub::BaseController before_action :set_quote_authorization def show - expires_in 30.seconds, public: true if @quote.status.distributable? && public_fetch_mode? + expires_in 30.seconds, public: true if @quote.quoted_status.distributable? && public_fetch_mode? render json: @quote, serializer: ActivityPub::QuoteAuthorizationSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' end @@ -23,7 +23,7 @@ class ActivityPub::QuoteAuthorizationsController < ActivityPub::BaseController @quote = Quote.accepted.where(quoted_account: @account).find(params[:id]) return not_found unless @quote.status.present? && @quote.quoted_status.present? - authorize @quote.status, :show? + authorize @quote.quoted_status, :show? rescue Mastodon::NotPermittedError not_found end diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 6c4e7619b..0627acc30 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -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 diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index fea3eb0d7..dd1956446 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -70,7 +70,7 @@ function loaded() { }; document.querySelectorAll('.emojify').forEach((content) => { - content.innerHTML = emojify(content.innerHTML, {}, true); // Force emojify as public doesn't load the new emoji system. + content.innerHTML = emojify(content.innerHTML); }); document diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index ccb69f0a3..232c4b1c1 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -5,6 +5,7 @@ import { throttle } from 'lodash'; import api from 'mastodon/api'; import { browserHistory } from 'mastodon/components/router'; +import { countableText } from 'mastodon/features/compose/util/counter'; import { search as emojiSearch } from 'mastodon/features/emoji/emoji_mart_search_light'; import { tagHistory } from 'mastodon/settings'; @@ -55,7 +56,6 @@ export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT'; export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; -export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE'; export const COMPOSE_LANGUAGE_CHANGE = 'COMPOSE_LANGUAGE_CHANGE'; @@ -88,6 +88,7 @@ const messages = defineMessages({ open: { id: 'compose.published.open', defaultMessage: 'Open' }, published: { id: 'compose.published.body', defaultMessage: 'Post published.' }, saved: { id: 'compose.saved.body', defaultMessage: 'Post saved.' }, + blankPostError: { id: 'compose.error.blank_post', defaultMessage: 'Post can\'t be blank.' }, }); export const ensureComposeIsVisible = (getState) => { @@ -197,7 +198,15 @@ export function submitCompose(successCallback) { const hasQuote = !!getState().getIn(['compose', 'quoted_status_id']); const spoiler_text = getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : ''; - if (!(status?.length || media.size !== 0 || (hasQuote && spoiler_text?.length))) { + const fulltext = `${spoiler_text ?? ''}${countableText(status ?? '')}`; + const hasText = fulltext.trim().length > 0; + + if (!(hasText || media.size !== 0 || (hasQuote && spoiler_text?.length))) { + dispatch(showAlert({ + message: messages.blankPostError, + })); + dispatch(focusCompose()); + return; } @@ -622,6 +631,7 @@ export function fetchComposeSuggestions(token) { fetchComposeSuggestionsEmojis(dispatch, getState, token); break; case '#': + case '#': fetchComposeSuggestionsTags(dispatch, getState, token); break; default: @@ -663,11 +673,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 +737,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); @@ -783,13 +793,6 @@ export function changeComposeSpoilerText(text) { }; } -export function changeComposeVisibility(value) { - return { - type: COMPOSE_VISIBILITY_CHANGE, - value, - }; -} - export function insertEmojiCompose(position, emoji, needsSpace) { return { type: COMPOSE_EMOJI_INSERT, diff --git a/app/javascript/mastodon/actions/compose_typed.ts b/app/javascript/mastodon/actions/compose_typed.ts index 0f9bf5cfb..6b38b25c2 100644 --- a/app/javascript/mastodon/actions/compose_typed.ts +++ b/app/javascript/mastodon/actions/compose_typed.ts @@ -13,10 +13,11 @@ import { } from 'mastodon/store/typed_functions'; import type { ApiQuotePolicy } from '../api_types/quotes'; -import type { Status } from '../models/status'; +import type { Status, StatusVisibility } from '../models/status'; +import type { RootState } from '../store'; import { showAlert } from './alerts'; -import { focusCompose } from './compose'; +import { changeCompose, focusCompose } from './compose'; import { importFetchedStatuses } from './importer'; import { openModal } from './modal'; @@ -41,6 +42,10 @@ const messages = defineMessages({ id: 'quote_error.unauthorized', defaultMessage: 'You are not authorized to quote this post.', }, + quoteErrorPrivateMention: { + id: 'quote_error.private_mentions', + defaultMessage: 'Quoting is not allowed with direct mentions.', + }, }); type SimulatedMediaAttachmentJSON = ApiMediaAttachmentJSON & { @@ -67,6 +72,39 @@ const simulateModifiedApiResponse = ( return data; }; +export const changeComposeVisibility = createAppThunk( + 'compose/visibility_change', + (visibility: StatusVisibility, { dispatch, getState }) => { + if (visibility !== 'direct') { + return visibility; + } + + const state = getState(); + const quotedStatusId = state.compose.get('quoted_status_id') as + | string + | null; + if (!quotedStatusId) { + return visibility; + } + + // Remove the quoted status + dispatch(quoteComposeCancel()); + const quotedStatus = state.statuses.get(quotedStatusId) as Status | null; + if (!quotedStatus) { + return visibility; + } + + // Append the quoted status URL to the compose text + const url = quotedStatus.get('url') as string; + const text = state.compose.get('text') as string; + if (!text.includes(url)) { + const newText = text.trim() ? `${text}\n\n${url}` : url; + dispatch(changeCompose(newText)); + } + return visibility; + }, +); + export const changeUploadCompose = createDataLoadingThunk( 'compose/changeUpload', async ( @@ -130,6 +168,8 @@ export const quoteComposeByStatus = createAppThunk( if (composeState.get('id')) { dispatch(showAlert({ message: messages.quoteErrorEdit })); + } else if (composeState.get('privacy') === 'direct') { + dispatch(showAlert({ message: messages.quoteErrorPrivateMention })); } else if (composeState.get('poll')) { dispatch(showAlert({ message: messages.quoteErrorPoll })); } else if ( @@ -173,6 +213,17 @@ export const quoteComposeById = createAppThunk( }, ); +const composeStateForbidsLink = (composeState: RootState['compose']) => { + return ( + composeState.get('quoted_status_id') || + composeState.get('is_submitting') || + composeState.get('poll') || + composeState.get('is_uploading') || + composeState.get('id') || + composeState.get('privacy') === 'direct' + ); +}; + export const pasteLinkCompose = createDataLoadingThunk( 'compose/pasteLink', async ({ url }: { url: string }) => { @@ -183,15 +234,12 @@ export const pasteLinkCompose = createDataLoadingThunk( limit: 2, }); }, - (data, { dispatch, getState }) => { + (data, { dispatch, getState, requestId }) => { const composeState = getState().compose; if ( - composeState.get('quoted_status_id') || - composeState.get('is_submitting') || - composeState.get('poll') || - composeState.get('is_uploading') || - composeState.get('id') + composeStateForbidsLink(composeState) || + composeState.get('fetching_link') !== requestId // Request has been cancelled ) return; @@ -207,6 +255,17 @@ export const pasteLinkCompose = createDataLoadingThunk( dispatch(quoteComposeById(data.statuses[0].id)); } }, + { + useLoadingBar: false, + condition: (_, { getState }) => + !getState().compose.get('fetching_link') && + !composeStateForbidsLink(getState().compose), + }, +); + +// Ideally this would cancel the action and the HTTP request, but this is good enough +export const cancelPasteLinkCompose = createAction( + 'compose/cancelPasteLinkCompose', ); export const quoteComposeCancel = createAction('compose/quoteComposeCancel'); diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js index 772337980..32c3d7666 100644 --- a/app/javascript/mastodon/actions/importer/normalizer.js +++ b/app/javascript/mastodon/actions/importer/normalizer.js @@ -1,8 +1,5 @@ import escapeTextContentForBrowser from 'escape-html'; -import { makeEmojiMap } from 'mastodon/models/custom_emoji'; - -import emojify from '../../features/emoji/emoji'; import { expandSpoilers } from '../../initial_state'; const domParser = new DOMParser(); @@ -88,11 +85,10 @@ export function normalizeStatus(status, normalOldStatus) { const spoilerText = normalStatus.spoiler_text || ''; const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(//g, '\n').replace(/<\/p>

/g, '\n\n'); - const emojiMap = makeEmojiMap(normalStatus.emojis); normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent; - normalStatus.contentHtml = emojify(normalStatus.content, emojiMap); - normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(spoilerText), emojiMap); + normalStatus.contentHtml = normalStatus.content; + normalStatus.spoilerHtml = escapeTextContentForBrowser(spoilerText); normalStatus.hidden = expandSpoilers ? false : spoilerText.length > 0 || normalStatus.sensitive; // Remove quote fallback link from the DOM so it doesn't mess with paragraph margins @@ -128,14 +124,12 @@ export function normalizeStatus(status, normalOldStatus) { } export function normalizeStatusTranslation(translation, status) { - const emojiMap = makeEmojiMap(status.get('emojis').toJS()); - const normalTranslation = { detected_source_language: translation.detected_source_language, language: translation.language, provider: translation.provider, - contentHtml: emojify(translation.content, emojiMap), - spoilerHtml: emojify(escapeTextContentForBrowser(translation.spoiler_text), emojiMap), + contentHtml: translation.content, + spoilerHtml: escapeTextContentForBrowser(translation.spoiler_text), spoiler_text: translation.spoiler_text, }; @@ -149,9 +143,8 @@ export function normalizeStatusTranslation(translation, status) { export function normalizeAnnouncement(announcement) { const normalAnnouncement = { ...announcement }; - const emojiMap = makeEmojiMap(normalAnnouncement.emojis); - normalAnnouncement.contentHtml = emojify(normalAnnouncement.content, emojiMap); + normalAnnouncement.contentHtml = normalAnnouncement.content; return normalAnnouncement; } diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index 478e0cae4..4299bad5c 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -32,13 +32,20 @@ import { const randomUpTo = max => Math.floor(Math.random() * Math.floor(max)); +/** + * @typedef {import('mastodon/store').AppDispatch} Dispatch + * @typedef {import('mastodon/store').GetState} GetState + * @typedef {import('redux').UnknownAction} UnknownAction + * @typedef {function(Dispatch, GetState): Promise} FallbackFunction + */ + /** * @param {string} timelineId * @param {string} channelName * @param {Object.} params * @param {Object} options - * @param {function(Function, Function): Promise} [options.fallback] - * @param {function(): void} [options.fillGaps] + * @param {FallbackFunction} [options.fallback] + * @param {function(): UnknownAction} [options.fillGaps] * @param {function(object): boolean} [options.accept] * @returns {function(): void} */ @@ -46,13 +53,14 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti const { messages } = getLocale(); return connectStream(channelName, params, (dispatch, getState) => { + // @ts-ignore const locale = getState().getIn(['meta', 'locale']); // @ts-expect-error let pollingId; /** - * @param {function(Function, Function): Promise} fallback + * @param {FallbackFunction} fallback */ const useFallback = async fallback => { @@ -132,7 +140,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti }; /** - * @param {Function} dispatch + * @param {Dispatch} dispatch */ async function refreshHomeTimelineAndNotification(dispatch) { await dispatch(expandHomeTimeline({ maxId: undefined })); @@ -151,7 +159,11 @@ async function refreshHomeTimelineAndNotification(dispatch) { * @returns {function(): void} */ export const connectUserStream = () => - connectTimelineStream('home', 'user', {}, { fallback: refreshHomeTimelineAndNotification, fillGaps: fillHomeTimelineGaps }); + connectTimelineStream('home', 'user', {}, { + fallback: refreshHomeTimelineAndNotification, + // @ts-expect-error + fillGaps: fillHomeTimelineGaps + }); /** * @param {Object} options @@ -159,7 +171,10 @@ export const connectUserStream = () => * @returns {function(): void} */ export const connectCommunityStream = ({ onlyMedia } = {}) => - connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`, {}, { fillGaps: () => (fillCommunityTimelineGaps({ onlyMedia })) }); + connectTimelineStream(`community${onlyMedia ? ':media' : ''}`, `public:local${onlyMedia ? ':media' : ''}`, {}, { + // @ts-expect-error + fillGaps: () => (fillCommunityTimelineGaps({ onlyMedia })) + }); /** * @param {Object} options @@ -168,7 +183,10 @@ export const connectCommunityStream = ({ onlyMedia } = {}) => * @returns {function(): void} */ export const connectPublicStream = ({ onlyMedia, onlyRemote } = {}) => - connectTimelineStream(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, {}, { fillGaps: () => fillPublicTimelineGaps({ onlyMedia, onlyRemote }) }); + connectTimelineStream(`public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, `public${onlyRemote ? ':remote' : ''}${onlyMedia ? ':media' : ''}`, {}, { + // @ts-expect-error + fillGaps: () => fillPublicTimelineGaps({ onlyMedia, onlyRemote }) + }); /** * @param {string} columnId @@ -191,4 +209,7 @@ export const connectDirectStream = () => * @returns {function(): void} */ export const connectListStream = listId => - connectTimelineStream(`list:${listId}`, 'list', { list: listId }, { fillGaps: () => fillListTimelineGaps(listId) }); + connectTimelineStream(`list:${listId}`, 'list', { list: listId }, { + // @ts-expect-error + fillGaps: () => fillListTimelineGaps(listId) + }); diff --git a/app/javascript/mastodon/components/account_bio.tsx b/app/javascript/mastodon/components/account_bio.tsx index e87ae654f..6d4ab1ddd 100644 --- a/app/javascript/mastodon/components/account_bio.tsx +++ b/app/javascript/mastodon/components/account_bio.tsx @@ -1,11 +1,6 @@ -import { useCallback } from 'react'; - import classNames from 'classnames'; -import { useLinks } from 'mastodon/hooks/useLinks'; - import { useAppSelector } from '../store'; -import { isModernEmojiEnabled } from '../utils/environment'; import { EmojiHTML } from './emoji/html'; import { useElementHandledLink } from './status/handled_link'; @@ -21,22 +16,6 @@ export const AccountBio: React.FC = ({ accountId, showDropdown = false, }) => { - const handleClick = useLinks(showDropdown); - const handleNodeChange = useCallback( - (node: HTMLDivElement | null) => { - if ( - !showDropdown || - !node || - node.childNodes.length === 0 || - isModernEmojiEnabled() - ) { - return; - } - addDropdownToHashtags(node, accountId); - }, - [showDropdown, accountId], - ); - const htmlHandlers = useElementHandledLink({ hashtagAccountId: showDropdown ? accountId : undefined, }); @@ -62,30 +41,7 @@ export const AccountBio: React.FC = ({ htmlString={note} extraEmojis={extraEmojis} className={classNames(className, 'translate')} - onClickCapture={handleClick} - ref={handleNodeChange} {...htmlHandlers} /> ); }; - -function addDropdownToHashtags(node: HTMLElement | null, accountId: string) { - if (!node) { - return; - } - for (const childNode of node.childNodes) { - if (!(childNode instanceof HTMLElement)) { - continue; - } - if ( - childNode instanceof HTMLAnchorElement && - (childNode.classList.contains('hashtag') || - childNode.innerText.startsWith('#')) && - !childNode.dataset.menuHashtag - ) { - childNode.dataset.menuHashtag = accountId; - } else if (childNode.childNodes.length > 0) { - addDropdownToHashtags(childNode, accountId); - } - } -} diff --git a/app/javascript/mastodon/components/autosuggest_input.jsx b/app/javascript/mastodon/components/autosuggest_input.jsx index f707a18e1..267c04421 100644 --- a/app/javascript/mastodon/components/autosuggest_input.jsx +++ b/app/javascript/mastodon/components/autosuggest_input.jsx @@ -61,7 +61,7 @@ export default class AutosuggestInput extends ImmutablePureComponent { static defaultProps = { autoFocus: true, - searchTokens: ['@', ':', '#'], + searchTokens: ['@', '@', ':', '#', '#'], }; state = { diff --git a/app/javascript/mastodon/components/autosuggest_textarea.jsx b/app/javascript/mastodon/components/autosuggest_textarea.jsx index 68cf9e17f..137bad9b7 100644 --- a/app/javascript/mastodon/components/autosuggest_textarea.jsx +++ b/app/javascript/mastodon/components/autosuggest_textarea.jsx @@ -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]; } diff --git a/app/javascript/mastodon/components/display_name/display_name.stories.tsx b/app/javascript/mastodon/components/display_name/display_name.stories.tsx index d546fdd13..6f1819a55 100644 --- a/app/javascript/mastodon/components/display_name/display_name.stories.tsx +++ b/app/javascript/mastodon/components/display_name/display_name.stories.tsx @@ -74,6 +74,6 @@ export const Linked: Story = { acct: username, }) : undefined; - return ; + return ; }, }; diff --git a/app/javascript/mastodon/components/display_name/no-domain.tsx b/app/javascript/mastodon/components/display_name/no-domain.tsx index ee6e84050..530e0a08e 100644 --- a/app/javascript/mastodon/components/display_name/no-domain.tsx +++ b/app/javascript/mastodon/components/display_name/no-domain.tsx @@ -9,9 +9,8 @@ import { Skeleton } from '../skeleton'; import type { DisplayNameProps } from './index'; export const DisplayNameWithoutDomain: FC< - Omit & - ComponentPropsWithoutRef<'span'> -> = ({ account, className, children, ...props }) => { + Omit & ComponentPropsWithoutRef<'span'> +> = ({ account, className, children, localDomain: _, ...props }) => { return ( & - ComponentPropsWithoutRef<'span'> -> = ({ account, ...props }) => { + Omit & ComponentPropsWithoutRef<'span'> +> = ({ account, localDomain: _, ...props }) => { if (!account) { return null; } diff --git a/app/javascript/mastodon/components/emoji/context.tsx b/app/javascript/mastodon/components/emoji/context.tsx index 730ae743e..3682b9414 100644 --- a/app/javascript/mastodon/components/emoji/context.tsx +++ b/app/javascript/mastodon/components/emoji/context.tsx @@ -7,8 +7,6 @@ import { useState, } from 'react'; -import classNames from 'classnames'; - import { cleanExtraEmojis } from '@/mastodon/features/emoji/normalize'; import { autoPlayGif } from '@/mastodon/initial_state'; import { polymorphicForwardRef } from '@/types/polymorphic'; @@ -65,11 +63,7 @@ export const AnimateEmojiProvider = polymorphicForwardRef< const parentContext = useContext(AnimateEmojiContext); if (parentContext !== null) { return ( - + {children} ); @@ -78,7 +72,7 @@ export const AnimateEmojiProvider = polymorphicForwardRef< return ( ( +export const EmojiHTML = polymorphicForwardRef<'div', EmojiHTMLProps>( ( { extraEmojis, @@ -59,32 +56,4 @@ export const ModernEmojiHTML = polymorphicForwardRef<'div', EmojiHTMLProps>( ); }, ); -ModernEmojiHTML.displayName = 'ModernEmojiHTML'; - -export const LegacyEmojiHTML = polymorphicForwardRef<'div', EmojiHTMLProps>( - (props, ref) => { - const { - as: asElement, - htmlString, - extraEmojis, - className, - onElement, - onAttribute, - ...rest - } = props; - const Wrapper = asElement ?? 'div'; - return ( - - ); - }, -); -LegacyEmojiHTML.displayName = 'LegacyEmojiHTML'; - -export const EmojiHTML = isModernEmojiEnabled() - ? ModernEmojiHTML - : LegacyEmojiHTML; +EmojiHTML.displayName = 'EmojiHTML'; diff --git a/app/javascript/mastodon/components/hover_card_account.tsx b/app/javascript/mastodon/components/hover_card_account.tsx index 471d48841..b51af40e9 100644 --- a/app/javascript/mastodon/components/hover_card_account.tsx +++ b/app/javascript/mastodon/components/hover_card_account.tsx @@ -23,8 +23,6 @@ import { domain } from 'mastodon/initial_state'; import { getAccountHidden } from 'mastodon/selectors/accounts'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; -import { useLinks } from '../hooks/useLinks'; - export const HoverCardAccount = forwardRef< HTMLDivElement, { accountId?: string } @@ -66,8 +64,6 @@ export const HoverCardAccount = forwardRef< !isMutual && !isFollower; - const handleClick = useLinks(); - return (

-
+
onParentElement?.(...args) ?? onLinkElement(...args), [onLinkElement, onParentElement], ); - return ; + return ; }, ); diff --git a/app/javascript/mastodon/components/poll.tsx b/app/javascript/mastodon/components/poll.tsx index a9229e6ee..98954fc2d 100644 --- a/app/javascript/mastodon/components/poll.tsx +++ b/app/javascript/mastodon/components/poll.tsx @@ -13,9 +13,7 @@ import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import { openModal } from 'mastodon/actions/modal'; import { fetchPoll, vote } from 'mastodon/actions/polls'; import { Icon } from 'mastodon/components/icon'; -import emojify from 'mastodon/features/emoji/emoji'; import { useIdentity } from 'mastodon/identity_context'; -import { makeEmojiMap } from 'mastodon/models/custom_emoji'; import type * as Model from 'mastodon/models/poll'; import type { Status } from 'mastodon/models/status'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; @@ -235,12 +233,11 @@ const PollOption: React.FC = (props) => { let titleHtml = option.translation?.titleHtml ?? option.titleHtml; if (!titleHtml) { - const emojiMap = makeEmojiMap(poll.emojis); - titleHtml = emojify(escapeTextContentForBrowser(title), emojiMap); + titleHtml = escapeTextContentForBrowser(title); } return titleHtml; - }, [option, poll, title]); + }, [option, title]); // Handlers const handleOptionChange = useCallback(() => { diff --git a/app/javascript/mastodon/components/status/handled_link.tsx b/app/javascript/mastodon/components/status/handled_link.tsx index 3c8973992..be816e985 100644 --- a/app/javascript/mastodon/components/status/handled_link.tsx +++ b/app/javascript/mastodon/components/status/handled_link.tsx @@ -26,7 +26,12 @@ export const HandledLink: FC> = ({ ...props }) => { // Handle hashtags - if (text.startsWith('#') || prevText?.endsWith('#')) { + if ( + text.startsWith('#') || + prevText?.endsWith('#') || + text.startsWith('#') || + prevText?.endsWith('#') + ) { const hashtag = text.slice(1).trim(); return ( > = ({ {children} ); - } else if ((text.startsWith('@') || prevText?.endsWith('@')) && mention) { + } else if (mention) { // Handle mentions return ( ({ languages: 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.pathname === url2.pathname && url1.search === url2.search; + } catch { + return false; + } +}; + class StatusContent extends PureComponent { static propTypes = { identity: identityContextPropShape, @@ -108,41 +117,6 @@ class StatusContent extends PureComponent { onCollapsedToggle(collapsed); } - - // Exit if modern emoji is enabled, as it handles links using the HandledLink component. - if (isModernEmojiEnabled()) { - return; - } - - const links = node.querySelectorAll('a'); - - let link, mention; - - for (var i = 0; i < links.length; ++i) { - link = links[i]; - - if (link.classList.contains('status-link')) { - continue; - } - - link.classList.add('status-link'); - - mention = this.props.status.get('mentions').find(item => link.href === item.get('url')); - - if (mention) { - link.addEventListener('click', this.onMentionClick.bind(this, mention), false); - link.setAttribute('title', `@${mention.get('acct')}`); - link.setAttribute('href', `/@${mention.get('acct')}`); - link.setAttribute('data-hover-card-account', mention.get('id')); - } else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) { - link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false); - link.setAttribute('href', `/tags/${link.text.replace(/^#/, '')}`); - link.setAttribute('data-menu-hashtag', this.props.status.getIn(['account', 'id'])); - } else { - link.setAttribute('title', link.href); - link.classList.add('unhandled-link'); - } - } } componentDidMount () { @@ -153,22 +127,6 @@ class StatusContent extends PureComponent { this._updateStatusLinks(); } - onMentionClick = (mention, e) => { - if (this.props.history && e.button === 0 && !(e.ctrlKey || e.metaKey)) { - e.preventDefault(); - this.props.history.push(`/@${mention.get('acct')}`); - } - }; - - onHashtagClick = (hashtag, e) => { - hashtag = hashtag.replace(/^#/, ''); - - if (this.props.history && e.button === 0 && !(e.ctrlKey || e.metaKey)) { - e.preventDefault(); - this.props.history.push(`/tags/${hashtag}`); - } - }; - handleMouseDown = (e) => { this.startXY = [e.clientX, e.clientY]; }; @@ -206,7 +164,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 ( ); - } else if (element instanceof HTMLParagraphElement && element.classList.contains('quote-inline')) { + } else if (element.classList.contains('quote-inline') && this.props.status.get('quote')) { return null; } return undefined; diff --git a/app/javascript/mastodon/components/status_quoted.tsx b/app/javascript/mastodon/components/status_quoted.tsx index a0024bbf6..647672e05 100644 --- a/app/javascript/mastodon/components/status_quoted.tsx +++ b/app/javascript/mastodon/components/status_quoted.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useRef } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { FormattedMessage } from 'react-intl'; @@ -83,6 +83,62 @@ const LimitedAccountHint: React.FC<{ accountId: string }> = ({ accountId }) => { ); }; +const FilteredQuote: React.FC<{ + reveal: VoidFunction; + quotedAccountId: string; + quoteState: string; +}> = ({ reveal, quotedAccountId, quoteState }) => { + const account = useAppSelector((state) => + quotedAccountId ? state.accounts.get(quotedAccountId) : undefined, + ); + + const quoteAuthorName = account?.acct; + const domain = quoteAuthorName?.split('@')[1]; + + let message; + + switch (quoteState) { + case 'blocked_account': + message = ( + + ); + break; + case 'blocked_domain': + message = ( + + ); + break; + case 'muted_account': + message = ( + + ); + } + + return ( + <> + {message} + + + ); +}; + interface QuotedStatusProps { quote: QuoteMap; contextType?: string; @@ -130,6 +186,11 @@ export const QuotedStatus: React.FC = ({ const isLoaded = loadingState === 'complete'; const isFetchingQuoteRef = useRef(false); + const [revealed, setRevealed] = useState(false); + + const reveal = useCallback(() => { + setRevealed(true); + }, [setRevealed]); useEffect(() => { if (isLoaded) { @@ -189,6 +250,20 @@ export const QuotedStatus: React.FC = ({ defaultMessage='Post removed by author' /> ); + } else if ( + (quoteState === 'blocked_account' || + quoteState === 'blocked_domain' || + quoteState === 'muted_account') && + !revealed && + accountId + ) { + quoteError = ( + + ); } else if ( !status || !quotedStatusId || diff --git a/app/javascript/mastodon/components/verified_badge.tsx b/app/javascript/mastodon/components/verified_badge.tsx index 43edbc795..cc8d8bf40 100644 --- a/app/javascript/mastodon/components/verified_badge.tsx +++ b/app/javascript/mastodon/components/verified_badge.tsx @@ -1,30 +1,10 @@ import { EmojiHTML } from '@/mastodon/components/emoji/html'; import CheckIcon from '@/material-icons/400-24px/check.svg?react'; -import { isModernEmojiEnabled } from '../utils/environment'; import type { OnAttributeHandler } from '../utils/html'; import { Icon } from './icon'; -const domParser = new DOMParser(); - -const stripRelMe = (html: string) => { - if (isModernEmojiEnabled()) { - return html; - } - const document = domParser.parseFromString(html, 'text/html').documentElement; - - document.querySelectorAll('a[rel]').forEach((link) => { - link.rel = link.rel - .split(' ') - .filter((x: string) => x !== 'me') - .join(' '); - }); - - const body = document.querySelector('body'); - return body?.innerHTML ?? ''; -}; - const onAttribute: OnAttributeHandler = (name, value, tagName) => { if (name === 'rel' && tagName === 'a') { if (value === 'me') { @@ -47,10 +27,6 @@ interface Props { export const VerifiedBadge: React.FC = ({ link }) => ( - + ); diff --git a/app/javascript/mastodon/features/about/components/rules.tsx b/app/javascript/mastodon/features/about/components/rules.tsx index e413adb31..078fb68c0 100644 --- a/app/javascript/mastodon/features/about/components/rules.tsx +++ b/app/javascript/mastodon/features/about/components/rules.tsx @@ -32,16 +32,38 @@ interface Rule extends BaseRule { translations?: Record; } +function getDefaultSelectedLocale( + currentUiLocale: string, + localeOptions: SelectItem[], +) { + const preciseMatch = localeOptions.find( + (option) => option.value === currentUiLocale, + ); + if (preciseMatch) { + return preciseMatch.value; + } + + const partialLocale = currentUiLocale.split('-')[0]; + const partialMatch = localeOptions.find( + (option) => option.value.split('-')[0] === partialLocale, + ); + + return partialMatch?.value ?? 'default'; +} + export const RulesSection: FC = ({ isLoading = false }) => { const intl = useIntl(); - const [locale, setLocale] = useState(intl.locale); - const rules = useAppSelector((state) => rulesSelector(state, locale)); const localeOptions = useAppSelector((state) => localeOptionsSelector(state, intl), ); + const [selectedLocale, setSelectedLocale] = useState(() => + getDefaultSelectedLocale(intl.locale, localeOptions), + ); + const rules = useAppSelector((state) => rulesSelector(state, selectedLocale)); + const handleLocaleChange: ChangeEventHandler = useCallback( (e) => { - setLocale(e.currentTarget.value); + setSelectedLocale(e.currentTarget.value); }, [], ); @@ -74,25 +96,27 @@ export const RulesSection: FC = ({ isLoading = false }) => { ))} -
- - -
+ {localeOptions.length > 1 && ( +
+ + +
+ )} ); }; diff --git a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx index 2bf636d06..040ca16c7 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx @@ -49,7 +49,6 @@ import { ShortNumber } from 'mastodon/components/short_number'; import { AccountNote } from 'mastodon/features/account/components/account_note'; import { DomainPill } from 'mastodon/features/account/components/domain_pill'; import FollowRequestNoteContainer from 'mastodon/features/account/containers/follow_request_note_container'; -import { useLinks } from 'mastodon/hooks/useLinks'; import { useIdentity } from 'mastodon/identity_context'; import { autoPlayGif, me, domain as localDomain } from 'mastodon/initial_state'; import type { Account } from 'mastodon/models/account'; @@ -198,7 +197,6 @@ export const AccountHeader: React.FC<{ state.relationships.get(accountId), ); const hidden = useAppSelector((state) => getAccountHidden(state, accountId)); - const handleLinkClick = useLinks(); const handleBlock = useCallback(() => { if (!account) { @@ -852,10 +850,7 @@ export const AccountHeader: React.FC<{ {!(suspended || hidden) && (
-
+
{account.id !== me && signedIn && ( )} diff --git a/app/javascript/mastodon/features/audio/index.tsx b/app/javascript/mastodon/features/audio/index.tsx index a6a131c0d..c16fd9eab 100644 --- a/app/javascript/mastodon/features/audio/index.tsx +++ b/app/javascript/mastodon/features/audio/index.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef, useCallback, useState, useId } from 'react'; +import { useEffect, useRef, useCallback, useState } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; @@ -22,6 +22,8 @@ import { useAudioVisualizer } from 'mastodon/hooks/useAudioVisualizer'; import { displayMedia, useBlurhash } from 'mastodon/initial_state'; import { playerSettings } from 'mastodon/settings'; +import { AudioVisualizer } from './visualizer'; + const messages = defineMessages({ play: { id: 'video.play', defaultMessage: 'Play' }, pause: { id: 'video.pause', defaultMessage: 'Pause' }, @@ -116,7 +118,6 @@ export const Audio: React.FC<{ const seekRef = useRef(null); const volumeRef = useRef(null); const hoverTimeoutRef = useRef | null>(); - const accessibilityId = useId(); const { audioContextRef, sourceRef, gainNodeRef, playAudio, pauseAudio } = useAudioContext({ audioElementRef: audioRef }); @@ -538,19 +539,6 @@ export const Audio: React.FC<{ [togglePlay, toggleMute], ); - const springForBand0 = useSpring({ - to: { r: 50 + (frequencyBands[0] ?? 0) * 10 }, - config: config.wobbly, - }); - const springForBand1 = useSpring({ - to: { r: 50 + (frequencyBands[1] ?? 0) * 10 }, - config: config.wobbly, - }); - const springForBand2 = useSpring({ - to: { r: 50 + (frequencyBands[2] ?? 0) * 10 }, - config: config.wobbly, - }); - const progress = Math.min((currentTime / loadedDuration) * 100, 100); const effectivelyMuted = muted || volume === 0; @@ -641,81 +629,7 @@ export const Audio: React.FC<{
- - - - - - - - - - - - - - - - - - - - - - +
.", @@ -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": "

Czym jest tekst alternatywny?

Tekst alternatywny zawiera opisy zdjęć dla osób niedowidzących, korzystających z połączeń o niskiej przepustowości lub szukających dodatkowego kontekstu.

\n

Możesz poprawić dostępność i czytelność dla wszystkich, pisząc jasny, zwięzły i precyzyjny tekst alternatywny.

\n
    \n
  • Podkreśl ważne elementy
  • \n
  • Streść tekst widoczny na zdjęciach
  • \n
  • Używaj poprawnej struktury zdań
  • \n
  • Unikaj zbędnych informacji
  • \n
  • Skoncentruj się na kluczowych informacjach zawartych w złożonych wizualizacjach (takich jak diagramy lub mapy)
  • \n
", + "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 Preferencje > Domyślne ustawienia publikowania.", "visibility_modal.privacy_label": "Widoczność", "visibility_modal.quote_followers": "Tylko dla obserwujących", "visibility_modal.quote_label": "Kto może cytować", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 5457e91db..39e2fb84f 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -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}}", @@ -167,6 +173,8 @@ "column.edit_list": "Editar lista", "column.favourites": "Favoritos", "column.firehose": "Feeds ao vivo", + "column.firehose_local": "Transmissão ao vivo deste servidor", + "column.firehose_singular": "Transmissão ao vivo", "column.follow_requests": "Seguidores pendentes", "column.home": "Página inicial", "column.list_members": "Gerenciar membros da lista", @@ -186,6 +194,7 @@ "community.column_settings.local_only": "Somente local", "community.column_settings.media_only": "Somente mídia", "community.column_settings.remote_only": "Somente global", + "compose.error.blank_post": "A postagem não pode estar em branco.", "compose.language.change": "Alterar idioma", "compose.language.search": "Pesquisar idiomas...", "compose.published.body": "Publicado.", @@ -240,6 +249,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 +260,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 +336,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 +465,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": "

O que é texto alternativo?

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.

Você pode melhorar a acessibilidade e a compreensão para todos escrevendo texto alternativo claro, conciso e objetivo.

  • Capture elementos importantes
  • Resuma textos em imagens
  • Use estrutura de frases regular
  • Evite informações redundantes
  • Foque em tendências e descobertas principais em visuais complexos (como diagramas ou mapas)
", + "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 +753,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 +777,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 +875,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", @@ -880,25 +912,37 @@ "status.pin": "Fixar", "status.quote": "Citar", "status.quote.cancel": "Cancelar citação", + "status.quote_error.blocked_account_hint.title": "Esta publicação está oculta porque você bloqueou @{name}.", + "status.quote_error.blocked_domain_hint.title": "Esta publicação está oculta porque você bloqueou {domain}.", "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.muted_account_hint.title": "Esta publicação está oculta porque você silenciou @{name}.", "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 +1014,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 Preferências > Postagem padrão.", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 0acd1d9f4..d821fe4a1 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -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!", @@ -173,6 +173,8 @@ "column.edit_list": "Editar lista", "column.favourites": "Favoritos", "column.firehose": "Cronologias em tempo real", + "column.firehose_local": "Cronologia em tempo real para este servidor", + "column.firehose_singular": "Cronologia em tempo real", "column.follow_requests": "Pedidos de seguidores", "column.home": "Início", "column.list_members": "Gerir membros da lista", @@ -192,6 +194,7 @@ "community.column_settings.local_only": "Apenas local", "community.column_settings.media_only": "Apenas multimédia", "community.column_settings.remote_only": "Apenas remoto", + "compose.error.blank_post": "As publicações não podem ficar em branco.", "compose.language.change": "Alterar idioma", "compose.language.search": "Pesquisar idiomas...", "compose.published.body": "Publicado.", @@ -244,12 +247,17 @@ "confirmations.missing_alt_text.secondary": "Publicar mesmo assim", "confirmations.missing_alt_text.title": "Adicionar texto alternativo?", "confirmations.mute.confirm": "Ocultar", + "confirmations.private_quote_notify.cancel": "Voltar à edição", + "confirmations.private_quote_notify.confirm": "Publicar", + "confirmations.private_quote_notify.do_not_show_again": "Não mostrar novamente esta mensagem", + "confirmations.private_quote_notify.message": "A pessoa que está a citar e outras mencionadas serão notificadas e poderão ver a sua publicação, mesmo que não o sigam.", + "confirmations.private_quote_notify.title": "Partilhar com seguidores e utilizadores mencionados?", "confirmations.quiet_post_quote_info.dismiss": "Não me relembre novamente", "confirmations.quiet_post_quote_info.got_it": "Entendido", "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?", @@ -330,9 +338,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.", @@ -366,7 +375,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}.", @@ -429,10 +438,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.", @@ -441,7 +450,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!", @@ -473,7 +482,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", @@ -564,7 +573,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", @@ -626,8 +635,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 {count, plural, one {# outro} other {# outros}} impulsionaram a tua publicação", + "notification.reblog": "{name} partilhou a sua publicação", + "notification.reblog.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}} 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.", @@ -670,7 +679,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:", @@ -678,7 +687,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", @@ -755,6 +764,7 @@ "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.private_mentions": "A citação não é permitida em menções privadas.", "quote_error.quote": "Apenas é permitida uma citação de cada vez.", "quote_error.unauthorized": "Não está autorizado a citar esta publicação.", "quote_error.upload": "Não é permitida a citação com anexos de multimédia.", @@ -867,12 +877,12 @@ "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", @@ -908,9 +918,12 @@ "status.pin": "Afixar no perfil", "status.quote": "Citação", "status.quote.cancel": "Cancelar citação", + "status.quote_error.blocked_account_hint.title": "Esta publicação está oculta porque bloqueou @{name}.", + "status.quote_error.blocked_domain_hint.title": "Esta publicação está oculta porque bloqueou {domain}.", "status.quote_error.filtered": "Oculto devido a um dos seus filtros", "status.quote_error.limited_account_hint.action": "Mostrar na mesma", "status.quote_error.limited_account_hint.title": "Esta conta foi ocultada pelos moderadores de {domain}.", + "status.quote_error.muted_account_hint.title": "Esta publicação está oculta porque silenciou @{name}.", "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, pode controlar se alguém pode citar as suas publicações. Esta publicação está pendente enquanto aguardamos a aprovação do autor original.", @@ -926,12 +939,12 @@ "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", @@ -1005,6 +1018,8 @@ "video.volume_down": "Diminuir volume", "video.volume_up": "Aumentar volume", "visibility_modal.button_title": "Definir visibilidade", + "visibility_modal.direct_quote_warning.text": "Se guardar as definições atuais, a citação incorporada será convertida numa hiperligação.", + "visibility_modal.direct_quote_warning.title": "Citações não podem ser incorporadas em menções privadas", "visibility_modal.header": "Visibilidade e interação", "visibility_modal.helper.direct_quoting": "As menções privadas criadas no Mastodon não podem ser citadas por outras pessoas.", "visibility_modal.helper.privacy_editing": "A visibilidade não pode ser alterada após a publicação ser publicada.", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index a39bb0c07..c40e0f783 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -169,6 +169,8 @@ "column.edit_list": "Përpunoni listën", "column.favourites": "Të parapëlqyer", "column.firehose": "Prurje “live”", + "column.firehose_local": "Prurje “live” për këtë shërbyes", + "column.firehose_singular": "Prurje “live”", "column.follow_requests": "Kërkesa për ndjekje", "column.home": "Kreu", "column.list_members": "Administroni anëtarë liste", @@ -188,6 +190,7 @@ "community.column_settings.local_only": "Vetëm vendore", "community.column_settings.media_only": "Vetëm Media", "community.column_settings.remote_only": "Vetëm të largëta", + "compose.error.blank_post": "Postimi s’mund të jetë i zbrazët.", "compose.language.change": "Ndryshoni gjuhën", "compose.language.search": "Kërkoni te gjuhët…", "compose.published.body": "Postimi u botua.", @@ -240,6 +243,11 @@ "confirmations.missing_alt_text.secondary": "Postoje, sido qoftë", "confirmations.missing_alt_text.title": "Të shtohet tekst alternativ?", "confirmations.mute.confirm": "Heshtoje", + "confirmations.private_quote_notify.cancel": "Mbrapsht te përpunimi", + "confirmations.private_quote_notify.confirm": "Botoje postimin", + "confirmations.private_quote_notify.do_not_show_again": "Mos ma shfaq prapë këtë mesazh", + "confirmations.private_quote_notify.message": "Personi që citoni dhe përmendje të tjera do të njoftohen dhe do të jenë në gjendje të shohin postimin tuaj, edhe pse nuk ju ndjekin.", + "confirmations.private_quote_notify.title": "T’u shfaqet ndjekësve dhe përdoruesve të përmendur?", "confirmations.quiet_post_quote_info.dismiss": "Mos ma kujto më", "confirmations.quiet_post_quote_info.got_it": "E mora vesh", "confirmations.quiet_post_quote_info.message": "Kur citoni një postim publik të heshtuar, postimi juaj do të kalohet i fshehur te rrjedha kohore e gjërave në modë.", @@ -329,6 +337,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.", @@ -751,6 +760,7 @@ "privacy_policy.title": "Rregulla Privatësie", "quote_error.edit": "Kur përpunohet një postim, s’mund të shtohen citime.", "quote_error.poll": "Me pyetësorët nuk lejohet citim.", + "quote_error.private_mentions": "Citimi nuk lejohet me përmendje të drejtpërdrejta.", "quote_error.quote": "Lejohet vetëm një citim në herë.", "quote_error.unauthorized": "S’jen i autorizuar ta citoni këtë postim.", "quote_error.upload": "Me bashkëngjitjet media nuk lejohet citim.", @@ -904,9 +914,12 @@ "status.pin": "Fiksoje në profil", "status.quote": "Citojeni", "status.quote.cancel": "Anuloje citimin", + "status.quote_error.blocked_account_hint.title": "Ky postim është i fshehur, ngaqë keni bllokuar @{name}.", + "status.quote_error.blocked_domain_hint.title": "Ky postim është i fshehur, ngaqë keni bllokuar {domain}.", "status.quote_error.filtered": "Fshehur për shkak të njërit nga filtrat tuaj", "status.quote_error.limited_account_hint.action": "Shfaqe, sido qoftë", "status.quote_error.limited_account_hint.title": "Kjo llogari është fshehur nga moderatorët e {domain}.", + "status.quote_error.muted_account_hint.title": "Ky postim është i fshehur, ngaqë keni heshtuar @{name}.", "status.quote_error.not_available": "Postim që s’mund të kihet", "status.quote_error.pending_approval": "Postim pezull", "status.quote_error.pending_approval_popout.body": "Në Mastodon mundeni të kontrolloni nëse dikush ju citon a jo. Ky postim është pezull, teksa po marrim miratimin e autorit origjinal.", @@ -1001,6 +1014,8 @@ "video.volume_down": "Ulje volumi", "video.volume_up": "Ngritje volumi", "visibility_modal.button_title": "Caktoni dukshmëri", + "visibility_modal.direct_quote_warning.text": "Nëse ruani rregullimet e tanishme, citimi i trupëzuar do të shndërrohet në një lidhje.", + "visibility_modal.direct_quote_warning.title": "Citimet s’mund të trupëzohen në përmendje private", "visibility_modal.header": "Dukshmëri dhe ndërveprim", "visibility_modal.helper.direct_quoting": "Përmendje private të krijuara në Mastodon s’mund të citohen nga të tjerë.", "visibility_modal.helper.privacy_editing": "Dukshmëria s’mund të ndryshohet pasi postimi botohet.", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 651114d88..297b02dea 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -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.featured": "น่าสนใจ", @@ -37,6 +38,11 @@ "account.featured_tags.last_status_never": "ไม่มีโพสต์", "account.follow": "ติดตาม", "account.follow_back": "ติดตามกลับ", + "account.follow_back_short": "ติดตามกลับ", + "account.follow_request": "ขอติดตาม", + "account.follow_request_cancel": "ยกเลิกคำขอ", + "account.follow_request_cancel_short": "ยกเลิก", + "account.follow_request_short": "ขอ", "account.followers": "ผู้ติดตาม", "account.followers.empty": "ยังไม่มีใครติดตามผู้ใช้นี้", "account.followers_counter": "{count, plural, other {{counter} ผู้ติดตาม}}", @@ -63,6 +69,7 @@ "account.open_original_page": "เปิดหน้าดั้งเดิม", "account.posts": "โพสต์", "account.posts_with_replies": "โพสต์และการตอบกลับ", + "account.remove_from_followers": "เอา {name} ออกจากผู้ติดตาม", "account.report": "รายงาน @{name}", "account.requested_follow": "{name} ได้ขอติดตามคุณ", "account.share": "แชร์โปรไฟล์ของ @{name}", @@ -158,6 +165,8 @@ "column.edit_list": "แก้ไขรายการ", "column.favourites": "รายการโปรด", "column.firehose": "ฟีดสด", + "column.firehose_local": "ฟีดสดสำหรับเซิร์ฟเวอร์นี้", + "column.firehose_singular": "ฟีดสด", "column.follow_requests": "คำขอติดตาม", "column.home": "หน้าแรก", "column.list_members": "จัดการสมาชิกของรายการ", @@ -209,6 +218,8 @@ "confirmations.delete_list.confirm": "ลบ", "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?", "confirmations.delete_list.title": "ลบรายการ?", + "confirmations.discard_draft.confirm": "ละทิ้งและดำเนินการต่อ", + "confirmations.discard_draft.post.title": "ละทิ้งโพสต์แบบร่างของคุณ?", "confirmations.discard_edit_media.confirm": "ละทิ้ง", "confirmations.discard_edit_media.message": "คุณมีการเปลี่ยนแปลงคำอธิบายหรือตัวอย่างสื่อที่ยังไม่ได้บันทึก ละทิ้งการเปลี่ยนแปลงเหล่านั้นต่อไป?", "confirmations.follow_to_list.confirm": "ติดตามและเพิ่มไปยังรายการ", @@ -221,10 +232,20 @@ "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.redraft.confirm": "ลบแล้วร่างใหม่", "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะสูญหาย และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน", "confirmations.redraft.title": "ลบแล้วร่างโพสต์ใหม่?", + "confirmations.remove_from_followers.confirm": "เอาผู้ติดตามออก", + "confirmations.remove_from_followers.title": "เอาผู้ติดตามออก?", + "confirmations.revoke_quote.confirm": "เอาโพสต์ออก", + "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": "แสดงเพิ่มเติม", @@ -265,6 +286,7 @@ "domain_pill.your_handle": "นามของคุณ:", "domain_pill.your_server": "บ้านดิจิทัลของคุณ ที่ซึ่งโพสต์ทั้งหมดของคุณอาศัยอยู่ ไม่ชอบเซิร์ฟเวอร์นี้? ถ่ายโอนเซิร์ฟเวอร์เมื่อใดก็ได้และนำผู้ติดตามของคุณไปด้วยเช่นกัน", "domain_pill.your_username": "ตัวระบุที่ไม่ซ้ำกันของคุณในเซิร์ฟเวอร์นี้ เป็นไปได้ที่จะค้นหาผู้ใช้ที่มีชื่อผู้ใช้เดียวกันในเซิร์ฟเวอร์ที่แตกต่างกัน", + "dropdown.empty": "เลือกตัวเลือก", "embed.instructions": "ฝังโพสต์นี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง", "embed.preview": "นี่คือลักษณะของการฝังที่จะปรากฏ:", "emoji_button.activity": "กิจกรรม", @@ -314,6 +336,7 @@ "explore.trending_links": "ข่าว", "explore.trending_statuses": "โพสต์", "explore.trending_tags": "แฮชแท็ก", + "featured_carousel.header": "{count, plural, other {โพสต์ที่ปักหมุด}}", "featured_carousel.next": "ถัดไป", "featured_carousel.post": "โพสต์", "featured_carousel.previous": "ก่อนหน้า", @@ -370,6 +393,8 @@ "generic.saved": "บันทึกแล้ว", "getting_started.heading": "เริ่มต้นใช้งาน", "hashtag.admin_moderation": "เปิดส่วนติดต่อการกลั่นกรองสำหรับ #{name}", + "hashtag.browse": "เรียกดูโพสต์ใน #{hashtag}", + "hashtag.browse_from_account": "เรียกดูโพสต์จาก @{name} ใน #{hashtag}", "hashtag.column_header.tag_mode.all": "และ {additional}", "hashtag.column_header.tag_mode.any": "หรือ {additional}", "hashtag.column_header.tag_mode.none": "โดยไม่มี {additional}", @@ -417,7 +442,7 @@ "interaction_modal.no_account_yet": "ยังไม่มีบัญชี?", "interaction_modal.on_another_server": "ในเซิร์ฟเวอร์อื่น", "interaction_modal.on_this_server": "ในเซิร์ฟเวอร์นี้", - "interaction_modal.title": "ลงชื่อเข้า", + "interaction_modal.title": "ลงชื่อเข้าเพื่อดำเนินการต่อ", "interaction_modal.username_prompt": "เช่น {example}", "intervals.full.days": "{number, plural, other {# วัน}}", "intervals.full.hours": "{number, plural, other {# ชั่วโมง}}", @@ -457,6 +482,8 @@ "keyboard_shortcuts.translate": "เพื่อแปลโพสต์", "keyboard_shortcuts.unfocus": "เลิกโฟกัสพื้นที่เขียนข้อความ/การค้นหา", "keyboard_shortcuts.up": "ย้ายขึ้นในรายการ", + "learn_more_link.got_it": "เข้าใจแล้ว", + "learn_more_link.learn_more": "เรียนรู้เพิ่มเติม", "lightbox.close": "ปิด", "lightbox.next": "ถัดไป", "lightbox.previous": "ก่อนหน้า", @@ -529,6 +556,8 @@ "navigation_bar.preferences": "การกำหนดลักษณะ", "navigation_bar.privacy_and_reach": "ความเป็นส่วนตัวและการเข้าถึง", "navigation_bar.search": "ค้นหา", + "navigation_panel.collapse_lists": "ยุบเมนูรายการ", + "navigation_panel.expand_lists": "ขยายเมนูรายการ", "not_signed_in_indicator.not_signed_in": "คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงทรัพยากรนี้", "notification.admin.report": "{name} ได้รายงาน {target}", "notification.admin.report_account": "{name} ได้รายงาน {count, plural, other {# โพสต์}}จาก {target} สำหรับ {category}", @@ -700,6 +729,7 @@ "relative_time.minutes": "{number} นาที", "relative_time.seconds": "{number} วินาที", "relative_time.today": "วันนี้", + "remove_quote_hint.button_label": "เข้าใจแล้ว", "reply_indicator.attachments": "{count, plural, other {# ไฟล์แนบ}}", "reply_indicator.cancel": "ยกเลิก", "reply_indicator.poll": "การสำรวจความคิดเห็น", @@ -794,9 +824,12 @@ "status.bookmark": "เพิ่มที่คั่นหน้า", "status.cancel_reblog_private": "เลิกดัน", "status.cannot_reblog": "ไม่สามารถดันโพสต์นี้", + "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": "การกล่าวถึงแบบส่วนตัว", @@ -828,6 +861,7 @@ "status.redraft": "ลบแล้วร่างใหม่", "status.remove_bookmark": "เอาที่คั่นหน้าออก", "status.remove_favourite": "เอาออกจากรายการโปรด", + "status.remove_quote": "เอาออก", "status.replied_in_thread": "ตอบกลับในกระทู้", "status.replied_to": "ตอบกลับ {name}", "status.reply": "ตอบกลับ", @@ -886,5 +920,6 @@ "video.mute": "ปิดเสียง", "video.pause": "หยุดชั่วคราว", "video.play": "เล่น", - "video.unmute": "เลิกปิดเสียง" + "video.unmute": "เลิกปิดเสียง", + "visibility_modal.save": "บันทึก" } diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index e71cae286..a3b487f50 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -24,7 +24,7 @@ "account.blocking": "Engelleme", "account.cancel_follow_request": "Takip isteğini geri çek", "account.copy": "Gönderi bağlantısını kopyala", - "account.direct": "@{name} kullanıcısına özel olarak değin", + "account.direct": "@{name} kullanıcısından özel olarak bahset", "account.disable_notifications": "@{name} kişisinin gönderi bildirimlerini kapat", "account.domain_blocking": "Alan adını engelleme", "account.edit_profile": "Profili düzenle", @@ -173,6 +173,8 @@ "column.edit_list": "Listeyi düzenle", "column.favourites": "Gözdelerin", "column.firehose": "Anlık Akışlar", + "column.firehose_local": "Bu sunucunun canlı akışı", + "column.firehose_singular": "Canlı akış", "column.follow_requests": "Takip istekleri", "column.home": "Anasayfa", "column.list_members": "Liste üyelerini yönet", @@ -192,6 +194,7 @@ "community.column_settings.local_only": "Sadece yerel", "community.column_settings.media_only": "Sadece medya", "community.column_settings.remote_only": "Sadece uzak", + "compose.error.blank_post": "Gönderiler boş bırakılamaz.", "compose.language.change": "Dili değiştir", "compose.language.search": "Dilleri ara...", "compose.published.body": "Gönderi yayınlandı.", @@ -244,6 +247,11 @@ "confirmations.missing_alt_text.secondary": "Yine de gönder", "confirmations.missing_alt_text.title": "Alternatif metin ekle?", "confirmations.mute.confirm": "Sessize al", + "confirmations.private_quote_notify.cancel": "Düzenlemeye dön", + "confirmations.private_quote_notify.confirm": "Gönderiyi yayınla", + "confirmations.private_quote_notify.do_not_show_again": "Bu iletiyi bana tekrar gösterme", + "confirmations.private_quote_notify.message": "Alıntı yaptığınız kişi ve diğer bahsedilen kişiler, sizi takip etmiyor olsalar bile bildirim alacak ve gönderinizi görüntüleyebileceklerdir.", + "confirmations.private_quote_notify.title": "Takipçiler ve bahsedilen kullanıcılarla paylaş?", "confirmations.quiet_post_quote_info.dismiss": "Bana bir daha hatırlatma", "confirmations.quiet_post_quote_info.got_it": "Anladım", "confirmations.quiet_post_quote_info.message": "Sessiz bir genel gönderiyi alıntıladığınızda, gönderiniz öne çıkan zaman çizelgelerinden gizlenir.", @@ -333,6 +341,7 @@ "empty_column.bookmarked_statuses": "Henüz yer imine eklediğin toot yok. Bir tanesi yer imine eklendiğinde burada görünür.", "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!", "empty_column.direct": "Henüz doğrudan değinmeniz yok. Bir tane gönderdiğinizde veya aldığınızda burada listelenecek.", + "empty_column.disabled_feed": "Bu akış sunucu yöneticileri tarafından devre dışı bırakılmıştır.", "empty_column.domain_blocks": "Henüz engellenmiş bir alan adı yok.", "empty_column.explore_statuses": "Şu an öne çıkan birşey yok. Daha sonra tekrar bakın!", "empty_column.favourited_statuses": "Henüz bir gönderiyi favorilerinize eklememişsiniz. Bir gönderiyi favorilerinize eklediğinizde burada görünecek.", @@ -755,6 +764,7 @@ "privacy_policy.title": "Gizlilik Politikası", "quote_error.edit": "Gönderi düzenlenirken alıntılar eklenemez.", "quote_error.poll": "Anketlerde alıntıya izin verilmez.", + "quote_error.private_mentions": "Doğrudan atıfta bulunarak alıntı yapma izni yoktur.", "quote_error.quote": "Bir seferde tek bir alıntıya izin var.", "quote_error.unauthorized": "Bu gönderiyi alıntılamaya yetkiniz yok.", "quote_error.upload": "Medya eklentilerini alıntılamaya izin yok.", @@ -908,9 +918,12 @@ "status.pin": "Profile sabitle", "status.quote": "Teklif", "status.quote.cancel": "Teklifi iptal et", + "status.quote_error.blocked_account_hint.title": "Bu gönderi @{name} kişisini engellediğiniz için gizlenmiştir.", + "status.quote_error.blocked_domain_hint.title": "Bu gönderi {domain} adresini engellediğiniz için gizlenmiştir.", "status.quote_error.filtered": "Bazı filtrelerinizden dolayı gizlenmiştir", "status.quote_error.limited_account_hint.action": "Yine de göster", "status.quote_error.limited_account_hint.title": "Bu hesap {domain} moderatörleri tarafından gizlendi.", + "status.quote_error.muted_account_hint.title": "Bu gönderi @{name} kişisini sessize aldığınız için gizlenmiştir.", "status.quote_error.not_available": "Gönderi kullanılamıyor", "status.quote_error.pending_approval": "Gönderi beklemede", "status.quote_error.pending_approval_popout.body": "Mastodon'da, birinin sizi alıntılayıp alıntılayamayacağını kontrol edebilirsiniz. Bu gönderi, orijinal yazarın onayını alma sürecinde beklemede.", @@ -1005,6 +1018,8 @@ "video.volume_down": "Sesi kıs", "video.volume_up": "Sesi yükselt", "visibility_modal.button_title": "Görünürlüğü ayarla", + "visibility_modal.direct_quote_warning.text": "Mevcut ayarları kaydederseniz, gömülü alıntı bir bağlantıya dönüştürülür.", + "visibility_modal.direct_quote_warning.title": "Alıntılar özel bahsetmelere eklenemez", "visibility_modal.header": "Görünürlük ve etkileşim", "visibility_modal.helper.direct_quoting": "Mastodon'da özel değiniler başkaları tarafından alıntılanamaz.", "visibility_modal.helper.privacy_editing": "Gönderi yayınlandıktan sonra görünürlük değiştirilemez.", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index c87d8ee5d..3162ee735 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -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} نى پاش قىل", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index c68033c57..a85cafb6a 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -173,6 +173,8 @@ "column.edit_list": "Sửa danh sách", "column.favourites": "Những tút đã thích", "column.firehose": "Bảng tin", + "column.firehose_local": "Bảng tin máy chủ này", + "column.firehose_singular": "Bảng tin", "column.follow_requests": "Yêu cầu theo dõi", "column.home": "Trang chủ", "column.list_members": "Những người trong danh sách", @@ -192,6 +194,7 @@ "community.column_settings.local_only": "Chỉ máy chủ của bạn", "community.column_settings.media_only": "Chỉ hiện tút có media", "community.column_settings.remote_only": "Chỉ người ở máy chủ khác", + "compose.error.blank_post": "Không thể để trống.", "compose.language.change": "Chọn ngôn ngữ tút", "compose.language.search": "Tìm ngôn ngữ...", "compose.published.body": "Tút đã được đăng.", @@ -244,6 +247,11 @@ "confirmations.missing_alt_text.secondary": "Đăng luôn", "confirmations.missing_alt_text.title": "Thêm văn bản thay thế?", "confirmations.mute.confirm": "Ẩn", + "confirmations.private_quote_notify.cancel": "Quay lại chỉnh sửa", + "confirmations.private_quote_notify.confirm": "Đăng tút", + "confirmations.private_quote_notify.do_not_show_again": "Không hiện thông báo này nữa", + "confirmations.private_quote_notify.message": "Người mà bạn trích dẫn và những người được bạn nhắc đến khác sẽ được thông báo và có thể xem tút của bạn, ngay cả khi họ không theo dõi bạn.", + "confirmations.private_quote_notify.title": "Chia sẻ với người được nhắc đến và người theo dõi?", "confirmations.quiet_post_quote_info.dismiss": "Không nhắc lại nữa", "confirmations.quiet_post_quote_info.got_it": "Đã hiểu", "confirmations.quiet_post_quote_info.message": "Khi trích dẫn một tút hạn chế, tút của bạn sẽ bị ẩn khỏi dòng thời gian thịnh hành.", @@ -333,6 +341,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.", @@ -755,6 +764,7 @@ "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.private_mentions": "Không thể trích dẫn với lượt nhắc trực tiếp.", "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.", "quote_error.upload": "Không thể trích dẫn với media đính kèm.", @@ -908,9 +918,12 @@ "status.pin": "Ghim lên hồ sơ", "status.quote": "Trích dẫn", "status.quote.cancel": "Bỏ trích dẫn", + "status.quote_error.blocked_account_hint.title": "Tút này bị ẩn vì bạn đã chặn @{name}.", + "status.quote_error.blocked_domain_hint.title": "Tút này bị ẩn vì bạn đã chặn {domain}.", "status.quote_error.filtered": "Bị ẩn vì một bộ lọc của bạn", "status.quote_error.limited_account_hint.action": "Vẫn xem", "status.quote_error.limited_account_hint.title": "Người này đã bị ẩn bởi quản trị viên {domain}.", + "status.quote_error.muted_account_hint.title": "Tút này bị ẩn vì bạn đã ẩn @{name}.", "status.quote_error.not_available": "Tút không khả dụng", "status.quote_error.pending_approval": "Tút đang chờ duyệt", "status.quote_error.pending_approval_popout.body": "Trên Mastodon, bạn có thể kiểm soát việc ai đó có thể trích dẫn tút của bạn hay không. Tút này đang chờ phê duyệt từ tác giả gốc.", @@ -1005,6 +1018,8 @@ "video.volume_down": "Giảm âm lượng", "video.volume_up": "Tăng âm lượng", "visibility_modal.button_title": "Thay đổi quyền riêng tư", + "visibility_modal.direct_quote_warning.text": "Nếu bạn lưu cài đặt hiện tại, trích dẫn được nhúng sẽ được chuyển đổi thành liên kết.", + "visibility_modal.direct_quote_warning.title": "Không thể nhúng trích dẫn vào Nhắn Riêng", "visibility_modal.header": "Hiển thị và tương tác", "visibility_modal.helper.direct_quoting": "Nhắn riêng trên Mastodon không thể được người khác trích dẫn.", "visibility_modal.helper.privacy_editing": "Không thể thay đổi chế độ hiển thị sau khi một tút đã đăng.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 5cf3dbff9..89f0332b7 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -173,6 +173,8 @@ "column.edit_list": "编辑列表", "column.favourites": "喜欢", "column.firehose": "实时动态", + "column.firehose_local": "此服务器的实时动态", + "column.firehose_singular": "实时动态", "column.follow_requests": "关注请求", "column.home": "主页", "column.list_members": "管理列表成员", @@ -192,6 +194,7 @@ "community.column_settings.local_only": "仅限本站", "community.column_settings.media_only": "仅媒体", "community.column_settings.remote_only": "仅外站", + "compose.error.blank_post": "嘟文内容不能为空。", "compose.language.change": "更改语言", "compose.language.search": "搜索语言...", "compose.published.body": "嘟文已发布。", @@ -244,6 +247,11 @@ "confirmations.missing_alt_text.secondary": "就这样发布", "confirmations.missing_alt_text.title": "添加替代文本?", "confirmations.mute.confirm": "隐藏", + "confirmations.private_quote_notify.cancel": "返回编辑", + "confirmations.private_quote_notify.confirm": "发布嘟文", + "confirmations.private_quote_notify.do_not_show_again": "不再显示此消息", + "confirmations.private_quote_notify.message": "您所引用与提及的用户将收到通知且能够查看你的嘟文,即便这些用户没有关注您。", + "confirmations.private_quote_notify.title": "是否和关注者和提及的用户分享此内容?", "confirmations.quiet_post_quote_info.dismiss": "不再提醒", "confirmations.quiet_post_quote_info.got_it": "明白了", "confirmations.quiet_post_quote_info.message": "当你引用悄悄公开的嘟文时,你的嘟文会从热门时间线上隐藏。", @@ -289,7 +297,7 @@ "domain_block_modal.they_wont_know": "对方不会知道自己被屏蔽。", "domain_block_modal.title": "确定要屏蔽此域名?", "domain_block_modal.you_will_lose_num_followers": "你将失去 {followersCount, plural, other {{followersCountDisplay} 名关注者}}和 {followingCount, plural, other {{followingCountDisplay} 名关注}}。", - "domain_block_modal.you_will_lose_relationships": "你将丢失该站点上的所有关注与关注者。", + "domain_block_modal.you_will_lose_relationships": "你将丢失该站点上的全部关注与关注者。", "domain_block_modal.you_wont_see_posts": "你将不会看到此服务器上用户的嘟文或通知。", "domain_pill.activitypub_lets_connect": "它可以让你与不同社交应用上的人交流互动,而不仅限于 Mastodon。", "domain_pill.activitypub_like_language": "ActivityPub 好比 Mastodon 与其它社交网络交流时使用的语言。", @@ -302,7 +310,7 @@ "domain_pill.who_they_are": "用户名可以表明用户的身份和其所在站点,这样你就可以通过在社交网络和人们互动。", "domain_pill.who_you_are": "用户名可以表明你的身份和你所在的站点,这样人们就可以通过在社交网络与你互动。", "domain_pill.your_handle": "你的用户名:", - "domain_pill.your_server": "你的数字家园,你的所有嘟文都在此存储。不喜欢这里吗?你可以随时迁移到其它服务器,并带上你的关注者。", + "domain_pill.your_server": "你的数字家园,你的全部嘟文都在此存储。不喜欢这里吗?你可以随时迁移到其它服务器,并带上你的关注者。", "domain_pill.your_username": "你在此服务器上的唯一标识。不同服务器上可能存在相同用户名的用户。", "dropdown.empty": "选项", "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。", @@ -333,6 +341,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": "你没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。", @@ -661,9 +670,9 @@ "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "喜欢:", - "notifications.column_settings.filter_bar.advanced": "显示所有类别", + "notifications.column_settings.filter_bar.advanced": "显示全部类别", "notifications.column_settings.filter_bar.category": "快速筛选栏", - "notifications.column_settings.follow": "新粉丝:", + "notifications.column_settings.follow": "新关注者:", "notifications.column_settings.follow_request": "新关注请求:", "notifications.column_settings.group": "分组", "notifications.column_settings.mention": "提及:", @@ -755,6 +764,7 @@ "privacy_policy.title": "隐私政策", "quote_error.edit": "编辑嘟文时无法添加引用。", "quote_error.poll": "不允许引用投票嘟文。", + "quote_error.private_mentions": "不允许引用私下提及嘟文。", "quote_error.quote": "一次只能引用一条嘟文。", "quote_error.unauthorized": "你没有权限引用此嘟文。", "quote_error.upload": "不允许引用有媒体附件的嘟文。", @@ -807,9 +817,9 @@ "report.reasons.spam_description": "恶意链接、虚假互动或重复回复", "report.reasons.violation": "违反服务器规则", "report.reasons.violation_description": "你清楚它违反了特定的规则", - "report.rules.subtitle": "选择所有适用选项", + "report.rules.subtitle": "选择全部适用选项", "report.rules.title": "违反了哪些规则?", - "report.statuses.subtitle": "选择所有适用选项", + "report.statuses.subtitle": "选择全部适用选项", "report.statuses.title": "是否有任何嘟文可以支持这一报告?", "report.submit": "提交", "report.target": "举报 {target}", @@ -860,7 +870,7 @@ "server_banner.is_one_of_many": "{domain} 是可用于参与联邦宇宙的众多独立 Mastodon 站点之一。", "server_banner.server_stats": "服务器统计数据:", "sign_in_banner.create_account": "创建账号", - "sign_in_banner.follow_anyone": "关注联邦宇宙中的任何人,并按时间顺序查看所有内容。没有算法、广告或诱导链接。", + "sign_in_banner.follow_anyone": "关注联邦宇宙中的任何人,并按时间顺序查看全部内容。没有算法、广告或诱导链接。", "sign_in_banner.mastodon_is": "Mastodon 是了解最新动态的最佳途径。", "sign_in_banner.sign_in": "登录", "sign_in_banner.sso_redirect": "登录或注册", @@ -908,9 +918,12 @@ "status.pin": "在个人资料页面置顶", "status.quote": "引用", "status.quote.cancel": "取消引用", + "status.quote_error.blocked_account_hint.title": "由于你已屏蔽@{name},此嘟文已隐藏。", + "status.quote_error.blocked_domain_hint.title": "由于你已屏蔽{domain},此嘟文已隐藏。", "status.quote_error.filtered": "已根据你的筛选器过滤", "status.quote_error.limited_account_hint.action": "仍然显示", "status.quote_error.limited_account_hint.title": "此账号已被 {domain} 管理员隐藏。", + "status.quote_error.muted_account_hint.title": "由于你已设置隐藏@{name},此嘟文已隐藏。", "status.quote_error.not_available": "嘟文不可用", "status.quote_error.pending_approval": "嘟文待发布", "status.quote_error.pending_approval_popout.body": "在Mastodon上,你可以控制其他人引用你嘟文的权限。此嘟文在得到原作者的同意后就会发布。", @@ -954,7 +967,7 @@ "status.uncached_media_warning": "预览不可用", "status.unmute_conversation": "恢复此对话的通知提醒", "status.unpin": "在个人资料页面取消置顶", - "subscribed_languages.lead": "更改此选择后,只有选定语言的嘟文才会出现在你的主页和列表时间线上。选择「无」将显示所有语言的嘟文。", + "subscribed_languages.lead": "更改此选择后,只有选定语言的嘟文才会出现在你的主页和列表时间线上。选择「无」将显示全部语言的嘟文。", "subscribed_languages.save": "保存更改", "subscribed_languages.target": "更改 {target} 的订阅语言", "tabs_bar.home": "主页", @@ -1005,13 +1018,15 @@ "video.volume_down": "音量减小", "video.volume_up": "提高音量", "visibility_modal.button_title": "设置可见性", + "visibility_modal.direct_quote_warning.text": "如果你保存当前设置,引用的嘟文将被转换为链接。", + "visibility_modal.direct_quote_warning.title": "引用嘟文无法嵌入到私下提及中", "visibility_modal.header": "可见性和互动", "visibility_modal.helper.direct_quoting": "Mastodon上发布的私下提及无法被他人引用。", "visibility_modal.helper.privacy_editing": "嘟文发布后便无法更改可见性。", "visibility_modal.helper.privacy_private_self_quote": "自我引用的私人嘟文无法设置为公开。", "visibility_modal.helper.private_quoting": "Mastodon上发布的仅限关注者可见的嘟文无法被他人引用。", "visibility_modal.helper.unlisted_quoting": "当其他人引用你时,他们的嘟文也会从热门时间线上隐藏。", - "visibility_modal.instructions": "控制谁可以和此嘟文互动。你也可以前往偏好设置 > 发布默认值将此设置应用到所有未来发布的嘟文。", + "visibility_modal.instructions": "控制谁可以和此嘟文互动。你也可以前往偏好设置 > 发布默认值将此设置应用到全部未来发布的嘟文。", "visibility_modal.privacy_label": "可见性", "visibility_modal.quote_followers": "仅关注者", "visibility_modal.quote_label": "谁可以引用", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 3626f7da5..fd3eb665a 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -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, other {你認識的 # 人}}已追蹤", @@ -40,12 +41,18 @@ "account.featured_tags.last_status_never": "暫無文章", "account.follow": "關注", "account.follow_back": "追蹤對方", + "account.follow_back_short": "追蹤對方", + "account.follow_request": "追蹤請求", + "account.follow_request_cancel": "取消請求", + "account.follow_request_cancel_short": "取消", + "account.follow_request_short": "請求", "account.followers": "追蹤者", "account.followers.empty": "尚未有人追蹤這位使用者。", "account.followers_counter": "{count, plural, other {{counter} 個追蹤者}}", "account.followers_you_know_counter": "你認識的 {counter} 人", "account.following": "正在追蹤", "account.follows.empty": "這位使用者尚未追蹤任何人。", + "account.follows_you": "正追蹤你", "account.go_to_profile": "前往個人檔案", "account.hide_reblogs": "隱藏 @{name} 的轉推", "account.in_memoriam": "謹此悼念。", @@ -60,10 +67,13 @@ "account.mute_notifications_short": "靜音通知", "account.mute_short": "靜音", "account.muted": "靜音", + "account.muting": "靜音", + "account.mutual": "你們已互相追蹤", "account.no_bio": "未提供描述。", "account.open_original_page": "打開原始頁面", "account.posts": "帖文", "account.posts_with_replies": "帖文與回覆", + "account.remove_from_followers": "移除追蹤者{name}", "account.report": "檢舉 @{name}", "account.requested_follow": "{name} 要求追蹤你", "account.share": "分享 @{name} 的個人檔案", @@ -130,8 +140,11 @@ "column.direct": "私人提及", "column.directory": "瀏覽個人資料", "column.domain_blocks": "封鎖的服務站", + "column.edit_list": "編輯列表", "column.favourites": "最愛", "column.firehose": "即時動態", + "column.firehose_local": "本伺服器的即時動態", + "column.firehose_singular": "即時動態", "column.follow_requests": "追蹤請求", "column.home": "主頁", "column.lists": "列表", @@ -182,15 +195,28 @@ "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", "confirmations.delete_list.title": "刪除列表?", + "confirmations.discard_draft.post.title": "要捨棄文章的草稿?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您在媒體描述或預覽有尚未儲存的變更。確定要捨棄它們嗎?", + "confirmations.follow_to_list.title": "追蹤使用者?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", "confirmations.logout.title": "登出?", + "confirmations.missing_alt_text.confirm": "新增替代文字", + "confirmations.missing_alt_text.message": "你的貼文尚未附上替代文字。新增描述有助更多人存取其內容。", "confirmations.mute.confirm": "靜音", + "confirmations.quiet_post_quote_info.dismiss": "不再提醒", + "confirmations.quiet_post_quote_info.got_it": "知道了", "confirmations.redraft.confirm": "刪除並編輯", "confirmations.redraft.message": "你確定要移除並重新起草這篇帖文嗎?你將會失去最愛和轉推,而回覆也會與原始帖文斷開連接。", + "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": "撤回請求", + "confirmations.withdraw_request.title": "撤回追蹤{name}的請求?", "content_warning.hide": "隱藏嘟文", "content_warning.show": "仍要顯示", "content_warning.show_more": "顯示更多", @@ -432,6 +458,8 @@ "navigation_bar.follows_and_followers": "追蹤及追蹤者", "navigation_bar.import_export": "匯入及匯出", "navigation_bar.lists": "列表", + "navigation_bar.live_feed_local": "即時動態(本地)", + "navigation_bar.live_feed_public": "即時動態(公開)", "navigation_bar.logout": "登出", "navigation_bar.more": "更多", "navigation_bar.mutes": "靜音名單", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 6164df4ed..924edc7fb 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -173,6 +173,8 @@ "column.edit_list": "編輯列表", "column.favourites": "最愛", "column.firehose": "即時內容", + "column.firehose_local": "本站伺服器之即時內容", + "column.firehose_singular": "即時內容", "column.follow_requests": "跟隨請求", "column.home": "首頁", "column.list_members": "管理列表成員", @@ -192,6 +194,7 @@ "community.column_settings.local_only": "只顯示本站", "community.column_settings.media_only": "只顯示媒體", "community.column_settings.remote_only": "只顯示遠端", + "compose.error.blank_post": "嘟文無法為空白。", "compose.language.change": "變更語言", "compose.language.search": "搜尋語言...", "compose.published.body": "發嘟成功。", @@ -244,6 +247,11 @@ "confirmations.missing_alt_text.secondary": "仍要發嘟", "confirmations.missing_alt_text.title": "是否新增 ALT 說明文字?", "confirmations.mute.confirm": "靜音", + "confirmations.private_quote_notify.cancel": "返回至編輯", + "confirmations.private_quote_notify.confirm": "發表嘟文", + "confirmations.private_quote_notify.do_not_show_again": "不再顯示此訊息", + "confirmations.private_quote_notify.message": "您所引用與提及之使用者將被通知且能檢視您的嘟文,即便他們並無跟隨您。", + "confirmations.private_quote_notify.title": "是否和跟隨者與提及使用者分享此內容?", "confirmations.quiet_post_quote_info.dismiss": "不要再提醒我", "confirmations.quiet_post_quote_info.got_it": "了解", "confirmations.quiet_post_quote_info.message": "當引用不於公開時間軸顯示之嘟文時,您的嘟文將自熱門時間軸隱藏。", @@ -333,6 +341,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": "您還沒有加過任何嘟文至最愛。當您收藏嘟文時,它將於此顯示。", @@ -601,8 +610,8 @@ "notification.annual_report.view": "檢視 #Wrapstodon", "notification.favourite": "{name} 已將您的嘟文加入最愛", "notification.favourite.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的嘟文加入最愛", - "notification.favourite_pm": "{name} 將您的私人提及加入最愛", - "notification.favourite_pm.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的私人提及加入最愛", + "notification.favourite_pm": "{name} 將您的私訊加入最愛", + "notification.favourite_pm.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的私訊加入最愛", "notification.follow": "{name} 已跟隨您", "notification.follow.name_and_others": "{name} 與{count, plural, other {其他 # 個人}}已跟隨您", "notification.follow_request": "{name} 要求跟隨您", @@ -755,6 +764,7 @@ "privacy_policy.title": "隱私權政策", "quote_error.edit": "編輯嘟文時無法新增引用嘟文。", "quote_error.poll": "無法引用投票嘟文。", + "quote_error.private_mentions": "無法引用私訊嘟文。", "quote_error.quote": "一次僅能引用一則嘟文。", "quote_error.unauthorized": "您不被授權允許引用此嘟文。", "quote_error.upload": "無法引用多媒體內容嘟文。", @@ -908,9 +918,12 @@ "status.pin": "釘選至個人檔案頁面", "status.quote": "引用", "status.quote.cancel": "取消引用嘟文", + "status.quote_error.blocked_account_hint.title": "由於您已封鎖 @{name},此嘟文已被隱藏。", + "status.quote_error.blocked_domain_hint.title": "由於您已封鎖 {domain},此嘟文已被隱藏。", "status.quote_error.filtered": "由於您的過濾器,該嘟文被隱藏", "status.quote_error.limited_account_hint.action": "仍要顯示", "status.quote_error.limited_account_hint.title": "此個人檔案已被 {domain} 的管理員隱藏。", + "status.quote_error.muted_account_hint.title": "由於您已靜音 @{name},此嘟文已被隱藏。", "status.quote_error.not_available": "無法取得該嘟文", "status.quote_error.pending_approval": "嘟文正在等候審核中", "status.quote_error.pending_approval_popout.body": "您能於 Mastodon 控制是否允許引用您的嘟文。此嘟文正在等待原始作者審核。", @@ -1005,8 +1018,10 @@ "video.volume_down": "降低音量", "video.volume_up": "提高音量", "visibility_modal.button_title": "設定可見性", + "visibility_modal.direct_quote_warning.text": "若您儲存目前設定,引用嘟文將被轉為連結。", + "visibility_modal.direct_quote_warning.title": "引用嘟文無法被內嵌於私訊中", "visibility_modal.header": "可見性與互動", - "visibility_modal.helper.direct_quoting": "Mastodon 上發佈之私人提及嘟文無法被其他使用者引用。", + "visibility_modal.helper.direct_quoting": "Mastodon 上發佈之私訊嘟文無法被其他使用者引用。", "visibility_modal.helper.privacy_editing": "嘟文發布後無法變更可見性。", "visibility_modal.helper.privacy_private_self_quote": "自我引用之私嘟無法設為公開可見。", "visibility_modal.helper.private_quoting": "Mastodon 上發佈之僅限跟隨者嘟文無法被其他使用者引用。", diff --git a/app/javascript/mastodon/main.tsx b/app/javascript/mastodon/main.tsx index 456cc21c3..f89baf66c 100644 --- a/app/javascript/mastodon/main.tsx +++ b/app/javascript/mastodon/main.tsx @@ -9,11 +9,8 @@ import { me, reduceMotion } from 'mastodon/initial_state'; import ready from 'mastodon/ready'; import { store } from 'mastodon/store'; -import { - isProduction, - isDevelopment, - isModernEmojiEnabled, -} from './utils/environment'; +import { initializeEmoji } from './features/emoji'; +import { isProduction, isDevelopment } from './utils/environment'; function main() { perf.start('main()'); @@ -33,10 +30,7 @@ function main() { }); } - if (isModernEmojiEnabled()) { - const { initializeEmoji } = await import('@/mastodon/features/emoji'); - initializeEmoji(); - } + initializeEmoji(); const root = createRoot(mountNode); root.render(); diff --git a/app/javascript/mastodon/models/account.ts b/app/javascript/mastodon/models/account.ts index 3b0c41be8..8fbc0cdf4 100644 --- a/app/javascript/mastodon/models/account.ts +++ b/app/javascript/mastodon/models/account.ts @@ -8,11 +8,10 @@ import type { ApiAccountRoleJSON, ApiAccountJSON, } from 'mastodon/api_types/accounts'; -import emojify from 'mastodon/features/emoji/emoji'; import { unescapeHTML } from 'mastodon/utils/html'; -import { CustomEmojiFactory, makeEmojiMap } from './custom_emoji'; -import type { CustomEmoji, EmojiMap } from './custom_emoji'; +import { CustomEmojiFactory } from './custom_emoji'; +import type { CustomEmoji } from './custom_emoji'; // AccountField interface AccountFieldShape extends Required { @@ -102,17 +101,11 @@ export const accountDefaultValues: AccountShape = { const AccountFactory = ImmutableRecord(accountDefaultValues); -function createAccountField( - jsonField: ApiAccountFieldJSON, - emojiMap: EmojiMap, -) { +function createAccountField(jsonField: ApiAccountFieldJSON) { return AccountFieldFactory({ ...jsonField, - name_emojified: emojify( - escapeTextContentForBrowser(jsonField.name), - emojiMap, - ), - value_emojified: emojify(jsonField.value, emojiMap), + name_emojified: escapeTextContentForBrowser(jsonField.name), + value_emojified: jsonField.value, value_plain: unescapeHTML(jsonField.value), }); } @@ -120,8 +113,6 @@ function createAccountField( export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) { const { moved, ...accountJSON } = serverJSON; - const emojiMap = makeEmojiMap(accountJSON.emojis); - const displayName = accountJSON.display_name.trim().length === 0 ? accountJSON.username @@ -134,7 +125,7 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) { ...accountJSON, moved: moved?.id, fields: ImmutableList( - serverJSON.fields.map((field) => createAccountField(field, emojiMap)), + serverJSON.fields.map((field) => createAccountField(field)), ), emojis: ImmutableList( serverJSON.emojis.map((emoji) => CustomEmojiFactory(emoji)), @@ -142,11 +133,8 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) { roles: ImmutableList( serverJSON.roles?.map((role) => AccountRoleFactory(role)), ), - display_name_html: emojify( - escapeTextContentForBrowser(displayName), - emojiMap, - ), - note_emojified: emojify(accountNote, emojiMap), + display_name_html: escapeTextContentForBrowser(displayName), + note_emojified: accountNote, note_plain: unescapeHTML(accountNote), url: accountJSON.url?.startsWith('http://') || diff --git a/app/javascript/mastodon/models/poll.ts b/app/javascript/mastodon/models/poll.ts index 6f5655680..46cbb1111 100644 --- a/app/javascript/mastodon/models/poll.ts +++ b/app/javascript/mastodon/models/poll.ts @@ -1,10 +1,9 @@ import escapeTextContentForBrowser from 'escape-html'; import type { ApiPollJSON, ApiPollOptionJSON } from 'mastodon/api_types/polls'; -import emojify from 'mastodon/features/emoji/emoji'; -import { CustomEmojiFactory, makeEmojiMap } from './custom_emoji'; -import type { CustomEmoji, EmojiMap } from './custom_emoji'; +import { CustomEmojiFactory } from './custom_emoji'; +import type { CustomEmoji } from './custom_emoji'; interface PollOptionTranslation { title: string; @@ -17,16 +16,12 @@ export interface PollOption extends ApiPollOptionJSON { translation: PollOptionTranslation | null; } -export function createPollOptionTranslationFromServerJSON( - translation: { title: string }, - emojiMap: EmojiMap, -) { +export function createPollOptionTranslationFromServerJSON(translation: { + title: string; +}) { return { ...translation, - titleHtml: emojify( - escapeTextContentForBrowser(translation.title), - emojiMap, - ), + titleHtml: escapeTextContentForBrowser(translation.title), } as PollOptionTranslation; } @@ -50,8 +45,6 @@ export function createPollFromServerJSON( serverJSON: ApiPollJSON, previousPoll?: Poll, ) { - const emojiMap = makeEmojiMap(serverJSON.emojis); - return { ...pollDefaultValues, ...serverJSON, @@ -60,20 +53,15 @@ export function createPollFromServerJSON( const option = { ...optionJSON, voted: serverJSON.own_votes?.includes(index) || false, - titleHtml: emojify( - escapeTextContentForBrowser(optionJSON.title), - emojiMap, - ), + titleHtml: escapeTextContentForBrowser(optionJSON.title), } as PollOption; const prevOption = previousPoll?.options[index]; if (prevOption?.translation && prevOption.title === option.title) { const { translation } = prevOption; - option.translation = createPollOptionTranslationFromServerJSON( - translation, - emojiMap, - ); + option.translation = + createPollOptionTranslationFromServerJSON(translation); } return option; diff --git a/app/javascript/mastodon/permissions.ts b/app/javascript/mastodon/permissions.ts index d7695d2f5..a83e1d77a 100644 --- a/app/javascript/mastodon/permissions.ts +++ b/app/javascript/mastodon/permissions.ts @@ -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; + } +}; diff --git a/app/javascript/mastodon/polyfills/index.ts b/app/javascript/mastodon/polyfills/index.ts index 1abfe0a93..00da2042e 100644 --- a/app/javascript/mastodon/polyfills/index.ts +++ b/app/javascript/mastodon/polyfills/index.ts @@ -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; diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index f27c3bb06..e4cb9ac0e 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -1,11 +1,14 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; import { + changeComposeVisibility, changeUploadCompose, quoteCompose, quoteComposeCancel, setComposeQuotePolicy, -} from 'mastodon/actions/compose_typed'; + pasteLinkCompose, + cancelPasteLinkCompose, +} from '@/mastodon/actions/compose_typed'; import { timelineDelete } from 'mastodon/actions/timelines_typed'; import { @@ -38,7 +41,6 @@ import { COMPOSE_SENSITIVITY_CHANGE, COMPOSE_SPOILERNESS_CHANGE, COMPOSE_SPOILER_TEXT_CHANGE, - COMPOSE_VISIBILITY_CHANGE, COMPOSE_LANGUAGE_CHANGE, COMPOSE_COMPOSING_CHANGE, COMPOSE_EMOJI_INSERT, @@ -93,6 +95,7 @@ const initialState = ImmutableMap({ quoted_status_id: null, quote_policy: 'public', default_quote_policy: 'public', // Set in hydration. + fetching_link: null, }); const initialPoll = ImmutableMap({ @@ -315,7 +318,11 @@ const calculateProgress = (loaded, total) => Math.min(Math.round((loaded / total /** @type {import('@reduxjs/toolkit').Reducer} */ export const composeReducer = (state = initialState, action) => { - if (changeUploadCompose.fulfilled.match(action)) { + if (changeComposeVisibility.match(action)) { + return state + .set('privacy', action.payload) + .set('idempotencyKey', uuid()); + } else if (changeUploadCompose.fulfilled.match(action)) { return state .set('is_changing_upload', false) .update('media_attachments', list => list.map(item => { @@ -331,15 +338,27 @@ export const composeReducer = (state = initialState, action) => { return state.set('is_changing_upload', false); } else if (quoteCompose.match(action)) { const status = action.payload; + const isDirect = state.get('privacy') === 'direct'; return state - .set('quoted_status_id', status.get('id')) + .set('quoted_status_id', isDirect ? null : status.get('id')) .set('spoiler', status.get('sensitive')) .set('spoiler_text', status.get('spoiler_text')) - .update('privacy', (visibility) => ['public', 'unlisted'].includes(visibility) && status.get('visibility') === 'private' ? 'private' : visibility); + .update('privacy', (visibility) => { + if (['public', 'unlisted'].includes(visibility) && status.get('visibility') === 'private') { + return 'private'; + } + return visibility; + }); } else if (quoteComposeCancel.match(action)) { return state.set('quoted_status_id', null); } else if (setComposeQuotePolicy.match(action)) { return state.set('quote_policy', action.payload); + } else if (pasteLinkCompose.pending.match(action)) { + return state.set('fetching_link', action.meta.requestId); + } else if (pasteLinkCompose.fulfilled.match(action) || pasteLinkCompose.rejected.match(action)) { + return action.meta.requestId === state.get('fetching_link') ? state.set('fetching_link', null) : state; + } else if (cancelPasteLinkCompose.match(action)) { + return state.set('fetching_link', null); } switch(action.type) { @@ -383,10 +402,6 @@ export const composeReducer = (state = initialState, action) => { return state .set('spoiler_text', action.text) .set('idempotencyKey', uuid()); - case COMPOSE_VISIBILITY_CHANGE: - return state - .set('privacy', action.value) - .set('idempotencyKey', uuid()); case COMPOSE_CHANGE: return state .set('text', action.text) diff --git a/app/javascript/mastodon/reducers/polls.ts b/app/javascript/mastodon/reducers/polls.ts index aadf6741c..ac0917bd2 100644 --- a/app/javascript/mastodon/reducers/polls.ts +++ b/app/javascript/mastodon/reducers/polls.ts @@ -1,7 +1,6 @@ import type { Reducer } from '@reduxjs/toolkit'; import { importPolls } from 'mastodon/actions/importer/polls'; -import { makeEmojiMap } from 'mastodon/models/custom_emoji'; import { createPollOptionTranslationFromServerJSON } from 'mastodon/models/poll'; import type { Poll } from 'mastodon/models/poll'; @@ -20,16 +19,11 @@ const statusTranslateSuccess = (state: PollsState, pollTranslation?: Poll) => { if (!poll) return; - const emojiMap = makeEmojiMap(poll.emojis); - pollTranslation.options.forEach((item, index) => { const option = poll.options[index]; if (!option) return; - option.translation = createPollOptionTranslationFromServerJSON( - item, - emojiMap, - ); + option.translation = createPollOptionTranslationFromServerJSON(item); }); }; diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index 4d7341b0c..5ceb05909 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -42,7 +42,7 @@ interface AppThunkConfig { } export type AppThunkApi = Pick< GetThunkAPI, - 'getState' | 'dispatch' + 'getState' | 'dispatch' | 'requestId' >; interface AppThunkOptions { @@ -60,7 +60,7 @@ type AppThunk = ( type AppThunkCreator = ( arg: Arg, - api: AppThunkApi, + api: Pick, extra?: ExtraArg, ) => Returned; @@ -143,10 +143,10 @@ export function createAsyncThunk( name, async ( arg: Arg, - { getState, dispatch, fulfillWithValue, rejectWithValue }, + { getState, dispatch, requestId, fulfillWithValue, rejectWithValue }, ) => { try { - const result = await creator(arg, { dispatch, getState }); + const result = await creator(arg, { dispatch, getState, requestId }); return fulfillWithValue(result, { useLoadingBar: options.useLoadingBar, @@ -280,10 +280,11 @@ export function createDataLoadingThunk< return createAsyncThunk( name, - async (arg, { getState, dispatch }) => { + async (arg, { getState, dispatch, requestId }) => { const data = await loadData(arg, { dispatch, getState, + requestId, }); if (!onData) return data as Returned; @@ -291,6 +292,7 @@ export function createDataLoadingThunk< const result = await onData(data, { dispatch, getState, + requestId, discardLoadData: discardLoadDataInPayload, actionArg: arg, }); diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js index 59b2fd758..27fbc25ba 100644 --- a/app/javascript/mastodon/stream.js +++ b/app/javascript/mastodon/stream.js @@ -138,10 +138,15 @@ const channelNameWithInlineParams = (channelName, params) => { return `${channelName}&${Object.keys(params).map(key => `${key}=${params[key]}`).join('&')}`; }; +/** + * @typedef {import('mastodon/store').AppDispatch} Dispatch + * @typedef {import('mastodon/store').GetState} GetState + */ + /** * @param {string} channelName * @param {Object.} params - * @param {function(Function, Function): { onConnect: (function(): void), onReceive: (function(StreamEvent): void), onDisconnect: (function(): void) }} callbacks + * @param {function(Dispatch, GetState): { onConnect: (function(): void), onReceive: (function(StreamEvent): void), onDisconnect: (function(): void) }} callbacks * @returns {function(): void} */ // @ts-expect-error @@ -229,7 +234,7 @@ const handleEventSourceMessage = (e, received) => { * @param {string} streamingAPIBaseURL * @param {string} accessToken * @param {string} channelName - * @param {{ connected: Function, received: function(StreamEvent): void, disconnected: Function, reconnected: Function }} callbacks + * @param {{ connected: function(): void, received: function(StreamEvent): void, disconnected: function(): void, reconnected: function(): void }} callbacks * @returns {WebSocketClient | EventSource} */ const createConnection = (streamingAPIBaseURL, accessToken, channelName, { connected, received, disconnected, reconnected }) => { @@ -242,12 +247,9 @@ const createConnection = (streamingAPIBaseURL, accessToken, channelName, { conne // @ts-expect-error const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`, accessToken); - // @ts-expect-error ws.onopen = connected; ws.onmessage = e => received(JSON.parse(e.data)); - // @ts-expect-error ws.onclose = disconnected; - // @ts-expect-error ws.onreconnect = reconnected; return ws; diff --git a/app/javascript/mastodon/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts index c2b6b1cf8..95075454f 100644 --- a/app/javascript/mastodon/utils/environment.ts +++ b/app/javascript/mastodon/utils/environment.ts @@ -12,16 +12,8 @@ export function isProduction() { else return import.meta.env.PROD; } -export type Features = 'modern_emojis' | 'fasp' | 'http_message_signatures'; +export type Features = 'fasp' | 'http_message_signatures'; export function isFeatureEnabled(feature: Features) { return initialState?.features.includes(feature) ?? false; } - -export function isModernEmojiEnabled() { - try { - return isFeatureEnabled('modern_emojis'); - } catch { - return false; - } -} diff --git a/app/javascript/material-icons/400-24px/audio.svg b/app/javascript/material-icons/400-24px/audio.svg new file mode 100644 index 000000000..417e47c18 --- /dev/null +++ b/app/javascript/material-icons/400-24px/audio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 6a5008909..b5cb56d42 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1309,6 +1309,10 @@ a.sparkline { line-height: 1; width: 100%; animation: skeleton 1.2s ease-in-out infinite; + + .reduce-motion & { + animation: none; + } } @keyframes skeleton { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 78c711c55..4eed2ebe1 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -775,16 +775,43 @@ padding: 8px; } - &__preview { + &__preview, + &__visualizer { position: absolute; width: 100%; height: 100%; - border-radius: 6px; z-index: -1; top: 0; + } + + &__preview { + border-radius: 6px; inset-inline-start: 0; } + &__visualizer { + padding: 16px; + box-sizing: border-box; + + .audio-player__visualizer { + margin: 0 auto; + display: block; + height: 100%; + } + + .icon { + position: absolute; + top: 50%; + inset-inline-start: 50%; + transform: translate(-50%, -50%); + opacity: 0.75; + color: var(--player-foreground-color); + filter: var(--overlay-icon-shadow); + width: 48px; + height: 48px; + } + } + &__thumbnail { width: 100%; height: 100%; @@ -4031,6 +4058,7 @@ a.account__display-name { background: lighten($ui-highlight-color, 5%); } +.follow_requests-unlocked_explanation, .switch-to-advanced { color: $light-text-color; background-color: $ui-base-color; @@ -4041,7 +4069,7 @@ a.account__display-name { font-size: 13px; line-height: 18px; - .switch-to-advanced__toggle { + a { color: $ui-button-tertiary-color; font-weight: bold; } @@ -5223,8 +5251,7 @@ a.status-card { } } -.empty-column-indicator, -.follow_requests-unlocked_explanation { +.empty-column-indicator { color: $dark-text-color; text-align: center; padding: 20px; @@ -5263,10 +5290,8 @@ a.status-card { } .follow_requests-unlocked_explanation { - background: var(--surface-background-color); - border-bottom: 1px solid var(--background-border-color); - contain: initial; - flex-grow: 0; + margin: 16px; + margin-bottom: 0; } .error-column { @@ -5745,6 +5770,34 @@ a.status-card { } } +.visibility-modal { + &__quote-warning { + color: var(--nested-card-text); + background: + /* This is a bit of a silly hack for layering two background colours + * since --nested-card-background is too transparent for a tooltip */ + linear-gradient( + var(--nested-card-background), + var(--nested-card-background) + ), + linear-gradient(var(--background-color), var(--background-color)); + border: var(--nested-card-border); + padding: 16px; + border-radius: 4px; + + h3 { + font-weight: 500; + margin-bottom: 4px; + color: $darker-text-color; + } + + p { + font-size: 0.8em; + color: $dark-text-color; + } + } +} + .visibility-dropdown { &__overlay[data-popper-placement] { z-index: 9999; @@ -9368,19 +9421,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 +9437,7 @@ noscript { font-size: 12px; font-weight: 500; line-height: 16px; + flex-shrink: 0; } &__author-link { diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 4ab7ca4a8..7f2d685b3 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class ActivityPub::Activity::Create < ActivityPub::Activity - include FormattingHelper - def perform @account.schedule_refresh_if_stale! @@ -99,9 +97,9 @@ class ActivityPub::Activity::Create < ActivityPub::Activity uri: @status_parser.uri, url: @status_parser.url || @status_parser.uri, account: @account, - text: converted_object_type? ? converted_text : (@status_parser.text || ''), + text: @status_parser.processed_text, language: @status_parser.language, - spoiler_text: converted_object_type? ? '' : (@status_parser.spoiler_text || ''), + spoiler_text: @status_parser.processed_spoiler_text, created_at: @status_parser.created_at, edited_at: @status_parser.edited_at && @status_parser.edited_at != @status_parser.created_at ? @status_parser.edited_at : nil, override_timestamps: @options[:override_timestamps], @@ -405,18 +403,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity value_or_id(@object['inReplyTo']) end - def converted_text - [formatted_title, @status_parser.spoiler_text.presence, formatted_url].compact.join("\n\n") - end - - def formatted_title - "

#{@status_parser.title}

" if @status_parser.title.present? - end - - def formatted_url - linkify(@status_parser.url || @status_parser.uri) - end - def unsupported_media_type?(mime_type) mime_type.present? && !MediaAttachment.supported_mime_types.include?(mime_type) end diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb index 15025ca5e..f158626db 100644 --- a/app/lib/activitypub/activity/update.rb +++ b/app/lib/activitypub/activity/update.rb @@ -8,10 +8,8 @@ class ActivityPub::Activity::Update < ActivityPub::Activity if equals_or_includes_any?(@object['type'], %w(Application Group Organization Person Service)) update_account - elsif equals_or_includes_any?(@object['type'], %w(Note Question)) + elsif supported_object_type? || converted_object_type? update_status - elsif converted_object_type? - Status.find_by(uri: object_uri, account_id: @account.id) end end diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb index 57e6cb926..83f03756e 100644 --- a/app/lib/activitypub/parser/status_parser.rb +++ b/app/lib/activitypub/parser/status_parser.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true class ActivityPub::Parser::StatusParser + include FormattingHelper include JsonLdHelper NORMALIZED_LOCALE_NAMES = LanguagesHelper::SUPPORTED_LOCALES.keys.index_by(&:downcase).freeze @@ -44,6 +45,16 @@ class ActivityPub::Parser::StatusParser end end + def processed_text + return text || '' unless converted_object_type? + + [ + title.presence && "

#{title}

", + spoiler_text.presence, + linkify(url || uri), + ].compact.join("\n\n") + end + def spoiler_text if @object['summary'].present? @object['summary'] @@ -52,6 +63,12 @@ class ActivityPub::Parser::StatusParser end end + def processed_spoiler_text + return '' if converted_object_type? + + spoiler_text || '' + end + def title if @object['name'].present? @object['name'] @@ -145,6 +162,10 @@ class ActivityPub::Parser::StatusParser as_array(@object['quoteAuthorization']).first end + def converted_object_type? + equals_or_includes_any?(@object['type'], ActivityPub::Activity::CONVERTED_TYPES) + end + private def quote_subpolicy(subpolicy) diff --git a/app/lib/extractor.rb b/app/lib/extractor.rb index 7e647a758..206d989bf 100644 --- a/app/lib/extractor.rb +++ b/app/lib/extractor.rb @@ -54,7 +54,7 @@ module Extractor end def extract_hashtags_with_indices(text, _options = {}) - return [] unless text&.index('#') + return [] unless text&.index(/[##]/) possible_entries = [] diff --git a/app/lib/signed_request.rb b/app/lib/signed_request.rb index ca86460e6..d8887d959 100644 --- a/app/lib/signed_request.rb +++ b/app/lib/signed_request.rb @@ -238,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) diff --git a/app/lib/status_cache_hydrator.rb b/app/lib/status_cache_hydrator.rb index 5ba706c4c..be425e129 100644 --- a/app/lib/status_cache_hydrator.rb +++ b/app/lib/status_cache_hydrator.rb @@ -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 @@ -97,12 +98,12 @@ class StatusCacheHydrator if quote.quoted_status.nil? payload[nested ? :quoted_status_id : :quoted_status] = nil payload[:state] = 'deleted' - elsif StatusFilter.new(quote.quoted_status, Account.find_by(id: account_id)).filtered_for_quote? - payload[nested ? :quoted_status_id : :quoted_status] = nil - payload[:state] = 'unauthorized' else - payload[:state] = 'accepted' - if nested + filter_state = StatusFilter.new(quote.quoted_status, Account.find_by(id: account_id)).filter_state_for_quote + payload[:state] = filter_state || 'accepted' + if filter_state == 'unauthorized' + payload[nested ? :quoted_status_id : :quoted_status] = nil + elsif nested payload[:quoted_status_id] = quote.quoted_status_id&.to_s else payload[:quoted_status] = StatusCacheHydrator.new(quote.quoted_status).hydrate(account_id, nested: true) diff --git a/app/lib/status_filter.rb b/app/lib/status_filter.rb index dbf7d28b6..2313e1407 100644 --- a/app/lib/status_filter.rb +++ b/app/lib/status_filter.rb @@ -15,10 +15,18 @@ class StatusFilter blocked_by_policy? || (account_present? && filtered_status?) || silenced_account? end - def filtered_for_quote? - return false if !account.nil? && account.id == status.account_id - - blocked_by_policy? || (account_present? && filtered_status?) + def filter_state_for_quote + if !account.nil? && account.id == status.account_id + nil + elsif blocked_by_policy? + 'unauthorized' + elsif account_present? && blocking_domain? + 'blocked_domain' + elsif account_present? && blocking_account? + 'blocked_account' + elsif account_present? && muting_account? + 'muted_account' + end end private diff --git a/app/lib/vacuum/media_attachments_vacuum.rb b/app/lib/vacuum/media_attachments_vacuum.rb index e55819529..f9dc62d86 100644 --- a/app/lib/vacuum/media_attachments_vacuum.rb +++ b/app/lib/vacuum/media_attachments_vacuum.rb @@ -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 diff --git a/app/lib/vacuum/preview_cards_vacuum.rb b/app/lib/vacuum/preview_cards_vacuum.rb index 9e34c87c3..cc1c9efba 100644 --- a/app/lib/vacuum/preview_cards_vacuum.rb +++ b/app/lib/vacuum/preview_cards_vacuum.rb @@ -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 diff --git a/app/models/concerns/status/fetch_replies_concern.rb b/app/models/concerns/status/fetch_replies_concern.rb index 7ab464817..6d65fe41c 100644 --- a/app/models/concerns/status/fetch_replies_concern.rb +++ b/app/models/concerns/status/fetch_replies_concern.rb @@ -4,8 +4,10 @@ module Status::FetchRepliesConcern extend ActiveSupport::Concern # debounce fetching all replies to minimize DoS - FETCH_REPLIES_COOLDOWN_MINUTES = (ENV['FETCH_REPLIES_COOLDOWN_MINUTES'] || 15).to_i.minutes - FETCH_REPLIES_INITIAL_WAIT_MINUTES = (ENV['FETCH_REPLIES_INITIAL_WAIT_MINUTES'] || 5).to_i.minutes + # Period to wait between fetching replies + FETCH_REPLIES_COOLDOWN_MINUTES = 15.minutes + # Period to wait after a post is first created before fetching its replies + FETCH_REPLIES_INITIAL_WAIT_MINUTES = 5.minutes included do scope :created_recently, -> { where(created_at: FETCH_REPLIES_INITIAL_WAIT_MINUTES.ago..) } diff --git a/app/models/export.rb b/app/models/export.rb index 6ed9f60c7..b430a2a0d 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -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 diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 60bd1eb38..b8f12f508 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -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 reject_pattern ).freeze @@ -62,7 +62,6 @@ class Form::AdminSettings preview_sensitive_media profile_directory trends - trends_as_landing_page trendable_by_default noindex require_invite_text @@ -88,7 +87,9 @@ 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 + ALTERNATE_FEED_ACCESS_MODES = %w(public authenticated).freeze + LANDING_PAGE = %w(trends about local_feed).freeze attr_accessor(*KEYS) @@ -100,7 +101,7 @@ class Form::AdminSettings validates :show_domain_blocks_rationale, inclusion: { in: DOMAIN_BLOCK_AUDIENCES }, if: -> { defined?(@show_domain_blocks_rationale) } validates :local_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_live_feed_access) } validates :remote_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_live_feed_access) } - validates :local_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_topic_feed_access) } + validates :local_topic_feed_access, inclusion: { in: ALTERNATE_FEED_ACCESS_MODES }, if: -> { defined?(@local_topic_feed_access) } validates :remote_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_topic_feed_access) } validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) } validates :min_age, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@min_age) } @@ -108,6 +109,7 @@ class Form::AdminSettings validates :reject_pattern, regexp_syntax: true, if: -> { defined?(@reject_pattern) } 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 diff --git a/app/models/link_feed.rb b/app/models/link_feed.rb index 29ea430cc..4554796cc 100644 --- a/app/models/link_feed.rb +++ b/app/models/link_feed.rb @@ -15,18 +15,30 @@ class LinkFeed < PublicFeed # @param [Integer] min_id # @return [Array] 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 diff --git a/app/models/public_feed.rb b/app/models/public_feed.rb index ba9473db0..92efc0f7e 100644 --- a/app/models/public_feed.rb +++ b/app/models/public_feed.rb @@ -19,6 +19,8 @@ class PublicFeed # @param [Integer] min_id # @return [Array] 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? diff --git a/app/models/tag.rb b/app/models/tag.rb index dff101111..f9eb6bfd3 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -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{(?] def get(limit, max_id = nil, since_id = nil, min_id = nil) + return [] if incompatible_feed_settings? + scope = public_scope scope.merge!(tagged_with_any_scope) @@ -38,6 +40,14 @@ class TagFeed < PublicFeed private + def local_feed_setting + Setting.local_topic_feed_access + end + + def remote_feed_setting + Setting.remote_topic_feed_access + end + def tagged_with_any_scope Status.group(:id).tagged_with(tags_for(Array(@tag.name) | Array(options[:any]))) end diff --git a/app/models/user_role.rb b/app/models/user_role.rb index d567bf5ec..31c8ff20a 100644 --- a/app/models/user_role.rb +++ b/app/models/user_role.rb @@ -36,6 +36,7 @@ class UserRole < ApplicationRecord manage_roles: (1 << 17), manage_user_access: (1 << 18), delete_user_data: (1 << 19), + view_feeds: (1 << 20), }.freeze EVERYONE_ROLE_ID = -99 @@ -67,6 +68,7 @@ class UserRole < ApplicationRecord manage_blocks manage_taxonomies manage_invites + view_feeds ).freeze, administration: %i( diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 79fcfcf79..5f8921e24 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -31,7 +31,7 @@ class InitialStateSerializer < ActiveModel::Serializer store[:use_blurhash] = object_account_user.setting_use_blurhash store[:use_pending_items] = object_account_user.setting_use_pending_items store[:show_trends] = Setting.trends && object_account_user.setting_trends - store[:emoji_style] = object_account_user.settings['web.emoji_style'] if Mastodon::Feature.modern_emojis_enabled? + store[:emoji_style] = object_account_user.settings['web.emoji_style'] else store[:auto_play_gif] = Setting.auto_play_gif store[:display_media] = Setting.display_media @@ -113,7 +113,7 @@ class InitialStateSerializer < ActiveModel::Serializer status_page_url: Setting.status_page_url, streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, title: instance_presenter.title, - trends_as_landing_page: Setting.trends_as_landing_page, + landing_page: Setting.landing_page, trends_enabled: Setting.trends, version: instance_presenter.version, terms_of_service_enabled: TermsOfService.current.present?, diff --git a/app/serializers/rest/base_quote_serializer.rb b/app/serializers/rest/base_quote_serializer.rb index 2637014b6..ac3b545d5 100644 --- a/app/serializers/rest/base_quote_serializer.rb +++ b/app/serializers/rest/base_quote_serializer.rb @@ -8,13 +8,12 @@ class REST::BaseQuoteSerializer < ActiveModel::Serializer # Extra states when a status is unavailable return 'deleted' if object.quoted_status.nil? - return 'unauthorized' if status_filter.filtered_for_quote? - object.state + status_filter.filter_state_for_quote || object.state end def quoted_status - object.quoted_status if object.accepted? && object.quoted_status.present? && !object.quoted_status&.reblog? && !status_filter.filtered_for_quote? + object.quoted_status if object.accepted? && object.quoted_status.present? && !object.quoted_status&.reblog? && status_filter.filter_state_for_quote != 'unauthorized' end private diff --git a/app/serializers/rest/scheduled_status_serializer.rb b/app/serializers/rest/scheduled_status_serializer.rb index 7c54f39c0..71ddb7b3e 100644 --- a/app/serializers/rest/scheduled_status_serializer.rb +++ b/app/serializers/rest/scheduled_status_serializer.rb @@ -8,4 +8,11 @@ class REST::ScheduledStatusSerializer < ActiveModel::Serializer def id object.id.to_s end + + def params + object.params.merge( + quoted_status_id: object.params['quoted_status_id']&.to_s, + quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS.keys.find { |key| object.params['quote_approval_policy']&.anybits?(Status::QUOTE_APPROVAL_POLICY_FLAGS[key] << 16) }&.to_s || 'nobody' + ) + end end diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index a06ddc686..96751fbd5 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -168,9 +168,9 @@ class REST::StatusSerializer < ActiveModel::Serializer def quote_approval { - automatic: object.quote_policy_as_keys(:automatic), - manual: object.quote_policy_as_keys(:manual), - current_user: object.quote_policy_for_account(current_user&.account), + automatic: object.proper.quote_policy_as_keys(:automatic), + manual: object.proper.quote_policy_as_keys(:manual), + current_user: object.proper.quote_policy_for_account(current_user&.account), } end diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 6f70d530b..6c24c5da8 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -6,7 +6,7 @@ class AccountSearchService < BaseService MENTION_ONLY_RE = /\A#{Account::MENTION_RE}\z/i # Min. number of characters to look for non-exact matches - MIN_QUERY_LENGTH = 5 + MIN_QUERY_LENGTH = 3 class QueryBuilder def initialize(query, account, options = {}) @@ -256,7 +256,7 @@ class AccountSearchService < BaseService ActiveRecord::Associations::Preloader.new(records: records, associations: [:account_stat, { user: :role }]).call records - rescue Faraday::ConnectionFailed, Parslet::ParseFailed + rescue Faraday::ConnectionFailed, Parslet::ParseFailed, Errno::ENETUNREACH nil end diff --git a/app/services/activitypub/fetch_all_replies_service.rb b/app/services/activitypub/fetch_all_replies_service.rb index b771b8452..a956e7c70 100644 --- a/app/services/activitypub/fetch_all_replies_service.rb +++ b/app/services/activitypub/fetch_all_replies_service.rb @@ -3,8 +3,8 @@ class ActivityPub::FetchAllRepliesService < ActivityPub::FetchRepliesService include JsonLdHelper - # Limit of replies to fetch per status - MAX_REPLIES = (ENV['FETCH_REPLIES_MAX_SINGLE'] || 500).to_i + # Max number of replies to fetch - for a single post + MAX_REPLIES = 500 def call(status_uri, collection_or_uri, max_pages: 1, batch_id: nil, request_id: nil) @status_uri = status_uri diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index 976dea71f..32a2dfe02 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -20,7 +20,6 @@ class ActivityPub::ProcessStatusUpdateService < BaseService @request_id = request_id @quote = nil - # Only native types can be updated at the moment return @status if !expected_type? || already_updated_more_recently? if @status_parser.edited_at.present? && (@status.edited_at.nil? || @status_parser.edited_at > @status.edited_at) @@ -170,8 +169,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService end def update_immediate_attributes! - @status.text = @status_parser.text || '' - @status.spoiler_text = @status_parser.spoiler_text || '' + @status.text = @status_parser.processed_text + @status.spoiler_text = @status_parser.processed_spoiler_text @status.sensitive = @account.sensitized? || @status_parser.sensitive || false @status.language = @status_parser.language @@ -353,7 +352,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService end def expected_type? - equals_or_includes_any?(@json['type'], %w(Note Question)) + equals_or_includes_any?(@json['type'], ActivityPub::Activity::SUPPORTED_TYPES) || equals_or_includes_any?(@json['type'], ActivityPub::Activity::CONVERTED_TYPES) end def record_previous_edit! diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index c55a54df3..3e4a71522 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -80,6 +80,7 @@ class PostStatusService < BaseService @status = @account.statuses.new(status_attributes) process_mentions_service.call(@status, save_records: false) safeguard_mentions!(@status) + safeguard_private_mention_quote!(@status) attach_quote!(@status) antispam = Antispam.new(@status) @@ -92,6 +93,16 @@ class PostStatusService < BaseService end end + def safeguard_private_mention_quote!(status) + return if @quoted_status.nil? || @visibility.to_sym != :direct + + # The mentions array test here is awkward because the relationship is not persisted at this time + return if @quoted_status.account_id == @account.id || status.mentions.to_a.any? { |mention| mention.account_id == @quoted_status.account_id && !mention.silent } + + status.errors.add(:base, I18n.t('statuses.errors.quoted_user_not_mentioned')) + raise ActiveRecord::RecordInvalid, status + end + def attach_quote!(status) return if @quoted_status.nil? @@ -114,6 +125,7 @@ class PostStatusService < BaseService def schedule_status! status_for_validation = @account.statuses.build(status_attributes) + safeguard_private_mention_quote!(status_for_validation) antispam = Antispam.new(status_for_validation) antispam.local_preflight_check! diff --git a/app/services/statuses_search_service.rb b/app/services/statuses_search_service.rb index ab8e28f61..6dec46546 100644 --- a/app/services/statuses_search_service.rb +++ b/app/services/statuses_search_service.rb @@ -32,7 +32,7 @@ class StatusesSearchService < BaseService preloaded_relations = @account.relations_map(account_ids, account_domains) results.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? } - rescue Faraday::ConnectionFailed, Parslet::ParseFailed + rescue Faraday::ConnectionFailed, Parslet::ParseFailed, Errno::ENETUNREACH [] end diff --git a/app/services/tag_search_service.rb b/app/services/tag_search_service.rb index 57400b76a..6a4af5c9a 100644 --- a/app/services/tag_search_service.rb +++ b/app/services/tag_search_service.rb @@ -30,7 +30,7 @@ class TagSearchService < BaseService definition = definition.filter(elastic_search_filter) if @options[:exclude_unreviewed] ensure_exact_match(definition.limit(@limit).offset(@offset).objects.compact) - rescue Faraday::ConnectionFailed, Parslet::ParseFailed + rescue Faraday::ConnectionFailed, Parslet::ParseFailed, Errno::ENETUNREACH nil end diff --git a/app/views/admin/settings/branding/show.html.haml b/app/views/admin/settings/branding/show.html.haml index 62e9c7245..05795a197 100644 --- a/app/views/admin/settings/branding/show.html.haml +++ b/app/views/admin/settings/branding/show.html.haml @@ -68,5 +68,12 @@ = material_symbol 'delete' = t('admin.site_uploads.delete') + .fields-row + = f.input :landing_page, + collection: f.object.class::LANDING_PAGE, + include_blank: false, + label_method: ->(page) { I18n.t("admin.settings.landing_page.values.#{page}") }, + wrapper: :with_label + .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/app/views/admin/settings/discovery/show.html.haml b/app/views/admin/settings/discovery/show.html.haml index 2620dd94b..04c242597 100644 --- a/app/views/admin/settings/discovery/show.html.haml +++ b/app/views/admin/settings/discovery/show.html.haml @@ -17,11 +17,6 @@ as: :boolean, wrapper: :with_label - .fields-group - = f.input :trends_as_landing_page, - as: :boolean, - wrapper: :with_label - .fields-group = f.input :trendable_by_default, as: :boolean, @@ -48,7 +43,7 @@ .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :local_topic_feed_access, - collection: f.object.class::FEED_ACCESS_MODES, + collection: f.object.class::ALTERNATE_FEED_ACCESS_MODES, include_blank: false, label_method: ->(mode) { I18n.t("admin.settings.feed_access.modes.#{mode}") }, wrapper: :with_label diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index e1ee4ac0b..e6e96f97d 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -31,16 +31,15 @@ label: I18n.t('simple_form.labels.defaults.setting_theme'), wrapper: :with_label - - if Mastodon::Feature.modern_emojis_enabled? - .fields-group - = f.simple_fields_for :settings, current_user.settings do |ff| - = ff.input :'web.emoji_style', - collection: %w(auto twemoji native), - include_blank: false, - hint: I18n.t('simple_form.hints.defaults.setting_emoji_style'), - label: I18n.t('simple_form.labels.defaults.setting_emoji_style'), - label_method: ->(emoji_style) { I18n.t("emoji_styles.#{emoji_style}", default: emoji_style) }, - wrapper: :with_label + .fields-group + = f.simple_fields_for :settings, current_user.settings do |ff| + = ff.input :'web.emoji_style', + collection: %w(auto twemoji native), + include_blank: false, + hint: I18n.t('simple_form.hints.defaults.setting_emoji_style'), + label: I18n.t('simple_form.labels.defaults.setting_emoji_style'), + label_method: ->(emoji_style) { I18n.t("emoji_styles.#{emoji_style}", default: emoji_style) }, + wrapper: :with_label - unless I18n.locale == :en .flash-message.translation-prompt diff --git a/app/views/settings/privacy/show.html.haml b/app/views/settings/privacy/show.html.haml index f7241cfb2..553d6e80a 100644 --- a/app/views/settings/privacy/show.html.haml +++ b/app/views/settings/privacy/show.html.haml @@ -2,8 +2,7 @@ = t('privacy.title') - content_for :heading do - %h2= t('settings.profile') - = render partial: 'settings/shared/profile_navigation' + %h2= t('privacy.title') = simple_form_for @account, url: settings_privacy_path do |f| = render 'shared/error_messages', object: @account diff --git a/app/views/settings/shared/_profile_navigation.html.haml b/app/views/settings/shared/_profile_navigation.html.haml index 2f81cb5cf..9da8af9c2 100644 --- a/app/views/settings/shared/_profile_navigation.html.haml +++ b/app/views/settings/shared/_profile_navigation.html.haml @@ -2,6 +2,5 @@ = render_navigation renderer: :links do |primary| :ruby primary.item :edit_profile, safe_join([material_symbol('person'), t('settings.edit_profile')]), settings_profile_path - primary.item :privacy_reach, safe_join([material_symbol('lock'), t('privacy.title')]), settings_privacy_path primary.item :verification, safe_join([material_symbol('check'), t('verification.verification')]), settings_verification_path primary.item :featured_tags, safe_join([material_symbol('tag'), t('settings.featured_tags')]), settings_featured_tags_path diff --git a/app/views/severed_relationships/_event.html.haml b/app/views/severed_relationships/_event.html.haml index adc7752cb..f4279559b 100644 --- a/app/views/severed_relationships/_event.html.haml +++ b/app/views/severed_relationships/_event.html.haml @@ -6,7 +6,7 @@ = l(event.created_at) %td= t("severed_relationships.event_type.#{event.type}", target_name: event.target_name) - if event.purged? - %td{ rowspan: 2 }= t('severed_relationships.purged') + %td{ colspan: 2 }= t('severed_relationships.purged') - else %td = render 'download', count: event.following_count, link: following_severed_relationship_path(event, format: :csv) diff --git a/app/workers/activitypub/fetch_all_replies_worker.rb b/app/workers/activitypub/fetch_all_replies_worker.rb index 128bfe7e8..2e91a3e95 100644 --- a/app/workers/activitypub/fetch_all_replies_worker.rb +++ b/app/workers/activitypub/fetch_all_replies_worker.rb @@ -11,9 +11,10 @@ class ActivityPub::FetchAllRepliesWorker sidekiq_options queue: 'pull', retry: 3 - # Global max replies to fetch per request (all replies, recursively) - MAX_REPLIES = (ENV['FETCH_REPLIES_MAX_GLOBAL'] || 1000).to_i - MAX_PAGES = (ENV['FETCH_REPLIES_MAX_PAGES'] || 500).to_i + # Max number of replies to fetch - total, recursively through a whole reply tree + MAX_REPLIES = 1000 + # Max number of replies Collection pages to fetch - total + MAX_PAGES = 500 def perform(root_status_id, options = {}) @batch = WorkerBatch.new(options['batch_id']) diff --git a/app/workers/activitypub/refetch_and_verify_quote_worker.rb b/app/workers/activitypub/refetch_and_verify_quote_worker.rb index e2df02310..1a8dd4054 100644 --- a/app/workers/activitypub/refetch_and_verify_quote_worker.rb +++ b/app/workers/activitypub/refetch_and_verify_quote_worker.rb @@ -5,7 +5,7 @@ class ActivityPub::RefetchAndVerifyQuoteWorker include ExponentialBackoff include JsonLdHelper - sidekiq_options queue: 'pull', retry: 3 + sidekiq_options queue: 'pull', retry: 5 def perform(quote_id, quoted_uri, options = {}) quote = Quote.find(quote_id) diff --git a/app/workers/publish_scheduled_status_worker.rb b/app/workers/publish_scheduled_status_worker.rb index bcf20b494..0e34aa779 100644 --- a/app/workers/publish_scheduled_status_worker.rb +++ b/app/workers/publish_scheduled_status_worker.rb @@ -23,6 +23,7 @@ class PublishScheduledStatusWorker options.tap do |options_hash| options_hash[:application] = Doorkeeper::Application.find(options_hash.delete(:application_id)) if options[:application_id] options_hash[:thread] = Status.find(options_hash.delete(:in_reply_to_id)) if options_hash[:in_reply_to_id] + options_hash[:quoted_status] = Status.find(options_hash.delete(:quoted_status_id)) if options_hash[:quoted_status_id] end end end diff --git a/config/initializers/strong_migrations.rb b/config/initializers/strong_migrations.rb index 59053ca18..d722b16a0 100644 --- a/config/initializers/strong_migrations.rb +++ b/config/initializers/strong_migrations.rb @@ -1,4 +1,4 @@ # frozen_string_literal: true StrongMigrations.start_after = 2017_09_24_022025 -StrongMigrations.target_version = 13 +StrongMigrations.target_version = 14 diff --git a/config/locales/an.yml b/config/locales/an.yml index 64aa98ce5..ca7d6b825 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -680,7 +680,6 @@ an: title: Excluyir per defecto los usuarios d'a indexación d'os motors de busqueda discovery: follow_recommendations: Recomendacions de cuentas - preamble: Exposar conteniu interesant a la superficie ye fundamental pa incorporar nuevos usuarios que pueden no conoixer a dengún Mastodon. Controla cómo funcionan quantas opcions d'escubrimiento en o tuyo servidor. profile_directory: Directorio de perfils public_timelines: Linias de tiempo publicas publish_statistics: Publicar las estatisticas diff --git a/config/locales/ar.yml b/config/locales/ar.yml index fb6017180..8774b0227 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -889,7 +889,6 @@ ar: title: عدم السماح مبدئيا لمحركات البحث بفهرسة الملفات التعريفية للمستخدمين discovery: follow_recommendations: اتبع التوصيات - preamble: يُعد إتاحة رؤية المحتوى المثير للاهتمام أمرًا ضروريًا لجذب مستخدمين جدد قد لا يعرفون أي شخص في Mastodon. تحكم في كيفية عمل ميزات الاكتشاف المختلفة على خادمك الخاص. privacy: الخصوصية profile_directory: دليل الصفحات التعريفية public_timelines: الخيوط الزمنية العامة diff --git a/config/locales/ast.yml b/config/locales/ast.yml index b0e105238..9bb87ce8e 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -316,7 +316,6 @@ ast: title: Retención del conteníu discovery: follow_recommendations: Recomendación de cuentes - preamble: L'apaición de conteníu interesante ye fundamental p'atrayer persones nueves que nun conozan nada de Mastodon. Controla'l funcionamientu de delles funciones de descubrimientu d'esti sirvidor. profile_directory: Direutoriu de perfiles public_timelines: Llinies de tiempu públiques publish_statistics: Espublizamientu d'estadístiques diff --git a/config/locales/be.yml b/config/locales/be.yml index 5e5b1f1e6..dd46c81c8 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -824,6 +824,8 @@ be: view_dashboard_description: Дазваляе праглядаць панэль кіравання і розныя метрыкі view_devops: DevOps view_devops_description: Дае доступ да панэляў кіравання Sidekiq і pgHero + view_feeds: Глядзець жывую і тэматычныя стужкі + view_feeds_description: Даць карыстальнікам доступ да жывой і тэматычных стужак, незалежна ад налад сервера title: Ролі rules: add_new: Дадаць правіла @@ -865,7 +867,7 @@ be: title: Перадвызначана выключыць карыстальнікаў з індэксацыі пашуковымі рухавікамі discovery: follow_recommendations: Выконвайце рэкамендацыі - preamble: Прадстаўленне цікавага кантэнту дапамагае прыцягнуць новых карыстальнікаў, якія могуць не ведаць нікога на Mastodon. Кантралюйце працу розных функцый выяўлення на вашым серверы. + preamble: Паказ цікавага кантэнту карысны ў прывабліванні новых карыстальнікаў, якія могуць нікога не ведаць у Mastodon. Кантралюйце, як розныя функцыі выяўлення працуюць на Вашым серверы. privacy: Прыватнасць profile_directory: Дырэкторыя профіляў public_timelines: Публічная паслядоўнасць публікацый @@ -879,7 +881,13 @@ be: feed_access: modes: authenticated: Толькі аўтэнтыфікаваныя карыстальнікі + disabled: Запатрабаваць адмысловую ролю карыстальніка public: Усе + landing_page: + values: + about: Падрабязна + local_feed: Тутэйшая стужка + trends: Трэнды registrations: moderation_recommandation: Пераканайцеся, што ў вас ёсць адэкватная і аператыўная каманда мадэратараў, перш чым адчыняць рэгістрацыю для ўсіх жадаючых! preamble: Кантралюйце, хто можа ствараць уліковы запіс на вашым серверы. @@ -2007,6 +2015,7 @@ be: errors: in_reply_not_found: Здаецца, допіс, на які вы спрабуеце адказаць, не існуе. quoted_status_not_found: Выглядае, што допісу, які Вы спрабуеце цытаваць, не існуе. + quoted_user_not_mentioned: Немагчыма цытаваць незгаданага карыстальніка ў допісе прыватнага згадвання. over_character_limit: перавышаная колькасць сімвалаў у %{max} pin_errors: direct: Допісы, бачныя толькі згаданым карыстальнікам, нельга замацаваць diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 1f22bf004..251eef9cb 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -825,7 +825,6 @@ bg: title: По подразбиране изключете индексирането от търсачки за вашите потребители discovery: follow_recommendations: Препоръки за следване - preamble: За потребители, които са нови и не познават никого в Mastodon, показването на интересно съдържание е ключово. Настройте начина, по който различни функции по откриване на съдържание работят на вашия сървър. privacy: Поверителност profile_directory: Указател на профила public_timelines: Публични хронологии @@ -836,6 +835,14 @@ bg: all: До всеки disabled: До никого users: До влезнали локални потребители + feed_access: + modes: + authenticated: Само удостоверени потребители + disabled: Изисква особена потребителска роля + public: Всеки + landing_page: + values: + trends: Пламенности registrations: moderation_recommandation: Уверете се, че имате адекватен и реактивен модераторски екип преди да отворите регистриранията за всеки! preamble: Управлява кой може да създава акаунт на сървъра ви. @@ -889,6 +896,7 @@ bg: no_status_selected: Няма промяна, тъй като няма избрани публикации open: Отваряне на публикация original_status: Първообразна публикация + quotes: Цитати reblogs: Блогване пак replied_to_html: Отговорено до %{acct_link} status_changed: Публикацията променена @@ -896,6 +904,7 @@ bg: title: Публикации на акаунт - @%{name} trending: Изгряващи view_publicly: Преглед като публично + view_quoted_post: Преглед на цитираната публикация visibility: Видимост with_media: С мултимедия strikes: @@ -1166,7 +1175,10 @@ bg: hint_html: Ако желаете да се преместите от друг акаунт към този, тук можете да създадете псевдоним, което се изисква преди да можете да пристъпите към преместване на последователите си от стария акаунт към този. Това действие е безопасно и възстановимо. Миграцията към новия акаунт се инициира от стария акаунт. remove: Разкачвне на псевдонима appearance: + advanced_settings: Разширени настройки animations_and_accessibility: Анимация и достъпност + boosting_preferences: Настройки за подсилване + boosting_preferences_info_html: "Съвет: Без значение от настройките, Shift + Щрак върху иконата %{icon} Подсилване веднага ще подсили." discovery: Откриване localization: body: Mastodon е преведено от доброволци. @@ -1568,6 +1580,13 @@ bg: expires_at: Изтича на uses: Използвания title: Поканете хора + link_preview: + author_html: От %{name} + potentially_sensitive_content: + action: Щракване за показване + confirm_visit: Наистина ли искате да отворите тази връзка? + hide_button: Скриване + label: Възможно деликатно съдържание lists: errors: limit: Достигнахте максималния брой списъци @@ -1720,6 +1739,9 @@ bg: self_vote: Не може да гласувате в свои анкети too_few_options: трябва да има повече от един елемент too_many_options: не може да съдържа повече от %{max} елемента + vote: Гласувам + posting_defaults: + explanation: Тези настройки ще се употребяват като стандартни, когато създавате нови публикации, но може да ги редактирате за всяка публикация в редактора. preferences: other: Друго posting_defaults: По подразбиране за публикации @@ -1875,6 +1897,9 @@ bg: other: "%{count} видеозаписа" boosted_from_html: Раздуто от %{acct_link} content_warning: 'Предупреждение за съдържание: %{warning}' + content_warnings: + hide: Скриване на публ. + show: Показване на още default_language: Същият като езика на интерфейса disallowed_hashtags: one: 'съдържа непозволен хаштаг: %{tags}' @@ -1889,9 +1914,22 @@ bg: limit: Вече сте закачили максималния брой публикации ownership: Публикация на някого другиго не може да бъде закачена reblog: Раздуване не може да бъде закачано + quote_error: + not_available: Неналична публикация + pending_approval: Публикацията чака одобрение + revoked: Премахната публикация от автора + quote_policies: + followers: Само последователи + nobody: Само аз + public: Някой + quote_post_author: Цитирах публикация от %{acct} title: "%{name}: „%{quote}“" visibilities: + direct: Частно споменаване + private: Само последователи public: Публично + public_long: Всеки във и извън Mastodon + unlisted: Тиха публика statuses_cleanup: enabled: Автоматично изтриване на стари публикации enabled_hint: От само себе си трие публикациите ви, щом достигнат указания възрастов праг, освен ако не съвпаднат с някое от изключенията долу diff --git a/config/locales/ca.yml b/config/locales/ca.yml index c3be44daa..2588e41c7 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -586,6 +586,7 @@ ca: created_msg: S'ha creat la nota de moderació d'instància. description_html: Mireu i deixeu notes per als altres moderadors i per a un mateix destroyed_msg: S'ha esborrat la nota de moderació d'instància. + placeholder: Informació sobre aquesta instància, accions preses o qualsevol altra cosa que us pugui ajudar a moderar-la en el futur. title: Notes de moderació private_comment: Comentari privat public_comment: Comentari públic @@ -832,7 +833,6 @@ ca: title: Exclou per defecte els usuaris de la indexació dels motors de cerca discovery: follow_recommendations: Seguir les recomanacions - preamble: L'aparició de contingut interessant és fonamental per atraure els nous usuaris que podrien no saber res de Mastodon. Controla com funcionen diverses opcions de descobriment en el teu servidor. privacy: Privacitat profile_directory: Directori de perfils public_timelines: Línies de temps públiques @@ -896,6 +896,7 @@ ca: no_status_selected: No s’han canviat els estatus perquè cap no ha estat seleccionat open: Obre la publicació original_status: Publicació original + quotes: Cites reblogs: Impulsos replied_to_html: En resposta a %{acct_link} status_changed: Publicació canviada @@ -903,6 +904,7 @@ ca: title: Publicacions del compte - @%{name} trending: Tendència view_publicly: Vegeu en públic + view_quoted_post: Veure la publicació citada visibility: Visibilitat with_media: Amb contingut multimèdia strikes: @@ -1578,6 +1580,13 @@ ca: expires_at: Caduca uses: Usos title: Convidar persones + link_preview: + author_html: Per %{name} + potentially_sensitive_content: + action: Feu clic per a mostrar + confirm_visit: Esteu segur que voleu obrir aquest enllaç? + hide_button: Amaga + label: Contingut potencialment sensible lists: errors: limit: Has assolit la quantitat màxima de llistes @@ -1886,6 +1895,9 @@ ca: other: "%{count} vídeos" boosted_from_html: Impulsat des de %{acct_link} content_warning: 'Avís de contingut: %{warning}' + content_warnings: + hide: Amaga la publicació + show: Mostra'n més default_language: El mateix que a la llengua de la interfície disallowed_hashtags: one: 'conté una etiqueta no permesa: %{tags}' @@ -1900,10 +1912,15 @@ ca: limit: Ja has fixat el màxim nombre de tuts ownership: No es pot fixar el tut d'algú altre reblog: No es pot fixar un impuls + quote_error: + not_available: Publicació no disponible + pending_approval: Publicació pendent + revoked: Publicació eliminada per l'autor quote_policies: followers: Només seguidors nobody: Només jo public: Qualsevol + quote_post_author: S'ha citat una publicació de @%{acct} title: '%{name}: "%{quote}"' visibilities: direct: Menció privada diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 3919dbe98..8bfc5ecd8 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -824,6 +824,8 @@ cs: view_dashboard_description: Umožňuje uživatelům přístup k ovládacímu panelu a různým metrikám view_devops: DevOps view_devops_description: Umožňuje uživatelům přístup k ovládacím panelům Sidekiq a pgHero + view_feeds: Zobrazit živé a tematické kanály + view_feeds_description: Umožňuje uživatelům přístup k živým a tematickým kanálům bez ohledu na nastavení serveru title: Role rules: add_new: Přidat pravidlo @@ -865,12 +867,12 @@ cs: title: Odhlásit uživatele ze standardního indexování vyhledávačů discovery: follow_recommendations: Doporučená sledování - preamble: Povrchový zajímavý obsah je užitečný pro zapojení nových uživatelů, kteří možná neznají žádného Mastodona. Mějte pod kontrolou, jak různé objevovací funkce fungují na vašem serveru. + preamble: Zobrazování zajímavého obsahu je užitečné pro zapojovní nových uživatelů, kteří nemusí na Mastodonu nikoho znát. Kontrolujte, jak fungují různé funkce objevování obsahu na vašem serveru. privacy: Soukromí profile_directory: Adresář profilů public_timelines: Veřejné časové osy publish_statistics: Zveřejnit statistiku - title: Objevujte + title: Objevování trends: Trendy domain_blocks: all: Všem @@ -879,7 +881,13 @@ cs: feed_access: modes: authenticated: Pouze autentifikovaní uživatelé + disabled: Vyžadovat specifickou uživatelskou roli public: Všichni + landing_page: + values: + about: O službě + local_feed: Místní kanál + trends: Trendy registrations: moderation_recommandation: Před otevřením registrací všem se ujistěte, že máte vhodný a reaktivní moderační tým! preamble: Mějte pod kontrolou, kdo může vytvořit účet na vašem serveru. @@ -933,6 +941,7 @@ cs: no_status_selected: Nebyly změněny žádné příspěvky, neboť žádné nebyly vybrány open: Otevřít příspěvek original_status: Původní příspěvek + quotes: Citace reblogs: Boosty replied_to_html: Odpověděl %{acct_link} status_changed: Příspěvek změněn @@ -940,6 +949,7 @@ cs: title: Příspěvky na účtu - @%{name} trending: Populární view_publicly: Zobrazit veřejně + view_quoted_post: Zobrazit citovaný příspěvek visibility: Viditelnost with_media: S médii strikes: @@ -1224,7 +1234,10 @@ cs: hint_html: Chcete-li se přesunout z jiného účtu na tento, můžete si zde vytvořit alias, který je vyžadován předtím, než můžete pokračovat přesunem sledujících ze starého účtu na tento. Tato akce sama o sobě je neškodná a vratná. Přesun účtu se zahajuje ze starého účtu. remove: Odpojit alias appearance: + advanced_settings: Pokročilá nastavení animations_and_accessibility: Animace a přístupnost + boosting_preferences: Předvolby boostování + boosting_preferences_info_html: "Tip: Bez ohledu na nastavení Shift + Klik na ikonu %{icon} Boost okamžitě boostne." discovery: Objevování localization: body: Mastodon je překládán dobrovolníky. @@ -2002,16 +2015,22 @@ cs: errors: in_reply_not_found: Příspěvek, na který se pokoušíte odpovědět, neexistuje. quoted_status_not_found: Zdá se, že příspěvek, který se pokoušíte citovat neexistuje. + quoted_user_not_mentioned: Nelze citovat nezmíněného uživatele v soukromé zmínce. over_character_limit: byl překročen limit %{max} znaků pin_errors: direct: Příspěvky viditelné pouze zmíněným uživatelům nelze připnout limit: Už jste si připnuli maximální počet příspěvků ownership: Nelze připnout příspěvek někoho jiného reblog: Boosty nelze připnout + quote_error: + not_available: Příspěvek není dostupný + pending_approval: Příspěvek čeká na schválení + revoked: Příspěvek odstraněn autorem quote_policies: followers: Pouze sledující nobody: Jen já public: Kdokoliv + quote_post_author: Citovali příspěvek od %{acct} title: "%{name}: „%{quote}“" visibilities: direct: Soukromá zmínka diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 61d1d9d8a..54973fe9c 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -852,6 +852,8 @@ cy: view_dashboard_description: Yn galluogi defnyddwyr i gael mynediad i'r bwrdd gwaith a metrigau amrywiol view_devops: DevOps view_devops_description: Yn caniatáu i ddefnyddwyr gael mynediad i fyrddau gwaith Sidekiq a pgHero + view_feeds: Gweld ffrydiau byw a phynciol + view_feeds_description: Yn caniatáu i ddefnyddwyr gael mynediad at y ffrydiau byw a phynciol beth bynnag yw gosodiadau'r gweinydd title: Rolau rules: add_new: Ychwanegu rheol @@ -893,7 +895,7 @@ cy: title: Eithrio defnyddwyr o fynegai peiriannau chwilio, fel rhagosodiad discovery: follow_recommendations: Dilyn yr argymhellion - preamble: Mae amlygu cynnwys diddorol yn allweddol ar gyfer derbyn defnyddwyr newydd nad ydynt efallai'n gyfarwydd ag unrhyw un Mastodon. Rheolwch sut mae nodweddion darganfod amrywiol yn gweithio ar eich gweinydd. + preamble: Mae amlygu cynnwys diddorol yn allweddol wrth ddenu defnyddwyr newydd sydd ddim o bosib yn adnabod neb ar Mastodon. Rheolwch sut mae gwahanol nodweddion darganfod yn gweithio ar eich gweinydd. privacy: Preifatrwydd profile_directory: Cyfeiriadur proffiliau public_timelines: Ffrydiau cyhoeddus @@ -907,7 +909,13 @@ cy: feed_access: modes: authenticated: Defnyddwyr dilys yn unig + disabled: Gofyn am rôl defnyddiwr penodol public: Pawb + landing_page: + values: + about: Ynghylch + local_feed: Ffrwd leol + trends: Trendiau registrations: moderation_recommandation: Gwnewch yn siŵr bod gennych chi dîm cymedroli digonol ac adweithiol cyn i chi agor cofrestriadau i bawb! preamble: Rheoli pwy all greu cyfrif ar eich gweinydd. @@ -961,6 +969,7 @@ cy: no_status_selected: Heb newid postiad gan na ddewiswyd dim un open: Agor postiad original_status: Postiad gwreiddiol + quotes: Dyfyniadau reblogs: Ailflogiadau replied_to_html: Wedi ymateb i %{acct_link} status_changed: Postiad wedi'i newid @@ -968,6 +977,7 @@ cy: title: Postiadau cyfrif - @%{name} trending: Yn trendio view_publicly: Gweld yn gyhoeddus + view_quoted_post: Gweld y postiad wedi'i ddyfynnu visibility: Gwelededd with_media: Gyda chyfryngau strikes: @@ -1262,7 +1272,10 @@ cy: hint_html: Os ydych chi am symud o gyfrif arall i'r un hwn, gallwch greu enw arall yma, sy'n ofynnol cyn y gallwch symud ymlaen i symud dilynwyr o'r hen gyfrif i'r un hwn. Mae'r weithred hon ynddo'i hun yn ddiniwed ac yn wrthdroadwy. Mae'r mudo cyfrif yn cael ei wneud o'r hen gyfrif. remove: Dadgysylltu'r enw arall appearance: + advanced_settings: Gosodiadau uwch animations_and_accessibility: Animeiddiadau a hygyrchedd + boosting_preferences: Dewisiadau hybu + boosting_preferences_info_html: "Awgrym: Beth bynnag yw'r gosodiadau, bydd Shift + Clici ar yr eicon Hybu %{icon} yn hybu'n syth." discovery: Darganfod localization: body: Mae Mastodon yn cael ei gyfieithu gan wirfoddolwyr. @@ -2094,10 +2107,15 @@ cy: limit: Rydych chi eisoes wedi pinio uchafswm nifer y postiadau ownership: Nid oes modd pinio postiad rhywun arall reblog: Nid oes modd pinio hwb + quote_error: + not_available: Dyw'r postiad ddim ar gael + pending_approval: Postiad ar ei ffordd + revoked: Postiad wedi'i ddileu gan yr awdur quote_policies: followers: Dilynwyr yn unig nobody: Dim ond fi public: Pawb + quote_post_author: Wedi dyfynnu postiad gan %{acct} title: '%{name}: "%{quote}"' visibilities: direct: Crybwylliad preifat diff --git a/config/locales/da.yml b/config/locales/da.yml index 08637049c..c9182360a 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -796,6 +796,8 @@ da: view_dashboard_description: Tillader brugere at tilgå Dashboard'et og forskellige målinger view_devops: DevOps view_devops_description: Tillader brugere at tilgå Sidekiq- og pgHero-dashboards + view_feeds: Se live- og emne-feeds + view_feeds_description: Giver brugerne adgang til live- og emne-feeds uanset serverindstillinger title: Roller rules: add_new: Tilføj regel @@ -837,7 +839,7 @@ da: title: Fravælg som standard søgemaskineindeksering for brugere discovery: follow_recommendations: Følg-anbefalinger - preamble: At vise interessant indhold er vitalt ifm. at få nye brugere om bord, som måske ikke kender nogen på Mastodon. Styr, hvordan forskellige opdagelsesfunktioner fungerer på serveren. + preamble: At bringe interessant indhold frem er afgørende for at engagere nye brugere, der måske ikke kender nogen på Mastodon. Kontroller, hvordan forskellige funktioner til at finde indhold fungerer på din server. privacy: Fortrolighed profile_directory: Profiloversigt public_timelines: Offentlige tidslinjer @@ -851,7 +853,13 @@ da: feed_access: modes: authenticated: Kun godkendte brugere + disabled: Kræv specifik brugerrolle public: Alle + landing_page: + values: + about: Om + local_feed: Lokalt feed + trends: Trends registrations: moderation_recommandation: Sørg for, at der er et tilstrækkeligt og reaktivt moderationsteam, før registrering åbnes for alle! preamble: Styr, hvem der kan oprette en konto på serveren. @@ -1921,6 +1929,7 @@ da: errors: in_reply_not_found: Indlægget, der forsøges besvaret, ser ikke ud til at eksistere. quoted_status_not_found: Indlægget, du forsøger at citere, ser ikke ud til at eksistere. + quoted_user_not_mentioned: Kan ikke citere en ikke-omtalt bruger i et privat omtale-indlæg. over_character_limit: grænsen på %{max} tegn overskredet pin_errors: direct: Indlæg, som kun kan ses af omtalte brugere, kan ikke fastgøres diff --git a/config/locales/de.yml b/config/locales/de.yml index db183a199..71d9eb5b8 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -796,6 +796,8 @@ de: view_dashboard_description: Gewährt Benutzer*innen den Zugriff auf das Dashboard und verschiedene Metriken view_devops: DevOps view_devops_description: Erlaubt es Benutzer*innen, auf die Sidekiq- und pgHero-Dashboards zuzugreifen + view_feeds: Live-Feeds und Hashtags anzeigen + view_feeds_description: Ermöglicht Nutzer*innen unabhängig von den Servereinstellungen den Zugriff auf die Live-Feeds und Hashtags title: Rollen rules: add_new: Regel hinzufügen @@ -837,7 +839,7 @@ de: title: Profile standardmäßig von der Suchmaschinen-Indizierung ausnehmen discovery: follow_recommendations: Follower-Empfehlungen - preamble: Das Auffinden interessanter Inhalte ist wichtig, um neue Nutzer einzubinden, die Mastodon noch nicht kennen. Bestimme, wie verschiedene Suchfunktionen auf deinem Server funktionieren. + preamble: Interessante Inhalte sichtbar zu machen, ist entscheidend, um neue Nutzer*innen, die möglicherweise noch niemanden auf Mastodon kennen, zu gewinnen. Überprüfe, wie die einzelnen Suchfunktionen auf deinem Server funktionieren. privacy: Datenschutz profile_directory: Profilverzeichnis public_timelines: Öffentliche Timeline @@ -851,7 +853,13 @@ de: feed_access: modes: authenticated: Nur authentifizierte Nutzer*innen + disabled: Bestimmte Rolle erforderlich public: Alle + landing_page: + values: + about: Über + local_feed: Lokaler Feed + trends: Trends registrations: moderation_recommandation: Bitte vergewissere dich, dass du ein geeignetes und reaktionsschnelles Moderationsteam hast, bevor du die Registrierungen uneingeschränkt zulässt! preamble: Lege fest, wer auf deinem Server ein Konto erstellen darf. @@ -1190,7 +1198,8 @@ de: appearance: advanced_settings: Erweiterte Einstellungen animations_and_accessibility: Animationen und Barrierefreiheit - boosting_preferences: Teilen-Einstellungen + boosting_preferences: Teilen + boosting_preferences_info_html: "Tipp: Shift + Klick beim %{icon} Teilen-Symbol wird den Beitrag immer sofort teilen." discovery: Entdecken localization: body: Mastodon wird von Freiwilligen übersetzt. @@ -1920,6 +1929,7 @@ de: errors: in_reply_not_found: Der Beitrag, auf den du antworten möchtest, scheint nicht zu existieren. quoted_status_not_found: Der Beitrag, den du zitieren möchtest, scheint nicht zu existieren. + quoted_user_not_mentioned: Nur ein erwähntes Profil kann in einer privaten Erwähnung zitiert werden. over_character_limit: Begrenzung von %{max} Zeichen überschritten pin_errors: direct: Beiträge, die nur für erwähnte Profile sichtbar sind, können nicht angeheftet werden @@ -2067,7 +2077,7 @@ de: title: Wichtige Mitteilung warning: appeal: Einspruch erheben - appeal_description: Wenn du glaubst, dass es sich um einen Fehler handelt, kannst du einen Einspruch an die Administration von %{instance} senden. + appeal_description: Solltest du der Meinung sein, dass es sich bei der Sperre um einen Fehler handelt, kannst du Einspruch erheben, in dem du dich an das Team von %{instance} wendest. categories: spam: Spam violation: Inhalt verstößt gegen die folgenden Serverregeln @@ -2077,7 +2087,7 @@ de: mark_statuses_as_sensitive: Ein oder mehrere deiner Beiträge wurden von den Moderator*innen von %{instance} mit einer Inhaltswarnung versehen. Das bedeutet, dass die Medien in den Beiträgen erst angeklickt werden müssen, bevor sie angezeigt werden. Beim Verfassen der nächsten Beiträge kannst du auch selbst eine Inhaltswarnung für hochgeladene Medien festlegen. sensitive: Von nun an werden alle deine hochgeladenen Mediendateien mit einer Inhaltswarnung versehen und hinter einer Warnung versteckt. silence: Du kannst dein Konto weiterhin verwenden, aber nur Personen, die dir bereits folgen, sehen deine Beiträge auf diesem Server. Ebenso kannst du aus verschiedenen Suchfunktionen ausgeschlossen werden. Andere können dir jedoch weiterhin manuell folgen. - suspend: Du kannst dein Konto nicht mehr verwenden und dein Profil und andere Daten sind nicht mehr verfügbar. Du kannst dich immer noch anmelden, um eine Sicherung deiner Daten anzufordern, bis die Daten innerhalb von 30 Tagen vollständig gelöscht wurden. Allerdings werden wir einige Daten speichern, um zu verhindern, dass du die Sperrung umgehst. + suspend: Du kannst dein Konto nicht mehr verwenden und dein Profil und weitere Daten sind nicht mehr verfügbar. Du kannst dich immer noch anmelden, um eine Sicherung deiner Daten anzufordern, bis die Daten innerhalb von 30 Tagen vollständig gelöscht wurden. Allerdings werden wir einige Daten behalten, um zu verhindern, dass du die Kontosperre umgehst. reason: 'Begründung:' statuses: 'Betroffene Beiträge:' subject: diff --git a/config/locales/devise.bg.yml b/config/locales/devise.bg.yml index 5cb41fa61..612658b6b 100644 --- a/config/locales/devise.bg.yml +++ b/config/locales/devise.bg.yml @@ -7,6 +7,7 @@ bg: send_paranoid_instructions: Ако вашият имейл адрес съществува в нашата база данни, ще получите имейл с указания как да потвърдите имейл адреса си след няколко минути. Проверете спам папката си, ако не сте получили такъв имейл. failure: already_authenticated: Вече сте влезли. + closed_registrations: Вашият опит за регистриране е блокиран заради мрежова политика. Ако вярвате, че е грешка, то свържете се с %{email}. inactive: Акаунтът ви още не е задействан. invalid: Невалиден %{authentication_keys} или парола. last_attempt: Разполагате с още един опит преди акаунтът ви да се заключи. diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml index f22884386..924c9cf7f 100644 --- a/config/locales/devise.ca.yml +++ b/config/locales/devise.ca.yml @@ -9,6 +9,7 @@ ca: Si us plau, verifica la carpeta de la brossa si no l'has rebut. failure: already_authenticated: Ja t'has registrat. + closed_registrations: El vostre intent de registre s'ha blocat per una política de xarxa. Si creieu que és un error, contacteu %{email}. inactive: El teu compte encara no s'ha activat. invalid: "%{authentication_keys} o contrasenya no són vàlids." last_attempt: Tens un intent més abans no es bloqui el teu compte. diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml index 42ecc1d53..e9aa54c65 100644 --- a/config/locales/devise.cs.yml +++ b/config/locales/devise.cs.yml @@ -7,6 +7,7 @@ cs: send_paranoid_instructions: Pokud je vaše e-mailová adresa v naší databázi, obdržíte za několik minut e-mail s instrukcemi pro potvrzení vaší e-mailové adresy. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“. failure: already_authenticated: Již jste přihlášeni. + closed_registrations: Váš pokus o registraci byl zablokován z důvodů síťové politiky. Pokud se domníváte, že se jedná o chybu, kontaktujte %{email}. inactive: Váš účet ještě není aktivován. invalid: Neplatné %{authentication_keys} nebo heslo. last_attempt: Máte ještě jeden pokus, než bude váš účet uzamčen. diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index da383f70a..7f3564dba 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -7,6 +7,7 @@ cy: send_paranoid_instructions: Os yw eich cyfeiriad e-bost yn bodoli yn ein cronfa ddata, byddwch yn derbyn e-bost gyda chyfarwyddiadau ar sut i gadarnhau eich cyfeiriad e-bost mewn ychydig funudau. Gwiriwch eich ffolder sbam os na dderbynioch yr e-bost hwn. failure: already_authenticated: Rydych chi eisoes wedi mewngofnodi. + closed_registrations: Mae eich ymgais i gofrestru wedi'i rhwystro oherwydd polisi rhwydwaith. Os ydych chi'n credu bod hwn yn wall, cysylltwch â %{email}. inactive: Nid yw eich cyfrif yn weithredol eto. invalid: "%{authentication_keys} neu gyfrinair annilys." last_attempt: Mae gennych un cyfle arall cyn i'ch cyfrif gael ei gloi. diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml index 71cd7699f..31001d2c1 100644 --- a/config/locales/devise.fa.yml +++ b/config/locales/devise.fa.yml @@ -7,6 +7,7 @@ fa: send_paranoid_instructions: اگر نشانی رایانامه‌تان در پایگاه داده‌مان وجود داشته باشد، تا دقایقی دیگر تا دقایقی دیگر رایانامه‌ای با دستورالعمل تأیید نشانی رایانامه‌تان دریافت خواهید کرد. اگر این رایانامه را نگرفتید، لطفاً پوشهٔ هرزنامه‌هایتان را بررسی کنید. failure: already_authenticated: از پیش وارد شده‌اید. + closed_registrations: تلاشتان برا ثبت‌نام به دلیل سیاست شبکه مسدود شد. اگر باور دارید خطایی رخ داده با %{email} تماس بگیرید. inactive: هنوز حسابتان فعّال نشده. invalid: "%{authentication_keys} یا گذرواژه نامعتبر." last_attempt: پیش از آن که حساب شما قفل شود، یک فرصت دیگر دارید. diff --git a/config/locales/devise.fr-CA.yml b/config/locales/devise.fr-CA.yml index fbe549743..1acb5d177 100644 --- a/config/locales/devise.fr-CA.yml +++ b/config/locales/devise.fr-CA.yml @@ -7,6 +7,7 @@ fr-CA: send_paranoid_instructions: Si votre adresse courriel existe dans notre base de données, vous allez recevoir un courriel contenant les instructions de confirmation de votre adresse. Veuillez vérifier votre dossier de pourriels si vous n'avez pas reçu ce message. failure: already_authenticated: Vous êtes déjà connecté·e. + closed_registrations: Votre tentative d'inscription a été bloquée en raison d'une politique de réseau. Si vous pensez qu'il s'agit d'une erreur, contactez %{email}. inactive: Votre compte n’est pas encore activé. invalid: "%{authentication_keys} ou mot de passe invalide." last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 10c49b22e..c2147fcf9 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -7,6 +7,7 @@ fr: send_paranoid_instructions: Si votre adresse électronique existe dans notre base de données, vous allez bientôt recevoir un courriel contenant les instructions de confirmation de votre compte. Veuillez, dans le cas où vous ne recevriez pas ce message, vérifier votre dossier d’indésirables. failure: already_authenticated: Vous êtes déjà connecté⋅e. + closed_registrations: Votre tentative d'inscription a été bloquée en raison d'une politique de réseau. Si vous pensez qu'il s'agit d'une erreur, contactez %{email}. inactive: Votre compte n’est pas encore activé. invalid: "%{authentication_keys} ou mot de passe invalide." last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. diff --git a/config/locales/devise.gd.yml b/config/locales/devise.gd.yml index d110bc799..c7ddce255 100644 --- a/config/locales/devise.gd.yml +++ b/config/locales/devise.gd.yml @@ -7,6 +7,7 @@ gd: send_paranoid_instructions: Ma tha an seòladh puist-d agad san stòr-dàta againn, gheibh thu post-d an ceann corra mionaid le stiùireadh air mar a dhearbhas tu an seòladh puist-d agad. Thoir sùil air pasgan an spama agad mura faigh thu am post-d seo. failure: already_authenticated: Tha thu air do chlàradh a-steach mu thràth. + closed_registrations: Chaidh d’ oidhirp clàraidh a bhacadh ri linn poileasaidh lìonraidh. Ma tha thu dhen bheachd gur e mearachd a th’ ann, cuir fios gu %{email}. inactive: Cha deach an cunntas agad a ghnìomhachadh fhathast. invalid: "%{authentication_keys} no facal-faire mì-dhligheach." last_attempt: Tha aon oidhirp eile agad mus dèid an cunntas agad a ghlasadh. diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index b57ef9684..ebdd3ed44 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -7,6 +7,7 @@ ko: send_paranoid_instructions: 이메일 주소가 저희 데이터베이스에 있는 경우, 몇 분 내에 이메일 주소를 확인하는 방법에 대한 안내가 포함된 이메일을 받을 수 있습니다. 이 이메일을 받지 못했다면 스팸 폴더를 확인해 주세요. failure: already_authenticated: 이미 로그인 된 상태입니다. + closed_registrations: 네트워크 정책에 의해 가입 시도가 차단되었습니다. 오류라고 생각된다면 %{email}에 문의해주세요. inactive: 계정이 아직 활성화 되지 않았습니다. invalid: 올바르지 않은 %{authentication_keys} 혹은 암호입니다. last_attempt: 계정이 잠기기까지 한 번의 시도가 남았습니다. diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml index 093ea6961..1d5ad09c1 100644 --- a/config/locales/devise.pl.yml +++ b/config/locales/devise.pl.yml @@ -7,6 +7,7 @@ pl: send_paranoid_instructions: Jeśli Twój adres e-mail już istnieje w naszej bazie danych, w ciągu kilku minut otrzymasz wiadomość e-mail z instrukcją jak potwierdzić Twój adres e-mail. Jeżeli nie otrzymano wiadomości, sprawdź folder ze spamem. failure: already_authenticated: Jesteś już zalogowany(-a). + closed_registrations: Twoja próba rejestracji została zablokowana ze względu na politykę sieciową. Jeśli uważasz, że jest to błąd, skontaktuj się z %{email}. inactive: Twoje konto nie zostało jeszcze aktywowane. invalid: Nieprawidłowy %{authentication_keys} lub hasło. last_attempt: Masz jeszcze jedną próbę; Twoje konto zostanie zablokowane jeśli się nie powiedzie. diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml index aa1190dfd..89a3800cf 100644 --- a/config/locales/devise.pt-BR.yml +++ b/config/locales/devise.pt-BR.yml @@ -7,6 +7,7 @@ pt-BR: send_paranoid_instructions: Se o seu endereço de e-mail já existir em nosso banco de dados, você receberá um e-mail com instruções para confirmá-lo dentro de alguns minutos. Verifique sua caixa de spam caso ainda não o tenha recebido. failure: already_authenticated: Você entrou na sua conta. + closed_registrations: Sua tentativa de registro foi bloqueada devido a uma política de rede. Se você acredita que isso é um erro, entre em contato com %{email}. inactive: Sua conta não foi confirmada ainda. invalid: "%{authentication_keys} ou senha inválida." last_attempt: Você tem mais uma tentativa antes de sua conta ser bloqueada. diff --git a/config/locales/devise.pt-PT.yml b/config/locales/devise.pt-PT.yml index 9660c3edb..8db3487fb 100644 --- a/config/locales/devise.pt-PT.yml +++ b/config/locales/devise.pt-PT.yml @@ -7,6 +7,7 @@ pt-PT: send_paranoid_instructions: Se o teu endereço de e-mail já existir na nossa base de dados, vais receber um e-mail com as instruções de confirmação dentro de alguns minutos. Verifica na caixa de spam se não recebeste o e-mail. failure: already_authenticated: Já iniciaste a sessão. + closed_registrations: A sua tentativa de registo foi bloqueada devido a uma política de rede. Se acredita que se trata de um erro, contacte %{email}. inactive: A tua conta ainda não está ativada. invalid: "%{authentication_keys} ou palavra-passe inválida." last_attempt: Tens mais uma tentativa antes de a tua conta ser bloqueada. diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml index 6fd47ec35..ffffe0cbf 100644 --- a/config/locales/devise.zh-CN.yml +++ b/config/locales/devise.zh-CN.yml @@ -7,7 +7,7 @@ zh-CN: send_paranoid_instructions: 如果你的邮箱地址存在于我们的数据库中,你将在几分钟内收到一封邮件,内含如何验证邮箱地址的指引。如果你没有收到这封邮件,请检查你的垃圾邮件文件夹。 failure: already_authenticated: 你已登录。 - closed_registrations: 您的注册因为网络政策已被阻止。若您认为这是错误,请联系 %{email}。 + closed_registrations: 你的注册因为网络政策已被阻止。若您认为这是错误,请联系 %{email}。 inactive: 你还没有激活账号。 invalid: "%{authentication_keys} 无效或密码错误。" last_attempt: 你只有最后一次尝试机会,若未通过,账号将被锁定。 diff --git a/config/locales/doorkeeper.et.yml b/config/locales/doorkeeper.et.yml index b21afa9a7..df10f9a0c 100644 --- a/config/locales/doorkeeper.et.yml +++ b/config/locales/doorkeeper.et.yml @@ -130,11 +130,11 @@ et: crypto: Otspunktkrüpteerimine favourites: Lemmikud filters: Filtrid - follow: Jälgitavad, Vaigistatud ja Blokeeritud + follow: Jälgitavad, summutamised ja blokeerimised follows: Jälgimised lists: Loetelud media: Lisatud meedia - mutes: Vaigistused + mutes: Summutamised notifications: Teavitused profile: Sinu Mastodoni profiil push: Tõuketeated @@ -177,7 +177,7 @@ et: read:filters: näha su filtreid read:follows: näha su jälgimisi read:lists: näha su loetelusid - read:mutes: näha su vaigistusi + read:mutes: näha su summutamisi read:notifications: näha teateid read:reports: näha teavitusi read:search: otsida sinu nimel @@ -186,13 +186,13 @@ et: write:accounts: muuta profiili write:blocks: kontode ja domeenide blokeerimine write:bookmarks: lisada postitusele järjehoidja - write:conversations: vaigista ja kustuta vestlused + write:conversations: summuta ja kustuta vestlused write:favourites: lisada postitusi lemmikuks write:filters: luua filtreid write:follows: jälgida inimesi write:lists: luua loetelusid write:media: üles laadida meediafaile - write:mutes: vaigista inimesi ja vestluseid + write:mutes: summuta inimesi ja vestluseid write:notifications: tühjendada teateid write:reports: teavitada teistest inimestest write:statuses: avaldada postitusi diff --git a/config/locales/doorkeeper.pt-PT.yml b/config/locales/doorkeeper.pt-PT.yml index 6285794aa..ae7dc28b6 100644 --- a/config/locales/doorkeeper.pt-PT.yml +++ b/config/locales/doorkeeper.pt-PT.yml @@ -125,7 +125,7 @@ pt-PT: admin/reports: Administração de denúncias all: Acesso total à sua conta Mastodon blocks: Bloqueios - bookmarks: Marcadores + bookmarks: Itens Salvos conversations: Conversas crypto: Encriptação ponta a ponta favourites: Favoritos @@ -172,7 +172,7 @@ pt-PT: read: ler todos os dados da tua conta read:accounts: ver as informações da conta read:blocks: ver os teus bloqueios - read:bookmarks: ver os teus marcadores + read:bookmarks: ver os seus itens salvos read:favourites: ver os teus favoritos read:filters: ver os teus filtros read:follows: ver quem segues @@ -185,7 +185,7 @@ pt-PT: write: alterar todos os dados da tua conta write:accounts: alterar o teu perfil write:blocks: bloquear contas e domínios - write:bookmarks: marcar publicações + write:bookmarks: salvar publicações write:conversations: ocultar e eliminar conversas write:favourites: assinalar como favoritas write:filters: criar filtros diff --git a/config/locales/el.yml b/config/locales/el.yml index 0b3094b7c..0bbffd2a1 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -796,6 +796,8 @@ el: view_dashboard_description: Επιτρέπει στους χρήστες να έχουν πρόσβαση στον ταμπλό πληροφοριών και σε διάφορες μετρήσεις view_devops: DevOps view_devops_description: Επιτρέπει στους χρήστες να έχουν πρόσβαση στα ταμπλό πληροφοριών Sidekiq και pgHero + view_feeds: Προβολή ζωντανών και θεματικών ροών + view_feeds_description: Επιτρέπει στους χρήστες να έχουν πρόσβαση στις ζωντανές και θεματικές ροές ανεξάρτητα από τις ρυθμίσεις του διακομιστή title: Ρόλοι rules: add_new: Προσθήκη κανόνα @@ -837,7 +839,7 @@ el: title: Εξαίρεση χρηστών από τις μηχανές αναζήτησης discovery: follow_recommendations: Ακολούθησε τις προτάσεις - preamble: Δημοσιεύοντας ενδιαφέρον περιεχόμενο είναι καθοριστικό για την ενσωμάτωση νέων χρηστών που μπορεί να μη γνωρίζουν κανέναν στο Mastodon. Έλεγξε πώς λειτουργούν διάφορες δυνατότητες ανακάλυψης στον διακομιστή σας. + preamble: Εμφανίζοντας ενδιαφέρον περιεχόμενο είναι καθοριστικό για την ενσωμάτωση νέων χρηστών που μπορεί να μη γνωρίζουν κανέναν στο Mastodon. Ελέγξτε πώς λειτουργούν διάφορες δυνατότητες ανακάλυψης στον διακομιστή σας. privacy: Απόρρητο profile_directory: Κατάλογος προφίλ public_timelines: Δημόσιες ροές @@ -851,7 +853,13 @@ el: feed_access: modes: authenticated: Πιστοποιημένοι χρήστες μόνο + disabled: Να απαιτείται συγκεκριμένος ρόλος χρήστη public: Όλοι + landing_page: + values: + about: Σχετικά + local_feed: Τοπική ροή + trends: Τάσεις registrations: moderation_recommandation: Παρακαλώ βεβαιώσου ότι έχεις μια επαρκής και ενεργή ομάδα συντονισμού πριν ανοίξεις τις εγγραφές για όλους! preamble: Έλεγξε ποιος μπορεί να δημιουργήσει ένα λογαριασμό στον διακομιστή σας. @@ -1921,6 +1929,7 @@ el: errors: in_reply_not_found: Η ανάρτηση στην οποία προσπαθείς να απαντήσεις δεν φαίνεται να υπάρχει. quoted_status_not_found: Η ανάρτηση την οποία προσπαθείς να παραθέσεις δεν φαίνεται να υπάρχει. + quoted_user_not_mentioned: Δεν είναι δυνατή η παράθεση ενός μη επισημασμένου χρήστη σε μια ανάρτηση Ιδιωτικής επισήμανσης. over_character_limit: υπέρβαση μέγιστου ορίου %{max} χαρακτήρων pin_errors: direct: Αναρτήσεις που είναι ορατές μόνο στους αναφερόμενους χρήστες δεν μπορούν να καρφιτσωθούν diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index b44e4ad3b..e7fdeeb09 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -831,7 +831,6 @@ en-GB: title: Opt users out of search engine indexing by default discovery: follow_recommendations: Follow recommendations - preamble: Surfacing interesting content is instrumental in onboarding new users who may not know anyone Mastodon. Control how various discovery features work on your server. privacy: Privacy profile_directory: Profile directory public_timelines: Public timelines diff --git a/config/locales/en.yml b/config/locales/en.yml index 8a9e3980c..e75361721 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -796,6 +796,8 @@ en: view_dashboard_description: Allows users to access the dashboard and various metrics view_devops: DevOps view_devops_description: Allows users to access Sidekiq and pgHero dashboards + view_feeds: View live and topic feeds + view_feeds_description: Allows users to access the live and topic feeds regardless of server settings title: Roles rules: add_new: Add rule @@ -837,7 +839,7 @@ en: title: Opt users out of search engine indexing by default discovery: follow_recommendations: Follow recommendations - preamble: Surfacing interesting content is instrumental in onboarding new users who may not know anyone Mastodon. Control how various discovery features work on your server. + preamble: Surfacing interesting content is instrumental in onboarding new users who may not know anyone on Mastodon. Control how various discovery features work on your server. privacy: Privacy profile_directory: Profile directory public_timelines: Public timelines @@ -851,7 +853,13 @@ en: feed_access: modes: authenticated: Authenticated users only + disabled: Require specific user role public: Everyone + landing_page: + values: + about: About + local_feed: Local feed + trends: Trends registrations: moderation_recommandation: Please make sure you have an adequate and reactive moderation team before you open registrations to everyone! preamble: Control who can create an account on your server. @@ -1926,6 +1934,7 @@ en: errors: in_reply_not_found: The post you are trying to reply to does not appear to exist. quoted_status_not_found: The post you are trying to quote does not appear to exist. + quoted_user_not_mentioned: Cannot quote a non-mentioned user in a Private Mention post. over_character_limit: character limit of %{max} exceeded pin_errors: direct: Posts that are only visible to mentioned users cannot be pinned diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 849df02ae..da6c581b2 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -831,7 +831,6 @@ eo: title: Defaŭltigi, ke uzantoj ne estu aŭtomate aldonitaj al la serĉilo-indekso sen sia konsento discovery: follow_recommendations: Sekvorekomendoj - preamble: Interesa enhavo estas grava por novaj uzantoj kiuj eble ne konas ajn iun. privacy: Privateco profile_directory: Profilujo public_timelines: Publikaj templinioj diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 35aafafb3..cce8987f7 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -796,6 +796,8 @@ es-AR: view_dashboard_description: Permite a los usuarios acceder al panel de control y varias métricas view_devops: Operadores de desarrollo view_devops_description: Permite a los usuarios acceder a los paneles de Sidekiq y pgHero + view_feeds: Ver líneas temporales y por temas + view_feeds_description: Permite a los usuarios acceder a las líneas temporales en vivo y por temas, sin importar la configuración del servidor title: Roles rules: add_new: Agregar regla @@ -851,7 +853,13 @@ es-AR: feed_access: modes: authenticated: Solo usuarios autenticados + disabled: Requerir un rol de específico de usuario public: Todos + landing_page: + values: + about: Información + local_feed: Línea temporal local + trends: Tendencias registrations: moderation_recommandation: Por favor, ¡asegurate de tener un equipo de moderación adecuado y reactivo antes de abrir los registros a todos! preamble: Controlá quién puede crear una cuenta en tu servidor. @@ -1921,6 +1929,7 @@ es-AR: errors: in_reply_not_found: El mensaje al que intentás responder no existe. quoted_status_not_found: El mensaje al que intentás citar parece que no existe. + quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en un mensaje de mención privada. over_character_limit: se excedió el límite de %{max} caracteres pin_errors: direct: Los mensajes que sólo son visibles para los usuarios mencionados no pueden ser fijados diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 3e3e32896..d0dfe8273 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -796,6 +796,8 @@ es-MX: view_dashboard_description: Permite a los usuarios acceder al panel de control y varias métricas view_devops: DevOps view_devops_description: Permite a los usuarios acceder a los paneles de control Sidekiq y pgHero + view_feeds: Visualización de cronologías y tendencias + view_feeds_description: Permitir a los usuarios acceder a las cronologías públicas y tendencias sin importar la configuración del servidor title: Roles rules: add_new: Añadir norma @@ -837,7 +839,7 @@ es-MX: title: Optar por los usuarios fuera de la indexación en los motores de búsqueda por defecto discovery: follow_recommendations: Recomendaciones de cuentas - preamble: Exponer contenido interesante a la superficie es fundamental para incorporar nuevos usuarios que pueden no conocer a nadie Mastodon. Controla cómo funcionan varias opciones de descubrimiento en tu servidor. + preamble: Exponer contenido interesante es fundamental para incorporar nuevos usuarios que pueden no conocer a nadie en Mastodon. Controla cómo funcionan en tu servidor las diferentes opciones de descubrimiento. privacy: Privacidad profile_directory: Directorio de perfiles public_timelines: Lineas de tiempo públicas @@ -851,7 +853,13 @@ es-MX: feed_access: modes: authenticated: Solo usuarios autenticados + disabled: Requerir un rol de usuario específico public: Todos + landing_page: + values: + about: Acerca de + local_feed: Cronología local + trends: Tendencias registrations: moderation_recommandation: "¡Por favor, asegúrate de contar con un equipo de moderación adecuado y activo antes de abrir el registro al público!" preamble: Controla quién puede crear una cuenta en tu servidor. @@ -1921,6 +1929,7 @@ es-MX: errors: in_reply_not_found: La publicación a la que estás intentando responder no existe. quoted_status_not_found: La publicación que intentas citar no parece existir. + quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en una Mención Privada. over_character_limit: Límite de caracteres de %{max} superado pin_errors: direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse diff --git a/config/locales/es.yml b/config/locales/es.yml index 291a5f16a..fa1b55fcf 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -796,6 +796,8 @@ es: view_dashboard_description: Permite a los usuarios acceder al panel de control y varias métricas view_devops: DevOps view_devops_description: Permite a los usuarios acceder a los paneles de control Sidekiq y pgHero + view_feeds: Visualización de cronologías y tendencias + view_feeds_description: Permitir a los usuarios acceder a las cronologías públicas y tendencias sin importar la configuración del servidor title: Roles rules: add_new: Añadir norma @@ -837,7 +839,7 @@ es: title: Excluir por defecto a los usuarios de la indexación del motor de búsqueda discovery: follow_recommendations: Recomendaciones de cuentas - preamble: Exponer contenido interesante a la superficie es fundamental para incorporar nuevos usuarios que pueden no conocer a nadie Mastodon. Controla cómo funcionan varias opciones de descubrimiento en tu servidor. + preamble: Exponer contenido interesante es fundamental para incorporar nuevos usuarios que pueden no conocer a nadie en Mastodon. Controla cómo funcionan en tu servidor las diferentes opciones de descubrimiento. privacy: Privacidad profile_directory: Directorio de perfiles public_timelines: Lineas de tiempo públicas @@ -851,7 +853,13 @@ es: feed_access: modes: authenticated: Solo usuarios autenticados + disabled: Requerir un rol de usuario específico public: Todos + landing_page: + values: + about: Acerca de + local_feed: Cronología local + trends: Tendencias registrations: moderation_recommandation: Por favor, ¡asegúrate de tener un equipo de moderación adecuado y reactivo antes de abrir los registros a todo el mundo! preamble: Controla quién puede crear una cuenta en tu servidor. @@ -1921,6 +1929,7 @@ es: errors: in_reply_not_found: La publicación a la que intentas responder no existe. quoted_status_not_found: La publicación que estás intentando citar no parece existir. + quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en una Mención Privada. over_character_limit: Límite de caracteres de %{max} superado pin_errors: direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse diff --git a/config/locales/et.yml b/config/locales/et.yml index e9b082ab9..265005cae 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -796,6 +796,8 @@ et: view_dashboard_description: Lubab kasutajail pääseda ligi töölauale ja erinevale meetrikale view_devops: DevOps view_devops_description: Lubab kasutajail ligipääsu Sidekiq ja pgHero töölaudadele + view_feeds: Vaata postituste ja teemade voogu reaalajas + view_feeds_description: Sõltumata serveri seadistustest luba kasutajatel vaadata postituste ja teemade voogu reaalajas title: Rollid rules: add_new: Lisa reegel @@ -851,7 +853,13 @@ et: feed_access: modes: authenticated: Vaid autenditud kasutajad + disabled: Eelda konkreetse kasutajarolli olemasolu public: Kõik + landing_page: + values: + about: Teave + local_feed: Kohalik sisuvoog + trends: Trendid registrations: moderation_recommandation: Enne kõigi jaoks registreerimise avamist veendu, et oleks olemas adekvaatne ja reageerimisvalmis modereerijaskond! preamble: Kes saab serveril konto luua. @@ -1415,7 +1423,7 @@ et: csv: CSV domain_blocks: Domeeni blokeeringud lists: Loetelud - mutes: Oled vaigistanud + mutes: Oled summutanud storage: Meedia hoidla featured_tags: add_new: Lisa uus @@ -1520,8 +1528,8 @@ et: one: Oled asendamas oma loetelusid faili %{filename} sisuga. Uutesse loeteludesse lisatakse kuni %{count} konto. other: Oled asendamas oma loetelusid faili %{filename} sisuga. Uutesse loeteludesse lisatakse kuni %{count} kontot. muting_html: - one: Oled asendamas oma vaigistatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} konto. - other: Oled asendamas oma vaigistatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} kontot. + one: Oled asendamas oma summutatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} konto. + other: Oled asendamas oma summutatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} kontot. preambles: blocking_html: one: Oled blokeerimas kuni %{count} konto failist %{filename}. @@ -1539,8 +1547,8 @@ et: one: Oled lisamas oma loeteludesse failist %{filename} kuni %{count} konto. Kui pole loetelusi, kuhu lisada, luuakse uued loetelud. other: Oled lisamas oma loeteludesse failist %{filename} kuni %{count} kontot. Kui pole loetelusi, kuhu lisada, luuakse uued loetelud. muting_html: - one: Oled vaigistamas kuni %{count} konto failist %{filename}. - other: Oled vaigistamas kuni %{count} kontot failist %{filename}. + one: Oled summutamas kuni %{count} konto failist %{filename}. + other: Oled summutamas kuni %{count} kontot failist %{filename}. preface: Saad importida mistahes andmeid, mis on eksporditud teisest serverist. Näiteks nimekirja inimestest, keda jälgid ja keda blokeerid. recent_imports: Viimati imporditud states: @@ -1557,11 +1565,11 @@ et: domain_blocking: Blokeeritud domeenide importimine following: Jälgitavate kontode importimine lists: Loetelude importimine - muting: Vaigistatud kontode importimine + muting: Summutatud kontode importimine type: Importimise tüüp type_groups: constructive: Jälgimised & Järjehoidjad - destructive: Blokeerimised & Vaigistamised + destructive: Blokeerimised & summutamised types: blocking: Blokeeringute nimekiri bookmarks: Järjehoidjad @@ -1670,7 +1678,7 @@ et: title: Modereerimine move_handler: carry_blocks_over_text: See kasutaja kolis kontolt %{acct}, mis oli keelatud. - carry_mutes_over_text: Kasutaja kolis ümber kontolt %{acct}, mis oli vaigistatud. + carry_mutes_over_text: Kasutaja kolis ümber kontolt %{acct}, mis oli summutatud. copy_account_note_text: 'Kasutaja kolis kontolt %{acct}, kus olid eelnevad märkmed tema kohta:' navigation: toggle_menu: Menüü lülimine @@ -1921,6 +1929,7 @@ et: errors: in_reply_not_found: Postitus, millele üritad vastata, ei näi enam eksisteerivat. quoted_status_not_found: Postitus, mida üritad tsiteerida, ei näi enam eksisteerivat. + quoted_user_not_mentioned: Privaatses mainimisega postituses ei saa tsiteerida mittemaninitud kasutajat. over_character_limit: tähtmärkide limiit %{max} ületatud pin_errors: direct: Ei saa kinnitada postitusi, mis on nähtavad vaid mainitud kasutajatele diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 9e1fcc88a..242bfa51a 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -798,7 +798,6 @@ eu: title: Erabiltzaileei bilaketa-motorraren indexaziotik at egoteko aukera ematen die lehenetsitako aukera modura discovery: follow_recommendations: Jarraitzeko gomendioak - preamble: Eduki interesgarria aurkitzea garrantzitsua da Mastodoneko erabiltzaile berrientzat, behar bada inor ez dutelako ezagutuko. Kontrolatu zure zerbitzariko aurkikuntza-ezaugarriek nola funtzionatzen duten. privacy: Pribatutasuna profile_directory: Profil-direktorioa public_timelines: Denbora-lerro publikoak diff --git a/config/locales/fa.yml b/config/locales/fa.yml index bfcb48158..b457f5b2d 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -796,6 +796,8 @@ fa: view_dashboard_description: اجازه به کاربران برای دسترسی به داشتبورد و سنجه‌های مختلف view_devops: دواپس view_devops_description: به کاربران امکان دسترسی به داشبورد Sidekiq و pgHero را می دهد + view_feeds: دیدن خوراک‌های موضوع و زنده + view_feeds_description: می‌گذارد کاربران فارغ از تنظیمات کارساز به خوراک‌های موضوع و زنده دسترسی داشته باشند title: نقش‌ها rules: add_new: افزودن قانون @@ -837,7 +839,7 @@ fa: title: درخواست خروج از اندیس‌گذاری پیش‌گزیدهٔ موتور جست‌وجو discovery: follow_recommendations: پیروی از پیشنهادها - preamble: ارائه محتوای جالب در جذب کاربران جدیدی که ممکن است کسی ماستودون را نشناسند، مفید است. نحوه عملکرد ویژگی‌های کشف مختلف روی سرور خود را کنترل کنید. + preamble: ارائه محتوای جذّاب برای آغاز به کار کاربرانی که شاید کسی را روی ماستودون نشناسند ضروری است. واپایش چگونگی کار کردن ویژگی‌های کشف روی کارسازتان. privacy: محرمانگی profile_directory: شاخهٔ نمایه public_timelines: خط زمانی‌های عمومی @@ -848,6 +850,16 @@ fa: all: برای همه disabled: برای هیچ‌کدام users: برای کاربران محلی واردشده + feed_access: + modes: + authenticated: تنها کاربران تأیید شده + disabled: نیازمند نقش کاربری خاص + public: هرکسی + landing_page: + values: + about: درباره + local_feed: خوراک محلی + trends: داغ‌ها registrations: moderation_recommandation: لطفاً قبل از اینکه ثبت نام را برای همه باز کنید، مطمئن شوید که یک تیم نظارتی مناسب و واکنشی دارید! preamble: کنترل کنید چه کسی می تواند در سرور شما یک حساب ایجاد کند. @@ -901,6 +913,7 @@ fa: no_status_selected: هیچ فرسته‌ای تغییری نکرد زیرا هیچ‌کدام از آن‌ها انتخاب نشده بودند open: گشودن فرسته original_status: فرستهٔ اصلی + quotes: نقل‌ها reblogs: تقویت‌ها replied_to_html: به %{acct_link} پاسخ داد status_changed: فرسته تغییر کرد @@ -908,6 +921,7 @@ fa: title: پست‌های حساب - @%{name} trending: پرطرفدار view_publicly: مشاهده عمومی + view_quoted_post: دیدن فرستهٔ نقل شده visibility: نمایانی with_media: دارای عکس یا ویدیو strikes: @@ -1182,7 +1196,10 @@ fa: hint_html: اگر می‌خواهید از حساب دیگری به این حساب منتقل شوید، این‌جا می‌توانید یک نام مستعار بسازید که برای انتقال از حساب قدیمی به این حساب لازم است. این کار به تنهایی بی‌ضرر و قابل بازگشت است. فرایند انتقال حساب از حساب قدیمی آغاز خواهد شد. remove: حذف ارتباط نام مستعار appearance: + advanced_settings: تنظیمات پیش‌رفته animations_and_accessibility: پویانمایی‌های و دسترسی‌پذیری + boosting_preferences: ترجیحات تقویت + boosting_preferences_info_html: "‏نکته: فارغ از تنظیمات، تبدیل + کلیک روی %{icon} نقشک تقویت بلافاصله تقویت خواهد کرد" discovery: کاوش localization: body: ماستودون توسط داوطلبان ترجمه شده است. @@ -1584,6 +1601,13 @@ fa: expires_at: تاریخ انقضا uses: استفاده‌ها title: دعوت دیگران + link_preview: + author_html: به دست %{name} + potentially_sensitive_content: + action: زدن برای نمایش + confirm_visit: مطمئنید که می‌خواهید این پیوند را بگشایید؟ + hide_button: نهفتن + label: محتوای بالقوه حسّاس lists: errors: limit: به بیشینهٔ تعداد سیاهه‌ها رسیدید @@ -1736,6 +1760,9 @@ fa: self_vote: شما نمی توانید در نظرسنجی خودتان رای دهید too_few_options: حتماً باید بیش از یک گزینه داشته باشد too_many_options: نمی‌تواند بیشتر از %{max} گزینه داشته باشد + vote: رأی + posting_defaults: + explanation: این تنظیمات هنگام ایجاد فرسته به عنوان پیش‌گزیده استفاده خواهند شد؛ ولی می‌توانید در نویسنده برای هر فرسته تغییرش دهید. preferences: other: سایر تنظیمات posting_defaults: تنظیمات پیش‌فرض انتشار @@ -1891,6 +1918,9 @@ fa: other: "%{count} ویدیو" boosted_from_html: تقویت شده از طرف %{acct_link} content_warning: 'هشدا محتوا: %{warning}' + content_warnings: + hide: نهفتن فرسته + show: نمایش بیش‌تر default_language: همانند زبان واسط disallowed_hashtags: one: 'دارای برچسبی غیرمجاز: %{tags}' @@ -1905,10 +1935,23 @@ fa: limit: از این بیشتر نمی‌شود نوشته‌های ثابت داشت ownership: نوشته‌های دیگران را نمی‌توان ثابت کرد reblog: تقویت نمی‌تواند سنجاق شود + quote_error: + not_available: فرسته ناموجود + pending_approval: فرسته منتظر + revoked: فرسته به دست نگارنده برداشته شد + quote_policies: + followers: تنها پی‌گیران + nobody: فقط من + public: هرکسی + quote_post_author: فرسته‌ای از %{acct} را نقل کرد title: "%{name}: «%{quote}»" visibilities: direct: اشاره خصوصی + private: تنها پی‌گیران public: عمومی + public_long: هرکسی داخل و خارج از ماستودون + unlisted: عمومی ساکت + unlisted_long: نهفته از نتیجه‌های جست‌وجوی ماستودون و خط‌های زمانی داغ و عمومی statuses_cleanup: enabled: حذف خودکار فرسته‌های قدیمی enabled_hint: فرسته‌هایتان را هنگام رسیدن به کرانهٔ سن خاصی به صورت خودکار حذف می‌کند، مگر این که با یکی از استثناهای زیر مطابق باشند diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 9a5d8f900..d1203fbee 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -796,6 +796,8 @@ fi: view_dashboard_description: Sallii käyttäjille pääsyn koontinäyttöön ja erilaisiin mittareihin view_devops: DevOps view_devops_description: Sallii käyttäjille pääsyn Sidekiq- ja pgHero-hallintapaneeleihin + view_feeds: Näytä live- ja aihesyötteet + view_feeds_description: Sallii käyttäjien tarkastella live- ja aihesyötteitä palvelimen asetuksista riippumatta title: Roolit rules: add_new: Lisää sääntö @@ -837,12 +839,12 @@ fi: title: Jätä käyttäjät oletusarvoisesti hakukoneindeksoinnin ulkopuolelle discovery: follow_recommendations: Seurantasuositukset - preamble: Mielenkiintoisen sisällön esille tuominen auttaa saamaan uusia käyttäjiä, jotka eivät ehkä tunne ketään Mastodonista. Määrittele, kuinka erilaiset löytämisominaisuudet toimivat palvelimellasi. + preamble: Mielenkiintoisen sisällön esille tuominen on keskeistä perehdyttäessä uusia käyttäjiä, jotka eivät ehkä tunne ketään Mastodonissa. Hallitse, miten eri löydettävyysominaisuudet toimivat palvelimellasi. privacy: Yksityisyys profile_directory: Profiilihakemisto public_timelines: Julkiset aikajanat publish_statistics: Julkaise tilastot - title: Löytäminen + title: Löydettävyys trends: Trendit domain_blocks: all: Kaikille @@ -851,7 +853,13 @@ fi: feed_access: modes: authenticated: Vain todennetut käyttäjät + disabled: Vaadi tiettyä käyttäjäroolia public: Kaikki + landing_page: + values: + about: Tietoja + local_feed: Paikallinen syöte + trends: Trendit registrations: moderation_recommandation: Varmista, että sinulla on riittävä ja toimintavalmis joukko moderaattoreita, ennen kuin avaat rekisteröitymisen kaikille! preamble: Määritä, kuka voi luoda tilin palvelimellesi. @@ -1192,7 +1200,7 @@ fi: animations_and_accessibility: Animaatiot ja saavutettavuus boosting_preferences: Tehostusasetukset boosting_preferences_info_html: "Vihje: Asetuksista riippumatta Vaihto + napsautus %{icon} Tehosta-kuvakkeeseen tehostaa välittömästi." - discovery: Löytäminen + discovery: Löydettävyys localization: body: Mastodonin ovat kääntäneet vapaaehtoiset. guide_link: https://crowdin.com/project/mastodon @@ -1921,6 +1929,7 @@ fi: errors: in_reply_not_found: Julkaisua, johon yrität vastata, ei näytä olevan olemassa. quoted_status_not_found: Julkaisua, jota yrität lainata, ei näytä olevan olemassa. + quoted_user_not_mentioned: Mainitsematonta käyttäjää ei voi lainata yksityismaininnassa. over_character_limit: merkkimäärän rajoitus %{max} ylitetty pin_errors: direct: Vain mainituille käyttäjille näkyviä julkaisuja ei voi kiinnittää @@ -2077,7 +2086,7 @@ fi: disable: Et voi enää käyttää tiliäsi, mutta profiilisi ja muut tiedot pysyvät muuttumattomina. Voit pyytää varmuuskopiota tiedoistasi, vaihtaa tilin asetuksia tai poistaa tilisi. mark_statuses_as_sensitive: Palvelimen %{instance} moderaattorit ovat merkinneet osan julkaisuistasi arkaluonteisiksi. Tämä tarkoittaa sitä, että mediaa täytyy napauttaa ennen kuin sen esikatselu näytetään. Voit merkitä median itse arkaluonteiseksi, kun julkaiset tulevaisuudessa. sensitive: Tästä lähtien kaikki lähetetyt mediatiedostot merkitään arkaluonteisiksi ja piilotetaan napsautusvaroituksen taakse. - silence: Voit edelleen käyttää tiliäsi, mutta vain sinua jo seuraavat käyttäjät näkevät julkaisusi tällä palvelimella ja sinut voidaan sulkea pois eri löytämisominaisuuksista. Toiset voivat kuitenkin edelleen seurata sinua manuaalisesti. + silence: Voit edelleen käyttää tiliäsi, mutta vain sinua jo seuraavat käyttäjät näkevät julkaisusi tällä palvelimella ja sinut voidaan sulkea pois eri löydettävyysominaisuuksista. Toiset voivat kuitenkin edelleen seurata sinua manuaalisesti. suspend: Et voi enää käyttää tiliäsi, eivätkä profiilisi ja muut tiedot ole enää käytettävissä. Voit silti kirjautua sisään pyytääksesi tietojesi varmuuskopiota, kunnes tiedot on poistettu kokonaan noin 30 päivän kuluttua. Säilytämme kuitenkin joitain perustietoja, jotka estävät sinua kiertämästä jäädytystä. reason: 'Syy:' statuses: 'Julkaisuja lainattu:' diff --git a/config/locales/fo.yml b/config/locales/fo.yml index c1f02e17c..6569f6738 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -796,6 +796,8 @@ fo: view_dashboard_description: Gevur brúkarum atgongd til kunningarbrettið og ymisk mát view_devops: DevOps view_devops_description: Gevur brúkarum atgongd til Sidekiq- og pgHero-kunningarbretti + view_feeds: Vís beinleiðis rásir og evnisrásir + view_feeds_description: Loyvir brúkarum atgongd til beinleiðis rásir og evnisrásir, óansæð ambætisstillingar title: Leiklutir rules: add_new: Ger nýggja reglu @@ -851,7 +853,13 @@ fo: feed_access: modes: authenticated: Einans váttaðir brúkarar + disabled: Krev serstakan brúkaraleiklut public: Øll + landing_page: + values: + about: Um + local_feed: Lokal rás + trends: Rák registrations: moderation_recommandation: Vinarliga tryggja tær, at tú hevur eitt nøktandi og klárt umsjónartoymi, áðreen tú letur upp fyri skrásetingum frá øllum! preamble: Stýr, hvør kann stovna eina kontu á tínum ambætara. @@ -1921,6 +1929,7 @@ fo: errors: in_reply_not_found: Posturin, sum tú roynir at svara, sýnist ikki at finnast. quoted_status_not_found: Posturin, sum tú roynir at sitera, sýnist ikki at finnast. + quoted_user_not_mentioned: Kann ikki sitera ein brúkara, sum ikki er nevndur, í einum posti, sum er ein privat umrøða. over_character_limit: mesta tal av teknum, %{max}, rokkið pin_errors: direct: Postar, sum einans eru sjónligir hjá nevndum brúkarum, kunnu ikki festast diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 0ae44cf37..d393ab294 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -190,6 +190,7 @@ fr-CA: create_relay: Créer un relais create_unavailable_domain: Créer un domaine indisponible create_user_role: Créer le rôle + create_username_block: Créer une règle de nom d'utilisateur demote_user: Rétrograder l’utilisateur·ice destroy_announcement: Supprimer l’annonce destroy_canonical_email_block: Supprimer le blocage de courriel @@ -203,6 +204,7 @@ fr-CA: destroy_status: Supprimer le message destroy_unavailable_domain: Supprimer le domaine indisponible destroy_user_role: Détruire le rôle + destroy_username_block: Supprimer la règle de nom d'utilisateur disable_2fa_user: Désactiver l’A2F disable_custom_emoji: Désactiver les émojis personnalisés disable_relay: Désactiver le relais @@ -237,6 +239,7 @@ fr-CA: update_report: Mettre à jour le rapport update_status: Mettre à jour le message update_user_role: Mettre à jour le rôle + update_username_block: Mettre à jour la règle de nom d'utilisateur actions: approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}" approve_user_html: "%{name} a approuvé l’inscription de %{target}" @@ -255,6 +258,7 @@ fr-CA: create_relay_html: "%{name} a créé un relais %{target}" create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}" create_user_role_html: "%{name} a créé le rôle %{target}" + create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur contenant %{target}" demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" @@ -268,6 +272,7 @@ fr-CA: destroy_status_html: "%{name} a supprimé le message de %{target}" destroy_unavailable_domain_html: "%{name} a repris la livraison au domaine %{target}" destroy_user_role_html: "%{name} a supprimé le rôle %{target}" + destroy_username_block_html: "%{name} a supprimé une règle pour les noms d'utilisateurs contenant %{target}" disable_2fa_user_html: "%{name} a désactivé l'authentification à deux facteurs pour l'utilisateur·rice %{target}" disable_custom_emoji_html: "%{name} a désactivé l'émoji %{target}" disable_relay_html: "%{name} a désactivé le relais %{target}" @@ -302,6 +307,7 @@ fr-CA: update_report_html: "%{name} a mis à jour le rapport de signalement %{target}" update_status_html: "%{name} a mis à jour le message de %{target}" update_user_role_html: "%{name} a changé le rôle %{target}" + update_username_block_html: "%{name} a mis à jour une règle pour les noms d'utilisateurs contenant %{target}" deleted_account: compte supprimé empty: Aucun journal trouvé. filter_by_action: Filtrer par action @@ -489,9 +495,17 @@ fr-CA: created_at: Créé à delete: Supprimer ip: Adresse IP + request_body: Corps de la demande providers: + active: Activé + base_url: URL de base + callback: Rappel + delete: Supprimer + edit: Modifier un fournisseur + finish_registration: Terminer l'inscription name: Nom providers: Fournisseur + registration_requested: Inscription demandée registrations: confirm: Confirmer description: Vous avez reçu une souscription d'un FSAF. Rejetez-la si vous ne l'avez pas initiée. Si c'est bien votre intention, comparez le nom et l'empreinte de la clé avant de confirmer la souscription. @@ -502,6 +516,7 @@ fr-CA: sign_in: Se connecter status: État title: Fournisseurs de Services Auxiliaire du Fedivers + title: FASP follow_recommendations: description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée." language: Pour la langue @@ -571,6 +586,11 @@ fr-CA: limited: Limité title: Modération moderation_notes: + create: Ajouter une note de modération + created_msg: Note de modération de l'instance créée avec succès ! + description_html: Voir et laisser des notes pour les autres modérateurs et pour référence future + destroyed_msg: Note de modération de l'instance supprimée avec succès ! + placeholder: Informations à propos de cette instance, actions entreprises ou de toute autre chose qui vous aidera à modérer cette instance à l'avenir. title: Notes de modération private_comment: Commentaire privé public_comment: Commentaire public @@ -777,6 +797,8 @@ fr-CA: view_dashboard_description: Permet aux utilisateur⋅rice⋅s d'accéder au tableau de bord et à diverses statistiques view_devops: DevOps view_devops_description: Permet aux utilisateur⋅rice⋅s d'accéder aux tableaux de bord Sidekiq et pgHero + view_feeds: Voir les flux en direct et les fils de discussion + view_feeds_description: Permet aux utilisateur·rice·s d'accéder aux flux en direct et de discussion indépendamment des paramètres du serveur title: Rôles rules: add_new: Ajouter une règle @@ -785,9 +807,12 @@ fr-CA: description_html: Bien que la plupart des gens prétende avoir lu les conditions d'utilisation avant de les accepter, généralement les utilisateur·rice·s ne les lisent vraiment que lorsque un problème apparaît. Pour faciliter la visualisation des règles de votre serveur en un seul coup d’œil, présentez-les sous la forme d'une liste à puces ! Essayez de garder chacune des règles simple et concise, mais faites attention à ne pas non plus les diviser en de trop nombreux éléments distincts. edit: Modifier la règle empty: Aucune règle de serveur n'a été définie pour l'instant. + move_down: Déplacer vers le bas + move_up: Déplacer vers le haut title: Règles du serveur translation: Traduction translations: Traductions + translations_explanation: Vous pouvez éventuellement ajouter des traductions pour les règles. La valeur par défaut sera affichée si aucune version traduite n'est disponible. Veuillez toujours vous assurer que toute traduction fournie est synchronisée avec la valeur par défaut. settings: about: manage_rules: Gérer les règles du serveur @@ -812,7 +837,7 @@ fr-CA: title: Par défaut, ne pas indexer les comptes dans les moteurs de recherche discovery: follow_recommendations: Suivre les recommandations - preamble: Faire apparaître un contenu intéressant est essentiel pour interagir avec de nouveaux utilisateurs qui ne connaissent peut-être personne sur Mastodonte. Contrôlez le fonctionnement des différentes fonctionnalités de découverte sur votre serveur. + privacy: Vie privée profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques @@ -822,6 +847,15 @@ fr-CA: all: À tout le monde disabled: À personne users: Aux utilisateur·rice·s connecté·e·s localement + feed_access: + modes: + authenticated: Utilisateurs authentifiés uniquement + public: Tout le monde + landing_page: + values: + about: À propos + local_feed: Fil local + trends: Tendances registrations: moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! preamble: Affecte qui peut créer un compte sur votre serveur. @@ -875,6 +909,7 @@ fr-CA: no_status_selected: Aucun message n’a été modifié car aucun n’a été sélectionné open: Ouvrir le message original_status: Message original + quotes: Citations reblogs: Partages replied_to_html: Répondu à %{acct_link} status_changed: Publication modifiée @@ -882,6 +917,7 @@ fr-CA: title: Messages du compte - @%{name} trending: Tendances view_publicly: Afficher de manière publique + view_quoted_post: Voir la publication citée visibility: Visibilité with_media: Avec médias strikes: @@ -1063,6 +1099,22 @@ fr-CA: other: Utilisé par %{count} personnes au cours de la dernière semaine title: Recommandations et tendances trending: Tendances + username_blocks: + add_new: Ajouter un nouveau + block_registrations: Bloquer les inscriptions + comparison: + contains: Contient + equals: Est égal à + contains_html: Contient %{string} + created_msg: Règle de nom d'utilisateur créée avec succès + delete: Supprimer + edit: + title: Modifier la règle de nom d'utilisateur + new: + create: Créer une règle + title: Créer une nouvelle règle de nom d'utilisateur + no_username_block_selected: Aucune règle de nom d'utilisateur n'a été modifiée car aucune n'a été sélectionnée + title: Règles de nom d'utilisateur warning_presets: add_new: Ajouter un nouveau delete: Supprimer @@ -1135,7 +1187,9 @@ fr-CA: hint_html: Si vous voulez déménager d’un autre compte vers celui-ci, vous pouvez créer ici un alias, qui est nécessaire avant de pouvoir migrer les abonné·e·s de l’ancien compte vers celui-ci. Cette action en soi est inoffensive et réversible. La migration du compte est initiée à partir de l’ancien compte. remove: Détacher l'alias appearance: + advanced_settings: Paramètres avancés animations_and_accessibility: Animations et accessibilité + boosting_preferences: Préférences de partage discovery: Découverte localization: body: Mastodon est traduit par des volontaires. @@ -1324,6 +1378,10 @@ fr-CA: basic_information: Informations de base hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." other: Autre + emoji_styles: + auto: Auto + native: Natif + twemoji: Twemoji errors: '400': La demande que vous avez soumise est invalide ou mal formée. '403': Vous n’avez pas accès à cette page. @@ -1533,6 +1591,12 @@ fr-CA: expires_at: Expire uses: Utilisations title: Inviter des gens + link_preview: + author_html: Par %{name} + potentially_sensitive_content: + confirm_visit: Voulez-vous vraiment ouvrir ce lien ? + hide_button: Masquer + label: Contenu potentiellement sensible lists: errors: limit: Vous avez atteint le nombre maximum de listes @@ -1633,6 +1697,10 @@ fr-CA: title: Nouvelle mention poll: subject: Un sondage de %{name} est terminé + quote: + body: 'Votre message a été cité par %{name}:' + subject: "%{name} a cité votre message" + title: Nouvelle citation reblog: body: 'Votre message été partagé par %{name} :' subject: "%{name} a partagé votre message" @@ -1681,6 +1749,9 @@ fr-CA: self_vote: Vous ne pouvez pas voter à vos propres sondages too_few_options: doit avoir plus qu’une proposition too_many_options: ne peut contenir plus de %{max} propositions + vote: Voter + posting_defaults: + explanation: Ces paramètres seront utilisés par défaut lorsque vous créez de nouveaux messages, mais vous pouvez les modifier par message dans le champs de rédaction. preferences: other: Autre posting_defaults: Paramètres de publication par défaut @@ -1836,6 +1907,9 @@ fr-CA: other: "%{count} vidéos" boosted_from_html: Partagé depuis %{acct_link} content_warning: 'Avertissement sur le contenu : %{warning}' + content_warnings: + hide: Masquer le message + show: Afficher plus default_language: Même langue que celle de l’interface disallowed_hashtags: one: 'contient un hashtag désactivé : %{tags}' @@ -1843,15 +1917,29 @@ fr-CA: edited_at_html: Édité le %{date} errors: in_reply_not_found: Le message auquel vous essayez de répondre ne semble pas exister. + quoted_status_not_found: Le message que vous essayez de citer ne semble pas exister. over_character_limit: limite de %{max} caractères dépassée pin_errors: direct: Les messages qui ne sont visibles que pour les utilisateur·rice·s mentionné·e·s ne peuvent pas être épinglés limit: Vous avez déjà épinglé le nombre maximum de messages ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas reblog: Un partage ne peut pas être épinglé + quote_error: + not_available: Message indisponible + pending_approval: Message en attente + revoked: Message supprimé par l'auteur + quote_policies: + followers: Abonné·e·s seulement + nobody: Moi uniquement + public: Tout le monde + quote_post_author: A cité un message de %{acct} title: "%{name} : « %{quote} »" visibilities: + direct: Mention privée + private: Abonné·e·s seulement public: Publique + public_long: Tout le monde sur et en dehors de Mastodon + unlisted: Public discret statuses_cleanup: enabled: Supprimer automatiquement vos anciens messages enabled_hint: Supprime automatiquement vos messages une fois qu'ils ont atteint un seuil d'ancienneté défini, à moins qu'ils ne correspondent à l'une des exceptions ci-dessous diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 42e0507fe..a268d87dd 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -190,6 +190,7 @@ fr: create_relay: Créer un relais create_unavailable_domain: Créer un domaine indisponible create_user_role: Créer le rôle + create_username_block: Créer une règle de nom d'utilisateur demote_user: Rétrograder l’utilisateur·ice destroy_announcement: Supprimer l’annonce destroy_canonical_email_block: Supprimer le blocage de courriel @@ -203,6 +204,7 @@ fr: destroy_status: Supprimer le message destroy_unavailable_domain: Supprimer le domaine indisponible destroy_user_role: Détruire le rôle + destroy_username_block: Supprimer la règle de nom d'utilisateur disable_2fa_user: Désactiver l’A2F disable_custom_emoji: Désactiver les émojis personnalisés disable_relay: Désactiver le relais @@ -237,6 +239,7 @@ fr: update_report: Mettre à jour le rapport update_status: Mettre à jour le message update_user_role: Mettre à jour le rôle + update_username_block: Mettre à jour la règle de nom d'utilisateur actions: approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}" approve_user_html: "%{name} a approuvé l’inscription de %{target}" @@ -255,6 +258,7 @@ fr: create_relay_html: "%{name} a créé un relais %{target}" create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}" create_user_role_html: "%{name} a créé le rôle %{target}" + create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur contenant %{target}" demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" @@ -268,6 +272,7 @@ fr: destroy_status_html: "%{name} a supprimé le message de %{target}" destroy_unavailable_domain_html: "%{name} a repris la livraison au domaine %{target}" destroy_user_role_html: "%{name} a supprimé le rôle %{target}" + destroy_username_block_html: "%{name} a supprimé une règle pour les noms d'utilisateurs contenant %{target}" disable_2fa_user_html: "%{name} a désactivé l'authentification à deux facteurs pour l'utilisateur·rice %{target}" disable_custom_emoji_html: "%{name} a désactivé l'émoji %{target}" disable_relay_html: "%{name} a désactivé le relais %{target}" @@ -302,6 +307,7 @@ fr: update_report_html: "%{name} a mis à jour le rapport de signalement %{target}" update_status_html: "%{name} a mis à jour le message de %{target}" update_user_role_html: "%{name} a changé le rôle %{target}" + update_username_block_html: "%{name} a mis à jour une règle pour les noms d'utilisateurs contenant %{target}" deleted_account: compte supprimé empty: Aucun journal trouvé. filter_by_action: Filtrer par action @@ -489,9 +495,17 @@ fr: created_at: Créé à delete: Supprimer ip: Adresse IP + request_body: Corps de la demande providers: + active: Activé + base_url: URL de base + callback: Rappel + delete: Supprimer + edit: Modifier un fournisseur + finish_registration: Terminer l'inscription name: Nom providers: Fournisseur + registration_requested: Inscription demandée registrations: confirm: Confirmer description: Vous avez reçu une souscription d'un FSAF. Rejetez-la si vous ne l'avez pas initiée. Si c'est bien votre intention, comparez le nom et l'empreinte de la clé avant de confirmer la souscription. @@ -502,6 +516,7 @@ fr: sign_in: Se connecter status: État title: Fournisseurs de Services Auxiliaire du Fedivers + title: FASP follow_recommendations: description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée." language: Pour la langue @@ -571,6 +586,11 @@ fr: limited: Limité title: Modération moderation_notes: + create: Ajouter une note de modération + created_msg: Note de modération de l'instance créée avec succès ! + description_html: Voir et laisser des notes pour les autres modérateurs et pour référence future + destroyed_msg: Note de modération de l'instance supprimée avec succès ! + placeholder: Informations à propos de cette instance, actions entreprises ou de toute autre chose qui vous aidera à modérer cette instance à l'avenir. title: Notes de modération private_comment: Commentaire privé public_comment: Commentaire public @@ -777,6 +797,8 @@ fr: view_dashboard_description: Permet aux utilisateur⋅rice⋅s d'accéder au tableau de bord et à diverses statistiques view_devops: DevOps view_devops_description: Permet aux utilisateur⋅rice⋅s d'accéder aux tableaux de bord Sidekiq et pgHero + view_feeds: Voir les flux en direct et les fils de discussion + view_feeds_description: Permet aux utilisateur·rice·s d'accéder aux flux en direct et de discussion indépendamment des paramètres du serveur title: Rôles rules: add_new: Ajouter une règle @@ -785,9 +807,12 @@ fr: description_html: Bien que la plupart des gens prétende avoir lu les conditions d'utilisation avant de les accepter, généralement les utilisateur·rice·s ne les lisent vraiment que lorsque un problème apparaît. Pour faciliter la visualisation des règles de votre serveur en un seul coup d’œil, présentez-les sous la forme d'une liste à puces ! Essayez de garder chacune des règles simple et concise, mais faites attention à ne pas non plus les diviser en de trop nombreux éléments distincts. edit: Modifier la règle empty: Aucune règle de serveur n'a été définie pour l'instant. + move_down: Déplacer vers le bas + move_up: Déplacer vers le haut title: Règles du serveur translation: Traduction translations: Traductions + translations_explanation: Vous pouvez éventuellement ajouter des traductions pour les règles. La valeur par défaut sera affichée si aucune version traduite n'est disponible. Veuillez toujours vous assurer que toute traduction fournie est synchronisée avec la valeur par défaut. settings: about: manage_rules: Gérer les règles du serveur @@ -812,7 +837,7 @@ fr: title: Par défaut, ne pas indexer les comptes dans les moteurs de recherche discovery: follow_recommendations: Suivre les recommandations - preamble: Il est essentiel de donner de la visibilité à des contenus intéressants pour attirer des utilisateur⋅rice⋅s néophytes qui ne connaissent peut-être personne sur Mastodon. Contrôlez le fonctionnement des différentes fonctionnalités de découverte sur votre serveur. + privacy: Vie privée profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques @@ -822,6 +847,15 @@ fr: all: À tout le monde disabled: À personne users: Aux utilisateur·rice·s connecté·e·s localement + feed_access: + modes: + authenticated: Utilisateurs authentifiés uniquement + public: Tout le monde + landing_page: + values: + about: À propos + local_feed: Fil local + trends: Tendances registrations: moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! preamble: Affecte qui peut créer un compte sur votre serveur. @@ -875,6 +909,7 @@ fr: no_status_selected: Aucun message n’a été modifié car aucun n’a été sélectionné open: Ouvrir le message original_status: Message original + quotes: Citations reblogs: Partages replied_to_html: Répondu à %{acct_link} status_changed: Message modifié @@ -882,6 +917,7 @@ fr: title: Messages du compte - @%{name} trending: Tendances view_publicly: Afficher de manière publique + view_quoted_post: Voir la publication citée visibility: Visibilité with_media: Avec médias strikes: @@ -1063,6 +1099,22 @@ fr: other: Utilisé par %{count} personnes au cours de la dernière semaine title: Recommandations et tendances trending: Tendances + username_blocks: + add_new: Ajouter un nouveau + block_registrations: Bloquer les inscriptions + comparison: + contains: Contient + equals: Est égal à + contains_html: Contient %{string} + created_msg: Règle de nom d'utilisateur créée avec succès + delete: Supprimer + edit: + title: Modifier la règle de nom d'utilisateur + new: + create: Créer une règle + title: Créer une nouvelle règle de nom d'utilisateur + no_username_block_selected: Aucune règle de nom d'utilisateur n'a été modifiée car aucune n'a été sélectionnée + title: Règles de nom d'utilisateur warning_presets: add_new: Ajouter un nouveau delete: Supprimer @@ -1135,7 +1187,9 @@ fr: hint_html: Si vous voulez déménager d’un autre compte vers celui-ci, vous pouvez créer ici un alias, qui est nécessaire avant de pouvoir migrer les abonné·e·s de l’ancien compte vers celui-ci. Cette action en soi est inoffensive et réversible. La migration du compte est initiée à partir de l’ancien compte. remove: Détacher l'alias appearance: + advanced_settings: Paramètres avancés animations_and_accessibility: Animations et accessibilité + boosting_preferences: Préférences de partage discovery: Découverte localization: body: Mastodon est traduit par des volontaires. @@ -1324,6 +1378,10 @@ fr: basic_information: Informations de base hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." other: Autre + emoji_styles: + auto: Auto + native: Natif + twemoji: Twemoji errors: '400': La demande que vous avez soumise est invalide ou mal formée. '403': Vous n’avez pas accès à cette page. @@ -1533,6 +1591,12 @@ fr: expires_at: Expire uses: Utilisations title: Inviter des gens + link_preview: + author_html: Par %{name} + potentially_sensitive_content: + confirm_visit: Voulez-vous vraiment ouvrir ce lien ? + hide_button: Masquer + label: Contenu potentiellement sensible lists: errors: limit: Vous avez atteint le nombre maximum de listes @@ -1633,6 +1697,10 @@ fr: title: Nouvelle mention poll: subject: Un sondage de %{name} est terminé + quote: + body: 'Votre message a été cité par %{name}:' + subject: "%{name} a cité votre message" + title: Nouvelle citation reblog: body: 'Votre message été partagé par %{name} :' subject: "%{name} a partagé votre message" @@ -1681,6 +1749,9 @@ fr: self_vote: Vous ne pouvez pas voter à vos propres sondages too_few_options: doit avoir plus qu’une proposition too_many_options: ne peut contenir plus de %{max} propositions + vote: Voter + posting_defaults: + explanation: Ces paramètres seront utilisés par défaut lorsque vous créez de nouveaux messages, mais vous pouvez les modifier par message dans le champs de rédaction. preferences: other: Autre posting_defaults: Paramètres de publication par défaut @@ -1836,6 +1907,9 @@ fr: other: "%{count} vidéos" boosted_from_html: Partagé depuis %{acct_link} content_warning: 'Avertissement de contenu : %{warning}' + content_warnings: + hide: Masquer le message + show: Afficher plus default_language: Même langue que celle de l’interface disallowed_hashtags: one: 'contient un hashtag désactivé : %{tags}' @@ -1843,15 +1917,29 @@ fr: edited_at_html: Modifié le %{date} errors: in_reply_not_found: Le message auquel vous essayez de répondre ne semble pas exister. + quoted_status_not_found: Le message que vous essayez de citer ne semble pas exister. over_character_limit: limite de %{max} caractères dépassée pin_errors: direct: Les messages qui ne sont visibles que pour les utilisateur·rice·s mentionné·e·s ne peuvent pas être épinglés limit: Vous avez déjà épinglé le nombre maximum de messages ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas reblog: Un partage ne peut pas être épinglé + quote_error: + not_available: Message indisponible + pending_approval: Message en attente + revoked: Message supprimé par l'auteur + quote_policies: + followers: Abonné·e·s seulement + nobody: Moi uniquement + public: Tout le monde + quote_post_author: A cité un message de %{acct} title: "%{name} : « %{quote} »" visibilities: + direct: Mention privée + private: Abonné·e·s seulement public: Publique + public_long: Tout le monde sur et en dehors de Mastodon + unlisted: Public discret statuses_cleanup: enabled: Supprimer automatiquement vos anciens messages enabled_hint: Supprime automatiquement vos messages une fois qu'ils ont atteint un seuil d'ancienneté défini, à moins qu'ils ne correspondent à l'une des exceptions ci-dessous diff --git a/config/locales/fy.yml b/config/locales/fy.yml index bad1e43f2..9c489c03e 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -837,7 +837,6 @@ fy: title: Brûkers standert net troch sykmasinen yndeksearje litte discovery: follow_recommendations: Oanrekommandearre accounts - preamble: It toanen fan ynteressante ynhâld is fan essinsjeel belang foar it oan board heljen fan nije brûkers dy’t mooglik net ien fan Mastodon kinne. Bepaal hoe’t ferskate funksjes foar it ûntdekken fan ynhâld en brûkers op jo server wurkje. privacy: Privacy profile_directory: Profylmap public_timelines: Iepenbiere tiidlinen diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 401751ce5..e4a60a143 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -838,6 +838,8 @@ ga: view_dashboard_description: Ligeann sé d’úsáideoirí rochtain a fháil ar an deais agus ar mhéadrachtaí éagsúla view_devops: DevOps view_devops_description: Ligeann sé d’úsáideoirí rochtain a fháil ar dheais Sidekiq agus pgHero + view_feeds: Féach ar fhothaí beo agus topaicí + view_feeds_description: Ceadaíonn sé d’úsáideoirí rochtain a fháil ar na fothaí beo agus topaicí beag beann ar shocruithe an fhreastalaí title: Róil rules: add_new: Cruthaigh riail @@ -879,7 +881,7 @@ ga: title: Diúltaigh d'innéacsú inneall cuardaigh mar réamhshocrú d'úsáideoirí discovery: follow_recommendations: Lean na moltaí - preamble: Tá sé ríthábhachtach dromchla a chur ar ábhar suimiúil chun úsáideoirí nua a chur ar bord nach bhfuil aithne acu ar dhuine ar bith Mastodon. Rialú conas a oibríonn gnéithe fionnachtana éagsúla ar do fhreastalaí. + preamble: Tá sé ríthábhachtach ábhar suimiúil a chur chun cinn chun úsáideoirí nua a thabhairt isteach ar Mastodon, úsáideoirí nach mbeadh aithne acu ar aon duine. Rialú conas a oibríonn gnéithe éagsúla fionnachtana ar do fhreastalaí. privacy: Príobháideacht profile_directory: Eolaire próifíle public_timelines: Amlínte poiblí @@ -893,7 +895,13 @@ ga: feed_access: modes: authenticated: Úsáideoirí fíordheimhnithe amháin + disabled: Éiligh ról úsáideora sonrach public: Gach duine + landing_page: + values: + about: Maidir + local_feed: Fotha áitiúil + trends: Treochtaí registrations: moderation_recommandation: Cinntigh le do thoil go bhfuil foireann mhodhnóireachta imoibríoch leordhóthanach agat sula n-osclaíonn tú clárúcháin do gach duine! preamble: Rialú cé atá in ann cuntas a chruthú ar do fhreastalaí. @@ -2052,6 +2060,7 @@ ga: errors: in_reply_not_found: Is cosúil nach ann don phostáil a bhfuil tú ag iarraidh freagra a thabhairt air. quoted_status_not_found: Is cosúil nach bhfuil an post atá tú ag iarraidh a lua ann. + quoted_user_not_mentioned: Ní féidir úsáideoir nach luaitear a lua i bpost Lua Príobháideach. over_character_limit: teorainn carachtar %{max} sáraithe pin_errors: direct: Ní féidir postálacha nach bhfuil le feiceáil ach ag úsáideoirí luaite a phinnáil diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 802b92541..13f482a57 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -824,6 +824,8 @@ gd: view_dashboard_description: Leigidh seo le cleachdaichean an deas-bhòrd agus meatrachdan inntrigeadh view_devops: DevOps view_devops_description: Leigidh seo le cleachdaichean na deas-bhùird aig Sidekiq is pgHero inntrigeadh + view_feeds: Seall loidhnichean-ama beòtha ’s nan cuspairean + view_feeds_description: Leigidh seo le cleachdaichean loidhnichean-ama beòtha ’s nan cuspairean inntrigeadh ge b’ e dè roghainnean an fhrithealaiche title: Dreuchdan rules: add_new: Cuir riaghailt ris @@ -876,6 +878,16 @@ gd: all: Dhan a h-uile duine disabled: Na seall idir users: Dhan luchd-chleachdaidh a clàraich a-steach gu h-ionadail + feed_access: + modes: + authenticated: Cleachdaichean a chlàraich a-steach a-mhàin + disabled: Iarr dreuchd shònraichte a’ chleachdaiche + public: A h-uile duine + landing_page: + values: + about: Mu dhèidhinn + local_feed: Loidhne-ama ionadail + trends: Treandaichean registrations: moderation_recommandation: Dèan cinnteach gu bheil sgioba maoir deiseil is deònach agad mus fhosgail thu an clàradh dhan a h-uile duine! preamble: Stiùirich cò dh’fhaodas cunntas a chruthachadh air an fhrithealaiche agad. @@ -929,6 +941,7 @@ gd: no_status_selected: Cha deach post sam bith atharrachadh o nach deach gin dhiubh a thaghadh open: Fosgail am post original_status: Am post tùsail + quotes: Luaidhean reblogs: Brosnachaidhean replied_to_html: Freagairt do %{acct_link} status_changed: Post air atharrachadh @@ -936,6 +949,7 @@ gd: title: Postaichean a’ chunntais – @%{name} trending: A’ treandadh view_publicly: Seall gu poblach + view_quoted_post: Seall am post ’ga luaidh visibility: Faicsinneachd with_media: Le meadhanan riutha strikes: @@ -1220,7 +1234,10 @@ gd: hint_html: Nam bu mhiann leat imrich o chunntas eile dhan fhear seo, ’s urrainn dhut alias a chruthachadh an-seo agus feumaidh tu sin a dhèanamh mus urrainn dhut tòiseachadh air an luchd-leantainn agad imrich on seann-chunntas dhan fhear seo. Tha an gnìomh seo fhèin neo-chronail is chan eil e buan. Tòisichidh tu air imrich a’ chunntais on t-seann-chunntas. remove: Dì-cheangail an t-alias appearance: + advanced_settings: Roghainnean adhartach animations_and_accessibility: Beòthachaidhean agus so-ruigsinneachd + boosting_preferences: Roghainnean brosnachaidh + boosting_preferences_info_html: "Gliocas: Ge b’ e dè na roghainnean, ma nì thuShift + Briogadh air ìomhaigheag%{icon} a’ bhrosnachaidh, thèid a bhrosnachadh sa bhad." discovery: Rùrachadh localization: body: Tha Mastodon ’ga eadar-theangachadh le saor-thoilich. @@ -1563,10 +1580,10 @@ gd: other: Tha thu an impis suas ri %{count} àrainn o %{filename} a chur an àite liosta nam bacaidhean àrainne agad. two: Tha thu an impis suas ri %{count} àrainn o %{filename} a chur an àite liosta nam bacaidhean àrainne agad. following_html: - few: Tha thu an impis suas ri %{count} cunntasan o %{filename} a leantainn agus sguiridh tu a leantainn duine sam bith eile. - one: Tha thu an impis suas ri %{count} chunntas o %{filename} a leantainn agus sguiridh tu a leantainn duine sam bith eile. - other: Tha thu an impis suas ri %{count} cunntas o %{filename} a leantainn agus sguiridh tu a leantainn duine sam bith eile. - two: Tha thu an impis suas ri %{count} chunntas o %{filename} a leantainn agus sguiridh tu a leantainn duine sam bith eile. + few: Tha thu an impis suas ri %{count} cunntasan o %{filename} a leantainn agus sguiridh tu a leantainn neach sam bith eile. + one: Tha thu an impis suas ri %{count} chunntas o %{filename} a leantainn agus sguiridh tu a leantainn neach sam bith eile. + other: Tha thu an impis suas ri %{count} cunntas o %{filename} a leantainn agus sguiridh tu a leantainn neach sam bith eile. + two: Tha thu an impis suas ri %{count} chunntas o %{filename} a leantainn agus sguiridh tu a leantainn neach sam bith eile. lists_html: few: Tha thu an impis susbaint %{filename} a chur an àite nan liostaichean agad. Thèid suas ri %{count} cunntasan a chur ri liostaichean ùra. one: Tha thu an impis susbaint %{filename} a chur an àite nan liostaichean agad. Thèid suas ri %{count} chunntas a chur ri liostaichean ùra. @@ -1662,6 +1679,13 @@ gd: expires_at: Falbhaidh an ùine air uses: Cleachdadh title: Thoir cuireadh do dhaoine + link_preview: + author_html: Le %{name} + potentially_sensitive_content: + action: Dèan briogadh gus a shealltainn + confirm_visit: A bheil thu cinnteach gu bheil thu airson an ceangal seo fhosgladh? + hide_button: Falaich + label: Susbaint fhrionasach ma dh’fhaoidte lists: errors: limit: Ràinig thu na tha ceadaichte dhut de liostaichean @@ -1978,6 +2002,9 @@ gd: two: "%{count} video" boosted_from_html: Brosnachadh o %{acct_link} content_warning: 'Rabhadh susbainte: %{warning}' + content_warnings: + hide: Falaich am post + show: Seall barrachd dheth default_language: Co-ionnan ri cànan na h-eadar-aghaidh disallowed_hashtags: few: "– bha na tagaichean hais toirmisgte seo ann: %{tags}" @@ -1988,23 +2015,29 @@ gd: errors: in_reply_not_found: Tha coltas nach eil am post dhan a tha thu airson freagairt ann. quoted_status_not_found: Tha coltas nach eil am post dhan a tha thu airson luaidh ann. + quoted_user_not_mentioned: Chan urrainn dhut neach gun iomradh air a luaidh ann am post a tha ’na iomradh prìobhaideach. over_character_limit: chaidh thu thar crìoch charactaran de %{max} pin_errors: direct: Chan urrainn dhut post a phrìneachadh nach fhaic ach na cleachdaichean le iomradh orra limit: Tha an àireamh as motha de phostaichean prìnichte agad a tha ceadaichte ownership: Chan urrainn dhut post càich a phrìneachadh reblog: Chan urrainn dhut brosnachadh a phrìneachadh + quote_error: + not_available: Chan eil am post ri fhaighinn + pending_approval: Cha deach dèiligeadh ris a’ phost fhathast + revoked: Chaidh am post a thoirt air falbh leis an ùghdar quote_policies: followers: Luchd-leantainn a-mhàin nobody: Mi fhìn a-mhàin - public: Duine sam bith + public: Neach sam bith + quote_post_author: Luaidh air post le %{acct} title: "%{name}: “%{quote}”" visibilities: direct: Iomradh prìobhaideach private: Luchd-leantainn a-mhàin public: Poblach - public_long: Duine sam bith taobh a-staigh no a-muigh Mhastodon - unlisted: Poblach ach sàmhach + public_long: Neach sam bith taobh a-staigh no a-muigh Mhastodon + unlisted: Sàmhach unlisted_long: Falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach statuses_cleanup: enabled: Sguab às seann-phostaichean gu fèin-obrachail diff --git a/config/locales/gl.yml b/config/locales/gl.yml index fe278de63..212886dd0 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -796,6 +796,8 @@ gl: view_dashboard_description: Permite acceder ao taboleiro e varias métricas do servidor view_devops: DevOps view_devops_description: Permite acceder aos taboleiros Sidekiq e phHero + view_feeds: Ver as canles do directo e temas + view_feeds_description: Permite ás usuarias acceder ás canles de directo e temas independentemento dos axustes do servidor. title: Roles rules: add_new: Engadir regra @@ -851,7 +853,13 @@ gl: feed_access: modes: authenticated: Só para usuarias con sesión iniciada + disabled: Requerir un rol da usuaria específico public: Para calquera + landing_page: + values: + about: Sobre + local_feed: Cronoloxía Local + trends: Tendencias registrations: moderation_recommandation: Por favor, pon interese en crear un equipo de moderación competente e reactivo antes de permitir que calquera poida crear unha conta! preamble: Xestiona quen pode crear unha conta no teu servidor. @@ -1921,6 +1929,7 @@ gl: errors: in_reply_not_found: A publicación á que tentas responder semella que non existe. quoted_status_not_found: Parece que a publicación que intentas citar non existe. + quoted_user_not_mentioned: Non se pode citar a unha usuaria non mencionada nunha Mención Privada. over_character_limit: Excedeu o límite de caracteres %{max} pin_errors: direct: As publicacións que só son visibles para as usuarias mencionadas non se poden fixar @@ -2107,7 +2116,7 @@ gl: edit_profile_action: Personalizar edit_profile_step: Aumenta as túas interaccións grazas a un perfil descriptivo. edit_profile_title: Personaliza o teu perfil - explanation: Aquí tes algunhas endereitas para ir aprendendo + explanation: Aquí tes algúns consellos para ir aprendendo feature_action: Saber máis feature_audience: Mastodon dache a oportunidade de xestionar sen intermediarios as túas relacións. Incluso se usas o teu propio servidor Mastodon poderás seguir e ser seguida desde calquera outro servidor Mastodon conectado á rede e estará baixo o teu control exclusivo. feature_audience_title: Crea a túa audiencia con tranquilidade diff --git a/config/locales/he.yml b/config/locales/he.yml index c7b4bec65..2670f5126 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -824,6 +824,8 @@ he: view_dashboard_description: אפשר למשתמשים לגשת ללוח המחוונים view_devops: DevOps view_devops_description: מאפשר למשתמשים לגשת ללוחות המחוונים של Sidekiq ושל pgHero + view_feeds: צפיה בפיד החי ונושאים + view_feeds_description: מאפשר למשמתמשיםות גישה לפיד החי ופיד נושאים בלי קשר להגדרות השרת title: תפקידים rules: add_new: הוספת כלל @@ -879,7 +881,13 @@ he: feed_access: modes: authenticated: משתמשים מאומתים בלבד + disabled: נדרש תפקיד משתמש מסוים public: כולם + landing_page: + values: + about: אודות + local_feed: פיד מקומי + trends: נושאים חמים registrations: moderation_recommandation: יש לוודא שלאתר יש צוות מנחות ומנחי שיחה מספק ושירותי בטרם תבחרו לפתוח הרשמה לכולם! preamble: שליטה בהרשאות יצירת חשבון בשרת שלך. @@ -2007,6 +2015,7 @@ he: errors: in_reply_not_found: נראה שההודעה שנסית להגיב לה לא קיימת. quoted_status_not_found: נראה שההודעה שנסית לצטט לא קיימת. + quoted_user_not_mentioned: לא ניתן לצטט משתמש שאיננו מאוזכר בהודעה פרטית. over_character_limit: חריגה מגבול התווים של %{max} pin_errors: direct: לא ניתן לקבע הודעות שנראותן מוגבלת למכותבים בלבד diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 67a175acd..ca3f337f4 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -796,6 +796,8 @@ hu: view_dashboard_description: Lehetővé teszi, hogy a felhasználó elérje az irányítópultot és vele számos metrikát view_devops: DevOps view_devops_description: Lehetővé teszi, hogy a felhasználó elérje a Sidekiq és pgHero irányítópultjait + view_feeds: Élő és témahírfolyamok megtekintése + view_feeds_description: A kiszolgálóbeállításoktól függetlenül engedélyezi az élő és témahírfolyamok elérését title: Szerepek rules: add_new: Szabály hozzáadása @@ -851,7 +853,13 @@ hu: feed_access: modes: authenticated: Csak hitelesített felhasználók + disabled: Konkrét felhasználói szerepkör megkövetelése public: Mindenki + landing_page: + values: + about: Névjegy + local_feed: Helyi idővonal + trends: Trendek registrations: moderation_recommandation: Győződj meg arról, hogy megfelelő és gyors reagálású moderátor csapatod van, mielőtt mindenki számára megnyitod a regisztrációt! preamble: Szabályozd, hogy ki hozhat létre fiókot a kiszolgálón. diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 08f40d511..b08b01e0e 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -320,7 +320,7 @@ ia: edit: title: Modificar annuncio empty: Necun annuncios trovate. - live: In directo + live: In vivo new: create: Crear annuncio title: Nove annuncio @@ -796,6 +796,8 @@ ia: view_dashboard_description: Permitte que usatores accede al tabuliero de instrumentos e a varie statisticas view_devops: DevOps view_devops_description: Permitte que usatores accede al tabulieros de instrumentos de Sidekiq e pgHero + view_feeds: Vider canales thematic e in vivo + view_feeds_description: Permitte que usatores acceder al canales thematic e in vivo independentemente del configuration del servitor title: Rolos rules: add_new: Adder regula @@ -851,7 +853,13 @@ ia: feed_access: modes: authenticated: Solmente usatores authenticate + disabled: Requirer un rolo de usator specific public: Omnes + landing_page: + values: + about: A proposito + local_feed: Canal local + trends: Tendentias registrations: moderation_recommandation: Per favor assecura te de haber un equipa de moderation adequate e reactive ante de aperir le inscription a omnes! preamble: Controla qui pote crear un conto sur tu servitor. diff --git a/config/locales/id.yml b/config/locales/id.yml index 81fc59031..eea3637e3 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -670,7 +670,6 @@ id: title: Keluarkan pengguna dari pengindeksan mesin telusur secara bawaan discovery: follow_recommendations: Ikuti rekomendasi - preamble: Menampilkan konten menarik penting dalam memandu pengguna baru yang mungkin tidak tahu siapa pun di Mastodon. Atur bagaimana berbagai fitur penemuan bekerja di server Anda. profile_directory: Direktori profil public_timelines: Linimasa publik title: Penemuan diff --git a/config/locales/ie.yml b/config/locales/ie.yml index ce219a9d6..f92894853 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -729,7 +729,6 @@ ie: title: Predefinir que usatores ne apari in índexes de serchatores discovery: follow_recommendations: Seque-recomandationes - preamble: Exposir interessant contenete es importantissim por incorporar nov usatores qui fórsan conosse nequi che Mastodon. Decider qualmen diferent utensiles de decovrition functiona che vor servitor. profile_directory: Profilarium public_timelines: Public témpor-lineas publish_statistics: Publicar statisticas diff --git a/config/locales/io.yml b/config/locales/io.yml index eaca822f1..924df63c7 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -780,7 +780,6 @@ io: title: Despartoprenigez uzanti de serchilo-indexi quale originala stando discovery: follow_recommendations: Sequez rekomendaji - preamble: Montrar interesanta kontenajo esas importanta ye voligar nova uzanti quo forsan ne savas irgu. Dominacez quale ca deskovrotraiti funcionar en ca servilo. profile_directory: Profiluyo public_timelines: Publika tempolinei publish_statistics: Publikar statistiki diff --git a/config/locales/is.yml b/config/locales/is.yml index 7bcaf5648..7f3b2290f 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -796,6 +796,8 @@ is: view_dashboard_description: Leyfir notendum að skoða stjórnborðið og sjá ýmsar mælingar view_devops: DevOps view_devops_description: Leyfir notendum að skoða Sidekiq og pgHero stjórnborð + view_feeds: Skoða bein streymi og efnistengd + view_feeds_description: Gefur notendum aðgang að beinum streymum og efnistengdum, burtséð frá stillingum netþjóns title: Hlutverk rules: add_new: Skrá reglu @@ -853,7 +855,13 @@ is: feed_access: modes: authenticated: Einungis auðkenndir notendur + disabled: Krefjast sérstaks hlutverks notanda public: Allir + landing_page: + values: + about: Um hugbúnaðinn + local_feed: Staðbundið streymi + trends: Vinsælt registrations: moderation_recommandation: Tryggðu að þú hafir hæft og aðgengilegt umsjónarteymi til taks áður en þú opnar á skráningar fyrir alla! preamble: Stýrðu því hverjir geta útbúið notandaaðgang á netþjóninum þínum. @@ -1925,6 +1933,7 @@ is: errors: in_reply_not_found: Færslan sem þú ert að reyna að svara að er líklega ekki til. quoted_status_not_found: Færslan sem þú ert að reyna að vitna í virðist ekki vera til. + quoted_user_not_mentioned: Ekki er hægt að vitna í aðila sem ekki er minnst á í einkaspjalli. over_character_limit: hámarksfjölda stafa (%{max}) náð pin_errors: direct: Ekki er hægt að festa færslur sem einungis eru sýnilegar þeim notendum sem minnst er á diff --git a/config/locales/it.yml b/config/locales/it.yml index 9e7a2a15c..c85646ff6 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -796,6 +796,8 @@ it: view_dashboard_description: Consente agli utenti di accedere alla dashboard e alle varie metriche view_devops: DevOps view_devops_description: Consente agli utenti di accedere alle dashboard Sidekiq e pgHero + view_feeds: Visualizza feed in diretta e feed di argomenti + view_feeds_description: Consente agli utenti di accedere ai feed in diretta e ai feed di argomenti indipendentemente dalle impostazioni del server title: Ruoli rules: add_new: Aggiungi regola @@ -837,7 +839,7 @@ it: title: Esclude gli utenti dall'indicizzazione dei motori di ricerca per impostazione predefinita discovery: follow_recommendations: Segui le raccomandazioni - preamble: La comparsa di contenuti interessanti è determinante per l'arrivo di nuovi utenti che potrebbero non conoscere nessuno su Mastodon. Controlla in che modo varie funzionalità di scoperta funzionano sul tuo server. + preamble: La scoperta di contenuti interessanti è fondamentale per l'inserimento di nuovi utenti che potrebbero non conoscere nessuno su Mastodon. Controlla l'andamento delle varie funzionalità di scoperta sul tuo server. privacy: Privacy profile_directory: Directory del profilo public_timelines: Timeline pubbliche @@ -851,7 +853,13 @@ it: feed_access: modes: authenticated: Solo utenti autenticati + disabled: Richiedi un ruolo utente specifico public: Tutti + landing_page: + values: + about: Info + local_feed: Feed locale + trends: Tendenze registrations: moderation_recommandation: Assicurati di avere un team di moderazione adeguato e reattivo prima di aprire le registrazioni a tutti! preamble: Controlla chi può creare un account sul tuo server. @@ -1921,6 +1929,7 @@ it: errors: in_reply_not_found: Il post a cui stai tentando di rispondere non sembra esistere. quoted_status_not_found: Il post che stai cercando di citare non sembra esistere. + quoted_user_not_mentioned: Non è possibile citare un utente non menzionato in un post di menzione privata. over_character_limit: Limite caratteri superato di %{max} pin_errors: direct: I messaggi visibili solo agli utenti citati non possono essere fissati in cima diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 8feb830f0..35e18de50 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -572,6 +572,8 @@ ja: title: モデレーション moderation_notes: create: モデレーションノートを追加 + description_html: 他のモデレーターと将来の自分にメモを残してください + destroyed_msg: インスタンス・モデレーションノートを正常に削除しました! title: モデレーションメモ private_comment: コメント (非公開) public_comment: コメント (公開) @@ -816,7 +818,6 @@ ja: title: デフォルトで検索エンジンによるインデックスを拒否する discovery: follow_recommendations: おすすめフォロー - preamble: Mastodon を知らないユーザーを取り込むには、興味深いコンテンツを浮上させることが重要です。サーバー上で様々なディスカバリー機能がどのように機能するかを制御します。 privacy: プライバシー profile_directory: ディレクトリ public_timelines: 公開タイムライン @@ -827,6 +828,9 @@ ja: all: 誰にでも許可 disabled: 誰にも許可しない users: ログイン済みローカルユーザーのみ許可 + landing_page: + values: + trends: トレンド registrations: moderation_recommandation: 登録受付を開始する前に、迅速かつ適切にモデレーションを行うチームを編成しましょう! preamble: あなたのサーバー上でアカウントを作成できるユーザーを制御します。 @@ -880,6 +884,7 @@ ja: no_status_selected: 何も選択されていないため、変更されていません open: 投稿を開く original_status: オリジナルの投稿 + quotes: 引用 reblogs: ブースト replied_to_html: "%{acct_link}さんへの返信" status_changed: 投稿を変更しました @@ -887,6 +892,7 @@ ja: title: 投稿一覧 - @%{name} trending: トレンド view_publicly: 元の投稿を開く + view_quoted_post: 引用されている投稿を見る visibility: 公開範囲 with_media: メディアあり strikes: @@ -1079,6 +1085,7 @@ ja: matches_exactly_html: "%{string}に一致" new: create: ルールを作成 + title: ユーザー名ルールを作成 title: ユーザー名ルール warning_presets: add_new: 追加 @@ -1151,7 +1158,10 @@ ja: hint_html: 他のアカウントからこのアカウントにフォロワーを引き継いで引っ越したい場合、ここでエイリアスを作成しておく必要があります。エイリアス自体は無害で、取り消すことができます。引っ越しは以前のアカウント側から開始する必要があります。 remove: エイリアスを削除 appearance: + advanced_settings: 詳細設定 animations_and_accessibility: アニメーションとアクセシビリティー + boosting_preferences: ブースト設定 + boosting_preferences_info_html: "Tip: 設定に関係なく、Shift を押しながら %{icon} Boostアイコンをクリックすると、すぐにブーストされます。" discovery: 見つける localization: body: Mastodonは有志によって翻訳されています。 @@ -1533,6 +1543,9 @@ ja: expires_at: 有効期限 uses: 使用 title: 新規ユーザーの招待 + link_preview: + potentially_sensitive_content: + hide_button: 非表示 lists: errors: limit: リストの上限数に達しています @@ -1852,6 +1865,7 @@ ja: public: 誰でも title: '%{name}: "%{quote}"' visibilities: + direct: 非公開の返信 private: フォロワーのみ public: 公開 statuses_cleanup: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index a8fd955ee..62bc46143 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -285,6 +285,7 @@ kab: ip: Tansa IP providers: active: D urmid + base_url: URL n taffa delete: Kkes edit: Ẓreg asaǧǧaw finish_registration: Fakk ajerred @@ -393,6 +394,7 @@ kab: resolved: Fran status: Addad title: Ineqqisen + unknown_action_msg: 'Tigawt tarussint: %{action}' unresolved: Ur yefra ara updated_at: Yettwaleqqem view_profile: Wali amaɣnu @@ -438,6 +440,10 @@ kab: all: I medden akk disabled: Ɣef ula yiwen users: Ɣef yimseqdacen idiganen i yeqqnen + landing_page: + values: + about: Ɣef + trends: Inezzaɣ registrations: title: Ajerred registrations_mode: @@ -449,6 +455,7 @@ kab: delete: Kkes afaylu yulin software_updates: documentation_link: Issin ugar + title: Llan ileqman type: Anaw version: Lqem statuses: @@ -462,7 +469,9 @@ kab: language: Tutlayt media: title: Amidya + metadata: Iɣefisefka open: Ldi tasuffeɣt + quotes: Tinebdurin status_title: Tasuffeɣt sɣur @%{name} trending: Inezzaɣ visibility: Abani @@ -489,12 +498,16 @@ kab: terms_of_service: changelog: Amaynut create: Sqedcet ayla-nwen + current: Amiran draft: Arewway generates: action: Sirew + title: Tawila n tewtilin n useqdec history: Amazray live: Srid + notify_users: Selɣu iseqdacen publish: Asuffeɣ + published_on_html: Teffeɣ-d ass n %{date} save_draft: Sekles arewway title: Tiwtilin n useqdec title: Tadbelt @@ -504,6 +517,7 @@ kab: allow: Sireg aseɣwen title: Iseɣwan inezzaɣ statuses: + allow_account: Sireg ameskar title: Tisuffaɣ tinezzaɣ tags: dashboard: @@ -519,11 +533,13 @@ kab: new: create: Rnu alugen title: Rnu alugen n useqdac amaynut + title: Ilugan n yisem n useqdac warning_presets: add_new: Rnu amaynut delete: Kkes webhooks: delete: Kkes + disable: Kkes armad enable: Rmed enabled: D urmid admin_mailer: @@ -538,6 +554,7 @@ kab: new_trending_tags: title: Ihacṭagen inezzaɣ appearance: + advanced_settings: Iɣewwaren leqqayen discovery: Asnirem localization: body: Mastodon suqqlen-t-id yiwiziwen. @@ -545,7 +562,9 @@ kab: guide_link_text: Yal yiwen·t y·tezmer a ttekki. sensitive_content: Agbur amḥulfu application_mailer: + notification_preferences: Snifel imenyafen n imayl salutation: "%{name}," + settings: 'Snifel imenyafen n imayl: %{link}' view: 'Ẓaṛ:' view_profile: Ssken-d amaɣnu view_status: Ssken-d tasuffiɣt @@ -683,6 +702,7 @@ kab: filters: contexts: account: Imeɣna + home: Agejdan akked tebdarin notifications: Ilɣa thread: Idiwenniyen edit: @@ -722,6 +742,9 @@ kab: modes: merge: Smezdi overwrite: Semselsi + states: + finished: Immed + status: Addad types: blocking: Tabdart n yimiḍanen iweḥlen bookmarks: Ticraḍ @@ -751,6 +774,12 @@ kab: table: expires_at: Ad ifat di title: Ɛreḍ-d kra n yimdanen + link_preview: + author_html: S ɣur %{name} + potentially_sensitive_content: + action: Sit i uskan + confirm_visit: Tebɣiḍ s tidet ad teldiḍ aseɣwen-a? + hide_button: Ffer-it login_activities: authentication_methods: password: awal uffir @@ -824,6 +853,8 @@ kab: status: Addad n umiḍan rss: content_warning: 'Alɣu n ugbur :' + self_destruct: + title: Aqeddac-a ad yemdel sessions: activity: Armud aneggaru browser: Iminig @@ -862,6 +893,7 @@ kab: kai_os: KaiOS linux: Linux mac: macOS + unknown_platform: Tiɣeṛɣeṛt tarussint windows: Windows windows_mobile: Windows Mobile windows_phone: Tiliɣri Windows Phone @@ -900,6 +932,10 @@ kab: video: one: "%{count} n tbidyutt" other: "%{count} n tbidyutin" + content_warnings: + hide: Ffer tasuffeɣt + show: Sken-d ugar + default_language: Kif kif am tutlayt n wegrudem edited_at_html: Tettwaẓreg ass n %{date} pin_errors: reblog: Azuzer ur yezmir ara ad yili d unṭiḍ diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 3402c5487..3c8871049 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -784,6 +784,8 @@ ko: view_dashboard_description: 사용자가 여러 통계정보를 볼 수 있는 대시보드에 접근할 수 있도록 허용 view_devops: 데브옵스 view_devops_description: Sidekiq과 pgHero 대시보드에 접근할 수 있도록 허용 + view_feeds: 실시간, 해시태그 피드 보기 + view_feeds_description: 서버 설정에 관계 없이 실시간과 해시태그 피드에 접근할 수 있도록 허용 title: 역할 rules: add_new: 규칙 추가 @@ -825,7 +827,6 @@ ko: title: 사용자들이 기본적으로 검색엔진에 인덱싱되지 않도록 합니다 discovery: follow_recommendations: 팔로우 추천 - preamble: 흥미로운 콘텐츠를 노출하는 것은 마스토돈을 알지 못할 수도 있는 신규 사용자를 유입시키는 데 중요합니다. 이 서버에서 작동하는 다양한 발견하기 기능을 제어합니다. privacy: 개인정보 profile_directory: 프로필 책자 public_timelines: 공개 타임라인 @@ -836,6 +837,16 @@ ko: all: 모두에게 disabled: 아무에게도 안 함 users: 로그인 한 사용자에게 + feed_access: + modes: + authenticated: 로그인한 사용자들만 + disabled: 특정한 사용자 역할 필요 + public: 모두 + landing_page: + values: + about: 정보 + local_feed: 로컬 피드 + trends: 유행 registrations: moderation_recommandation: 모두에게 가입을 열기 전에 적절하고 반응이 빠른 중재 팀을 데리고 있는지 확인해 주세요! preamble: 누가 이 서버에 계정을 만들 수 있는지 제어합니다. @@ -897,6 +908,7 @@ ko: title: 계정 게시물 - @%{name} trending: 유행 중 view_publicly: 공개시점으로 보기 + view_quoted_post: 인용된 게시물 보기 visibility: 공개 설정 with_media: 미디어 있음 strikes: @@ -1166,7 +1178,10 @@ ko: hint_html: 다른 계정에서 이 계정으로 옮기길 원하는 경우, 여기에서 별칭을 만들 수 있습니다, 기존 계정의 팔로워를 이쪽으로 옮기고 싶은 경우 필요한 과정입니다. 이 행동 자체는 해롭지 않고 되돌리기가 가능합니다.계정 이주는 이전 계정에서 착수하게 됩니다 remove: 별칭 연결 끊기 appearance: + advanced_settings: 고급 설정 animations_and_accessibility: 애니메이션과 접근성 + boosting_preferences: 부스팅 설정 + boosting_preferences_info_html: "팁: 설정에 관계 없이 %{icon}을 쉬프트+클릭하여 곧바로 부스트할 수 있습니다." discovery: 발견하기 localization: body: 마스토돈은 자원봉사자들에 의해 번역되었습니다. @@ -1548,6 +1563,13 @@ ko: expires_at: 만료 uses: 이용 수 title: 초대하기 + link_preview: + author_html: "%{name} 작성" + potentially_sensitive_content: + action: 클릭하여 보기 + confirm_visit: 정말로 이 링크를 여시겠습니까? + hide_button: 숨기기 + label: 민감한 컨텐츠일 수 있음 lists: errors: limit: 리스트 최대 개수를 초과합니다 @@ -1855,6 +1877,9 @@ ko: other: "%{count} 개의 영상" boosted_from_html: "%{acct_link}의 글을 부스트" content_warning: '열람 주의: %{warning}' + content_warnings: + hide: 게시물 숨기기 + show: 더 보기 default_language: 화면 표시 언어와 동일하게 disallowed_hashtags: other: '허용되지 않은 해시태그를 포함하고 있습니다: %{tags}' @@ -1862,19 +1887,26 @@ ko: errors: in_reply_not_found: 답장하려는 게시물이 존재하지 않습니다. quoted_status_not_found: 인용하려는 게시물이 존재하지 않습니다. + quoted_user_not_mentioned: 개인 멘션에서 다른 사람의 게시물을 인용할 수 없습니다. over_character_limit: 최대 %{max}자까지 입력할 수 있습니다 pin_errors: direct: 멘션된 사용자들에게만 보이는 게시물은 고정될 수 없습니다 limit: 이미 너무 많은 게시물을 고정했습니다 ownership: 다른 사람의 게시물은 고정될 수 없습니다 reblog: 부스트는 고정될 수 없습니다 + quote_error: + not_available: 게시물 사용 불가 + pending_approval: 계류 중인 게시물 + revoked: 원작성자에 의해 게시물 삭제됨 quote_policies: followers: 팔로워만 nobody: 나만 public: 누구나 + quote_post_author: 인용된 %{acct} 님의 게시물 title: '%{name}: "%{quote}"' visibilities: direct: 개인 멘션 + private: 팔로워만 public: 공개 public_long: 마스토돈 내외 모두 unlisted: 조용한 공개 diff --git a/config/locales/ku.yml b/config/locales/ku.yml index 31a0a1cf1..a1b50a2be 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -679,7 +679,6 @@ ku: title: Pêlrêçkirna bikarhêneran ji motorê lêgerînê dûr bixe discovery: follow_recommendations: Pêşniyarên şopandinê - preamble: Rûbirûbûna naveroka balkêş ji bo bikarhênerên nû yên ku li ser Mastodon kesek nas nakin pir bi bandor e. Kontrol bike ka çend taybetmendiyên vekolînê li ser rajekarê te çawa dixebite. profile_directory: Rêgeha profîlê public_timelines: Demnameya gelemperî title: Vekolîne diff --git a/config/locales/lad.yml b/config/locales/lad.yml index df5188e5a..a0486bfcc 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -189,6 +189,7 @@ lad: create_relay: Kriya relevo create_unavailable_domain: Kriya domeno no desponivle create_user_role: Kriya rolo + create_username_block: Kriya regla de nombre de utilizador demote_user: Degrada utilizador destroy_announcement: Efasa pregon destroy_canonical_email_block: Efasa bloko de posta elektronika @@ -202,6 +203,7 @@ lad: destroy_status: Efasa publikasyon destroy_unavailable_domain: Efasa domeno no desponivle destroy_user_role: Efasa rolo + destroy_username_block: Suprime regla de nombre de utilizador disable_2fa_user: Inkapasita autentifikasyon en dos pasos disable_custom_emoji: Inkapasita emoji personalizados disable_relay: Dezaktiva relevo @@ -236,6 +238,7 @@ lad: update_report: Aktualiza raporto update_status: Aktualiza publikasyon update_user_role: Aktualiza rolo + update_username_block: Aktualiza regla de nombre de utilizador actions: approve_appeal_html: "%{name} acheto la solisitasyon de moderasyon de %{target}" approve_user_html: "%{name} acheto el enrejistramiento de %{target}" @@ -476,9 +479,12 @@ lad: ip: Adreso IP providers: active: Aktivo + base_url: URL baza delete: Efasa + edit: Edita prokurador finish_registration: Finaliza enrejistrasyon name: Nombre + providers: Prokuradores registration_requested: Enrejistrasyon rekerida registrations: confirm: Konfirma @@ -693,6 +699,7 @@ lad: delete_data_html: Efasa el profil i kontenido de @%{acct} en 30 dias si no sea desuspendido en akel tiempo preview_preamble_html: "@%{acct} resivira una avertensya komo esta:" record_strike_html: Enrejistra un amonestamiento kontra @%{acct} para ke te ayude eskalar las violasyones de reglas de este kuento en el avenir + send_email_html: Embia un mesaj de avertensia a la posta elektronika de @%{acct} warning_placeholder: Adisionalas, opsionalas razones la aksyon de moderasyon. target_origin: Orijin del kuento raportado title: Raportos @@ -769,6 +776,8 @@ lad: description_html: Aunke la majorita afirma aver meldado i estar de akodro kon los terminos de servisyo, la djente normalmente no los melda asta dempues de ke surja algun problema. Az ke sea mas kolay ver las normas de tu sirvidor de un vistazo estipulándolas en una lista de puntos. Aprova ke kada norma sea corta i kolay, ama sin estar divididas en munchos puntos. edit: Edita regla empty: Dinguna regla del sirvidor tiene sido definida. + move_down: Mueve verso abasho + move_up: Mueve verso arriva title: Reglas del sirvidor translation: Traduksyon translations: Traduksyones @@ -796,7 +805,7 @@ lad: title: Ekskluye utilizadores de la indeksasyon de los bushkadores komo preferensya predeterminada discovery: follow_recommendations: Rekomendasyones de kuentos - preamble: Ekspone kontenido enteresante a la superfisie es fundamental para inkorporar muevos utilizadores ke pueden no koneser a dinguno Mastodon. Kontrola komo fonksionan varias opsiones de diskuvrimiento en tu sirvidor. + preamble: Ekspone kontenido enteresante a la superfisie es fundamental para inkorporar muevos utilizadores ke pueden no koneser a dinguno en Mastodon. Kontrola komo fonksionan varias opsiones de diskuvrimiento en tu sirvidor. privacy: Privasita profile_directory: Katalogo de profiles public_timelines: Linyas de tiempo publikas @@ -810,6 +819,10 @@ lad: feed_access: modes: public: Todos + landing_page: + values: + about: Sovre esto + trends: Trendes registrations: moderation_recommandation: Por favor, asigurate ke tyenes una taifa de moderasyon adekuada i reaktiva antes de avrir los enrejistramyentos a todos! preamble: Kontrola ken puede kriyar un kuento en tu sirvidor. @@ -847,6 +860,7 @@ lad: back_to_account: Retorna al kuento back_to_report: Retorna a la pajina del raporto batch: + add_to_report: 'Adjusta al raporto #%{id}' remove_from_report: Kita del raporto report: Raporto contents: Kontenidos @@ -861,10 +875,12 @@ lad: no_status_selected: No se troko dinguna publikasyon al no eskojer dinguna open: Avre publikasyon original_status: Publikasyon orijinala + quotes: Sitas reblogs: Repartajasyones status_changed: Publikasyon trokada trending: Trendes view_publicly: Ve puvlikamente + view_quoted_post: Ve puvlikasyon sitada visibility: Vizivilita with_media: Kon multimedia strikes: @@ -942,13 +958,17 @@ lad: updated_msg: Konfigurasyon de etiketas aktualizada kon sukseso terms_of_service: changelog: Ke troko + create: Uza los tuyos current: Aktual + generate: Uza modelo generates: action: Djenera + title: Konfigurasyon de terminos de servisyo history: Istorya live: En bivo notify_users: Aviza a los utilizadores publish: Publika + published_on_html: Puvlikado el %{date} title: Terminos de servisyo title: Administrasyon trends: @@ -1020,10 +1040,19 @@ lad: block_registrations: Bloka enrejistrasyones comparison: contains: Kontyene + equals: Es egual a + contains_html: Kontyene %{string} + created_msg: Regla de nombre de utilizador kriyada kon reusho delete: Efasa + edit: + title: Edita regla de nombre de utilizador + matches_exactly_html: Es egual a %{string} new: create: Kriya regla + title: Kriya mueva regla de nombre de utilizador not_permitted: Sin permiso + title: Reglas de nombre de utilizador + updated_msg: Regla de nombre de utilizador aktualizada kon reusho warning_presets: add_new: Adjusta muevo delete: Efasa @@ -1095,7 +1124,9 @@ lad: hint_html: Si keres migrar de otro kuento a este, aki puedes kriyar un alias, kale proseder antes de ampesar a mover suivantes del kuento anterior a este. Esta aksion por si mezma es inofensiva i reversivle. La migrasyon del kuento se inisya dizde el kuento viejo. remove: Dezata alias appearance: + advanced_settings: Konfigurasyon avansada animations_and_accessibility: Animasyones i aksesivilita + boosting_preferences: Preferensias de repartajar discovery: Diskuvrimiento localization: body: Mastodon es trezladado por volontarios. @@ -1200,6 +1231,7 @@ lad: example_title: Teksto de enshemplo more_from_html: Mas de %{name} s_blog: Blog de %{name} + title: Atribusyon del otor challenge: confirm: Kontinua hint_html: "Konsejo: No retornaremos a demandarte por el kod durante la sigiente ora." @@ -1735,6 +1767,7 @@ lad: preferences: Preferensyas profile: Profil publiko relationships: Segidos i suivantes + severed_relationships: Relasyones kortadas statuses_cleanup: Efasasyon otomatika de publikasyones strikes: Amonestamientos de moderasyon two_factor_authentication: Autentifikasyon en dos pasos @@ -1742,6 +1775,8 @@ lad: severed_relationships: download: Abasha (%{count}) event_type: + account_suspension: Suspensyon de kuento (%{target_name}) + domain_block: Suspensyon de sirvidor (%{target_name}) user_domain_block: Blokates a %{target_name} lost_followers: Suivantes pedridos lost_follows: Segimyentos pedridos @@ -1777,10 +1812,15 @@ lad: limit: Ya tienes fiksado el numero maksimo de publikasyones ownership: La publikasyon de otra persona no puede fiksarse reblog: No se puede fixar una repartajasyon + quote_error: + not_available: Puvlikasyon no desponivle + pending_approval: Puvlikasyon esta asperando + revoked: Puvlikasyon kitada por el otor quote_policies: followers: Solo suivantes nobody: Solo yo public: Todos + quote_post_author: Sito una puvlikasyon de %{acct} title: '%{name}: "%{quote}"' visibilities: direct: Enmentadura privada @@ -1894,6 +1934,8 @@ lad: subject: Tu kuento fue aksedido dizde un muevo adreso IP title: Una mueva koneksyon kon tu kuento terms_of_service_changed: + sign_off: La taifa de %{domain} + subject: Aktualizasyones de muestros terminos de sirvisyo title: Aktualizasyon emportante warning: appeal: Embia una apelasyon diff --git a/config/locales/lv.yml b/config/locales/lv.yml index d3fc9e184..40078ed32 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -832,7 +832,6 @@ lv: title: Pēc noklusējuma lietotāji būs atteikušies no meklētājprogrammu indeksēšanas discovery: follow_recommendations: Sekotšanas rekomendācijas - preamble: Interesanta satura parādīšana palīdz piesaistīt jaunus lietotājus, kuri, iespējams, nepazīst nevienu Mastodon. Kontrolē, kā tavā serverī darbojas dažādi atklāšanas līdzekļi. privacy: Konfidencialitāte profile_directory: Profila direktorija public_timelines: Publiskās ziņu lentas diff --git a/config/locales/ms.yml b/config/locales/ms.yml index dc3c9c36a..76d7bd4d2 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -714,7 +714,6 @@ ms: title: Tarik pengguna keluar daripada pengindeksan enjin carian secara lalai discovery: follow_recommendations: Ikut cadangan - preamble: Memaparkan kandungan yang menarik adalah penting dalam memasukkan pengguna baharu yang mungkin tidak mengenali sesiapa Mastodon. Kawal cara pelbagai ciri penemuan berfungsi pada server anda. profile_directory: Direktori profil public_timelines: Garis masa awam publish_statistics: Terbitkan statistik diff --git a/config/locales/my.yml b/config/locales/my.yml index bdf051ca6..687c350f3 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -709,7 +709,6 @@ my: title: ပုံမှန်အားဖြင့် ရှာဖွေမှုအညွှန်းကိန်းမှ သုံးစွဲသူများကို ဖယ်ထုတ်ပါ discovery: follow_recommendations: အကြံပြုချက်များကို စောင့်ကြည့်ပါ - preamble: စိတ်ဝင်စားစရာကောင်းသော အကြောင်းအရာများပြထားခြင်းမှာ Mastodon ကို မသိသေးသော သုံးစွဲသူအသစ်များအတွက် အရေးပါပါသည်။ သင့်ဆာဗာတွင် မည်သည့်ရှာဖွေတွေ့ရှိမှုအကြောင်းအရာများ ပြထားမည်ကို ထိန်းချုပ်ပါ။ profile_directory: ပရိုဖိုင်လမ်းညွှန် public_timelines: အများမြင်စာမျက်နှာ publish_statistics: စာရင်းဇယားထုတ်ပြန်မည် diff --git a/config/locales/nan.yml b/config/locales/nan.yml index 19d9f8390..508cc4666 100644 --- a/config/locales/nan.yml +++ b/config/locales/nan.yml @@ -782,6 +782,8 @@ nan: view_dashboard_description: 允准用者接近使用tsit ê la-jí-báng kap tsē-tsē指標 view_devops: DevOps view_devops_description: 允准用者接近使用Sidekiq kap pgHero ê la-jí-báng + view_feeds: 看即時內容kap主題ê feed + view_feeds_description: 允准用者接近使用即時kap主題feed,無論服侍器ê設定。 title: 角色 rules: add_new: 加添規則 @@ -837,7 +839,13 @@ nan: feed_access: modes: authenticated: Kan-ta hōo登入ê用者 + disabled: 愛特別ê用者角色 public: Ta̍k lâng + landing_page: + values: + about: 關係本站 + local_feed: 本地ê動態 + trends: 趨勢 registrations: moderation_recommandation: 佇開放hōo ta̍k ê lâng註冊進前,請確認lí有夠額koh主動反應ê管理團隊! preamble: 控制ē當佇lí ê服侍器註冊ê人。 @@ -1154,6 +1162,102 @@ nan: subject: "%{instance} 有通the̍h ê Mastodon ê新版本!" new_trends: body: 下kha ê項目愛審查,tsiah ē當公開顯示: + new_trending_links: + title: 趨勢ê連結 + new_trending_statuses: + title: 趨勢ê PO文 + new_trending_tags: + title: 趨勢ê hashtag + subject: "%{instance} 頂有新ê趨勢愛審查" + aliases: + add_new: 加添別名 + created_msg: 別名成功加添ah。Lí ē當開始tuì舊ê口座轉。 + deleted_msg: Thâi掉捌名成功。Bē當tuì hit ê口座轉kàu tsit ê ah。 + empty: Lí bô半个別名。 + hint_html: Nā lí beh tuì別ê口座轉kah tsit ê,lí通佇tsia加別名,tse是必要ê,了後lí ē當kā跟tuè lí ê tuì舊口座suá到tsit ê。Tsit ê動作是無害koh通還原著tī舊口座suá口座。 + remove: 取消連結別名 + appearance: + advanced_settings: 進一步ê設定 + animations_and_accessibility: 動畫kap無障礙設定 + boosting_preferences: 轉送ê偏好設定 + boosting_preferences_info_html: "撇步:無論án-nuá設定,Shift + Click 佇%{icon} 轉送標á ē liâm-mī轉送。" + discovery: 發現 + localization: + body: Mastodon是由志工翻譯。 + guide_link: https://crowdin.com/project/mastodon + guide_link_text: Ta̍k家lóng ē當貢獻。 + sensitive_content: 敏感ê內容 + application_mailer: + notification_preferences: 改電子phue ê偏好 + salutation: "%{name}、" + settings: 改電子phue ê偏好:%{link} + unsubscribe: 取消訂 + view: 檢視: + view_profile: 看個人資料 + view_status: 看PO文 + applications: + created: 應用程式成功加添 + destroyed: 應用程式成功thâi掉 + logout: 登出 + regenerate_token: 重頭產生接近使用ê token + token_regenerated: 接近使用ê token 成功重頭產生 + warning: 注意!毋通kā分享hōo別lâng! + your_token: Lí ê接近使用token + auth: + apply_for_account: 申請口座 + captcha_confirmation: + help_html: Nā lí完成CAPTCHA ê時陣有問題,lí通用 %{email} kap guán 聯絡,guán ē幫tsān lí。 + hint_html: 上尾步ah!Guán愛確認lí是人類(以免pùn-sò訊息入侵!)解決下kha êCAPTCHA了後,ji̍h「繼續」。 + title: 安全檢查 + confirmations: + awaiting_review: Lí ê電子phue地址有確認ah!%{domain} ê人員leh審查lí ê註冊。Nā in允准lí ê口座,Lí ē收著電子phue! + awaiting_review_title: Lí ê註冊當leh審查 + clicking_this_link: Ji̍h tsit ê連結 + login_link: 登入 + proceed_to_login_html: Lí tsit-má通繼續去 %{login_link}。 + redirect_to_app_html: Lí應該受重轉kàu %{app_name}應用程式,若是iáu-buē,試 %{clicking_this_link} á是手動轉去tsit ê應用程式。 + registration_complete: Lí佇 %{domain} ê註冊完成ah! + welcome_title: 歡迎 %{name}! + wrong_email_hint: Nā是電子phue ê地址無正確,lí ē當tī口座設定kā改。 + delete_account: Thâi掉口座 + delete_account_html: Nā lí behthâi掉lí ê口座,lí ē當ji̍h tsia繼續。Lí著確認動作。 + description: + prefix_invited_by_user: "@%{name} 邀請lí加入tsit ê Mastodon 服侍器!" + prefix_sign_up: Tsit-má註冊Mastodon ê口座! + suffix: 有口座,lí當tuì ta̍k ê Mastodon 服侍器跟tuè lâng、PO更新kap交換訊息等等! + didnt_get_confirmation: Kám無收著確認ê連結? + dont_have_your_security_key: Lí iáu無安全鎖(security key)? + forgot_password: 密碼be記得? + invalid_reset_password_token: 重新設密碼ê token無效á是過期ah。請重頭the̍h新ê。 + link_to_otp: 請tuì lí ê手機á輸入雙因素認證(2FA)ê碼,á是恢復碼。 + link_to_webauth: 用lí ê安全鎖ê裝置 + log_in_with: 登入用 + login: 登入 + logout: 登出 + migrate_account: 轉kàu無kâng ê口座 + migrate_account_html: Nā lí ǹg望引tshuā別人tuè無kâng ê口座,請 kàutsia設定。 + or_log_in_with: Á是登入用 + progress: + confirm: 確認電子phue + details: Lí ê詳細 + review: Lán ê審查 + rules: 接受規則 + providers: + cas: CAS + saml: SAML + register: 註冊 + registration_closed: "%{instance} 無接受新ê成員" + resend_confirmation: 重送確認ê連結 + reset_password: 重設密碼 + rules: + accept: 接受 + back: Tńg去 + invited_by: Lí通用有tuì hia收著ê邀請加入 %{domain}: + preamble: Tsiah-ê hōo %{domain} ê管理員設定kap實施。 + preamble_invited: 佇lí繼續進前,請思考 %{domain} ê管理員設立ê基本規則。 + title: Tsi̍t-kuá基本規定。 + title_invited: Lí受邀請ah。 + security: 安全 scheduled_statuses: too_soon: Tio̍h用未來ê日期。 statuses: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 68f76a44a..ede7eb69c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -796,6 +796,8 @@ nl: view_dashboard_description: Geeft gebruikers toegang tot het dashboard en verschillende statistieken view_devops: DevOps view_devops_description: Geeft gebruikers toegang tot de dashboards van Sidekiq en pgHero + view_feeds: Openbare en hashtagtijdlijnen bekijken + view_feeds_description: Hiermee kunnen gebruikers toegang krijgen tot de openbare en hashtagtijdlijnen, ongeacht de serverinstellingen title: Rollen rules: add_new: Regel toevoegen @@ -837,7 +839,7 @@ nl: title: Gebruikers standaard niet door zoekmachines laten indexeren discovery: follow_recommendations: Aanbevolen accounts - preamble: Het tonen van interessante inhoud is van essentieel belang voor het aan boord halen van nieuwe gebruikers, die mogelijk niemand van Mastodon kennen. Bepaal hoe verschillende functies voor het ontdekken van inhoud en gebruikers op jouw server werken. + preamble: Interessante inhoud uitlichten is van essentieel belang voor onboarding van nieuwe gebruikers, die mogelijk niemand op Mastodon kennen. Bepaal hoe verschillende functies voor het ontdekken van inhoud en gebruikers op jouw server werken. privacy: Privacy profile_directory: Gebruikersgids public_timelines: Openbare tijdlijnen @@ -851,7 +853,13 @@ nl: feed_access: modes: authenticated: Alleen ingelogde gebruikers + disabled: Specifieke gebruikersrol vereisen public: Iedereen + landing_page: + values: + about: Over + local_feed: Lokale tijdlijn + trends: Trends registrations: moderation_recommandation: Zorg ervoor dat je een adequaat en responsief moderatieteam hebt voordat je registraties voor iedereen openstelt! preamble: Toezicht houden op wie een account op deze server kan registreren. @@ -1921,6 +1929,7 @@ nl: errors: in_reply_not_found: Het bericht waarop je probeert te reageren lijkt niet te bestaan. quoted_status_not_found: Het bericht die je probeert te citeren lijkt niet te bestaan. + quoted_user_not_mentioned: Een niet-vermelde gebruiker kan niet in een privébericht worden geciteerd. over_character_limit: Limiet van %{max} tekens overschreden pin_errors: direct: Berichten die alleen zichtbaar zijn voor vermelde gebruikers, kunnen niet worden vastgezet diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 614b0aa8d..f9e2d55df 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -796,6 +796,8 @@ nn: view_dashboard_description: Gir brukere tilgang til dashbordet og ulike metrikker view_devops: DevOps view_devops_description: Gir brukere tilgang til Sidekiq og pgHero-dashbord + view_feeds: Sjå direktestraumar og emnestraumar + view_feeds_description: La brukarar sjå direkte- og emnestraumane uansett innstillingar på tenaren title: Roller rules: add_new: Legg til regel @@ -837,13 +839,13 @@ nn: title: Ikkje la brukarar indekserast av søkjemotorar som standard discovery: follow_recommendations: Fylgjeforslag - preamble: Å framheva interessant innhald er vitalt i mottakinga av nye brukarar som ikkje nødvendigvis kjenner nokon på Mastodon. Kontroller korleis oppdagingsfunksjonane på tenaren din fungerar. + preamble: Å framheva interessant innhald er viktig for å ta imot nye brukarar som ikkje nødvendigvis kjenner nokon på Mastodon. Kontroller korleis oppdagingsfunksjonane på tenaren din fungerer. privacy: Personvern profile_directory: Profilkatalog public_timelines: Offentlege tidsliner publish_statistics: Publiser statistikk title: Oppdaging - trends: Trender + trends: Populært domain_blocks: all: Til alle disabled: Til ingen @@ -851,7 +853,13 @@ nn: feed_access: modes: authenticated: Berre godkjende brukarar + disabled: Krev ei spesifikk brukarrolle public: Alle + landing_page: + values: + about: Om + local_feed: Lokal tidsline + trends: Populært registrations: moderation_recommandation: Pass på at du har mange og kjappe redaktørar og moderatorar på laget ditt før du opnar for allmenn registrering! preamble: Kontroller kven som kan oppretta konto på tenaren din. @@ -1921,6 +1929,7 @@ nn: errors: in_reply_not_found: Det ser ut til at tutet du freistar å svara ikkje finst. quoted_status_not_found: Innlegget du prøver å sitera ser ikkje ut til å finnast. + quoted_user_not_mentioned: Kan ikkje sitera ein person som ikkje er nemnd i direktemeldingar. over_character_limit: øvregrensa for teikn, %{max}, er nådd pin_errors: direct: Innlegg som bare er synlige for nevnte brukere kan ikke festes diff --git a/config/locales/no.yml b/config/locales/no.yml index 72cbad788..f627c9318 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -729,7 +729,6 @@ title: Ikke la brukere indekseres av søkemotorer som standard discovery: follow_recommendations: Følg anbefalinger - preamble: Å fremheve interessant innhold er viktig i ombordstigning av nye brukere som kanskje ikke kjenner noen Mastodon. Kontroller hvordan ulike oppdagelsesfunksjoner fungerer på serveren. profile_directory: Profilkatalog public_timelines: Offentlige tidslinjer publish_statistics: Publiser statistikk diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 418d908f8..cea6bf5ee 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -331,6 +331,7 @@ pl: create: Utwórz ogłoszenie title: Nowe ogłoszenie preview: + disclaimer: Ponieważ użytkownicy nie mogą zrezygnować z otrzymywania powiadomień email, powinny one ograniczać się do ważnych ogłoszeń, takich jak powiadomienia o naruszeniu bezpieczeństwa danych osobowych lub zamknięciu serwera. explanation_html: 'Wiadomość e-mail zostanie wysłana do %{display_count} użytkowników. Otrzymają oni wiadomość o następującej treści:' title: Podgląd powiadomienia publish: Opublikuj @@ -507,6 +508,7 @@ pl: created_at: 'Utworzono:' delete: Usuń ip: Adres IP + request_body: Treść zgłoszenia providers: active: Aktywne base_url: Podstawowy adres URL @@ -515,10 +517,12 @@ pl: finish_registration: Zakończ rejestrację name: Nazwa providers: Dostawca + public_key_fingerprint: Odcisk klucza publicznego registration_requested: Wymagana rejestracja registrations: confirm: Zatwierdź reject: Odrzuć + title: Potwierdź rejestrację FASP save: Zapisz sign_in: Zaloguj się status: Status @@ -600,6 +604,10 @@ pl: title: Moderacja moderation_notes: create: Dodaj notatkę moderacyjną + created_msg: Notatka dotycząca moderacji instancji została pomyślnie utworzona! + description_html: Wyświetlaj i zostawiaj notatki dla innych moderatorów oraz dla siebie samego w przyszłości + destroyed_msg: Notatka dotycząca moderacji instancji została pomyślnie usunięta! + placeholder: Informacje o tej instancji, podjętych działaniach lub wszelkie inne informacje, które pomogą ci moderować tę instancję w przyszłości. title: Notatki moderacyjne private_comment: Prywatny komentarz public_comment: Publiczny komentarz @@ -812,6 +820,8 @@ pl: view_dashboard_description: Pozwala użytkownikom na dostęp do panelu i różnych metryk view_devops: DevOps view_devops_description: Pozwala użytkownikom na dostęp do paneli Sidekiq i pgHero + view_feeds: Wyświetlaj aktualności i kanały tematyczne + view_feeds_description: Umożliwia użytkownikom dostęp do aktualności i kanałów tematycznych niezależnie od ustawień serwera title: Role rules: add_new: Dodaj zasadę @@ -825,6 +835,7 @@ pl: title: Regulamin serwera translation: Tłumaczenie translations: Tłumaczenia + translations_explanation: Możesz opcjonalnie dodać tłumaczenia reguł. Wyświetlany będzie tekst domyślny, jeśli nie ma dostępnej wersji przetłumaczonej. Zawsze upewnij się, że podane tłumaczenie jest zgodne z tekstem domyślnym. settings: about: manage_rules: Zarządzaj regułami serwera @@ -849,7 +860,6 @@ pl: title: Domyślnie żądaj nieindeksowania użytkowników przez wyszukiwarki discovery: follow_recommendations: Polecane konta - preamble: Prezentowanie interesujących treści ma kluczowe znaczenie dla nowych użytkowników, którzy mogą nie znać nikogo z Mastodona. Kontroluj, jak różne funkcje odkrywania działają na Twoim serwerze. privacy: Prywatność profile_directory: Katalog profilów public_timelines: Publiczne osie czasu @@ -1977,6 +1987,8 @@ pl: title: '%{name}: "%{quote}"' visibilities: public: Publiczne + unlisted: Niewidoczny + unlisted_long: Ukryte w wynikach wyszukiwania Mastodona, trendach i publicznych osiach czasu statuses_cleanup: enabled: Automatycznie usuwaj stare wiadomości enabled_hint: Automatycznie usuwa Twoje posty, gdy osiągną określony próg wiekowy, chyba że spełniają jeden z poniższych wyjątków @@ -2022,6 +2034,8 @@ pl: terms_of_service: title: Regulamin terms_of_service_interstitial: + future_preamble_html: Wprowadzamy pewne zmiany w naszych warunkach świadczenia usług, które zaczną obowiązywać od %{date}. Zachęcamy do zapoznania się z aktualnymi warunkami. + past_preamble_html: Od czasu twojej ostatniej wizyty zmieniliśmy warunki korzystania z usługi. Zachęcamy do zapoznania się z aktualnymi warunkami. review_link: Przeglądnij Warunki Korzystania title: Warunki korzystania z %{domain} zmieniają się themes: @@ -2056,6 +2070,7 @@ pl: webauthn: Klucze bezpieczeństwa user_mailer: announcement_published: + description: 'Administratorzy %{domain} publikują ogłoszenie:' subject: Ogłoszenie serwisu title: Ogłoszenie serwisu %{domain} appeal_approved: @@ -2090,6 +2105,8 @@ pl: terms_of_service_changed: agreement: Kontynuując używanie %{domain}, zgadzasz się na te warunki. Jeśli nie zgadzasz się ze zaktualizowanymi warunkami, możesz wypowiedzieć umowę z %{domain} w dowolnym momencie, usuwając swoje konto. changelog: 'W skrócie oto co oznacza dla Ciebie ta aktualizacja:' + description: 'Otrzymujesz tę wiadomość email, ponieważ wprowadzamy pewne zmiany w naszych warunkach świadczenia usług w domenie %{domain}. Aktualizacje te zaczną obowiązywać od dnia %{date}. Zachęcamy do zapoznania się z pełną treścią zaktualizowanych warunków tutaj:' + description_html: Otrzymujesz tę wiadomość email, ponieważ wprowadzamy pewne zmiany w naszych warunkach świadczenia usług w domenie %{domain}. Aktualizacje te zaczną obowiązywać od dnia %{date}. Zachęcamy do zapoznania się z pełną treścią zaktualizowanych warunków tutaj. sign_off: Zespół %{domain} subject: Aktualizacja warunków korzystania z usług subtitle: Warunki korzystania z %{domain} zmieniają się diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 5af827595..dd1a04754 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -796,6 +796,8 @@ pt-BR: view_dashboard_description: Permite que os usuários acessem o painel e várias métricas view_devops: DevOps view_devops_description: Permite aos usuários acessar os painéis da Sidekiq e pgHero + view_feeds: Veja transmissões ao vivo e por tópico + view_feeds_description: Permite que os usuários acessem os feeds ao vivo e por tópico, independentemente das configurações do servidor title: Funções rules: add_new: Adicionar regra @@ -837,7 +839,7 @@ pt-BR: title: Optar por excluir usuários da indexação de mecanismos de pesquisa por padrão discovery: follow_recommendations: Seguir recomendações - preamble: Navegar por um conteúdo interessante é fundamental para integrar novos usuários que podem não conhecer ninguém no Mastodon. Controle como várias características de descoberta funcionam no seu servidor. + preamble: A exibição de conteúdo interessante é fundamental para a integração de novos usuários que podem não conhecer ninguém no Mastodon. Controle o funcionamento de vários recursos de descoberta no seu servidor. privacy: Privacidade profile_directory: Diretório de perfis public_timelines: Timelines públicas @@ -848,6 +850,16 @@ pt-BR: all: Para todos disabled: Para ninguém users: Para usuários locais logados + feed_access: + modes: + authenticated: Apenas usuários autenticados + disabled: Exige função específica de usuário + public: Todos + landing_page: + values: + about: Sobre + local_feed: Feed local + trends: Em alta registrations: moderation_recommandation: Por favor, certifique-se de ter uma equipe de moderação adequada e reativa antes de abrir as inscrições para todos! preamble: Controle quem pode criar uma conta no seu servidor. @@ -901,6 +913,7 @@ pt-BR: no_status_selected: Nenhuma publicação foi modificada porque nenhuma estava selecionada open: Publicação aberta original_status: Publicação original + quotes: Citações reblogs: Reblogs replied_to_html: Respondeu à %{acct_link} status_changed: Publicação alterada @@ -908,6 +921,7 @@ pt-BR: title: Publicações da conta - @%{name} trending: Em alta view_publicly: Ver publicamente + view_quoted_post: Visualizar citação publicada visibility: Visibilidade with_media: Com mídia strikes: @@ -1182,7 +1196,10 @@ pt-BR: hint_html: Se você quiser migrar de uma outra conta para esta, você pode criar um atalho aqui, o que é necessário antes que você possa migrar os seguidores da conta antiga para esta. Esta ação por si só é inofensiva e reversível. A migração da conta é iniciada pela conta antiga. remove: Desvincular alias appearance: + advanced_settings: Configurações avançadas animations_and_accessibility: Animações e acessibilidade + boosting_preferences: Adicionar preferências + boosting_preferences_info_html: "Dica: Independentemente das configurações, Shift + Clique no ícone %{icon} Boost irá impulsionar imediatamente." discovery: Descobrir localization: body: Mastodon é traduzido por voluntários. @@ -1584,6 +1601,13 @@ pt-BR: expires_at: Expira em uses: Usos title: Convidar pessoas + link_preview: + author_html: Por %{name} + potentially_sensitive_content: + action: Clique para mostrar + confirm_visit: Tem certeza que deseja abrir esse link? + hide_button: Ocultar + label: Conteúdo potencialmente sensível lists: errors: limit: Você atingiu o número máximo de listas @@ -1894,6 +1918,9 @@ pt-BR: other: "%{count} vídeos" boosted_from_html: Impulso de %{acct_link} content_warning: 'Aviso de conteúdo: %{warning}' + content_warnings: + hide: Ocultar publicação + show: Exibir mais default_language: Igual ao idioma da interface disallowed_hashtags: one: 'continha hashtag não permitida: %{tags}' @@ -1908,15 +1935,22 @@ pt-BR: limit: Você alcançou o número limite de publicações fixadas ownership: As publicações dos outros não podem ser fixadas reblog: Um impulso não pode ser fixado + quote_error: + not_available: Publicação indisponível + pending_approval: Publicação pendente + revoked: Publicação removida pelo autor quote_policies: followers: Apenas seguidores nobody: Apenas eu public: Qualquer um + quote_post_author: Publicação citada por %{acct} title: '%{name}: "%{quote}"' visibilities: direct: Citação privada + private: Apenas seguidores public: Público public_long: Qualquer um dentro ou fora do Mástodon + unlisted: Publicação silenciada unlisted_long: Oculto aos resultados de pesquisa em Mástodon statuses_cleanup: enabled: Excluir publicações antigas automaticamente diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index e420d0c2f..d9efbf6a5 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -796,6 +796,8 @@ pt-PT: view_dashboard_description: Permite aos utilizadores acederem ao painel de controlo e a várias estatísticas view_devops: DevOps view_devops_description: Permite aos utilizadores aceder aos painéis de controlo do Sidekiq e pgHero + view_feeds: Ver cronologia em tempo real e de etiquetas + view_feeds_description: Permitir aos utilizadores aceder às cronologias em tempo real e de etiquetas independentemente das definições do servidor title: Funções rules: add_new: Adicionar regra @@ -817,7 +819,7 @@ pt-PT: rules_hint: Existe uma área dedicada às regras a que os teus utilizadores devem aderir. title: Sobre allow_referrer_origin: - desc: Quando os seus utilizadores clicam em links para sites externos, o navegador deles pode enviar o endereço do seu servidor Mastodon como referenciador. Desative esta opção se isso identificar inequivocamente os seus utilizadores, por exemplo, se este for um servidor Mastodon pessoal. + desc: Quando os seus utilizadores clicam em hiperligações para sites externos, o navegador destes pode enviar o endereço do seu servidor Mastodon como referenciador. Desative esta opção se isso identificar inequivocamente os seus utilizadores, por exemplo, se este for um servidor Mastodon pessoal. title: Permitir que sites externos vejam o seu servidor Mastodon como uma fonte de tráfego appearance: preamble: Personaliza a interface web do Mastodon. @@ -837,7 +839,7 @@ pt-PT: title: Desativar, por omissão, a indexação de utilizadores por parte dos motores de pesquisa discovery: follow_recommendations: Recomendações de contas - preamble: Revelar conteúdos interessantes é fundamental para a entrada de novos utilizadores que podem não conhecer ninguém no Mastodon. Controla como os vários recursos de descoberta funcionam no teu servidor. + preamble: Apresentar conteúdos interessantes é fundamental para atrair novos utilizadores que talvez não conheçam ninguém no Mastodon. Controle como várias funcionalidades de descoberta funcionam no seu servidor. privacy: Privacidade profile_directory: Diretório de perfis public_timelines: Cronologias públicas @@ -851,7 +853,13 @@ pt-PT: feed_access: modes: authenticated: Apesar utilizadores autenticados + disabled: Requerer função de utilizador especifica public: Todos + landing_page: + values: + about: Sobre + local_feed: Cronologia local + trends: Tendências registrations: moderation_recommandation: Certifique-se de que dispõe de uma equipa de moderação adequada e reativa antes de abrir as inscrições a todos! preamble: Controle quem pode criar uma conta no seu servidor. @@ -905,6 +913,7 @@ pt-PT: no_status_selected: Nenhum estado foi alterado porque nenhum foi selecionado open: Abrir publicação original_status: Publicação original + quotes: Citações reblogs: Impulsos replied_to_html: Respondeu a %{acct_link} status_changed: Publicação alterada @@ -912,6 +921,7 @@ pt-PT: title: Publicações da conta - @%{name} trending: Em destaque view_publicly: Visualizar publicamente + view_quoted_post: Ver publicação citada visibility: Visibilidade with_media: Com multimédia strikes: @@ -1186,7 +1196,10 @@ pt-PT: hint_html: Se quiseres mudar de outra conta para esta, podes criar aqui um pseudónimo, que é necessário antes de poderes prosseguir com a migração de seguidores da conta antiga para esta. Esta ação por si só é inofensiva e reversível. A migração da conta é iniciada a partir da conta antiga. remove: Desvincular pseudónimo appearance: + advanced_settings: Definições avançadas animations_and_accessibility: Animações e acessibilidade + boosting_preferences: Definições de partilha + boosting_preferences_info_html: "Dica: Independente das definições, Shift + Clique no ícone %{icon} de Partilhar vai partilhar de imediato." discovery: Descobrir localization: body: O Mastodon é traduzido por voluntários. @@ -1221,7 +1234,7 @@ pt-PT: clicking_this_link: clicar nesta hiperligação login_link: iniciar sessão proceed_to_login_html: Podes agora prosseguir para %{login_link}. - redirect_to_app_html: Devias ter sido reencaminhado para a aplicação %{app_name}. Se isso não aconteceu, tenta %{clicking_this_link} ou regressa manualmente para a aplicação. + redirect_to_app_html: Devia ter sido reencaminhado para a aplicação %{app_name}. Se isso não aconteceu, tente %{clicking_this_link} ou regresse manualmente para a aplicação. registration_complete: O teu registo sem %{domain} está agora concluído! welcome_title: Bem-vindo(a), %{name}! wrong_email_hint: Se este endereço de correio eletrónico não estiver correto, podes alterá-lo nas definições de conta. @@ -1406,7 +1419,7 @@ pt-PT: request: Pedir o teu arquivo size: Tamanho blocks: Bloqueaste - bookmarks: Marcadores + bookmarks: Itens Salvos csv: CSV domain_blocks: Bloqueios de domínio lists: Listas @@ -1503,8 +1516,8 @@ pt-PT: one: Estás prestes a substituir a tua lista de bloqueios com até conta%{count} de %{filename}. other: Estás prestes a substituir a tua lista de bloqueios com até %{count} contas de %{filename}. bookmarks_html: - one: Estás prestes a substituir os teus marcadores com até %{count} publicações de %{filename}. - other: Estás prestes a substituir os teus marcadores com até %{count} publicação de %{filename}. + one: Está prestes a substituir os seus itens salvos com até %{count} publicação de %{filename}. + other: Está prestes a substituir os seus itens salvos com até %{count} publicações de %{filename}. domain_blocking_html: one: Estás prestes a substituir a tua lista de bloqueios de domínio com até %{count} domínio de %{filename}. other: Estás prestes a substituir a tua lista de bloqueios de domínio com até %{count} domínios de %{filename}. @@ -1522,8 +1535,8 @@ pt-PT: one: Estás prestes a bloquear até %{count} conta de %{filename}. other: Estás prestes a bloquear até %{count} contas de %{filename}. bookmarks_html: - one: Estás prestes a adicionar até %{count} publicação de %{filename} aos teus marcadores. - other: Estás prestes a adicionar até %{count} publicações de %{filename} aos teus marcadores. + one: Está prestes a adicionar até %{count} publicação de %{filename} aos teus marcadores. + other: Está prestes a adicionar até %{count} publicações de %{filename} aos teus marcadores. domain_blocking_html: one: Estás prestes a bloquear até %{count} domínio de %{filename}. other: Estás prestes a bloquear até %{count} domínios de %{filename}. @@ -1548,18 +1561,18 @@ pt-PT: time_started: Iniciado em titles: blocking: Importar contas bloqueadas - bookmarks: Importar marcadores + bookmarks: Importar Itens Salvos domain_blocking: Importar domínios bloqueados following: Importar contas seguidas lists: Importar listas muting: Importar contas ocultadas type: Tipo de importação type_groups: - constructive: Seguidores e marcadores + constructive: Seguidores e Itens Salvos destructive: Bloqueios e ocultados types: blocking: Lista de bloqueios - bookmarks: Marcadores + bookmarks: Itens Salvos domain_blocking: Lista de domínios bloqueados following: Lista de pessoas que estás a seguir lists: Listas @@ -1592,7 +1605,7 @@ pt-PT: author_html: Por %{name} potentially_sensitive_content: action: Clicar para mostrar - confirm_visit: Tem a certeza que prentende abrir esta ligação? + confirm_visit: Tem a certeza que prentende abrir esta hiperligação? hide_button: Esconder label: Conteúdo potencialmente sensível lists: @@ -1620,7 +1633,7 @@ pt-PT: follow: e-mails de notificação de seguidor follow_request: e-mails de pedido de seguidor mention: e-mails de notificação de menção - reblog: e-mails de notificação de impulsos + reblog: e-mails de notificação de partilhas resubscribe_html: Se tiveres anulado a subscrição por engano, podes voltar a subscrevê-la nas definições de notificação por e-mail. success_html: Não receberás novamente %{type} do Mastodon em %{domain} para o teu e-mail em %{email}. title: Cancelar subscrição @@ -1700,8 +1713,8 @@ pt-PT: subject: "%{name} citou a sua publicação" title: Nova citação reblog: - body: 'A tua publicação foi impulsionada por %{name}:' - subject: "%{name} impulsionou a tua publicação" + body: 'A tua publicação foi partilhada por %{name}:' + subject: "%{name} partilhou a sua publicação" title: Novo impulso status: subject: "%{name} acabou de publicar" @@ -1903,7 +1916,7 @@ pt-PT: video: one: "%{count} vídeo" other: "%{count} vídeos" - boosted_from_html: Impulsionado por %{acct_link} + boosted_from_html: Partilhado por %{acct_link} content_warning: 'Aviso de conteúdo: %{warning}' content_warnings: hide: Esconder publicação @@ -1916,16 +1929,22 @@ pt-PT: errors: in_reply_not_found: A publicação a que estás a tentar responder parece não existir. quoted_status_not_found: A publicação que está a tentar citar parece não existir. + quoted_user_not_mentioned: Um utilizador não mencionado não pode ser citado numa publicação privada. over_character_limit: limite de caracteres %{max} excedido pin_errors: direct: As publicações que só são visíveis para os utilizadores mencionados não podem ser fixadas limit: Já fixaste a quantidade máxima de publicações ownership: Não podem ser fixadas publicações de outras pessoas - reblog: Não é possível fixar um impulso + reblog: Não é possível fixar uma partilha + quote_error: + not_available: Publicação indisponível + pending_approval: Publicação pendente + revoked: Publicação removida pelo autor quote_policies: followers: Apenas para seguidores nobody: Apenas eu public: Todos + quote_post_author: Citou uma publicação de %{acct} title: '%{name}: "%{quote}"' visibilities: direct: Menção privada @@ -1940,9 +1959,9 @@ pt-PT: exceptions: Exceções explanation: Como eliminar publicações é uma operação custosa, isto é feito lentamente ao longo do tempo, quando o servidor não está ocupado. Por esta razão, as tuas publicações podem ser eliminadas um pouco depois de atingirem o limite de idade definido. ignore_favs: Ignorar favoritos - ignore_reblogs: Ignorar os impulsos + ignore_reblogs: Ignorar partilhas interaction_exceptions: Exceções baseadas em interações - interaction_exceptions_explanation: Tem em atenção que não há garantia de que as mensagens sejam eliminadas se ficarem abaixo do limite de favoritos ou de impulsionamento depois de os terem ultrapassado. + interaction_exceptions_explanation: Observe que não há garantia que as publicações serão excluídas se ficarem abaixo do limite de favoritos ou partilhas depois de terem ultrapassado esses limites. keep_direct: Manter mensagens diretas keep_direct_hint: Não elimina nenhuma das tuas mensagens diretas keep_media: Manter publicações com anexos de multimédia @@ -1951,8 +1970,8 @@ pt-PT: keep_pinned_hint: Não elimina nenhuma das tuas publicações afixadas keep_polls: Manter sondagens keep_polls_hint: Não elimina nenhuma das tuas sondagens - keep_self_bookmark: Manter as publicações que marquei - keep_self_bookmark_hint: Não elimina as tuas próprias publicações se as tiveres nos marcadores + keep_self_bookmark: Manter as publicações que salvou + keep_self_bookmark_hint: Não eliminar as suas próprias publicações se as tiver salvo keep_self_fav: Manter as publicações que adicionei aos favoritos keep_self_fav_hint: Não elimina as tuas próprias publicações se as tiveres adicionado aos favoritos min_age: @@ -1967,8 +1986,8 @@ pt-PT: min_age_label: Limite de idade min_favs: Manter publicações adicionadas aos favoritos pelos menos min_favs_hint: Não elimina nenhuma das tuas publicações que tenham sido adicionadas aos favoritos este número de vezes. Deixa em branco para eliminar publicações, independentemente do número de vezes que tenham sido adicionadas aos favoritos - min_reblogs: Manter as publicações impulsionadas, pelo menos - min_reblogs_hint: Não elimina nenhuma das tuas mensagens que tenham sido impulsionada pelo menos este número de vezes. Deixa em branco para eliminar as mensagens independentemente do número de impulsionamentos + min_reblogs: Manter, pelo menos, as publicações partilhadas + min_reblogs_hint: Não elimina nenhuma das suas publicações que tenha sido partilhadas pelo menos este número de vezes. Deixe em branco para eliminar publicações independentemente do número de partilhas stream_entries: sensitive_content: Conteúdo sensível strikes: @@ -2095,7 +2114,7 @@ pt-PT: checklist_subtitle: 'Vamos começar nesta nova fronteira social:' checklist_title: Passos de boas-vindas edit_profile_action: Personalizar - edit_profile_step: Aumenta as tuas interações com um perfil completo. + edit_profile_step: Aumente as suas interações ao ter um perfil mais completo. edit_profile_title: Personaliza o teu perfil explanation: Aqui estão algumas dicas para começar feature_action: Mais informações @@ -2136,7 +2155,7 @@ pt-PT: seamless_external_login: A sessão foi iniciada através de um serviço externo, pelo que as definições de palavra-passe e e-mail não estão disponíveis. signed_in_as: 'Registado como:' verification: - extra_instructions_html: Dica: a hiperligação no teu site pode ser invisível. A parte importante é rel="me" que impede a falsificação de identidade em sítios na web com conteúdos gerados pelos utilizadores. Podes até utilizar uma etiqueta link no cabeçalho da página ao invés de a, mas o HTML deve ser acessível sem executar JavaScript. + extra_instructions_html: Dica: a hiperligação no seu site pode ser invisível. A parte importante é rel="me" que impede a falsificação de identidade em sítios na web com conteúdos gerados pelos utilizadores. Pode até utilizar uma etiqueta link no cabeçalho da página ao invés de a, mas o HTML deve ser acessível sem executar JavaScript. here_is_how: Eis o que fazer hint_html: "Verificar a sua identidade no Mastodon é para todos. Baseado em normas públicas da web, agora e para sempre gratuitas. Tudo o que precisas é de um site pessoal pelo qual as pessoas te reconheçam. Quando colocas no teu perfil uma hiperligação para esse site, vamos verificar que o site tem uma hiperligação de volta para o teu perfil e mostrar um indicador visual." instructions_html: Copia e cola o código abaixo no HTML do teu site. Em seguida, adiciona o endereço do teu site num dos campos extras no teu perfil, na aba "Editar perfil" e guarda as alterações. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 12c739557..7ea9083c8 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -851,7 +851,6 @@ ru: title: Исключить пользователей из индексации поисковиками по умолчанию discovery: follow_recommendations: Рекомендации подписок - preamble: Наблюдение интересного контента играет важную роль при открытии новых пользователей, которые могут не знать ни одного Mastodon. Контролируйте как работают различные функции обнаружения на вашем сервере. privacy: Конфиденциальность profile_directory: Каталог профилей public_timelines: Публичные ленты diff --git a/config/locales/sco.yml b/config/locales/sco.yml index f90c7e692..777bd10ef 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -672,7 +672,6 @@ sco: title: Content retention discovery: follow_recommendations: Follae recommendations - preamble: Bringin forret interestin content helps ye tae bring in new uisers thit mibbie wullnae ken oniebody on Mastodon yit. Control hou various discovery features wirk on yer server. profile_directory: Profile directory public_timelines: Public timelines title: Discovery diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index eef49ef8f..75ed51833 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -104,7 +104,6 @@ ar: thumbnail: عرض حوالي 2:1 صورة إلى جانب معلومات الخادم الخاص بك. trendable_by_default: تخطي مراجعة المحتوى التريند اليدوي. لا يزال من الممكن الإزالة اللاحقة للعناصر الفردية من التريندات. trends: تُظهِر المتداولة أي من المنشورات والوسوم وقصص الأخبار التي تجذب الانتباه على خادمك. - trends_as_landing_page: إظهار المحتوى المتداوَل للمستخدمين والزوار غير المسجلين بدلاً من وصف هذا الخادم. يتطلب هذا تفعيل المتداولة. form_challenge: current_password: إنك بصدد الدخول إلى منطقة آمنة imports: @@ -290,7 +289,6 @@ ar: thumbnail: الصورة المصغرة للخادم trendable_by_default: السماح للوسوم بالظهور على المتداوَلة دون مراجعة مسبقة trends: تمكين المتداوَلة - trends_as_landing_page: استخدام المُتداوَلة كصفحة ترحيب interactions: must_be_follower: حظر الإشعارات القادمة من حسابات لا تتبعك must_be_following: حظر الإشعارات القادمة من الحسابات التي لا تتابعها diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index cee48c7de..c097562a2 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -65,7 +65,7 @@ be: setting_display_media_hide_all: Заўсёды хаваць медыя setting_display_media_show_all: Заўсёды паказваць медыя setting_emoji_style: Як паказваць эмодзі. "Аўтаматычны" будзе намагацца выкарыстоўваць мясцовыя эмодзі, але для састарэлых браўзераў — Twemoji. - setting_quick_boosting_html: Калі ўключана, клік па %{boost_icon} іконцы пашырэння адразу пашырыць допіс, без адкрыцця меню "пашырыць/цытаваць". Перасоўвае дзеянне цытавання ў меню %{options_icon} (выбару). + setting_quick_boosting_html: Калі ўключана, націсканне на %{boost_icon} значок пашырэння адразу пашырыць допіс замест адкрыцця меню пашырэння/цытавання. Перасоўвае дзеянне цытавання ў меню %{options_icon} (выбару). setting_system_scrollbars_ui: Працуе толькі ў камп'ютарных браўзерах на аснове Safari і Chrome setting_use_blurhash: Градыенты заснаваны на колерах схаваных выяў, але размываюць дэталі setting_use_pending_items: Схаваць абнаўленні стужкі за клікам замест аўтаматычнага пракручвання стужкі @@ -93,6 +93,7 @@ be: content_cache_retention_period: Усе допісы з іншых сервераў (разам з пашырэннямі і адказамі) будуць выдалены праз паказаную колькасць дзён, незалежна ад таго, як лакальны карыстальнік узаемадзейнічаў з гэтымі допісамі. Гэта датычыцца і тых допісаў, якія лакальны карыстальнік пазначыў у закладкі або ўпадабанае. Прыватныя згадванні паміж карыстальнікамі з розных экзэмпляраў сервераў таксама будуць страчаны і іх нельга будзе аднавіць. Выкарыстанне гэтай налады прызначана для экзэмпляраў сервераў спецыяльнага прызначэння і парушае многія чаканні карыстальнікаў пры выкарыстанні ў агульных мэтах. custom_css: Вы можаце прымяняць карыстальніцкія стылі ў вэб-версіі Mastodon. favicon: WEBP, PNG, GIF ці JPG. Замяняе прадвызначаны favicon Mastodon на ўласны значок. + landing_page: Выбірае, якую старонку бачаць новыя наведвальнікі, калі прыходзяць на Ваш сервер. Калі выбераце "Трэнды", тады неабходна іх уключыць у наладах Выяўленне. Калі выбераце "Тутэйшая стужка", тады ў наладах Выяўленне ў налады "Доступ да жывых стужак з лакальнымі допісамі" мусіць стаяць варыянт "Усе". mascot: Замяняе ілюстрацыю ў пашыраным вэб-інтэрфейсе. media_cache_retention_period: Медыяфайлы з допісаў, зробленых карыстальнікамі з іншых сервераў, кэшыруюцца на вашым серверы. Пры станоўчым значэнні медыяфайлы будуць выдалены праз пазначаную колькасць дзён. Калі медыяданыя будуць запытаныя пасля выдалення, яны будуць спампаваныя зноў, калі зыходнае змесціва усё яшчэ даступнае. У сувязі з абмежаваннямі на частату абнаўлення картак перадпрагляду іншых сайтаў, рэкамендуецца ўсталяваць значэнне не менш за 14 дзён, інакш гэтыя карткі не будуць абнаўляцца па запыце раней за гэты тэрмін. min_age: Карыстальнікі будуць атрымліваць запыт на пацвярджэнне даты нараджэння падчас рэгістрацыі @@ -110,7 +111,6 @@ be: thumbnail: Выява памерамі прыкладна 2:1, якая паказваецца побач з інфармацыяй пра ваш сервер. trendable_by_default: Прапусціць ручны агляд трэндавага змесціва. Асобныя элементы ўсё яшчэ можна будзе выдаліць з трэндаў пастфактум. trends: Трэнды паказваюць, якія допісы, хэштэгі і навіны набываюць папулярнасць на вашым серверы. - trends_as_landing_page: Паказваць папулярнае змесціва карыстальнікам, якія выйшлі з сістэмы, і наведвальнікам, замест апісання гэтага сервера. Патрабуецца ўключэнне трэндаў. form_challenge: current_password: Вы ўваходзіце ў бяспечную зону imports: @@ -289,6 +289,7 @@ be: content_cache_retention_period: Перыяд захоўвання змесціва з іншых сервераў custom_css: CSS карыстальніка favicon: Значок сайта + landing_page: Старонка прыбыцця для новых наведвальнікаў local_live_feed_access: Доступ да жывых стужак з лакальнымі допісамі local_topic_feed_access: Доступ да хэштэгавых і спасылачных стужак з лакальнымі допісамі mascot: Уласны маскот(спадчына) @@ -313,7 +314,6 @@ be: thumbnail: Мініяцюра сервера trendable_by_default: Дазваляць трэнды без папярэдняй праверкі trends: Уключыць трэнды - trends_as_landing_page: Выкарыстоўваць трэнды ў якасці лэндзінга interactions: must_be_follower: Заблакіраваць апавяшчэнні ад непадпісаных людзей must_be_following: Заблакіраваць апавяшчэнні ад людзей на якіх вы не падпісаны diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 047199adc..e14b05ed9 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -105,7 +105,6 @@ bg: thumbnail: Образ в съотношение около 2:1, показвано до информацията за сървъра ви. trendable_by_default: Прескачане на ръчния преглед на изгряващо съдържание. Отделни елементи още могат да се премахват от изгряващи постфактум. trends: В раздел „Налагащо се“ се показват публикации, хаштагове и новини, набрали популярност на сървъра ви. - trends_as_landing_page: Показване на налагащото се съдържание за излизащите потребители и посетители вместо на описа на този сървър. Изисква налагащото се да бъде включено. form_challenge: current_password: Влизате в зона за сигурност imports: @@ -243,6 +242,7 @@ bg: setting_emoji_style: Стил на емоджито setting_expand_spoilers: Винаги разширяване на публикации, отбелязани с предупреждения за съдържание setting_hide_network: Скриване на социалния ви свързан граф + setting_quick_boosting: Включване на бързо подсилване setting_reduce_motion: Обездвижване на анимациите setting_system_font_ui: Употреба на стандартния шрифт на системата setting_system_scrollbars_ui: Употреба на системната подразбираща се лента за превъртане @@ -296,7 +296,6 @@ bg: thumbnail: Образче на сървъра trendable_by_default: Без преглед на налагащото се trends: Включване на налагащи се - trends_as_landing_page: Употреба на налагащото се като целева страница interactions: must_be_follower: Блокирай известия от не-последователи must_be_following: Блокиране на известия от неследваните diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 9c3a6d826..ceca6b0e7 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -107,7 +107,6 @@ ca: thumbnail: Una imatge d'aproximadament 2:1 que es mostra al costat la informació del teu servidor. trendable_by_default: Omet la revisió manual del contingut en tendència. Els articles individuals poden encara ser eliminats després del fet. trends: Les tendències mostren quins tuts, etiquetes i notícies estan guanyant força en el teu servidor. - trends_as_landing_page: Mostra el contingut en tendència als usuaris i visitants no autenticats enlloc de la descripció d'aquest servidor. Requereix que les tendències estiguin activades. form_challenge: current_password: Estàs entrant en una àrea segura imports: @@ -295,7 +294,6 @@ ca: thumbnail: Miniatura del servidor trendable_by_default: Permet tendències sense revisió prèvia trends: Activa les tendències - trends_as_landing_page: Fer servir les tendències com a pàgina inicial interactions: must_be_follower: Bloqueja les notificacions de persones que no em segueixen must_be_following: Bloqueja les notificacions de persones no seguides diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index d4847acc8..cd5a51901 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -54,8 +54,10 @@ cs: password: Použijte alespoň 8 znaků phrase: Shoda bude nalezena bez ohledu na velikost písmen v textu příspěvku či varování o obsahu scopes: Která API bude aplikace moct používat. Pokud vyberete rozsah nejvyššího stupně, nebudete je muset vybírat jednotlivě. + setting_advanced_layout: Zobrazit Mastodon ve vícesloupovém rozvržení, umožňující zobrazení časoé osy, oznámení a třetího sloupce vašeho výběru. Není doporučeno pro menší obrazovky. setting_aggregate_reblogs: Nezobrazovat nové boosty pro příspěvky, které byly nedávno boostnuty (ovlivňuje pouze nově přijaté boosty) setting_always_send_emails: Jinak nebudou e-mailové notifikace posílány, když Mastodon aktivně používáte + setting_boost_modal: Pokud je povoleno, boostnutí nejprve otevře dialogové okno pro potvrzení, ve kterém můžete změnit viditelnost svého boostu. setting_default_quote_policy_private: Příspěvky pouze pro sledující, které jsou vytvořeny na Mastodonu, nemohou být citovány ostatními. setting_default_quote_policy_unlisted: Když vás lidé citují, jejich příspěvek bude v časové ose populárních příspěvků také skryt. setting_default_sensitive: Citlivá média jsou ve výchozím stavu skryta a mohou být zobrazena kliknutím @@ -63,6 +65,7 @@ cs: setting_display_media_hide_all: Vždy skrývat média setting_display_media_show_all: Vždy zobrazovat média setting_emoji_style: Jak se budou zobrazovat emoji. "Auto" zkusí použít výchozí emoji, ale pro starší prohlížeče použije Twemoji. + setting_quick_boosting_html: Pokud je povoleno, kliknutím na %{boost_icon} Boost ikonu okamžitě boostnete místo otevření rozbalovací nabídky boost/citace. Přemístí citaci do nabídky %{options_icon} (Možnosti). setting_system_scrollbars_ui: Platí pouze pro desktopové prohlížeče založené na Safari nebo Chrome setting_use_blurhash: Gradienty jsou vytvořeny na základě barvev skrytých médií, ale zakrývají veškeré detaily setting_use_pending_items: Aktualizovat časovou osu až po kliknutí namísto automatického rolování kanálu @@ -90,6 +93,7 @@ cs: content_cache_retention_period: Všechny příspěvky z jiných serverů (včetně boostů a odpovědí) budou po uplynutí stanoveného počtu dní smazány bez ohledu na interakci místního uživatele s těmito příspěvky. To se týká i příspěvků, které místní uživatel přidal do záložek nebo oblíbených. Soukromé zmínky mezi uživateli z různých instancí budou rovněž ztraceny a nebude možné je obnovit. Použití tohoto nastavení je určeno pro instance pro speciální účely a při implementaci pro obecné použití porušuje mnohá očekávání uživatelů. custom_css: Můžete použít vlastní styly ve verzi Mastodonu. favicon: WEBP, PNG, GIF nebo JPG. Nahradí výchozí favicon Mastodonu vlastní ikonou. + landing_page: Vybere stránku, kterou návštěvníci uvidí, když prvně přijdou na tvůj server. Pokud zvolíte "Trendy", je třeba povolit trendy v nastavení objevování. Pokud zvolíte "Místní kanál", je třeba v nastavení Objevování nastavit "Přístup k živým kanálům s lokálními příspěvky" na "Všichni". mascot: Přepíše ilustraci v pokročilém webovém rozhraní. media_cache_retention_period: Mediální soubory z příspěvků vzdálených uživatelů se ukládají do mezipaměti na vašem serveru. Pokud je nastaveno na kladnou hodnotu, budou média po zadaném počtu dní odstraněna. Pokud jsou mediální data vyžádána po jejich odstranění, budou znovu stažena, pokud je zdrojový obsah stále k dispozici. Vzhledem k omezením týkajícím se četnosti dotazů karet náhledů odkazů na weby třetích stran se doporučuje nastavit tuto hodnotu alespoň na 14 dní, jinak nebudou karty náhledů odkazů na vyžádání aktualizovány dříve. min_age: Uživatelé budou požádáni, aby při registraci potvrdili datum svého narození @@ -107,7 +111,6 @@ cs: thumbnail: Přibližně 2:1 obrázek zobrazený vedle informací o vašem serveru. trendable_by_default: Přeskočit manuální kontrolu populárního obsahu. Jednotlivé položky mohou být odstraněny z trendů později. trends: Trendy zobrazují, které příspěvky, hashtagy a zprávy získávají na serveru pozornost. - trends_as_landing_page: Zobrazit populární obsah odhlášeným uživatelům a návštěvníkům místo popisu tohoto serveru. Vyžaduje povolení trendů. form_challenge: current_password: Vstupujete do zabezpečeného prostoru imports: @@ -236,10 +239,12 @@ cs: setting_aggregate_reblogs: Seskupovat boosty v časových osách setting_always_send_emails: Vždy posílat e-mailová oznámení setting_auto_play_gif: Automaticky přehrávat animace GIF + setting_boost_modal: Ovládání viditelnosti boostování setting_default_language: Jazyk příspěvků setting_default_privacy: Viditelnost příspěvků setting_default_quote_policy: Kdo může citovat setting_default_sensitive: Vždy označovat média jako citlivá + setting_delete_modal: Upozornit před odstraněním příspěvku setting_disable_hover_cards: Zakázat náhled profilu při přejetí myší setting_disable_swiping: Vypnout gesta přejetí prsty setting_display_media: Zobrazování médií @@ -249,6 +254,8 @@ cs: setting_emoji_style: Styl emoji setting_expand_spoilers: Vždy rozbalit příspěvky označené varováními o obsahu setting_hide_network: Skrýt mou síť + setting_missing_alt_text_modal: Upozornit před odesláním médií bez popisného textu + setting_quick_boosting: Povolit rychlé boostnutí setting_reduce_motion: Omezit pohyb v animacích setting_system_font_ui: Použít výchozí písmo systému setting_system_scrollbars_ui: Použít výchozí posuvník systému @@ -282,7 +289,8 @@ cs: content_cache_retention_period: Doba uchovávání vzdáleného obsahu custom_css: Vlastní CSS favicon: Favicon - local_live_feed_access: Přístup k live kanálům s lokálními příspěvky + landing_page: Úvodní stránka pro nové návštěvníky + local_live_feed_access: Přístup k živým kanálům s lokálními příspěvky local_topic_feed_access: Přístup ke kanálům s hashtagy a odkazy s lokálními příspěvky mascot: Vlastní maskot (zastaralé) media_cache_retention_period: Doba uchovávání mezipaměti médií @@ -306,7 +314,6 @@ cs: thumbnail: Miniatura serveru trendable_by_default: Povolit trendy bez předchozí revize trends: Povolit trendy - trends_as_landing_page: Použít trendy jako vstupní stránku interactions: must_be_follower: Blokovat oznámení od lidí, kteří vás nesledují must_be_following: Blokovat oznámení od lidí, které nesledujete diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 89127c13a..58b07f787 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -54,8 +54,10 @@ cy: password: Defnyddiwch o leiaf 8 nod phrase: Caiff ei gyfateb heb ystyriaeth o briflythrennu mewn testun neu rhybudd ynghylch cynnwys postiad scopes: Pa APIs y bydd y rhaglen yn cael mynediad iddynt. Os dewiswch gwmpas lefel uchaf, nid oes angen i chi ddewis rhai unigol. + setting_advanced_layout: Dangos Mastodon fel cynllun aml-golofn, sy'n eich galluogi i weld y llinell amser, hysbysiadau, a thrydedd golofn o'ch dewis chi. Nid gyfer sgriniau llai. setting_aggregate_reblogs: Peidiwch â dangos hybiau newydd ar bostiadau sydd wedi cael eu hybu'n ddiweddar (dim ond yn effeithio ar hybiau newydd ei dderbyn) setting_always_send_emails: Fel arfer ni fydd hysbysiadau e-bost yn cael eu hanfon pan fyddwch chi wrthi'n defnyddio Mastodon + setting_boost_modal: Pan fydd wedi'i alluogi, bydd hybu'n agor deialog cadarnhau yn gyntaf lle gallwch newid gwelededd eich hwb. setting_default_quote_policy_private: Does dim modd dyfynnu postiadau sydd wedi'u hysgrifennu ar Mastodon ar gyfer dim ond dilynwyr. setting_default_quote_policy_unlisted: Pan fydd pobl yn eich dyfynnu, bydd eu postiad hefyd yn cael ei guddio rhag llinellau amser sy'n trendio. setting_default_sensitive: Mae cyfryngau sensitif wedi'u cuddio yn rhagosodedig a gellir eu datgelu trwy glicio @@ -63,6 +65,7 @@ cy: setting_display_media_hide_all: Cuddio cyfryngau bob tro setting_display_media_show_all: Dangos cyfryngau bob tro setting_emoji_style: Sut i arddangos emojis. Bydd "Awto" yn ceisio defnyddio emoji cynhenid, ond mae'n disgyn yn ôl i Twemoji ar gyfer porwyr traddodiadol. + setting_quick_boosting_html: Pan fydd wedi'i alluogi, bydd clicio ar yr eicon Hwb %{boost_icon} yn rhoi hwb ar unwaith yn lle agor y gwymplen hwb/dyfynnu. Mae'n symud y weithred dyfynnu i'r ddewislen %{options_icon} (Dewisiadau). setting_system_scrollbars_ui: Yn berthnasol i borwyr bwrdd gwaith yn seiliedig ar Safari a Chrome yn unig setting_use_blurhash: Mae graddiannau wedi'u seilio ar liwiau'r delweddau cudd ond maen nhw'n cuddio unrhyw fanylion setting_use_pending_items: Cuddio diweddariadau llinell amser y tu ôl i glic yn lle sgrolio'n awtomatig @@ -90,6 +93,7 @@ cy: content_cache_retention_period: Bydd yr holl bostiadau gan weinyddion eraill (gan gynnwys hwb ac atebion) yn cael eu dileu ar ôl y nifer penodedig o ddyddiau, heb ystyried unrhyw ryngweithio defnyddiwr lleol â'r postiadau hynny. Mae hyn yn cynnwys postiadau lle mae defnyddiwr lleol wedi ei farcio fel nodau tudalen neu ffefrynnau. Bydd cyfeiriadau preifat rhwng defnyddwyr o wahanol achosion hefyd yn cael eu colli ac yn amhosibl eu hadfer. Mae'r defnydd o'r gosodiad hwn wedi'i fwriadu ar gyfer achosion pwrpas arbennig ac mae'n torri llawer o ddisgwyliadau defnyddwyr pan gaiff ei weithredu at ddibenion cyffredinol. custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon. favicon: WEBP, PNG, GIF neu JPG. Yn diystyru'r favicon Mastodon rhagosodedig gydag eicon cyfaddas. + landing_page: Yn dewis pa dudalen y mae ymwelwyr newydd yn ei gweld pan fyddan nhw'n cyrraedd eich gweinydd am y tro cyntaf. Os dewiswch "Trendio", yna mae angen galluogi tueddiadau yn y Gosodiadau Darganfod. Os dewiswch "Ffrydiau lleol", yna mae angen gosod "Mynediad i ffrydiau byw sy'n cynnwys postiadau lleol" i "Pawb" yn y Gosodiadau Darganfod. mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch. media_cache_retention_period: Mae ffeiliau cyfryngau o bostiadau a wneir gan ddefnyddwyr o bell yn cael eu storio ar eich gweinydd. Pan gaiff ei osod i werth positif, bydd y cyfryngau yn cael eu dileu ar ôl y nifer penodedig o ddyddiau. Os gofynnir am y data cyfryngau ar ôl iddo gael ei ddileu, caiff ei ail-lwytho i lawr, os yw'r cynnwys ffynhonnell yn dal i fod ar gael. Oherwydd cyfyngiadau ar ba mor aml y mae cardiau rhagolwg cyswllt yn pleidleisio i wefannau trydydd parti, argymhellir gosod y gwerth hwn i o leiaf 14 diwrnod, neu ni fydd cardiau rhagolwg cyswllt yn cael eu diweddaru ar alw cyn yr amser hwnnw. min_age: Mae gofyn i ddefnyddwyr gadarnhau eu dyddiad geni wrth gofrestru @@ -107,7 +111,6 @@ cy: thumbnail: Delwedd tua 2:1 yn cael ei dangos ochr yn ochr â manylion eich gweinydd. trendable_by_default: Hepgor adolygiad llaw o gynnwys sy'n tueddu. Gall eitemau unigol gael eu tynnu o dueddiadau o hyd ar ôl y ffaith. trends: Mae pynciau llosg yn dangos y postiadau, hashnodau, a newyddion sy'n denu sylw ar eich gweinydd. - trends_as_landing_page: Dangos cynnwys tueddiadol i ddefnyddwyr ac ymwelwyr sydd wedi allgofnodi yn lle disgrifiad o'r gweinydd hwn. Mae angen galluogi tueddiadau. form_challenge: current_password: Rydych chi'n mynd i mewn i ardal ddiogel imports: @@ -238,10 +241,12 @@ cy: setting_aggregate_reblogs: Grwpio hybiau mewn ffrydiau setting_always_send_emails: Anfonwch hysbysiadau e-bost bob amser setting_auto_play_gif: Chwarae GIFs wedi'u hanimeiddio yn awtomatig + setting_boost_modal: Rheoli hybu gwelededd setting_default_language: Iaith postio setting_default_privacy: Gwelededd postio setting_default_quote_policy: Pwy sy'n gallu dyfynnu setting_default_sensitive: Marcio cyfryngau fel eu bod yn sensitif bob tro + setting_delete_modal: Rhybuddio fi cyn dileu postiad setting_disable_hover_cards: Analluogi rhagolwg proffil ar lusgo setting_disable_swiping: Analluogi cynigion llusgo setting_display_media: Dangos cyfryngau @@ -251,6 +256,8 @@ cy: setting_emoji_style: Arddull Emojis setting_expand_spoilers: Dangos postiadau wedi'u marcio â rhybudd cynnwys bob tro setting_hide_network: Cuddio eich graff cymdeithasol + setting_missing_alt_text_modal: Rhybuddio fi cyn postio cyfryngau heb destun amgen + setting_quick_boosting: Galluogi hybu cyflym setting_reduce_motion: Lleihau mudiant mewn animeiddiadau setting_system_font_ui: Defnyddio ffont rhagosodedig y system setting_system_scrollbars_ui: Defnyddiwch far sgrolio rhagosodedig y system @@ -284,6 +291,7 @@ cy: content_cache_retention_period: Cyfnod cadw cynnwys o bell custom_css: CSS cyfaddas favicon: Favicon + landing_page: Tudalen cychwyn ar gyfer ymwelwyr newydd local_live_feed_access: Mynediad i ffrydiau byw sy'n cynnwys postiadau lleol local_topic_feed_access: Mynediad i ffrydiau hashnod a dolenni sy'n cynnwys postiadau lleol mascot: Mascot cyfaddas (hen) @@ -308,7 +316,6 @@ cy: thumbnail: Bawdlun y gweinydd trendable_by_default: Caniatáu pynciau llosg heb adolygiad trends: Galluogi pynciau llosg - trends_as_landing_page: Defnyddio tueddiadau fel y dudalen gartref interactions: must_be_follower: Blocio hysbysiadau o bobl nad ydynt yn eich dilyn must_be_following: Blocio hysbysiadau o bobl nad ydych yn eu dilyn diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 93c47f7f3..f310413c6 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -93,6 +93,7 @@ da: content_cache_retention_period: Alle indlæg fra andre servere (herunder fremhævelser og besvarelser) slettes efter det angivne antal dage uden hensyn til lokal brugerinteraktion med disse indlæg. Dette omfatter indlæg, hvor en lokal bruger har markeret dem som bogmærker eller favoritter. Private omtaler mellem brugere fra forskellige instanser vil også være tabt og umulige at gendanne. Brugen af denne indstilling er beregnet til særlige formål instanser og bryder mange brugerforventninger ved implementering til almindelig brug. custom_css: Man kan anvende tilpassede stilarter på Mastodon-webversionen. favicon: WEBP, PNG, GIF eller JPG. Tilsidesætter standard Mastodon favikonet på mobilenheder med et tilpasset ikon. + landing_page: Vælger, hvilken side nye besøgende ser, når de først ankommer til din server. Hvis du vælger "Trender", skal trends være aktiveret i Opdagelse-indstillingerne. Hvis du vælger "Lokalt feed", skal "Adgang til live feeds med lokale indlæg" være indstillet til "Alle" i Opdagelse-indstillingerne. mascot: Tilsidesætter illustrationen i den avancerede webgrænseflade. media_cache_retention_period: Mediefiler fra indlæg oprettet af eksterne brugere er cachet på din server. Når sat til positiv værdi, slettes medier efter det angivne antal dage. Anmodes om mediedata efter de er slettet, gendownloades de, hvis kildeindholdet stadig er tilgængeligt. Grundet begrænsninger på, hvor ofte linkforhåndsvisningskort forespørger tredjeparts websteder, anbefales det at sætte denne værdi til mindst 14 dage, ellers opdateres linkforhåndsvisningskort ikke efter behov før det tidspunkt. min_age: Brugere anmodes om at bekræfte deres fødselsdato under tilmelding @@ -109,8 +110,7 @@ da: theme: Tema, som udloggede besøgende og nye brugere ser. thumbnail: Et ca. 2:1 billede vist sammen med serveroplysningerne. trendable_by_default: Spring manuel gennemgang af trendindhold over. Individuelle elementer kan stadig fjernes fra trends efter kendsgerningen. - trends: Tendenser viser, hvilke indlæg, etiketter og nyheder opnår momentum på serveren. - trends_as_landing_page: Vis tendensindhold til udloggede brugere og besøgende i stedet for en beskrivelse af denne server. Kræver, at tendenser er aktiveret. + trends: Tendenser viser, hvilke indlæg, hashtags og nyheder opnår momentum på serveren. form_challenge: current_password: Du bevæger dig ind på et sikkert område imports: @@ -287,6 +287,7 @@ da: content_cache_retention_period: Opbevaringsperiode for eksternt indhold custom_css: Tilpasset CSS favicon: Favikon + landing_page: Landingside for nye besøgende local_live_feed_access: Adgang til live feeds med lokale indlæg local_topic_feed_access: Adgang til hashtag- og link-feeds med lokale indlæg mascot: Tilpasset maskot (ældre funktion) @@ -311,7 +312,6 @@ da: thumbnail: Serverminiaturebillede trendable_by_default: Tillad ikke-reviderede trends trends: Aktivér trends - trends_as_landing_page: Brug tendenser som destinationssiden interactions: must_be_follower: Blokér notifikationer fra bruger, der ikke følger dig must_be_following: Blokér notifikationer fra brugere, du ikke følger diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 2133cc672..1085626e4 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -54,8 +54,10 @@ de: password: Verwende mindestens 8 Zeichen phrase: Wird unabhängig von der Groß- und Kleinschreibung im Text oder der Inhaltswarnung eines Beitrags abgeglichen scopes: Welche Schnittstellen der Applikation erlaubt sind. Wenn du einen Top-Level-Scope auswählst, dann musst du nicht jeden einzelnen darunter auswählen. + setting_advanced_layout: Dadurch wird Mastodon in mehrere Spalten aufgeteilt, womit du deine Timeline, Benachrichtigungen und eine dritte Spalte deiner Wahl nebeneinander siehst. Nicht bei einem kleinen Bildschirm empfohlen. setting_aggregate_reblogs: Beiträge, die erst kürzlich geteilt wurden, werden nicht noch einmal angezeigt (betrifft nur zukünftig geteilte Beiträge) setting_always_send_emails: Normalerweise werden Benachrichtigungen nicht per E-Mail versendet, wenn du gerade auf Mastodon aktiv bist + setting_boost_modal: Dadurch wird beim Teilen ein Bestätigungsdialog angezeigt, um die Sichtbarkeit anzupassen. setting_default_quote_policy_private: Beiträge, die nur für deine Follower bestimmt sind und auf Mastodon verfasst wurden, können nicht von anderen zitiert werden. setting_default_quote_policy_unlisted: Sollten dich andere zitieren, werden ihre zitierten Beiträge ebenfalls nicht in den Trends und öffentlichen Timelines angezeigt. setting_default_sensitive: Medien, die mit einer Inhaltswarnung versehen worden sind, werden – je nach Einstellung – erst nach einem zusätzlichen Klick angezeigt @@ -63,6 +65,7 @@ de: setting_display_media_hide_all: Medien immer ausblenden setting_display_media_show_all: Medien mit Inhaltswarnung immer anzeigen setting_emoji_style: 'Wie Emojis dargestellt werden: „Automatisch“ verwendet native Emojis, für veraltete Browser wird jedoch Twemoji verwendet.' + setting_quick_boosting_html: Dadurch wird der Beitrag beim Anklicken des %{boost_icon} Teilen-Symbols sofort geteilt, anstatt das Drop-down-Menü zu öffnen. Die Möglichkeit zum Zitieren wird dabei in %{options_icon} Mehr verschoben. setting_system_scrollbars_ui: Betrifft nur Desktop-Browser, die auf Chrome oder Safari basieren setting_use_blurhash: Der Farbverlauf basiert auf den Farben der ausgeblendeten Medien, verschleiert aber jegliche Details setting_use_pending_items: Neue Beiträge hinter einem Klick verstecken, anstatt automatisch zu scrollen @@ -90,6 +93,7 @@ de: content_cache_retention_period: Sämtliche Beiträge von anderen Servern (einschließlich geteilte Beiträge und Antworten) werden, unabhängig von der Interaktion der lokalen Nutzer*innen mit diesen Beiträgen, nach der festgelegten Anzahl von Tagen gelöscht. Das betrifft auch Beiträge, die von lokalen Nutzer*innen favorisiert oder als Lesezeichen gespeichert wurden. Private Erwähnungen zwischen Nutzer*innen von verschiedenen Servern werden ebenfalls verloren gehen und können nicht wiederhergestellt werden. Diese Option richtet sich ausschließlich an Server mit speziellen Zwecken und wird die allgemeine Nutzungserfahrung beeinträchtigen, wenn sie für den allgemeinen Gebrauch aktiviert ist. custom_css: Du kannst benutzerdefinierte Stile auf die Web-Version von Mastodon anwenden. favicon: WEBP, PNG, GIF oder JPG. Überschreibt das Standard-Mastodon-Favicon mit einem eigenen Symbol. + landing_page: Legt fest, welche Seite neue Besucher*innen sehen, wenn sie zum ersten Mal auf deinem Server ankommen. Für „Trends“ müssen die Trends in den Entdecken-Einstellungen aktiviert sein. Für „Lokaler Feed“ muss „Zugriff auf Live-Feeds, die lokale Beiträge beinhalten“ in den Entdecken-Einstellungen auf „Alle“ gesetzt werden. mascot: Überschreibt die Abbildung in der erweiterten Weboberfläche. media_cache_retention_period: Mediendateien aus Beiträgen von externen Nutzer*innen werden auf deinem Server zwischengespeichert. Wenn ein positiver Wert gesetzt ist, werden die Medien nach der festgelegten Anzahl von Tagen gelöscht. Sollten die Medien nach dem Löschvorgang wieder angefragt werden, werden sie erneut heruntergeladen, sofern der ursprüngliche Inhalt noch vorhanden ist. Es wird empfohlen, diesen Wert auf mindestens 14 Tage festzulegen, da die Häufigkeit der Abfrage von Linkvorschaukarten für Websites von Dritten begrenzt ist und die Linkvorschaukarten sonst nicht vor Ablauf dieser Zeit aktualisiert werden. min_age: Nutzer*innen werden bei der Registrierung aufgefordert, ihr Geburtsdatum zu bestätigen @@ -107,7 +111,6 @@ de: thumbnail: Ein Bild ungefähr im 2:1-Format, das neben den Server-Informationen angezeigt wird. trendable_by_default: Manuelles Überprüfen angesagter Inhalte überspringen. Einzelne Elemente können später noch aus den Trends entfernt werden. trends: Trends zeigen, welche Beiträge, Hashtags und Nachrichten auf deinem Server immer beliebter werden. - trends_as_landing_page: Dies zeigt nicht angemeldeten Personen Trendinhalte anstelle einer Beschreibung des Servers an. Erfordert, dass Trends aktiviert sind. form_challenge: current_password: Du betrittst einen sicheren Bereich imports: @@ -234,10 +237,12 @@ de: setting_aggregate_reblogs: Geteilte Beiträge in den Timelines gruppieren setting_always_send_emails: Benachrichtigungen immer senden setting_auto_play_gif: Animierte GIFs automatisch abspielen + setting_boost_modal: Sichtbarkeit für geteilte Beiträge anpassen setting_default_language: Beitragssprache setting_default_privacy: Beitragssichtbarkeit setting_default_quote_policy: Wer zitieren darf setting_default_sensitive: Medien immer mit einer Inhaltswarnung versehen + setting_delete_modal: Vor dem Löschen bestätigen setting_disable_hover_cards: Profilvorschau deaktivieren, wenn die Maus über das Profil bewegt wird setting_disable_swiping: Wischgesten deaktivieren setting_display_media: Darstellung von Medien @@ -247,7 +252,8 @@ de: setting_emoji_style: Emoji-Stil setting_expand_spoilers: Beiträge mit Inhaltswarnung immer ausklappen setting_hide_network: Follower und „Folge ich“ nicht anzeigen - setting_quick_boosting: Schnelles Boosten aktivieren + setting_missing_alt_text_modal: Erinnerung für Bildbeschreibung anzeigen + setting_quick_boosting: Schnelles Teilen aktivieren setting_reduce_motion: Bewegung in Animationen verringern setting_system_font_ui: Standardschriftart des Browsers verwenden setting_system_scrollbars_ui: Bildlaufleiste des Betriebssystems verwenden @@ -281,6 +287,7 @@ de: content_cache_retention_period: Aufbewahrungsfrist für externe Inhalte custom_css: Eigenes CSS favicon: Favicon + landing_page: Landingpage für neue Besucher*innen local_live_feed_access: Zugriff auf Live-Feeds, die lokale Beiträge beinhalten local_topic_feed_access: Zugriff auf Hashtags und Links, die lokale Beiträge beinhalten mascot: Benutzerdefiniertes Maskottchen (Legacy) @@ -305,7 +312,6 @@ de: thumbnail: Vorschaubild des Servers trendable_by_default: Trends ohne vorherige Überprüfung erlauben trends: Trends aktivieren - trends_as_landing_page: Trends als Landingpage verwenden interactions: must_be_follower: Benachrichtigungen von Profilen, die mir nicht folgen, ausblenden must_be_following: Benachrichtigungen von Profilen, denen ich nicht folge, ausblenden diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 0de3351ed..03dd292e0 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -93,6 +93,7 @@ el: content_cache_retention_period: Όλες οι αναρτήσεις από άλλους διακομιστές (συμπεριλαμβανομένων των ενισχύσεων και απαντήσεων) θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών, χωρίς να λαμβάνεται υπόψη οποιαδήποτε αλληλεπίδραση τοπικού χρήστη με αυτές τις αναρτήσεις. Αυτό περιλαμβάνει αναρτήσεις όπου ένας τοπικός χρήστης την έχει χαρακτηρίσει ως σελιδοδείκτη ή αγαπημένη. Θα χαθούν επίσης ιδιωτικές αναφορές μεταξύ χρηστών από διαφορετικές οντότητες και θα είναι αδύνατο να αποκατασταθούν. Η χρήση αυτής της ρύθμισης προορίζεται για οντότητες ειδικού σκοπού και χαλάει πολλές προσδοκίες του χρήστη όταν εφαρμόζεται για χρήση γενική σκοπού. custom_css: Μπορείς να εφαρμόσεις προσαρμοσμένα στυλ στην έκδοση ιστοσελίδας του Mastodon. favicon: WEBP, PNG, GIF ή JPG. Παρακάμπτει το προεπιλεγμένο favicon του Mastodon με ένα προσαρμοσμένο εικονίδιο. + landing_page: Επιλέγει ποια σελίδα βλέπουν οι νέοι επισκέπτες όταν φτάνουν για πρώτη φορά στο διακομιστή σας. Αν επιλέξετε "Τάσεις", τότε οι τάσεις πρέπει να είναι ενεργοποιημένες στις Ρυθμίσεις Ανακάλυψης. Αν επιλέξετε "Τοπική ροή", τότε το "Πρόσβαση σε ζωντανές ροές με τοπικές αναρτήσεις" πρέπει να οριστεί σε "Όλοι" στις Ρυθμίσεις Ανακάλυψης. mascot: Παρακάμπτει την εικονογραφία στην προηγμένη διεπαφή ιστού. media_cache_retention_period: Τα αρχεία πολυμέσων από αναρτήσεις που γίνονται από απομακρυσμένους χρήστες αποθηκεύονται προσωρινά στο διακομιστή σου. Όταν οριστεί μια θετική τιμή, τα μέσα θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών. Αν τα δεδομένα πολυμέσων ζητηθούν μετά τη διαγραφή τους, θα γίνει ε, αν το πηγαίο περιεχόμενο είναι ακόμα διαθέσιμο. Λόγω περιορισμών σχετικά με το πόσο συχνά οι κάρτες προεπισκόπησης συνδέσμων συνδέονται σε ιστοσελίδες τρίτων, συνιστάται να ορίσεις αυτή την τιμή σε τουλάχιστον 14 ημέρες ή οι κάρτες προεπισκόπησης συνδέσμων δεν θα ενημερώνονται κατ' απάιτηση πριν από εκείνη την ώρα. min_age: Οι χρήστες θα κληθούν να επιβεβαιώσουν την ημερομηνία γέννησής τους κατά την εγγραφή @@ -110,7 +111,6 @@ el: thumbnail: Μια εικόνα περίπου 2:1 που εμφανίζεται παράλληλα με τις πληροφορίες του διακομιστή σου. trendable_by_default: Παράλειψη χειροκίνητης αξιολόγησης του περιεχομένου σε τάση. Μεμονωμένα στοιχεία μπορούν ακόμα να αφαιρεθούν από τις τάσεις μετέπειτα. trends: Τάσεις δείχνουν ποιες δημοσιεύσεις, ετικέτες και ειδήσεις προκαλούν έλξη στο διακομιστή σας. - trends_as_landing_page: Εμφάνιση περιεχομένου σε τάση σε αποσυνδεδεμένους χρήστες και επισκέπτες αντί για μια περιγραφή αυτού του διακομιστή. Απαιτεί οι τάσεις να έχουν ενεργοποιηθεί. form_challenge: current_password: Μπαίνεις σε ασφαλή περιοχή imports: @@ -287,6 +287,7 @@ el: content_cache_retention_period: Περίοδος διατήρησης απομακρυσμένου περιεχομένου custom_css: Προσαρμοσμένο CSS favicon: Favicon + landing_page: Σελίδα προσγείωσης για νέους επισκέπτες local_live_feed_access: Πρόσβαση σε ζωντανές ροές με τοπικές αναρτήσεις local_topic_feed_access: Πρόσβαση σε ροές ετικετών και συνδέσμων με τοπικές αναρτήσεις mascot: Προσαρμοσμένη μασκότ (απαρχαιωμένο) @@ -311,7 +312,6 @@ el: thumbnail: Μικρογραφία διακομιστή trendable_by_default: Επίτρεψε τις τάσεις χωρίς προηγούμενη αξιολόγηση trends: Ενεργοποίηση τάσεων - trends_as_landing_page: Χρήση των τάσεων ως σελίδα προορισμού interactions: must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν σε ακολουθούν must_be_following: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index c0944507a..5ef7647c5 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -105,7 +105,6 @@ en-GB: thumbnail: A roughly 2:1 image displayed alongside your server information. trendable_by_default: Skip manual review of trending content. Individual items can still be removed from trends after the fact. trends: Trends show which posts, hashtags and news stories are gaining traction on your server. - trends_as_landing_page: Show trending content to logged-out users and visitors instead of a description of this server. Requires trends to be enabled. form_challenge: current_password: You are entering a secure area imports: @@ -290,7 +289,6 @@ en-GB: thumbnail: Server thumbnail trendable_by_default: Allow trends without prior review trends: Enable trends - trends_as_landing_page: Use trends as the landing page interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 7855fbb13..36ae9a4ca 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -93,6 +93,7 @@ en: content_cache_retention_period: All posts from other servers (including boosts and replies) will be deleted after the specified number of days, without regard to any local user interaction with those posts. This includes posts where a local user has marked it as bookmarks or favorites. Private mentions between users from different instances will also be lost and impossible to restore. Use of this setting is intended for special purpose instances and breaks many user expectations when implemented for general purpose use. custom_css: You can apply custom styles on the web version of Mastodon. favicon: WEBP, PNG, GIF or JPG. Overrides the default Mastodon favicon with a custom icon. + landing_page: Selects what page new visitors see when they first arrive on your server. If you select "Trends", then trends needs to be enabled in the Discovery Settings. If you select "Local feed", then "Access to live feeds featuring local posts" needs to be set to "Everyone" in the Discovery Settings. mascot: Overrides the illustration in the advanced web interface. media_cache_retention_period: Media files from posts made by remote users are cached on your server. When set to a positive value, media will be deleted after the specified number of days. If the media data is requested after it is deleted, it will be re-downloaded, if the source content is still available. Due to restrictions on how often link preview cards poll third-party sites, it is recommended to set this value to at least 14 days, or link preview cards will not be updated on demand before that time. min_age: Users will be asked to confirm their date of birth during sign-up @@ -110,7 +111,6 @@ en: thumbnail: A roughly 2:1 image displayed alongside your server information. trendable_by_default: Skip manual review of trending content. Individual items can still be removed from trends after the fact. trends: Trends show which posts, hashtags and news stories are gaining traction on your server. - trends_as_landing_page: Show trending content to logged-out users and visitors instead of a description of this server. Requires trends to be enabled. form_challenge: current_password: You are entering a secure area imports: @@ -287,6 +287,7 @@ en: content_cache_retention_period: Remote content retention period custom_css: Custom CSS favicon: Favicon + landing_page: Landing page for new visitors local_live_feed_access: Access to live feeds featuring local posts local_topic_feed_access: Access to hashtag and link feeds featuring local posts mascot: Custom mascot (legacy) @@ -311,7 +312,6 @@ en: thumbnail: Server thumbnail trendable_by_default: Allow trends without prior review trends: Enable trends - trends_as_landing_page: Use trends as the landing page interactions: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 541113c28..eed4671bb 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -107,7 +107,6 @@ eo: thumbnail: Ĉirkaua 2:1 bildo montritas kun via servilinformo. trendable_by_default: Ignori permanan kontrolon de tendenca enhavo. trends: Tendencoj montras kiu mesaĝoj, kradvortoj kaj novaĵoj populariĝas en via servilo. - trends_as_landing_page: Montru tendencan enhavon al elsalutitaj uzantoj kaj vizitantoj anstataŭ priskribo de ĉi tiu servilo. Necesas ke tendencoj estu ebligitaj. form_challenge: current_password: Vi eniras sekuran areon imports: @@ -296,7 +295,6 @@ eo: thumbnail: Bildeto de servilo trendable_by_default: Permesi tendencojn sen deviga kontrolo trends: Ŝalti furorojn - trends_as_landing_page: Uzu tendencojn kiel la landpaĝon interactions: must_be_follower: Bloki sciigojn de nesekvantoj must_be_following: Bloki sciigojn de homoj, kiujn vi ne sekvas diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 760832e2a..2be68cd4b 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -93,6 +93,7 @@ es-AR: content_cache_retention_period: Todos los mensajes de otros servidores (incluyendo adhesiones y respuestas) se eliminarán después del número de días especificado, sin tener en cuenta la interacción del usuario local con esos mensajes. Esto incluye mensajes que un usuario local haya agregado a marcadores o los haya marcado como favoritos. Las menciones privadas entre usuarios de diferentes servidores también se perderán y también serán imposibles de restaurar. El uso de esta configuración está destinado a servidores de propósito especial y rompe muchas expectativas de los usuarios cuando se implementa para uso general. custom_css: Podés aplicar estilos personalizados a la versión web de Mastodon. favicon: WEBP, PNG, GIF o JPG. Reemplaza el favicón predeterminado de Mastodon con uno personalizado. + landing_page: Selecciona qué página se carga para los nuevos visitantes cuando llegan por primera vez a tu servidor. Si seleccionás «Tendencias», entonces las tendencias tienen que estar habilitadas en la configuración de «Descubrimiento». Si seleccionás «Línea temporal local», entonces «Acceso a líneas temporales en vivo, destacando mensajes locales» tiene que estar establecida a «Todos» en la configuración de «Descubrimiento». mascot: Reemplaza la ilustración en la interface web avanzada. media_cache_retention_period: Los archivos de medios de mensajes publicados por usuarios remotos se almacenan en la memoria caché en tu servidor. Cuando se establece un valor positivo, los medios se eliminarán después del número especificado de días. Si los datos multimedia se solicitan después de eliminarse, se volverán a descargar, si es que el contenido fuente todavía está disponible. Debido a restricciones en la frecuencia con la que las tarjetas de previsualización de enlace consultan a sitios web de terceros, se recomienda establecer este valor a, al menos, 14 días, o las tarjetas de previsualización de enlaces no se actualizarán a pedido antes de ese momento. min_age: Se pedirá a los usuarios que confirmen su fecha de nacimiento durante el registro @@ -110,7 +111,6 @@ es-AR: thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. trendable_by_default: Omití la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué mensajes, etiquetas y noticias están ganando tracción en tu servidor. - trends_as_landing_page: Mostrar contenido en tendencia para usuarios que no iniciaron sesión y visitantes, en lugar de una descripción de este servidor. Requiere que las tendencias estén habilitadas. form_challenge: current_password: Estás ingresando en un área segura imports: @@ -287,6 +287,7 @@ es-AR: content_cache_retention_period: Período de retención de contenido remoto custom_css: CSS personalizado favicon: Favicón + landing_page: Página de carga para nuevos visitantes local_live_feed_access: Acceso a líneas temporales en vivo, destacando mensajes locales local_topic_feed_access: Acceso a líneas temporales de etiquetas y enlaces, destacando mensajes locales mascot: Mascota personalizada (legado) @@ -311,7 +312,6 @@ es-AR: thumbnail: Miniatura del servidor trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias - trends_as_landing_page: Usar las tendencias como la página de destino interactions: must_be_follower: Bloquear notificaciones de cuentas que no te siguen must_be_following: Bloquear notificaciones de cuentas que no seguís diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 87ab1274a..9494a9306 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -93,6 +93,7 @@ es-MX: content_cache_retention_period: Todas las publicaciones de otros servidores (incluyendo impuestos y respuestas) serán borrados después del número de días especificado, sin tener en cuenta cualquier interacción del usuario local con esas publicaciones. Esto incluye los mensajes que un usuario local haya marcado como favoritos. Las menciones privadas entre usuarios de diferentes instancias también se perderán y será imposible restaurarlas. El uso de esta configuración está pensado para instancias de propósito especial y rompe muchas expectativas de los usuarios cuando se implementa para uso general. custom_css: Puedes aplicar estilos personalizados a la versión web de Mastodon. favicon: WEBP, PNG, GIF o JPG. Reemplaza el icono predeterminado de Mastodon con un icono personalizado. + landing_page: Selecciona qué página ven los nuevos visitantes cuando llegan por primera vez a tu servidor. Si seleccionas "Tendencias", entonces las tendencias deben estar habilitadas en la Configuración de Descubrimiento. Si selecciona "Cronología local", entonces "Acceso a las cronologías que destacan publicaciones locales" debe configurarse a "Todos" en la Configuración de Descubrimiento. mascot: Reemplaza la ilustración en la interfaz web avanzada. media_cache_retention_period: Los archivos multimedia de las publicaciones realizadas por usuarios remotos se almacenan en caché en su servidor. Si se establece en un valor positivo, los archivos multimedia se eliminarán tras el número de días especificado. Si los datos multimedia se solicitan después de haber sido eliminados, se volverán a descargar, si el contenido de origen sigue estando disponible. Debido a las restricciones sobre la frecuencia con la que las tarjetas de previsualización de enlaces sondean sitios de terceros, se recomienda establecer este valor en al menos 14 días, o las tarjetas de previsualización de enlaces no se actualizarán bajo demanda antes de ese tiempo. min_age: Se pedirá a los usuarios que confirmen su fecha de nacimiento al registrarse @@ -110,7 +111,6 @@ es-MX: thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. trendable_by_default: Omitir la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué mensajes, etiquetas y noticias están ganando tracción en tu servidor. - trends_as_landing_page: Mostrar contenido en tendencia para usuarios y visitantes desconectados en lugar de una descripción de este servidor. Requiere tendencias para ser habilitado. form_challenge: current_password: Estás entrando en un área segura imports: @@ -287,6 +287,7 @@ es-MX: content_cache_retention_period: Periodo de conservación de contenidos remotos custom_css: CSS personalizado favicon: Favicon + landing_page: Página de inicio para nuevos visitantes local_live_feed_access: Acceso a las cronologías que destacan publicaciones locales local_topic_feed_access: Acceso a las etiquetas y enlaces en tendencia que destacan publicaciones locales mascot: Mascota personalizada (legado) @@ -311,7 +312,6 @@ es-MX: thumbnail: Miniatura del servidor trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias - trends_as_landing_page: Usar tendencias como página de destino interactions: must_be_follower: Bloquear notificaciones de personas que no te siguen must_be_following: Bloquear notificaciones de personas que no sigues diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index aa4208e55..5c431d046 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -93,6 +93,7 @@ es: content_cache_retention_period: Todas las publicaciones de otros servidores (incluso impulsos y respuestas) se eliminarán después del número de días especificado, sin tener en cuenta la interacción del usuario local con esos mensajes. Esto incluye mensajes donde un usuario local los ha marcado como marcadores o favoritos. Las menciones privadas entre usuarios de diferentes instancias también se perderán sin posibilidad de recuperación. El uso de esta configuración está destinado a instancias de propósito especial, y rompe muchas expectativas de los usuarios cuando se implementa para un uso de propósito general. custom_css: Puedes aplicar estilos personalizados a la versión web de Mastodon. favicon: WEBP, PNG, GIF o JPG. Reemplaza el favicon predeterminado de Mastodon con un icono personalizado. + landing_page: Selecciona qué página ven los nuevos visitantes cuando llegan por primera vez a tu servidor. Si seleccionas "Tendencias", entonces las tendencias deben estar habilitadas en la Configuración de Descubrimiento. Si selecciona "Cronología local", entonces "Acceso a las cronologías que destacan publicaciones locales" debe configurarse a "Todos" en la Configuración de Descubrimiento. mascot: Reemplaza la ilustración en la interfaz web avanzada. media_cache_retention_period: Los archivos multimedia de las publicaciones creadas por usuarios remotos se almacenan en caché en tu servidor. Cuando se establece un valor positivo, estos archivos se eliminarán después del número especificado de días. Si los datos multimedia se solicitan después de eliminarse, se volverán a descargar, si el contenido fuente todavía está disponible. Debido a restricciones en la frecuencia con la que las tarjetas de previsualización de enlaces realizan peticiones a sitios de terceros, se recomienda establecer este valor a al menos 14 días, o las tarjetas de previsualización de enlaces no se actualizarán bajo demanda antes de ese momento. min_age: Se pedirá a los usuarios que confirmen su fecha de nacimiento durante el registro @@ -110,7 +111,6 @@ es: thumbnail: Una imagen de aproximadamente 2:1 se muestra junto a la información de tu servidor. trendable_by_default: Omitir la revisión manual del contenido en tendencia. Los elementos individuales aún podrán eliminarse de las tendencias. trends: Las tendencias muestran qué publicaciones, etiquetas y noticias están ganando tracción en tu servidor. - trends_as_landing_page: Mostrar contenido en tendencia para usuarios y visitantes en lugar de una descripción de este servidor. Requiere que las tendencias estén habilitadas. form_challenge: current_password: Estás entrando en un área segura imports: @@ -287,6 +287,7 @@ es: content_cache_retention_period: Período de retención de contenido remoto custom_css: CSS personalizado favicon: Favicon + landing_page: Página de inicio para nuevos visitantes local_live_feed_access: Acceso a las cronologías que destacan publicaciones locales local_topic_feed_access: Acceso a las etiquetas y enlaces en tendencia que destacan publicaciones locales mascot: Mascota personalizada (legado) @@ -311,7 +312,6 @@ es: thumbnail: Miniatura del servidor trendable_by_default: Permitir tendencias sin revisión previa trends: Habilitar tendencias - trends_as_landing_page: Usar tendencias como la página de inicio interactions: must_be_follower: Bloquear notificaciones de personas que no te siguen must_be_following: Bloquear notificaciones de personas que no sigues diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index dda3aa763..5d1425f20 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -54,8 +54,10 @@ et: password: Vajalik on vähemalt 8 märki phrase: Kattub olenemata postituse teksti suurtähtedest või sisuhoiatusest scopes: Milliseid API-sid see rakendus tohib kasutada. Kui valid kõrgeima taseme, ei pea üksikuid eraldi valima. + setting_advanced_layout: Näita Mastodoni mitme veeruga paigutuses, mispuhul näed korraga nii ajajoont, teavitusi, kui sinu valitud kolmandat veergu. Ei sobi kasutamiseks väikeste ekraanide puhul. setting_aggregate_reblogs: Ära kuva uusi postituste jagamisi, mis on hiljuti jagatud (kehtib vaid uutele jagamistele) setting_always_send_emails: Mastodoni aktiivsel kasutamisel sulle tavaliselt meilile teavitusi ei saadeta + setting_boost_modal: Selle eelistuse kasutamisel hooandmise avatakse esmalt kinnitusvaade, kus saad muuta hooandmise nähtavust. setting_default_quote_policy_private: Ainult jälgijatele mõeldud Mastodoni postitusi ei saa teiste poolt tsiteerida. setting_default_quote_policy_unlisted: Kui teised kasutajad sind tsiteerivad, siis nende postitused peidetakse ajajoonelt, mis näitavad populaarsust koguvaid postitusi. setting_default_sensitive: Tundlik meedia on vaikimisi peidetud ning seda saab avada sellele klikkides @@ -63,6 +65,7 @@ et: setting_display_media_hide_all: Alati peida kõik meedia setting_display_media_show_all: Alati näita tundlikuks märgistatud meedia setting_emoji_style: See määrab emojide kuvamise viisi. Automaatse valiku puhul üritatakse kasutada platvormi või klientrakenduse oma emojisid, kuid varuvariandina jääb toimima Twemoji (näiteks vanade veebibrauserite puhul). + setting_quick_boosting_html: Selle eelistuse kasutamisel, Hooandmise ikooni %{boost_icon} teeb toimingu kohe ilma avamata Hooandmise/Tsiteerimise menüüvalikut. Sel puhul tsiteerimise link leidub %{options_icon} (Valikud) menüüs. setting_system_scrollbars_ui: Kehtib vaid Safaril ja Chrome'il põhinevatel tavaarvuti veebibrauserite puhul setting_use_blurhash: Värvid põhinevad peidetud visuaalidel, kuid hägustavad igasuguseid detaile setting_use_pending_items: Voo automaatse kerimise asemel peida ajajoone uuendused kliki taha @@ -90,6 +93,7 @@ et: content_cache_retention_period: Kõik teiste serverite postitused (sealhulgas jagamised ja vastused) kustutatakse pärast määratud arvu päevade möödumist, sõltumata, kuidas kohalik kasutaja on nende postitustega interakteerunud. Hõlmatud on ka postitused, mille kohalik kasutaja on märkinud järjehoidjaks või lemmikuks. Ka eri instantside kasutajate vahelised privaatsed mainimised kaovad ja neid on võimatu taastada. See seadistus on mõeldud eriotstarbeliste instantside jaoks ja rikub paljude kasutajate ootusi, kui seda rakendatakse üldotstarbelise kasutuse puhul. custom_css: Mastodoni veebiliideses on võimalik kasutada kohandatud stiile. favicon: WEBP, PNG, GIF või JPG. Asendab Mastodoni vaike- favicon ikooni kohandatud ikooniga. + landing_page: Sellega valid lehe, mida uued külastajad sinu serverisse tulles näevad. Kui sa valid „Trendid“, siis peavad nad olema lubatud. Kui sa valid „Kohalike postituste voog“, siis seadistuse „Ligipääs kohalike postituste voole“ väärtus peab olema „Kõik“. mascot: Asendab kohandatud veebiliidese illustratsiooni. media_cache_retention_period: Kaugkasutajate tehtud postituste meediafailid salvestatakse sinu koduserveri vahemällu. Kui see seadistus on seatud positiivsele väärtusele, kustutatakse meediumifailid määratud päevade möödumisel. Kui meediaandmeid küsitakse pärast nende kustutamist, laaditakse need uuesti alla, kui lähtesisu on veel saadaval. Kuna on olemas piirangud, kui tihti tohivad lingikaardid kolmandatelt saitidelt andmeid pärida, on soovitatav määrata väärtuseks vähemalt 14. Vastasel juhul ei uuendata linkide eelvaatekaarte nõudmise korral enne seda aega. min_age: Kasutajad peavad liitumisel kinnitama oma sünnikuupäeva @@ -107,7 +111,6 @@ et: thumbnail: Umbes 2:1 mõõdus pilt serveri informatsiooni kõrval. trendable_by_default: Populaarse sisu ülevaatuse vahele jätmine. Pärast seda on siiski võimalik üksikuid üksusi trendidest eemaldada. trends: Trendid näitavad, millised postitused, sildid ja uudislood koguvad sinu serveris tähelepanu. - trends_as_landing_page: Näitab välja logitud kasutajatele ja külalistele serveri kirjelduse asemel populaarset sisu. Populaarne sisu (trendid) peab selleks olema sisse lülitatud. form_challenge: current_password: Turvalisse alasse sisenemine imports: @@ -250,6 +253,7 @@ et: setting_expand_spoilers: Alati näita tundlikuks märgitud postituste sisu setting_hide_network: Peida oma võrk setting_missing_alt_text_modal: Enne postitamist hoiata mind meediumi puuduva selgitusteksti puhul + setting_quick_boosting: Luba kiire hooandmine setting_reduce_motion: Vähenda animatsioonides liikumist setting_system_font_ui: Kasuta süsteemi vaikefonti setting_system_scrollbars_ui: Kasuta süsteemi vaikimisi kerimisriba @@ -283,6 +287,7 @@ et: content_cache_retention_period: Kaugsisu säilitamise aeg custom_css: Kohandatud CSS favicon: Favicon + landing_page: Avaleht uute külastajate jaoks local_live_feed_access: Ligipääs kohalike postituste voole local_topic_feed_access: Ligipääs kohalike postitustele viitavale teemaviidete ja linkide voole mascot: Kohandatud maskott (kunagine) @@ -307,7 +312,6 @@ et: thumbnail: Serveri pisipilt trendable_by_default: Luba trendid eelneva ülevaatuseta trends: Luba trendid - trends_as_landing_page: Kasuta maabumislehena lehte Populaarne interactions: must_be_follower: Keela teavitused mittejälgijatelt must_be_following: Keela teavitused kasutajatelt, keda sa ei jälgi diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 12eddb55f..fc7879896 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -105,7 +105,6 @@ eu: thumbnail: Zerbitzariaren informazioaren ondoan erakusten den 2:1 inguruko irudia. trendable_by_default: Saltatu joeretako edukiaren eskuzko berrikuspena. Ondoren elementuak banan-bana kendu daitezke joeretatik. trends: Joeretan zure zerbitzarian bogan dauden bidalketa, traola eta albisteak erakusten dira. - trends_as_landing_page: Erakutsi pil-pilean dagoen edukia saioa hasita ez duten erabiltzaileei eta bisitariei, zerbitzari honen deskribapena erakutsi ordez. Joerak aktibatuak edukitzea beharrezkoa da. form_challenge: current_password: Zonalde seguruan sartzen ari zara imports: @@ -278,7 +277,6 @@ eu: thumbnail: Zerbitzariaren koadro txikia trendable_by_default: Onartu joerak aurrez berrikusi gabe trends: Gaitu joerak - trends_as_landing_page: Erabili joerak hasierako orri gisa interactions: must_be_follower: Blokeatu jarraitzaile ez direnen jakinarazpenak must_be_following: Blokeatu zuk jarraitzen ez dituzu horien jakinarazpenak diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 41f59bed4..1e146b6da 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -56,6 +56,8 @@ fa: scopes: واسط‌های برنامه‌نویسی که این برنامه به آن دسترسی دارد. اگر بالاترین سطح دسترسی را انتخاب کنید، دیگر نیازی به انتخاب سطح‌های پایینی ندارید. setting_aggregate_reblogs: برای تقویت‌هایی که به تازگی برایتان نمایش داده شده‌اند، تقویت‌های بیشتر را نمایش نده (فقط روی تقویت‌های اخیر تأثیر می‌گذارد) setting_always_send_emails: در حالت عادی آگاهی‌های رایانامه‌ای هنگامی که فعّالانه از ماستودون استفاده می‌کنید فرستاده نمی‌شوند + setting_default_quote_policy_private: فرسته‌های فقط پی‌گیران روی ماستودون نمی‌توانند به دست دیگران نقل شوند. + setting_default_quote_policy_unlisted: هنگامی که کسی نقلتان می‌کند هم فرسته‌اش از خط زمانی‌های داغ پنهان خواهد بود. setting_default_sensitive: تصاویر حساس به طور پیش‌فرض پنهان هستند و می‌توانند با یک کلیک آشکار شوند setting_display_media_default: تصویرهایی را که به عنوان حساس علامت زده شده‌اند پنهان کن setting_display_media_hide_all: همیشه همهٔ عکس‌ها و ویدیوها را پنهان کن @@ -105,7 +107,6 @@ fa: thumbnail: یک تصویر تقریباً 2:1 در کنار اطلاعات سرور شما نمایش داده می شود. trendable_by_default: از بررسی دستی محتوای پرطرفدار صرف نظر کنید. آیتم های فردی هنوز هم می توانند پس از واقعیت از روند حذف شوند. trends: روندها نشان می‌دهند که کدام پست‌ها، هشتگ‌ها و داستان‌های خبری در سرور شما مورد توجه قرار گرفته‌اند. - trends_as_landing_page: به جای توضیح این سرور، محتوای پرطرفدار را به کاربران و بازدیدکنندگان از سیستم خارج شده نشان دهید. نیاز به فعال شدن روندها دارد. form_challenge: current_password: شما در حال ورود به یک منطقهٔ‌ حفاظت‌شده هستید imports: @@ -232,9 +233,12 @@ fa: setting_aggregate_reblogs: تقویت‌ها را در خط‌زمانی گروه‌بندی کن setting_always_send_emails: فرستادن همیشگی آگاهی‌های رایانامه‌ای setting_auto_play_gif: پخش خودکار تصویرهای متحرک + setting_boost_modal: واپایش نمایانی توثیت setting_default_language: زبان نوشته‌های شما + setting_default_privacy: نمایانی فرسته setting_default_quote_policy: افراد مجاز به نقل setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن + setting_delete_modal: هشدار پیش از حذف کردن فرسته setting_disable_hover_cards: از کار انداختن پیش‌نمایش نمایه هنگام رفتن رویش setting_disable_swiping: از کار انداختن حرکت‌های کشیدنی setting_display_media: نمایش عکس و ویدیو @@ -244,6 +248,8 @@ fa: setting_emoji_style: سبک شکلک setting_expand_spoilers: همیشه فرسته‌هایی را که هشدار محتوا دارند کامل نشان بده setting_hide_network: نهفتن شبکهٔ ارتباطی + setting_missing_alt_text_modal: هشدار پیش از فرستادن رسانه بدون متن جایگزین + setting_quick_boosting: به کار انداختن تقویت سریع setting_reduce_motion: کاستن از حرکت در پویانمایی‌ها setting_system_font_ui: به‌کاربردن قلم پیش‌فرض سیستم setting_system_scrollbars_ui: از نوار اسکرول پیش فرض سیستم استفاده کنید @@ -277,12 +283,17 @@ fa: content_cache_retention_period: دوره نگهداری محتوا از راه دور custom_css: سبک CSS سفارشی favicon: نمادک + landing_page: صفحهٔ فرود برای بینندگان جدید + local_live_feed_access: دسترسی به خوراک‌های زندهٔ نمایانگر فرسته‌های محلی + local_topic_feed_access: دسترسی به خوراک‌های پیوند و برچسب‌های نمایانگر فرسته‌های محلی mascot: نشان سفارشی (قدیمی) media_cache_retention_period: دورهٔ نگه‌داری انبارهٔ رسانه min_age: کمینهٔ سن لازم peers_api_enabled: انتشار سیاههٔ کارسازهای کشف شده در API profile_directory: به کار انداختن شاخهٔ نمایه registrations_mode: چه کسانی می‌توانند ثبت‌نام کنند + remote_live_feed_access: دسترسی به خوراک‌های زندهٔ نمایانگر فرسته‌های دوردست + remote_topic_feed_access: دسترسی به خوراک‌های پیوند و برچسب‌های نمایانگر فرسته‌های دوردست require_invite_text: نیازمند دلیلی برای پیوستن show_domain_blocks: نمایش مسدودیت‌های دامنه show_domain_blocks_rationale: نمایش چرایی مسدودیت دامنه‌ها @@ -297,7 +308,6 @@ fa: thumbnail: بندانگشتی کارساز trendable_by_default: اجازهٔ پرطرفدار شدن بدون بازبینی پیشین trends: به کار انداختن پرطرفدارها - trends_as_landing_page: استفاده از داغ‌ها به عنوان صفحهٔ فرود interactions: must_be_follower: انسداد آگاهی‌ها از ناپی‌گیران must_be_following: انسداد آگاهی‌ها از افرادی که پی نمی‌گیرید diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 0189b5849..048c27e98 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -93,6 +93,7 @@ fi: content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, lukuun ottamatta paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Tämä sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityismaininnat eri palvelinten käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämä asetus on tarkoitettu käytettäväksi erityistapauksissa ja rikkoo monia käyttäjien odotuksia, kun sitä sovelletaan yleiskäyttöön. custom_css: Voit käyttää mukautettuja tyylejä Mastodonin selainversiossa. favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin sivustokuvakkeen haluamallasi kuvakkeella. + landing_page: Valitsee, minkä sivun uudet kävijät näkevät saapuessaan palvelimellesi. Jos valitset ”Trendit”, trendien tulee olla käytössä Löydettävyys-asetuksissa. Jos valitset ”Paikallinen syöte”, kohta ”Pääsy paikallisia julkaisuja esitteleviin livesyötteisiin” tulee asettaa arvoon ”Kaikki” Löydettävyys-asetuksissa. mascot: Korvaa kuvituksen edistyneessä selainkäyttöliittymässä. media_cache_retention_period: Etäkäyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun kentän arvo on positiivinen, media poistuu, kun määritetty määrä päiviä on kulunut. Jos mediaa pyydetään sen poistamisen jälkeen, se ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien esikatselun kyselyitä kolmansien osapuolien sivustoille on rajoitettu, on suositeltavaa asettaa tämä arvo vähintään 14 päivään, tai linkkien kortteja ei päivitetä pyynnöstä ennen tätä ajankohtaa. min_age: Käyttäjiä pyydetään rekisteröitymisen aikana vahvistamaan syntymäpäivänsä @@ -110,7 +111,6 @@ fi: thumbnail: Noin 2:1 kuva näkyy palvelimen tietojen ohessa. trendable_by_default: Ohita suositun sisällön manuaalinen tarkastus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen. trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset keräävät huomiota palvelimellasi. - trends_as_landing_page: Näytä vierailijoille ja uloskirjautuneille käyttäjille suosittua sisältöä palvelimen kuvauksen sijaan. Edellyttää, että trendit on otettu käyttöön. form_challenge: current_password: Olet menossa suojatulle alueelle imports: @@ -145,6 +145,7 @@ fi: admin_email: Oikeudellisiin ilmoituksiin kuuluvat vastailmoitukset, oikeuden määräykset, poistopyynnöt ja lainvalvontaviranomaisten pyynnöt. arbitration_address: Voi olla sama kuin edellä mainittu Fyysinen osoite tai ”N/A”, jos käytät sähköpostia. arbitration_website: Voi olla verkkolomake tai ”N/A”, jos käytät sähköpostia. + choice_of_law: Kaupunki, alue, territorio tai valtio, jonka sisäinen aineellinen oikeus säätelee kaikkia vaatimuksia. dmca_address: Yhdysvaltalaisten operaattoreiden on käytettävä DMCA Designated Agent Directory -luetteloon rekisteröityä osoitetta. Postilokeroluettelo on saatavissa suoralla pyynnöllä, joten käytä DMCA Designated Agent Post Office Box Waiver Request -lomaketta lähettääksesi sähköpostia tekijänoikeusvirastolle ja kuvaile, että olet kotona toimiva sisältömoderaattori, joka pelkää kostoa tai rangaistusta toimistaan ja tarvitsee postilokeroa pitääkseen kotiosoitteensa poissa julkisuudesta. dmca_email: Voi olla sama kuin edellä mainittu ”Sähköpostiosoite oikeudellisille ilmoituksille”. domain: Tarjoamasi verkkopalvelun yksilöllinen tunniste. @@ -173,7 +174,7 @@ fi: labels: account: attribution_domains: Verkkosivustot, jotka voivat antaa sinulle tunnustusta - discoverable: Pidä profiiliasi ja julkaisujasi esillä löytämisalgoritmeissa + discoverable: Pidä profiiliasi ja julkaisujasi esillä löydettävyysalgoritmeissa fields: name: Nimike value: Sisältö @@ -286,6 +287,7 @@ fi: content_cache_retention_period: Etäsisällön säilytysaika custom_css: Mukautettu CSS favicon: Sivustokuvake + landing_page: Uusien kävijöiden aloitussivu local_live_feed_access: Pääsy paikallisia julkaisuja esitteleviin livesyötteisiin local_topic_feed_access: Pääsy paikallisia julkaisuja esitteleviin aihetunniste- ja linkkisyötteisiin mascot: Mukautettu maskotti (vanhentunut) @@ -310,7 +312,6 @@ fi: thumbnail: Palvelimen pienoiskuva trendable_by_default: Salli trendit ilman ennakkotarkastusta trends: Ota trendit käyttöön - trends_as_landing_page: Käytä trendejä aloitussivuna interactions: must_be_follower: Estä ilmoitukset käyttäjiltä, jotka eivät seuraa sinua must_be_following: Estä ilmoitukset käyttäjiltä, joita et seuraa diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 9f972d0c2..14a97e07b 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -93,6 +93,7 @@ fo: content_cache_retention_period: Allir postar frá øðrum ambætarum (íroknað stimbranir og svar) verða strikaði eftir ásetta talið av døgum, óansæð hvussu lokalir brúkarar hava samvirkað við hesar postar. Hetta fevnir eisini um postar, sum lokalir brúkarar hava bókamerkt ella yndismerkt. Privatar umrøður millum brúkarar frá ymiskum ambætarum verða eisini burturmistar og ómøguligar at endurskapa. Brúk av hesi stillingini er einans hugsað til serligar støður og oyðileggur nógv, sum brúkarar vænta av einum vanligum ambætara. custom_css: Tú kanst seta títt egna snið upp í net-útgávuni av Mastodon. favicon: WEBP, PNG, GIF ella JPG. Býtir vanligu Mastodon fav-ikonina um við eina ser-ikon. + landing_page: Velur hvørja síðu nýggj vitandi síggja tá tey koma á ambætaran hjá tær. Neyðugt er at rák eru gjørd virkin í Uppdagingarstillingum, um tú velur "Rák". Velur tú "Lokal rás" má "Atgongd til beinleiðis rásir við lokalum postum" vera sett til "Øll" í Uppdagingarstillingum. mascot: Skúgvar til viks myndprýðingina í framkomna vev-markamótinum. media_cache_retention_period: Miðlafílur frá postum, sum fjarbrúkarar hava gjørt, verða goymdir á tínum ambætara. Tá hetta er sett til eitt virði størri enn 0, so verða miðlafílurnar strikaðar eftir ásetta talið av døgum. Um miðladátur verða umbidnar eftir at tær eru strikaðar, verða tær tiknar innaftur á ambætaran, um keldutilfarið enn er tøkt. Vegna avmarkingar á hvussu ofta undanvísingarkort til leinki spyrja triðjapartsstøð, so verður mælt til at seta hetta virðið til í minsta lagi 14 dagar. Annars verða umbønir um dagføringar av undanvísingarkortum til leinki ikki gjørdar áðrenn hetta. min_age: Brúkarar verða spurdir um at vátta teirra føðingardag, tá tey skráseta seg @@ -110,7 +111,6 @@ fo: thumbnail: Ein mynd í lutfallinum 2:1, sum verður víst saman við ambætaraupplýsingunum hjá tær. trendable_by_default: Loyp uppum serskilda eftirkannan av tilfari, sum er vælumtókt. Einstakir lutir kunnu framvegis strikast frá listum við vælumtóktum tilfari seinni. trends: Listar við vælumtóktum tilfari vísa, hvørjir postar, frámerki og tíðindasøgur hava framburð á tínum ambætara. - trends_as_landing_page: Vís vitjandi og brúkarum, sum ikki eru innritaðir, rák í staðin fyri eina lýsing av ambætaranum. Krevur at rák eru virkin. form_challenge: current_password: Tú ert á veg til eitt trygt øki imports: @@ -287,6 +287,7 @@ fo: content_cache_retention_period: Tíðarskeið fyri varðveiðslu av fjartilfari custom_css: Serskilt CSS favicon: Favikon + landing_page: Heimasíða til nýggj vitjandi local_live_feed_access: Atgongd til beinleiðis rásir við lokalum postum local_topic_feed_access: Atgongd til frámerki og rásir við leinkjum við lokalum postum mascot: Serskildur maskottur (arvur) @@ -311,7 +312,6 @@ fo: thumbnail: Ambætarasmámynd trendable_by_default: Loyv vælumtóktum tilfari uttan at viðgera tað fyrst trends: Loyv ráki - trends_as_landing_page: Brúka rák sum lendingarsíðu interactions: must_be_follower: Blokera fráboðanum frá teimum, sum ikki fylgja tær must_be_following: Blokera fráboðanum frá teimum, tú ikki fylgir diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 3d25bc5ae..676b7638d 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -56,7 +56,7 @@ fr-CA: scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez une permission générale, vous n’avez pas besoin de sélectionner les permissions plus précises. setting_aggregate_reblogs: Ne pas afficher les nouveaux partages pour les messages déjà récemment partagés (n’affecte que les partages futurs) setting_always_send_emails: Normalement, les notifications par courriel ne seront pas envoyées lorsque vous utilisez Mastodon activement - setting_default_quote_policy: Ce paramètre ne prendra effet que pour les messages créés avec la prochaine version de Mastodon, mais vous pouvez sélectionner votre préférence en avance. + setting_default_quote_policy_unlisted: Lorsque des personnes vous citent, leur message sera également masqué des fils des tendances. setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic setting_display_media_default: Masquer les médias marqués comme sensibles setting_display_media_hide_all: Toujours masquer les médias @@ -105,7 +105,6 @@ fr-CA: thumbnail: Une image d'environ 2:1 affichée à côté des informations de votre serveur. trendable_by_default: Ignorer l'examen manuel du contenu tendance. Des éléments individuels peuvent toujours être supprimés des tendances après coup. trends: Les tendances montrent quelles publications, hashtags et actualités sont en train de gagner en traction sur votre serveur. - trends_as_landing_page: Afficher le contenu tendance au lieu d'une description de ce serveur pour les comptes déconnectés et les non-inscrit⋅e⋅s. Nécessite que les tendances soient activées. form_challenge: current_password: Vous entrez une zone sécurisée imports: @@ -225,17 +224,23 @@ fr-CA: setting_aggregate_reblogs: Grouper les partages dans les fils d’actualités setting_always_send_emails: Toujours envoyer les notifications par courriel setting_auto_play_gif: Lire automatiquement les GIFs animés + setting_boost_modal: Configurer la visibilité du partage setting_default_language: Langue de publication + setting_default_privacy: Visibilité de la publication setting_default_quote_policy: Autoriser les citations pour setting_default_sensitive: Toujours marquer les médias comme sensibles + setting_delete_modal: M'avertir avant de supprimer un message setting_disable_hover_cards: Désactiver l'aperçu du profil au survol setting_disable_swiping: Désactiver les actions par glissement setting_display_media: Affichage des médias setting_display_media_default: Défaut setting_display_media_hide_all: Masquer tout setting_display_media_show_all: Montrer tout + setting_emoji_style: Style des émojis setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau + setting_missing_alt_text_modal: M'avertir avant de publier des médias sans texte alternatif + setting_quick_boosting: Activer le partage rapide setting_reduce_motion: Réduire la vitesse des animations setting_system_font_ui: Utiliser la police par défaut du système setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système @@ -269,6 +274,7 @@ fr-CA: content_cache_retention_period: Durée de rétention du contenu distant custom_css: CSS personnalisé favicon: Favicon + landing_page: Page d'accueil pour les nouveaux visiteurs mascot: Mascotte personnalisée (héritée) media_cache_retention_period: Durée de rétention des médias dans le cache min_age: Âge minimum requis @@ -289,7 +295,6 @@ fr-CA: thumbnail: Miniature du serveur trendable_by_default: Autoriser les tendances sans révision préalable trends: Activer les tendances - trends_as_landing_page: Utiliser les tendances comme page d'accueil interactions: must_be_follower: Bloquer les notifications des personnes qui ne vous suivent pas must_be_following: Bloquer les notifications des personnes que vous ne suivez pas @@ -314,6 +319,7 @@ fr-CA: follow_request: Quelqu’un demande à me suivre mention: Quelqu’un me mentionne pending_account: Nouveau compte en attente d’approbation + quote: Quelqu'un vous a cité reblog: Quelqu’un a partagé mon message report: Nouveau signalement soumis software_updates: @@ -360,6 +366,10 @@ fr-CA: name: Nom permissions_as_keys: Autorisations position: Priorité + username_block: + allow_with_approval: Autoriser les inscriptions avec approbation + comparison: Méthode de comparaison + username: Mot à faire correspondre webhook: events: Événements activés template: Modèle de charge utile diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index c7540d372..bfda8ef81 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -56,7 +56,7 @@ fr: scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez une permission générale, vous n’avez pas besoin de sélectionner les permissions plus précises. setting_aggregate_reblogs: Ne pas afficher les nouveaux partages pour les messages déjà récemment partagés (n’affecte que les partages futurs) setting_always_send_emails: Normalement, les notifications par courriel ne seront pas envoyées lorsque vous utilisez Mastodon activement - setting_default_quote_policy: Ce paramètre ne prendra effet que pour les messages créés avec la prochaine version de Mastodon, mais vous pouvez sélectionner votre préférence en avance. + setting_default_quote_policy_unlisted: Lorsque des personnes vous citent, leur message sera également masqué des fils des tendances. setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic setting_display_media_default: Masquer les médias marqués comme sensibles setting_display_media_hide_all: Toujours masquer les médias @@ -105,7 +105,6 @@ fr: thumbnail: Une image d'environ 2:1 affichée à côté des informations de votre serveur. trendable_by_default: Ignorer l'examen manuel du contenu tendance. Des éléments individuels peuvent toujours être supprimés des tendances après coup. trends: Les tendances montrent quels messages, hashtags et actualités gagnent en popularité sur votre serveur. - trends_as_landing_page: Afficher le contenu tendance au lieu d'une description de ce serveur pour les comptes déconnectés et les non-inscrit⋅e⋅s. Nécessite que les tendances soient activées. form_challenge: current_password: Vous entrez une zone sécurisée imports: @@ -225,17 +224,23 @@ fr: setting_aggregate_reblogs: Grouper les partages dans les fils d’actualités setting_always_send_emails: Toujours envoyer les notifications par courriel setting_auto_play_gif: Lire automatiquement les GIFs animés + setting_boost_modal: Configurer la visibilité du partage setting_default_language: Langue de publication + setting_default_privacy: Visibilité de la publication setting_default_quote_policy: Autoriser les citations pour setting_default_sensitive: Toujours marquer les médias comme sensibles + setting_delete_modal: M'avertir avant de supprimer un message setting_disable_hover_cards: Désactiver l'aperçu du profil au survol setting_disable_swiping: Désactiver les actions par glissement setting_display_media: Affichage des médias setting_display_media_default: Défaut setting_display_media_hide_all: Masquer tout setting_display_media_show_all: Montrer tout + setting_emoji_style: Style des émojis setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau + setting_missing_alt_text_modal: M'avertir avant de publier des médias sans texte alternatif + setting_quick_boosting: Activer le partage rapide setting_reduce_motion: Réduire la vitesse des animations setting_system_font_ui: Utiliser la police par défaut du système setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système @@ -269,6 +274,7 @@ fr: content_cache_retention_period: Durée de rétention du contenu distant custom_css: CSS personnalisé favicon: Favicon + landing_page: Page d'accueil pour les nouveaux visiteurs mascot: Mascotte personnalisée (héritée) media_cache_retention_period: Durée de rétention des médias dans le cache min_age: Âge minimum requis @@ -289,7 +295,6 @@ fr: thumbnail: Miniature du serveur trendable_by_default: Autoriser les tendances sans révision préalable trends: Activer les tendances - trends_as_landing_page: Utiliser les tendances comme page d'accueil interactions: must_be_follower: Bloquer les notifications des personnes qui ne vous suivent pas must_be_following: Bloquer les notifications des personnes que vous ne suivez pas @@ -314,6 +319,7 @@ fr: follow_request: Quelqu’un demande à vous suivre mention: Quelqu’un vous a mentionné⋅e pending_account: Nouveau compte en attente d’approbation + quote: Quelqu'un vous a cité reblog: Quelqu’un a partagé votre message report: Nouveau signalement soumis software_updates: @@ -360,6 +366,10 @@ fr: name: Nom permissions_as_keys: Autorisations position: Priorité + username_block: + allow_with_approval: Autoriser les inscriptions avec approbation + comparison: Méthode de comparaison + username: Mot à faire correspondre webhook: events: Événements activés template: Modèle de payload diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index f7fe06332..9b0be65b3 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -105,7 +105,6 @@ fy: thumbnail: In ôfbylding fan ûngefear in ferhâlding fan 2:1 dy’t njonken jo serverynformaasje toand wurdt. trendable_by_default: Hânmjittige beoardieling fan trends oerslaan. Yndividuele items kinne letter dochs noch ôfkard wurde. trends: Trends toane hokker berjochten, hashtags en nijsberjochten op jo server oan populariteit winne. - trends_as_landing_page: Toan trending ynhâld oan ôfmelde brûkers en besikers yn stee fan in beskriuwing fan dizze server. Fereasket dat trends ynskeakele binne. form_challenge: current_password: Jo betrêdzje in feilige omjouwing imports: @@ -293,7 +292,6 @@ fy: thumbnail: Serverthumbnail trendable_by_default: Trends goedkarre sûnder yn it foar geande beoardieling trends: Trends ynskeakelje - trends_as_landing_page: Lit trends op de startside sjen interactions: must_be_follower: Meldingen fan minsken dy’t jo net folgje blokkearje must_be_following: Meldingen fan minsken dy’t jo net folgje blokkearje diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 5e6e418d2..decbe02ce 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -93,6 +93,7 @@ ga: content_cache_retention_period: Scriosfar gach postáil ó fhreastalaithe eile (lena n-áirítear treisithe agus freagraí) tar éis an líon sonraithe laethanta, gan aird ar aon idirghníomhaíocht úsáideora áitiúil leis na postálacha sin. Áirítear leis seo postálacha ina bhfuil úsáideoir áitiúil tar éis é a mharcáil mar leabharmharcanna nó mar cheanáin. Caillfear tagairtí príobháideacha idir úsáideoirí ó chásanna éagsúla freisin agus ní féidir iad a athchóiriú. Tá úsáid an tsocraithe seo beartaithe le haghaidh cásanna sainchuspóra agus sáraítear go leor ionchais úsáideoirí nuair a chuirtear i bhfeidhm é le haghaidh úsáid ghinearálta. custom_css: Is féidir leat stíleanna saincheaptha a chur i bhfeidhm ar an leagan gréasáin de Mastodon. favicon: WEBP, PNG, GIF nó JPG. Sáraíonn sé an favicon Mastodon réamhshocraithe le deilbhín saincheaptha. + landing_page: Roghnaíonn sé seo an leathanach a fheiceann cuairteoirí nua nuair a shroicheann siad do fhreastalaí den chéad uair. Má roghnaíonn tú "Treochtaí", ní mór treochtaí a chumasú sna Socruithe Fionnachtana. Má roghnaíonn tú "Fotha Áitiúil", ní mór "Rochtain ar fhothaí beo ina bhfuil poist áitiúla" a shocrú go "Gach Duine" sna Socruithe Fionnachtana. mascot: Sáraíonn sé an léaráid san ardchomhéadan gréasáin. media_cache_retention_period: Déantar comhaid meán ó phoist a dhéanann cianúsáideoirí a thaisceadh ar do fhreastalaí. Nuair a bheidh luach dearfach socraithe, scriosfar na meáin tar éis an líon sonraithe laethanta. Má iarrtar na sonraí meán tar éis é a scriosadh, déanfar é a ath-íoslódáil, má tá an t-ábhar foinse fós ar fáil. Mar gheall ar shrianta ar cé chomh minic is atá cártaí réamhamhairc ag vótaíocht do shuíomhanna tríú páirtí, moltar an luach seo a shocrú go 14 lá ar a laghad, nó ní dhéanfar cártaí réamhamhairc naisc a nuashonrú ar éileamh roimh an am sin. min_age: Iarrfar ar úsáideoirí a ndáta breithe a dhearbhú le linn clárúcháin @@ -110,7 +111,6 @@ ga: thumbnail: Íomhá thart ar 2:1 ar taispeáint taobh le faisnéis do fhreastalaí. trendable_by_default: Léim ar athbhreithniú láimhe ar ábhar treochta. Is féidir míreanna aonair a bhaint as treochtaí fós tar éis an fhíric. trends: Léiríonn treochtaí cé na postálacha, hashtags agus scéalta nuachta atá ag tarraingt ar do fhreastalaí. - trends_as_landing_page: Taispeáin inneachar treochta d'úsáideoirí agus do chuairteoirí atá logáilte amach in ionad cur síos ar an bhfreastalaí seo. Éilíonn treochtaí a chumasú. form_challenge: current_password: Tá tú ag dul isteach i limistéar slán imports: @@ -290,6 +290,7 @@ ga: content_cache_retention_period: Tréimhse choinneála inneachair cianda custom_css: CSS saincheaptha favicon: Favicon + landing_page: Leathanach tuirlingthe do chuairteoirí nua local_live_feed_access: Rochtain ar bheatha bheo ina bhfuil poist áitiúla local_topic_feed_access: Rochtain ar fhothaí hashtag agus nasc ina bhfuil poist áitiúla mascot: Mascóg saincheaptha (oidhreacht) @@ -314,7 +315,6 @@ ga: thumbnail: Mionsamhail freastalaí trendable_by_default: Ceadaigh treochtaí gan athbhreithniú roimh ré trends: Cumasaigh treochtaí - trends_as_landing_page: Úsáid treochtaí mar an leathanach tuirlingthe interactions: must_be_follower: Cuir bac ar fhógraí ó dhaoine nach leantóirí iad must_be_following: Cuir bac ar fhógraí ó dhaoine nach leanann tú diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index a4870f88c..3f918c2eb 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -54,8 +54,10 @@ gd: password: Cleachd co-dhiù 8 caractaran phrase: Thèid a mhaidseadh gun aire air litrichean mòra ’s beaga no air rabhadh susbainte puist scopes: Na APIan a dh’fhaodas an aplacaid inntrigeadh. Ma thaghas tu sgòp air ìre as àirde, cha leig thu leas sgòpaichean fa leth a thaghadh. + setting_advanced_layout: Seall Mastodon ’na ioma-cholbh ach am faic thu an loidhne-ama, na brathan agus treas colbh a thaghas tu fhèin. Cha mholamaid seo air sgrìnichean beaga. setting_aggregate_reblogs: Na seall brosnachaidhean ùra do phostaichean a chaidh a bhrosnachadh o chionn goirid (cha doir seo buaidh ach air brosnachaidhean ùra o seo a-mach) setting_always_send_emails: Mar as àbhaist, cha dèid brathan puist-d a chur nuair a a bhios tu ri Mastodon gu cunbhalach + setting_boost_modal: Ma tha seo an comas, thèid còmhradh dearbhaidh a shealltainn far an urrainn dhut faicsinneachd a’ phuist agad atharrachadh nuair a bhios tu ri brosnachadh. setting_default_quote_policy_private: Chan urrainn do chàch postaichean dhan luchd-leantainn a-mhàin a chaidh a sgrìobhadh le Mastodon a luaidh. setting_default_quote_policy_unlisted: Nuair a luaidheas daoine thu, thèid am post aca-san fhalach o loidhnichean-ama nan treandaichean. setting_default_sensitive: Thèid meadhanan frionasach fhalach a ghnàth is gabhaidh an nochdadh le briogadh orra @@ -63,6 +65,7 @@ gd: setting_display_media_hide_all: Falaich na meadhanan an-còmhnaidh setting_display_media_show_all: Seall na meadhanan an-còmhnaidh setting_emoji_style: An dòigh air an dèid emojis a shealltainn. Feuchaidh “Fèin-obrachail” ris na h-emojis tùsail a chleachdadh ach thèid Twemoji a chleachdadh ’nan àite air seann-bhrabhsairean. + setting_quick_boosting_html: Ma tha seo an comas, ma nì thu briogadh air ìomhaigheag %{boost_icon} a’ bhrosnachaidh, thèid a bhrosnachadh sa bhad seach a bhith a’ fosgladh clàr-taice teàrnach a’ bhrosnachaidh/luaidh. Thèid gnìomh an luaidh a ghluasad gu clàr-taice %{options_icon} nan roghainnean. setting_system_scrollbars_ui: Chan obraich seo ach air brabhsairean desktop stèidhichte air Safari ’s Chrome setting_use_blurhash: Tha caiseadan stèidhichte air dathan nan nithean lèirsinneach a chaidh fhalach ach chan fhaicear am mion-fhiosrachadh setting_use_pending_items: Falaich ùrachaidhean na loidhne-ama air cùlaibh briogaidh seach a bhith a’ sgroladh nam postaichean gu fèin-obrachail @@ -90,6 +93,7 @@ gd: content_cache_retention_period: Thèid a h-uile post o fhrithealaiche sam bith eile (a’ gabhail a-staigh brosnachaidhean is freagairtean) a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu ’s gun diù a chon air eadar-ghabhail ionadail air na postaichean ud. Gabhaidh seo a-steach na postaichean a chuir cleachdaiche ionadail ris na h-annsachdan aca no comharran-lìn riutha. Thèid iomraidhean prìobhaideach eadar cleachdaichean o ionstansan diofraichte air chall cuideachd agus cha ghabh an aiseag idir. Tha an roghainn seo do dh’ionstansan sònraichte a-mhàin agus briseadh e dùilean an luchd-cleachdaidh nuair a rachadh a chleachdadh gu coitcheann. custom_css: "’S urrainn dhut stoidhlean gnàthaichte a chur an sàs air an tionndadh-lìn de Mhastodon." favicon: WEBP, PNG, GIF no JPG. Tar-àithnidh seo favicon bunaiteach Mhastodon le ìomhaigheag ghnàthaichte. + landing_page: Taghaidh seo an duilleag a chì aoighean ùra nuair a thadhlas air an fhrithealaiche agad a’ chiad turas. ma thaghas tu “Treandaichean”, feumaidh tu na treandaichean a chur an comas ann ann roghainnean an rùrachaidh. Ma thaghas tu “Loidhne-ama ionadail”, feumaidh tu “Inntrigeadh dhan t-saoghal bheò sa bheil postaichean ionadail” a shuidheachadh air “A h-uile duine” ann an roghainnean an rùrachaidh. mascot: Tar-àithnidh seo an sgead-dhealbh san eadar-aghaidh-lìn adhartach. media_cache_retention_period: Thèid faidhlichean meadhain o phostaichean a chruthaich cleachdaichean cèine a chur ri tasgadan an fhrithealaiche agad. Nuair a shuidhicheas tu seo air luach dearbh, thèid na meadhanan a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu. Ma tha dàta meadhain ga iarraidh às dèidh a sguabaidh às, thèid a luchdadh a-nuas a-rithist ma tha susbaint an tùis ri fhaighinn fhathast. Ri linn cuingeachaidhean air mar a cheasnaicheas cairtean ro-sheallaidh làraichean threas-phàrtaidhean, mholamaid gun suidhich thu an luach seo air 14 làithean ar a char as giorra no cha dèid an ùrachadh nuair a thèid an iarraidh ron àm sin. min_age: Thèid iarraidh air an luchd-cleachdaidh gun dearbh iad an là-breith rè a’ chlàraidh @@ -107,7 +111,6 @@ gd: thumbnail: Dealbh mu 2:1 a thèid a shealltainn ri taobh fiosrachadh an fhrithealaiche agad. trendable_by_default: Geàrr leum thar lèirmheas a làimh na susbainte a’ treandadh. Gabhaidh nithean fa leth a thoirt far nan treandaichean fhathast an uairsin. trends: Seallaidh na treandaichean na postaichean, tagaichean hais is naidheachdan a tha fèill mhòr orra air an fhrithealaiche agad. - trends_as_landing_page: Seall susbaint a’ treandadh dhan fheadhainn nach do chlàraich a-steach is do dh’aoighean seach tuairisgeul an fhrithealaiche seo. Feumaidh treandaichean a bhith an comas airson sin. form_challenge: current_password: Tha thu a’ tighinn a-steach gu raon tèarainte imports: @@ -165,6 +168,7 @@ gd: username_block: allow_with_approval: An àite bacadh clàraidh gu tur, bidh clàraidhean a mhaidsicheas feumach air d’ aonta comparison: Thoir an aire air an Scunthorpe Problem nuair a bhacas tu maidsichean pàirteach + username: Bidh am maidseadh coma mu litrichean mòra ’s beaga agus co-ghlifichean cumanta a leithid “4” an àite “a” no “3” an àite “e” webhook: events: Tagh na tachartasan a thèid a chur template: Cruthaich an JSON payload agad fhèin le eadar-phòlachadh chaochladairean. Fàg seo bàn airson JSON bunaiteach fhaighinn. @@ -235,10 +239,12 @@ gd: setting_aggregate_reblogs: Buidhnich na brosnachaidhean air an loidhne-ama setting_always_send_emails: Cuir brathan puist-d an-còmhnaidh setting_auto_play_gif: Cluich GIFs beòthaichte gu fèin-obrachail + setting_boost_modal: Smachd air faicsinneachd nam brosnachaidhean setting_default_language: Cànan postaidh setting_default_privacy: Faicsinneachd nam post setting_default_quote_policy: Cò dh’fhaodas luaidh setting_default_sensitive: Cuir comharra ri meadhanan an-còmhnaidh gu bheil iad frionasach + setting_delete_modal: Thoir rabhadh dhomh mus dèid post a sguabadh às setting_disable_hover_cards: Na ro-sheall pròifil nuair a dh’fhanas mi os a cionn setting_disable_swiping: Cuir gluasadan grad-shlaighdidh à comas setting_display_media: Sealltainn nam meadhanan @@ -248,6 +254,8 @@ gd: setting_emoji_style: Stoidhle nan Emojis setting_expand_spoilers: Leudaich postaichean ris a bheil rabhadh susbainte an-còmhnaidh setting_hide_network: Falaich an graf sòisealta agad + setting_missing_alt_text_modal: Thoir rabhadh dhomh mus postaich mi meadhan às aonais roghainn teacsa + setting_quick_boosting: Cuir am brosnachadh luath an comas setting_reduce_motion: Ìslich an gluasad sna beòthachaidhean setting_system_font_ui: Cleachd cruth-clò bunaiteach an t-siostaim setting_system_scrollbars_ui: Seall bàr-sgrolaidh bunaiteach an t-siostaim @@ -281,12 +289,17 @@ gd: content_cache_retention_period: Ùine glèidhidh aig susbaint chèin custom_css: CSS gnàthaichte favicon: Favicon + landing_page: An duilleag-laighe do dh’aoighean ùra + local_live_feed_access: Inntrigeadh dhan t-saoghal bheò sa bheil postaichean ionadail + local_topic_feed_access: Inntrigeadh dha loidhnichean-ama nan tagaichean hais is ceanglaichean sa bheil postaichean ionadail mascot: Suaichnean gnàthaichte (dìleabach) media_cache_retention_period: Ùine glèidhidh aig tasgadan nam meadhanan min_age: Riatanas aoise as lugha peers_api_enabled: Foillsich liosta nam frithealaichean a chaidh a rùrachadh san API profile_directory: Cuir eòlaire nam pròifil an comas registrations_mode: Cò dh’fhaodas clàradh + remote_live_feed_access: Inntrigeadh dhan t-saoghal bheò sa bheil postaichean cèine + remote_topic_feed_access: Inntrigeadh dha loidhnichean-ama nan tagaichean hais is ceanglaichean sa bheil postaichean cèine require_invite_text: Iarr adhbhar clàraidh show_domain_blocks: Seall bacaidhean àrainne show_domain_blocks_rationale: Seall carson a chaidh àrainnean a bacadh @@ -301,7 +314,6 @@ gd: thumbnail: Dealbhag an fhrithealaiche trendable_by_default: Ceadaich treandaichean gun lèirmheas ro làimh trends: Cuir na treandaichean an comas - trends_as_landing_page: Cleachd na treandaichean ’nan duilleag-laighe interactions: must_be_follower: Bac na brathan nach eil o luchd-leantainn must_be_following: Bac na brathan o dhaoine nach lean thu diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 982f76a97..5599f7d54 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -93,6 +93,7 @@ gl: content_cache_retention_period: Todas as publicacións procedentes de outros servidores (incluído promocións e respostas) van ser eliminadas despois do número de días indicado, sen importar as interaccións das usuarias locais con esas publicacións. Esto inclúe publicacións que a usuaria local marcou como favoritas ou incluíu nos marcadores. As mencións privadas entre usuarias de diferentes instancias tamén se eliminarán e non se poderán restablecer. O uso desta ferramenta esta orientado a situacións especiais e estraga moitas das expectativas das usuarias ao implementala cun propósito de uso xeral. custom_css: Podes aplicar deseños personalizados na versión web de Mastodon. favicon: WEBP, PNG, GIF ou JPG. Sobrescribe a icona de favoritos de Mastodon por defecto cunha icona personalizada. + landing_page: Elixe a páxina que verán as persoas que se acheguen por primeira vez ao teu servidor. Se elixes «Tendencias» entón debes activar as tendencias nos Axustes de Descubrimento. Se elixes «Cronoloxía local», hai que configurar nos Axustes de Descubrimento a opción «Acceso das cronoloxías en directo ás publicacións locais» como «Calquera». mascot: Sobrescribe a ilustración na interface web avanzada. media_cache_retention_period: Os ficheiros multimedia de publicacións de usuarias remotas están almacenados no teu servidor. Ao establecer un valor positivo, o multimedia vaise eliminar despois do número de días establecido. Se o multimedia fose requerido após ser eliminado entón descargaríase outra vez, se aínda está dispoñible na orixe. Debido a restricións sobre a frecuencia en que o servizo de vista previa trae recursos de terceiras partes, é recomendable establecer este valor polo menos en 14 días, ou as tarxetas de vista previa non se actualizarán baixo demanda para casos anteriores a ese prazo. min_age: Váiselle pedir ás usuarias que confirmen a súa data de nacemento cando creen a conta @@ -110,7 +111,6 @@ gl: thumbnail: Imaxe con proporcións 2:1 mostrada xunto á información sobre o servidor. trendable_by_default: Omitir a revisión manual dos contidos populares. Poderás igualmente eliminar manualmente os elementos que vaian aparecendo. trends: As tendencias mostran publicacións, cancelos e novas historias que teñen popularidade no teu servidor. - trends_as_landing_page: Mostrar contidos en voga para as persoas sen sesión iniciada e visitantes no lugar dunha descrición deste servidor. Require ter activado Popularidade. form_challenge: current_password: Estás entrando nun área segura imports: @@ -287,6 +287,7 @@ gl: content_cache_retention_period: Período de retención de contido remoto custom_css: CSS personalizado favicon: Favicon + landing_page: Páxina que se mostra ás visitas local_live_feed_access: Acceso a cronoloxías ao vivo que mostran publicacións locais local_topic_feed_access: Acceso a cronoloxías de ligazóns e cancelos que mostran publicacións locais mascot: Mascota propia (herdado) @@ -311,7 +312,6 @@ gl: thumbnail: Icona do servidor trendable_by_default: Permitir tendencias sen aprobación previa trends: Activar tendencias - trends_as_landing_page: Usar as tendencias como páxina de benvida interactions: must_be_follower: Bloquea as notificacións de persoas que non te seguen must_be_following: Bloquea as notificacións de persoas que non segues diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 4563a61d5..5f96869d7 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -93,6 +93,7 @@ he: content_cache_retention_period: כל ההודעות משרתים אחרים (לרבות הדהודים ותגובות) ימחקו אחרי מספר ימים, ללא קשר לאינטראקציה של משתמשים מקומיים איתם. בכלל זה הודעות שהמתשתמשים המקומיים סימנו בסימניה או חיבוב. איזכורים פרטיים ("דיאם") בין משתמשים בין שרתים שונים יאבדו גם הם ולא תהיה אפשרות לשחזרם. השימוש באפשרות הזו מיועד לשרתים עם ייעוד מיוחד ושובר את ציפיותיהם של רב המשתמשים כאשר האפשרות מופעלת בשרת לשימוש כללי. custom_css: ניתן לבחור ערכות סגנון אישיות בגרסת הדפדפן של מסטודון. favicon: WEBP, PNG, GIF או JPG. גובר על "פאבאייקון" ברירת המחדל ומחליף אותו באייקון נבחר בדפדפן. + landing_page: בחירה בעמוד שיוצג ראשון למבקרים חדשים בביקור הראשון בשרת שלך. אם תבחרו "נושאים חמים", אזי הנושאים החמים צריכים להיות מאופשרים בהעדפות "תגליות". אם תבחרו "פיד מקומי", אז "גישה לפידים חיים המציגים הודעות מקומיות" חייב להיות מכוון למצב "כולם" בהעדפות תגליות. mascot: בחירת ציור למנשק הווב המתקדם. media_cache_retention_period: קבצי מדיה מהודעות שהגיעו משרתים רחוקים נשמרות על השרת שלך. כאשר יבחר פה מספר חיובי, המדיה תמחק לאחר מספר ימים כמצוין. אם המידע יבוקש שוב לאחר שנמחק, הוא יורד מחדש, אם המידע עדיין זמין בצד הרחוק. עקב מגבלות על תכיפות שליפת כרטיסי קדימון מאתרים מרוחקים, מומלץ לכוון את הערך ל־14 יום לפחות, או שכרטיסי קדימונים לא יעודכנו לפי דרישה לפני חלוף חלון הזמן הזה. min_age: משתמשיםות יתבקשו לאשר את תאריך הלידה בתהליך ההרשמה @@ -110,7 +111,6 @@ he: thumbnail: תמונה ביחס 2:1 בערך שתוצג ליד המידע על השרת שלך. trendable_by_default: לדלג על בדיקה ידנית של התכנים החמים. פריטים ספציפיים עדיין ניתנים להסרה לאחר מעשה. trends: נושאים חמים יציגו אילו הודעות, תגיות וידיעות חדשות צוברות חשיפה על השרת שלך. - trends_as_landing_page: הצג למבקרים ולמשתמשים שאינם מחוברים את הנושאים החמים במקום את תיאור השרת. מחייב הפעלה של אפשרות הנושאים החמים. form_challenge: current_password: את.ה נכנס. ת לאזור מאובטח imports: @@ -289,6 +289,7 @@ he: content_cache_retention_period: תקופת השמירה על תוכן חיצוני custom_css: CSS בהתאמה אישית favicon: סמל מועדפים (Favicon) + landing_page: דף נחיתה למבקרים חדשים local_live_feed_access: גישה לפידים חיים המציגים הודעות מקומיות local_topic_feed_access: גישה לפידים של תגיות וקישורים המציגים הודעות מקומיות mascot: סמל השרת (ישן) @@ -313,7 +314,6 @@ he: thumbnail: תמונה ממוזערת מהשרת trendable_by_default: הרשאה לפריטים להופיע בנושאים החמים ללא אישור מוקדם trends: אפשר פריטים חמים (טרנדים) - trends_as_landing_page: דף הנחיתה יהיה "נושאים חמים" interactions: must_be_follower: חסימת התראות משאינם עוקבים must_be_following: חסימת התראות משאינם נעקבים diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 93071a739..b1e05c672 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -93,6 +93,7 @@ hu: content_cache_retention_period: Minden más kiszolgálóról származó bejegyzés (megtolásokkal és válaszokkal együtt) törölve lesz a megadott számú nap elteltével, függetlenül a helyi felhasználók ezekkel a bejegyzésekkel történő interakcióitól. Ebben azok a bejegyzések is benne vannak, melyeket a helyi felhasználó könyvjelzőzött vagy kedvencnek jelölt. A különböző kiszolgálók felhasználói közötti privát üzenetek is el fognak veszni visszaállíthatatlanul. Ennek a beállításnak a használata különleges felhasználási esetekre javasolt, mert számos felhasználói elvárás fog eltörni, ha általános céllal használják. custom_css: A Mastodon webes verziójában használhatsz egyéni stílusokat. favicon: WEBP, PNG, GIF vagy JPG. Az alapértelmezett Mastodon favicont felülírja egy egyéni ikonnal. + landing_page: Kiválasztja, hogy a webhely új látogatói mit látnak, amikor először érkeznek a kiszolgálóra. Ha a „Trendek” lehetőséget választod, akkor engedélyezni kell a trendeket a Felfedezési beállításokban. Ha a „Helyi hírfolyamot” választod, akkor a „Helyi bejegyzéseket tartalmazó helyi élő idővonalak elérése” lehetőséget „Mindenki” értékre kell állítani a Felfedezési beállításokban. mascot: Felülbírálja a speciális webes felületen található illusztrációt. media_cache_retention_period: A távoli felhasználók bejegyzéseinek médiatartalmait a kiszolgálód gyorsítótárazza. Ha pozitív értékre állítják, ezek a médiatartalmak a megadott számú nap után törölve lesznek. Ha a médiát újra lekérik, miután törlődött, újra le fogjuk tölteni, ha az eredeti még elérhető. A hivatkozások előnézeti kártyáinak harmadik fél weboldalai felé történő hivatkozásaira alkalmazott megkötései miatt javasolt, hogy ezt az értéket legalább 14 napra állítsuk, ellenkező esetben a hivatkozások előnézeti kártyái szükség esetén nem fognak tudni frissülni ezen idő előtt. min_age: A felhasználók a regisztráció során arra lesznek kérve, hogy erősítsek meg a születési dátumukat @@ -110,7 +111,6 @@ hu: thumbnail: Egy durván 2:1 arányú kép, amely a kiszolgálóinformációk mellett jelenik meg. trendable_by_default: Kézi felülvizsgálat kihagyása a felkapott tartalmaknál. Az egyes elemek utólag távolíthatók el a trendek közül. trends: A trendek azt mondják meg, hogy mely bejegyzések, hashtagek és hírbejegyzések felkapottak a kiszolgálódon. - trends_as_landing_page: Felkapott tartalmak mutatása a kijelentkezett felhasználók és látogatók számára ennek a kiszolgálónak a leírása helyett. Szükséges hozzá a trendek engedélyezése. form_challenge: current_password: Beléptél egy biztonsági térben imports: @@ -287,6 +287,7 @@ hu: content_cache_retention_period: Távoli tartalmak megtartási időszaka custom_css: Egyéni CSS favicon: Könyvjelzőikon + landing_page: Kezdőoldal az új látogatóknak local_live_feed_access: Helyi bejegyzéseket bemutató élő hírfolyamok elérése local_topic_feed_access: Helyi bejegyzéseket bemutató hashtagek és hivatkozásfolyamok elérése mascot: Egyéni kabala (örökölt) @@ -311,7 +312,6 @@ hu: thumbnail: Kiszolgáló bélyegképe trendable_by_default: Trendek engedélyezése előzetes ellenőrzés nélkül trends: Trendek engedélyezése - trends_as_landing_page: Trendek használata nyitóoldalként interactions: must_be_follower: Nem követőidtől érkező értesítések tiltása must_be_following: Nem követettjeidtől érkező értesítések tiltása diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index a7385d7c2..b231ff0de 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -93,6 +93,7 @@ ia: content_cache_retention_period: Tote le messages de altere servitores (includite impulsos e responsas) essera delite post le numero de dies specificate, independentemente de tote interaction de usatores local con ille messages. Isto include le messages addite al marcapaginas o marcate como favorite per un usator local. Le mentiones private inter usatores de differente instantias tamben essera irrecuperabilemente perdite. Le uso de iste parametro es intendite pro instantias con scopos specific e viola multe expectationes de usatores si es implementate pro uso general. custom_css: Tu pote applicar stilos personalisate sur le version de web de Mastodon. favicon: WEBP, PNG, GIF o JPG. Supplanta le favicone predefinite de Mastodon con un icone personalisate. + landing_page: Selige le pagina presentate al nove visitatores al prime arrivata sur tu servitor. Si tu selige “Tendentias”, alora le tendentias debe esser activate in le Parametros de discoperta. Si tu selige “Canal local”, alora le option “Accesso a canales in vivo con messages local” debe esser mittite a “Omnes” in le Parametros de discoperta. mascot: Illo substitue le illustration in le interfacie web avantiate. media_cache_retention_period: Le files multimedial de messages producite per usatores distante se immagazina in cache sur tu servitor. Quando iste option es definite a un valor positive, tal files essera delite post le numero specificate de dies. Si alcuno requesta le datos multimedial post lor deletion, illos essera re-discargate si le contento original es ancora disponibile. Debite a limitationes sur le frequentia con que le cartas de previsualisation de ligamines se connecte al sitos de tertios, il es recommendate definir iste valor a al minus 14 dies, alteremente le previsualisationes de ligamines non essera actualisate sur demanda ante ille tempore. min_age: Le usatores debera confirmar lor data de nascentia durante le inscription @@ -110,7 +111,6 @@ ia: thumbnail: Un imagine de circa 2:1 monstrate al latere del informationes de tu servitor. trendable_by_default: Saltar le revision manual del contento de tendentia. Elementos singule pote ancora esser removite de tendentias post le facto. trends: Tendentias monstra que messages, hashtags e novas gania traction sur tu servitor. - trends_as_landing_page: Monstrar contento de tendentia a usatores disconnexe e visitatores in vice que un description de iste servitor. Require tendentias esser activate. form_challenge: current_password: Tu entra in un area secur imports: @@ -287,6 +287,7 @@ ia: content_cache_retention_period: Periodo de retention del contento remote custom_css: CSS personalisate favicon: Favicon + landing_page: Pagina de arrivata pro nove visitatores local_live_feed_access: Accesso a canales in vivo con messages local local_topic_feed_access: Accesso a canales de hashtag e ligamines con messages local mascot: Personalisar le mascotte (hereditage) @@ -311,7 +312,6 @@ ia: thumbnail: Miniatura de servitor trendable_by_default: Permitter tendentias sin revision previe trends: Activar tendentias - trends_as_landing_page: Usar tendentias como pagina de destination interactions: must_be_follower: Blocar notificationes de personas qui non te seque must_be_following: Blocar notificationes de personas que tu non seque diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml index f6da22eed..728e9e81b 100644 --- a/config/locales/simple_form.ie.yml +++ b/config/locales/simple_form.ie.yml @@ -99,7 +99,6 @@ ie: thumbnail: Un image de dimensiones circa 2:1 monstrat along tui servitor-information. trendable_by_default: Pretersaltar un manual revision de contenete in tendentie. Mem pos to on posse remover índividual pezzes de tendentie. trends: Tendenties monstra quel postas, hashtags e novas es ganiant atention sur tui servitor. - trends_as_landing_page: Monstrar populari contenete a ínregistrat visitantes vice un description del servitor. Besona que tendenties es activisat. form_challenge: current_password: Tu nu intra un area secur imports: @@ -260,7 +259,6 @@ ie: thumbnail: Miniatura del servitor trendable_by_default: Possibilisar tendenties sin priori inspection trends: Possibilisar tendenties - trends_as_landing_page: Usar tendenties quam frontispicie interactions: must_be_follower: Bloccar notificationes de tis qui ne seque te must_be_following: Bloccar notificationes de tis quem tu ne seque diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 1b47be720..03c0fd24c 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -102,7 +102,6 @@ io: thumbnail: Cirkum 2:1 imajo montresar kun informo di ca servilo. trendable_by_default: Ignorez manuala kontrolar di populara enhavajo. trends: Populari montras quala afishi, gretvorti e novaji populareskas en vua servilo. - trends_as_landing_page: Montrez populara posti a uzanti neeniriti e vizitanti vice deskriptajo pri ca servilo. Bezonas ke populari es aktivita. form_challenge: current_password: Vu eniras sekura areo imports: @@ -278,7 +277,6 @@ io: thumbnail: Servilimajeto trendable_by_default: Permisez populari sen kontrolo trends: Ebligar populari - trends_as_landing_page: Uzar populari quale la iniciala pagino interactions: must_be_follower: Celar la savigi da homi, qui ne sequas tu must_be_following: Celar la savigi da homi, quin tu ne sequas diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 0702b5561..71c48f230 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -93,6 +93,7 @@ is: content_cache_retention_period: Öllum færslum af öðrum netþjónum (þar með taldar endurbirtingar og svör) verður eytt eftir uppgefinn fjölda daga, án tillits til gagnvirkni staðværra notenda við þessar færslur. Þetta á einnig við um færslur sem notandinn hefur merkt sem bókamerki eða eftirlæti. Beinar tilvísanir (einkaspjall) milli notenda af mismunandi netþjónum munu einnig tapast og er engin leið til að endurheimta þær. Notkun á þessari stillingu er einungis ætluð sérstilltum netþjónum og mun skemma fyrir notendum ef þetta er sett upp fyrir almenna notkun. custom_css: Þú getur virkjað sérsniðna stíla í vefútgáfu Mastodon. favicon: WEBP, PNG, GIF eða JPG. Tekur yfir sjálfgefna Mastodon favicon-táknmynd með sérsniðinni táknmynd. + landing_page: Þetta ákvarðar hvaða síðu nýir gestir sjá þegar þeir koma fyrst á netþjóninn þinn. Ef þú velur "Vinsælt" þá þurfa vinsælar færslur að vera virkjaðar í stillingum fyrir Uppgötvun. Ef þú velur "Staðbundið streymi" þá þarf "Aðgangur að beinum streymum, þar með töldum staðværum færslum" að vera stillt á "Allir" í stillingum fyrir Uppgötvun. mascot: Þetta tekyr yfir myndskreytinguna í ítarlega vefviðmótinu. media_cache_retention_period: Myndefnisskrár úr færslum sem gerðar eru af fjartengdum notendum eru geymdar á netþjóninum þínum. Þegar þetta er stillt á jákvætt gildi, verður þessum skrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga. Ef beðið er um myndefnið eftir að því er eytt, mun það verða sótt aftur ef frumgögnin eru ennþá aðgengileg. Vegna takmarkana á hversu oft forskoðunarspjöld tengla eru sótt á utanaðkomandi netþjóna, þá er mælt með því að setja þetta gildi á að minnsta kosti 14 daga, annars gæti mistekist að uppfæra forskoðunarspjöld tengla eftir þörfum fyrir þann tíma. min_age: Notendur verða beðnir um að staðfesta fæðingardag sinn við nýskráningu @@ -110,7 +111,6 @@ is: thumbnail: Mynd um það bil 2:1 sem birtist samhliða upplýsingum um netþjóninn þinn. trendable_by_default: Sleppa handvirkri yfirferð á vinsælu efni. Áfram verður hægt að fjarlægja stök atriði úr vinsældarlistum. trends: Vinsældir sýna hvaða færslur, myllumerki og fréttasögur séu í umræðunni á netþjóninum þínum. - trends_as_landing_page: Sýna vinsælt efni til ekki-innskráðra notenda í stað lýsingar á þessum netþjóni. Krefst þess að vinsældir efnis sé virkjað. form_challenge: current_password: Þú ert að fara inn á öryggissvæði imports: @@ -287,6 +287,7 @@ is: content_cache_retention_period: Tímabil sem á að geyma fjartengt efni custom_css: Sérsniðið CSS favicon: Auðkennismynd + landing_page: Kynningarsíða fyrir nýja gesti local_live_feed_access: Aðgangur að beinum streymum, þar með töldum staðværum færslum local_topic_feed_access: Aðgangur að myllumerkjum og tengdum streymum, þar með töldum staðværum færslum mascot: Sérsniðið gæludýr (eldra) @@ -311,7 +312,6 @@ is: thumbnail: Smámynd vefþjóns trendable_by_default: Leyfa vinsælt efni án undanfarandi yfirferðar trends: Virkja vinsælt - trends_as_landing_page: Nota vinsælasta sem upphafssíðu interactions: must_be_follower: Loka á tilkynningar frá þeim sem ekki eru fylgjendur must_be_following: Loka á tilkynningar frá þeim sem þú fylgist ekki með diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 5e2219c6a..4386ba1b3 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -93,6 +93,7 @@ it: content_cache_retention_period: Tutti i post da altri server (inclusi booster e risposte) verranno eliminati dopo il numero specificato di giorni, senza tener conto di eventuali interazioni con gli utenti locali con tali post. Questo include i post in cui un utente locale ha contrassegnato come segnalibri o preferiti. Anche le menzioni private tra utenti di diverse istanze andranno perse e impossibile da ripristinare. L'uso di questa impostazione è inteso per casi di scopo speciale e rompe molte aspettative dell'utente quando implementato per uso generale. custom_css: È possibile applicare stili personalizzati sulla versione web di Mastodon. favicon: WEBP, PNG, GIF o JPG. Sostituisce la favicon predefinita di Mastodon con un'icona personalizzata. + landing_page: Seleziona quale pagina vedono i nuovi visitatori al loro primo arrivo sul tuo server. Se selezioni "Tendenze", è necessario abilitare le tendenze nelle Impostazioni di scoperta. Se selezioni "Feed locale", allora è necessario impostare "Accesso ai feed in diretta con post locali" su "Tutti" nelle Impostazioni di scoperta. mascot: Sostituisce l'illustrazione nell'interfaccia web avanzata. media_cache_retention_period: I file multimediali da post fatti da utenti remoti sono memorizzati nella cache sul tuo server. Quando impostato a un valore positivo, i media verranno eliminati dopo il numero specificato di giorni. Se i dati multimediali sono richiesti dopo che sono stati eliminati, saranno nuovamente scaricati, se il contenuto sorgente è ancora disponibile. A causa di restrizioni su quanto spesso link anteprima carte sondaggio siti di terze parti, si consiglia di impostare questo valore ad almeno 14 giorni, o le schede di anteprima link non saranno aggiornate su richiesta prima di quel tempo. min_age: Agli utenti verrà chiesto di confermare la propria data di nascita durante l'iscrizione @@ -110,7 +111,6 @@ it: thumbnail: Un'immagine approssimativamente 2:1 visualizzata insieme alle informazioni del tuo server. trendable_by_default: Salta la revisione manuale dei contenuti di tendenza. I singoli elementi possono ancora essere rimossi dalle tendenze dopo il fatto. trends: Le tendenze mostrano quali post, hashtag e notizie stanno guadagnando popolarità sul tuo server. - trends_as_landing_page: Mostra i contenuti di tendenza agli utenti disconnessi e ai visitatori, invece di una descrizione di questo server. Richiede l'abilitazione delle tendenze. form_challenge: current_password: Stai entrando in un'area sicura imports: @@ -287,6 +287,7 @@ it: content_cache_retention_period: Periodo di ritenzione del contenuto remoto custom_css: Personalizza CSS favicon: Favicon + landing_page: Pagina di destinazione per i nuovi visitatori local_live_feed_access: Accesso ai feed dal vivo con post locali local_topic_feed_access: Accesso a feed di hashtag e link con post locali mascot: Personalizza mascotte (legacy) @@ -311,7 +312,6 @@ it: thumbnail: Miniatura del server trendable_by_default: Consenti le tendenze senza revisione preventiva trends: Abilita le tendenze - trends_as_landing_page: Usa le tendenze come pagina di destinazione interactions: must_be_follower: Blocca notifiche da chi non ti segue must_be_following: Blocca notifiche dalle persone che non segui diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index aeaa19920..01bec9d5f 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -104,7 +104,6 @@ ja: thumbnail: サーバー情報と共に表示される、アスペクト比が約 2:1 の画像。 trendable_by_default: トレンドの審査を省略します。トレンドは掲載後でも個別に除外できます。 trends: トレンドは、サーバー上で人気を集めている投稿、ハッシュタグ、ニュース記事などが表示されます。 - trends_as_landing_page: ログインしていないユーザーに対して、サーバーの説明の代わりにトレンドコンテンツを表示します。トレンドを有効にする必要があります。 form_challenge: current_password: セキュリティ上重要なエリアにアクセスしています imports: @@ -237,6 +236,7 @@ ja: setting_emoji_style: 絵文字スタイル setting_expand_spoilers: 閲覧注意としてマークされた投稿を常に展開する setting_hide_network: 繋がりを隠す + setting_quick_boosting: クイックブーストの有効化 setting_reduce_motion: アニメーションの動きを減らす setting_system_font_ui: システムのデフォルトフォントを使う setting_system_scrollbars_ui: システムのデフォルトのスクロールバーを使う @@ -290,7 +290,6 @@ ja: thumbnail: サーバーのサムネイル trendable_by_default: 審査前のトレンドの掲載を許可する trends: トレンドを有効にする - trends_as_landing_page: 新規登録画面にトレンドを表示する interactions: must_be_follower: フォロワー以外からの通知をブロック must_be_following: フォローしていないユーザーからの通知をブロック diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index 4e06281ec..6f3acf712 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -29,6 +29,7 @@ kab: name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :' form_admin_settings: min_age: Ad ttwasutren yiseqdacen ad sentemen azemz-nsen n tlalit deg ujerred + site_contact_username: Amek i zemren ad ak·em-id-afen medden ɣef Mastodon. form_challenge: current_password: Tkecmeḍ ɣer temnaḍt taɣellsant imports: @@ -152,6 +153,7 @@ kab: tag: name: Ahacṭag terms_of_service: + changelog: Amaynut? text: Tiwtilin n useqdec terms_of_service_generator: domain: Taɣult diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 9ab33619a..b8348032f 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -56,11 +56,15 @@ ko: scopes: 애플리케이션에 허용할 API들입니다. 최상위 스코프를 선택하면 개별적인 것은 선택하지 않아도 됩니다. setting_aggregate_reblogs: 최근에 부스트 됐던 게시물은 새로 부스트 되어도 보여주지 않기 (새로 받은 부스트에만 적용됩니다) setting_always_send_emails: 기본적으로 마스토돈을 활동적으로 사용하고 있을 때에는 이메일 알림이 보내지지 않습니다 + setting_boost_modal: 활성화하면 부스트하기 전에 부스트의 공개설정을 바꿀 수 있는 확인창이 먼저 뜨게 됩니다. + setting_default_quote_policy_private: 마스토돈에서 작성된 팔로워 전용 게시물은 다른 사용자가 인용할 수 없습니다. + setting_default_quote_policy_unlisted: 사람들에게 인용된 경우, 인용한 게시물도 유행 타임라인에서 감추게 됩니다. setting_default_sensitive: 민감한 미디어는 기본적으로 가려져 있으며 클릭해서 볼 수 있습니다 setting_display_media_default: 민감함으로 표시된 미디어 가리기 setting_display_media_hide_all: 모든 미디어를 가리기 setting_display_media_show_all: 모든 미디어를 보이기 setting_emoji_style: 에모지 표현 방식. "자동"은 시스템 기본 에모지를 적용하고 그렇지 못하는 오래된 브라우저의 경우 트웨모지를 사용합니다. + setting_quick_boosting_html: 활성화하면 %{boost_icon}부스트 아이콘을 클릭했을 때 부스트/인용 드롭다운 메뉴가 뜨지 않고 바로 부스트하게 됩니다. 인용은 %{options_icon} (옵션) 메뉴 안으로 이동합니다. setting_system_scrollbars_ui: 사파리와 크롬 기반의 데스크탑 브라우저만 적용됩니다 setting_use_blurhash: 그라디언트는 숨겨진 내용의 색상을 기반으로 하지만 상세 내용은 보이지 않게 합니다 setting_use_pending_items: 타임라인의 새 게시물을 자동으로 보여 주는 대신, 클릭해서 나타내도록 합니다 @@ -85,7 +89,7 @@ ko: backups_retention_period: 사용자들은 나중에 다운로드하기 위해 게시물 아카이브를 생성할 수 있습니다. 양수로 설정된 경우 이 아카이브들은 지정된 일수가 지난 후에 저장소에서 자동으로 삭제될 것입니다. bootstrap_timeline_accounts: 이 계정들은 팔로우 추천 목록 상단에 고정됩니다. closed_registrations_message: 새 가입을 차단했을 때 표시됩니다 - content_cache_retention_period: 다른 서버의 모든 게시물(부스트 및 답글 포함)은 해당 게시물에 대한 로컬 사용자의 상호 작용과 관계없이 지정된 일수가 지나면 삭제됩니다. 여기에는 로컬 사용자가 북마크 또는 즐겨찾기로 표시한 게시물도 포함됩니다. 다른 인스턴스 사용자와 주고 받은 비공개 멘션도 손실되며 복원할 수 없습니다. 이 설정은 특수 목적의 인스턴스를 위한 것이며 일반적인 용도의 많은 사용자의 예상이 빗나가게 됩니다. + content_cache_retention_period: "(부스트 및 답글 포함) 다른 서버의 모든 게시물은 해당 게시물에 대한 로컬 사용자의 상호 작용과 관계없이 지정된 일수가 지나면 삭제됩니다. 여기에는 로컬 사용자가 북마크 또는 즐겨찾기로 표시한 게시물도 포함됩니다. 다른 인스턴스 사용자와 주고 받은 개인 멘션도 손실되며 복원할 수 없습니다. 이 설정은 특수 목적의 인스턴스를 위한 것이며 일반적인 용도의 많은 사용자의 예상이 빗나가게 됩니다." custom_css: 사용자 지정 스타일을 웹 버전의 마스토돈에 지정할 수 있습니다. favicon: WEBP, PNG, GIF 또는 JPG. 기본 파비콘을 대체합니다. mascot: 고급 웹 인터페이스의 그림을 대체합니다. @@ -105,7 +109,6 @@ ko: thumbnail: 대략 2:1 비율의 이미지가 서버 정보 옆에 표시됩니다. trendable_by_default: 유행하는 콘텐츠에 대한 수동 승인을 건너뜁니다. 이 설정이 적용된 이후에도 각각의 항목들을 삭제할 수 있습니다. trends: 트렌드는 어떤 게시물, 해시태그 그리고 뉴스 기사가 이 서버에서 인기를 끌고 있는지 보여줍니다. - trends_as_landing_page: 로그아웃한 사용자와 방문자에게 서버 설명 대신 유행하는 내용을 보여줍니다. 유행 기능을 활성화해야 합니다. form_challenge: current_password: 당신은 보안 구역에 진입하고 있습니다 imports: @@ -230,10 +233,12 @@ ko: setting_aggregate_reblogs: 타임라인의 부스트를 그룹화 setting_always_send_emails: 항상 이메일 알림 보내기 setting_auto_play_gif: 애니메이션 GIF를 자동 재생 + setting_boost_modal: 부스트 공개범위 제어 setting_default_language: 게시물 언어 setting_default_privacy: 게시물 공개 범위 setting_default_quote_policy: 인용할 수 있는 사람 setting_default_sensitive: 미디어를 언제나 민감한 콘텐츠로 설정 + setting_delete_modal: 게시물을 삭제하기 전 경고하기 setting_disable_hover_cards: 호버시 프로필 미리보기를 비활성화 setting_disable_swiping: 스와이프 모션 비활성화 setting_display_media: 미디어 표시 @@ -243,6 +248,8 @@ ko: setting_emoji_style: 에모지 스타일 setting_expand_spoilers: 내용 경고로 표시된 게시물을 항상 펼치기 setting_hide_network: 내 인맥 숨기기 + setting_missing_alt_text_modal: 대체텍스트가 없는 미디어를 포함하여 게시하기 전 경고 + setting_quick_boosting: 빠른 부스트 활성화 setting_reduce_motion: 애니메이션 줄이기 setting_system_font_ui: 시스템의 기본 글꼴을 사용 setting_system_scrollbars_ui: 시스템 기본 스크롤바 사용 @@ -276,12 +283,17 @@ ko: content_cache_retention_period: 리모트 콘텐츠 보유 기간 custom_css: 사용자 정의 CSS favicon: 파비콘 + landing_page: 새 방문자를 위한 랜딩 페이지 + local_live_feed_access: 로컬 게시물에 대한 실시간 피드 접근 + local_topic_feed_access: 로컬 게시물에 대한 해시태그와 링크 피드 접근 mascot: 사용자 정의 마스코트 (legacy) media_cache_retention_period: 미디어 캐시 유지 기한 min_age: 최소 연령 제한 peers_api_enabled: API에 발견 된 서버들의 목록 발행 profile_directory: 프로필 책자 활성화 registrations_mode: 누가 가입할 수 있는지 + remote_live_feed_access: 리모트 게시물에 대한 실시간 피드 접근 + remote_topic_feed_access: 리모트 게시물에 대한 해시태그와 링크 피드 접근 require_invite_text: 가입 하는 이유를 필수로 입력하게 하기 show_domain_blocks: 도메인 차단 보여주기 show_domain_blocks_rationale: 왜 도메인이 차단되었는지 보여주기 @@ -296,7 +308,6 @@ ko: thumbnail: 서버 썸네일 trendable_by_default: 사전 리뷰 없이 트렌드에 오르는 것을 허용 trends: 유행 활성화 - trends_as_landing_page: 유행을 방문 페이지로 쓰기 interactions: must_be_follower: 나를 팔로우 하지 않는 사람에게서 온 알림을 차단 must_be_following: 내가 팔로우 하지 않는 사람에게서 온 알림을 차단 diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index e96f97c1a..9b626e3c1 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -95,7 +95,6 @@ lad: thumbnail: Una imaje de aproksimadamente 2:1 se amostra djunto a la enformasyon de tu sirvidor. trendable_by_default: Omite la revizyon manuala del kontenido en trend. Los elementos individuales ainda podran supremirse de los trendes. trends: Los trendes amostran ke mesajes, etiketas i haberes estan ganando traksyon en tu sirvidor. - trends_as_landing_page: Amostra kontenido en trend para utilizadores i vizitantes en lugar de una deskripsyon de este sirvidor. Rekiere ke los trendes esten kapasitados. form_challenge: current_password: Estas entrando en un area siguro imports: @@ -245,6 +244,7 @@ lad: favicon: Ikona de favoritos mascot: Maskota personalizada (legado) media_cache_retention_period: Periodo de retensyon de kashe multimedia + min_age: Edad minima rekerida peers_api_enabled: Publika lista de sirvidores diskuviertos en la API profile_directory: Kapasita katalogo de profiles registrations_mode: Ken puede enrejistrarse @@ -262,7 +262,6 @@ lad: thumbnail: Minyatura del sirvidor trendable_by_default: Permite trendes sin revizyon previa trends: Kapasita trendes - trends_as_landing_page: Kulanea trendes komo la pajina prinsipala interactions: must_be_follower: Bloka avizos de personas ke no te sigen must_be_following: Bloka avizos de personas a las kualas no siges @@ -314,6 +313,7 @@ lad: terms_of_service_generator: choice_of_law: Legislasyon aplikavle domain: Domeno + min_age: Edad minima user: date_of_birth_1i: Diya date_of_birth_2i: Mez @@ -326,6 +326,8 @@ lad: name: Nombre permissions_as_keys: Permisos position: Priorita + username_block: + allow_with_approval: Permite enrejistrasyones kon aprovasyon webhook: events: Evenimientos kapasitados template: Modelo de kontenido diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index f48b88999..bd510a3eb 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -92,7 +92,6 @@ lt: site_extended_description: Bet kokia papildoma informacija, kuri gali būti naudinga lankytojams ir naudotojams. Gali būti struktūrizuota naudojant Markdown sintaksę. thumbnail: Maždaug 2:1 dydžio vaizdas, rodomas šalia tavo serverio informacijos. trends: Trendai rodo, kurios įrašai, saitažodžiai ir naujienų istorijos tavo serveryje sulaukia didžiausio susidomėjimo. - trends_as_landing_page: Rodyti tendencingą turinį atsijungusiems naudotojams ir lankytojams vietoj šio serverio aprašymo. Reikia, kad tendencijos būtų įjungtos. imports: data: CSV failas, eksportuotas iš kito „Mastodon“ serverio. invite_request: @@ -208,7 +207,6 @@ lt: thumbnail: Serverio miniatūra trendable_by_default: Leisti tendencijas be išankstinės peržiūros trends: Įjungti tendencijas - trends_as_landing_page: Naudoti tendencijas kaip nukreipimo puslapį invite: comment: Komentuoti invite_request: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 1c228ffab..d43d89e03 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -104,7 +104,6 @@ lv: thumbnail: Aptuveni 2:1 attēls, kas tiek parādīts kopā ar tava servera informāciju. trendable_by_default: Izlaist aktuālā satura manuālu pārskatīšanu. Atsevišķas preces joprojām var noņemt no tendencēm pēc fakta. trends: Tendences parāda, kuras ziņas, atsauces un ziņu stāsti gūst panākumus tavā serverī. - trends_as_landing_page: Šī servera apraksta vietā rādīt aktuālo saturu lietotājiem un apmeklētājiem, kuri ir atteikušies. Nepieciešams iespējot tendences. form_challenge: current_password: Tu ieej drošā zonā imports: @@ -282,7 +281,6 @@ lv: thumbnail: Servera sīkbilde trendable_by_default: Atļaut tendences bez iepriekšējas pārskatīšanas trends: Iespējot tendences - trends_as_landing_page: Izmantojiet tendences kā galveno lapu interactions: must_be_follower: Bloķēt paziņojumus no ne-sekotājiem must_be_following: Bloķēt paziņojumus no cilvēkiem, kuriem tu neseko diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml index 1395ff838..e4ed284c3 100644 --- a/config/locales/simple_form.ms.yml +++ b/config/locales/simple_form.ms.yml @@ -93,7 +93,6 @@ ms: thumbnail: Imej kira-kira 2:1 dipaparkan bersama maklumat server anda. trendable_by_default: Langkau semakan manual kandungan sohor kini. Item individu masih boleh dialih keluar daripada trend selepas fakta itu. trends: Aliran menunjukkan pos, hashtag dan cerita berita yang mendapat tarikan pada server anda. - trends_as_landing_page: Tunjukkan kandungan trend kepada pengguna dan pelawat yang log keluar dan bukannya penerangan tentang server ini. Memerlukan trend untuk didayakan. form_challenge: current_password: Anda sedang memasuki kawasan selamat imports: @@ -255,7 +254,6 @@ ms: thumbnail: Server thumbnail trendable_by_default: Benarkan aliran tanpa semakan terlebih dahulu trends: Dayakan trend - trends_as_landing_page: Gunakan trend sebagai halaman pendaratan interactions: must_be_follower: Sekat pemberitahuan daripada bukan pengikut must_be_following: Sekat pemberitahuan daripada orang yang anda tidak ikuti diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index a1f5d9899..6f45a51eb 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -92,7 +92,6 @@ my: thumbnail: သင့်ဆာဗာအချက်အလက်နှင့်အတူ အကြမ်းဖျင်းအားဖြင့် ၂:၁ ဖြင့် ပြသထားသောပုံတစ်ပုံ။ trendable_by_default: ခေတ်စားနေသော အကြောင်းအရာများ၏ ကိုယ်တိုင်သုံးသပ်ချက်ကို ကျော်ပါ။ နောက်ပိုင်းတွင် အချက်အလက်တစ်ခုချင်းစီကို ခေတ်စားနေသောအကြောင်းအရာများကဏ္ဍမှ ဖယ်ရှားနိုင်ပါသေးသည်။ trends: လက်ရှိခေတ်စားနေသာပို့စ်များ၊ hashtag များနှင့် သတင်းဇာတ်လမ်းများကို သင့်ဆာဗာပေါ်တွင် တွေ့မြင်နိုင်ပါမည်။ - trends_as_landing_page: ဤဆာဗာဖော်ပြချက်အစား အကောင့်မှ ထွက်ထားသူများနှင့် ဝင်ရောက်ကြည့်ရှုသူများအတွက် ခေတ်စားနေသော အကြောင်းအရာများကို ပြသပါ။ ခေတ်စားနေသောပို့စ်များကို ဖွင့်ထားရန် လိုအပ်သည်။ form_challenge: current_password: သင်သည် လုံခြုံသောနေရာသို့ ဝင်ရောက်နေပါသည် imports: @@ -251,7 +250,6 @@ my: thumbnail: ဆာဗာ ပုံသေး trendable_by_default: ကြိုမသုံးသပ်ဘဲ ခေတ်စားနေသောအကြောင်းအရာများကို ခွင့်ပြုပါ trends: လက်ရှိခေတ်စားနေမှုများကိုပြပါ - trends_as_landing_page: ခေတ်စားနေသောပို့စ်များကို landing စာမျက်နှာအဖြစ် အသုံးပြုပါ interactions: must_be_follower: စောင့်ကြည့်မနေသူများထံမှ အသိပေးချက်များကို ပိတ်ပါ must_be_following: သင် စောင့်ကြည့်မထားသူများထံမှ အသိပေးချက်များကို ပိတ်ပါ diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 5603213f8..36522a669 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -93,6 +93,7 @@ nl: content_cache_retention_period: Alle berichten van andere servers (inclusief boosts en reacties) worden verwijderd na het opgegeven aantal dagen, ongeacht enige lokale gebruikersinteractie met die berichten. Dit betreft ook berichten die een lokale gebruiker aan diens bladwijzers heeft toegevoegd of als favoriet heeft gemarkeerd. Privéberichten tussen gebruikers van verschillende servers gaan ook verloren en zijn onmogelijk te herstellen. Het gebruik van deze instelling is bedoeld voor servers die een speciaal doel dienen en overtreedt veel gebruikersverwachtingen wanneer deze voor algemeen gebruik wordt geïmplementeerd. custom_css: Je kunt aangepaste CSS toepassen op de webversie van deze Mastodon-server. favicon: WEBP, PNG, GIF of JPG. Vervangt de standaard Mastodon favicon met een aangepast pictogram. + landing_page: Selecteert welke pagina nieuwe bezoekers te zien krijgen wanneer ze voor het eerst op jouw server terechtkomen. Wanneer je ‘Trends’ selecteert, moeten trends ingeschakeld zijn onder 'Serverinstellingen > Ontdekken'. Als je ‘Lokale tijdlijn’ selecteert, moet ‘Toegang tot openbare lokale berichten’ worden ingesteld op ‘Iedereen’ onder 'Serverinstellingen > Ontdekken'. mascot: Overschrijft de illustratie in de geavanceerde webomgeving. media_cache_retention_period: Mediabestanden van berichten van externe gebruikers worden op jouw server in de cache opgeslagen. Indien ingesteld op een positieve waarde, worden media verwijderd na het opgegeven aantal dagen. Als de mediagegevens worden opgevraagd nadat ze zijn verwijderd, worden ze opnieuw gedownload wanneer de originele inhoud nog steeds beschikbaar is. Vanwege beperkingen op hoe vaak linkvoorbeelden sites van derden raadplegen, wordt aanbevolen om deze waarde in te stellen op ten minste 14 dagen. Anders worden linkvoorbeelden niet op aanvraag bijgewerkt. min_age: Gebruikers krijgen tijdens hun inschrijving de vraag om hun geboortedatum te bevestigen @@ -110,7 +111,6 @@ nl: thumbnail: Een afbeelding van ongeveer een verhouding van 2:1 die naast jouw serverinformatie wordt getoond. trendable_by_default: Handmatige beoordeling van trends overslaan. Individuele items kunnen later alsnog worden afgekeurd. trends: Trends laten zien welke berichten, hashtags en nieuwsberichten op jouw server aan populariteit winnen. - trends_as_landing_page: Toon trending inhoud aan uitgelogde gebruikers en bezoekers in plaats van een beschrijving van deze server. Vereist dat trends zijn ingeschakeld. form_challenge: current_password: Je betreedt een veilige omgeving imports: @@ -287,6 +287,7 @@ nl: content_cache_retention_period: Bewaartermijn voor externe inhoud custom_css: Aangepaste CSS favicon: Favicon + landing_page: Landingspagina voor nieuwe bezoekers local_live_feed_access: Toegang tot openbare lokale berichten local_topic_feed_access: Toegang tot overzicht met lokale hashtags en links mascot: Aangepaste mascotte (legacy) @@ -311,7 +312,6 @@ nl: thumbnail: Server-miniatuur trendable_by_default: Trends goedkeuren zonder voorafgaande beoordeling trends: Trends inschakelen - trends_as_landing_page: Laat trends op de startpagina zien interactions: must_be_follower: Meldingen van mensen die jou niet volgen blokkeren must_be_following: Meldingen van mensen die jij niet volgt blokkeren diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index a536fdf99..d864464b5 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -93,6 +93,7 @@ nn: content_cache_retention_period: Alle innlegg frå andre tenarar (inkludert framhevingar og svar) vil bli sletta etter talet på dagar du skriv inn, uansett om nokon har samhandla med desse innlegga. Dette inkluderer innlegg der ein lokal brukar har merka det som bokmerke eller som favoritt. Private omtalar mellom brukarar frå ulike nettstader vil gå tapt og vera umogleg å gjenskapa. Bruk av denne innstillinga er meint for spesielle nettstader og bryt med det mange forventar av ein vanleg nettstad. custom_css: Du kan bruka eigendefinerte stilar på nettversjonen av Mastodon. favicon: WEBP, PNG, GIF eller JPG. Overstyrer det standarde Mastodon-favikonet med eit eigendefinert ikon. + landing_page: Vel kva side nye lesarar ser når dei kjem til tenaren din. Viss du vel «Populært», må du ha skrudd på dette i innstillingane for oppdaging. Viss du vel «Lokalstraum», må du la alle få sjå lokale straumar i innstillingane for oppdaging. mascot: Overstyrer illustrasjonen i det avanserte webgrensesnittet. media_cache_retention_period: Mediafiler frå innlegg laga av eksterne brukarar blir bufra på serveren din. Når sett til ein positiv verdi, slettast media etter eit gitt antal dagar. Viss mediedata blir førespurt etter det er sletta, vil dei bli lasta ned på nytt viss kjelda sitt innhald framleis er tilgjengeleg. På grunn av restriksjonar på kor ofte lenkeførehandsvisningskort lastar tredjepart-nettstadar, rådast det til å setje denne verdien til minst 14 dagar, eller at førehandsvisningskort ikkje blir oppdatert på førespurnad før det tidspunktet. min_age: Brukarane vil bli bedne om å stadfesta fødselsdatoen sin når dei registrerer seg @@ -110,7 +111,6 @@ nn: thumbnail: Eit omlag 2:1 bilete vist saman med informasjon om tenaren. trendable_by_default: Hopp over manuell gjennomgang av populært innhald. Enkeltståande innlegg kan fjernast frå trendar i etterkant. trends: Trendar viser kva for nokre innlegg, emneknaggar og nyheiter som er populære på tenaren. - trends_as_landing_page: Vis populært innhald til utlogga brukarar og folk som kjem innom sida i staden for ei skildring av tenaren. Du må ha skrudd på trendar for å kunna bruka dette. form_challenge: current_password: Du går inn i eit trygt område imports: @@ -287,6 +287,7 @@ nn: content_cache_retention_period: Oppbevaringstid for eksternt innhald custom_css: Egendefinert CSS favicon: Favorittikon + landing_page: Startside for nye lesarar local_live_feed_access: Tilgang til direktestraumar med lokale innlegg local_topic_feed_access: Tilgang til merkelapp- og lenkestraumar med lokale innlegg mascot: Eigendefinert maskot (eldre funksjon) @@ -311,7 +312,6 @@ nn: thumbnail: Miniatyrbilete for tenaren trendable_by_default: Tillat trendar utan gjennomgang på førehand trends: Aktiver trendar - trends_as_landing_page: Bruk trendar som startside interactions: must_be_follower: Blokker varsel frå folk som ikkje fylgjer deg must_be_following: Blokker varsel frå folk du ikkje fylgjer diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index d209887e6..b1afd7e80 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -94,7 +94,6 @@ thumbnail: Et omtrent 2:1 bilde vist sammen med serverinformasjonen din. trendable_by_default: Hopp over manuell gjennomgang av populære innhold. Individuelle elementer kan fjernes fra populært etter faktaen. trends: Trender viser hvilke innlegg, emneknagger og nyheter som får trekkraft på serveren din. - trends_as_landing_page: Vis populære innhold til innloggede brukere og besøkende i stedet for en beskrivelse av tjeneren. Krever populært for å bli aktivert. form_challenge: current_password: Du går inn i et sikkert område imports: @@ -254,7 +253,6 @@ thumbnail: Miniatyrbilde til server trendable_by_default: Tillat trender uten foregående vurdering trends: Aktiver trender - trends_as_landing_page: Bruk trender som landingsside interactions: must_be_follower: Blokker varslinger fra ikke-følgere must_be_following: Blokker varslinger fra personer du ikke følger diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 4c71ee99d..5cc3c85ce 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -54,14 +54,18 @@ pl: password: Użyj co najmniej 8 znaków phrase: Zostanie wykryte nawet, gdy znajduje się za ostrzeżeniem o zawartości scopes: Wybór API, do których aplikacja będzie miała dostęp. Jeżeli wybierzesz nadrzędny zakres, nie musisz wybierać jego elementów. + setting_advanced_layout: Wyświetlaj Mastodona w układzie wielokolumnowym, umożliwiającym przeglądanie osi czasu, powiadomień oraz trzeciej kolumny według własnego wyboru. Niezalecane w przypadku mniejszych ekranów. setting_aggregate_reblogs: Nie pokazuj nowych podbić dla wpisów, które zostały niedawno podbite (dotyczy tylko nowo otrzymanych podbić) setting_always_send_emails: Powiadomienia e-mail zwykle nie będą wysyłane, gdy używasz Mastodon - setting_default_quote_policy: To ustawienie będzie skuteczne tylko dla postów utworzonych z następną wersją Mastodon, ale możesz wybrać swoje preferencje w przygotowaniu. + setting_boost_modal: Po włączeniu tej funkcji najpierw otworzy się okno potwierdzenia podbicia, w którym można zmienić jego widoczność. + setting_default_quote_policy_private: Wpisy publikowane na Mastodonie wyłącznie dla obserwujących nie mogą być cytowane przez inne osoby. + setting_default_quote_policy_unlisted: Kiedy ktoś cytuje twoje wpisy, będą one również ukryte na popularnych osiach czasu. setting_default_sensitive: Wrażliwe multimedia są domyślnie schowane i mogą być odkryte kliknięciem setting_display_media_default: Ukrywaj zawartość multimedialną oznaczoną jako wrażliwa setting_display_media_hide_all: Zawsze ukrywaj zawartość multimedialną setting_display_media_show_all: Zawsze pokazuj zawartość multimedialną setting_emoji_style: Jak wyświetlić emotikony. "Auto" spróbuje użyć natywnych emoji, ale wróci do Twemoji dla starszych przeglądarek. + setting_quick_boosting_html: Po włączeniu tej opcji kliknięcie ikonki %{boost_icon} spowoduje natychmiastowe podbicie zamiast otwarcia menu rozwijanego z opcją podbicia lub cytatu. Przenosi to akcję cytowania do menu %{options_icon} (Opcje). setting_system_scrollbars_ui: Stosuje się tylko do przeglądarek komputerowych opartych na Safari i Chrome setting_use_blurhash: Gradienty są oparte na kolorach ukrywanej zawartości, ale uniewidaczniają wszystkie szczegóły setting_use_pending_items: Ukryj aktualizacje osi czasu za kliknięciem, zamiast automatycznego przewijania strumienia @@ -106,7 +110,6 @@ pl: thumbnail: Obraz o proporcjach mniej więcej 2:1 wyświetlany obok informacji o serwerze. trendable_by_default: Pomiń ręczny przegląd treści trendów. Pojedyncze elementy nadal mogą być usuwane z trendów po fakcie. trends: Tendencje pokazują, które posty, hasztagi i newsy zyskują popularność na Twoim serwerze. - trends_as_landing_page: Pokaż najpopularniejsze treści niezalogowanym użytkownikom i odwiedzającym zamiast opisu tego serwera. Wymaga włączenia trendów. form_challenge: current_password: Wchodzisz w strefę bezpieczną imports: @@ -235,9 +238,12 @@ pl: setting_aggregate_reblogs: Grupuj podbicia na osiach czasu setting_always_send_emails: Zawsze wysyłaj powiadomienia e-mail setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy + setting_boost_modal: Kontroluj widoczność podbić setting_default_language: Język wpisów + setting_default_privacy: Widoczność wpisów setting_default_quote_policy: Kto może cytować setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą + setting_delete_modal: Ostrzegaj mnie przed usunięciem wpisu setting_disable_hover_cards: Wyłącz podgląd profilu po najechaniu setting_disable_swiping: Wyłącz ruchy przesuwania setting_display_media: Wyświetlanie zawartości multimedialnej @@ -247,6 +253,8 @@ pl: setting_emoji_style: Styl emoji setting_expand_spoilers: Zawsze rozwijaj wpisy oznaczone ostrzeżeniem o zawartości setting_hide_network: Ukryj swoją sieć + setting_missing_alt_text_modal: Ostrzegaj mnie przed publikowaniem multimediów bez tekstu alternatywnego + setting_quick_boosting: Włącz szybkie podbijanie setting_reduce_motion: Ogranicz ruch w animacjach setting_system_font_ui: Używaj domyślnej czcionki systemu setting_system_scrollbars_ui: Używaj domyślnego paska przewijania systemu @@ -280,12 +288,16 @@ pl: content_cache_retention_period: Okres zachowywania zdalnych treści custom_css: Niestandardowy CSS favicon: Favicon + local_live_feed_access: Uzyskaj dostęp do kanałów zawierających lokalne wpisy + local_topic_feed_access: Uzyskaj dostęp do hashtagów i linków zawierających lokalne wpisy mascot: Własna ikona media_cache_retention_period: Okres przechowywania pamięci podręcznej min_age: Wymagany minimalny wiek peers_api_enabled: Opublikuj listę odkrytych serwerów w API profile_directory: Włącz katalog profilów registrations_mode: Kto może się zarejestrować + remote_live_feed_access: Uzyskaj dostęp do kanałów zawierających zdalne wpisy + remote_topic_feed_access: Uzyskaj dostęp do hashtagów i linków zawierających zdalne wpisy require_invite_text: Wymagaj powodu, aby dołączyć show_domain_blocks: Pokazuj zablokowane domeny show_domain_blocks_rationale: Pokaż dlaczego domeny zostały zablokowane @@ -300,7 +312,6 @@ pl: thumbnail: Miniaturka serwera trendable_by_default: Zezwalaj na trendy bez wcześniejszego przeglądu trends: Włącz trendy - trends_as_landing_page: Użyj trendów jako strony początkowej interactions: must_be_follower: Nie wyświetlaj powiadomień od osób, które Cię nie obserwują must_be_following: Nie wyświetlaj powiadomień od osób, których nie obserwujesz diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 90a0afcb0..4ba1bae9f 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -44,7 +44,7 @@ pt-BR: bot: Sinaliza aos outros de que essa conta executa principalmente ações automatizadas e pode não ser monitorada context: Um ou mais contextos onde o filtro deve atuar current_password: Para fins de segurança, digite a senha da conta atual - current_username: Para confirmar, digite o nome de usuário da conta atual + current_username: Para confirmar, entre com nome de usuário da conta atual digest: Enviado apenas após um longo período de inatividade com um resumo das menções recebidas durante ausência email: Você receberá um e-mail de confirmação header: WEBP, PNG, GIF ou JPG. No máximo %{size}. Será reduzido para %{dimensions}px @@ -54,13 +54,18 @@ pt-BR: password: Use pelo menos 8 caracteres phrase: Corresponderá independente de maiúsculas ou minúsculas, no texto ou no Aviso de Conteúdo de um toot scopes: Quais APIs o aplicativo vai ter permissão de acessar. Se você selecionar uma autorização de alto nível, você não precisa selecionar individualmente os outros. + setting_advanced_layout: Exiba o Mastodon em um layout de várias colunas, permitindo que você visualize a linha do tempo, as notificações e uma terceira coluna de sua escolha. Não recomendado para telas menores. setting_aggregate_reblogs: Não mostrar novos impulsos para publicações que já foram impulsionadas recentemente (afeta somente os impulsos mais recentes) setting_always_send_emails: Normalmente, as notificações por e-mail não serão enviadas enquanto você estiver usando ativamente o Mastodon + setting_boost_modal: Quando ativada, a função de impulsionar primeiro abrirá uma caixa de diálogo de confirmação na qual você poderá alterar a visibilidade do seu impulsionamento. + setting_default_quote_policy_private: Publicações exclusivas de seguidores criadas no Mastodon não podem ser citadas por outras pessoas. + setting_default_quote_policy_unlisted: Quando as pessoas citarem você, suas publicações também ficarão ocultas da linha do tempo. setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique setting_display_media_default: Sempre ocultar mídia sensível setting_display_media_hide_all: Sempre ocultar todas as mídias setting_display_media_show_all: Sempre mostrar mídia sensível setting_emoji_style: Como exibir emojis. "Automáticos" tentará usar emojis nativos, mas voltará para o Twemoji para navegadores legados. + setting_quick_boosting_html: Quando ativado, clicar no ícone de impulsionamento %{boost_icon} impulsionará imediatamente o texto, em vez de abrir o menu suspenso de impulsionamento/cotação. Move a ação de cotação para o menu %{options_icon} (Opções). setting_system_scrollbars_ui: Se aplica apenas para navegadores de computador baseado no Safari e Chrome setting_use_blurhash: O blur é baseado nas cores da imagem oculta, ofusca a maioria dos detalhes setting_use_pending_items: Ocultar atualizações da linha do tempo atrás de um clique ao invés de rolar automaticamente @@ -88,6 +93,7 @@ pt-BR: content_cache_retention_period: Todas as postagens de outros servidores (incluindo boosts e respostas) serão excluídas após o número especificado de dias, sem levar a qualquer interação do usuário local com esses posts. Isto inclui postagens onde um usuário local o marcou como favorito ou favoritos. Menções privadas entre usuários de diferentes instâncias também serão perdidas e impossíveis de restaurar. O uso desta configuração destina-se a instâncias especiais de propósitos e quebra muitas expectativas dos usuários quando implementadas para uso de propósito geral. custom_css: Você pode aplicar estilos personalizados na versão da web do Mastodon. favicon: WEBP, PNG, GIF ou JPG. Sobrescreve o favicon padrão do Mastodon com um ícone personalizado. + landing_page: Seleciona a página que os novos visitantes veem ao acessar seu servidor pela primeira vez. Se você selecionar "Tendências", as tendências precisam estar ativadas nas Configurações de Descoberta. Se você selecionar "Feed local", o "Acesso a feeds ao vivo com publicações locais" precisa estar definido como "Todos" nas Configurações de Descoberta. mascot: Substitui a ilustração na interface web avançada. media_cache_retention_period: Arquivos de mídia de mensagens de usuários remotos são armazenados em cache no seu servidor. Quando definido como valor positivo, a mídia será excluída após o número especificado de dias. Se os dados da mídia forem solicitados depois de excluídos, eles serão baixados novamente, se o conteúdo fonte ainda estiver disponível. Devido a restrições de quantas vezes os cartões de visualização de links sondam sites de terceiros, é recomendado definir este valor em pelo menos 14 dias, ou pré-visualização de links não serão atualizados a pedido antes desse tempo. min_age: Os usuários precisarão confirmar sua data de nascimento no cadastro @@ -105,7 +111,6 @@ pt-BR: thumbnail: Uma imagem de aproximadamente 2:1 exibida ao lado da informação de sua instância. trendable_by_default: Pular a revisão manual do conteúdo em tendência. Itens individuais ainda poderão ser removidos das tendências após a sua exibição. trends: Tendências mostram quais publicações, hashtags e notícias estão ganhando destaque na sua instância. - trends_as_landing_page: Mostrar conteúdo de tendências para usuários deslogados e visitantes em vez de uma descrição deste servidor. Requer que as tendências sejam ativadas. form_challenge: current_password: Você está entrando em uma área segura imports: @@ -232,10 +237,12 @@ pt-BR: setting_aggregate_reblogs: Agrupar boosts nas linhas setting_always_send_emails: Sempre enviar notificações por e-mail setting_auto_play_gif: Reproduzir GIFs automaticamente + setting_boost_modal: Controle que aumenta a visibilidade setting_default_language: Idioma dos toots setting_default_privacy: Visibilidade da publicação setting_default_quote_policy: Quem pode citar setting_default_sensitive: Sempre marcar mídia como sensível + setting_delete_modal: Avise-me antes de apagar uma publicação setting_disable_hover_cards: Desativar visualização de perfil ao passar o mouse por cima setting_disable_swiping: Desabilitar movimentos deslizantes setting_display_media: Exibição das mídias @@ -245,6 +252,8 @@ pt-BR: setting_emoji_style: Estilo de emoji setting_expand_spoilers: Sempre expandir toots com Aviso de Conteúdo setting_hide_network: Ocultar suas relações + setting_missing_alt_text_modal: Avise-me antes de publicar mídia sem texto alternado + setting_quick_boosting: Ativar aceleração rápida setting_reduce_motion: Reduzir animações setting_system_font_ui: Usar fonte padrão do sistema setting_system_scrollbars_ui: Usar barra de rolagem padrão do sistema @@ -278,12 +287,17 @@ pt-BR: content_cache_retention_period: Período de retenção de conteúdo remoto custom_css: CSS personalizável favicon: Favicon + landing_page: Página inicial para novos visitantes + local_live_feed_access: Acessar feeds ao vivo com destaque em publicações locais + local_topic_feed_access: Acessar hasthtag e endereços de feed com destaque em publicações locais mascot: Mascote personalizado (legado) media_cache_retention_period: Período de retenção do cachê de mídia min_age: Requisito de idade mínimia peers_api_enabled: Publicar lista de instâncias de servidor descobertas na API profile_directory: Ativar diretório de perfis registrations_mode: Quem pode se inscrever + remote_live_feed_access: Acessar feeds ao vivo com destaque em publicações antigas + remote_topic_feed_access: Acessar hasthtag e endereços de feed com destaque em publicações antigas require_invite_text: Exigir uma razão para entrar show_domain_blocks: Mostrar domínios bloqueados show_domain_blocks_rationale: Mostrar por que domínios foram bloqueados @@ -298,7 +312,6 @@ pt-BR: thumbnail: Miniatura do servidor trendable_by_default: Permitir tendências sem revisão prévia trends: Habilitar tendências - trends_as_landing_page: Usar tendências como página inicial interactions: must_be_follower: Bloquear notificações de não-seguidores must_be_following: Bloquear notificações de não-seguidos diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 95b1b24f8..e8aa2692e 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -54,8 +54,10 @@ pt-PT: password: Use pelo menos 8 caracteres phrase: Será correspondido independentemente da capitalização ou do aviso de conteúdo duma publicação scopes: Quais as API a que a aplicação terá permissão para aceder. Se selecionar um âmbito de nível superior, não precisa de selecionar âmbitos individuais. - setting_aggregate_reblogs: Não mostrar os novos impulsos para publicações que tenham sido recentemente impulsionadas (apenas afeta os impulsos recentemente recebidos) + setting_advanced_layout: Exibe o Mastodon num layout com várias colunas, permitindo-lhe visualizar a cronologia, as notificações e uma terceira coluna à sua escolha. Não recomendado para ecrãs mais pequenos. + setting_aggregate_reblogs: Não mostrar as novas partilhas para publicações que tenham sido partilhadas recentemente (apenas afeta as partilhas recebidas recentemente) setting_always_send_emails: Normalmente as notificações por e-mail não serão enviadas quando estiver a utilizar ativamente o Mastodon + setting_boost_modal: Quando ativado, ao partilhar abrirá primeiro uma caixa de diálogo de confirmação onde poderá alterar a visibilidade da sua partilha. setting_default_quote_policy_private: As publicações exclusivas para seguidores criadas no Mastodon não podem ser citadas por outras pessoas. setting_default_quote_policy_unlisted: Quando as pessoas o citarem, as respetivas publicações também serão ocultadas dos destaques. setting_default_sensitive: Os multimédia sensíveis são ocultados por predefinição e podem ser revelados com um clique/toque @@ -63,6 +65,7 @@ pt-PT: setting_display_media_hide_all: Esconder sempre toda a multimédia setting_display_media_show_all: Mostrar sempre a multimédia setting_emoji_style: Como apresentar emojis. "Auto" tenta usar emojis nativos, mas reverte para Twemoji em navegadores mais antigos. + setting_quick_boosting_html: Quando ativado, clicar no ícone %{boost_icon} Partilhar irá de imediato partilhar ao invés de abrir o menu de Partilhar/Citar. Relocaliza a ação Citar para o menu %{options_icon} (Opções). setting_system_scrollbars_ui: Aplica-se apenas a navegadores de desktop baseados no Safari e Chrome setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer pormenores setting_use_pending_items: Ocultar as atualizações da cronologia após um clique em vez de percorrer automaticamente a cronologia @@ -87,11 +90,12 @@ pt-PT: backups_retention_period: Os utilizadores têm a possibilidade de gerar arquivos das suas publicações para descarregar mais tarde. Quando definido para um valor positivo, estes arquivos serão automaticamente eliminados do seu armazenamento após o número de dias especificado. bootstrap_timeline_accounts: Estas contas serão destacadas no topo das recomendações aos novos utilizadores. closed_registrations_message: Apresentado quando as inscrições estiverem encerradas - content_cache_retention_period: Todas as mensagens de outros servidores (incluindo impulsos e respostas) serão eliminadas após o número de dias especificado, independentemente de qualquer interação do utilizador local com essas mensagens. Isto inclui mensagens em que um utilizador local as tenha marcado ou adicionado aos favoritos. As menções privadas entre utilizadores de instâncias diferentes também se perderão e serão impossíveis de restaurar. A utilização desta definição destina-se a instâncias para fins especiais e quebra muitas expectativas dos utilizadores quando implementada para utilização geral. + content_cache_retention_period: Todas as publicações de outros servidores (incluindo partilhas e respostas) serão eliminadas após o número de dias especificado, independentemente de qualquer interação do utilizador local com essas publicações. Isto inclui mensagens em que um utilizador local as tenha salvo ou adicionado aos favoritos. As menções privadas entre utilizadores de instâncias diferentes também se perderão e serão impossíveis de recuperar. A utilização desta definição destina-se a instâncias para fins especiais e quebra muitas expectativas dos utilizadores quando implementada para utilização geral. custom_css: Pode aplicar estilos personalizados na versão web do Mastodon. favicon: WEBP, PNG, GIF ou JPG. Substitui o ícone de favorito padrão do Mastodon por um ícone personalizado. + landing_page: Seleciona a página que os novos visitantes veem quando chegam ao seu servidor pela primeira vez. Se selecionar «Tendências», então as tendências precisam estar ativas nas Definições de Descoberta. Se selecionar «Cronologia local», então «Acesso a cronologias com publicações locais em destaque» precisa de estar definido como «Todos» nas Definições de Descoberta. mascot: Sobrepõe-se à ilustração na interface web avançada. - media_cache_retention_period: Os ficheiros multimédia de publicações feitas por utilizadores remotos são armazenados em cache no seu servidor. Quando definido para um valor positivo, os ficheiros multimédia serão eliminados após o número de dias especificado. Se os ficheiros multimédia forem solicitados depois de terem sido eliminados, serão transferidos novamente, se o conteúdo de origem ainda estiver disponível. Devido a restrições sobre a frequência com que os cartões de pré-visualização de links pesquisam sites de terceiros, recomenda-se que este valor seja definido para, pelo menos, 14 dias, ou os cartões de pré-visualização de links não serão atualizados a pedido antes desse período. + media_cache_retention_period: Os ficheiros multimédia de publicações feitas por utilizadores remotos são armazenados em cache no seu servidor. Quando definido para um valor positivo, os ficheiros multimédia serão eliminados após o número de dias especificado. Se os ficheiros multimédia forem solicitados depois de terem sido eliminados, serão transferidos novamente, se o conteúdo de origem ainda estiver disponível. Devido a restrições sobre a frequência com que os cartões de pré-visualização de hiperligação pesquisam sites de terceiros, recomenda-se que este valor seja definido para, pelo menos, 14 dias, ou os cartões de pré-visualização de hiperligação não serão atualizados a pedido antes desse período. min_age: Os utilizadores serão convidados a confirmar a sua data de nascimento durante o processo de inscrição peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no fediverso. Nenhum dado é incluído aqui sobre se você federa com um determinado servidor, apenas que o seu servidor o conhece. Este serviço é utilizado por serviços que recolhem estatísticas na federação, em termos gerais. profile_directory: O diretório de perfis lista todos os utilizadores que optaram por ter a sua conta a ser sugerida a outros. @@ -107,7 +111,6 @@ pt-PT: thumbnail: Uma imagem de cerca de 2:1, apresentada ao lado da informação do seu servidor. trendable_by_default: Ignorar a revisão manual do conteúdo em destaque. Os itens individuais poderão ainda assim ser posteriormente removidos das tendências. trends: As tendências mostram quais as publicações, etiquetas e notícias que estão a ganhar destaque no seu servidor. - trends_as_landing_page: Mostrar conteúdo em destaque a utilizadores sem sessão iniciada e visitantes, ao invés de uma descrição deste servidor. Requer que os destaques estejam ativados. form_challenge: current_password: Está a entrar numa área segura imports: @@ -231,13 +234,15 @@ pt-PT: password: Palavra-passe phrase: Palavra-chave ou frase setting_advanced_layout: Ativar interface web avançada - setting_aggregate_reblogs: Agrupar impulsos em linhas de tempo + setting_aggregate_reblogs: Agrupar partilhas nas cronologias setting_always_send_emails: Enviar sempre notificações por e-mail setting_auto_play_gif: Reproduzir GIF automaticamente + setting_boost_modal: Controlar visibilidade da partilha setting_default_language: Idioma de publicação setting_default_privacy: Visibilidade da publicação setting_default_quote_policy: Quem pode citar setting_default_sensitive: Marcar sempre os multimédia como sensíveis + setting_delete_modal: Avisar-me antes de eliminar uma publicação setting_disable_hover_cards: Desativar visualização de perfil ao passar o cursor setting_disable_swiping: Desativar os movimentos de deslize setting_display_media: Visualização de multimédia @@ -247,6 +252,8 @@ pt-PT: setting_emoji_style: Estilo de emojis setting_expand_spoilers: Expandir sempre as publicações marcadas com avisos de conteúdo setting_hide_network: Esconder a tua rede + setting_missing_alt_text_modal: Avisar-me antes de publicar media sem texto alternativo + setting_quick_boosting: Ativar partilha rápida setting_reduce_motion: Reduzir movimento em animações setting_system_font_ui: Usar o tipo de letra padrão do sistema setting_system_scrollbars_ui: Utilizar a barra de deslocação predefinida do sistema @@ -280,12 +287,17 @@ pt-PT: content_cache_retention_period: Período de retenção de conteúdos remotos custom_css: CSS personalizado favicon: Ícone de favoritos + landing_page: Página inicial para novos visitantes + local_live_feed_access: Acesso a cronologias com publicações locais em destaque + local_topic_feed_access: Acesso a cronologias de etiquetas e hiperligações de publicações locais em destaque mascot: Mascote personalizada (legado) media_cache_retention_period: Período de retenção de ficheiros multimédia em cache min_age: Idade mínima requerida peers_api_enabled: Publicar lista de servidores descobertos na API profile_directory: Ativar o diretório de perfis registrations_mode: Quem se pode inscrever + remote_live_feed_access: Acesso a cronologias com publicações remotas em destaque + remote_topic_feed_access: Acesso a cronologias de etiquetas e hiperligações de publicações remotas em destaque require_invite_text: Requerer uma razão para entrar show_domain_blocks: Mostrar domínios bloqueados show_domain_blocks_rationale: Mostrar porque os domínios foram bloqueados @@ -300,7 +312,6 @@ pt-PT: thumbnail: Miniatura do servidor trendable_by_default: Permitir tendências sem revisão prévia trends: Ativar destaques - trends_as_landing_page: Usar destaques como página de apresentação interactions: must_be_follower: Bloquear notificações de não-seguidores must_be_following: Bloquear notificações de pessoas que não segues @@ -326,7 +337,7 @@ pt-PT: mention: Alguém o mencionou pending_account: Uma nova conta aguarda aprovação quote: Alguém o citou - reblog: Alguém impulsionou uma publicação sua + reblog: Alguém partilhou uma publicação sua report: Uma nova denúncia foi submetida software_updates: all: Notificar todas as atualizações diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index fa7d8badb..ce1c65ccf 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -101,7 +101,6 @@ ro: thumbnail: O imagine de aproximativ 2:1 afișată alături de informațiile serverului dvs. trendable_by_default: Omiteți revizuirea manuală a conținutului în tendințe. Elementele individuale pot fi în continuare eliminate din tendințe după fapt. trends: Tendințele arată ce postări, hashtag-uri și știri câștigă teren pe serverul dvs. - trends_as_landing_page: Afișați conținut în tendințe utilizatorilor deconectați și vizitatorilor în loc de o descriere a acestui server. Necesită ca tendințele să fie activate. form_challenge: current_password: Ați intrat într-o zonă securizată imports: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index bb00e86f8..5798dd25b 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -104,7 +104,6 @@ ru: thumbnail: Изображение примерно 2:1, отображаемое рядом с информацией о вашем сервере. trendable_by_default: Пропустить ручной просмотр трендового контента. Отдельные элементы могут быть удалены из трендов уже постфактум. trends: Тренды показывают, какие посты, хэштеги и новостные истории набирают обороты на вашем сервере. - trends_as_landing_page: Показывать популярный контент для выходов пользователей и посетителей, а не для описания этого сервера. Требует включения тенденций. form_challenge: current_password: Вы переходите к настройкам безопасности вашей учётной записи imports: @@ -179,18 +178,18 @@ ru: acct: Адрес новой учётной записи account_warning_preset: text: Текст шаблона - title: Заголовок + title: Название admin_account_action: - include_statuses: Включать в письмо жалобы на посты - send_email_notification: Уведомить пользователя по электронной почте + include_statuses: Сообщить пользователю о том, на какие из его постов пожаловались + send_email_notification: Отправить пользователю уведомление по электронной почте text: Текст предупреждения type: Действие types: - disable: Заморозить - none: Ничего не делать + disable: Отключить + none: Вынести предупреждение sensitive: Отметить как «деликатного характера» - silence: Скрыть - suspend: Заблокировать и безвозвратно удалить все данные учётной записи + silence: Ограничить + suspend: Заблокировать warning_preset_id: Использовать шаблон предупреждения announcement: all_day: Весь день @@ -294,7 +293,6 @@ ru: thumbnail: Изображение сервера trendable_by_default: Разрешить треды без предварительной проверки trends: Включить тренды - trends_as_landing_page: Использовать тенденции в качестве целевой страницы interactions: must_be_follower: Блокировать уведомления от людей, которые не подписаны на вас must_be_following: Блокировать уведомления от людей, на которых вы не подписаны diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index 54e2a0012..28d434225 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -104,7 +104,6 @@ si: thumbnail: ඔබගේ සේවාදායක තොරතුරු සමඟ ආසන්න වශයෙන් 2:1 රූපයක් දර්ශනය වේ. trendable_by_default: ප්‍රවණතා අන්තර්ගතයන් අතින් සමාලෝචනය කිරීම මඟ හරින්න. කාරණයෙන් පසුවත් තනි අයිතම ප්‍රවණතා වලින් ඉවත් කළ හැකිය. trends: ප්‍රවණතා මඟින් ඔබේ සේවාදායකයේ ආකර්ෂණය ලබා ගන්නා පළ කිරීම්, හැෂ් ටැග් සහ ප්‍රවෘත්ති කථා පෙන්වයි. - trends_as_landing_page: මෙම සේවාදායකයේ විස්තරයක් වෙනුවට පිටව ගිය පරිශීලකයින්ට සහ අමුත්තන්ට ප්‍රවණතා අන්තර්ගතය පෙන්වන්න. ප්‍රවණතා සක්‍රීය කිරීම අවශ්‍ය වේ. form_challenge: current_password: ඔබ ආරක්ෂිත ප්‍රදේශයකට ඇතුල් වේ imports: @@ -288,7 +287,6 @@ si: thumbnail: සේවාදායක සිඟිති රුව trendable_by_default: පූර්ව සමාලෝචනයකින් තොරව ප්‍රවණතා වලට ඉඩ දෙන්න. trends: ප්‍රවණතා සක්‍රීය කරන්න - trends_as_landing_page: ගොඩබෑමේ පිටුව ලෙස ප්‍රවණතා භාවිතා කරන්න interactions: must_be_follower: අනුගාමිකයින් නොවන අයගෙන් ලැබෙන දැනුම්දීම් අවහිර කරන්න must_be_following: ඔබ අනුගමනය නොකරන පුද්ගලයින්ගෙන් ලැබෙන දැනුම්දීම් අවහිර කරන්න diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 81b46b5f3..97196e9a0 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -103,7 +103,6 @@ sl: thumbnail: Slika v razmerju stranic približno 2:1, prikazana vzdolž podatkov o vašem strežniku. trendable_by_default: Preskočite ročni pregled vsebine v trendu. Posamezne elemente še vedno lahko odstranite iz trenda post festum. trends: Trendi prikažejo, katere objave, ključniki in novice privlačijo zanimanje na vašem strežniku. - trends_as_landing_page: Odjavljenim uporabnikom in obiskovalcem namesto opisa tega strežnika pokažite vsebine v trendu. Trendi morajo biti omogočeni. form_challenge: current_password: Vstopate v varovano območje imports: @@ -284,7 +283,6 @@ sl: thumbnail: Sličica strežnika trendable_by_default: Dovoli trende brez predhodnega pregleda trends: Omogoči trende - trends_as_landing_page: Uporabi trende za pristopno stran interactions: must_be_follower: Blokiraj obvestila nesledilcev must_be_following: Blokiraj obvestila oseb, ki jim ne sledite diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 9c93c4a47..9df506083 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -92,6 +92,7 @@ sq: content_cache_retention_period: Krejt postimet prej shërbyesve të tjerë (përfshi përforcime dhe përgjigje) do të fshihen pas numrit të caktuar të ditëve, pa marrë parasysh çfarëdo ndërveprimi përdoruesi me këto postime. Kjo përfshin postime kur një përdorues vendor u ka vënë shenjë si faqerojtës, ose të parapëlqyer. Do të humbin gjithashtu dhe përmendje private mes përdoruesish nga instanca të ndryshme dhe s’do të jetë e mundshme të rikthehen. Përdorimi i këtij rregullimi është menduar për instanca me qëllim të caktuar dhe ndërhyn në çka presin mjaft përdorues, kur sendërtohet për përdorim të përgjithshëm. custom_css: Stile vetjakë mund të aplikoni në versionin web të Mastodon-it. favicon: WEBP, PNG, GIF, ose JPG. Anashkalon favikonën parazgjedhje Mastodon me një ikonë vetjake. + landing_page: Përzgjedh cilën faqe shohin vizitorët e rinj, kur vijnë për herë të parë në shërbyesin tuaj. Nëse përzgjidhni “Në modë”, atëherë “në modë” duhet aktivizuar te Rregullime për Zbulime. Nëse përzgjidhni “Prurje vendore”, atëherë “Hyrje te prurje vendore që përmbajnë postime vendore” duhet vënë si “Gjithkush”, te Rregullime për Zbulime. mascot: Anashkalon ilustrimin te ndërfaqja web e thelluar. media_cache_retention_period: Kartela media nga postime të bëra nga përdorues të largët ruhen në një fshehtinë në shërbyesin tuaj. Kur i jepet një vlerë pozitive, media do të fshihet pas numrit të dhënë të ditëve. Nëse të dhënat e medias duhen pas fshirjes, do të rishkarkohen, nëse lënda burim mund të kihet ende. Për shkak kufizimesh mbi sa shpesh skeda paraparjesh lidhjesh ndërveprojnë me sajte palësh të treta, rekomandohet të vihet kjo vlerë të paktën 14 ditë, ose skedat e paraparjes së lidhje s’do të përditësohen duke e kërkuar para asaj kohe. min_age: Përdoruesve do t’ju kërkohet gjatë regjistrimit të ripohojnë datën e lindjes @@ -109,7 +110,6 @@ sq: thumbnail: Një figurë afërsisht 2:1 e shfaqur tok me hollësi mbi shërbyesin tuaj. trendable_by_default: Anashkalo shqyrtim dorazi lënde në modë. Gjëra individuale prapë mund të hiqen nga lëndë në modë pas publikimi. trends: Gjërat në modë shfaqin cilat postime, hashtagë dhe histori të reja po tërheqin vëmendjen në shërbyesin tuaj. - trends_as_landing_page: Shfaq lëndë në modë për përdorues jo të futur në llogari dhe për vizitorë, në vend se të një përshkrimi të këtij shërbyesi. Lyp që të jenë të aktivizuara gjërat në modë. form_challenge: current_password: Po hyni në një zonë të sigurt imports: @@ -286,6 +286,7 @@ sq: content_cache_retention_period: Periudhë mbajtjeje lënde të largët custom_css: CSS Vetjake favicon: Favikonë + landing_page: Faqe mbërritje për vizitorë të rinj local_live_feed_access: Hyrje te prurje të atypëratyshme që përmbajnë postime vendore local_topic_feed_access: Hyrje te prurje hashtag-ësh dhe lidhjesh që përmbajnë postime vendore mascot: Simbol vetjak (e dikurshme) @@ -310,7 +311,6 @@ sq: thumbnail: Miniaturë shërbyesi trendable_by_default: Lejoni gjëra në modë pa shqyrtim paraprak trends: Aktivizo gjëra në modë - trends_as_landing_page: Përdor gjërat në modë si faqe hyrëse interactions: must_be_follower: Blloko njoftime nga jo-ndjekës must_be_following: Blloko njoftime nga persona që s’i ndiqni diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 20e9aacf3..e444f45ca 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -99,7 +99,6 @@ sr-Latn: thumbnail: Slika u razmeri od približno 2:1 koja se prikazuje pored informacija o Vašem serveru. trendable_by_default: Preskoči ručni pregled sadržaja koji je u trendu. Pojedinačne stavke se nakon toga i dalje mogu ukloniti iz trendova. trends: Trendovi pokazuju koje objave, heš oznake i vesti postaju sve popularnije na Vašem serveru. - trends_as_landing_page: Prikaži sadržaj u trendu odjavljenim korisnicima i posetiocima umesto opisa ovog servera. Zahteva da trendovi budu omogućeni. form_challenge: current_password: Ulazite u bezbedno područje imports: @@ -263,7 +262,6 @@ sr-Latn: thumbnail: Sličica servera trendable_by_default: Dozvoli trendove bez prethodnog pregleda trends: Omogući trendove - trends_as_landing_page: Koristite trendove kao stranicu dočeka interactions: must_be_follower: Blokiraj obaveštenja od korisnika koji me ne prate must_be_following: Blokiraj obaveštenja od ljudi koje ne pratim diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 628c8df33..1f5e9d517 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -99,7 +99,6 @@ sr: thumbnail: Слика у размери од приближно 2:1 која се приказује поред информација о Вашем серверу. trendable_by_default: Прескочи ручни преглед садржаја који је у тренду. Појединачне ставке се након тога и даље могу уклонити из трендова. trends: Трендови показују које објаве, хеш ознаке и вести постају све популарније на Вашем серверу. - trends_as_landing_page: Прикажи садржај у тренду одјављеним корисницима и посетиоцима уместо описа овог сервера. Захтева да трендови буду омогућени. form_challenge: current_password: Улазите у безбедно подручје imports: @@ -263,7 +262,6 @@ sr: thumbnail: Сличица сервера trendable_by_default: Дозволи трендове без претходног прегледа trends: Омогући трендове - trends_as_landing_page: Користите трендове као страницу дочека interactions: must_be_follower: Блокирај обавештења од корисника који ме не прате must_be_following: Блокирај обавештења од људи које не пратим diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 97a6c74e2..5f08efa3f 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -105,7 +105,6 @@ sv: thumbnail: En bild i cirka 2:1-proportioner som visas tillsammans med din serverinformation. trendable_by_default: Hoppa över manuell granskning av trendande innehåll. Enskilda objekt kan ändå raderas från trender retroaktivt. trends: Trender visar vilka inlägg, hashtaggar och nyheter det pratas om på din server. - trends_as_landing_page: Visa trendande innehåll för utloggade användare och besökare istället för en beskrivning om servern. Kräver att trender är aktiverat. form_challenge: current_password: Du går in i ett säkert område imports: @@ -297,7 +296,6 @@ sv: thumbnail: Serverns tumnagelbild trendable_by_default: Tillåt trender utan föregående granskning trends: Aktivera trender - trends_as_landing_page: Använd trender som landningssida interactions: must_be_follower: Blockera notiser från icke-följare must_be_following: Blockera notiser från personer du inte följer diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 794256170..85df91480 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -101,7 +101,6 @@ th: thumbnail: แสดงภาพ 2:1 โดยประมาณควบคู่ไปกับข้อมูลเซิร์ฟเวอร์ของคุณ trendable_by_default: ข้ามการตรวจทานเนื้อหาที่กำลังนิยมด้วยตนเอง ยังคงสามารถเอารายการแต่ละรายการออกจากแนวโน้มได้หลังจากเกิดเหตุ trends: แนวโน้มแสดงว่าโพสต์, แฮชแท็ก และเรื่องข่าวใดกำลังได้รับความสนใจในเซิร์ฟเวอร์ของคุณ - trends_as_landing_page: แสดงเนื้อหาที่กำลังนิยมแก่ผู้ใช้และผู้เยี่ยมชมที่ออกจากระบบแทนที่จะเป็นคำอธิบายของเซิร์ฟเวอร์นี้ ต้องมีการเปิดใช้งานแนวโน้ม form_challenge: current_password: คุณกำลังเข้าสู่พื้นที่ปลอดภัย imports: @@ -268,7 +267,6 @@ th: thumbnail: ภาพขนาดย่อเซิร์ฟเวอร์ trendable_by_default: อนุญาตแนวโน้มโดยไม่มีการตรวจทานล่วงหน้า trends: เปิดใช้งานแนวโน้ม - trends_as_landing_page: ใช้แนวโน้มเป็นหน้าเริ่มต้น interactions: must_be_follower: ปิดกั้นการแจ้งเตือนจากผู้ที่ไม่ใช่ผู้ติดตาม must_be_following: ปิดกั้นการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 6809bb3f5..f64c12cf9 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -93,6 +93,7 @@ tr: content_cache_retention_period: Diğer sunuculardaki (öne çıkarma ve yanıtlar da dahil olmak üzere) tüm gönderiler belirlenen gün sonunda, yerel bir kullanıcının etkileşimine bakılmadan, silinecektir. Yerel bir kullanıcının yerimlerine veya favorilerine eklediği gönderiler de dahildir. Farklı sunuculardaki kullanıcılar arasındaki özel bahsetmeler de kaybolacak ve geri getirilmeleri mümkün olmayacaktır. Bu ayarın kullanımı özel amaçlı sunucular içindir ve genel amaçlı kullanımda etkinleştirildiğinde kullanıcı beklentilerini karşılamayabilir. custom_css: Mastodon'un web sürümüne özel biçimler uygulayabilirsiniz. favicon: WEBP, PNG, GIF veya JPG. Varsayılan Mastodon simgesini isteğe bağlı bir simgeyle değiştirir. + landing_page: Yeni ziyaretçilerin sunucunuza ilk geldiklerinde görecekleri sayfayı seçer. "Öne çıkanlar" seçeneğini seçerseniz, Keşif Ayarlarında öne çıkanların etkinleştirilmesi gerekir. "Yerel akış" seçeneğini seçerseniz, Keşif Ayarlarında "Yerel gönderileri içeren canlı akışlara erişim" seçeneğinin "Herkes" olarak ayarlanması gerekir. mascot: Gelişmiş web arayüzündeki illüstrasyonu geçersiz kılar. media_cache_retention_period: Uzak kullanıcıların gönderilerindeki ortam dosyaları sunucunuzda önbelleklenir. Pozitif bir değer verildiğinde, ortam dosyaları belirlenen gün sonunda silinecektir. Eğer ortam dosyaları silindikten sonra istenirse, kaynak içerik hala mevcutsa, tekrar indirilecektir. Bağlantı önizleme kartlarının üçüncü parti siteleri yoklamasına ilişkin kısıtlamalar nedeniyle, bu değeri en azından 14 gün olarak ayarlamanız önerilir, yoksa bağlantı önizleme kartları bu süreden önce isteğe bağlı olarak güncellenmeyecektir. min_age: Kullanıcılardan kayıt olurken doğum tarihlerini doğrulamaları istenecektir @@ -110,7 +111,6 @@ tr: thumbnail: Sunucu bilginizin yanında gösterilen yaklaşık 2:1'lik görüntü. trendable_by_default: Öne çıkan içeriğin elle incelenmesini atla. Tekil öğeler sonrada öne çıkanlardan kaldırılabilir. trends: Öne çıkanlar, sunucunuzda ilgi toplayan gönderileri, etiketleri ve haber yazılarını gösterir. - trends_as_landing_page: Giriş yapmış kullanıcılar ve ziyaretçilere sunucunun açıklması yerine öne çıkan içeriği göster. Öne çıkanların etkin olması gerekir. form_challenge: current_password: Güvenli bir bölgeye giriyorsunuz imports: @@ -287,6 +287,7 @@ tr: content_cache_retention_period: Uzak içerik saklama süresi custom_css: Özel CSS favicon: Yer imi simgesi + landing_page: Yeni ziyaretçiler için giriş sayfası local_live_feed_access: Yerel gönderileri ön plana çıkaran canlı akışlara erişim local_topic_feed_access: Yerel gönderileri ön plana çıkaran etiket ve bağlantı akışlarına erişim mascot: Özel maskot (eski) @@ -311,7 +312,6 @@ tr: thumbnail: Sunucu küçük resmi trendable_by_default: Ön incelemesiz öne çıkanlara izin ver trends: Öne çıkanları etkinleştir - trends_as_landing_page: Giriş sayfası olarak öne çıkanları kullan interactions: must_be_follower: Takipçim olmayan kişilerden gelen bildirimleri engelle must_be_following: Takip etmediğim kişilerden gelen bildirimleri engelle diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index a798f24d1..40be33811 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -104,7 +104,6 @@ uk: thumbnail: Зображення приблизно 2:1, що показується поряд з відомостями про ваш сервер. trendable_by_default: Пропустити ручний огляд популярних матеріалів. Індивідуальні елементи все ще можна вилучити з популярних постфактум. trends: Популярні показують, які дописи, хештеґи та новини набувають популярності на вашому сервері. - trends_as_landing_page: Показувати популярні матеріали для зареєстрованих користувачів і відвідувачів замість опису цього сервера. Для активації потрібні тренди. form_challenge: current_password: Ви входите до безпечної зони imports: @@ -286,7 +285,6 @@ uk: thumbnail: Мініатюра сервера trendable_by_default: Дозволити популярне без попереднього огляду trends: Увімкнути популярні - trends_as_landing_page: Використовуйте тенденції як цільову сторінку interactions: must_be_follower: Блокувати сповіщення від непідписаних людей must_be_following: Блокувати сповіщення від людей, на яких ви не підписані diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index ea81a76df..8432ded89 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -93,6 +93,7 @@ vi: content_cache_retention_period: Tất cả tút từ các máy chủ khác (bao gồm cả đăng lại và trả lời) sẽ bị xóa sau số ngày được chỉ định mà không tính đến bất kỳ tương tác nào của người dùng cục bộ với các tút đó. Điều này bao gồm các tút mà người dùng cục bộ đã đánh dấu nó là dấu trang hoặc mục yêu thích. Những lượt nhắc riêng tư giữa những người dùng từ các máy chủ khác nhau cũng sẽ bị mất và không thể khôi phục. Việc sử dụng cài đặt này dành cho các trường hợp có mục đích đặc biệt và phá vỡ nhiều kỳ vọng của người dùng khi được triển khai cho mục đích sử dụng chung. custom_css: Bạn có thể tùy chỉnh phong cách trên bản web của Mastodon. favicon: WEBP, PNG, GIF hoặc JPG. Dùng favicon Maston tùy chỉnh. + landing_page: Chọn trang mà khách truy cập mới sẽ thấy khi họ lần đầu truy cập máy chủ của bạn. Nếu bạn chọn "Xu hướng", thì cần bật xu hướng trong Cài đặt Khám phá. Nếu bạn chọn "Bảng tin máy chủ", thì cần đặt "Truy cập vào nguồn cấp dữ liệu trực tiếp có bài đăng cục bộ" thành "Mọi người" trong Cài đặt Khám phá. mascot: Ghi đè hình minh họa trong giao diện web nâng cao. media_cache_retention_period: Các tệp phương tiện từ các tút do người dùng máy chủ khác thực hiện sẽ được lưu vào bộ đệm trên máy chủ của bạn. Khi được đặt thành giá trị dương, phương tiện sẽ bị xóa sau số ngày được chỉ định. Nếu dữ liệu phương tiện được yêu cầu sau khi bị xóa, dữ liệu đó sẽ được tải xuống lại nếu nội dung nguồn vẫn còn. Do những hạn chế về tần suất thẻ xem trước liên kết thăm dò ý kiến ​​các trang web của bên thứ ba, bạn nên đặt giá trị này thành ít nhất 14 ngày, nếu không thẻ xem trước liên kết sẽ không được cập nhật theo yêu cầu trước thời gian đó. min_age: Thành viên sẽ được yêu cầu xác nhận ngày sinh của họ trong quá trình đăng ký @@ -110,7 +111,6 @@ vi: thumbnail: 'Một hình ảnh tỉ lệ 2: 1 được hiển thị cùng với thông tin máy chủ của bạn.' trendable_by_default: Bỏ qua việc duyệt thủ công nội dung xu hướng. Các mục riêng lẻ vẫn có thể bị xóa khỏi xu hướng sau này. trends: Hiển thị những tút, hashtag và tin tức đang được thảo luận nhiều trên máy chủ của bạn. - trends_as_landing_page: Hiển thị nội dung xu hướng cho người dùng chưa đăng nhập thay vì mô tả về máy chủ này. Yêu cầu xu hướng được kích hoạt. form_challenge: current_password: Biểu mẫu này an toàn imports: @@ -286,6 +286,7 @@ vi: content_cache_retention_period: Khoảng thời gian lưu giữ nội dung máy chủ khác custom_css: Tùy chỉnh CSS favicon: Favicon + landing_page: Trang mở đầu dành cho khách ghé thăm local_live_feed_access: Truy cập bảng tin gồm những tút của máy chủ local_topic_feed_access: Truy cập hashtag và bảng tin liên kết gồm những tút của máy chủ mascot: Tùy chỉnh linh vật (kế thừa) @@ -310,7 +311,6 @@ vi: thumbnail: Hình thu nhỏ của máy chủ trendable_by_default: Cho phép lên xu hướng mà không cần duyệt trước trends: Bật xu hướng - trends_as_landing_page: Dùng trang xu hướng làm trang chào mừng interactions: must_be_follower: Những người không theo dõi bạn must_be_following: Những người bạn không theo dõi diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index d9fe807f4..d43dfbcf1 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -26,9 +26,9 @@ zh-CN: types: disable: 禁止用户使用账号,但不会删除或隐藏账号内容。 none: 用它来向用户发送警告,不会触发其他操作。 - sensitive: 强制将此用户的所有媒体文件标记为敏感内容。 - silence: 阻止用户发送公开嘟文,除了关注者以外,其他人都无法看到他的嘟文和通知。关闭针对此账号的所有举报。 - suspend: 阻止此账号的任何交互并删除其内容。30天内可以撤销操作。关闭针对此账号的所有举报。 + sensitive: 强制将此用户的全部媒体文件标记为敏感内容。 + silence: 阻止用户发送公开嘟文,除了关注者以外,其他人都无法看到他的嘟文和通知。关闭针对此账号的全部举报。 + suspend: 阻止此账号的任何交互并删除其内容。30天内可以撤销操作。关闭针对此账号的全部举报。 warning_preset_id: 可选。你可以在预置文本末尾添加自定义文本 announcement: all_day: 如果选中,只有该时间段内的日期会显示。 @@ -54,7 +54,7 @@ zh-CN: password: 至少需要8个字符 phrase: 匹配将忽略嘟文或内容警告里的字母大小写 scopes: 哪些 API 被允许使用。如果你勾选了更高一级的范围,就不用单独选中子项目了。 - setting_advanced_layout: 将Mastodon的界面显示为多列布局,允许您同时查看时间线、通知及可自主选择的第三列。屏幕尺寸较小的情况下不推荐使用。 + setting_advanced_layout: 将 Mastodon 的界面显示为多列布局,允许你同时查看时间线、通知及可自主选择的第三列。屏幕尺寸较小的情况下不推荐使用。 setting_aggregate_reblogs: 不显示最近已经被转嘟过的嘟文(只会影响新收到的转嘟) setting_always_send_emails: 一般情况下,如果你活跃使用 Mastodon,我们不会向你发送电子邮件通知 setting_boost_modal: 如果启用,转嘟前会先打开确认对话框,以便更改转嘟的可见性。 @@ -93,10 +93,11 @@ zh-CN: content_cache_retention_period: 来自其它实例的所有嘟文(包括转嘟与回复)都将在指定天数后被删除,不论本实例用户是否与这些嘟文产生过交互。这包括被本实例用户喜欢和收藏的嘟文。实例间用户的私下提及也将丢失并无法恢复。此设置针对的是特殊用途的实例,用于一般用途时会打破许多用户的期望。 custom_css: 你可以为网页版 Mastodon 应用自定义样式。 favicon: WEBP、PNG、GIF 或 JPG。使用自定义图标覆盖 Mastodon 的默认图标。 + landing_page: 选择新访客首次访问您的服务器时看到的页面。 如果选择“热门”,则需要在“发现”设置中启用热门趋势。 如果选择“本站动态”,则在“发现”设置中“展示本站嘟文的实时动态访问权限”一项需要设置为“所有人”。 mascot: 覆盖高级网页界面中的绘图形象。 media_cache_retention_period: 来自外站用户嘟文的媒体文件将被缓存到你的实例上。当该值被设为正值时,缓存的媒体文件将在指定天数后被清除。如果媒体文件在被清除后重新被请求,且源站内容仍然可用,它将被重新下载。由于链接预览卡拉取第三方站点的频率受到限制,建议将此值设置为至少 14 天,如果小于该值,链接预览卡将不会按需更新。 min_age: 用户注册时必须确认出生日期 - peers_api_enabled: 本站在联邦宇宙中遇到的站点列表。 此处不包含关于您是否与给定站点联合的数据,只是您的实例知道它。 这由收集一般意义上的联合统计信息的服务使用。 + peers_api_enabled: 本站在联邦宇宙中遇到的站点列表。 此处不包含关于你是否与给定站点联合的数据,只是你的实例知道它。 这由收集一般意义上的联合统计信息的服务使用。 profile_directory: 个人资料目录会列出所有选择可被发现的用户。 require_invite_text: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项 site_contact_email: 他人需要询恰法务或支持信息时的联络方式 @@ -110,7 +111,6 @@ zh-CN: thumbnail: 与服务器信息一并展示的约 2:1 比例的图像。 trendable_by_default: 跳过对热门内容的手工审核。个别项目仍可在之后从趋势中删除。 trends: 热门页中会显示正在你服务器上受到关注的嘟文、标签和新闻故事。 - trends_as_landing_page: 向注销的用户和访问者显示热门内容,而不是对该服务器的描述,需要启用热门。 form_challenge: current_password: 你正在进入安全区域 imports: @@ -139,22 +139,22 @@ zh-CN: name: 你只能改变字母的大小写,让它更易读 terms_of_service: changelog: 可以使用 Markdown 语法。 - effective_date: 合理的时间范围可以是从您通知用户之日起 10 到 30 天。 + effective_date: 合理的时间范围可以是从你通知用户之日起 10 到 30 天。 text: 可以使用 Markdown 语法。 terms_of_service_generator: admin_email: 法务通知包括反通知、法院命令、内容下架要求与执法机关的要求。 arbitration_address: 可以与上面的实际地址相同,如果使用电子邮件则为“N/A”。 arbitration_website: 可以是网页表单,如果使用电子邮件则为“N/A”。 - choice_of_law: 适用内部实质法律以管辖任何及所有索赔的城市、地区、领土或州。 + choice_of_law: 适用内部实质法律以管辖任何及全部索赔的城市、地区、领土或州。 dmca_address: 如果你是位于美国的运营者,请使用在 DMCA 指定代表名录中注册的地址。如果你需要使用邮政信箱,可以直接申请。请使用 DMCA 指定代表邮政信箱豁免申请表,通过电子邮件联系版权办公室,并声明你是居家内容审核员,因担心审核操作会招致报复或打击报复,需要使用邮政信箱以避免公开家庭住址。 dmca_email: 可以与上面“法律声明的电子邮件地址”使用相同的电子邮件地址。 domain: 你所提供的在线服务的唯一标识。 jurisdiction: 请列出支付运营费用者所在的国家/地区。如果为公司或其他实体,请列出其注册的国家/地区以及相应的城市、地区、领地或州。 - min_age: 不应低于您所在地法律管辖权要求的最低年龄。 + min_age: 不应低于你所在地法律管辖权要求的最低年龄。 user: chosen_languages: 仅选中语言的嘟文会出现在公共时间线上(全不选则显示所有语言的嘟文) date_of_birth: - other: 我们必须确保您至少年满 %{count} 岁才能使用 %{domain}。我们不会存储此信息。 + other: 我们必须确保你至少年满 %{count} 岁才能使用 %{domain}。我们不会存储此信息。 role: 角色用于控制用户拥有的权限。 user_role: color: 在界面各处用于标记该角色的颜色,以十六进制 RGB 格式表示 @@ -286,6 +286,7 @@ zh-CN: content_cache_retention_period: 外站内容保留期 custom_css: 自定义 CSS favicon: Favicon + landing_page: 新访客的主页 local_live_feed_access: 展示本站嘟文的实时动态访问权限 local_topic_feed_access: 展示本站嘟文的话题标签及实时动态访问权限 mascot: 自定义吉祥物(旧) @@ -310,7 +311,6 @@ zh-CN: thumbnail: 本站缩略图 trendable_by_default: 允许在未审核的情况下将话题置为热门 trends: 启用热门 - trends_as_landing_page: 使用热门页作为登陆页面 interactions: must_be_follower: 屏蔽来自未关注我的用户的通知 must_be_following: 屏蔽来自我未关注的用户的通知 @@ -339,7 +339,7 @@ zh-CN: reblog: 有人转嘟了我的嘟文 report: 有人提交了新举报 software_updates: - all: 通知所有更新 + all: 通知全部更新 critical: 仅在有关键更新时通知 label: 有新的 Mastodon 版本可用 none: 从不通知更新(不推荐) diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 98b5abad6..08358ff8c 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -97,7 +97,6 @@ zh-HK: thumbnail: 一幅約 2:1 的圖片顯示在你的伺服器資訊的旁邊。 trendable_by_default: 跳過對趨勢內容的手動審查,事後仍可從趨勢中刪除個別項目。 trends: 趨勢顯示哪些帖文、標籤和新聞故事在你的伺服器上較有吸引力。 - trends_as_landing_page: 向未登入的使用者及訪客展示趨勢內容,而非只有此伺服器的描述。需要啟用趨勢。 form_challenge: current_password: 你正要進入安全區域 imports: @@ -260,7 +259,6 @@ zh-HK: thumbnail: 伺服器縮圖 trendable_by_default: 允許未經審核的趨勢 trends: 啟用趨勢 - trends_as_landing_page: 使用趨勢作為登陸頁面 interactions: must_be_follower: 隱藏你關注者以外的人的通知 must_be_following: 隱藏你不關注的人的通知 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index ee927aa99..181965d51 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -93,6 +93,7 @@ zh-TW: content_cache_retention_period: 所有來自其他伺服器之嘟文(包括轉嘟與回嘟)將於指定之天數後自動刪除,不論這些嘟文與本地使用者間的任何互動。這將包含本地使用者已標記為書籤或最愛之嘟文。不同站點使用者間之私訊亦將遺失且不可回復。此設定應適用於特殊情況,若常規使用將超乎多數使用者預期。 custom_css: 您於 Mastodon 網頁版本中能套用客製化風格。 favicon: WEBP、PNG、GIF、或 JPG。使用自訂圖示替代預設 Mastodon favicon 圖示。 + landing_page: 選擇當新訪客第一次造訪您伺服器時所見之頁面。若您選擇「熱門趨勢」,則該功能必須於探索設定中啟用。若您選擇「本站時間軸」,則探索設定中「允許瀏覽本站嘟文之即時內容」功能必須設定為「任何人」。 mascot: 覆寫進階網頁介面中的圖例。 media_cache_retention_period: 來自遠端伺服器嘟文中之多媒體內容將快取於您的伺服器。當設定為正值時,這些多媒體內容將於指定之天數後自您的儲存空間中自動刪除。若多媒體資料於刪除後被請求,且原始內容仍可存取,它們將被重新下載。由於連結預覽中第三方網站查詢頻率限制,建議將其設定為至少 14 日,否則於此之前連結預覽將不被即時更新。 min_age: 使用者將於註冊時被要求確認他們的生日 @@ -110,7 +111,6 @@ zh-TW: thumbnail: 大約 2:1 圖片會顯示於您伺服器資訊之旁。 trendable_by_default: 跳過手動審核熱門內容。仍能於登上熱門趨勢後移除個別內容。 trends: 熱門趨勢將顯示於您伺服器上正在吸引大量注意力的嘟文、主題標籤、或者新聞。 - trends_as_landing_page: 顯示熱門趨勢內容至未登入使用者及訪客而不是關於此伺服器之描述。需要啟用熱門趨勢。 form_challenge: current_password: 您正要進入安全區域 imports: @@ -286,6 +286,7 @@ zh-TW: content_cache_retention_period: 遠端內容保留期限 custom_css: 自訂 CSS favicon: 網站圖示 (Favicon) + landing_page: 新訪客之登陸頁面 local_live_feed_access: 允許瀏覽本站嘟文之即時內容 local_topic_feed_access: 允許瀏覽本站嘟文之主題標籤與連結 mascot: 自訂吉祥物 (legacy) @@ -310,7 +311,6 @@ zh-TW: thumbnail: 伺服器縮圖 trendable_by_default: 允許熱門趨勢直接顯示,不需經過審核 trends: 啟用熱門趨勢 - trends_as_landing_page: 以熱門趨勢作為登陸頁面 interactions: must_be_follower: 封鎖非跟隨者的通知 must_be_following: 封鎖您未跟隨之使用者的通知 diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 3b957a156..e77132a88 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -812,7 +812,6 @@ sl: title: Privzeto izvzemi uporabnike iz indeksiranja iskalnika discovery: follow_recommendations: Sledi priporočilom - preamble: Izpostavljanje zanimivih vsebin je ključno za pridobivanje novih uporabnikov, ki morda ne poznajo nikogar na Mastodonu. Nadzirajte, kako različne funkcionalnosti razkritja delujejo na vašem strežniku. profile_directory: Imenik profilov public_timelines: Javne časovnice publish_statistics: Objavi statistiko diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 1a8d9a91a..819dcd555 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -831,7 +831,7 @@ sq: title: Lëri, si parazgjedhje, përdoruesit jashtë indeksimi nga motorë kërkimesh discovery: follow_recommendations: Rekomandime ndjekjeje - preamble: Shpërfaqja e lëndës interesante është me rëndësi kyçe për mirëseardhjen e përdoruesve të rinj që mund të mos njohin njeri në Mastodon. Kontrolloni se si funksionojnë në shërbyesin tuaj veçori të ndryshme zbulimi. + preamble: Shpërfaqja e lëndës interesante është me rëndësi për mirëseardhjen e përdoruesve të rinj, të cilët mund të mos njohin njeri në Mastodon. Kontrolloni se funksionojnë në shërbyesin tuaj veçori të ndryshme zbulimi lënde. privacy: Privatësi profile_directory: Drejtori profilesh public_timelines: Rrjedha kohore publike @@ -845,7 +845,13 @@ sq: feed_access: modes: authenticated: Vetëm përdorues të mirëfilltësuar + disabled: Lyp doemos rol specifik përdoruesi public: Kushdo + landing_page: + values: + about: Mbi + local_feed: Prurje vendore + trends: Në modë registrations: moderation_recommandation: Ju lutemi, sigurohuni si keni një ekip adekuat dhe reagues moderimi, përpara se të hapni regjistrimet për këdo! preamble: Kontrolloni cilët mund të krijojnë llogari në shërbyesin tuaj. @@ -1908,6 +1914,7 @@ sq: errors: in_reply_not_found: Gjendja të cilës po provoni t’i përgjigjeni s’duket se ekziston. quoted_status_not_found: Postimi që po rrekeni të citoni nuk duket se ekziston. + quoted_user_not_mentioned: S’mund të citohet një përdorues që s’është përmendur në një postim Përmendje Private. over_character_limit: u tejkalua kufi shenjash prej %{max} pin_errors: direct: Postimet që janë të dukshme vetëm për përdoruesit e përmendur s’mund të fiksohen diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 9f422b058..7d75fe3bd 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -745,7 +745,6 @@ sr-Latn: title: Podrazumevano isključi korisnike iz indeksiranja pretraživača discovery: follow_recommendations: Preporuke za praćenje - preamble: Održavanje zanimljivih sadržaja na površini je ključno u privlačenju novih korisnika koji možda ne znaju nikoga na Mastodon-u. Kontrolišite kako različiti načini istraživanja funkcionišu na vašem serveru. profile_directory: Direktorijum profilâ public_timelines: Javne vremenske linije publish_statistics: Objavi statistiku diff --git a/config/locales/sr.yml b/config/locales/sr.yml index b8d3ad1fc..25b372818 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -775,7 +775,6 @@ sr: title: Подразумевано искључи кориснике из индексирања претраживача discovery: follow_recommendations: Препоруке за праћење - preamble: Одржавање занимљивих садржаја на површини је кључно у привлачењу нових корисника који можда не знају никога на Mastodon-у. Контролишите како различити начини истраживања функционишу на вашем серверу. profile_directory: Директоријум профилâ public_timelines: Јавне временске линије publish_statistics: Објави статистику diff --git a/config/locales/sv.yml b/config/locales/sv.yml index df222cf14..ad1e36bc8 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -837,7 +837,6 @@ sv: title: Undantag användare från sökmotorindexering som standard discovery: follow_recommendations: Följrekommendationer - preamble: Att visa intressant innehåll är avgörande i onboarding av nya användare som kanske inte känner någon på Mastodon. Styr hur olika upptäcktsfunktioner fungerar på din server. privacy: Integritet profile_directory: Profilkatalog public_timelines: Offentliga tidslinjer diff --git a/config/locales/th.yml b/config/locales/th.yml index 46236daa9..58fbfa65c 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -187,6 +187,7 @@ th: create_relay: สร้างรีเลย์ create_unavailable_domain: สร้างโดเมนที่ไม่พร้อมใช้งาน create_user_role: สร้างบทบาท + create_username_block: สร้างกฎชื่อผู้ใช้ demote_user: ลดขั้นผู้ใช้ destroy_announcement: ลบประกาศ destroy_canonical_email_block: ลบการปิดกั้นอีเมล @@ -200,6 +201,7 @@ th: destroy_status: ลบโพสต์ destroy_unavailable_domain: ลบโดเมนที่ไม่พร้อมใช้งาน destroy_user_role: ทำลายบทบาท + destroy_username_block: ลบกฎชื่อผู้ใช้ disable_2fa_user: ปิดใช้งาน 2FA disable_custom_emoji: ปิดใช้งานอีโมจิที่กำหนดเอง disable_relay: ปิดใช้งานรีเลย์ @@ -234,6 +236,7 @@ th: update_report: อัปเดตรายงาน update_status: อัปเดตโพสต์ update_user_role: อัปเดตบทบาท + update_username_block: อัปเดตกฎชื่อผู้ใช้ actions: approve_appeal_html: "%{name} ได้อนุมัติการอุทธรณ์การตัดสินใจในการกลั่นกรองจาก %{target}" approve_user_html: "%{name} ได้อนุมัติการลงทะเบียนจาก %{target}" @@ -481,6 +484,7 @@ th: save: บันทึก sign_in: ลงชื่อเข้า status: สถานะ + title: FASP follow_recommendations: description_html: "คำแนะนำการติดตามช่วยให้ผู้ใช้ใหม่ค้นหาเนื้อหาที่น่าสนใจได้อย่างรวดเร็ว เมื่อผู้ใช้ไม่ได้โต้ตอบกับผู้อื่นมากพอที่จะสร้างคำแนะนำการติดตามเฉพาะบุคคล จะแนะนำบัญชีเหล่านี้แทน จะคำนวณคำแนะนำใหม่เป็นประจำทุกวันจากบัญชีต่าง ๆ ที่มีการมีส่วนร่วมล่าสุดสูงสุดและจำนวนผู้ติดตามในเซิร์ฟเวอร์สูงสุดสำหรับภาษาที่กำหนด" language: สำหรับภาษา @@ -782,7 +786,6 @@ th: title: เลือกให้ผู้ใช้ไม่รับการทำดัชนีโดยเครื่องมือค้นหาเป็นค่าเริ่มต้น discovery: follow_recommendations: คำแนะนำการติดตาม - preamble: การแสดงเนื้อหาที่น่าสนใจเป็นเครื่องมือในการเตรียมความพร้อมให้ผู้ใช้ใหม่ที่อาจไม่รู้จักใครก็ตามใน Mastodon ควบคุมวิธีที่คุณลักษณะการค้นพบต่าง ๆ ทำงานในเซิร์ฟเวอร์ของคุณ privacy: ความเป็นส่วนตัว profile_directory: ไดเรกทอรีโปรไฟล์ public_timelines: เส้นเวลาสาธารณะ @@ -793,6 +796,9 @@ th: all: ให้กับทุกคน disabled: ให้กับไม่มีใคร users: ให้กับผู้ใช้ในเซิร์ฟเวอร์ที่เข้าสู่ระบบ + landing_page: + values: + about: เกี่ยวกับ registrations: moderation_recommandation: โปรดตรวจสอบให้แน่ใจว่าคุณมีทีมการกลั่นกรองที่เพียงพอและมีปฏิกิริยาตอบสนองก่อนที่คุณจะเปิดการลงทะเบียนให้กับทุกคน! preamble: ควบคุมผู้ที่สามารถสร้างบัญชีในเซิร์ฟเวอร์ของคุณ @@ -1020,6 +1026,14 @@ th: other: ใช้โดย %{count} คนในช่วงสัปดาห์ที่ผ่านมา title: คำแนะนำและแนวโน้ม trending: กำลังนิยม + username_blocks: + delete: ลบ + edit: + title: แก้ไขกฎชื่อผู้ใช้ + new: + create: สร้างกฎ + title: สร้างกฎชื่อผู้ใช้ใหม่ + title: กฎชื่อผู้ใช้ warning_presets: add_new: เพิ่มใหม่ delete: ลบ @@ -1091,6 +1105,7 @@ th: hint_html: หากคุณต้องการย้ายจากบัญชีอื่นไปยังบัญชีนี้ ที่นี่คุณสามารถสร้างนามแฝง ซึ่งจำเป็นก่อนที่คุณจะสามารถดำเนินการต่อด้วยการย้ายผู้ติดตามจากบัญชีเก่าไปยังบัญชีนี้ การกระทำนี้โดยตัวการกระทำเอง ไม่เป็นอันตรายและย้อนกลับได้ การโยกย้ายบัญชีเริ่มต้นจากบัญชีเก่า remove: เลิกเชื่อมโยงนามแฝง appearance: + advanced_settings: การตั้งค่าขั้นสูง animations_and_accessibility: ภาพเคลื่อนไหวและการช่วยการเข้าถึง discovery: การค้นพบ localization: @@ -1466,6 +1481,11 @@ th: expires_at: หมดอายุเมื่อ uses: การใช้งาน title: เชิญผู้คน + link_preview: + author_html: โดย %{name} + potentially_sensitive_content: + action: คลิกเพื่อแสดง + hide_button: ซ่อน lists: errors: limit: คุณมีรายการถึงจำนวนสูงสุดแล้ว @@ -1766,6 +1786,9 @@ th: other: "%{count} วิดีโอ" boosted_from_html: ดันจาก %{acct_link} content_warning: 'คำเตือนเนื้อหา: %{warning}' + content_warnings: + hide: ซ่อนโพสต์ + show: แสดงเพิ่มเติม default_language: เหมือนกับภาษาส่วนติดต่อ disallowed_hashtags: other: 'มีแฮชแท็กที่ไม่อนุญาต: %{tags}' diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 8f2894e0c..2d60feec5 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -796,6 +796,8 @@ tr: view_dashboard_description: Kullanıcıların ana panele ve çeşitli ölçütlere erişmesine izin verir view_devops: DevOps view_devops_description: Kullanıcıların Sidekiq ve pgHero panellerine erişmesine izin verir + view_feeds: Canlı ve konu akışlarını görüntüle + view_feeds_description: Kullanıcıların sunucu ayarlarından bağımsız olarak canlı ve konu akışlarına erişmelerini sağlar title: Roller rules: add_new: Kural ekle @@ -851,7 +853,13 @@ tr: feed_access: modes: authenticated: Sadece yetkilendirilmiş kullanıcılar + disabled: Belirli kullanıcı rolü gerekir public: Herkes + landing_page: + values: + about: Hakkında + local_feed: Yerel akış + trends: Öne çıkanlar registrations: moderation_recommandation: Lütfen kayıtları herkese açmadan önce yeterli ve duyarlı bir denetleyici ekibine sahip olduğunuzdan emin olun! preamble: Sunucunuzda kimin hesap oluşturabileceğini denetleyin. @@ -1921,6 +1929,7 @@ tr: errors: in_reply_not_found: Yanıtlamaya çalıştığınız durum yok gibi görünüyor. quoted_status_not_found: Alıntılamaya çalıştığınız gönderi mevcut görünmüyor. + quoted_user_not_mentioned: Özel Bahsetme gönderisinde bahsedilmeyen bir kullanıcıyı alıntılamak mümkün değildir. over_character_limit: "%{max} karakter limiti aşıldı" pin_errors: direct: Sadece değinilen kullanıcıların görebileceği gönderiler üstte tutulamaz diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 1d667b9ea..bd94e9da3 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -825,7 +825,6 @@ uk: title: Усталено відмовитись від індексації користувачів пошуковими системами discovery: follow_recommendations: Поради щодо підписок - preamble: Показ цікавих матеріалів відіграє важливу роль у залученні нових користувачів, які, можливо, не знають нікого з Mastodon. Контролюйте роботу різних функцій виявлення на вашому сервері. privacy: Конфіденційність profile_directory: Каталог профілів public_timelines: Публічна стрічка diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 6df758f92..ea21c767a 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -782,6 +782,8 @@ vi: view_dashboard_description: Cho phép truy cập trang tổng quan và các chỉ số khác view_devops: Nhà phát triển view_devops_description: Cho phép truy cập trang tổng quan Sidekiq và pgHero + view_feeds: Xem nguồn cấp dữ liệu trực tiếp và theo chủ đề + view_feeds_description: Cho phép người dùng truy cập nguồn cấp dữ liệu trực tiếp và theo chủ đề bất kể cài đặt máy chủ title: Danh sách vai trò rules: add_new: Thêm nội quy @@ -823,7 +825,7 @@ vi: title: Mặc định người dùng không xuất hiện trong công cụ tìm kiếm discovery: follow_recommendations: Gợi ý theo dõi - preamble: Hiển thị nội dung thú vị là công cụ để thu hút người dùng mới, những người có thể không quen bất kỳ ai trong Mastodon. Kiểm soát cách các tính năng khám phá hoạt động trên máy chủ của bạn. + preamble: Hiển thị nội dung thú vị là công cụ để thu hút người dùng mới, những người có thể không quen bất kỳ ai trên Mastodon. Kiểm soát cách các tính năng khám phá hoạt động trên máy chủ của bạn. privacy: Riêng tư profile_directory: Danh bạ public_timelines: Bảng tin @@ -837,7 +839,13 @@ vi: feed_access: modes: authenticated: Chỉ những người dùng đã xác minh + disabled: Yêu cầu vai trò người dùng cụ thể public: Mọi người + landing_page: + values: + about: Giới thiệu + local_feed: Bảng tin máy chủ + trends: Xu hướng registrations: moderation_recommandation: Vui lòng đảm bảo rằng bạn có một đội ngũ kiểm duyệt và phản ứng nhanh trước khi mở đăng ký cho mọi người! preamble: Kiểm soát những ai có thể tạo tài khoản trên máy chủ của bạn. @@ -1878,6 +1886,7 @@ vi: errors: in_reply_not_found: Bạn đang trả lời một tút không còn tồn tại. quoted_status_not_found: Bạn đang trích dẫn một tút không còn tồn tại. + quoted_user_not_mentioned: Không thể trích dẫn người dùng không được nhắc đến trong tút Nhắn riêng. over_character_limit: vượt quá giới hạn %{max} ký tự pin_errors: direct: Không thể ghim những tút nhắn riêng diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index b91473890..69d9d9543 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -71,7 +71,7 @@ zh-CN: enable_sign_in_token_auth: 启用邮件令牌身份验证 enabled: 已启用 enabled_msg: 成功解冻 %{username} 的账号 - followers: 粉丝 + followers: 关注者 follows: 关注 header: 封面图 inbox_url: 收件箱(Inbox)URL @@ -118,7 +118,7 @@ zh-CN: reject: 拒绝 rejected_msg: 已拒绝 %{username} 的注册申请 remote_suspension_irreversible: 此账号的数据已被不可逆转地删除。 - remote_suspension_reversible_hint_html: 账号已在他们的服务器上封禁,数据将在 %{date} 完全删除。 在此之前,远程服务器仍可恢复此账号,并且没有任何不良影响。 如果你想立即移除该账号的所有数据,可以在下面进行。 + remote_suspension_reversible_hint_html: 账号已在他们的服务器上封禁,数据将在 %{date} 完全删除。 在此之前,远程服务器仍可恢复此账号,并且没有任何不良影响。 如果你想立即移除该账号的全部数据,可以在下面进行。 remove_avatar: 删除头像 remove_header: 移除封面图 removed_avatar_msg: 成功删除 %{username} 的头像 @@ -536,7 +536,7 @@ zh-CN: confirm_purge: 确定要删除此站点的全部数据吗? content_policies: comment: 内部备注 - description_html: 你可以设置应用于此域名所有账号和其所有子域名的内容策略。 + description_html: 你可以设置应用于此域名全部账号和其全部子域名的内容策略。 limited_federation_mode_description_html: 你可以选择是否允许与此实例联合。 policies: reject_media: 拒收媒体 @@ -578,12 +578,12 @@ zh-CN: created_msg: 实例管理员备注创建成功! description_html: 查看备注或向其他管理员留言 destroyed_msg: 实例管理员备注删除成功! - placeholder: 有关此实例的信息、已采取的行动,或任何能帮助您将来管理此实例的事项。 + placeholder: 有关此实例的信息、已采取的行动,或任何能帮助你将来管理此实例的事项。 title: 审核注意事项 private_comment: 私密评论 public_comment: 公开评论 purge: 清除 - purge_description_html: 如果你确认此域名已永久离线,可以从存储中删除此域名的所有账号记录和相关数据。这将会需要一段时间。 + purge_description_html: 如果你确认此域名已永久离线,可以从存储中删除此域名的全部账号记录和相关数据。这将会需要一段时间。 title: 联合 total_blocked_by_us: 被本站屏蔽的 total_followed_by_them: 被对方关注的 @@ -624,7 +624,7 @@ zh-CN: disable: 禁用 disabled: 已禁用 enable: 启用 - enable_hint: 启用此功能后,你的实例会订阅此中继站的所有公开嘟文,并同时向其推送本服务器的公开嘟文。 + enable_hint: 启用此功能后,你的实例会订阅此中继站的全部公开嘟文,并同时向其推送本服务器的公开嘟文。 enabled: 已启用 inbox_url: 中继站 URL pending: 等待中继站的确认 @@ -647,8 +647,8 @@ zh-CN: mark_as_sensitive_description_html: 被举报的嘟文将被标记为敏感,同时该账号将被标记一次处罚,以供未来同一账号再次违规时参考。 other_description_html: 查看更多控制该账号行为的选项,并自定义编写与被举报账号的通信。 resolve_description_html: 不会对被举报账号采取任何动作,举报将被关闭,也不会留下处罚记录。 - silence_description_html: 只有关注或手工搜索此账号才能查看其资料,将严重限制其触达范围。可随时撤销。关闭针对此账号的所有举报。 - suspend_description_html: 该账号及其所有内容将无法访问并最终被删除,且无法与该账号进行互动。 在 30 天内可随时撤销。关闭针对此账号的所有举报。 + silence_description_html: 只有关注或手工搜索此账号才能查看其资料,将严重限制其触达范围。可随时撤销。关闭针对此账号的全部举报。 + suspend_description_html: 该账号及其全部内容将无法访问并最终被删除,且无法与该账号进行互动。 在 30 天内可随时撤销。关闭针对此账号的全部举报。 actions_description_html: 决定采取何种措施处理此举报。如果对被举报账号采取惩罚性措施,将向其发送一封电子邮件通知。但若选中垃圾信息类别则不会发送通知。 actions_description_remote_html: 决定采取何种行动来解决此举报。 这只会影响你的服务器如何与该远程账号的通信并处理其内容。 actions_no_posts: 该举报没有相关嘟文可供删除 @@ -711,7 +711,7 @@ zh-CN: silence_html: 严格限制 @%{acct} 的影响力,方法是让他们的个人资料和内容仅对已经关注他们的人可见,或手动查找其个人资料时 suspend_html: 暂停 @%{acct},使他们的个人资料和内容无法访问,也无法与之互动 close_report: '将举报 #%{id} 标记为已解决' - close_reports_html: 将针对 @%{acct}所有举报标记为已解决 + close_reports_html: 将针对 @%{acct}全部举报标记为已解决 delete_data_html: 从现在起 30 天后删除 @%{acct} 的个人资料和内容,除非他们同时解除暂停。 preview_preamble_html: "@%{acct} 将收到包含以下内容的警告:" record_strike_html: 记录一次针对 @%{acct} 的警示,以帮助你在这个账号上的未来违规事件中得到重视。 @@ -738,7 +738,7 @@ zh-CN: description_html: 使用 用户角色,你可以自定义你的用户可以访问的 Mastodon 功能和区域。 edit: 编辑角色 '%{name}' everyone: 默认权限 - everyone_full_description_html: 该角色是基础角色,会影响所有用户,包括未指定角色的用户。 其他所有的角色都继承该角色的权限。 + everyone_full_description_html: 该角色是基础角色,会影响全部用户,包括未指定角色的用户。 其他全部的角色都继承该角色的权限。 permissions_count: other: "%{count} 个权限" privileges: @@ -782,6 +782,8 @@ zh-CN: view_dashboard_description: 允许用户访问信息面板和各种指标 view_devops: 开发运维 view_devops_description: 允许用户访问 Sidekiq 和 pgHero 控制面板 + view_feeds: 查看实时动态和话题 + view_feeds_description: 允许用户无视服务器设置访问实时动态和话题 title: 角色 rules: add_new: 添加规则 @@ -803,8 +805,8 @@ zh-CN: rules_hint: 有一个专门区域用于显示用户需要遵守的规则。 title: 关于本站 allow_referrer_origin: - desc: 当您的用户点击指向外部网站的链接时,他们的浏览器可能会将您的 Mastodon 服务器地址作为referrer发送。如果这会唯一地识别出您的用户(例如,如果这是一个私人 Mastodon 服务器),请禁用此功能。 - title: 允许外部网站将您的 Mastodon 服务器视为流量来源 + desc: 当你的用户点击指向外部网站的链接时,他们的浏览器可能会将你的 Mastodon 服务器地址作为 referrer 发送。如果这会唯一地识别出你的用户,例如,如果这是一个私人 Mastodon 服务器,请禁用此功能。 + title: 允许外部网站将你的 Mastodon 服务器视为流量来源 appearance: preamble: 自定义 Mastodon 的网页界面。 title: 外观 @@ -819,11 +821,11 @@ zh-CN: preamble: 控制用户生成的内容在 Mastodon 中如何存储。 title: 内容保留 default_noindex: - desc_html: 影响所有尚未更改此设置的用户 + desc_html: 影响全部尚未更改此设置的用户 title: 默认不让用户被搜索引擎索引 discovery: follow_recommendations: 关注推荐 - preamble: 露出有趣的内容有助于新加入 Mastodon 的用户融入。可在这里控制多种发现功能如何在你的服务器上工作。 + preamble: 展示有趣的内容有助于新加入 Mastodon 的用户融入。可在这里控制多种发现功能如何在你的服务器上工作。 privacy: 隐私 profile_directory: 个人资料目录 public_timelines: 公共时间线 @@ -831,15 +833,21 @@ zh-CN: title: 发现 trends: 热门 domain_blocks: - all: 对所有人 + all: 对每个人 disabled: 不对任何人 users: 对已登录的本站用户 feed_access: modes: authenticated: 仅已登录用户 - public: 所有人 + disabled: 需要特定的用户角色 + public: 每个人 + landing_page: + values: + about: 关于 + local_feed: 本站动态 + trends: 热门 registrations: - moderation_recommandation: 在向所有人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! + moderation_recommandation: 在向每个人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! preamble: 控制谁可以在你的服务器上创建账号。 title: 注册 registrations_mode: @@ -954,10 +962,10 @@ zh-CN: message_html: 有一个Mastodon错误修复更新可用。 upload_check_privacy_error: action: 点击这里查看更多信息 - message_html: "您的网站服务器配置错误,您用户的隐私处于危险中。" + message_html: "你的网站服务器配置错误,你的用户的隐私处于危险中。" upload_check_privacy_error_object_storage: action: 点击这里查看更多信息 - message_html: "您的对象存储空间配置错误,您用户的隐私处于危险中。" + message_html: "你的对象存储空间配置错误,你的用户的隐私处于危险中。" tags: moderation: not_trendable: 不在热门中显示 @@ -1447,7 +1455,7 @@ zh-CN: all_items_on_page_selected_html: other: 此页面上的所有 %{count} 项目已被选中。 all_matching_items_selected_html: - other: 所有 %{count} 匹配你搜索的项目都已被选中。 + other: 全部 %{count} 匹配你搜索的项目都已被选中。 cancel: 取消 changes_saved_msg: 更改保存成功! confirm: 确认 @@ -1458,7 +1466,7 @@ zh-CN: order_by: 排序方式 save_changes: 保存更改 select_all_matching_items: - other: 选择匹配你搜索的所有 %{count} 个项目。 + other: 选择匹配你搜索的全部 %{count} 个项目。 today: 今天 validation_errors: other: 出错啦!检查一下下面 %{count} 处出错的地方吧 @@ -1485,7 +1493,7 @@ zh-CN: domain_blocking_html: other: 你即将使用来自 %{filename} 的最多 %{count} 个站点域名替换你的站点屏蔽列表。 following_html: - other: 你即将关注来自 %{filename} 的最多 %{count} 个账号,并停止关注其他所有人。 + other: 你即将关注来自 %{filename} 的最多 %{count} 个账号,并停止关注其他任何人。 lists_html: other: 你即将使用来自 %{filename} 的内容替换你的列表。最多将会有 %{count} 个账号 被添加到新列表。 muting_html: @@ -1558,7 +1566,7 @@ zh-CN: author_html: 来自 %{name} potentially_sensitive_content: action: 点击查看 - confirm_visit: 您确定要打开此链接吗? + confirm_visit: 你确定要打开此链接吗? hide_button: 隐藏 label: 可能为敏感内容 lists: @@ -1623,7 +1631,7 @@ zh-CN: before: 在继续前,请仔细阅读下列说明: cooldown: 移动后会有一个冷却期,在此期间你将无法再次移动 disabled_account: 此后,你的当前账号将无法使用。但是,你仍然有权导出数据或者重新激活。 - followers: 这步操作将把所有关注者从当前账号移动到新账号 + followers: 这步操作将把全部关注者从当前账号移动到新账号 only_redirect_html: 或者,你可以只在你的账号资料上设置一个跳转。 other_data: 不会自动移动其它数据 redirect: 在收到一个跳转通知后,你当前的账号资料将会更新,并被排除在搜索范围外 @@ -1715,7 +1723,7 @@ zh-CN: too_many_options: 不能超过 %{max} 项 vote: 投票 posting_defaults: - explanation: 这些设置会在您撰写新嘟文时作为默认值应用,但每篇嘟文的设置也可以在编辑器处单独修改。 + explanation: 这些设置会在你撰写新嘟文时作为默认值应用,但每篇嘟文的设置也可以在编辑器处单独修改。 preferences: other: 其他 posting_defaults: 发布默认值 @@ -1725,7 +1733,7 @@ zh-CN: privacy: 隐私 privacy_hint_html: 控制你愿意向他人透露多少信息。通过浏览他人的关注列表和查看他们发嘟所用的应用,人们可以发现有趣的用户和酷炫的应用,但你可能更喜欢将其隐藏起来。 reach: 范围 - reach_hint_html: 控制你是否希望被新人发现和关注。你是否希望你的嘟文出现在“探索”页面上?你是否希望其他人在关注推荐中看到你?你是想自动接受所有新粉丝,还是对每个粉丝都进行仔细的筛选? + reach_hint_html: 控制你是否希望被新人发现和关注。你是否希望你的嘟文出现在“探索”页面上?你是否希望其他人在关注推荐中看到你?你是想自动接受全部新关注者,还是对每个关注者都进行仔细的筛选? search: 搜索 search_hint_html: 控制你希望被找到的方式。你想让人们通过你公开发布的内容来找到你吗?当在网络上搜索时,你是否希望Mastodon之外的人能够找到你的个人资料?请注意,我们无法保证完全排除所有搜索引擎对公开信息的索引。 title: 隐私与可达性 @@ -1742,7 +1750,7 @@ zh-CN: activity: 账号活动 confirm_follow_selected_followers: 你确定想要关注所选的关注者吗? confirm_remove_selected_followers: 你确定想要取关所选的关注者吗? - confirm_remove_selected_follows: 您确定要删除选定的关注者吗? + confirm_remove_selected_follows: 你确定要删除选定的关注者吗? dormant: 休眠 follow_failure: 无法关注选中的部分账号。 follow_selected_followers: 关注选中的关注者 @@ -1755,7 +1763,7 @@ zh-CN: mutual: 互相关注 primary: 主要 relationship: 关系 - remove_selected_domains: 删除在选定站点中的所有关注者 + remove_selected_domains: 删除在选定站点中的全部关注者 remove_selected_followers: 移除选中的关注者 remove_selected_follows: 取消关注所选用户 status: 账号状态 @@ -1877,7 +1885,8 @@ zh-CN: edited_at_html: 编辑于 %{date} errors: in_reply_not_found: 你回复的嘟文似乎不存在 - quoted_status_not_found: 您尝试引用的嘟文似乎不存在。 + quoted_status_not_found: 你尝试引用的嘟文似乎不存在。 + quoted_user_not_mentioned: 无法在私下提及嘟文中引用未提及的用户。 over_character_limit: 超过了 %{max} 字的限制 pin_errors: direct: 仅对被提及的用户可见的帖子不能被置顶 @@ -1946,7 +1955,7 @@ zh-CN: terms_of_service: title: 服务条款 terms_of_service_interstitial: - future_preamble_html: 我们将更改部分服务条款,这些更改将在%{date}生效。我们建议您查看更新后的条款。 + future_preamble_html: 我们将更改部分服务条款,这些更改将在%{date}生效。我们建议你查看更新后的条款。 past_preamble_html: 自你上次访问起,我们更改了一些服务条款。我们建议你查看更新后的条款。 review_link: 查看服务条款 title: "%{domain} 更新了服务条款" @@ -2033,7 +2042,7 @@ zh-CN: delete_statuses: 你的一些嘟文被发现违反了一条或多条社区准则,并已被 %{instance} 的管理员删除。 disable: 你不能再使用你的账号,但你的个人资料和其他数据保持不变。你可以请求数据备份,更改账号设置或删除账号。 mark_statuses_as_sensitive: 你的一些嘟文已经被 %{instance} 管理员标记为敏感内容。这意味着别人需要在嘟文中点击媒体,才能显示媒体预览。你可以在今后发布嘟文时自行将媒体标记为敏感内容。 - sensitive: 即刻起,你上传的所有媒体文件都将被标记为敏感内容并隐藏,在点击警告后才能查看。 + sensitive: 即刻起,你上传的全部媒体文件都将被标记为敏感内容并隐藏,在点击警告后才能查看。 silence: 你可以继续使用你的账号,但只有已关注你的人才能在看到你在此服务器上的嘟文,并且你会被排除在各类公共列表之外。其他用户仍可以手动关注你。 suspend: 你不能再使用你的账号,并且你的个人资料和其他数据都将无法访问。在大约30天内,你仍可以登录并请求数据备份,之后相关数据将被完全删除。我们会保留一些基础数据以避免封禁失效。 reason: 理由: @@ -2095,9 +2104,9 @@ zh-CN: title: "%{name},欢迎你的加入!" users: follow_limit_reached: 你不能关注超过 %{limit} 个人 - go_to_sso_account_settings: 转到您的身份提供商进行账号设置 + go_to_sso_account_settings: 转到你的身份提供商进行账号设置 invalid_otp_token: 输入的双因素认证代码无效 - otp_lost_help_html: 如果你不慎丢失了所有的代码,请联系 %{email} 寻求帮助 + otp_lost_help_html: 如果你不慎丢失了全部的代码,请联系 %{email} 寻求帮助 rate_limited: 验证尝试次数过多,请稍后再试。 seamless_external_login: 你通过外部服务登录,因此密码和邮件设置不可用。 signed_in_as: 当前登录的账号: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 6045808fe..d565d3604 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -736,7 +736,6 @@ zh-HK: title: 預設用戶不在搜尋引擎索引之內 discovery: follow_recommendations: 追蹤建議 - preamble: 呈現有趣的內容有助於吸引不認識 Mastodon 的使用者新手上路。控制各種探索功能在你的伺服器上的運作方式。 privacy: 私隱 profile_directory: 個人檔案目錄 public_timelines: 公共時間軸 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index ce4fc73de..7c522752a 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -782,6 +782,8 @@ zh-TW: view_dashboard_description: 允許使用者存取儀表板與各種指標 view_devops: DevOps view_devops_description: 允許使用者存取 Sidekiq 與 pgHero 儀表板 + view_feeds: 檢視即時內容與主題 + view_feeds_description: 允許使用者無論伺服器設定為何皆可存取即時內容與主題 title: 角色 rules: add_new: 新增規則 @@ -825,7 +827,7 @@ zh-TW: title: 預設將使用者排除於搜尋引擎索引 discovery: follow_recommendations: 跟隨建議 - preamble: 呈現有趣的內容有助於 Mastodon 上一人不識的新手上路。控制各種不同的分類於您伺服器上如何被探索到。 + preamble: 呈現有趣的內容有助於 Mastodon 上一人不識的新手上路。控制您伺服器上各類探索功能之運作方式。 privacy: 隱私權 profile_directory: 個人檔案目錄 public_timelines: 公開時間軸 @@ -839,7 +841,13 @@ zh-TW: feed_access: modes: authenticated: 僅限已登入之使用者 + disabled: 需要特定使用者權限 public: 任何人 + landing_page: + values: + about: 關於 + local_feed: 本站時間軸 + trends: 熱門趨勢 registrations: moderation_recommandation: 對所有人開放註冊之前,請確保您有人手充足且反應靈敏的管理員團隊! preamble: 控制誰能於您伺服器上建立帳號。 @@ -1880,6 +1888,7 @@ zh-TW: errors: in_reply_not_found: 您嘗試回覆之嘟文似乎不存在。 quoted_status_not_found: 您嘗試引用之嘟文似乎不存在。 + quoted_user_not_mentioned: 無法於私訊嘟文中引用無提及之使用者。 over_character_limit: 已超過 %{max} 字的限制 pin_errors: direct: 無法釘選只有僅提及使用者可見之嘟文 @@ -1894,7 +1903,7 @@ zh-TW: followers: 僅限跟隨者 nobody: 僅有我 public: 所有人 - quote_post_author: 以引用 %{acct} 之嘟文 + quote_post_author: 已引用 %{acct} 之嘟文 title: "%{name}:「%{quote}」" visibilities: direct: 私訊 diff --git a/config/navigation.rb b/config/navigation.rb index 4829f9efd..66fdfdfe5 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -12,7 +12,8 @@ SimpleNavigation::Configuration.run do |navigation| if: -> { Rails.configuration.x.mastodon.software_update_url.present? && current_user.can?(:view_devops) && SoftwareUpdate.urgent_pending? }, html: { class: 'warning' } - n.item :profile, safe_join([material_symbol('person'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? && !self_destruct }, highlights_on: %r{/settings/profile|/settings/featured_tags|/settings/verification|/settings/privacy} + n.item :profile, safe_join([material_symbol('person'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? && !self_destruct }, highlights_on: %r{/settings/profile|/settings/featured_tags|/settings/verification} + n.item :privacy, safe_join([material_symbol('globe'), t('privacy.title')]), settings_privacy_path, if: -> { current_user.functional? && !self_destruct }, highlights_on: %r{/settings/privacy} n.item :preferences, safe_join([material_symbol('settings'), t('settings.preferences')]), settings_preferences_path, if: -> { current_user.functional? && !self_destruct } do |s| s.item :appearance, safe_join([material_symbol('computer'), t('settings.appearance')]), settings_preferences_appearance_path diff --git a/config/roles.yml b/config/roles.yml index f443250d1..33d2635f4 100644 --- a/config/roles.yml +++ b/config/roles.yml @@ -4,6 +4,7 @@ moderator: permissions: - view_dashboard - view_audit_log + - view_feeds - manage_users - manage_reports - manage_taxonomies diff --git a/config/settings.yml b/config/settings.yml index e97b787a5..79b051d39 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -21,7 +21,6 @@ defaults: &defaults noindex: false theme: 'system' trends: true - trends_as_landing_page: true trendable_by_default: false disallowed_hashtags: # space separated string or list of hashtags without the hash bootstrap_timeline_accounts: '' @@ -33,6 +32,7 @@ defaults: &defaults backups_retention_period: 7 captcha_enabled: false allow_referrrer_origin: false + landing_page: 'trends' reject_pattern: '' development: diff --git a/db/migrate/20251002140103_migrate_timeline_preview_setting.rb b/db/migrate/20251002140103_migrate_timeline_preview_setting.rb index 4d180bd8f..9a18a6451 100644 --- a/db/migrate/20251002140103_migrate_timeline_preview_setting.rb +++ b/db/migrate/20251002140103_migrate_timeline_preview_setting.rb @@ -12,8 +12,7 @@ class MigrateTimelinePreviewSetting < ActiveRecord::Migration[8.0] Setting.upsert_all( %w(local_live_feed_access remote_live_feed_access local_topic_feed_access remote_topic_feed_access).map do |var| { var: var, value: value ? "--- public\n" : "--- authenticated\n" } - end, - unique_by: :var + end ) end diff --git a/db/migrate/20251023210145_migrate_landing_page_setting.rb b/db/migrate/20251023210145_migrate_landing_page_setting.rb new file mode 100644 index 000000000..e8448bc75 --- /dev/null +++ b/db/migrate/20251023210145_migrate_landing_page_setting.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class MigrateLandingPageSetting < ActiveRecord::Migration[8.0] + class Setting < ApplicationRecord; end + + def up + setting = Setting.find_by(var: 'trends_as_landing_page') + return unless setting.present? && setting.attributes['value'].present? + + value = YAML.safe_load(setting.attributes['value'], permitted_classes: [ActiveSupport::HashWithIndifferentAccess, Symbol]) + + Setting.upsert({ + var: 'landing_page', + value: value ? "--- trends\n" : "--- about\n", + }) + end + + def down; end +end diff --git a/db/schema.rb b/db/schema.rb index 8910bac36..7bdd6c0ce 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_10_07_142305) do +ActiveRecord::Schema[8.0].define(version: 2025_10_23_210145) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" diff --git a/docker-compose.yml b/docker-compose.yml index 58d7704e4..3725010c1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/mastodon/mastodon:v4.4.8 + image: ghcr.io/mastodon/mastodon:v4.5.0 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: # build: # dockerfile: ./streaming/Dockerfile # context: . - image: ghcr.io/mastodon/mastodon-streaming:v4.4.8 + image: ghcr.io/mastodon/mastodon-streaming:v4.5.0 restart: always env_file: .env.production command: node ./streaming/index.js @@ -102,7 +102,7 @@ services: sidekiq: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/mastodon/mastodon:v4.4.8 + image: ghcr.io/mastodon/mastodon:v4.5.0 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/email_configuration_helper.rb b/lib/mastodon/email_configuration_helper.rb index af8647278..be017a4a1 100644 --- a/lib/mastodon/email_configuration_helper.rb +++ b/lib/mastodon/email_configuration_helper.rb @@ -8,25 +8,23 @@ module Mastodon # `config/email.yml`) into the format that `ActionMailer` understands def convert_smtp_settings(config) enable_starttls = nil - enable_starttls_auto = nil case config[:enable_starttls] when 'always' - enable_starttls = true - when 'never' + enable_starttls = :always + when 'never', 'false' enable_starttls = false when 'auto' - enable_starttls_auto = true + enable_starttls = :auto else - enable_starttls_auto = config[:enable_starttls_auto] != 'false' + enable_starttls = config[:enable_starttls_auto] ? :auto : false unless config[:tls] || config[:ssl] end authentication = config[:authentication] == 'none' ? nil : (config[:authentication] || 'plain') - config.merge( + config.without(:enable_starttls_auto).merge( authentication:, - enable_starttls:, - enable_starttls_auto: + enable_starttls: ) end end diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 90154fb35..736d4acde 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'pre.3' + 'pre.4' end def prerelease diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 054f8b017..e5ca6ac2a 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -63,7 +63,7 @@ namespace :db do task pre_migration_check: :environment do pg_version = ActiveRecord::Base.connection.database_version - abort 'This version of Mastodon requires PostgreSQL 13.0 or newer. Please update PostgreSQL before updating Mastodon.' if pg_version < 130_000 + abort 'This version of Mastodon requires PostgreSQL 14.0 or newer. Please update PostgreSQL before updating Mastodon.' if pg_version < 140_000 schema_version = ActiveRecord::Migrator.current_version abort <<~MESSAGE if ENV['SKIP_POST_DEPLOYMENT_MIGRATIONS'] && schema_version < 2023_09_07_150100 diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 9385e390d..0c5c6a09c 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -144,6 +144,16 @@ namespace :tests do exit(1) end + unless Setting.landing_page == 'about' + puts 'Landing page settings not migrated as expected' + exit(1) + end + + unless Setting.local_live_feed_access == 'authenticated' + puts 'Local live feed access not migrated as expected' + exit(1) + end + puts 'No errors found. Database state is consistent with a successful migration process.' end @@ -162,6 +172,13 @@ namespace :tests do (1, 'https://example.com/users/foobar', 'foobar@example.com', now(), now()), (1, 'https://example.com/users/foobar', 'foobar@example.com', now(), now()); + /* trends_as_landing_page is technically not a 3.3.0 setting, but it's easier to just add it here */ + INSERT INTO "settings" + (id, thing_type, thing_id, var, value, created_at, updated_at) + VALUES + (7, NULL, NULL, 'timeline_preview', E'--- false\n', now(), now()), + (8, NULL, NULL, 'trends_as_landing_page', E'--- false\n', now(), now()); + /* Doorkeeper records While the `read:me` scope was technically not valid in 3.3.0, it is still useful for the purposes of testing the `ChangeReadMeScopeToProfile` diff --git a/package.json b/package.json index 1ff17d94a..3467069fa 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^2.1.1", "@optimize-lodash/rollup-plugin": "^5.0.2", - "@rails/ujs": "7.1.502", + "@rails/ujs": "7.1.600", "@react-spring/web": "^9.7.5", "@reduxjs/toolkit": "^2.0.1", "@use-gesture/react": "^10.3.1", @@ -171,7 +171,7 @@ "eslint-import-resolver-typescript": "^4.2.5", "eslint-plugin-formatjs": "^5.3.1", "eslint-plugin-import": "~2.32.0", - "eslint-plugin-jsdoc": "^54.0.0", + "eslint-plugin-jsdoc": "^60.0.0", "eslint-plugin-jsx-a11y": "~6.10.2", "eslint-plugin-promise": "~7.2.1", "eslint-plugin-react": "^7.37.4", @@ -192,6 +192,7 @@ "stylelint-config-standard-scss": "^16.0.0", "typescript": "~5.9.0", "typescript-eslint": "^8.45.0", + "typescript-plugin-css-modules": "^5.2.0", "vitest": "^3.2.4" }, "resolutions": { diff --git a/spec/controllers/concerns/api/error_handling_spec.rb b/spec/controllers/concerns/api/error_handling_spec.rb index eff01605d..496f38648 100644 --- a/spec/controllers/concerns/api/error_handling_spec.rb +++ b/spec/controllers/concerns/api/error_handling_spec.rb @@ -32,7 +32,7 @@ RSpec.describe Api::ErrorHandling do Mastodon::ValidationError => 422, OpenSSL::SSL::SSLError => 503, Seahorse::Client::NetworkingError => 503, - Stoplight::Error::RedLight => 503, + Stoplight::Error::RedLight.new(:name, cool_off_time: 1, retry_after: 1) => 503, }.each do |error, code| it "Handles error class of #{error}" do allow(FakeService) diff --git a/spec/lib/activitypub/activity/update_spec.rb b/spec/lib/activitypub/activity/update_spec.rb index b829f3a5a..d905f68d8 100644 --- a/spec/lib/activitypub/activity/update_spec.rb +++ b/spec/lib/activitypub/activity/update_spec.rb @@ -149,18 +149,17 @@ RSpec.describe ActivityPub::Activity::Update do shared_examples 'updates counts' do it 'updates the reblog count' do - expect(status.untrusted_reblogs_count).to eq reblogs + expect { subject.perform }.to change { status.reload.untrusted_reblogs_count }.to(reblogs) end it 'updates the favourites count' do - expect(status.untrusted_favourites_count).to eq favourites + expect { subject.perform }.to change { status.reload.untrusted_favourites_count }.to(favourites) end end context 'with an implicit update' do before do status.update!(uri: ActivityPub::TagManager.instance.uri_for(status)) - subject.perform end it_behaves_like 'updates counts' @@ -173,11 +172,89 @@ RSpec.describe ActivityPub::Activity::Update do before do status.update!(uri: ActivityPub::TagManager.instance.uri_for(status)) - subject.perform end it_behaves_like 'updates counts' end end + + context 'with an Article object' do + let(:updated) { nil } + let(:favourites) { 50 } + let(:reblogs) { 100 } + + let!(:status) do + Fabricate( + :status, + uri: 'https://example.com/statuses/article', + account: sender, + text: "

Future of the Fediverse

\n\n

Guest article by John Mastodon

The fediverse is great reading this you will find out why!

" + ) + end + + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: 'foo', + type: 'Update', + actor: sender.uri, + object: { + type: 'Article', + id: status.uri, + name: 'Future of the Fediverse', + summary: '

Guest article by Jane Mastodon

The fediverse is great reading this you will find out why!

', + content: 'Foo', + updated: updated, + likes: { + id: "#{status.uri}/likes", + type: 'Collection', + totalItems: favourites, + }, + shares: { + id: "#{status.uri}/shares", + type: 'Collection', + totalItems: reblogs, + }, + }, + }.with_indifferent_access + end + + shared_examples 'updates counts' do + it 'updates the reblog count' do + expect { subject.perform }.to change { status.reload.untrusted_reblogs_count }.to(reblogs) + end + + it 'updates the favourites count' do + expect { subject.perform }.to change { status.reload.untrusted_favourites_count }.to(favourites) + end + end + + context 'with an implicit update' do + before do + status.update!(uri: ActivityPub::TagManager.instance.uri_for(status)) + end + + it_behaves_like 'updates counts' + end + + context 'with an explicit update' do + let(:favourites) { 150 } + let(:reblogs) { 200 } + let(:updated) { Time.now.utc.iso8601 } + + before do + status.update!(uri: ActivityPub::TagManager.instance.uri_for(status)) + end + + it_behaves_like 'updates counts' + + it 'changes the contents as expected' do + expect { subject.perform } + .to(change { status.reload.text }) + + expect(status.text).to start_with("

Future of the Fediverse

\n\n

Guest article by Jane Mastodon

The fediverse is great reading this you will find out why!

") + end + end + end end end diff --git a/spec/lib/extractor_spec.rb b/spec/lib/extractor_spec.rb index bc3ee8ac4..e1a57d578 100644 --- a/spec/lib/extractor_spec.rb +++ b/spec/lib/extractor_spec.rb @@ -35,12 +35,24 @@ RSpec.describe Extractor do end describe 'extract_hashtags_with_indices' do - it 'returns an empty array if it does not have #' do + it 'returns an empty array if it does not have # or #' do text = 'a string without hash sign' extracted = described_class.extract_hashtags_with_indices(text) expect(extracted).to eq [] end + it 'returns hashtags preceded by an ASCII hash' do + text = 'hello #world' + extracted = described_class.extract_hashtags_with_indices(text) + expect(extracted).to eq [{ hashtag: 'world', indices: [6, 12] }] + end + + it 'returns hashtags preceded by a full-width hash' do + text = 'hello #world' + extracted = described_class.extract_hashtags_with_indices(text) + expect(extracted).to eq [{ hashtag: 'world', indices: [6, 12] }] + end + it 'does not exclude normal hash text before ://' do text = '#hashtag://' extracted = described_class.extract_hashtags_with_indices(text) diff --git a/spec/lib/mastodon/email_configuration_helper_spec.rb b/spec/lib/mastodon/email_configuration_helper_spec.rb index db513672f..2894699d0 100644 --- a/spec/lib/mastodon/email_configuration_helper_spec.rb +++ b/spec/lib/mastodon/email_configuration_helper_spec.rb @@ -21,8 +21,9 @@ RSpec.describe Mastodon::EmailConfigurationHelper do base_configuration.merge({ enable_starttls: 'always' }) end - it 'converts this to `true`' do - expect(converted_settings[:enable_starttls]).to be true + it 'converts this to `:always`' do + expect(converted_settings[:enable_starttls]).to eq :always + expect(converted_settings[:enable_starttls_auto]).to be_nil end end @@ -33,6 +34,7 @@ RSpec.describe Mastodon::EmailConfigurationHelper do it 'converts this to `false`' do expect(converted_settings[:enable_starttls]).to be false + expect(converted_settings[:enable_starttls_auto]).to be_nil end end @@ -41,28 +43,43 @@ RSpec.describe Mastodon::EmailConfigurationHelper do base_configuration.merge({ enable_starttls: 'auto' }) end - it 'sets `enable_starttls_auto` instead' do - expect(converted_settings[:enable_starttls]).to be_nil - expect(converted_settings[:enable_starttls_auto]).to be true + it 'sets `enable_starttls` to `:auto`' do + expect(converted_settings[:enable_starttls]).to eq :auto + expect(converted_settings[:enable_starttls_auto]).to be_nil end end context 'when `enable_starttls` is unset' do - context 'when `enable_starttls_auto` is unset' do - let(:configuration) { base_configuration } + context 'when `enable_starttls_auto` is true' do + let(:configuration) do + base_configuration.merge({ enable_starttls_auto: true }) + end - it 'sets `enable_starttls_auto` to `true`' do - expect(converted_settings[:enable_starttls_auto]).to be true + it 'sets `enable_starttls` to `:auto`' do + expect(converted_settings[:enable_starttls]).to eq :auto + expect(converted_settings[:enable_starttls_auto]).to be_nil end end - context 'when `enable_starttls_auto` is set to "false"' do + context 'when `tls` is set to true' do let(:configuration) do - base_configuration.merge({ enable_starttls_auto: 'false' }) + base_configuration.merge({ tls: true }) end - it 'sets `enable_starttls_auto` to `false`' do - expect(converted_settings[:enable_starttls_auto]).to be false + it 'sets `enable_starttls` to `nil`' do + expect(converted_settings[:enable_starttls]).to be_nil + expect(converted_settings[:enable_starttls_auto]).to be_nil + end + end + + context 'when `enable_starttls_auto` is set to false' do + let(:configuration) do + base_configuration.merge({ enable_starttls_auto: false }) + end + + it 'sets `enable_starttls` to `false`' do + expect(converted_settings[:enable_starttls]).to be false + expect(converted_settings[:enable_starttls_auto]).to be_nil end end end diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 82021cd3d..153de1ef1 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -27,6 +27,7 @@ RSpec.describe UserMailer do address: 'localhost', port: 25, authentication: 'none', + enable_starttls_auto: true, } end @@ -44,8 +45,7 @@ RSpec.describe UserMailer do address: 'localhost', port: 25, authentication: nil, - enable_starttls: nil, - enable_starttls_auto: true, + enable_starttls: :auto, }) end end diff --git a/spec/models/export_spec.rb b/spec/models/export_spec.rb index 81aaf8858..ce4c96608 100644 --- a/spec/models/export_spec.rb +++ b/spec/models/export_spec.rb @@ -14,15 +14,20 @@ RSpec.describe Export do end describe '#to_bookmarks_csv' do - before { Fabricate.times(2, :bookmark, account: account) } - + let!(:bookmark) { Fabricate(:bookmark, account: account) } let(:export) { CSV.parse(subject.to_bookmarks_csv) } + let!(:second_bookmark) { Fabricate(:bookmark, account: account) } + let!(:bookmark_of_soft_deleted) { Fabricate(:bookmark, account: account) } + + before do + bookmark_of_soft_deleted.status.discard + end it 'returns a csv of bookmarks' do expect(export) .to contain_exactly( - include(/statuses/), - include(/statuses/) + [ActivityPub::TagManager.instance.uri_for(bookmark.status)], + [ActivityPub::TagManager.instance.uri_for(second_bookmark.status)] ) end end diff --git a/spec/models/public_feed_spec.rb b/spec/models/public_feed_spec.rb index 5ea58cd16..312ade2ff 100644 --- a/spec/models/public_feed_spec.rb +++ b/spec/models/public_feed_spec.rb @@ -202,5 +202,320 @@ RSpec.describe PublicFeed do end end end + + context 'when both local_live_feed_access and remote_live_feed_access are disabled' do + before do + Setting.local_live_feed_access = 'disabled' + Setting.remote_live_feed_access = 'disabled' + end + + context 'without local_only option' do + subject { described_class.new(viewer).get(20).map(&:id) } + + let(:viewer) { nil } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'includes all expected statuses' do + expect(subject).to include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + + context 'with a local_only option set' do + subject { described_class.new(viewer, local: true).get(20).map(&:id) } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a remote_only option set' do + subject { described_class.new(viewer, remote: true).get(20).map(&:id) } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'includes remote statuses only' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + end + + context 'when local_live_feed_access is disabled' do + before do + Setting.local_live_feed_access = 'disabled' + end + + context 'without local_only option' do + subject { described_class.new(viewer).get(20).map(&:id) } + + let(:viewer) { nil } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + + context 'with a local_only option set' do + subject { described_class.new(viewer, local: true).get(20).map(&:id) } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a remote_only option set' do + subject { described_class.new(viewer, remote: true).get(20).map(&:id) } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + end + + context 'when remote_live_feed_access is disabled' do + before do + Setting.remote_live_feed_access = 'disabled' + end + + context 'without local_only option' do + subject { described_class.new(viewer).get(20).map(&:id) } + + let(:viewer) { nil } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + + it 'is not affected by personal domain blocks' do + viewer.block_domain!('test.com') + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a local_only option set' do + subject { described_class.new(viewer, local: true).get(20).map(&:id) } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + + it 'is not affected by personal domain blocks' do + viewer.block_domain!('test.com') + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a remote_only option set' do + subject { described_class.new(viewer, remote: true).get(20).map(&:id) } + + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { Fabricate(:status, account: local_account) } + let!(:remote_status) { Fabricate(:status, account: remote_account) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + end end end diff --git a/spec/models/tag_feed_spec.rb b/spec/models/tag_feed_spec.rb index 578fc7823..8618b6733 100644 --- a/spec/models/tag_feed_spec.rb +++ b/spec/models/tag_feed_spec.rb @@ -66,5 +66,311 @@ RSpec.describe TagFeed do results = described_class.new(tag_cats, nil).get(20) expect(results).to include(status) end + + context 'when both local_topic_feed_access and remote_topic_feed_access are disabled' do + before do + Setting.local_topic_feed_access = 'disabled' + Setting.remote_topic_feed_access = 'disabled' + end + + context 'without local_only option' do + subject { described_class.new(tag_cats, viewer).get(20).map(&:id) } + + let(:viewer) { nil } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'includes all expected statuses' do + expect(subject).to include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + + context 'with a local_only option set' do + subject { described_class.new(tag_cats, viewer, local: true).get(20).map(&:id) } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a remote_only option set' do + subject { described_class.new(tag_cats, viewer, remote: true).get(20).map(&:id) } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'includes remote statuses only' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + end + + context 'when local_topic_feed_access is disabled' do + before do + Setting.local_topic_feed_access = 'disabled' + end + + context 'without local_only option' do + subject { described_class.new(tag_cats, viewer).get(20).map(&:id) } + + let(:viewer) { nil } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + + context 'with a local_only option set' do + subject { described_class.new(tag_cats, viewer, local: true).get(20).map(&:id) } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a remote_only option set' do + subject { described_class.new(tag_cats, viewer, remote: true).get(20).map(&:id) } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + end + + context 'when remote_topic_feed_access is disabled' do + before do + Setting.remote_topic_feed_access = 'disabled' + end + + context 'without local_only option' do + subject { described_class.new(tag_cats, viewer).get(20).map(&:id) } + + let(:viewer) { nil } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + + it 'is not affected by personal domain blocks' do + viewer.block_domain!('test.com') + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a local_only option set' do + subject { described_class.new(tag_cats, viewer, local: true).get(20).map(&:id) } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'does not include remote instances statuses' do + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + + it 'is not affected by personal domain blocks' do + viewer.block_domain!('test.com') + expect(subject).to include(local_status.id) + expect(subject).to_not include(remote_status.id) + end + end + end + + context 'with a remote_only option set' do + subject { described_class.new(tag_cats, viewer, remote: true).get(20).map(&:id) } + + let!(:remote_account) { Fabricate(:account, domain: 'test.com') } + let!(:local_status) { status_tagged_with_cats } + let!(:remote_status) { Fabricate(:status, account: remote_account, tags: [tag_cats]) } + + context 'without a viewer' do + let(:viewer) { nil } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a viewer' do + let(:viewer) { Fabricate(:account, username: 'viewer') } + + it 'returns an empty list' do + expect(subject).to be_empty + end + end + + context 'with a moderator as viewer' do + let(:viewer) { Fabricate(:moderator_user).account } + + it 'does not include local instances statuses' do + expect(subject).to_not include(local_status.id) + expect(subject).to include(remote_status.id) + end + end + end + end end end diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 18378c000..d41d3a9e2 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -84,6 +84,10 @@ RSpec.describe Tag do expect(subject.match('this is #aesthetic').to_s).to eq '#aesthetic' end + it 'matches #foo' do + expect(subject.match('this is #foo').to_s).to eq '#foo' + end + it 'matches digits at the start' do expect(subject.match('hello #3d').to_s).to eq '#3d' end diff --git a/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb index 249abc244..d3def6104 100644 --- a/spec/requests/api/v1/statuses_spec.rb +++ b/spec/requests/api/v1/statuses_spec.rb @@ -228,7 +228,7 @@ RSpec.describe '/api/v1/statuses' do end context 'with a self-quote post' do - let(:quoted_status) { Fabricate(:status, account: user.account) } + let!(:quoted_status) { Fabricate(:status, account: user.account) } let(:params) do { status: 'Hello world, this is a self-quote', @@ -236,6 +236,69 @@ RSpec.describe '/api/v1/statuses' do } end + it 'returns a quote post, as well as rate limit headers', :aggregate_failures do + expect { subject }.to change(user.account.statuses, :count).by(1) + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body[:quote]).to be_present + expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s + expect(response.headers['X-RateLimit-Remaining']).to eq (RateLimiter::FAMILIES[:statuses][:limit] - 1).to_s + end + end + + context 'with a quote to a non-mentioned user in a Private Mention' do + let!(:quoted_status) { Fabricate(:status, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) } + let(:params) do + { + status: 'Hello, this is a quote', + quoted_status_id: quoted_status.id, + visibility: :direct, + } + end + + it 'returns an error and does not create a post', :aggregate_failures do + expect { subject }.to_not change(user.account.statuses, :count) + + expect(response).to have_http_status(422) + expect(response.content_type) + .to start_with('application/json') + end + end + + context 'with a quote to a mentioned user in a Private Mention' do + let!(:quoted_status) { Fabricate(:status, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) } + let(:params) do + { + status: "Hello @#{quoted_status.account.acct}, this is a quote", + quoted_status_id: quoted_status.id, + visibility: :direct, + } + end + + it 'returns a quote post, as well as rate limit headers', :aggregate_failures do + expect { subject }.to change(user.account.statuses, :count).by(1) + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body[:quote]).to be_present + expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s + expect(response.headers['X-RateLimit-Remaining']).to eq (RateLimiter::FAMILIES[:statuses][:limit] - 1).to_s + end + end + + context 'with a quote of a reblog' do + let(:quoted_status) { Fabricate(:status, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) } + let(:reblog) { Fabricate(:status, reblog: quoted_status) } + let(:params) do + { + status: 'Hello world, this is a self-quote', + quoted_status_id: reblog.id, + } + end + it 'returns a quote post, as well as rate limit headers', :aggregate_failures do subject @@ -243,6 +306,7 @@ RSpec.describe '/api/v1/statuses' do expect(response.content_type) .to start_with('application/json') expect(response.parsed_body[:quote]).to be_present + expect(response.parsed_body[:quote][:quoted_status][:id]).to eq quoted_status.id.to_s expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s expect(response.headers['X-RateLimit-Remaining']).to eq (RateLimiter::FAMILIES[:statuses][:limit] - 1).to_s end diff --git a/spec/requests/signature_verification_spec.rb b/spec/requests/signature_verification_spec.rb index eccb2babc..3119138a0 100644 --- a/spec/requests/signature_verification_spec.rb +++ b/spec/requests/signature_verification_spec.rb @@ -352,34 +352,7 @@ RSpec.describe 'signature verification concern' do end end - # TODO: Remove when feature is enabled - context 'with an HTTP Message Signature (final RFC version) when support is disabled' do - before { Fabricate(:account, domain: 'remote.domain', uri: 'https://remote.domain/users/bob', private_key: nil, public_key: actor_keypair.public_key.to_pem) } - - context 'with a valid signature on a GET request' do - let(:signature_input) do - 'sig1=("@method" "@target-uri");created=1703066400;keyid="https://remote.domain/users/bob#main-key"' - end - let(:signature_header) do - 'sig1=:WfM6q/qBqhUyqPUDt9metjadJGtLLpmMTBzk/t+R3byKe4/TGAXC6vBB/M6NsD5qv8GCmQGtisCMQxJQO0IGODGzi+Jv+eqDJ50agMVXNV6nUOzY44c4/XTPoI98qyx1oEMa4Hefy3vSYKq96iDVAc+RDLCMTeGP3wn9wizjD1SNmU0RZI1bTB+eCkywMP9mM5zXzUOYF+Qkuf+WdEpPR1XUGPlnqfdvPalcKVfaI/VThBjI91D/lmUGoa69x4EBEHM+aJmW6086e7/dVh+FndKkdGfXslZXFZKi2flTGQZgEWLn948SqAaJQROkJg8B14Sb1NONS1qZBhK3Mum8Pg==:' # rubocop:disable Layout/LineLength - end - - it 'cannot verify signature', :aggregate_failures do - get '/activitypub/signature_required', headers: { - 'Host' => 'www.example.com', - 'Signature-Input' => signature_input, - 'Signature' => signature_header, - } - - expect(response).to have_http_status(401) - expect(response.parsed_body).to match( - error: 'Error parsing signature parameters' - ) - end - end - end - - context 'with an HTTP Message Signature (final RFC version)', feature: :http_message_signatures do + context 'with an HTTP Message Signature (final RFC version)' do context 'with a known account' do let!(:actor) { Fabricate(:account, domain: 'remote.domain', uri: 'https://remote.domain/users/bob', private_key: nil, public_key: actor_keypair.public_key.to_pem) } diff --git a/spec/serializers/rest/scheduled_status_serializer_spec.rb b/spec/serializers/rest/scheduled_status_serializer_spec.rb index 2cf009865..6fc2f2eca 100644 --- a/spec/serializers/rest/scheduled_status_serializer_spec.rb +++ b/spec/serializers/rest/scheduled_status_serializer_spec.rb @@ -10,14 +10,18 @@ RSpec.describe REST::ScheduledStatusSerializer do ) end - let(:scheduled_status) { Fabricate.build(:scheduled_status, scheduled_at: 4.minutes.from_now, params: { application_id: 123 }) } + let(:scheduled_status) { Fabricate.build(:scheduled_status, scheduled_at: 4.minutes.from_now, params: { application_id: 123, quoted_status_id: 456, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16 }) } describe 'serialization' do it 'returns expected values and removes application_id from params' do expect(subject.deep_symbolize_keys) .to include( scheduled_at: be_a(String).and(match_api_datetime_format), - params: include(:application_id) + params: a_hash_including( + application_id: 123, + quoted_status_id: '456', + quote_approval_policy: 'public' + ) ) end end diff --git a/spec/system/home_spec.rb b/spec/system/home_spec.rb index 0838b3d8e..aafa9323c 100644 --- a/spec/system/home_spec.rb +++ b/spec/system/home_spec.rb @@ -23,5 +23,41 @@ RSpec.describe 'Home page' do .to have_css('noscript', text: /Mastodon/) .and have_css('body', class: 'app-body') end + + context 'when the landing page is set to about' do + before do + Setting.landing_page = 'about' + end + + it 'visits the root path and is redirected to the about page', :js do + visit root_path + + expect(page).to have_current_path('/about') + end + end + + context 'when the landing page is set to trends' do + before do + Setting.landing_page = 'trends' + end + + it 'visits the root path and is redirected to the trends page', :js do + visit root_path + + expect(page).to have_current_path('/explore') + end + end + + context 'when the landing page is set to local_feed' do + before do + Setting.landing_page = 'local_feed' + end + + it 'visits the root path and is redirected to the local live feed page', :js do + visit root_path + + expect(page).to have_current_path('/public/local') + end + end end end diff --git a/spec/workers/publish_scheduled_status_worker_spec.rb b/spec/workers/publish_scheduled_status_worker_spec.rb index a91e66596..81480f7e5 100644 --- a/spec/workers/publish_scheduled_status_worker_spec.rb +++ b/spec/workers/publish_scheduled_status_worker_spec.rb @@ -13,8 +13,12 @@ RSpec.describe PublishScheduledStatusWorker do end context 'when the account is not disabled' do + let(:user) { Fabricate(:user) } + let(:scheduled_status) { Fabricate(:scheduled_status, account: user.account, params: { text: 'Hello world, future!', quoted_status_id: Fabricate(:status, account: user.account).id }) } + it 'creates a status and removes scheduled record' do expect(scheduled_status.account.statuses.first.text).to eq 'Hello world, future!' + expect(scheduled_status.account.statuses.first.quote).to_not be_nil expect(ScheduledStatus.find_by(id: scheduled_status.id)).to be_nil end diff --git a/streaming/Dockerfile b/streaming/Dockerfile index 679425dfc..3a12007f6 100644 --- a/streaming/Dockerfile +++ b/streaming/Dockerfile @@ -8,9 +8,9 @@ ARG TARGETPLATFORM=${TARGETPLATFORM} ARG BUILDPLATFORM=${BUILDPLATFORM} ARG BASE_REGISTRY="docker.io" -# Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] +# Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="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 image to use for base image based on combined variables (ex: 20-trixie-slim) @@ -32,20 +32,20 @@ ARG GID="991" # Apply Mastodon build options based on options above ENV \ -# Apply Mastodon version information + # Apply Mastodon version information MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \ MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \ -# Apply timezone + # Apply timezone TZ=${TZ} ENV \ -# Configure the IP to bind Mastodon to when serving traffic + # Configure the IP to bind Mastodon to when serving traffic BIND="0.0.0.0" \ -# Explicitly set PORT to match the exposed port + # Explicitly set PORT to match the exposed port PORT=4000 \ -# Use production settings for Yarn, Node and related nodejs based tools + # Use production settings for Yarn, Node and related nodejs based tools NODE_ENV="production" \ -# Add Ruby and Mastodon installation to the PATH + # Add Ruby and Mastodon installation to the PATH DEBIAN_FRONTEND="noninteractive" # Set default shell used for running commands @@ -56,29 +56,29 @@ ARG TARGETPLATFORM RUN echo "Target platform is ${TARGETPLATFORM}" RUN \ -# Remove automatic apt cache Docker cleanup scripts + # Remove automatic apt cache Docker cleanup scripts rm -f /etc/apt/apt.conf.d/docker-clean; \ -# Sets timezone + # Sets timezone echo "${TZ}" > /etc/localtime; \ -# Creates mastodon user/group and sets home directory + # Creates mastodon user/group and sets home directory groupadd -g "${GID}" mastodon; \ useradd -l -u "${UID}" -g "${GID}" -m -d /opt/mastodon mastodon; \ -# Creates symlink for /mastodon folder + # Creates symlink for /mastodon folder ln -s /opt/mastodon /mastodon; # hadolint ignore=DL3008,DL3005 RUN \ -# Mount Apt cache and lib directories from Docker buildx caches ---mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \ ---mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \ -# Upgrade to check for security updates to Debian image + # Mount Apt cache and lib directories from Docker buildx caches + --mount=type=cache,id=apt-cache-${TARGETPLATFORM},target=/var/cache/apt,sharing=locked \ + --mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \ + # Upgrade to check for security updates to Debian image apt-get update; \ apt-get dist-upgrade -yq; \ apt-get install -y --no-install-recommends \ - ca-certificates \ - curl \ - tzdata \ - wget \ + ca-certificates \ + curl \ + tzdata \ + wget \ ; # Set /opt/mastodon as working directory @@ -91,19 +91,19 @@ COPY .yarn /opt/mastodon/.yarn COPY ./streaming /opt/mastodon/streaming RUN \ -# Mount local Corepack and Yarn caches from Docker buildx caches ---mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \ ---mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \ + # Mount local Corepack and Yarn caches from Docker buildx caches + --mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \ + --mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \ # Configure Corepack rm /usr/local/bin/yarn*; \ corepack enable; \ corepack prepare --activate; RUN \ -# Mount Corepack and Yarn caches from Docker buildx caches ---mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \ ---mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \ -# Install Node packages + # Mount Corepack and Yarn caches from Docker buildx caches + --mount=type=cache,id=corepack-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/corepack,sharing=locked \ + --mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \ + # Install Node packages yarn workspaces focus --production @mastodon/streaming; # Set the running user for resulting container diff --git a/streaming/database.js b/streaming/database.js index 8899fd762..076c00438 100644 --- a/streaming/database.js +++ b/streaming/database.js @@ -73,12 +73,8 @@ export function configFromEnv(env, environment) { // types, including the casting of parsedUrl.ssl to Record if (typeof parsedUrl.ssl === 'boolean') { baseConfig.ssl = parsedUrl.ssl; - } else if ( - typeof parsedUrl.ssl === 'object' && - !Array.isArray(parsedUrl.ssl) && - parsedUrl.ssl !== null - ) { - /** @type {Record} */ + } else if (typeof parsedUrl.ssl === 'object' && !Array.isArray(parsedUrl.ssl) && parsedUrl.ssl !== null) { + /** @type {Record} */ const sslOptions = parsedUrl.ssl; baseConfig.ssl = {}; diff --git a/streaming/index.js b/streaming/index.js index cf6541097..7136915ff 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -29,6 +29,7 @@ import * as Redis from './redis.js'; import { isTruthy, normalizeHashtag, firstParam } from './utils.js'; const environment = process.env.NODE_ENV || 'development'; +const PERMISSION_VIEW_FEEDS = 0x0000000000100000; // Correctly detect and load .env or .env.production file based on environment: const dotenvFile = environment === 'production' ? '.env.production' : '.env'; @@ -52,15 +53,28 @@ initializeLogLevel(process.env, environment); * @property {string[]} scopes * @property {string} accountId * @property {string[]} chosenLanguages + * @property {number} permissions */ +/** + * @typedef {http.IncomingMessage & ResolvedAccount & { + * path: string + * query: Record + * remoteAddress?: string + * cachedFilters: unknown + * scopes: string[] + * necessaryScopes: string[] + * }} Request + */ + + /** * Attempts to safely parse a string as JSON, used when both receiving a message * from redis and when receiving a message from a client over a websocket * connection, this is why it accepts a `req` argument. * @param {string} json - * @param {any?} req - * @returns {Object.|null} + * @param {Request?} req + * @returns {Object.|null} */ const parseJSON = (json, req) => { try { @@ -188,6 +202,7 @@ const startServer = async () => { let resolvedAccount; try { + // @ts-expect-error resolvedAccount = await accountFromRequest(request); } catch (err) { // Unfortunately for using the on('upgrade') setup, we need to manually @@ -249,7 +264,7 @@ const startServer = async () => { }); /** - * @type {Object.): void>>} + * @type {Object.): void>>} */ const subs = {}; @@ -380,7 +395,7 @@ const startServer = async () => { }; /** - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {string[]} necessaryScopes * @returns {boolean} */ @@ -389,11 +404,11 @@ const startServer = async () => { /** * @param {string} token - * @param {any} req + * @param {Request} req * @returns {Promise} */ const accountFromToken = async (token, req) => { - const result = await pgPool.query('SELECT oauth_access_tokens.id, oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id INNER JOIN accounts ON accounts.id = users.account_id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL AND users.disabled IS FALSE AND accounts.suspended_at IS NULL LIMIT 1', [token]); + const result = await pgPool.query('SELECT oauth_access_tokens.id, oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes, COALESCE(user_roles.permissions, 0) AS permissions FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id INNER JOIN accounts ON accounts.id = users.account_id LEFT OUTER JOIN user_roles ON user_roles.id = users.role_id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL AND users.disabled IS FALSE AND accounts.suspended_at IS NULL LIMIT 1', [token]); if (result.rows.length === 0) { throw new AuthenticationError('Invalid access token'); @@ -409,19 +424,18 @@ const startServer = async () => { scopes: result.rows[0].scopes.split(' '), accountId: result.rows[0].account_id, chosenLanguages: result.rows[0].chosen_languages, + permissions: result.rows[0].permissions, }; }; /** - * @param {any} req + * @param {Request} req * @returns {Promise} */ - const accountFromRequest = (req) => - new Promise((resolve, reject) => { - const authorization = req.headers.authorization; - const location = url.parse(req.url, true); - const accessToken = - location.query.access_token || req.headers['sec-websocket-protocol']; + const accountFromRequest = (req) => new Promise((resolve, reject) => { + const authorization = req.headers.authorization; + const location = req.url ? url.parse(req.url, true) : undefined; + const accessToken = location?.query.access_token || req.headers['sec-websocket-protocol']; if (!authorization && !accessToken) { reject(new AuthenticationError('Missing access token')); @@ -432,11 +446,12 @@ const startServer = async () => { ? authorization.replace(/^Bearer /, '') : accessToken; - resolve(accountFromToken(token, req)); - }); + // @ts-expect-error + resolve(accountFromToken(token, req)); + }); /** - * @param {any} req + * @param {Request} req * @returns {string|undefined} */ const channelNameFromPath = (req) => { @@ -468,7 +483,7 @@ const startServer = async () => { }; /** - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {import('pino').Logger} logger * @param {string|undefined} channelName * @returns {Promise.} @@ -515,7 +530,7 @@ const startServer = async () => { */ /** - * @param {any} req + * @param {Request} req * @param {SystemMessageHandlers} eventHandlers * @returns {SubscriptionListener} */ @@ -542,7 +557,7 @@ const startServer = async () => { }; /** - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {http.OutgoingMessage} res */ const subscribeHttpToSystemChannel = (req, res) => { @@ -573,8 +588,8 @@ const startServer = async () => { }; /** - * @param {any} req - * @param {any} res + * @param {Request} req + * @param {http.ServerResponse} res * @param {function(Error=): void} next */ const authenticationMiddleware = (req, res, next) => { @@ -607,8 +622,8 @@ const startServer = async () => { /** * @param {Error} err - * @param {any} req - * @param {any} res + * @param {Request} req + * @param {http.ServerResponse} res * @param {function(Error=): void} next */ const errorMiddleware = (err, req, res, next) => { @@ -626,17 +641,15 @@ const startServer = async () => { }; /** - * @param {any[]} arr + * @param {string[]} arr * @param {number=} shift * @returns {string} */ - // @ts-ignore - const placeholders = (arr, shift = 0) => - arr.map((_, i) => `$${i + 1 + shift}`).join(', '); + const placeholders = (arr, shift = 0) => arr.map((_, i) => `$${i + 1 + shift}`).join(', '); /** * @param {string} listId - * @param {any} req + * @param {Request} req * @returns {Promise.} */ const authorizeListAccess = async (listId, req) => { @@ -652,25 +665,55 @@ const startServer = async () => { } }; + /** + * @param {string} kind + * @param {ResolvedAccount} account + * @returns {Promise.<{ localAccess: boolean, remoteAccess: boolean }>} + */ + const getFeedAccessSettings = async (kind, account) => { + const access = { localAccess: true, remoteAccess: true }; + + if (account.permissions & PERMISSION_VIEW_FEEDS) { + return access; + } + + let localAccessVar, remoteAccessVar; + + if (kind === 'hashtag') { + localAccessVar = 'local_topic_feed_access'; + remoteAccessVar = 'remote_topic_feed_access'; + } else { + localAccessVar = 'local_live_feed_access'; + remoteAccessVar = 'remote_live_feed_access'; + } + + const result = await pgPool.query('SELECT var, value FROM settings WHERE var IN ($1, $2)', [localAccessVar, remoteAccessVar]); + + result.rows.forEach((row) => { + if (row.var === localAccessVar) { + access.localAccess = row.value !== "--- disabled\n"; + } else { + access.remoteAccess = row.value !== "--- disabled\n"; + } + }); + + return access; + }; + /** * @param {string[]} channelIds - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {import('pino').Logger} log * @param {function(string, string): void} output * @param {undefined | function(string[], SubscriptionListener): void} attachCloseHandler * @param {'websocket' | 'eventsource'} destinationType - * @param {boolean=} needsFiltering + * @param {Object} options + * @param {boolean} options.needsFiltering + * @param {boolean=} options.filterLocal + * @param {boolean=} options.filterRemote * @returns {SubscriptionListener} */ - const streamFrom = ( - channelIds, - req, - log, - output, - attachCloseHandler, - destinationType, - needsFiltering = false, - ) => { + const streamFrom = (channelIds, req, log, output, attachCloseHandler, destinationType, { needsFiltering, filterLocal, filterRemote } = { needsFiltering: false, filterLocal: false, filterRemote: false }) => { log.info({ channelIds }, `Starting stream`); /** @@ -714,10 +757,8 @@ const startServer = async () => { // // The channels that need filtering are determined in the function // `channelNameToIds` defined below: - if ( - !needsFiltering || - (event !== 'update' && event !== 'status.update') - ) { + if (!needsFiltering || (event !== 'update' && event !== 'status.update')) { + // @ts-expect-error transmit(event, payload); return; } @@ -725,14 +766,17 @@ const startServer = async () => { // The rest of the logic from here on in this function is to handle // filtering of statuses: + const localPayload = payload.account.username === payload.account.acct; + if (localPayload ? filterLocal : filterRemote) { + log.debug(`Message ${payload.id} filtered by feed settings`); + return; + } + // Filter based on language: - if ( - Array.isArray(req.chosenLanguages) && - req.chosenLanguages.indexOf(payload.language) === -1 - ) { - log.debug( - `Message ${payload.id} filtered by language (${payload.language})`, - ); + // @ts-expect-error + if (Array.isArray(req.chosenLanguages) && req.chosenLanguages.indexOf(payload.language) === -1) { + // @ts-expect-error + log.debug(`Message ${payload.id} filtered by language (${payload.language})`); return; } @@ -743,10 +787,9 @@ const startServer = async () => { } // Filter based on domain blocks, blocks, mutes, or custom filters: - // @ts-ignore - const targetAccountIds = [payload.account.id].concat( - payload.mentions.map((item) => item.id), - ); + // @ts-expect-error + const targetAccountIds = [payload.account.id].concat(payload.mentions.map(item => item.id)); + // @ts-expect-error const accountDomain = payload.account.acct.split('@')[1]; // TODO: Move this logic out of the message handling loop @@ -757,9 +800,8 @@ const startServer = async () => { } const queries = [ - // @ts-ignore - client.query( - `SELECT 1 + // @ts-expect-error + client.query(`SELECT 1 FROM blocks WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) OR (account_id = $2 AND target_account_id = $1) @@ -767,44 +809,32 @@ const startServer = async () => { SELECT 1 FROM mutes WHERE account_id = $1 - AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, - [req.accountId, payload.account.id].concat(targetAccountIds), - ), + AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, [req.accountId, payload. + // @ts-expect-error + account.id].concat(targetAccountIds)), ]; if (accountDomain) { - // @ts-ignore - queries.push( - client.query( - 'SELECT 1 FROM account_domain_blocks WHERE account_id = $1 AND domain = $2', - [req.accountId, accountDomain], - ), - ); + // @ts-expect-error + queries.push(client.query('SELECT 1 FROM account_domain_blocks WHERE account_id = $1 AND domain = $2', [req.accountId, accountDomain])); } - // @ts-ignore + // @ts-expect-error if (!payload.filtered && !req.cachedFilters) { - // @ts-ignore - queries.push( - client.query( - 'SELECT filter.id AS id, filter.phrase AS title, filter.context AS context, filter.expires_at AS expires_at, filter.action AS filter_action, keyword.keyword AS keyword, keyword.whole_word AS whole_word FROM custom_filter_keywords keyword JOIN custom_filters filter ON keyword.custom_filter_id = filter.id WHERE filter.account_id = $1 AND (filter.expires_at IS NULL OR filter.expires_at > NOW())', - [req.accountId], - ), - ); + // @ts-expect-error + queries.push(client.query('SELECT filter.id AS id, filter.phrase AS title, filter.context AS context, filter.expires_at AS expires_at, filter.action AS filter_action, keyword.keyword AS keyword, keyword.whole_word AS whole_word FROM custom_filter_keywords keyword JOIN custom_filters filter ON keyword.custom_filter_id = filter.id WHERE filter.account_id = $1 AND (filter.expires_at IS NULL OR filter.expires_at > NOW())', [req.accountId])); } Promise.all(queries) .then((values) => { releasePgConnection(); - // Handling blocks & mutes and domain blocks: If one of those applies, - // then we don't transmit the payload of the event to the client - if ( - values[0].rows.length > 0 || - (accountDomain && values[1].rows.length > 0) - ) { - return; - } + // Handling blocks & mutes and domain blocks: If one of those applies, + // then we don't transmit the payload of the event to the client + // @ts-expect-error + if (values[0].rows.length > 0 || (accountDomain && values[1].rows.length > 0)) { + return; + } // If the payload already contains the `filtered` property, it means // that filtering has been applied on the ruby on rails side, as @@ -814,52 +844,47 @@ const startServer = async () => { return; } - // Handling for constructing the custom filters and caching them on the request - // TODO: Move this logic out of the message handling lifecycle - // @ts-ignore - if (!req.cachedFilters) { - const filterRows = values[accountDomain ? 2 : 1].rows; + // Handling for constructing the custom filters and caching them on the request + // TODO: Move this logic out of the message handling lifecycle + // @ts-ignore + if (!req.cachedFilters) { + // @ts-expect-error + const filterRows = values[accountDomain ? 2 : 1].rows; - // @ts-ignore - req.cachedFilters = filterRows.reduce((cache, filter) => { - if (cache[filter.id]) { - cache[filter.id].keywords.push([ - filter.keyword, - filter.whole_word, - ]); - } else { - cache[filter.id] = { - keywords: [[filter.keyword, filter.whole_word]], + req.cachedFilters = filterRows.reduce((cache, filter) => { + if (cache[filter.id]) { + cache[filter.id].keywords.push([filter.keyword, filter.whole_word]); + } else { + cache[filter.id] = { + keywords: [[filter.keyword, filter.whole_word]], + expires_at: filter.expires_at, + filter: { + id: filter.id, + title: filter.title, + context: filter.context, expires_at: filter.expires_at, - filter: { - id: filter.id, - title: filter.title, - context: filter.context, - expires_at: filter.expires_at, - // filter.filter_action is the value from the - // custom_filters.action database column, it is an integer - // representing a value in an enum defined by Ruby on Rails: - // - // enum { warn: 0, hide: 1 } - filter_action: ['warn', 'hide'][filter.filter_action], - }, - }; - } + // filter.filter_action is the value from the + // custom_filters.action database column, it is an integer + // representing a value in an enum defined by Ruby on Rails: + // + // enum { warn: 0, hide: 1 } + filter_action: ['warn', 'hide'][filter.filter_action], + }, + }; + } return cache; }, {}); - // Construct the regular expressions for the custom filters: This - // needs to be done in a separate loop as the database returns one - // filterRow per keyword, so we need all the keywords before - // constructing the regular expression - // @ts-ignore - Object.keys(req.cachedFilters).forEach((key) => { - // @ts-ignore - req.cachedFilters[key].regexp = new RegExp( - req.cachedFilters[key].keywords - .map(([keyword, whole_word]) => { - let expr = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + // Construct the regular expressions for the custom filters: This + // needs to be done in a separate loop as the database returns one + // filterRow per keyword, so we need all the keywords before + // constructing the regular expression + // @ts-expect-error + Object.keys(req.cachedFilters).forEach((key) => { + // @ts-expect-error + req.cachedFilters[key].regexp = new RegExp(req.cachedFilters[key].keywords.map(([keyword, whole_word]) => { + let expr = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); if (whole_word) { if (/^[\w]/.test(expr)) { @@ -879,40 +904,21 @@ const startServer = async () => { }); } - // Apply cachedFilters against the payload, constructing a - // `filter_results` array of FilterResult entities - // @ts-ignore - if (req.cachedFilters) { - const status = payload; - // TODO: Calculate searchableContent in Ruby on Rails: - // @ts-ignore - const searchableContent = [ - status.spoiler_text || '', - status.content, - ] - .concat( - status.poll && status.poll.options - ? status.poll.options.map((option) => option.title) - : [], - ) - .concat(status.media_attachments.map((att) => att.description)) - .join('\n\n') - .replace(//g, '\n') - .replace(/<\/p>

/g, '\n\n'); - const searchableTextContent = - JSDOM.fragment(searchableContent).textContent; + // Apply cachedFilters against the payload, constructing a + // `filter_results` array of FilterResult entities + if (req.cachedFilters) { + const status = payload; + // TODO: Calculate searchableContent in Ruby on Rails: + // @ts-expect-error + const searchableContent = ([status.spoiler_text || '', status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(//g, '\n').replace(/<\/p>

/g, '\n\n'); + const searchableTextContent = JSDOM.fragment(searchableContent).textContent; - const now = new Date(); - // @ts-ignore - const filter_results = Object.values(req.cachedFilters).reduce( - (results, cachedFilter) => { - // Check the filter hasn't expired before applying: - if ( - cachedFilter.expires_at !== null && - cachedFilter.expires_at < now - ) { - return results; - } + const now = new Date(); + const filter_results = Object.values(req.cachedFilters).reduce((results, cachedFilter) => { + // Check the filter hasn't expired before applying: + if (cachedFilter.expires_at !== null && cachedFilter.expires_at < now) { + return results; + } // Just in-case JSDOM fails to find textContent in searchableContent if (!searchableTextContent) { @@ -972,8 +978,8 @@ const startServer = async () => { }; /** - * @param {any} req - * @param {any} res + * @param {Request} req + * @param {http.ServerResponse} res * @returns {function(string, string): void} */ const streamToHttp = (req, res) => { @@ -1019,7 +1025,7 @@ const startServer = async () => { }; /** - * @param {any} req + * @param {Request} req * @param {function(): void} [closeHandler] * @returns {function(string[], SubscriptionListener): void} */ @@ -1071,10 +1077,13 @@ const startServer = async () => { app.use(api); + // @ts-expect-error api.use(authenticationMiddleware); + // @ts-expect-error api.use(errorMiddleware); api.get('/api/v1/streaming/*', (req, res) => { + // @ts-expect-error const channelName = channelNameFromPath(req); // FIXME: In theory we'd never actually reach here due to @@ -1085,24 +1094,17 @@ const startServer = async () => { return; } - channelNameToIds(req, channelName, req.query) - .then(({ channelIds, options }) => { - const onSend = streamToHttp(req, res); - const onEnd = streamHttpEnd(req, subscriptionHeartbeat(channelIds)); + // @ts-expect-error + channelNameToIds(req, channelName, req.query).then(({ channelIds, options }) => { + // @ts-expect-error + const onSend = streamToHttp(req, res); + // @ts-expect-error + const onEnd = streamHttpEnd(req, subscriptionHeartbeat(channelIds)); - // @ts-ignore - streamFrom( - channelIds, - req, - req.log, - onSend, - onEnd, - 'eventsource', - options.needsFiltering, - ); - }) - .catch((err) => { - const { statusCode, errorMessage } = extractErrorStatusAndMessage(err); + // @ts-ignore + streamFrom(channelIds, req, req.log, onSend, onEnd, 'eventsource', options); + }).catch(err => { + const {statusCode, errorMessage } = extractErrorStatusAndMessage(err); res.log.info({ err }, 'Eventsource subscription error'); @@ -1119,7 +1121,7 @@ const startServer = async () => { */ /** - * @param {any} req + * @param {Request} req * @returns {string[]} */ const channelsForUserStream = (req) => { @@ -1133,19 +1135,34 @@ const startServer = async () => { }; /** - * @param {any} req + * @param {Request} req * @param {string} name * @param {StreamParams} params - * @returns {Promise.<{ channelIds: string[], options: { needsFiltering: boolean } }>} + * @returns {Promise.<{ channelIds: string[], options: { needsFiltering: boolean, filterLocal?: boolean, filterRemote?: boolean } }>} */ - const channelNameToIds = (req, name, params) => - new Promise((resolve, reject) => { - switch (name) { - case 'user': - resolve({ - channelIds: channelsForUserStream(req), - options: { needsFiltering: false }, - }); + const channelNameToIds = (req, name, params) => new Promise((resolve, reject) => { + /** + * @param {string} feedKind + * @param {string} channelId + * @param {{ needsFiltering: boolean }} options + */ + const resolveFeed = (feedKind, channelId, options) => { + getFeedAccessSettings(feedKind, req).then(({ localAccess, remoteAccess }) => { + resolve({ + channelIds: [channelId], + options: { ...options, filterLocal: !localAccess, filterRemote: !remoteAccess }, + }); + }).catch(() => { + reject(new Error('Error getting feed access settings')); + }); + }; + + switch (name) { + case 'user': + resolve({ + channelIds: channelsForUserStream(req), + options: { needsFiltering: false }, + }); break; case 'user:notification': @@ -1154,78 +1171,48 @@ const startServer = async () => { options: { needsFiltering: false }, }); - break; - case 'public': - resolve({ - channelIds: ['timeline:public'], - options: { needsFiltering: true }, - }); + break; + case 'public': + resolveFeed('public', 'timeline:public', { needsFiltering: true }); + break; + case 'public:local': + resolveFeed('public', 'timeline:public:local', { needsFiltering: true }); + break; + case 'public:remote': + resolveFeed('public', 'timeline:public:remote', { needsFiltering: true }); + break; + case 'public:media': + resolveFeed('public', 'timeline:public:media', { needsFiltering: true }); + break; + case 'public:local:media': + resolveFeed('public', 'timeline:public:local:media', { needsFiltering: true }); + break; + case 'public:remote:media': + resolveFeed('public', 'timeline:public:remote:media', { needsFiltering: true }); + break; + case 'direct': + resolve({ + channelIds: [`timeline:direct:${req.accountId}`], + options: { needsFiltering: false }, + }); - break; - case 'public:local': - resolve({ - channelIds: ['timeline:public:local'], - options: { needsFiltering: true }, - }); + break; + case 'hashtag': + if (!params.tag) { + reject(new RequestError('Missing tag name parameter')); + return; + } - break; - case 'public:remote': - resolve({ - channelIds: ['timeline:public:remote'], - options: { needsFiltering: true }, - }); + resolveFeed('hashtag', `timeline:hashtag:${normalizeHashtag(params.tag)}`, { needsFiltering: true }); - break; - case 'public:media': - resolve({ - channelIds: ['timeline:public:media'], - options: { needsFiltering: true }, - }); + break; + case 'hashtag:local': + if (!params.tag) { + reject(new RequestError('Missing tag name parameter')); + return; + } - break; - case 'public:local:media': - resolve({ - channelIds: ['timeline:public:local:media'], - options: { needsFiltering: true }, - }); - - break; - case 'public:remote:media': - resolve({ - channelIds: ['timeline:public:remote:media'], - options: { needsFiltering: true }, - }); - - break; - case 'direct': - resolve({ - channelIds: [`timeline:direct:${req.accountId}`], - options: { needsFiltering: false }, - }); - - break; - case 'hashtag': - if (!params.tag) { - reject(new RequestError('Missing tag name parameter')); - } else { - resolve({ - channelIds: [`timeline:hashtag:${normalizeHashtag(params.tag)}`], - options: { needsFiltering: true }, - }); - } - - break; - case 'hashtag:local': - if (!params.tag) { - reject(new RequestError('Missing tag name parameter')); - } else { - resolve({ - channelIds: [ - `timeline:hashtag:${normalizeHashtag(params.tag)}:local`, - ], - options: { needsFiltering: true }, - }); - } + resolveFeed('hashtag', `timeline:hashtag:${normalizeHashtag(params.tag)}:local`, { needsFiltering: true }); break; case 'list': @@ -1274,7 +1261,7 @@ const startServer = async () => { /** * @typedef WebSocketSession * @property {import('ws').WebSocket & { isAlive: boolean}} websocket - * @property {http.IncomingMessage & ResolvedAccount} request + * @property {Request} request * @property {import('pino').Logger} logger * @property {Object.} subscriptions */ @@ -1297,21 +1284,9 @@ const startServer = async () => { return; } - const onSend = streamToWs( - request, - websocket, - streamNameFromChannelName(channelName, params), - ); - const stopHeartbeat = subscriptionHeartbeat(channelIds); - const listener = streamFrom( - channelIds, - request, - logger, - onSend, - undefined, - 'websocket', - options.needsFiltering, - ); + const onSend = streamToWs(request, websocket, streamNameFromChannelName(channelName, params)); + const stopHeartbeat = subscriptionHeartbeat(channelIds); + const listener = streamFrom(channelIds, request, logger, onSend, undefined, 'websocket', options); metrics.connectedChannels .labels({ type: 'websocket', channel: channelName }) @@ -1433,7 +1408,7 @@ const startServer = async () => { /** * @param {import('ws').WebSocket & { isAlive: boolean }} ws - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {import('pino').Logger} log */ function onConnection(ws, req, log) { @@ -1503,9 +1478,19 @@ const startServer = async () => { const { type, stream, ...params } = json; if (type === 'subscribe') { - subscribeWebsocketToChannel(session, firstParam(stream), params); + subscribeWebsocketToChannel( + session, + // @ts-expect-error + firstParam(stream), + params + ); } else if (type === 'unsubscribe') { - unsubscribeWebsocketFromChannel(session, firstParam(stream), params); + unsubscribeWebsocketFromChannel( + session, + // @ts-expect-error + firstParam(stream), + params + ); } else { // Unknown action type } @@ -1528,14 +1513,14 @@ const startServer = async () => { wss.on('connection', onConnection); setInterval(() => { - wss.clients.forEach((ws) => { - // @ts-ignore + wss.clients.forEach(ws => { + // @ts-expect-error if (ws.isAlive === false) { ws.terminate(); return; } - // @ts-ignore + // @ts-expect-error ws.isAlive = false; ws.ping('', false); }); @@ -1565,14 +1550,16 @@ const startServer = async () => { }; /** - * @param {any} server + * @param {http.Server} server * @param {function(string): void} [onSuccess] */ const attachServerWithConfig = (server, onSuccess) => { if (process.env.SOCKET) { server.listen(process.env.SOCKET, () => { if (onSuccess) { + // @ts-expect-error fs.chmodSync(server.address(), 0o666); + // @ts-expect-error onSuccess(server.address()); } }); @@ -1587,6 +1574,7 @@ const attachServerWithConfig = (server, onSuccess) => { server.listen(port, bind, () => { if (onSuccess) { + // @ts-expect-error onSuccess(`${server.address().address}:${server.address().port}`); } }); diff --git a/streaming/logging.js b/streaming/logging.js index e1c552c22..61946b622 100644 --- a/streaming/logging.js +++ b/streaming/logging.js @@ -100,7 +100,7 @@ export function createWebsocketLogger(request, resolvedAccount) { /** * Initializes the log level based on the environment - * @param {Object} env + * @param {Object} env * @param {string} environment */ export function initializeLogLevel(env, environment) { diff --git a/streaming/redis.js b/streaming/redis.js index 6c2559dbd..a69329d50 100644 --- a/streaming/redis.js +++ b/streaming/redis.js @@ -6,6 +6,7 @@ import { parseIntFromEnvValue } from './utils.js'; * @typedef RedisConfiguration * @property {string|undefined} url * @property {import('ioredis').RedisOptions} options + * @property {string|undefined} namespace */ /** diff --git a/streaming/utils.js b/streaming/utils.js index 47c63dd4c..dd5e82c67 100644 --- a/streaming/utils.js +++ b/streaming/utils.js @@ -13,11 +13,15 @@ const FALSE_VALUES = [ ]; /** - * @param {any} value + * @typedef {typeof FALSE_VALUES[number]} FalseValue + */ + +/** + * @param {unknown} value * @returns {boolean} */ export function isTruthy(value) { - return value && !FALSE_VALUES.includes(value); + return !!value && !FALSE_VALUES.includes(/** @type {FalseValue} */ (value)); } /** diff --git a/tsconfig.json b/tsconfig.json index 2b981b67a..db727baf1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,8 @@ "mastodon/*": ["app/javascript/mastodon/*"], "images/*": ["app/javascript/images/*"], "styles/*": ["app/javascript/styles/*"] - } + }, + "plugins": [{ "name": "typescript-plugin-css-modules" }] }, "include": [ "vite.config.mts", diff --git a/vite.config.mts b/vite.config.mts index 6876302dd..f2a0ec059 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -27,6 +27,8 @@ import { MastodonAssetsManifest } from './config/vite/plugin-assets-manifest'; const jsRoot = path.resolve(__dirname, 'app/javascript'); +const cssAliasClasses: ReadonlyArray = ['components', 'features']; + export const config: UserConfigFnPromise = async ({ mode, command }) => { const isProdBuild = mode === 'production' && command === 'build'; @@ -49,6 +51,45 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { }, }, css: { + modules: { + generateScopedName(name, filename) { + let prefix = ''; + + // Use the top two segments of the path as the prefix. + const [parentDirName, dirName] = path + .dirname(filename) + .split(path.sep) + .slice(-2) + .map((dir) => dir.toLowerCase()); + + // If the parent directory is in the cssAliasClasses list, use + // the first four letters of it as the prefix, otherwise use the full name. + if (parentDirName) { + if (cssAliasClasses.includes(parentDirName)) { + prefix = parentDirName.slice(0, 4); + } else { + prefix = parentDirName; + } + } + + // If we have a directory name, append it to the prefix. + if (dirName) { + prefix = `${prefix}_${dirName}`; + } + + // If the file is not styles.module.scss or style.module.scss, + // append the file base name to the prefix. + const baseName = path.basename( + filename, + `.module${path.extname(filename)}`, + ); + if (baseName !== 'styles' && baseName !== 'style') { + prefix = `${prefix}_${baseName}`; + } + + return `_${prefix}__${name}`; + }, + }, postcss: { plugins: [ postcssPresetEnv({ @@ -73,7 +114,6 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { port: 3036, }, build: { - target: 'modules', commonjsOptions: { transformMixedEsModules: true }, chunkSizeWarningLimit: 1 * 1024 * 1024, // 1MB sourcemap: true, diff --git a/yarn.lock b/yarn.lock index 7cc9f3187..1b270a447 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,6 +19,13 @@ __metadata: languageName: node linkType: hard +"@adobe/css-tools@npm:~4.3.1": + version: 4.3.3 + resolution: "@adobe/css-tools@npm:4.3.3" + checksum: 10c0/e76e712df713964b87cdf2aca1f0477f19bebd845484d5fcba726d3ec7782366e2f26ec8cb2dcfaf47081a5c891987d8a9f5c3f30d11e1eb3c1848adc27fcb24 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.3.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" @@ -2054,16 +2061,16 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.52.0": - version: 0.52.0 - resolution: "@es-joy/jsdoccomment@npm:0.52.0" +"@es-joy/jsdoccomment@npm:~0.71.0": + version: 0.71.0 + resolution: "@es-joy/jsdoccomment@npm:0.71.0" dependencies: "@types/estree": "npm:^1.0.8" - "@typescript-eslint/types": "npm:^8.34.1" + "@typescript-eslint/types": "npm:^8.46.0" comment-parser: "npm:1.4.1" esquery: "npm:^1.6.0" - jsdoc-type-pratt-parser: "npm:~4.1.0" - checksum: 10c0/4def78060ef58859f31757b9d30c4939fc33e7d9ee85637a7f568c1d209c33aa0abd2cf5a3a4f3662ec5b12b85ecff2f2035d809dc93b9382a31a6dfb200d83c + jsdoc-type-pratt-parser: "npm:~6.6.0" + checksum: 10c0/fe64b729c18238c7e83f8fab30eab8ce97da6565adbb963011463f9abedef5393972ac1eeebd04b17b189e94bc389274dcb8f707023e96fd922d12dc608b5409 languageName: node linkType: hard @@ -2795,7 +2802,7 @@ __metadata: "@gamestdio/websocket": "npm:^0.3.2" "@github/webauthn-json": "npm:^2.1.1" "@optimize-lodash/rollup-plugin": "npm:^5.0.2" - "@rails/ujs": "npm:7.1.502" + "@rails/ujs": "npm:7.1.600" "@react-spring/web": "npm:^9.7.5" "@reduxjs/toolkit": "npm:^2.0.1" "@storybook/addon-a11y": "npm:^9.1.1" @@ -2857,7 +2864,7 @@ __metadata: eslint-import-resolver-typescript: "npm:^4.2.5" eslint-plugin-formatjs: "npm:^5.3.1" eslint-plugin-import: "npm:~2.32.0" - eslint-plugin-jsdoc: "npm:^54.0.0" + eslint-plugin-jsdoc: "npm:^60.0.0" eslint-plugin-jsx-a11y: "npm:~6.10.2" eslint-plugin-promise: "npm:~7.2.1" eslint-plugin-react: "npm:^7.37.4" @@ -2923,6 +2930,7 @@ __metadata: twitter-text: "npm:3.1.0" typescript: "npm:~5.9.0" typescript-eslint: "npm:^8.45.0" + typescript-plugin-css-modules: "npm:^5.2.0" use-debounce: "npm:^10.0.0" vite: "npm:^7.1.1" vite-plugin-manifest-sri: "npm:^0.2.0" @@ -3264,6 +3272,13 @@ __metadata: languageName: node linkType: hard +"@pinojs/redact@npm:^0.4.0": + version: 0.4.0 + resolution: "@pinojs/redact@npm:0.4.0" + checksum: 10c0/4b311ba17ee0cf154ff9c39eb063ec04cd0d0017cb3750efcdf06c2d485df3e1095e13e872175993568c5568c23e4508dd877c981bbc9c5ae5e384d569efcdff + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -3285,10 +3300,10 @@ __metadata: languageName: node linkType: hard -"@rails/ujs@npm:7.1.502": - version: 7.1.502 - resolution: "@rails/ujs@npm:7.1.502" - checksum: 10c0/79b46e8abd03e3fc633d93cc4e4c23838c628b775802fb38c2ce68b0e609ce287a67b81db112a93cc78c07ec82ca3b4cf87e74eb556d35148ce5f64c8be9201f +"@rails/ujs@npm:7.1.600": + version: 7.1.600 + resolution: "@rails/ujs@npm:7.1.600" + checksum: 10c0/0ccaa68a08fbc7b084ab89a1fe49520a5cba6d99f4b0feaf0cb3d00334c59d8d798932d7e49b84aa388875d039ea1e17eb115ed96a80ad157e408a13eceef53e languageName: node linkType: hard @@ -3359,8 +3374,8 @@ __metadata: linkType: hard "@reduxjs/toolkit@npm:^2.0.1": - version: 2.9.1 - resolution: "@reduxjs/toolkit@npm:2.9.1" + version: 2.9.2 + resolution: "@reduxjs/toolkit@npm:2.9.2" dependencies: "@standard-schema/spec": "npm:^1.0.0" "@standard-schema/utils": "npm:^0.3.0" @@ -3376,7 +3391,7 @@ __metadata: optional: true react-redux: optional: true - checksum: 10c0/11e99b665560c7e4bda80d26ad1308866282156bc177500558d72888d18819c303ebebf1f96121552facde3d6bd9c114b0e1f5c41e618c9ce0eaf464518f39dc + checksum: 10c0/577416200c76ffd82bce6158aaeb63e836ed2c2a14e670253056dcaec505da77643e79b47208b4e493a0c120a4a2bc049efe60cd555a2699053af5b03f2f2953 languageName: node linkType: hard @@ -3391,10 +3406,10 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.38" - checksum: 10c0/8353ec2528349f79e27d1a3193806725b85830da334e935cbb606d88c1177c58ea6519c578e4e93e5f677f5b22aecb8738894dbed14603e14b6bffe3facf1002 +"@rolldown/pluginutils@npm:1.0.0-beta.43": + version: 1.0.0-beta.43 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.43" + checksum: 10c0/1c17a0b16c277a0fdbab080fd22ef91e37c1f0d710ecfdacb6a080068062eb14ff030d0e9d2ec2325a1d4246dba0c49625755c82c0090f6cbf98d16e80183e02 languageName: node linkType: hard @@ -4337,6 +4352,24 @@ __metadata: languageName: node linkType: hard +"@types/postcss-modules-local-by-default@npm:^4.0.2": + version: 4.0.2 + resolution: "@types/postcss-modules-local-by-default@npm:4.0.2" + dependencies: + postcss: "npm:^8.0.0" + checksum: 10c0/af13e40673abf96f1427c467bc9d96986fc0fb702f65ef702de05f70e51af2212bc0bdf177bfd817e418f2238bf210fdee3541dd2d939fde9a4df5f8972ad716 + languageName: node + linkType: hard + +"@types/postcss-modules-scope@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/postcss-modules-scope@npm:3.0.4" + dependencies: + postcss: "npm:^8.0.0" + checksum: 10c0/6364674e429143fd686e0238d071377cf9ae1780a77f99e99292a06adc93057609146aaf55c09310ae99526c37e56be5a8a843086c0ff95513bd34c6bc4c7480 + languageName: node + linkType: hard + "@types/prop-types@npm:*, @types/prop-types@npm:^15.7.5": version: 15.7.15 resolution: "@types/prop-types@npm:15.7.15" @@ -4650,13 +4683,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.45.0, @typescript-eslint/types@npm:^8.34.1, @typescript-eslint/types@npm:^8.45.0": +"@typescript-eslint/types@npm:8.45.0": version: 8.45.0 resolution: "@typescript-eslint/types@npm:8.45.0" checksum: 10c0/0213a0573c671d13bc91961a2b2e814ec7f6381ff093bce6704017bd96b2fc7fee25906c815cedb32a0601cf5071ca6c7c5f940d087c3b0d3dd7d4bc03478278 languageName: node linkType: hard +"@typescript-eslint/types@npm:^8.45.0, @typescript-eslint/types@npm:^8.46.0": + version: 8.46.1 + resolution: "@typescript-eslint/types@npm:8.46.1" + checksum: 10c0/90887acaa5b33b45af20cf7f87ec4ae098c0daa88484245473e73903fa6e542f613247c22148132167891ca06af6549a60b9d2fd14a65b22871e016901ce3756 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:8.45.0": version: 8.45.0 resolution: "@typescript-eslint/typescript-estree@npm:8.45.0" @@ -4879,18 +4919,18 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^5.0.0": - version: 5.0.4 - resolution: "@vitejs/plugin-react@npm:5.0.4" + version: 5.1.0 + resolution: "@vitejs/plugin-react@npm:5.1.0" dependencies: "@babel/core": "npm:^7.28.4" "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-beta.38" + "@rolldown/pluginutils": "npm:1.0.0-beta.43" "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.17.0" + react-refresh: "npm:^0.18.0" peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/bb9360a4b4c0abf064d22211756b999faf23889ac150de490590ca7bd029b0ef7f4cd8ba3a32b86682a62d46fb7bebd75b3fa9835c57c78123f4a646de2e0136 + checksum: 10c0/e192a12e2b854df109eafb1d06c0bc848e8e2b162c686aa6b999b1048658983e72674b2068ccc37562fcce44d32ad92b65f3a4e1897a0cb7859c2ee69cc63eac languageName: node linkType: hard @@ -5450,13 +5490,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.12.2 - resolution: "axios@npm:1.12.2" + version: 1.13.1 + resolution: "axios@npm:1.13.1" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.4" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/80b063e318cf05cd33a4d991cea0162f3573481946f9129efb7766f38fde4c061c34f41a93a9f9521f02b7c9565ccbc197c099b0186543ac84a24580017adfed + checksum: 10c0/de9c3c6de43d3ee1146d3afe78645f19450cac6a5d7235bef8b8e8eeb705c2e47e2d231dea99cecaec4dae1897c521118ca9413b9d474063c719c4d94c5b9adc languageName: node linkType: hard @@ -6093,6 +6133,15 @@ __metadata: languageName: node linkType: hard +"copy-anything@npm:^2.0.1": + version: 2.0.6 + resolution: "copy-anything@npm:2.0.6" + dependencies: + is-what: "npm:^3.14.1" + checksum: 10c0/2702998a8cc015f9917385b7f16b0d85f1f6e5e2fd34d99f14df584838f492f49aa0c390d973684c687e895c5c58d08b308a0400ac3e1e3d6fa1e5884a5402ad + languageName: node + linkType: hard + "core-js-compat@npm:^3.43.0": version: 3.44.0 resolution: "core-js-compat@npm:3.44.0" @@ -6361,7 +6410,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -6567,6 +6616,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^16.4.2": + version: 16.6.1 + resolution: "dotenv@npm:16.6.1" + checksum: 10c0/15ce56608326ea0d1d9414a5c8ee6dcf0fffc79d2c16422b4ac2268e7e2d76ff5a572d37ffe747c377de12005f14b3cc22361e79fc7f1061cce81f77d2c973dc + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -6734,6 +6790,17 @@ __metadata: languageName: node linkType: hard +"errno@npm:^0.1.1": + version: 0.1.8 + resolution: "errno@npm:0.1.8" + dependencies: + prr: "npm:~1.0.1" + bin: + errno: cli.js + checksum: 10c0/83758951967ec57bf00b5f5b7dc797e6d65a6171e57ea57adcf1bd1a0b477fd9b5b35fae5be1ff18f4090ed156bce1db749fe7e317aac19d485a5d150f6a4936 + languageName: node + linkType: hard + "error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" @@ -7128,23 +7195,25 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^54.0.0": - version: 54.0.0 - resolution: "eslint-plugin-jsdoc@npm:54.0.0" +"eslint-plugin-jsdoc@npm:^60.0.0": + version: 60.8.3 + resolution: "eslint-plugin-jsdoc@npm:60.8.3" dependencies: - "@es-joy/jsdoccomment": "npm:~0.52.0" + "@es-joy/jsdoccomment": "npm:~0.71.0" are-docs-informative: "npm:^0.0.2" comment-parser: "npm:1.4.1" - debug: "npm:^4.4.1" + debug: "npm:^4.4.3" escape-string-regexp: "npm:^4.0.0" espree: "npm:^10.4.0" esquery: "npm:^1.6.0" + html-entities: "npm:^2.6.0" + object-deep-merge: "npm:^1.0.5" parse-imports-exports: "npm:^0.2.4" semver: "npm:^7.7.2" spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/cf0a388fc670ababe26f9584c467bc8c1592aa83affcf16118d8181c186a6d8f02a8ea65250766b45168fca5cb879a6af66e8457cdb98f0f923bd927572e2de5 + checksum: 10c0/2c5aa623a3e5f7410b36464df759ae5e7265ba6f9aaf67f7c16f9033c4a699532a3de702afe5bd6132717a61196be44aff170db36b71600278800770a9cd88ab languageName: node linkType: hard @@ -8021,7 +8090,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -8152,6 +8221,13 @@ __metadata: languageName: node linkType: hard +"html-entities@npm:^2.6.0": + version: 2.6.0 + resolution: "html-entities@npm:2.6.0" + checksum: 10c0/7c8b15d9ea0cd00dc9279f61bab002ba6ca8a7a0f3c36ed2db3530a67a9621c017830d1d2c1c65beb9b8e3436ea663e9cf8b230472e0e413359399413b27c8b7 + languageName: node + linkType: hard + "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -8231,7 +8307,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -8240,6 +8316,15 @@ __metadata: languageName: node linkType: hard +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d + languageName: node + linkType: hard + "idb-keyval@npm:^6.2.0": version: 6.2.1 resolution: "idb-keyval@npm:6.2.1" @@ -8275,6 +8360,15 @@ __metadata: languageName: node linkType: hard +"image-size@npm:~0.5.0": + version: 0.5.5 + resolution: "image-size@npm:0.5.5" + bin: + image-size: bin/image-size.js + checksum: 10c0/655204163af06732f483a9fe7cce9dff4a29b7b2e88f5c957a5852e8143fa750f5e54b1955a2ca83de99c5220dbd680002d0d4e09140b01433520f4d5a0b1f4c + languageName: node + linkType: hard + "immer@npm:^10.0.3": version: 10.0.3 resolution: "immer@npm:10.0.3" @@ -8391,8 +8485,8 @@ __metadata: linkType: hard "ioredis@npm:^5.3.2": - version: 5.8.1 - resolution: "ioredis@npm:5.8.1" + version: 5.8.2 + resolution: "ioredis@npm:5.8.2" dependencies: "@ioredis/commands": "npm:1.4.0" cluster-key-slot: "npm:^1.1.0" @@ -8403,7 +8497,7 @@ __metadata: redis-errors: "npm:^1.2.0" redis-parser: "npm:^3.0.0" standard-as-callback: "npm:^2.1.0" - checksum: 10c0/4ed66444017150da027bce940a24bf726994691e2a7b3aa11d52f8aeb37f258068cc171af4d9c61247acafc28eb086fa8a7c79420b8e8d2907d2f74f39584465 + checksum: 10c0/305e385f811d49908899e32c2de69616cd059f909afd9e0a53e54f596b1a5835ee3449bfc6a3c49afbc5a2fd27990059e316cc78f449c94024957bd34c826d88 languageName: node linkType: hard @@ -8752,6 +8846,13 @@ __metadata: languageName: node linkType: hard +"is-what@npm:^3.14.1": + version: 3.14.1 + resolution: "is-what@npm:3.14.1" + checksum: 10c0/4b770b85454c877b6929a84fd47c318e1f8c2ff70fd72fd625bc3fde8e0c18a6e57345b6e7aa1ee9fbd1c608d27cfe885df473036c5c2e40cd2187250804a2c7 + languageName: node + linkType: hard + "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -8901,10 +9002,10 @@ __metadata: languageName: node linkType: hard -"jsdoc-type-pratt-parser@npm:~4.1.0": - version: 4.1.0 - resolution: "jsdoc-type-pratt-parser@npm:4.1.0" - checksum: 10c0/7700372d2e733a32f7ea0a1df9cec6752321a5345c11a91b2ab478a031a426e934f16d5c1f15c8566c7b2c10af9f27892a29c2c789039f595470e929a4aa60ea +"jsdoc-type-pratt-parser@npm:~6.6.0": + version: 6.6.0 + resolution: "jsdoc-type-pratt-parser@npm:6.6.0" + checksum: 10c0/3cb9c28a945a66a925ebe40fd752113af01e655a0a0fedc6b1702e23c8f9ed187c45caf6cf94f009bde6cf5c98562524aa7a74ebb4571fca6d3ee5bef0344ec1 languageName: node linkType: hard @@ -9142,6 +9243,41 @@ __metadata: languageName: node linkType: hard +"less@npm:^4.2.0": + version: 4.4.2 + resolution: "less@npm:4.4.2" + dependencies: + copy-anything: "npm:^2.0.1" + errno: "npm:^0.1.1" + graceful-fs: "npm:^4.1.2" + image-size: "npm:~0.5.0" + make-dir: "npm:^2.1.0" + mime: "npm:^1.4.1" + needle: "npm:^3.1.0" + parse-node-version: "npm:^1.0.1" + source-map: "npm:~0.6.0" + tslib: "npm:^2.3.0" + dependenciesMeta: + errno: + optional: true + graceful-fs: + optional: true + image-size: + optional: true + make-dir: + optional: true + mime: + optional: true + needle: + optional: true + source-map: + optional: true + bin: + lessc: bin/lessc + checksum: 10c0/f8b796e45ef171adc390b5250f3018922cd046c256181dd9d4cbcbbdc5d6de7cb88c8327741c10eff7ff76421cd826fd95a664ea1b88fbf6f31742428d4a2dab + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -9159,6 +9295,13 @@ __metadata: languageName: node linkType: hard +"lilconfig@npm:^2.0.5": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 10c0/64645641aa8d274c99338e130554abd6a0190533c0d9eb2ce7ebfaf2e05c7d9961f3ffe2bfa39efd3b60c521ba3dd24fa236fe2775fc38501bf82bf49d4678b8 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -9215,6 +9358,13 @@ __metadata: languageName: node linkType: hard +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 + languageName: node + linkType: hard + "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -9365,6 +9515,16 @@ __metadata: languageName: node linkType: hard +"make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "make-dir@npm:2.1.0" + dependencies: + pify: "npm:^4.0.1" + semver: "npm:^5.6.0" + checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 + languageName: node + linkType: hard + "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -9496,7 +9656,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.6.0": +"mime@npm:1.6.0, mime@npm:^1.4.1": version: 1.6.0 resolution: "mime@npm:1.6.0" bin: @@ -9743,6 +9903,18 @@ __metadata: languageName: node linkType: hard +"needle@npm:^3.1.0": + version: 3.3.1 + resolution: "needle@npm:3.3.1" + dependencies: + iconv-lite: "npm:^0.6.3" + sax: "npm:^1.2.4" + bin: + needle: bin/needle + checksum: 10c0/233b9315d47b735867d03e7a018fb665ee6cacf3a83b991b19538019cf42b538a3e85ca745c840b4c5e9a0ffdca76472f941363bf7c166214ae8cbc650fd4d39 + languageName: node + linkType: hard + "negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -9860,6 +10032,15 @@ __metadata: languageName: node linkType: hard +"object-deep-merge@npm:^1.0.5": + version: 1.0.5 + resolution: "object-deep-merge@npm:1.0.5" + dependencies: + type-fest: "npm:4.2.0" + checksum: 10c0/6664ecb43a2519c9b101f1c3b130dfc73e108d86ec06fbe7261505e1522cf8b69b10dd53b8cbb4cde35cca9d44d349667e2404f06fff85cf9f50b825bb6d1839 + languageName: node + linkType: hard + "object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" @@ -10108,6 +10289,13 @@ __metadata: languageName: node linkType: hard +"parse-node-version@npm:^1.0.1": + version: 1.0.1 + resolution: "parse-node-version@npm:1.0.1" + checksum: 10c0/999cd3d7da1425c2e182dce82b226c6dc842562d3ed79ec47f5c719c32a7f6c1a5352495b894fc25df164be7f2ede4224758255da9902ddef81f2b77ba46bb2c + languageName: node + linkType: hard + "parse-statements@npm:1.0.11": version: 1.0.11 resolution: "parse-statements@npm:1.0.11" @@ -10338,6 +10526,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf + languageName: node + linkType: hard + "pino-abstract-transport@npm:^2.0.0": version: 2.0.0 resolution: "pino-abstract-transport@npm:2.0.0" @@ -10390,9 +10585,10 @@ __metadata: linkType: hard "pino@npm:^9.0.0": - version: 9.13.1 - resolution: "pino@npm:9.13.1" + version: 9.14.0 + resolution: "pino@npm:9.14.0" dependencies: + "@pinojs/redact": "npm:^0.4.0" atomic-sleep: "npm:^1.0.0" on-exit-leak-free: "npm:^2.1.0" pino-abstract-transport: "npm:^2.0.0" @@ -10401,12 +10597,11 @@ __metadata: quick-format-unescaped: "npm:^4.0.3" real-require: "npm:^0.2.0" safe-stable-stringify: "npm:^2.3.1" - slow-redact: "npm:^0.3.0" sonic-boom: "npm:^4.0.1" thread-stream: "npm:^3.0.0" bin: pino: bin.js - checksum: 10c0/c99e879f9538f7255488ad276a46a857cf9114217b754b850b7f1441e31b724a6d6f0697228ead954d3d9601522704e03cad5d441c228108073eed2f37ea0e41 + checksum: 10c0/9a10d9bf820a585eae9bc270fb4e55c895e48280d54adbbb4063ec061694b22d8809c80203cf5fe9f920a54c832b0b8dfb67cb28a04baa13abebaf261a9c9f3e languageName: node linkType: hard @@ -10636,6 +10831,24 @@ __metadata: languageName: node linkType: hard +"postcss-load-config@npm:^3.1.4": + version: 3.1.4 + resolution: "postcss-load-config@npm:3.1.4" + dependencies: + lilconfig: "npm:^2.0.5" + yaml: "npm:^1.10.2" + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + checksum: 10c0/7d2cc6695c2fc063e4538316d651a687fdb55e48db453ff699de916a6ee55ab68eac2b120c28a6b8ca7aa746a588888351b810a215b5cd090eabea62c5762ede + languageName: node + linkType: hard + "postcss-logical@npm:^8.1.0": version: 8.1.0 resolution: "postcss-logical@npm:8.1.0" @@ -10654,6 +10867,39 @@ __metadata: languageName: node linkType: hard +"postcss-modules-extract-imports@npm:^3.0.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.4": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/b0b83feb2a4b61f5383979d37f23116c99bc146eba1741ca3cf1acca0e4d0dbf293ac1810a6ab4eccbe1ee76440dd0a9eb2db5b3bba4f99fc1b3ded16baa6358 + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.1.1": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b + languageName: node + linkType: hard + "postcss-nesting@npm:^13.0.2": version: 13.0.2 resolution: "postcss-nesting@npm:13.0.2" @@ -10850,14 +11096,14 @@ __metadata: languageName: node linkType: hard -"postcss-value-parser@npm:^4.2.0": +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": version: 4.2.0 resolution: "postcss-value-parser@npm:4.2.0" checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 languageName: node linkType: hard -"postcss@npm:^8.5.6": +"postcss@npm:^8.0.0, postcss@npm:^8.4.35, postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -11011,6 +11257,13 @@ __metadata: languageName: node linkType: hard +"prr@npm:~1.0.1": + version: 1.0.1 + resolution: "prr@npm:1.0.1" + checksum: 10c0/5b9272c602e4f4472a215e58daff88f802923b84bc39c8860376bb1c0e42aaf18c25d69ad974bd06ec6db6f544b783edecd5502cd3d184748d99080d68e4be5f + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -11295,10 +11548,10 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.17.0": - version: 0.17.0 - resolution: "react-refresh@npm:0.17.0" - checksum: 10c0/002cba940384c9930008c0bce26cac97a9d5682bc623112c2268ba0c155127d9c178a9a5cc2212d560088d60dfd503edd808669a25f9b377f316a32361d0b23c +"react-refresh@npm:^0.18.0": + version: 0.18.0 + resolution: "react-refresh@npm:0.18.0" + checksum: 10c0/34a262f7fd803433a534f50deb27a148112a81adcae440c7d1cbae7ef14d21ea8f2b3d783e858cb7698968183b77755a38b4d4b5b1d79b4f4689c2f6d358fff2 languageName: node linkType: hard @@ -11727,6 +11980,13 @@ __metadata: languageName: node linkType: hard +"reserved-words@npm:^0.1.2": + version: 0.1.2 + resolution: "reserved-words@npm:0.1.2" + checksum: 10c0/88360388d88f4b36c1f5d47f8d596936dbf950bddd642c04ce940f1dab1fa58ef6fec23f5fab81a1bfe5cd0f223b2b635311496fcf0ef3db93ad4dfb6d7be186 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -12036,7 +12296,7 @@ __metadata: languageName: node linkType: hard -"sass@npm:^1.62.1": +"sass@npm:^1.62.1, sass@npm:^1.70.0": version: 1.93.2 resolution: "sass@npm:1.93.2" dependencies: @@ -12053,6 +12313,20 @@ __metadata: languageName: node linkType: hard +"sax@npm:^1.2.4": + version: 1.4.1 + resolution: "sax@npm:1.4.1" + checksum: 10c0/6bf86318a254c5d898ede6bd3ded15daf68ae08a5495a2739564eb265cd13bcc64a07ab466fb204f67ce472bb534eb8612dac587435515169593f4fffa11de7c + languageName: node + linkType: hard + +"sax@npm:~1.3.0": + version: 1.3.0 + resolution: "sax@npm:1.3.0" + checksum: 10c0/599dbe0ba9d8bd55e92d920239b21d101823a6cedff71e542589303fa0fa8f3ece6cf608baca0c51be846a2e88365fac94a9101a9c341d94b98e30c4deea5bea + languageName: node + linkType: hard + "saxes@npm:^6.0.0": version: 6.0.0 resolution: "saxes@npm:6.0.0" @@ -12096,6 +12370,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^5.6.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + "semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -12331,13 +12614,6 @@ __metadata: languageName: node linkType: hard -"slow-redact@npm:^0.3.0": - version: 0.3.0 - resolution: "slow-redact@npm:0.3.0" - checksum: 10c0/bb2f77830f64fb01079849e0c6433c15e782b88cccb82d4b0d62ce216307cf514ea3f92e9b2c6ae1b1d613ac7743305d5f0324e94c9dc8e41908939456248f9a - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -12392,7 +12668,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf @@ -12423,13 +12699,20 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard +"source-map@npm:^0.7.3": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c + languageName: node + linkType: hard + "source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" @@ -12977,6 +13260,21 @@ __metadata: languageName: node linkType: hard +"stylus@npm:^0.62.0": + version: 0.62.0 + resolution: "stylus@npm:0.62.0" + dependencies: + "@adobe/css-tools": "npm:~4.3.1" + debug: "npm:^4.3.2" + glob: "npm:^7.1.6" + sax: "npm:~1.3.0" + source-map: "npm:^0.7.3" + bin: + stylus: bin/stylus + checksum: 10c0/62afe3a6d781f66d7d283e8218dc1a15530d7d89fc2f09457a723975b2073e96e0d32c61d7f0dd1bd2686aae4ab6cc6933dc85e1b72eebab8aa30167bd16962b + languageName: node + linkType: hard + "substring-trie@npm:^1.0.2": version: 1.0.2 resolution: "substring-trie@npm:1.0.2" @@ -13352,7 +13650,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.8.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -13387,6 +13685,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:4.2.0": + version: 4.2.0 + resolution: "type-fest@npm:4.2.0" + checksum: 10c0/75e0c112ae91d3b68c75da9b7563cf393f91ebdfca5d53d0b3f0405690217eadca318f9ddb89d58ee6ed67b8e32d23a4eae2aabc4e351e5ae184d610247bf772 + languageName: node + linkType: hard + "type-fest@npm:^0.16.0": version: 0.16.0 resolution: "type-fest@npm:0.16.0" @@ -13486,6 +13791,35 @@ __metadata: languageName: node linkType: hard +"typescript-plugin-css-modules@npm:^5.2.0": + version: 5.2.0 + resolution: "typescript-plugin-css-modules@npm:5.2.0" + dependencies: + "@types/postcss-modules-local-by-default": "npm:^4.0.2" + "@types/postcss-modules-scope": "npm:^3.0.4" + dotenv: "npm:^16.4.2" + icss-utils: "npm:^5.1.0" + less: "npm:^4.2.0" + lodash.camelcase: "npm:^4.3.0" + postcss: "npm:^8.4.35" + postcss-load-config: "npm:^3.1.4" + postcss-modules-extract-imports: "npm:^3.0.0" + postcss-modules-local-by-default: "npm:^4.0.4" + postcss-modules-scope: "npm:^3.1.1" + reserved-words: "npm:^0.1.2" + sass: "npm:^1.70.0" + source-map-js: "npm:^1.0.2" + stylus: "npm:^0.62.0" + tsconfig-paths: "npm:^4.2.0" + peerDependencies: + typescript: ">=4.0.0" + dependenciesMeta: + stylus: + optional: true + checksum: 10c0/7cd024f7145c0a29d9b78f2fb49c42cdf1747b50a43391f9993132ba42a727266f9b544fd868d905d5352e0a8676a19ae7a9aa56d516cc819c3ab39d66aa25e4 + languageName: node + linkType: hard + "typescript@npm:^5.6.0, typescript@npm:~5.9.0": version: 5.9.2 resolution: "typescript@npm:5.9.2" @@ -13928,8 +14262,8 @@ __metadata: linkType: hard "vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1": - version: 7.1.11 - resolution: "vite@npm:7.1.11" + version: 7.1.12 + resolution: "vite@npm:7.1.12" dependencies: esbuild: "npm:^0.25.0" fdir: "npm:^6.5.0" @@ -13978,7 +14312,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/c4aa7f47b1fb07f734ed6f4f605d73e5acf7ff9754d75b4adbfbdddf0e520413019834620c1f7b4a207bce7e1d20a2636c584db2b1b17f5a3ba2cd23d47e50ab + checksum: 10c0/cef4d4b4a84e663e09b858964af36e916892ac8540068df42a05ced637ceeae5e9ef71c72d54f3cfc1f3c254af16634230e221b6e2327c2a66d794bb49203262 languageName: node linkType: hard @@ -14575,7 +14909,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.0": +"yaml@npm:^1.10.0, yaml@npm:^1.10.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f