From b80ec3721d94b2d720516adb205b38ea9d71becd Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 21 Oct 2025 16:26:00 +0200 Subject: [PATCH 01/90] Drop support for PostgreSQL 13 (#36540) --- README.md | 2 +- config/initializers/strong_migrations.rb | 2 +- lib/tasks/db.rake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5c0e596b7..7d72b3524 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Mastodon is a **free, open-source social network server** based on [ActivityPub] ### Requirements - **Ruby** 3.2+ -- **PostgreSQL** 13+ +- **PostgreSQL** 14+ - **Redis** 7.0+ - **Node.js** 20+ 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/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 From de80a54555d18493b2cb67900eacecc5d21ba077 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 21 Oct 2025 16:26:24 +0200 Subject: [PATCH 02/90] Update recommended Node version to 24 (LTS) (#36539) --- .nvmrc | 2 +- Dockerfile | 4 ++-- streaming/Dockerfile | 54 ++++++++++++++++++++++---------------------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.nvmrc b/.nvmrc index 403f75d03..f666621e5 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.20 +24.10 diff --git a/Dockerfile b/Dockerfile index e457ae362..1c9c956b7 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) 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 From aba30a85beac1fcf70fc14bb7131583c50120ef1 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 21 Oct 2025 18:00:30 +0200 Subject: [PATCH 03/90] Fix value of `quote_approval_policy` and `quoted_status_id` in ScheduledStatus serializer (#36549) --- app/serializers/rest/scheduled_status_serializer.rb | 7 +++++++ spec/serializers/rest/scheduled_status_serializer_spec.rb | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) 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/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 From 17eb1a7e668dbba6e79612395b99407e8e8de6b9 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 21 Oct 2025 18:00:40 +0200 Subject: [PATCH 04/90] Fix scheduled quote posts being posted as non-quote posts (#36550) --- app/workers/publish_scheduled_status_worker.rb | 1 + spec/workers/publish_scheduled_status_worker_spec.rb | 4 ++++ 2 files changed, 5 insertions(+) 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/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 From 08ae77fd9c03251ba7e2c4b158e1f52b7e68e23a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 10:24:40 +0200 Subject: [PATCH 05/90] New Crowdin Translations (automated) (#36556) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/gd.json | 28 ++++++++++- app/javascript/mastodon/locales/ko.json | 2 +- app/javascript/mastodon/locales/pt-PT.json | 52 +++++++++---------- config/locales/devise.gd.yml | 1 + config/locales/devise.pt-PT.yml | 1 + config/locales/doorkeeper.pt-PT.yml | 6 +-- config/locales/gd.yml | 24 +++++++++ config/locales/pt-PT.yml | 58 +++++++++++++--------- config/locales/simple_form.be.yml | 2 +- config/locales/simple_form.gd.yml | 12 +++++ config/locales/simple_form.pt-PT.yml | 21 ++++++-- config/locales/zh-TW.yml | 2 +- 12 files changed, 146 insertions(+), 63 deletions(-) diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index b677f8ec5..b7e3b3661 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -28,6 +28,7 @@ "account.disable_notifications": "Na cuir brath thugam tuilleadh nuair a chuireas @{name} post ris", "account.domain_blocking": "Àrainn ’ga bacadh", "account.edit_profile": "Deasaich a’ phròifil", + "account.edit_profile_short": "Deasaich", "account.enable_notifications": "Cuir brath thugam nuair a chuireas @{name} post ris", "account.endorse": "Brosnaich air a’ phròifil", "account.familiar_followers_many": "’Ga leantainn le {name1}, {name2}, and {othersCount, plural, one {# eile air a bheil thu eòlach} other {# eile air a bheil thu eòlach}}", @@ -40,6 +41,11 @@ "account.featured_tags.last_status_never": "Gun phost", "account.follow": "Lean", "account.follow_back": "Lean air ais", + "account.follow_back_short": "Lean air ais", + "account.follow_request": "Iarr leantainn", + "account.follow_request_cancel": "Sguir dhen iarrtas", + "account.follow_request_cancel_short": "Sguir dheth", + "account.follow_request_short": "Iarr", "account.followers": "Luchd-leantainn", "account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.", "account.followers_counter": "{count, plural, one {{counter} neach-leantainn} other {{counter} luchd-leantainn}}", @@ -125,7 +131,7 @@ "annual_report.summary.new_posts.new_posts": "postaichean ùra", "annual_report.summary.percentile.text": "Tha thu am measgdhen luchd-cleachdaidh as cliùitiche air {domain}.", "annual_report.summary.percentile.we_wont_tell_bernie": "Ainmeil ’nad latha ’s ’nad linn.", - "annual_report.summary.thanks": "Mòran taing airson conaltradh air Mastodon.", + "annual_report.summary.thanks": "Mòran taing airson conaltradh air Mastodon!", "attachments_list.unprocessed": "(gun phròiseasadh)", "audio.hide": "Falaich an fhuaim", "block_modal.remote_users_caveat": "Iarraidh sinn air an fhrithealaiche {domain} gun gèill iad ri do cho-dhùnadh. Gidheadh, chan eil barantas gun gèill iad on a làimhsicheas cuid a fhrithealaichean bacaidhean air dòigh eadar-dhealaichte. Dh’fhaoidte gum faic daoine gun chlàradh a-steach na postaichean poblach agad fhathast.", @@ -251,7 +257,12 @@ "confirmations.revoke_quote.confirm": "Thoir am post air falbh", "confirmations.revoke_quote.message": "Cha ghabh seo a neo-dhèanamh.", "confirmations.revoke_quote.title": "A bheil thu airson am post a thoirt air falbh?", + "confirmations.unblock.confirm": "Dì-bhac", + "confirmations.unblock.title": "A bheil thu airson {name} a dhì-bhacadh?", "confirmations.unfollow.confirm": "Na lean tuilleadh", + "confirmations.unfollow.title": "A bheil thu airson sgur de {name} a leantainn?", + "confirmations.withdraw_request.confirm": "Cuir d’ iarrtas dhan dàrna taobh", + "confirmations.withdraw_request.title": "A bheil thu airson d’ iarrtas gus {name} a leantainn a chur dhan dàrna taobh?", "content_warning.hide": "Falaich am post", "content_warning.show": "Seall e co-dhiù", "content_warning.show_more": "Seall barrachd dheth", @@ -742,6 +753,7 @@ "privacy.unlisted.short": "Poblach ach sàmhach", "privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}", "privacy_policy.title": "Poileasaidh prìobhaideachd", + "quote_error.edit": "Chan urrainn dhut luaidh a chur ris nuair a bhios tu ri deasachadh puist.", "quote_error.poll": "Chan fhaod thu luaidh a chur an cois cunntais-bheachd.", "quote_error.quote": "Chan eil taic ach ri aon luaidh aig an aon àm.", "quote_error.unauthorized": "Chan fhaod thu am post seo a luaidh.", @@ -861,6 +873,13 @@ "status.cancel_reblog_private": "Na brosnaich tuilleadh", "status.cannot_quote": "Chan fhaod thu am post seo a luaidh", "status.cannot_reblog": "Cha ghabh am post seo brosnachadh", + "status.contains_quote": "Tha luaidh na bhroinn", + "status.context.loading": "A’ luchdadh barrachd fhreagairtean", + "status.context.loading_error": "Cha b’ urrainn dhuinn nam freagairtean ùra a luchdadh", + "status.context.loading_success": "Chaidh na freagairtean ùra a luchdadh", + "status.context.more_replies_found": "Fhuair sinn lorg air barrachd fhreagairtean", + "status.context.retry": "Feuch ris a-rithist", + "status.context.show": "Seall", "status.continued_thread": "Pàirt de shnàithlean", "status.copy": "Dèan lethbhreac dhen cheangal dhan phost", "status.delete": "Sguab às", @@ -890,17 +909,22 @@ "status.quote": "Luaidh", "status.quote.cancel": "Sguir dhen luaidh", "status.quote_error.filtered": "Falaichte le criathrag a th’ agad", + "status.quote_error.limited_account_hint.action": "Seall e co-dhiù", + "status.quote_error.limited_account_hint.title": "Chaidh an cunntas seo fhalach le maoir {domain}.", "status.quote_error.not_available": "Chan eil am post ri fhaighinn", "status.quote_error.pending_approval": "Cha deach dèiligeadh ris a’ phost fhathast", "status.quote_error.pending_approval_popout.body": "Air Mastodon, ’s urrainn dhut stiùireadh am faod cuideigin do luaidh gus nach fhaod. Tha am post seo a’ feitheamh air aonta an ùghdair thùsail.", "status.quote_error.revoked": "Chaidh am post a thoirt air falbh leis an ùghdar", "status.quote_followers_only": "Chan fhaod ach luchd-leantainn am post seo a luaidh", "status.quote_manual_review": "Nì an t-ùghdar lèirmheas air a làimh", + "status.quote_noun": "Luaidh", "status.quote_policy_change": "Atharraich cò dh’fhaodas luaidh", "status.quote_post_author": "Luaidh air post le @{name}", "status.quote_private": "Chan fhaodar postaichean prìobhaideach a luaidh", "status.quotes": "{count, plural, one {luaidh} two {luaidh} few {luaidhean} other {luaidh}}", "status.quotes.empty": "Chan deach am post seo a luaidh le duine sam bith fhathast. Nuair a luaidheas cuideigin e, nochdaidh iad an-seo.", + "status.quotes.local_other_disclaimer": "Cha tèid luaidhean a dhiùilt an ùghdar a shealltainn.", + "status.quotes.remote_other_disclaimer": "Cha dèid ach luaidhean o {domain} a shealltainn an-seo le cinnt. Cha dèid luaidhean a dhiùilt an ùghdar a shealltainn.", "status.read_more": "Leugh an còrr", "status.reblog": "Brosnaich", "status.reblog_or_quote": "Brosnaich no luaidh", @@ -987,7 +1011,7 @@ "visibility_modal.helper.privacy_private_self_quote": "Chan fhaodar fèin-luaidhean air postaichean prìobhaideach a dhèanamh poblach.", "visibility_modal.helper.private_quoting": "Chan urrainn do chàch postaichean dhan luchd-leantainn a-mhàin a chaidh a sgrìobhadh le Mastodon a luaidh.", "visibility_modal.helper.unlisted_quoting": "Nuair a luaidheas daoine thu, thèid am post aca-san fhalach o loidhnichean-ama nan treandaichean.", - "visibility_modal.instructions": "Stiùirich cò dh’fhaodas eadar-ghabhahil leis a’ phost seo. ’S urrainn dhut do roghainnean airson nam postaichean ri teachd a thaghadh aig Roghainnean > Bun-roghainnean a’ phostaidh", + "visibility_modal.instructions": "Stiùirich cò dh’fhaodas eadar-ghabhahil leis a’ phost seo. ’S urrainn dhut do roghainnean airson nam postaichean ri teachd a thaghadh aig Roghainnean > Bun-roghainnean a’ phostaidh.", "visibility_modal.privacy_label": "Faicsinneachd", "visibility_modal.quote_followers": "Luchd-leantainn a-mhàin", "visibility_modal.quote_label": "Cò dh’fhaodas luaidh", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index d4c8cf1f2..51f4f3211 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -857,7 +857,7 @@ "status.block": "@{name} 차단", "status.bookmark": "북마크", "status.cancel_reblog_private": "부스트 취소", - "status.cannot_quote": "인용을 비허용하는 게시물", + "status.cannot_quote": "인용을 비허용한 게시물", "status.cannot_reblog": "이 게시물은 부스트 할 수 없습니다", "status.contains_quote": "인용 포함", "status.continued_thread": "이어지는 글타래", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 0acd1d9f4..00181ba8c 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!", @@ -249,7 +249,7 @@ "confirmations.quiet_post_quote_info.message": "Ao citar uma publicação não listada, a sua publicação não será exibida nos destaques.", "confirmations.quiet_post_quote_info.title": "Citação de publicação não listada", "confirmations.redraft.confirm": "Eliminar e reescrever", - "confirmations.redraft.message": "Tens a certeza de que queres eliminar e tornar a escrever esta publicação? Os favoritos e as publicações impulsionadas perder-se-ão e as respostas à publicação original ficarão órfãs.", + "confirmations.redraft.message": "Tem a certeza que pretende eliminar e tornar a escrever esta publicação? Os favoritos e as partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.", "confirmations.redraft.title": "Eliminar e reescrever publicação?", "confirmations.remove_from_followers.confirm": "Remover seguidor", "confirmations.remove_from_followers.message": "{name} vai parar de seguir-te. Tens a certeza que prentedes continuar?", @@ -330,7 +330,7 @@ "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.domain_blocks": "Ainda não há qualquer domínio bloqueado.", @@ -366,7 +366,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 +429,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 +441,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 +473,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 +564,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 +626,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 +670,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 +678,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", @@ -867,12 +867,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", @@ -926,12 +926,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", 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.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/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/gd.yml b/config/locales/gd.yml index 802b92541..24b7cc58a 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -876,6 +876,10 @@ 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 + public: A h-uile duine 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 +933,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 +941,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 +1226,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. @@ -1662,6 +1671,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 +1994,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}" @@ -1994,10 +2013,15 @@ gd: 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 + quote_post_author: Luaidh air post le %{acct} title: "%{name}: “%{quote}”" visibilities: direct: Iomradh prìobhaideach diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index e420d0c2f..4e7178354 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -817,7 +817,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. @@ -905,6 +905,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 +913,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 +1188,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 +1226,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 +1411,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 +1508,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 +1527,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 +1553,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 +1597,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 +1625,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 +1705,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 +1908,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 @@ -1921,11 +1926,16 @@ pt-PT: 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 +1950,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 +1961,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 +1977,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 +2105,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 +2146,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/simple_form.be.yml b/config/locales/simple_form.be.yml index cee48c7de..ce2000188 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: Схаваць абнаўленні стужкі за клікам замест аўтаматычнага пракручвання стужкі diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index a4870f88c..1c929332d 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 bhriosnachadh 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 nan %{options_icon} (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 @@ -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,16 @@ gd: content_cache_retention_period: Ùine glèidhidh aig susbaint chèin custom_css: CSS gnàthaichte favicon: Favicon + 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 diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 95b1b24f8..307f0e9ad 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,11 @@ 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. 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. @@ -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,16 @@ pt-PT: content_cache_retention_period: Período de retenção de conteúdos remotos custom_css: CSS personalizado favicon: Ícone de favoritos + 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 @@ -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/zh-TW.yml b/config/locales/zh-TW.yml index ce4fc73de..2c8ebb07a 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1894,7 +1894,7 @@ zh-TW: followers: 僅限跟隨者 nobody: 僅有我 public: 所有人 - quote_post_author: 以引用 %{acct} 之嘟文 + quote_post_author: 已引用 %{acct} 之嘟文 title: "%{name}:「%{quote}」" visibilities: direct: 私訊 From 6adbd9ce52fe7876876afe2d4b9e425ee3cf4d81 Mon Sep 17 00:00:00 2001 From: belatedly <63966511+belatedly@users.noreply.github.com> Date: Wed, 22 Oct 2025 04:18:02 -0500 Subject: [PATCH 06/90] Fix discovery preamble missing word in EN and EN-GB locales (#36560) --- config/locales/en-GB.yml | 2 +- config/locales/en.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 8cfd1b762..2841f977e 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -831,7 +831,7 @@ 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. + 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 diff --git a/config/locales/en.yml b/config/locales/en.yml index 34f7069d0..eee4d9409 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -837,7 +837,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 From 7ea2af6ae227875c0dc66f1810fa33ae8567860f Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 22 Oct 2025 11:43:03 +0200 Subject: [PATCH 07/90] Refresh thread replies periodically & when refocusing window (#36547) --- .../status/components/refresh_controller.tsx | 263 +++++++++++++----- .../mastodon/features/status/index.jsx | 15 +- app/javascript/mastodon/hooks/useInterval.ts | 39 +++ .../mastodon/hooks/useIsDocumentVisible.ts | 32 +++ 4 files changed, 266 insertions(+), 83 deletions(-) create mode 100644 app/javascript/mastodon/hooks/useInterval.ts create mode 100644 app/javascript/mastodon/hooks/useIsDocumentVisible.ts diff --git a/app/javascript/mastodon/features/status/components/refresh_controller.tsx b/app/javascript/mastodon/features/status/components/refresh_controller.tsx index 253cce469..92607797b 100644 --- a/app/javascript/mastodon/features/status/components/refresh_controller.tsx +++ b/app/javascript/mastodon/features/status/components/refresh_controller.tsx @@ -1,7 +1,9 @@ -import { useEffect, useState, useCallback } from 'react'; +import { useEffect, useState, useCallback, useMemo } from 'react'; import { useIntl, defineMessages } from 'react-intl'; +import { useDebouncedCallback } from 'use-debounce'; + import { fetchContext, completeContextRefresh, @@ -13,6 +15,8 @@ import { apiGetAsyncRefresh } from 'mastodon/api/async_refreshes'; import { Alert } from 'mastodon/components/alert'; import { ExitAnimationWrapper } from 'mastodon/components/exit_animation_wrapper'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { useInterval } from 'mastodon/hooks/useInterval'; +import { useIsDocumentVisible } from 'mastodon/hooks/useIsDocumentVisible'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; const AnimatedAlert: React.FC< @@ -52,14 +56,151 @@ const messages = defineMessages({ type LoadingState = 'idle' | 'more-available' | 'loading' | 'success' | 'error'; +/** + * Age of thread below which we consider it new & fetch + * replies more frequently + */ +const NEW_THREAD_AGE_THRESHOLD = 30 * 60_000; +/** + * Interval at which we check for new replies for old threads + */ +const LONG_AUTO_FETCH_REPLIES_INTERVAL = 5 * 60_000; +/** + * Interval at which we check for new replies for new threads. + * Also used as a threshold to throttle repeated fetch calls + */ +const SHORT_AUTO_FETCH_REPLIES_INTERVAL = 60_000; +/** + * Number of refresh_async checks at which an early fetch + * will be triggered if there are results + */ +const LONG_RUNNING_FETCH_THRESHOLD = 3; + +/** + * Returns whether the thread is new, based on NEW_THREAD_AGE_THRESHOLD + */ +function getIsThreadNew(statusCreatedAt: string) { + const now = new Date(); + const newThreadThreshold = new Date(now.getTime() - NEW_THREAD_AGE_THRESHOLD); + + return new Date(statusCreatedAt) > newThreadThreshold; +} + +/** + * This hook kicks off a background check for the async refresh job + * and loads any newly found replies once the job has finished, + * and when LONG_RUNNING_FETCH_THRESHOLD was reached and replies were found + */ +function useCheckForRemoteReplies({ + statusId, + refreshHeader, + isEnabled, + onChangeLoadingState, +}: { + statusId: string; + refreshHeader?: AsyncRefreshHeader; + isEnabled: boolean; + onChangeLoadingState: React.Dispatch>; +}) { + const dispatch = useAppDispatch(); + + useEffect(() => { + let timeoutId: ReturnType; + + const scheduleRefresh = ( + refresh: AsyncRefreshHeader, + iteration: number, + ) => { + timeoutId = setTimeout(() => { + void apiGetAsyncRefresh(refresh.id).then((result) => { + const { status, result_count } = result.async_refresh; + + // At three scheduled refreshes, we consider the job + // long-running and attempt to fetch any new replies so far + const isLongRunning = iteration === LONG_RUNNING_FETCH_THRESHOLD; + + // If the refresh status is not finished and not long-running, + // we just schedule another refresh and exit + if (status === 'running' && !isLongRunning) { + scheduleRefresh(refresh, iteration + 1); + return; + } + + // If refresh status is finished, clear `refreshHeader` + // (we don't want to do this if it's just a long-running job) + if (status === 'finished') { + dispatch(completeContextRefresh({ statusId })); + } + + // Exit if there's nothing to fetch + if (result_count === 0) { + if (status === 'finished') { + onChangeLoadingState('idle'); + } else { + scheduleRefresh(refresh, iteration + 1); + } + return; + } + + // A positive result count means there _might_ be new replies, + // so we fetch the context in the background to check if there + // are any new replies. + // If so, they will populate `contexts.pendingReplies[statusId]` + void dispatch(fetchContext({ statusId, prefetchOnly: true })) + .then(() => { + // Reset loading state to `idle`. If the fetch has + // resulted in new pending replies, the `hasPendingReplies` + // flag will switch the loading state to 'more-available' + if (status === 'finished') { + onChangeLoadingState('idle'); + } else { + // Keep background fetch going if `isLongRunning` is true + scheduleRefresh(refresh, iteration + 1); + } + }) + .catch(() => { + // Show an error if the fetch failed + onChangeLoadingState('error'); + }); + }); + }, refresh.retry * 1000); + }; + + // Initialise a refresh + if (refreshHeader && isEnabled) { + scheduleRefresh(refreshHeader, 1); + onChangeLoadingState('loading'); + } + + return () => { + clearTimeout(timeoutId); + }; + }, [onChangeLoadingState, dispatch, statusId, refreshHeader, isEnabled]); +} + +/** + * This component fetches new post replies in the background + * and gives users the option to show them. + * + * The following three scenarios are handled: + * + * 1. When the browser tab is visible, replies are refetched periodically + * (more frequently for new posts, less frequently for old ones) + * 2. Replies are refetched when the browser tab is refocused + * after it was hidden or minimised + * 3. For remote posts, remote replies that might not yet be known to the + * server are imported & fetched using the AsyncRefresh API. + */ export const RefreshController: React.FC<{ statusId: string; -}> = ({ statusId }) => { + statusCreatedAt: string; + isLocal: boolean; +}> = ({ statusId, statusCreatedAt, isLocal }) => { const dispatch = useAppDispatch(); const intl = useIntl(); - const refreshHeader = useAppSelector( - (state) => state.contexts.refreshing[statusId], + const refreshHeader = useAppSelector((state) => + isLocal ? undefined : state.contexts.refreshing[statusId], ); const hasPendingReplies = useAppSelector( (state) => !!state.contexts.pendingReplies[statusId]?.length, @@ -78,78 +219,52 @@ export const RefreshController: React.FC<{ dispatch(clearPendingReplies({ statusId })); }, [dispatch, statusId]); - useEffect(() => { - let timeoutId: ReturnType; + // Prevent too-frequent context calls + const debouncedFetchContext = useDebouncedCallback( + () => { + void dispatch(fetchContext({ statusId, prefetchOnly: true })); + }, + // Ensure the debounce is a bit shorter than the auto-fetch interval + SHORT_AUTO_FETCH_REPLIES_INTERVAL - 500, + { + leading: true, + trailing: false, + }, + ); - const scheduleRefresh = ( - refresh: AsyncRefreshHeader, - iteration: number, - ) => { - timeoutId = setTimeout(() => { - void apiGetAsyncRefresh(refresh.id).then((result) => { - // At three scheduled refreshes, we consider the job - // long-running and attempt to fetch any new replies so far - const isLongRunning = iteration === 3; + const isDocumentVisible = useIsDocumentVisible({ + onChange: (isVisible) => { + // Auto-fetch new replies when the page is refocused + if (isVisible && partialLoadingState !== 'loading' && !wasDismissed) { + debouncedFetchContext(); + } + }, + }); - const { status, result_count } = result.async_refresh; + // Check for remote replies + useCheckForRemoteReplies({ + statusId, + refreshHeader, + isEnabled: isDocumentVisible && !isLocal && !wasDismissed, + onChangeLoadingState: setLoadingState, + }); - // If the refresh status is not finished and not long-running, - // we just schedule another refresh and exit - if (status === 'running' && !isLongRunning) { - scheduleRefresh(refresh, iteration + 1); - return; - } + // Only auto-fetch new replies if there's no ongoing remote replies check + const shouldAutoFetchReplies = + isDocumentVisible && partialLoadingState !== 'loading' && !wasDismissed; - // If refresh status is finished, clear `refreshHeader` - // (we don't want to do this if it's just a long-running job) - if (status === 'finished') { - dispatch(completeContextRefresh({ statusId })); - } + const autoFetchInterval = useMemo( + () => + getIsThreadNew(statusCreatedAt) + ? SHORT_AUTO_FETCH_REPLIES_INTERVAL + : LONG_AUTO_FETCH_REPLIES_INTERVAL, + [statusCreatedAt], + ); - // Exit if there's nothing to fetch - if (result_count === 0) { - if (status === 'finished') { - setLoadingState('idle'); - } else { - scheduleRefresh(refresh, iteration + 1); - } - return; - } - - // A positive result count means there _might_ be new replies, - // so we fetch the context in the background to check if there - // are any new replies. - // If so, they will populate `contexts.pendingReplies[statusId]` - void dispatch(fetchContext({ statusId, prefetchOnly: true })) - .then(() => { - // Reset loading state to `idle`. If the fetch has - // resulted in new pending replies, the `hasPendingReplies` - // flag will switch the loading state to 'more-available' - if (status === 'finished') { - setLoadingState('idle'); - } else { - // Keep background fetch going if `isLongRunning` is true - scheduleRefresh(refresh, iteration + 1); - } - }) - .catch(() => { - // Show an error if the fetch failed - setLoadingState('error'); - }); - }); - }, refresh.retry * 1000); - }; - - // Initialise a refresh - if (refreshHeader && !wasDismissed) { - scheduleRefresh(refreshHeader, 1); - setLoadingState('loading'); - } - - return () => { - clearTimeout(timeoutId); - }; - }, [dispatch, statusId, refreshHeader, wasDismissed]); + useInterval(debouncedFetchContext, { + delay: autoFetchInterval, + isEnabled: shouldAutoFetchReplies, + }); useEffect(() => { // Hide success message after a short delay @@ -172,7 +287,7 @@ export const RefreshController: React.FC<{ }; }, [dispatch, statusId]); - const handleClick = useCallback(() => { + const showPending = useCallback(() => { dispatch(showPendingReplies({ statusId })); setLoadingState('success'); }, [dispatch, statusId]); @@ -196,7 +311,7 @@ export const RefreshController: React.FC<{ isActive={loadingState === 'more-available'} message={intl.formatMessage(messages.moreFound)} action={intl.formatMessage(messages.show)} - onActionClick={handleClick} + onActionClick={showPending} onDismiss={dismissPrompt} animateFrom='below' /> @@ -205,7 +320,7 @@ export const RefreshController: React.FC<{ isActive={loadingState === 'error'} message={intl.formatMessage(messages.error)} action={intl.formatMessage(messages.retry)} - onActionClick={handleClick} + onActionClick={showPending} onDismiss={dismissPrompt} animateFrom='below' /> diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index ff32d63e8..a07b20f02 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -571,14 +571,6 @@ class Status extends ImmutablePureComponent { const isLocal = status.getIn(['account', 'acct'], '').indexOf('@') === -1; const isIndexable = !status.getIn(['account', 'noindex']); - if (!isLocal) { - remoteHint = ( - - ); - } - const handlers = { reply: this.handleHotkeyReply, favourite: this.handleHotkeyFavourite, @@ -649,7 +641,12 @@ class Status extends ImmutablePureComponent { {descendants} - {remoteHint} + + diff --git a/app/javascript/mastodon/hooks/useInterval.ts b/app/javascript/mastodon/hooks/useInterval.ts new file mode 100644 index 000000000..d80ef79d6 --- /dev/null +++ b/app/javascript/mastodon/hooks/useInterval.ts @@ -0,0 +1,39 @@ +import { useEffect, useLayoutEffect, useRef } from 'react'; + +/** + * Hook to create an interval that invokes a callback function + * at a specified delay using the setInterval API. + * Based on https://usehooks-ts.com/react-hook/use-interval + */ +export function useInterval( + callback: () => void, + { + delay, + isEnabled = true, + }: { + delay: number; + isEnabled?: boolean; + }, +) { + // Write callback to a ref so we can omit it from + // the interval effect's dependency array + const callbackRef = useRef(callback); + useLayoutEffect(() => { + callbackRef.current = callback; + }, [callback]); + + // Set up the interval. + useEffect(() => { + if (!isEnabled) { + return; + } + + const intervalId = setInterval(() => { + callbackRef.current(); + }, delay); + + return () => { + clearInterval(intervalId); + }; + }, [delay, isEnabled]); +} diff --git a/app/javascript/mastodon/hooks/useIsDocumentVisible.ts b/app/javascript/mastodon/hooks/useIsDocumentVisible.ts new file mode 100644 index 000000000..3587733dc --- /dev/null +++ b/app/javascript/mastodon/hooks/useIsDocumentVisible.ts @@ -0,0 +1,32 @@ +import { useEffect, useRef, useState } from 'react'; + +export function useIsDocumentVisible({ + onChange, +}: { + onChange?: (isVisible: boolean) => void; +} = {}) { + const [isDocumentVisible, setIsDocumentVisible] = useState( + () => document.visibilityState === 'visible', + ); + + const onChangeRef = useRef(onChange); + useEffect(() => { + onChangeRef.current = onChange; + }, [onChange]); + + useEffect(() => { + function handleVisibilityChange() { + const isVisible = document.visibilityState === 'visible'; + + setIsDocumentVisible(isVisible); + onChangeRef.current?.(isVisible); + } + window.addEventListener('visibilitychange', handleVisibilityChange); + + return () => { + window.removeEventListener('visibilitychange', handleVisibilityChange); + }; + }, []); + + return isDocumentVisible; +} From 7538bc77b787c861a062e2c4cc849e39b98a3a63 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 22 Oct 2025 15:08:51 +0200 Subject: [PATCH 08/90] Fix text overflow alignment for long author names in News (#36562) --- app/javascript/styles/mastodon/components.scss | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 78c711c55..1b851803c 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -9368,19 +9368,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 +9384,7 @@ noscript { font-size: 12px; font-weight: 500; line-height: 16px; + flex-shrink: 0; } &__author-link { From 1e28ec628b9e10abd6c61a0e23db30321c841708 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 15:52:43 +0200 Subject: [PATCH 09/90] Update dependency rubocop to v1.81.6 (#36541) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index f8d6f3055..987df10f0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -744,7 +744,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) From 2bd5c2f5289ffd9401888e2075a86b6645fb13f8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 15:52:59 +0200 Subject: [PATCH 10/90] Update dependency ioredis to v5.8.2 (#36544) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index acd1bc71b..61b6baab6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8391,8 +8391,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 +8403,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 From c40648f7b34645f223553b6d3a40131bffa9f88d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 13:53:20 +0000 Subject: [PATCH 11/90] Update dependency pino to v9.14.0 (#36529) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/yarn.lock b/yarn.lock index 61b6baab6..53c9e9319 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3264,6 +3264,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" @@ -10390,9 +10397,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 +10409,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 @@ -12331,13 +12338,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" From 9f7075a0ce2b6ecef8d92ef318785fa8ce708688 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 22 Oct 2025 15:55:41 +0200 Subject: [PATCH 12/90] Remove unnecessary restrictions on HTML handling (#36548) --- app/javascript/mastodon/components/status/handled_link.tsx | 2 +- app/javascript/mastodon/components/status_content.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/status/handled_link.tsx b/app/javascript/mastodon/components/status/handled_link.tsx index 3c8973992..59305d573 100644 --- a/app/javascript/mastodon/components/status/handled_link.tsx +++ b/app/javascript/mastodon/components/status/handled_link.tsx @@ -38,7 +38,7 @@ export const HandledLink: FC> = ({ {children} ); - } else if ((text.startsWith('@') || prevText?.endsWith('@')) && mention) { + } else if (mention) { // Handle mentions return ( ); - } else if (element instanceof HTMLParagraphElement && element.classList.contains('quote-inline')) { + } else if (element.classList.contains('quote-inline')) { return null; } return undefined; From 7774cd6670275616752ee201ead8f1ee832ce520 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 23 Oct 2025 10:37:05 +0200 Subject: [PATCH 13/90] Add `disabled` setting for live and topic feeds, as well as user permission to bypass that (#36563) --- app/models/form/admin_settings.rb | 2 +- app/models/link_feed.rb | 12 ++ app/models/public_feed.rb | 29 ++- app/models/tag_feed.rb | 10 + app/models/user_role.rb | 2 + config/locales/en.yml | 3 + config/roles.yml | 1 + spec/models/public_feed_spec.rb | 315 ++++++++++++++++++++++++++++++ spec/models/tag_feed_spec.rb | 306 +++++++++++++++++++++++++++++ 9 files changed, 677 insertions(+), 3 deletions(-) diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index a0decbea8..8b3c09a35 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -87,7 +87,7 @@ 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 attr_accessor(*KEYS) 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_feed.rb b/app/models/tag_feed.rb index 6b5831d24..171fe5e15 100644 --- a/app/models/tag_feed.rb +++ b/app/models/tag_feed.rb @@ -23,6 +23,8 @@ class TagFeed < 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!(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/config/locales/en.yml b/config/locales/en.yml index eee4d9409..15c3c582b 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 @@ -851,6 +853,7 @@ en: feed_access: modes: authenticated: Authenticated users only + disabled: Require specific user role public: Everyone registrations: moderation_recommandation: Please make sure you have an adequate and reactive moderation team before you open registrations to everyone! 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/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 From 92aeecfbdc31d9e965396b74161d0dee28097cf9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Oct 2025 10:41:34 +0200 Subject: [PATCH 14/90] Update dependency vite to v7.1.12 (#36573) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 53c9e9319..b23b2b77d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13928,8 +13928,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 +13978,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/c4aa7f47b1fb07f734ed6f4f605d73e5acf7ff9754d75b4adbfbdddf0e520413019834620c1f7b4a207bce7e1d20a2636c584db2b1b17f5a3ba2cd23d47e50ab + checksum: 10c0/cef4d4b4a84e663e09b858964af36e916892ac8540068df42a05ced637ceeae5e9ef71c72d54f3cfc1f3c254af16634230e221b6e2327c2a66d794bb49203262 languageName: node linkType: hard From f7b99cd48a5772e0ee6b81b6b47149c1e710fc62 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:29:02 +0200 Subject: [PATCH 15/90] New Crowdin Translations (automated) (#36569) Co-authored-by: GitHub Actions --- config/locales/an.yml | 1 - config/locales/ar.yml | 1 - config/locales/ast.yml | 1 - config/locales/be.yml | 2 +- config/locales/bg.yml | 1 - config/locales/ca.yml | 1 - config/locales/cs.yml | 1 - config/locales/cy.yml | 1 - config/locales/da.yml | 2 +- config/locales/de.yml | 2 +- config/locales/el.yml | 2 +- config/locales/en-GB.yml | 1 - config/locales/eo.yml | 1 - config/locales/es-MX.yml | 2 +- config/locales/es.yml | 2 +- config/locales/et.yml | 1 - config/locales/eu.yml | 1 - config/locales/fa.yml | 1 - config/locales/fi.yml | 1 - config/locales/fr-CA.yml | 1 - config/locales/fr.yml | 1 - config/locales/fy.yml | 1 - config/locales/ga.yml | 1 - config/locales/gd.yml | 1 - config/locales/hu.yml | 1 - config/locales/ia.yml | 1 - config/locales/id.yml | 1 - config/locales/ie.yml | 1 - config/locales/io.yml | 1 - config/locales/it.yml | 1 - config/locales/ja.yml | 1 - config/locales/ko.yml | 1 - config/locales/ku.yml | 1 - config/locales/lad.yml | 1 - config/locales/lv.yml | 1 - config/locales/ms.yml | 1 - config/locales/my.yml | 1 - config/locales/nan.yml | 1 - config/locales/nl.yml | 1 - config/locales/nn.yml | 2 +- config/locales/no.yml | 1 - config/locales/pl.yml | 1 - config/locales/pt-BR.yml | 1 - config/locales/pt-PT.yml | 2 +- config/locales/ru.yml | 1 - config/locales/sco.yml | 1 - config/locales/sl.yml | 1 - config/locales/sq.yml | 2 +- config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 1 - config/locales/sv.yml | 1 - config/locales/th.yml | 1 - config/locales/uk.yml | 1 - config/locales/vi.yml | 2 +- config/locales/zh-CN.yml | 2 +- config/locales/zh-HK.yml | 1 - config/locales/zh-TW.yml | 2 +- 57 files changed, 12 insertions(+), 57 deletions(-) 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..96ac5f04f 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -865,7 +865,7 @@ be: title: Перадвызначана выключыць карыстальнікаў з індэксацыі пашуковымі рухавікамі discovery: follow_recommendations: Выконвайце рэкамендацыі - preamble: Прадстаўленне цікавага кантэнту дапамагае прыцягнуць новых карыстальнікаў, якія могуць не ведаць нікога на Mastodon. Кантралюйце працу розных функцый выяўлення на вашым серверы. + preamble: Паказ цікавага кантэнту карысны ў прывабліванні новых карыстальнікаў, якія могуць нікога не ведаць у Mastodon. Кантралюйце, як розныя функцыі вынаходства працуюць на Вашым серверы. privacy: Прыватнасць profile_directory: Дырэкторыя профіляў public_timelines: Публічная паслядоўнасць публікацый diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 1f22bf004..60a86c36a 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: Публични хронологии diff --git a/config/locales/ca.yml b/config/locales/ca.yml index c3be44daa..caa472fb3 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -832,7 +832,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 diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 3919dbe98..3f24c637f 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -865,7 +865,6 @@ 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. privacy: Soukromí profile_directory: Adresář profilů public_timelines: Veřejné časové osy diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 61d1d9d8a..9aa4fd965 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -893,7 +893,6 @@ 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. privacy: Preifatrwydd profile_directory: Cyfeiriadur proffiliau public_timelines: Ffrydiau cyhoeddus diff --git a/config/locales/da.yml b/config/locales/da.yml index 969bece7d..d3b2f8db9 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -837,7 +837,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 diff --git a/config/locales/de.yml b/config/locales/de.yml index db183a199..02391fe27 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -837,7 +837,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 diff --git a/config/locales/el.yml b/config/locales/el.yml index 0b3094b7c..37371db4a 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -837,7 +837,7 @@ el: title: Εξαίρεση χρηστών από τις μηχανές αναζήτησης discovery: follow_recommendations: Ακολούθησε τις προτάσεις - preamble: Δημοσιεύοντας ενδιαφέρον περιεχόμενο είναι καθοριστικό για την ενσωμάτωση νέων χρηστών που μπορεί να μη γνωρίζουν κανέναν στο Mastodon. Έλεγξε πώς λειτουργούν διάφορες δυνατότητες ανακάλυψης στον διακομιστή σας. + preamble: Εμφανίζοντας ενδιαφέρον περιεχόμενο είναι καθοριστικό για την ενσωμάτωση νέων χρηστών που μπορεί να μη γνωρίζουν κανέναν στο Mastodon. Ελέγξτε πώς λειτουργούν διάφορες δυνατότητες ανακάλυψης στον διακομιστή σας. privacy: Απόρρητο profile_directory: Κατάλογος προφίλ public_timelines: Δημόσιες ροές diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 2841f977e..eda44eaa9 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 on 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/eo.yml b/config/locales/eo.yml index 2a8c98b19..008a72ecf 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-MX.yml b/config/locales/es-MX.yml index 3e3e32896..a497d9cea 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -837,7 +837,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 diff --git a/config/locales/es.yml b/config/locales/es.yml index 291a5f16a..c62053637 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -837,7 +837,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 diff --git a/config/locales/et.yml b/config/locales/et.yml index e9b082ab9..63adff4c7 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -837,7 +837,6 @@ et: title: Otsimootorite indeksitesse kasutajaid vaikimisi ei lisata discovery: follow_recommendations: Jälgi soovitusi - preamble: Huvitava sisu esiletoomine on oluline uute kasutajate kaasamisel, kes ei pruugi Mastodonist kedagi tunda. Kontrolli, kuidas erinevad avastamisfunktsioonid serveris töötavad. privacy: Privaatsus profile_directory: Kasutajate kataloog public_timelines: Avalikud ajajooned 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..92e305bce 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -837,7 +837,6 @@ fa: title: درخواست خروج از اندیس‌گذاری پیش‌گزیدهٔ موتور جست‌وجو discovery: follow_recommendations: پیروی از پیشنهادها - preamble: ارائه محتوای جالب در جذب کاربران جدیدی که ممکن است کسی ماستودون را نشناسند، مفید است. نحوه عملکرد ویژگی‌های کشف مختلف روی سرور خود را کنترل کنید. privacy: محرمانگی profile_directory: شاخهٔ نمایه public_timelines: خط زمانی‌های عمومی diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 9a5d8f900..f52c34b08 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -837,7 +837,6 @@ 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. privacy: Yksityisyys profile_directory: Profiilihakemisto public_timelines: Julkiset aikajanat diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 0ae44cf37..b27d53eea 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -812,7 +812,6 @@ 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. profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 42e0507fe..6b04aca1a 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -812,7 +812,6 @@ 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. profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques 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..c6f103fb1 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -879,7 +879,6 @@ 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í. privacy: Príobháideacht profile_directory: Eolaire próifíle public_timelines: Amlínte poiblí diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 24b7cc58a..a8ca7f48e 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -865,7 +865,6 @@ gd: title: Thoir air falbh ro-aonta nan cleachdaichean air inneacsadh le einnseanan-luirg mar a’ bhun-roghainn discovery: follow_recommendations: Molaidhean leantainn - preamble: Tha tighinn an uachdar susbainte inntinniche fìor-chudromach airson toiseach-tòiseachaidh an luchd-cleachdaidh ùr nach eil eòlach air duine sam bith air Mastodon, ma dh’fhaoidte. Stiùirich mar a dh’obraicheas gleusan an rùrachaidh air an fhrithealaiche agad. privacy: Prìobhaideachd profile_directory: Eòlaire nam pròifil public_timelines: Loidhnichean-ama poblach diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 67a175acd..51c619b70 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -837,7 +837,6 @@ hu: title: Alapértelmezetten ne indexeljék a keresők a felhasználókat discovery: follow_recommendations: Ajánlottak követése - preamble: Az érdekes tartalmak felszínre hozása fontos szerepet játszik az új felhasználók bevonásában, akik esetleg nem ismerik a Mastodont. Szabályozd, hogy a különböző felfedezési funkciók hogyan működjenek a kiszolgálón. privacy: Adatvédelem profile_directory: Profiladatbázis public_timelines: Nyilvános idővonalak diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 08f40d511..6918a93cc 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -837,7 +837,6 @@ ia: title: Excluder le usatores del indexation del motores de recerca per predefinition discovery: follow_recommendations: Recommendationes de contos a sequer - preamble: Presentar contento interessante es essential pro attraher e retener nove usatores qui pote non cognoscer alcun persona sur Mastodon. Controla como varie optiones de discoperta functiona sur tu servitor. privacy: Confidentialitate profile_directory: Directorio de profilos public_timelines: Chronologias public 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/it.yml b/config/locales/it.yml index 9e7a2a15c..782d7a261 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -837,7 +837,6 @@ 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. privacy: Privacy profile_directory: Directory del profilo public_timelines: Timeline pubbliche diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 8feb830f0..1ef3aef00 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -816,7 +816,6 @@ ja: title: デフォルトで検索エンジンによるインデックスを拒否する discovery: follow_recommendations: おすすめフォロー - preamble: Mastodon を知らないユーザーを取り込むには、興味深いコンテンツを浮上させることが重要です。サーバー上で様々なディスカバリー機能がどのように機能するかを制御します。 privacy: プライバシー profile_directory: ディレクトリ public_timelines: 公開タイムライン diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 3402c5487..e88236887 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -825,7 +825,6 @@ ko: title: 사용자들이 기본적으로 검색엔진에 인덱싱되지 않도록 합니다 discovery: follow_recommendations: 팔로우 추천 - preamble: 흥미로운 콘텐츠를 노출하는 것은 마스토돈을 알지 못할 수도 있는 신규 사용자를 유입시키는 데 중요합니다. 이 서버에서 작동하는 다양한 발견하기 기능을 제어합니다. privacy: 개인정보 profile_directory: 프로필 책자 public_timelines: 공개 타임라인 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..5c982eff3 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -796,7 +796,6 @@ 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. privacy: Privasita profile_directory: Katalogo de profiles public_timelines: Linyas de tiempo publikas 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..53a360235 100644 --- a/config/locales/nan.yml +++ b/config/locales/nan.yml @@ -823,7 +823,6 @@ nan: title: 預設kā用者tuì tshiau-tshuē ia̋n-jín ê索引排除 discovery: follow_recommendations: 跟tuè建議 - preamble: Kā心適ê內容浮現出來,ē當幫tsān tī Mastodon頂siáng lóng可能m̄知ê新手。控制tsē-tsē發現lí ê服侍器ê特色作品ê功能án-nuá運作。 privacy: 隱私權 profile_directory: 個人資料ê目錄 public_timelines: 公共ê時間線 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 68f76a44a..0a5bcd6b7 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -837,7 +837,6 @@ 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. privacy: Privacy profile_directory: Gebruikersgids public_timelines: Openbare tijdlijnen diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 614b0aa8d..c3e37405c 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -837,7 +837,7 @@ 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 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..d1aec7bef 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -849,7 +849,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 diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 5af827595..615432f17 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -837,7 +837,6 @@ 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. privacy: Privacidade profile_directory: Diretório de perfis public_timelines: Timelines públicas diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 4e7178354..b2e802300 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -837,7 +837,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 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/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..967087a6e 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 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..202e2c003 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -782,7 +782,6 @@ th: title: เลือกให้ผู้ใช้ไม่รับการทำดัชนีโดยเครื่องมือค้นหาเป็นค่าเริ่มต้น discovery: follow_recommendations: คำแนะนำการติดตาม - preamble: การแสดงเนื้อหาที่น่าสนใจเป็นเครื่องมือในการเตรียมความพร้อมให้ผู้ใช้ใหม่ที่อาจไม่รู้จักใครก็ตามใน Mastodon ควบคุมวิธีที่คุณลักษณะการค้นพบต่าง ๆ ทำงานในเซิร์ฟเวอร์ของคุณ privacy: ความเป็นส่วนตัว profile_directory: ไดเรกทอรีโปรไฟล์ public_timelines: เส้นเวลาสาธารณะ 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..d26030cda 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -823,7 +823,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 diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index b91473890..8245d9716 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -823,7 +823,7 @@ zh-CN: title: 默认不让用户被搜索引擎索引 discovery: follow_recommendations: 关注推荐 - preamble: 露出有趣的内容有助于新加入 Mastodon 的用户融入。可在这里控制多种发现功能如何在你的服务器上工作。 + preamble: 展示有趣的内容有助于新加入 Mastodon 的用户融入。可在这里控制多种发现功能如何在你的服务器上工作。 privacy: 隐私 profile_directory: 个人资料目录 public_timelines: 公共时间线 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 2c8ebb07a..dbb53085c 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -825,7 +825,7 @@ zh-TW: title: 預設將使用者排除於搜尋引擎索引 discovery: follow_recommendations: 跟隨建議 - preamble: 呈現有趣的內容有助於 Mastodon 上一人不識的新手上路。控制各種不同的分類於您伺服器上如何被探索到。 + preamble: 呈現有趣的內容有助於 Mastodon 上一人不識的新手上路。控制您伺服器上各類探索功能之運作方式。 privacy: 隱私權 profile_directory: 個人檔案目錄 public_timelines: 公開時間軸 From 2fa5dd6d1ff60e9f5250c96d10ed3f1dddca7e3f Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 23 Oct 2025 11:59:43 +0200 Subject: [PATCH 16/90] Add UI support for disabled live feeds (#36577) Co-authored-by: diondiondion --- .../features/community_timeline/index.jsx | 18 ++++++++++++++++-- .../mastodon/features/firehose/index.jsx | 18 ++++++++++++++---- .../features/navigation_panel/index.tsx | 10 +++++----- .../features/public_timeline/index.jsx | 18 ++++++++++++++++-- app/javascript/mastodon/initial_state.ts | 8 ++++---- app/javascript/mastodon/locales/en.json | 1 + app/javascript/mastodon/permissions.ts | 17 +++++++++++++++++ 7 files changed, 73 insertions(+), 17 deletions(-) diff --git a/app/javascript/mastodon/features/community_timeline/index.jsx b/app/javascript/mastodon/features/community_timeline/index.jsx index 5652ea532..b33fdd26b 100644 --- a/app/javascript/mastodon/features/community_timeline/index.jsx +++ b/app/javascript/mastodon/features/community_timeline/index.jsx @@ -10,7 +10,8 @@ import { connect } from 'react-redux'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; -import { domain } from 'mastodon/initial_state'; +import { domain, localLiveFeedAccess } from 'mastodon/initial_state'; +import { canViewFeed } from 'mastodon/permissions'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { connectCommunityStream } from '../../actions/streaming'; @@ -120,8 +121,21 @@ class CommunityTimeline extends PureComponent { render () { const { intl, hasUnread, columnId, multiColumn, onlyMedia } = this.props; + const { signedIn, permissions } = this.props.identity; const pinned = !!columnId; + const emptyMessage = canViewFeed(signedIn, permissions, localLiveFeedAccess) ? ( + + ) : ( + + ); + return ( } + emptyMessage={emptyMessage} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/firehose/index.jsx b/app/javascript/mastodon/features/firehose/index.jsx index 69db171cd..91704f123 100644 --- a/app/javascript/mastodon/features/firehose/index.jsx +++ b/app/javascript/mastodon/features/firehose/index.jsx @@ -13,7 +13,8 @@ import { changeSetting } from 'mastodon/actions/settings'; import { connectPublicStream, connectCommunityStream } from 'mastodon/actions/streaming'; import { expandPublicTimeline, expandCommunityTimeline } from 'mastodon/actions/timelines'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; -import { localLiveFeedAccess, remoteLiveFeedAccess, me, domain } from 'mastodon/initial_state'; +import { localLiveFeedAccess, remoteLiveFeedAccess, domain } from 'mastodon/initial_state'; +import { canViewFeed } from 'mastodon/permissions'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import Column from '../../components/column'; @@ -52,7 +53,7 @@ const ColumnSettings = () => { const Firehose = ({ feedType, multiColumn }) => { const dispatch = useAppDispatch(); const intl = useIntl(); - const { signedIn } = useIdentity(); + const { signedIn, permissions } = useIdentity(); const columnRef = useRef(null); const onlyMedia = useAppSelector((state) => state.getIn(['settings', 'firehose', 'onlyMedia'], false)); @@ -151,6 +152,15 @@ const Firehose = ({ feedType, multiColumn }) => { /> ); + const canViewSelectedFeed = canViewFeed(signedIn, permissions, feedType === 'community' ? localLiveFeedAccess : remoteLiveFeedAccess); + + const disabledTimelineMessage = ( + + ); + return ( { - {(signedIn || (localLiveFeedAccess === 'public' && remoteLiveFeedAccess === 'public')) && ( + {(canViewFeed(signedIn, permissions, localLiveFeedAccess) && canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) && (
@@ -187,7 +197,7 @@ const Firehose = ({ feedType, multiColumn }) => { onLoadMore={handleLoadMore} trackScroll scrollKey='firehose' - emptyMessage={emptyMessage} + emptyMessage={canViewSelectedFeed ? emptyMessage : disabledTimelineMessage} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/features/navigation_panel/index.tsx b/app/javascript/mastodon/features/navigation_panel/index.tsx index d509bfb6c..446deb1dd 100644 --- a/app/javascript/mastodon/features/navigation_panel/index.tsx +++ b/app/javascript/mastodon/features/navigation_panel/index.tsx @@ -42,6 +42,7 @@ import { me, } from 'mastodon/initial_state'; import { transientSingleColumn } from 'mastodon/is_mobile'; +import { canViewFeed } from 'mastodon/permissions'; import { selectUnreadNotificationGroupsCount } from 'mastodon/selectors/notifications'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; @@ -194,7 +195,7 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ multiColumn = false, }) => { const intl = useIntl(); - const { signedIn, disabledAccountId } = useIdentity(); + const { signedIn, permissions, disabledAccountId } = useIdentity(); const location = useLocation(); const showSearch = useBreakpoint('full') && !multiColumn; @@ -262,13 +263,12 @@ export const NavigationPanel: React.FC<{ multiColumn?: boolean }> = ({ /> )} - {(signedIn || - localLiveFeedAccess === 'public' || - remoteLiveFeedAccess === 'public') && ( + {(canViewFeed(signedIn, permissions, localLiveFeedAccess) || + canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) && ( + ) : ( + + ); + return ( } + emptyMessage={emptyMessage} bindToDocument={!multiColumn} /> diff --git a/app/javascript/mastodon/initial_state.ts b/app/javascript/mastodon/initial_state.ts index 324c093b4..c1cd37753 100644 --- a/app/javascript/mastodon/initial_state.ts +++ b/app/javascript/mastodon/initial_state.ts @@ -33,10 +33,10 @@ interface InitialStateMeta { single_user_mode: boolean; source_url: string; streaming_api_base_url: string; - local_live_feed_access: 'public' | 'authenticated'; - remote_live_feed_access: 'public' | 'authenticated'; - local_topic_feed_access: 'public' | 'authenticated'; - remote_topic_feed_access: 'public' | 'authenticated'; + local_live_feed_access: 'public' | 'authenticated' | 'disabled'; + remote_live_feed_access: 'public' | 'authenticated' | 'disabled'; + local_topic_feed_access: 'public' | 'authenticated' | 'disabled'; + remote_topic_feed_access: 'public' | 'authenticated' | 'disabled'; title: string; show_trends: boolean; trends_as_landing_page: boolean; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 6917bfef3..12fb8f434 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.", + "empty_column.disabled_feed": "This feed has been disabled by your server administrators.", "empty_column.domain_blocks": "There are no blocked domains yet.", "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", "empty_column.favourited_statuses": "You don't have any favorite posts yet. When you favorite one, it will show up here.", 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; + } +}; From 6b2051b7b3d13d5425c8c86c9ae03baaedc6b603 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 23 Oct 2025 13:51:23 +0200 Subject: [PATCH 17/90] Fix bookmarks export when one bookmarked status is soft-deleted (#36576) --- app/models/export.rb | 2 +- spec/models/export_spec.rb | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) 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/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 From 1ba579b0a181fbfff514ef32b50179d2ab1fc342 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 23 Oct 2025 17:52:07 +0200 Subject: [PATCH 18/90] Fix "new post highlighting" in threads being applied when navigating between posts (#36583) --- app/javascript/mastodon/features/status/index.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index a07b20f02..bcccc1104 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -504,12 +504,14 @@ class Status extends ImmutablePureComponent { componentDidUpdate (prevProps) { const { status, ancestorsIds, descendantsIds } = this.props; - if (status && (ancestorsIds.length > prevProps.ancestorsIds.length || prevProps.status?.get('id') !== status.get('id'))) { + const isSameStatus = status && (prevProps.status?.get('id') === status.get('id')); + + if (status && (ancestorsIds.length > prevProps.ancestorsIds.length || !isSameStatus)) { this._scrollStatusIntoView(); } // Only highlight replies after the initial load - if (prevProps.descendantsIds.length) { + if (prevProps.descendantsIds.length && isSameStatus) { const newRepliesIds = difference(descendantsIds, prevProps.descendantsIds); if (newRepliesIds.length) { From 2640cf531757888a2877a38f63cd5a9254ac1474 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 27 Oct 2025 05:38:01 -0400 Subject: [PATCH 19/90] Update stoplight to version 5.4.0 (#36581) --- Gemfile.lock | 2 +- spec/controllers/concerns/api/error_handling_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 987df10f0..801d8087a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -834,7 +834,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) 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) From 5f837001e62b73dec3cbe60923ea3e12f9d7c923 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 09:40:13 +0000 Subject: [PATCH 20/90] Update opentelemetry-ruby (non-major) (#36557) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile | 26 +++++------ Gemfile.lock | 122 +++++++++++++++++++++++++-------------------------- 2 files changed, 74 insertions(+), 74 deletions(-) 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 801d8087a..9b4ad8534 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -504,68 +504,68 @@ GEM 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) @@ -1009,19 +1009,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 From e40ca321ed3a4c2e81c15a2c16b13f6f647f7e3e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 09:45:37 +0000 Subject: [PATCH 21/90] New Crowdin Translations (automated) (#36590) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 1 + app/javascript/mastodon/locales/cs.json | 2 + app/javascript/mastodon/locales/cy.json | 3 + app/javascript/mastodon/locales/da.json | 1 + app/javascript/mastodon/locales/de.json | 1 + app/javascript/mastodon/locales/el.json | 1 + app/javascript/mastodon/locales/es-AR.json | 1 + app/javascript/mastodon/locales/es-MX.json | 1 + app/javascript/mastodon/locales/es.json | 1 + app/javascript/mastodon/locales/gd.json | 8 +- app/javascript/mastodon/locales/gl.json | 1 + app/javascript/mastodon/locales/he.json | 1 + app/javascript/mastodon/locales/hu.json | 1 + app/javascript/mastodon/locales/is.json | 1 + app/javascript/mastodon/locales/it.json | 1 + app/javascript/mastodon/locales/nan.json | 1 + app/javascript/mastodon/locales/nl.json | 1 + app/javascript/mastodon/locales/pl.json | 122 +++++++++++++++------ app/javascript/mastodon/locales/sq.json | 1 + app/javascript/mastodon/locales/ug.json | 5 + app/javascript/mastodon/locales/vi.json | 1 + app/javascript/mastodon/locales/zh-TW.json | 1 + config/locales/be.yml | 3 + config/locales/cs.yml | 14 +++ config/locales/cy.yml | 14 +++ config/locales/da.yml | 3 + config/locales/de.yml | 4 +- config/locales/devise.cs.yml | 1 + config/locales/devise.cy.yml | 1 + config/locales/devise.pl.yml | 1 + config/locales/el.yml | 3 + config/locales/es-AR.yml | 3 + config/locales/es-MX.yml | 3 + config/locales/es.yml | 3 + config/locales/fo.yml | 3 + config/locales/ga.yml | 4 + config/locales/gd.yml | 13 ++- config/locales/gl.yml | 3 + config/locales/he.yml | 3 + config/locales/hu.yml | 4 + config/locales/is.yml | 3 + config/locales/it.yml | 4 + config/locales/nan.yml | 60 ++++++++++ config/locales/nl.yml | 4 + config/locales/pl.yml | 18 +++ config/locales/simple_form.cs.yml | 7 ++ config/locales/simple_form.cy.yml | 7 ++ config/locales/simple_form.pl.yml | 14 +++ config/locales/simple_form.ru.yml | 14 +-- config/locales/sq.yml | 1 + config/locales/vi.yml | 3 + config/locales/zh-TW.yml | 3 + 52 files changed, 325 insertions(+), 53 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 74ea49409..d54348779 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "У Вашых закладках яшчэ няма допісаў. Калі Вы дадасце закладку, яна з’явіцца тут.", "empty_column.community": "Мясцовая стужка пустая. Напішыце нешта публічнае, каб разварушыць справу!", "empty_column.direct": "Пакуль у Вас няма асабістых згадванняў. Калі Вы дашляце або атрымаеце штосьці, яно з’явіцца тут.", + "empty_column.disabled_feed": "Гэта стужка была адключаная Вашымі адміністратарамі сервера.", "empty_column.domain_blocks": "Заблакіраваных даменаў пакуль няма.", "empty_column.explore_statuses": "Зараз не ў трэндзе. Праверце пазней", "empty_column.favourited_statuses": "Вы яшчэ не ўпадабалі ніводны допіс. Калі гэта адбудзецца, Вы ўбачыце яго тут.", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 5eccf7174..3531a6422 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Zatím v záložkách nemáte žádné příspěvky. Až si do nich nějaký přidáte, zobrazí se zde.", "empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!", "empty_column.direct": "Zatím nemáte žádné soukromé zmínky. Až nějakou pošlete nebo dostanete, zobrazí se zde.", + "empty_column.disabled_feed": "Tento kanál byl zakázán administrátory vašeho serveru.", "empty_column.domain_blocks": "Ještě nemáte žádné zablokované domény.", "empty_column.explore_statuses": "Momentálně není nic populární. Vraťte se později!", "empty_column.favourited_statuses": "Zatím nemáte žádné oblíbené příspěvky. Až si nějaký oblíbíte, zobrazí se zde.", @@ -876,6 +877,7 @@ "status.contains_quote": "Obsahuje citaci", "status.context.loading": "Načítání dalších odpovědí", "status.context.loading_error": "Nelze načíst nové odpovědi", + "status.context.loading_success": "Nové odpovědi načteny", "status.context.more_replies_found": "Nalezeny další odpovědi", "status.context.retry": "Zkusit znovu", "status.context.show": "Zobrazit", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 57119f0b1..614348d36 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Does gennych chi ddim unrhyw bostiad wedi'u cadw fel nod tudalen eto. Pan fyddwch yn gosod nod tudalen i un, mi fydd yn ymddangos yma.", "empty_column.community": "Mae'r ffrwd lleol yn wag. Beth am ysgrifennu rhywbeth cyhoeddus!", "empty_column.direct": "Does gennych chi unrhyw grybwylliadau preifat eto. Pan fyddwch chi'n anfon neu'n derbyn un, bydd yn ymddangos yma.", + "empty_column.disabled_feed": "Mae'r ffrwd hon wedi'i hanalluogi gan weinyddwyr eich gweinydd.", "empty_column.domain_blocks": "Does dim parthau wedi'u rhwystro eto.", "empty_column.explore_statuses": "Does dim pynciau llosg ar hyn o bryd. Dewch nôl nes ymlaen!", "empty_column.favourited_statuses": "Rydych chi heb ffafrio unrhyw bostiadau eto. Pan byddwch chi'n ffafrio un, bydd yn ymddangos yma.", @@ -753,6 +754,7 @@ "privacy.unlisted.short": "Tewi'r cyhoeddus", "privacy_policy.last_updated": "Diweddarwyd ddiwethaf ar {date}", "privacy_policy.title": "Polisi Preifatrwydd", + "quote_error.edit": "Does dim modd ychwanegu dyfyniadau wrth olygu postiad.", "quote_error.poll": "Dyw dyfynnu ddim yn cael ei ganiatáu gyda pholau.", "quote_error.quote": "Dim ond un dyfyniad ar y tro sy'n cael ei ganiatáu.", "quote_error.unauthorized": "Does gennych chi ddim awdurdod i ddyfynnu'r postiad hwn.", @@ -875,6 +877,7 @@ "status.contains_quote": "Yn cynnwys dyfyniad", "status.context.loading": "Yn llwytho mwy o atebion", "status.context.loading_error": "Wedi methu llwytho atebion newydd", + "status.context.loading_success": "Atebion newydd wedi'u llwytho", "status.context.more_replies_found": "Mwy o atebion wedi'u canfod", "status.context.retry": "Ceisio eto", "status.context.show": "Dangos", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 8d3e52474..66e30e47b 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.", "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!", "empty_column.direct": "Du har ikke nogen private omtaler endnu. Når du sender eller modtager en, vil den blive vist her.", + "empty_column.disabled_feed": "Dette feed er blevet deaktiveret af dine serveradministratorer.", "empty_column.domain_blocks": "Ingen blokerede domæner endnu.", "empty_column.explore_statuses": "Ingen nye trends lige nu. Tjek igen senere!", "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du føjer et opslag til favoritter, vil det dukke op her.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 5e65e8adc..86826091f 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Du hast bisher keine Beiträge als Lesezeichen abgelegt. Sobald du einen Beitrag als Lesezeichen speicherst, wird er hier erscheinen.", "empty_column.community": "Die lokale Timeline ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!", "empty_column.direct": "Du hast noch keine privaten Erwähnungen. Sobald du eine sendest oder erhältst, wird sie hier erscheinen.", + "empty_column.disabled_feed": "Diesen Feed haben deine Server-Administrator*innen deaktiviert.", "empty_column.domain_blocks": "Du hast noch keine Domains blockiert.", "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder vorbei!", "empty_column.favourited_statuses": "Du hast noch keine Beiträge favorisiert. Sobald du einen favorisierst, wird er hier erscheinen.", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 8dc9e85e8..93c35f646 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Δεν έχεις καμία ανάρτηση με σελιδοδείκτη ακόμα. Μόλις βάλεις κάποιον, θα εμφανιστεί εδώ.", "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσια για να αρχίσει να κυλά η μπάλα!", "empty_column.direct": "Δεν έχεις καμία προσωπική επισήμανση ακόμα. Όταν στείλεις ή λάβεις μία, θα εμφανιστεί εδώ.", + "empty_column.disabled_feed": "Αυτή η ροή έχει απενεργοποιηθεί από τους διαχειριστές του διακομιστή σας.", "empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.", "empty_column.explore_statuses": "Τίποτα δεν βρίσκεται στις τάσεις αυτή τη στιγμή. Έλεγξε αργότερα!", "empty_column.favourited_statuses": "Δεν έχεις καμία αγαπημένη ανάρτηση ακόμα. Μόλις αγαπήσεις κάποια, θα εμφανιστεί εδώ.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index e5f79b233..11316799f 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Todavía no tenés mensajes guardados en \"Marcadores\". Cuando guardés uno en \"Marcadores\", se mostrará acá.", "empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!", "empty_column.direct": "Todavía no tenés ninguna mención privada. Cuando enviés o recibás una, se mostrará acá.", + "empty_column.disabled_feed": "Esta línea temporal fue deshabilitada por los administradores de tu servidor.", "empty_column.domain_blocks": "Todavía no hay dominios bloqueados.", "empty_column.explore_statuses": "No hay nada en tendencia ahora mismo. ¡Volvé a revisar más tarde!", "empty_column.favourited_statuses": "Todavía no tenés mensajes favoritos. Cuando marqués uno como favorito, se mostrará acá.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 26171460b..b6444b4bd 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.", "empty_column.community": "La cronología local está vacía. ¡Escribe algo públicamente para ponerla en marcha!", "empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.", + "empty_column.disabled_feed": "Esta cronología ha sido desactivada por los administradores del servidor.", "empty_column.domain_blocks": "Todavía no hay dominios ocultos.", "empty_column.explore_statuses": "Nada es tendencia en este momento. ¡Revisa más tarde!", "empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando le des favorito a una publicación se mostrarán acá.", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index e8bd6e294..a1136f71a 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.", "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!", "empty_column.direct": "Aún no tienes menciones privadas. Cuando envíes o recibas una, aparecerán aquí.", + "empty_column.disabled_feed": "Esta cronología ha sido desactivada por los administradores del servidor.", "empty_column.domain_blocks": "Todavía no hay dominios bloqueados.", "empty_column.explore_statuses": "No hay nada en tendencia en este momento. ¡Revisa más tarde!", "empty_column.favourited_statuses": "Todavía no tienes publicaciones favoritas. Cuando marques una publicación como favorita, se mostrarán aquí.", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index b7e3b3661..00d5629df 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -745,9 +745,9 @@ "privacy.private.short": "Luchd-leantainn", "privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon", "privacy.public.short": "Poblach", - "privacy.quote.anyone": "{visibility}, faodaidh neach sam bith a luaidh", - "privacy.quote.disabled": "{visibility}, luaidhean à comas", - "privacy.quote.limited": "{visibility}, luaidhean cuingichte", + "privacy.quote.anyone": "{visibility}, luaidhidh neach sam bith e", + "privacy.quote.disabled": "{visibility}, luaidh à comas", + "privacy.quote.limited": "{visibility}, luaidh cuingichte", "privacy.unlisted.additional": "Tha seo coltach ris an fhaicsinneachd phoblach ach cha nochd am post air loidhnichean-ama an t-saoghail phoblaich, nan tagaichean hais no an rùrachaidh no ann an toraidhean luirg Mhastodon fiù ’s ma thug thu ro-aonta airson sin seachad.", "privacy.unlisted.long": "Falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach", "privacy.unlisted.short": "Poblach ach sàmhach", @@ -1016,6 +1016,6 @@ "visibility_modal.quote_followers": "Luchd-leantainn a-mhàin", "visibility_modal.quote_label": "Cò dh’fhaodas luaidh", "visibility_modal.quote_nobody": "Mi fhìn a-mhàin", - "visibility_modal.quote_public": "Duine sam bith", + "visibility_modal.quote_public": "Neach sam bith", "visibility_modal.save": "Sàbhail" } diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 668c3e5ba..6ce9544cb 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Aínda non marcaches ningunha publicación. Cando o fagas, aparecerán aquí.", "empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!", "empty_column.direct": "Aínda non tes mencións privadas. Cando envíes ou recibas unha, aparecerá aquí.", + "empty_column.disabled_feed": "A administración do teu servidor desactivou esta canle.", "empty_column.domain_blocks": "Aínda non hai dominios agochados.", "empty_column.explore_statuses": "Non hai temas en voga. Volve máis tarde!", "empty_column.favourited_statuses": "Aínda non tes publicacións favoritas. Cando favorezas unha, aparecerá aquí.", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 3aa0cf900..f99ad99f4 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "אין עדיין הודעות שחיבבת. כשתחבב את הראשונה, היא תופיע כאן.", "empty_column.community": "פיד השרת המקומי ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!", "empty_column.direct": "אין לך שום הודעות פרטיות עדיין. כשתשלחו או תקבלו אחת, היא תופיע כאן.", + "empty_column.disabled_feed": "פיד זה נחסם לשימוש על ידי מנהלי השרת שלך.", "empty_column.domain_blocks": "אין עדיין קהילות מוסתרות.", "empty_column.explore_statuses": "אין נושאים חמים כרגע. אולי אחר כך!", "empty_column.favourited_statuses": "אין עדיין הודעות שחיבבת. כשתחבב/י את הראשונה, היא תופיע כאן.", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 053e5d92c..67c9dcddc 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Még nincs egyetlen könyvjelzőzött bejegyzésed sem. Ha könyvjelzőzöl egyet, itt fog megjelenni.", "empty_column.community": "A helyi idővonal üres. Tégy közzé valamit nyilvánosan, hogy elindítsd az eseményeket!", "empty_column.direct": "Még nincs egy személyes említésed sem. Küldéskor vagy fogadáskor itt fognak megjelenni.", + "empty_column.disabled_feed": "A kiszolgálód rendszergazdái letiltották ezt a hírfolyamot.", "empty_column.domain_blocks": "Még nem lett letiltva egyetlen domain sem.", "empty_column.explore_statuses": "Jelenleg semmi sem felkapott. Nézz vissza később!", "empty_column.favourited_statuses": "Még nincs egyetlen kedvenc bejegyzésed sem. Ha kedvencnek jelölsz egyet, itt fog megjelenni.", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 98fac141a..1e96357d8 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.", "empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!", "empty_column.direct": "Þú ert ekki ennþá með neitt einkaspjall við neinn. Þegar þú sendir eða tekur við slíku, mun það birtast hér.", + "empty_column.disabled_feed": "Þetta streymi hefur verið gert óvirkt af stjórnendum netþjónis þíns.", "empty_column.domain_blocks": "Það eru ennþá engin útilokuð lén.", "empty_column.explore_statuses": "Ekkert er á uppleið í augnablikinu. Athugaðu aftur síðar!", "empty_column.favourited_statuses": "Þú ert ekki ennþá með neinar eftirlætisfærslur. Þegar þú setur færslu í eftirlæti, munu þau birtast hér.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 07392e9f7..9e57f42fc 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Non hai ancora salvato nei segnalibri alcun post. Quando lo farai, apparirà qui.", "empty_column.community": "La cronologia locale è vuota. Scrivi qualcosa pubblicamente per dare inizio alla festa!", "empty_column.direct": "Non hai ancora alcuna menzione privata. Quando ne invierai o riceverai una, apparirà qui.", + "empty_column.disabled_feed": "Questo feed è stato disabilitato dagli amministratori del tuo server.", "empty_column.domain_blocks": "Ancora nessun dominio bloccato.", "empty_column.explore_statuses": "Nulla è in tendenza al momento. Ricontrolla più tardi!", "empty_column.favourited_statuses": "Non hai ancora alcun post preferito. Quando ne salverai uno tra i preferiti, apparirà qui.", diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index ea5f78614..db021f52e 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Lí iáu無加添任何冊籤。Nā是lí加添冊籤,伊ē佇tsia顯示。", "empty_column.community": "本站時間線是空ê。緊來公開PO文oh!", "empty_column.direct": "Lí iáu無任何ê私人訊息。Nā是lí送á是收著私人訊息,ē佇tsia顯示。.", + "empty_column.disabled_feed": "Tsit ê feed已經hōo lí ê服侍器ê管理員停用。", "empty_column.domain_blocks": "Iáu無封鎖任何網域。", "empty_column.explore_statuses": "目前iáu無有流行ê趨勢,請sió等tsi̍t-ē,koh確認。", "empty_column.favourited_statuses": "Lí iáu無加添任何收藏 ê PO文。Nā是lí加收藏,伊ē佇tsia顯示。", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 98f0fdab0..073470b18 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.", "empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!", "empty_column.direct": "Je hebt nog geen privéberichten. Wanneer je er een verstuurt of ontvangt, komen deze hier te staan.", + "empty_column.disabled_feed": "Deze tijdlijn is uitgeschakeld door je serverbeheerders.", "empty_column.domain_blocks": "Er zijn nog geen geblokkeerde servers.", "empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!", "empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je een bericht als favoriet markeert, valt deze hier te zien.", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index d121bea1a..e56369233 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -20,7 +20,7 @@ "account.block": "Blokuj @{name}", "account.block_domain": "Blokuj wszystko z {domain}", "account.block_short": "Zablokuj", - "account.blocked": "Zablokowany(-a)", + "account.blocked": "Zablokowano", "account.blocking": "Blokowanie", "account.cancel_follow_request": "Nie obserwuj", "account.copy": "Skopiuj link do profilu", @@ -28,11 +28,12 @@ "account.disable_notifications": "Przestań powiadamiać mnie o wpisach @{name}", "account.domain_blocking": "Blokowanie domeny", "account.edit_profile": "Edytuj profil", + "account.edit_profile_short": "Edytuj", "account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}", "account.endorse": "Wyróżnij na profilu", - "account.familiar_followers_many": "Obserwowane przez: {name1}, {name2} i {othersCount, plural, one {jeszcze jedną osobę, którą znasz} few {# inne osoby, które znasz} many {# innych osób, które znasz} other {# innych osób, które znasz}}", - "account.familiar_followers_one": "Obserwowane przez {name1}", - "account.familiar_followers_two": "Obserwowane przez {name1} i {name2}", + "account.familiar_followers_many": "To konto jest obserwowane przez {name1}, {name2} i {othersCount, plural, one {jedną inną znaną ci osobę} few {# inne znane ci osoby} many {# innych znanych ci osób} other {# innych znanych ci osób}}", + "account.familiar_followers_one": "To konto jest obserwowane przez {name1}", + "account.familiar_followers_two": "To konto jest obserwowane przez {name1} i {name2}", "account.featured": "Wyróżnione", "account.featured.accounts": "Profile", "account.featured.hashtags": "Tagi", @@ -40,10 +41,15 @@ "account.featured_tags.last_status_never": "Brak postów", "account.follow": "Obserwuj", "account.follow_back": "Również obserwuj", + "account.follow_back_short": "Również obserwuj", + "account.follow_request": "Poproś o zgodę na obserwowanie", + "account.follow_request_cancel": "Anuluj", + "account.follow_request_cancel_short": "Anuluj", + "account.follow_request_short": "Poproś", "account.followers": "Obserwujący", "account.followers.empty": "Nikt jeszcze nie obserwuje tego użytkownika.", "account.followers_counter": "{count, plural, one {{counter} obserwujący} few {{counter} obserwujących} many {{counter} obserwujących} other {{counter} obserwujących}}", - "account.followers_you_know_counter": "{counter} które znasz", + "account.followers_you_know_counter": "znasz {counter}", "account.following": "Obserwowani", "account.following_counter": "{count, plural, one {{counter} obserwowany} few {{counter} obserwowanych} many {{counter} obserwowanych} other {{counter} obserwowanych}}", "account.follows.empty": "Ten użytkownik nie obserwuje jeszcze nikogo.", @@ -62,15 +68,15 @@ "account.mute_notifications_short": "Wycisz powiadomienia", "account.mute_short": "Wycisz", "account.muted": "Wyciszony", - "account.muting": "Wyciszenie", - "account.mutual": "Obserwujecie siebie nazwajem", + "account.muting": "Wyciszanie", + "account.mutual": "Obserwujecie się wzajemnie", "account.no_bio": "Brak opisu.", "account.open_original_page": "Otwórz stronę oryginalną", "account.posts": "Wpisy", "account.posts_with_replies": "Wpisy i odpowiedzi", "account.remove_from_followers": "Usuń {name} z obserwujących", "account.report": "Zgłoś @{name}", - "account.requested_follow": "{name} chce cię zaobserwować", + "account.requested_follow": "{name} chce cię obserwować", "account.requests_to_follow_you": "Prośby o obserwowanie", "account.share": "Udostępnij profil @{name}", "account.show_reblogs": "Pokazuj podbicia od @{name}", @@ -85,8 +91,8 @@ "account.unmute_notifications_short": "Nie wyciszaj powiadomień", "account.unmute_short": "Nie wyciszaj", "account_note.placeholder": "Kliknij, aby dodać notatkę", - "admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników po dniach od rejestracji", - "admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników po miesiącach od rejestracji", + "admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników według dni od rejestracji", + "admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników według miesięcy od rejestracji", "admin.dashboard.retention.average": "Średnia", "admin.dashboard.retention.cohort": "Miesiąc rejestracji", "admin.dashboard.retention.cohort_size": "Nowi użytkownicy", @@ -111,10 +117,10 @@ "annual_report.summary.archetype.lurker": "Czyhający", "annual_report.summary.archetype.oracle": "Wyrocznia", "annual_report.summary.archetype.pollster": "Ankieter", - "annual_report.summary.archetype.replier": "Motyl społeczny", + "annual_report.summary.archetype.replier": "Towarzyski motyl", "annual_report.summary.followers.followers": "obserwujących", "annual_report.summary.followers.total": "łącznie {count}", - "annual_report.summary.here_it_is": "Oto przegląd Twojego {year} roku:", + "annual_report.summary.here_it_is": "Oto przegląd twojego {year} roku:", "annual_report.summary.highlighted_post.by_favourites": "najbardziej lubiany wpis", "annual_report.summary.highlighted_post.by_reblogs": "najczęściej podbijany wpis", "annual_report.summary.highlighted_post.by_replies": "wpis z największą liczbą komentarzy", @@ -187,7 +193,7 @@ "community.column_settings.media_only": "Tylko multimedia", "community.column_settings.remote_only": "Tylko zdalne", "compose.language.change": "Zmień język", - "compose.language.search": "Szukaj języków...", + "compose.language.search": "Wyszukaj języki...", "compose.published.body": "Wpis został opublikowany.", "compose.published.open": "Otwórz", "compose.saved.body": "Wpis został zapisany.", @@ -220,14 +226,14 @@ "confirmations.delete_list.title": "Usunąć listę?", "confirmations.discard_draft.confirm": "Odrzuć i kontynuuj", "confirmations.discard_draft.edit.cancel": "Wznów edytowanie", - "confirmations.discard_draft.edit.message": "Kontynuowanie spowoduje utratę wszystkich zmian wprowadzonych przez Ciebie w aktualnie edytowanym poście.", - "confirmations.discard_draft.edit.title": "Odrzucić zmiany w poście?", - "confirmations.discard_draft.post.cancel": "Wznów wersję roboczą", - "confirmations.discard_draft.post.message": "Kontynuacja odrzuci aktualnie tworzony post.", - "confirmations.discard_draft.post.title": "Anulować wersję roboczą?", + "confirmations.discard_draft.edit.message": "Kontynuowanie spowoduje utratę wszelkich zmian wprowadzonych w aktualnie edytowanym wpisie.", + "confirmations.discard_draft.edit.title": "Czy chcesz odrzucić zmiany w swoim wpisie?", + "confirmations.discard_draft.post.cancel": "Wznów szkic", + "confirmations.discard_draft.post.message": "Kontynuowanie spowoduje usunięcie aktualnie tworzonego wpisu.", + "confirmations.discard_draft.post.title": "Odrzucić szkic wpisu?", "confirmations.discard_edit_media.confirm": "Odrzuć", - "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?", - "confirmations.follow_to_list.confirm": "Zaobserwuj i dodaj do listy", + "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie multimediów. Czy chcesz je mimo to odrzucić?", + "confirmations.follow_to_list.confirm": "Obserwuj i dodaj do listy", "confirmations.follow_to_list.message": "Musisz obserwować {name}, aby dodać do listy.", "confirmations.follow_to_list.title": "Zaobserwować?", "confirmations.logout.confirm": "Wyloguj", @@ -235,19 +241,28 @@ "confirmations.logout.title": "Wylogować?", "confirmations.missing_alt_text.confirm": "Dodaj opis pomocniczy", "confirmations.missing_alt_text.message": "Twój wpis zawiera multimedia bez tekstu alternatywnego. Dodanie opisów pomaga zwiększyć dostępność tych treści dla większej liczby osób.", - "confirmations.missing_alt_text.secondary": "Opublikuj mimo to ", + "confirmations.missing_alt_text.secondary": "Opublikuj mimo wszystko", "confirmations.missing_alt_text.title": "Dodać tekst pomocniczy?", "confirmations.mute.confirm": "Wycisz", + "confirmations.quiet_post_quote_info.dismiss": "Nie przypominaj mi ponownie", + "confirmations.quiet_post_quote_info.got_it": "Rozumiem", + "confirmations.quiet_post_quote_info.message": "Kiedy cytujesz niewidoczny wpis publiczny, twój wpis zostanie ukryty z popularnych osi czasu.", + "confirmations.quiet_post_quote_info.title": "Cytowanie niewidocznych wpisów publicznych", "confirmations.redraft.confirm": "Usuń i popraw", "confirmations.redraft.message": "Czy na pewno chcesz usunąć i poprawić ten wpis? Polubienia, podbicia i komentarze pierwotnego wpisu zostaną utracone.", "confirmations.redraft.title": "Usunąć i poprawić wpis?", - "confirmations.remove_from_followers.confirm": "Usuń obserwującego", - "confirmations.remove_from_followers.message": "{name} przestanie Cię obserwować. Czy na pewno chcesz kontynuować?", - "confirmations.remove_from_followers.title": "Usunąć obserwującego?", - "confirmations.revoke_quote.confirm": "Usuń post", - "confirmations.revoke_quote.message": "Tej akcji nie można cofnąć.", - "confirmations.revoke_quote.title": "Usuń post?", + "confirmations.remove_from_followers.confirm": "Usuń z obserwujących", + "confirmations.remove_from_followers.message": "{name} przestanie cię obserwować. Czy na pewno chcesz kontynuować?", + "confirmations.remove_from_followers.title": "Usunąć z obserwujących?", + "confirmations.revoke_quote.confirm": "Usuń wpis", + "confirmations.revoke_quote.message": "Tej czynności nie można cofnąć.", + "confirmations.revoke_quote.title": "Usunąć wpis?", + "confirmations.unblock.confirm": "Odblokuj", + "confirmations.unblock.title": "Odblokować {name}?", "confirmations.unfollow.confirm": "Nie obserwuj", + "confirmations.unfollow.title": "Przestać obserwować {name}?", + "confirmations.withdraw_request.confirm": "Wycofaj prośbę", + "confirmations.withdraw_request.title": "Wycofać prośbę o zgodę na obserwowanie {name}?", "content_warning.hide": "Ukryj wpis", "content_warning.show": "Pokaż mimo to", "content_warning.show_more": "Pokaż więcej", @@ -281,7 +296,7 @@ "domain_pill.server": "Serwer", "domain_pill.their_handle": "Nazwa:", "domain_pill.their_server": "Cyfrowy dom wszystkich wpisów tej osoby.", - "domain_pill.their_username": "Unikalny identyfikator na serwerze. Możliwe jest znalezienie użytkowników o tej samej nazwie użytkownika na różnych serwerach.", + "domain_pill.their_username": "Unikalny identyfikator na serwerze. Możliwe jest znalezienie użytkowników o tej samej nazwie na różnych serwerach.", "domain_pill.username": "Nazwa użytkownika", "domain_pill.whats_in_a_handle": "Z czego składa się nazwa?", "domain_pill.who_they_are": "Dzięki temu, że nazwy wskazują, kim ktoś jest i gdzie się znajduje, możesz wchodzić w interakcje z innymi z różnych .", @@ -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/sq.json b/app/javascript/mastodon/locales/sq.json index a39bb0c07..2e368444e 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -329,6 +329,7 @@ "empty_column.bookmarked_statuses": "S’keni faqeruajtur ende ndonjë mesazh. Kur faqeruani një të tillë, ai do të shfaqet këtu.", "empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!", "empty_column.direct": "S’keni ende ndonjë përmendje private. Kur dërgoni ose merrni një të tillë, do të shfaqet këtu.", + "empty_column.disabled_feed": "Kjo prurje është çaktivizuar nga përgjegjësit e shërbyesit tuaj.", "empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.", "empty_column.explore_statuses": "Asgjë në modë tani. Kontrolloni më vonë!", "empty_column.favourited_statuses": "S’keni ende ndonjë postim të parapëlqyer. Kur të parapëlqeni një të tillë, do të shfaqet këtu.", 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..bc21886ed 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.", "empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!", "empty_column.direct": "Bạn chưa có tin nhắn riêng nào. Khi bạn gửi hoặc nhận một tin nhắn riêng, nó sẽ xuất hiện ở đây.", + "empty_column.disabled_feed": "Bảng tin này bị vô hiệu hóa bởi quản trị viên máy chủ của bạn.", "empty_column.domain_blocks": "Chưa ẩn bất kỳ máy chủ nào.", "empty_column.explore_statuses": "Chưa có gì hot. Kiểm tra lại sau!", "empty_column.favourited_statuses": "Bạn chưa thích tút nào. Hãy thử đi, nó sẽ xuất hiện ở đây.", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 6164df4ed..86e231dd4 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "您還沒有新增任何書籤。當您新增書籤時,它將於此顯示。", "empty_column.community": "本站時間軸是空的。快公開嘟些文搶頭香啊!", "empty_column.direct": "您還沒有收到任何私訊。當您私訊別人或收到私訊時,它將於此顯示。", + "empty_column.disabled_feed": "此內容已被您的伺服器管理員停用。", "empty_column.domain_blocks": "尚未封鎖任何網域。", "empty_column.explore_statuses": "目前沒有熱門討論,請稍候再回來看看!", "empty_column.favourited_statuses": "您還沒有加過任何嘟文至最愛。當您收藏嘟文時,它將於此顯示。", diff --git a/config/locales/be.yml b/config/locales/be.yml index 96ac5f04f..b265585e4 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: Дадаць правіла @@ -879,6 +881,7 @@ be: feed_access: modes: authenticated: Толькі аўтэнтыфікаваныя карыстальнікі + disabled: Запатрабаваць адмысловую ролю карыстальніка public: Усе registrations: moderation_recommandation: Пераканайцеся, што ў вас ёсць адэкватная і аператыўная каманда мадэратараў, перш чым адчыняць рэгістрацыю для ўсіх жадаючых! diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 3f24c637f..2c8f4c861 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,6 +867,7 @@ cs: title: Odhlásit uživatele ze standardního indexování vyhledávačů discovery: follow_recommendations: Doporučená sledování + 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 @@ -878,6 +881,7 @@ cs: feed_access: modes: authenticated: Pouze autentifikovaní uživatelé + disabled: Vyžadovat specifickou uživatelskou roli public: Všichni registrations: moderation_recommandation: Před otevřením registrací všem se ujistěte, že máte vhodný a reaktivní moderační tým! @@ -932,6 +936,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 @@ -939,6 +944,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: @@ -1223,7 +1229,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. @@ -2007,10 +2016,15 @@ cs: 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 9aa4fd965..4b875b2c0 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,6 +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 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 @@ -906,6 +909,7 @@ cy: feed_access: modes: authenticated: Defnyddwyr dilys yn unig + disabled: Gofyn am rôl defnyddiwr penodol public: Pawb registrations: moderation_recommandation: Gwnewch yn siŵr bod gennych chi dîm cymedroli digonol ac adweithiol cyn i chi agor cofrestriadau i bawb! @@ -960,6 +964,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 @@ -967,6 +972,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: @@ -1261,7 +1267,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. @@ -2093,10 +2102,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 d3b2f8db9..2114169d1 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 @@ -851,6 +853,7 @@ da: feed_access: modes: authenticated: Kun godkendte brugere + disabled: Kræv specifik brugerrolle public: Alle registrations: moderation_recommandation: Sørg for, at der er et tilstrækkeligt og reaktivt moderationsteam, før registrering åbnes for alle! diff --git a/config/locales/de.yml b/config/locales/de.yml index 02391fe27..450bdb436 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -2067,7 +2067,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 +2077,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.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.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/el.yml b/config/locales/el.yml index 37371db4a..aa0aec3a8 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: Προσθήκη κανόνα @@ -851,6 +853,7 @@ el: feed_access: modes: authenticated: Πιστοποιημένοι χρήστες μόνο + disabled: Να απαιτείται συγκεκριμένος ρόλος χρήστη public: Όλοι registrations: moderation_recommandation: Παρακαλώ βεβαιώσου ότι έχεις μια επαρκής και ενεργή ομάδα συντονισμού πριν ανοίξεις τις εγγραφές για όλους! diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 35aafafb3..bb82fe39e 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,6 +853,7 @@ es-AR: feed_access: modes: authenticated: Solo usuarios autenticados + disabled: Requerir un rol de específico de usuario public: Todos registrations: moderation_recommandation: Por favor, ¡asegurate de tener un equipo de moderación adecuado y reactivo antes de abrir los registros a todos! diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index a497d9cea..f5c52260c 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 @@ -851,6 +853,7 @@ es-MX: feed_access: modes: authenticated: Solo usuarios autenticados + disabled: Requerir un rol de usuario específico public: Todos 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!" diff --git a/config/locales/es.yml b/config/locales/es.yml index c62053637..226469679 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 @@ -851,6 +853,7 @@ es: feed_access: modes: authenticated: Solo usuarios autenticados + disabled: Requerir un rol de usuario específico public: Todos 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! diff --git a/config/locales/fo.yml b/config/locales/fo.yml index c1f02e17c..db217841e 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,6 +853,7 @@ fo: feed_access: modes: authenticated: Einans váttaðir brúkarar + disabled: Krev serstakan brúkaraleiklut public: Øll 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! diff --git a/config/locales/ga.yml b/config/locales/ga.yml index c6f103fb1..fa91f853e 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,6 +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 á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í @@ -892,6 +895,7 @@ ga: feed_access: modes: authenticated: Úsáideoirí fíordheimhnithe amháin + disabled: Éiligh ról úsáideora sonrach public: Gach duine 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! diff --git a/config/locales/gd.yml b/config/locales/gd.yml index a8ca7f48e..3b1f956fe 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -865,6 +865,7 @@ gd: title: Thoir air falbh ro-aonta nan cleachdaichean air inneacsadh le einnseanan-luirg mar a’ bhun-roghainn discovery: follow_recommendations: Molaidhean leantainn + preamble: Tha tighinn an uachdar susbainte inntinniche fìor-chudromach airson toiseach-tòiseachaidh an luchd-cleachdaidh ùr nach eil eòlach air duine sam bith air Mastodon, ma dh’fhaoidte. Stiùirich mar a dh’obraicheas gleusan an rùrachaidh air an fhrithealaiche agad. privacy: Prìobhaideachd profile_directory: Eòlaire nam pròifil public_timelines: Loidhnichean-ama poblach @@ -1571,10 +1572,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. @@ -2019,14 +2020,14 @@ gd: 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 + public_long: Neach sam bith taobh a-staigh no a-muigh Mhastodon unlisted: Poblach ach sàmhach unlisted_long: Falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach statuses_cleanup: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index fe278de63..79f9fafaf 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,6 +853,7 @@ gl: feed_access: modes: authenticated: Só para usuarias con sesión iniciada + disabled: Requerir un rol da usuaria específico public: Para calquera 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! diff --git a/config/locales/he.yml b/config/locales/he.yml index c7b4bec65..bac4c44bd 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,6 +881,7 @@ he: feed_access: modes: authenticated: משתמשים מאומתים בלבד + disabled: נדרש תפקיד משתמש מסוים public: כולם registrations: moderation_recommandation: יש לוודא שלאתר יש צוות מנחות ומנחי שיחה מספק ושירותי בטרם תבחרו לפתוח הרשמה לכולם! diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 51c619b70..a90e8a5c2 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 @@ -837,6 +839,7 @@ hu: title: Alapértelmezetten ne indexeljék a keresők a felhasználókat discovery: follow_recommendations: Ajánlottak követése + preamble: Az érdekes tartalmak felszínre hozása fontos szerepet játszik az új felhasználók bevonásában, akik esetleg nem ismerik a Mastodont. Szabályozd, hogy a különböző felfedezési funkciók hogyan működjenek a kiszolgálón. privacy: Adatvédelem profile_directory: Profiladatbázis public_timelines: Nyilvános idővonalak @@ -850,6 +853,7 @@ hu: feed_access: modes: authenticated: Csak hitelesített felhasználók + disabled: Konkrét felhasználói szerepkör megkövetelése public: Mindenki 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! diff --git a/config/locales/is.yml b/config/locales/is.yml index 7bcaf5648..4cb9da51a 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,6 +855,7 @@ is: feed_access: modes: authenticated: Einungis auðkenndir notendur + disabled: Krefjast sérstaks hlutverks notanda public: Allir registrations: moderation_recommandation: Tryggðu að þú hafir hæft og aðgengilegt umsjónarteymi til taks áður en þú opnar á skráningar fyrir alla! diff --git a/config/locales/it.yml b/config/locales/it.yml index 782d7a261..d10612290 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,6 +839,7 @@ it: title: Esclude gli utenti dall'indicizzazione dei motori di ricerca per impostazione predefinita discovery: follow_recommendations: Segui le raccomandazioni + 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 @@ -850,6 +853,7 @@ it: feed_access: modes: authenticated: Solo utenti autenticati + disabled: Richiedi un ruolo utente specifico public: Tutti registrations: moderation_recommandation: Assicurati di avere un team di moderazione adeguato e reattivo prima di aprire le registrazioni a tutti! diff --git a/config/locales/nan.yml b/config/locales/nan.yml index 53a360235..8127cc567 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: 加添規則 @@ -823,6 +825,7 @@ nan: title: 預設kā用者tuì tshiau-tshuē ia̋n-jín ê索引排除 discovery: follow_recommendations: 跟tuè建議 + preamble: Kā心適ê內容浮現出來,ē當幫tsān tī Mastodon頂siáng lóng可能m̄知ê新手。控制tsē-tsē發現lí ê服侍器ê特色作品ê功能án-nuá運作。 privacy: 隱私權 profile_directory: 個人資料ê目錄 public_timelines: 公共ê時間線 @@ -836,6 +839,7 @@ nan: feed_access: modes: authenticated: Kan-ta hōo登入ê用者 + disabled: 愛特別ê用者角色 public: Ta̍k lâng registrations: moderation_recommandation: 佇開放hōo ta̍k ê lâng註冊進前,請確認lí有夠額koh主動反應ê管理團隊! @@ -1153,6 +1157,62 @@ 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}! scheduled_statuses: too_soon: Tio̍h用未來ê日期。 statuses: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 0a5bcd6b7..241a22f02 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,6 +839,7 @@ nl: title: Gebruikers standaard niet door zoekmachines laten indexeren discovery: follow_recommendations: Aanbevolen accounts + 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 @@ -850,6 +853,7 @@ nl: feed_access: modes: authenticated: Alleen ingelogde gebruikers + disabled: Specifieke gebruikersrol vereisen public: Iedereen registrations: moderation_recommandation: Zorg ervoor dat je een adequaat en responsief moderatieteam hebt voordat je registraties voor iedereen openstelt! diff --git a/config/locales/pl.yml b/config/locales/pl.yml index d1aec7bef..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 @@ -1976,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 @@ -2021,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: @@ -2055,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: @@ -2089,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/simple_form.cs.yml b/config/locales/simple_form.cs.yml index d4847acc8..5b6459d9f 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 @@ -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 diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 89127c13a..f24631d72 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 @@ -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 diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index d0584d577..c871be44d 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -54,13 +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_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 @@ -234,9 +239,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 @@ -246,6 +254,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 @@ -279,12 +289,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 diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index bb00e86f8..e9bde9c3b 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -179,18 +179,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: Весь день diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 967087a6e..20830e4de 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -845,6 +845,7 @@ sq: feed_access: modes: authenticated: Vetëm përdorues të mirëfilltësuar + disabled: Lyp doemos rol specifik përdoruesi public: Kushdo registrations: moderation_recommandation: Ju lutemi, sigurohuni si keni një ekip adekuat dhe reagues moderimi, përpara se të hapni regjistrimet për këdo! diff --git a/config/locales/vi.yml b/config/locales/vi.yml index d26030cda..fe2a2183f 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 @@ -837,6 +839,7 @@ 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 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! diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index dbb53085c..5fb797b64 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: 新增規則 @@ -839,6 +841,7 @@ zh-TW: feed_access: modes: authenticated: 僅限已登入之使用者 + disabled: 需要特定使用者權限 public: 任何人 registrations: moderation_recommandation: 對所有人開放註冊之前,請確保您有人手充足且反應靈敏的管理員團隊! From 779a1f84481ae9b73247083aa1573cc4e9e04cca Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 27 Oct 2025 11:16:59 +0100 Subject: [PATCH 22/90] Add a new setting to choose the server landing page (#36588) --- app/javascript/mastodon/features/ui/index.jsx | 6 ++-- app/javascript/mastodon/initial_state.ts | 4 +-- app/models/form/admin_settings.rb | 5 +-- app/serializers/initial_state_serializer.rb | 2 +- .../admin/settings/branding/show.html.haml | 7 ++++ .../admin/settings/discovery/show.html.haml | 5 --- config/locales/en.yml | 5 +++ config/locales/simple_form.ar.yml | 2 -- config/locales/simple_form.be.yml | 2 -- config/locales/simple_form.bg.yml | 2 -- config/locales/simple_form.ca.yml | 2 -- config/locales/simple_form.cs.yml | 2 -- config/locales/simple_form.cy.yml | 2 -- config/locales/simple_form.da.yml | 2 -- config/locales/simple_form.de.yml | 2 -- config/locales/simple_form.el.yml | 2 -- config/locales/simple_form.en-GB.yml | 2 -- config/locales/simple_form.en.yml | 4 +-- config/locales/simple_form.eo.yml | 2 -- config/locales/simple_form.es-AR.yml | 2 -- config/locales/simple_form.es-MX.yml | 2 -- config/locales/simple_form.es.yml | 2 -- config/locales/simple_form.et.yml | 2 -- config/locales/simple_form.eu.yml | 2 -- config/locales/simple_form.fa.yml | 2 -- config/locales/simple_form.fi.yml | 2 -- config/locales/simple_form.fo.yml | 2 -- config/locales/simple_form.fr-CA.yml | 2 -- config/locales/simple_form.fr.yml | 2 -- config/locales/simple_form.fy.yml | 2 -- config/locales/simple_form.ga.yml | 2 -- config/locales/simple_form.gd.yml | 2 -- config/locales/simple_form.gl.yml | 2 -- config/locales/simple_form.he.yml | 2 -- config/locales/simple_form.hu.yml | 2 -- config/locales/simple_form.ia.yml | 2 -- config/locales/simple_form.ie.yml | 2 -- config/locales/simple_form.io.yml | 2 -- config/locales/simple_form.is.yml | 2 -- config/locales/simple_form.it.yml | 2 -- config/locales/simple_form.ja.yml | 2 -- config/locales/simple_form.ko.yml | 2 -- config/locales/simple_form.lad.yml | 2 -- config/locales/simple_form.lt.yml | 2 -- config/locales/simple_form.lv.yml | 2 -- config/locales/simple_form.ms.yml | 2 -- config/locales/simple_form.my.yml | 2 -- config/locales/simple_form.nl.yml | 2 -- config/locales/simple_form.nn.yml | 2 -- config/locales/simple_form.no.yml | 2 -- config/locales/simple_form.pl.yml | 2 -- config/locales/simple_form.pt-BR.yml | 2 -- config/locales/simple_form.pt-PT.yml | 2 -- config/locales/simple_form.ro.yml | 1 - config/locales/simple_form.ru.yml | 2 -- config/locales/simple_form.si.yml | 2 -- config/locales/simple_form.sl.yml | 2 -- config/locales/simple_form.sq.yml | 2 -- config/locales/simple_form.sr-Latn.yml | 2 -- config/locales/simple_form.sr.yml | 2 -- config/locales/simple_form.sv.yml | 2 -- config/locales/simple_form.th.yml | 2 -- config/locales/simple_form.tr.yml | 2 -- config/locales/simple_form.uk.yml | 2 -- config/locales/simple_form.vi.yml | 2 -- config/locales/simple_form.zh-CN.yml | 2 -- config/locales/simple_form.zh-HK.yml | 2 -- config/locales/simple_form.zh-TW.yml | 2 -- config/settings.yml | 2 +- ...1023210145_migrate_landing_page_setting.rb | 19 ++++++++++ db/schema.rb | 2 +- spec/system/home_spec.rb | 36 +++++++++++++++++++ 72 files changed, 81 insertions(+), 135 deletions(-) create mode 100644 db/migrate/20251023210145_migrate_landing_page_setting.rb diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 04c7f33df..f53870a31 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -27,7 +27,7 @@ import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../act import { clearHeight } from '../../actions/height_cache'; import { fetchServer, fetchServerTranslationLanguages } from '../../actions/server'; import { expandHomeTimeline } from '../../actions/timelines'; -import { initialState, me, owner, singleUserMode, trendsEnabled, trendsAsLanding, disableHoverCards, autoPlayGif } from '../../initial_state'; +import { initialState, me, owner, singleUserMode, trendsEnabled, landingPage, localLiveFeedAccess, disableHoverCards, autoPlayGif } from '../../initial_state'; import BundleColumnError from './components/bundle_column_error'; import { NavigationBar } from './components/navigation_bar'; @@ -148,8 +148,10 @@ class SwitchingColumnsArea extends PureComponent { } } else if (singleUserMode && owner && initialState?.accounts[owner]) { redirect = ; - } else if (trendsEnabled && trendsAsLanding) { + } else if (trendsEnabled && landingPage === 'trends') { redirect = ; + } else if (localLiveFeedAccess === 'public' && landingPage === 'local_feed') { + redirect = ; } else { redirect = ; } diff --git a/app/javascript/mastodon/initial_state.ts b/app/javascript/mastodon/initial_state.ts index c1cd37753..83c6c35e1 100644 --- a/app/javascript/mastodon/initial_state.ts +++ b/app/javascript/mastodon/initial_state.ts @@ -39,7 +39,7 @@ interface InitialStateMeta { remote_topic_feed_access: 'public' | 'authenticated' | 'disabled'; title: string; show_trends: boolean; - trends_as_landing_page: boolean; + landing_page: 'about' | 'trends' | 'local_feed'; use_blurhash: boolean; use_pending_items?: boolean; version: string; @@ -120,7 +120,7 @@ export const remoteLiveFeedAccess = getMeta('remote_live_feed_access'); export const localTopicFeedAccess = getMeta('local_topic_feed_access'); export const remoteTopicFeedAccess = getMeta('remote_topic_feed_access'); export const title = getMeta('title'); -export const trendsAsLanding = getMeta('trends_as_landing_page'); +export const landingPage = getMeta('landing_page'); export const useBlurhash = getMeta('use_blurhash'); export const usePendingItems = getMeta('use_pending_items'); export const version = getMeta('version'); diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 8b3c09a35..926995f02 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 ).freeze INTEGER_KEYS = %i( @@ -61,7 +61,6 @@ class Form::AdminSettings preview_sensitive_media profile_directory trends - trends_as_landing_page trendable_by_default noindex require_invite_text @@ -88,6 +87,7 @@ class Form::AdminSettings DOMAIN_BLOCK_AUDIENCES = %w(disabled users all).freeze REGISTRATION_MODES = %w(open approved none).freeze FEED_ACCESS_MODES = %w(public authenticated disabled).freeze + LANDING_PAGE = %w(trends about local_feed).freeze attr_accessor(*KEYS) @@ -106,6 +106,7 @@ class Form::AdminSettings validates :site_short_description, length: { maximum: DESCRIPTION_LIMIT }, if: -> { defined?(@site_short_description) } validates :status_page_url, url: true, allow_blank: true validate :validate_site_uploads + validates :landing_page, inclusion: { in: LANDING_PAGE }, if: -> { defined?(@landing_page) } KEYS.each do |key| define_method(key) do diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 79fcfcf79..d562d9068 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -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/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..1272419c3 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, diff --git a/config/locales/en.yml b/config/locales/en.yml index 15c3c582b..b647c5ddf 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -855,6 +855,11 @@ en: 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. 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 ce2000188..e2d90ad1b 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -110,7 +110,6 @@ be: thumbnail: Выява памерамі прыкладна 2:1, якая паказваецца побач з інфармацыяй пра ваш сервер. trendable_by_default: Прапусціць ручны агляд трэндавага змесціва. Асобныя элементы ўсё яшчэ можна будзе выдаліць з трэндаў пастфактум. trends: Трэнды паказваюць, якія допісы, хэштэгі і навіны набываюць папулярнасць на вашым серверы. - trends_as_landing_page: Паказваць папулярнае змесціва карыстальнікам, якія выйшлі з сістэмы, і наведвальнікам, замест апісання гэтага сервера. Патрабуецца ўключэнне трэндаў. form_challenge: current_password: Вы ўваходзіце ў бяспечную зону imports: @@ -313,7 +312,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..281124a6b 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: @@ -296,7 +295,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 5b6459d9f..d8b803fe1 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -110,7 +110,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: @@ -313,7 +312,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 f24631d72..0f79229ca 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -110,7 +110,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: @@ -315,7 +314,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 d29dfc241..a4b4a13c0 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -110,7 +110,6 @@ da: 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, hashtags 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. form_challenge: current_password: Du bevæger dig ind på et sikkert område imports: @@ -311,7 +310,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..74b6e5d9e 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -107,7 +107,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: @@ -305,7 +304,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..acfa81ae3 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -110,7 +110,6 @@ el: thumbnail: Μια εικόνα περίπου 2:1 που εμφανίζεται παράλληλα με τις πληροφορίες του διακομιστή σου. trendable_by_default: Παράλειψη χειροκίνητης αξιολόγησης του περιεχομένου σε τάση. Μεμονωμένα στοιχεία μπορούν ακόμα να αφαιρεθούν από τις τάσεις μετέπειτα. trends: Τάσεις δείχνουν ποιες δημοσιεύσεις, ετικέτες και ειδήσεις προκαλούν έλξη στο διακομιστή σας. - trends_as_landing_page: Εμφάνιση περιεχομένου σε τάση σε αποσυνδεδεμένους χρήστες και επισκέπτες αντί για μια περιγραφή αυτού του διακομιστή. Απαιτεί οι τάσεις να έχουν ενεργοποιηθεί. form_challenge: current_password: Μπαίνεις σε ασφαλή περιοχή imports: @@ -311,7 +310,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..1fe68d5fb 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -110,7 +110,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: @@ -311,7 +310,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..1cbd2f405 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -110,7 +110,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: @@ -311,7 +310,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..99aaf6427 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -110,7 +110,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: @@ -311,7 +310,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..a7c318f04 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -107,7 +107,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: @@ -307,7 +306,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..d244cb528 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -105,7 +105,6 @@ fa: thumbnail: یک تصویر تقریباً 2:1 در کنار اطلاعات سرور شما نمایش داده می شود. trendable_by_default: از بررسی دستی محتوای پرطرفدار صرف نظر کنید. آیتم های فردی هنوز هم می توانند پس از واقعیت از روند حذف شوند. trends: روندها نشان می‌دهند که کدام پست‌ها، هشتگ‌ها و داستان‌های خبری در سرور شما مورد توجه قرار گرفته‌اند. - trends_as_landing_page: به جای توضیح این سرور، محتوای پرطرفدار را به کاربران و بازدیدکنندگان از سیستم خارج شده نشان دهید. نیاز به فعال شدن روندها دارد. form_challenge: current_password: شما در حال ورود به یک منطقهٔ‌ حفاظت‌شده هستید imports: @@ -297,7 +296,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..4a1cb3998 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -110,7 +110,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: @@ -310,7 +309,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..0f5424e41 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -110,7 +110,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: @@ -311,7 +310,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 0798eebfa..b0dae1712 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -104,7 +104,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: @@ -288,7 +287,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 diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 117523e38..270a259de 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -104,7 +104,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: @@ -288,7 +287,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 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..203e12b4f 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -110,7 +110,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: @@ -314,7 +313,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 1c929332d..bc4c3b7f0 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -110,7 +110,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: @@ -313,7 +312,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..cb088c9b8 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -110,7 +110,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: @@ -311,7 +310,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..9de34b6c8 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -110,7 +110,6 @@ he: thumbnail: תמונה ביחס 2:1 בערך שתוצג ליד המידע על השרת שלך. trendable_by_default: לדלג על בדיקה ידנית של התכנים החמים. פריטים ספציפיים עדיין ניתנים להסרה לאחר מעשה. trends: נושאים חמים יציגו אילו הודעות, תגיות וידיעות חדשות צוברות חשיפה על השרת שלך. - trends_as_landing_page: הצג למבקרים ולמשתמשים שאינם מחוברים את הנושאים החמים במקום את תיאור השרת. מחייב הפעלה של אפשרות הנושאים החמים. form_challenge: current_password: את.ה נכנס. ת לאזור מאובטח imports: @@ -313,7 +312,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..0e41641d6 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -110,7 +110,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: @@ -311,7 +310,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..45fedf9da 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -110,7 +110,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: @@ -311,7 +310,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..6b8ee6a11 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -110,7 +110,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: @@ -311,7 +310,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..bc06874e3 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -110,7 +110,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: @@ -311,7 +310,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..db43b701b 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: @@ -290,7 +289,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.ko.yml b/config/locales/simple_form.ko.yml index 9ab33619a..a1a9d8954 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -105,7 +105,6 @@ ko: thumbnail: 대략 2:1 비율의 이미지가 서버 정보 옆에 표시됩니다. trendable_by_default: 유행하는 콘텐츠에 대한 수동 승인을 건너뜁니다. 이 설정이 적용된 이후에도 각각의 항목들을 삭제할 수 있습니다. trends: 트렌드는 어떤 게시물, 해시태그 그리고 뉴스 기사가 이 서버에서 인기를 끌고 있는지 보여줍니다. - trends_as_landing_page: 로그아웃한 사용자와 방문자에게 서버 설명 대신 유행하는 내용을 보여줍니다. 유행 기능을 활성화해야 합니다. form_challenge: current_password: 당신은 보안 구역에 진입하고 있습니다 imports: @@ -296,7 +295,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..de3063a17 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: @@ -262,7 +261,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 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..3289cadb9 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -110,7 +110,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: @@ -311,7 +310,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..f6916c354 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -110,7 +110,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: @@ -311,7 +310,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 c871be44d..5cc3c85ce 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -110,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: @@ -313,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..4aa2d15d3 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -105,7 +105,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: @@ -298,7 +297,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 307f0e9ad..07b801055 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -110,7 +110,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: @@ -311,7 +310,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 diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index f242a9018..fe86121f2 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -100,7 +100,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 e9bde9c3b..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: @@ -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..23f848142 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -109,7 +109,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: @@ -310,7 +309,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..05367bdf9 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -110,7 +110,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: @@ -311,7 +310,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..eb2610bdb 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -110,7 +110,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: @@ -310,7 +309,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..a205039f2 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -110,7 +110,6 @@ zh-CN: thumbnail: 与服务器信息一并展示的约 2:1 比例的图像。 trendable_by_default: 跳过对热门内容的手工审核。个别项目仍可在之后从趋势中删除。 trends: 热门页中会显示正在你服务器上受到关注的嘟文、标签和新闻故事。 - trends_as_landing_page: 向注销的用户和访问者显示热门内容,而不是对该服务器的描述,需要启用热门。 form_challenge: current_password: 你正在进入安全区域 imports: @@ -310,7 +309,6 @@ zh-CN: thumbnail: 本站缩略图 trendable_by_default: 允许在未审核的情况下将话题置为热门 trends: 启用热门 - trends_as_landing_page: 使用热门页作为登陆页面 interactions: must_be_follower: 屏蔽来自未关注我的用户的通知 must_be_following: 屏蔽来自我未关注的用户的通知 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..4704199c5 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -110,7 +110,6 @@ zh-TW: thumbnail: 大約 2:1 圖片會顯示於您伺服器資訊之旁。 trendable_by_default: 跳過手動審核熱門內容。仍能於登上熱門趨勢後移除個別內容。 trends: 熱門趨勢將顯示於您伺服器上正在吸引大量注意力的嘟文、主題標籤、或者新聞。 - trends_as_landing_page: 顯示熱門趨勢內容至未登入使用者及訪客而不是關於此伺服器之描述。需要啟用熱門趨勢。 form_challenge: current_password: 您正要進入安全區域 imports: @@ -310,7 +309,6 @@ zh-TW: thumbnail: 伺服器縮圖 trendable_by_default: 允許熱門趨勢直接顯示,不需經過審核 trends: 啟用熱門趨勢 - trends_as_landing_page: 以熱門趨勢作為登陸頁面 interactions: must_be_follower: 封鎖非跟隨者的通知 must_be_following: 封鎖您未跟隨之使用者的通知 diff --git a/config/settings.yml b/config/settings.yml index c6478e57d..3d4b57b5c 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_referrer_origin: false + landing_page: 'trends' development: <<: *defaults 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..0067e1718 --- /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/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 From 1230d05b18e339b20a1821164c7d0053c7e6f2e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 11:21:08 +0100 Subject: [PATCH 23/90] Update dependency rubyzip to v3.2.1 (#36598) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9b4ad8534..fd5efbf88 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -790,7 +790,7 @@ GEM ruby-vips (2.2.5) ffi (~> 1.12) logger - rubyzip (3.2.0) + rubyzip (3.2.1) rufus-scheduler (3.9.2) fugit (~> 1.1, >= 1.11.1) safety_net_attestation (0.5.0) From ab5b7e3776ebdbb84fd64c286b3dca8f88a974a7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 11:21:12 +0100 Subject: [PATCH 24/90] Update dependency webauthn to v3.4.3 (#36599) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index fd5efbf88..8d0a69e05 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -498,7 +498,7 @@ 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) @@ -898,7 +898,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) From 38f15a89fe2e09cc7eb6011d687c8ee4b179130b Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 27 Oct 2025 13:24:24 +0100 Subject: [PATCH 25/90] Fix recent settings migrations (#36602) --- ...02140103_migrate_timeline_preview_setting.rb | 3 +-- ...251023210145_migrate_landing_page_setting.rb | 6 +++--- lib/tasks/tests.rake | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) 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 index 0067e1718..e8448bc75 100644 --- a/db/migrate/20251023210145_migrate_landing_page_setting.rb +++ b/db/migrate/20251023210145_migrate_landing_page_setting.rb @@ -9,10 +9,10 @@ class MigrateLandingPageSetting < ActiveRecord::Migration[8.0] value = YAML.safe_load(setting.attributes['value'], permitted_classes: [ActiveSupport::HashWithIndifferentAccess, Symbol]) - Setting.upsert( + Setting.upsert({ var: 'landing_page', - value: value ? "--- trends\n" : "--- about\n" - ) + value: value ? "--- trends\n" : "--- about\n", + }) end def down; end 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` From b60bae636143253c492161266cd05255dc225eec Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 27 Oct 2025 09:28:56 -0400 Subject: [PATCH 26/90] Handle unreachable network error for search services (#36587) --- app/services/account_search_service.rb | 2 +- app/services/statuses_search_service.rb | 2 +- app/services/tag_search_service.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 6f70d530b..f56ebaf74 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -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/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 From bfcf21e9154de3fcfc1d9de3f4458fbf0c1caa5c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 27 Oct 2025 15:22:54 +0100 Subject: [PATCH 27/90] Fix vacuums being interrupted by a single batch failure (#36606) --- app/lib/vacuum/media_attachments_vacuum.rb | 4 ++++ app/lib/vacuum/preview_cards_vacuum.rb | 2 ++ 2 files changed, 6 insertions(+) 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 From e8382c7332fa60e571b453fbd6a9534f1a4ff0b2 Mon Sep 17 00:00:00 2001 From: "M.J. Fieggen (Joni)" Date: Mon, 27 Oct 2025 16:19:38 +0100 Subject: [PATCH 28/90] Fix layout of severed relationships when purged events are listed (#36593) --- app/views/severed_relationships/_event.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From 1dead10312caa0cc7719cb80052af549ddf3e6a1 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 27 Oct 2025 16:52:21 +0100 Subject: [PATCH 29/90] Change min. characters required for logged-out account search from 5 to 3 (#36487) --- app/services/account_search_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index f56ebaf74..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 = {}) From dc851c9efcfbe9c7686148caed6ed9f469f94029 Mon Sep 17 00:00:00 2001 From: marousta <61333854+marousta@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:56:06 +0100 Subject: [PATCH 30/90] Fix custom emoji width (#27969) --- app/javascript/styles/mastodon/components.scss | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 1b851803c..d403a33e1 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1101,8 +1101,7 @@ font-size: inherit; vertical-align: middle; object-fit: contain; - margin: -0.2ex 0.15em 0.2ex; - width: 16px; + margin: -0.2ex 0.15em 0; height: 16px; img { @@ -1144,7 +1143,6 @@ } .emojione { - width: 20px; height: 20px; margin: -3px 0 0; } @@ -1367,7 +1365,6 @@ overflow-y: auto; .emojione { - width: 20px; height: 20px; margin: -3px 0 0; } @@ -1794,7 +1791,6 @@ line-height: 24px; .emojione { - width: 24px; height: 24px; margin: -1px 0 0; } @@ -7089,7 +7085,6 @@ a.status-card { line-height: 24px; .emojione { - width: 24px; height: 24px; margin: -1px 0 0; } @@ -8421,7 +8416,6 @@ noscript { margin-bottom: 16px; .emojione { - width: 22px; height: 22px; } From 402686c76ca7ce191f2a0c6542c39767ad82249f Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Mon, 27 Oct 2025 17:06:44 +0100 Subject: [PATCH 31/90] Remove `http_message_signatures` feature flag (#36610) --- app/javascript/mastodon/utils/environment.ts | 2 +- app/lib/signed_request.rb | 2 +- spec/requests/signature_verification_spec.rb | 29 +------------------- 3 files changed, 3 insertions(+), 30 deletions(-) diff --git a/app/javascript/mastodon/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts index c2b6b1cf8..aa125b092 100644 --- a/app/javascript/mastodon/utils/environment.ts +++ b/app/javascript/mastodon/utils/environment.ts @@ -12,7 +12,7 @@ export function isProduction() { else return import.meta.env.PROD; } -export type Features = 'modern_emojis' | 'fasp' | 'http_message_signatures'; +export type Features = 'modern_emojis' | 'fasp'; export function isFeatureEnabled(feature: Features) { return initialState?.features.includes(feature) ?? false; 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/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) } From 76053fb4a9f6ec5a528fbf9232cb3e55a2cc5cc7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 27 Oct 2025 18:18:01 +0100 Subject: [PATCH 32/90] Fix hashtags not being picked up when full-width hash sign is used (#36103) Co-authored-by: Claire --- app/javascript/mastodon/actions/compose.js | 11 ++++++----- .../mastodon/components/autosuggest_input.jsx | 2 +- .../mastodon/components/autosuggest_textarea.jsx | 2 +- app/lib/extractor.rb | 2 +- app/models/tag.rb | 2 +- spec/lib/extractor_spec.rb | 14 +++++++++++++- spec/models/tag_spec.rb | 4 ++++ 7 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index ccb69f0a3..d6de589e9 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -622,6 +622,7 @@ export function fetchComposeSuggestions(token) { fetchComposeSuggestionsEmojis(dispatch, getState, token); break; case '#': + case '#': fetchComposeSuggestionsTags(dispatch, getState, token); break; default: @@ -663,11 +664,11 @@ export function selectComposeSuggestion(position, token, suggestion, path) { dispatch(useEmoji(suggestion)); } else if (suggestion.type === 'hashtag') { - completion = `#${suggestion.name}`; - startPosition = position - 1; + completion = suggestion.name.slice(token.length - 1); + startPosition = position + token.length; } else if (suggestion.type === 'account') { - completion = getState().getIn(['accounts', suggestion.id, 'acct']); - startPosition = position; + completion = `@${getState().getIn(['accounts', suggestion.id, 'acct'])}`; + startPosition = position - 1; } // We don't want to replace hashtags that vary only in case due to accessibility, but we need to fire off an event so that @@ -727,7 +728,7 @@ function insertIntoTagHistory(recognizedTags, text) { // complicated because of new normalization rules, it's no longer just // a case sensitivity issue const names = recognizedTags.map(tag => { - const matches = text.match(new RegExp(`#${tag.name}`, 'i')); + const matches = text.match(new RegExp(`[##]${tag.name}`, 'i')); if (matches && matches.length > 0) { return matches[0].slice(1); 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/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/models/tag.rb b/app/models/tag.rb index dff101111..1514a4400 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{(? Date: Mon, 27 Oct 2025 18:36:01 +0100 Subject: [PATCH 33/90] Emoji: Fix Web Worker import (#36603) --- app/javascript/mastodon/features/emoji/index.ts | 7 +++---- app/javascript/mastodon/polyfills/index.ts | 12 +++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/features/emoji/index.ts b/app/javascript/mastodon/features/emoji/index.ts index 3701ad676..11ee26aac 100644 --- a/app/javascript/mastodon/features/emoji/index.ts +++ b/app/javascript/mastodon/features/emoji/index.ts @@ -1,8 +1,9 @@ import { initialState } from '@/mastodon/initial_state'; -import { loadWorker } from '@/mastodon/utils/workers'; import { toSupportedLocale } from './locale'; import { emojiLogger } from './utils'; +// eslint-disable-next-line import/default -- Importing via worker loader. +import EmojiWorker from './worker?worker&inline'; const userLocale = toSupportedLocale(initialState?.meta.locale ?? 'en'); @@ -16,9 +17,7 @@ export function initializeEmoji() { log('initializing emojis'); if (!worker && 'Worker' in window) { try { - worker = loadWorker(new URL('./worker', import.meta.url), { - type: 'module', - }); + worker = new EmojiWorker(); } catch (err) { console.warn('Error creating web worker:', err); } 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; From 3bf99b8a4a5211c35cac421c2f513068661ee250 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 27 Oct 2025 19:19:52 +0100 Subject: [PATCH 34/90] Fix URL comparison for mentions in case of empty path (#36613) --- .../mastodon/components/status_content.jsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index a6ce8050c..cef2be628 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -72,6 +72,17 @@ const mapStateToProps = state => ({ 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.path === url2.path && url1.search === url2.search; + } catch { + return false; + } +}; + class StatusContent extends PureComponent { static propTypes = { identity: identityContextPropShape, @@ -127,7 +138,7 @@ class StatusContent extends PureComponent { link.classList.add('status-link'); - mention = this.props.status.get('mentions').find(item => link.href === item.get('url')); + mention = this.props.status.get('mentions').find(item => compareUrls(link, item.get('url'))); if (mention) { link.addEventListener('click', this.onMentionClick.bind(this, mention), false); @@ -206,7 +217,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 ( Date: Tue, 28 Oct 2025 09:05:23 +0100 Subject: [PATCH 35/90] Change API behavior of reblogs wrt. quotes for consistency (#36559) --- app/controllers/api/v1/statuses_controller.rb | 2 +- app/lib/status_cache_hydrator.rb | 1 + app/serializers/rest/status_serializer.rb | 6 ++--- spec/requests/api/v1/statuses_spec.rb | 23 +++++++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) 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/lib/status_cache_hydrator.rb b/app/lib/status_cache_hydrator.rb index 5ba706c4c..b6a5e3705 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 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/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb index 249abc244..ed41e5420 100644 --- a/spec/requests/api/v1/statuses_spec.rb +++ b/spec/requests/api/v1/statuses_spec.rb @@ -248,6 +248,29 @@ RSpec.describe '/api/v1/statuses' do 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 + + 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.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 + end + context 'with a self-quote post and a CW but no text' do let(:quoted_status) { Fabricate(:status, account: user.account) } let(:params) do From 5d00ae7eb3c6aca4e2707926a07dc4084d8c3dd7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 09:29:36 +0100 Subject: [PATCH 36/90] New Crowdin Translations (automated) (#36617) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/bg.json | 49 +++++++++++++++++++++- app/javascript/mastodon/locales/et.json | 1 + app/javascript/mastodon/locales/fo.json | 1 + app/javascript/mastodon/locales/ga.json | 1 + app/javascript/mastodon/locales/ia.json | 11 ++--- app/javascript/mastodon/locales/lad.json | 25 +++++++++++ app/javascript/mastodon/locales/pt-BR.json | 42 ++++++++++++++++++- app/javascript/mastodon/locales/pt-PT.json | 1 + config/locales/be.yml | 7 +++- config/locales/bg.yml | 39 +++++++++++++++++ config/locales/cs.yml | 7 +++- config/locales/da.yml | 5 +++ config/locales/de.yml | 3 ++ config/locales/devise.bg.yml | 1 + config/locales/devise.pt-BR.yml | 1 + config/locales/el.yml | 5 +++ config/locales/es-AR.yml | 5 +++ config/locales/es-MX.yml | 5 +++ config/locales/es.yml | 5 +++ config/locales/et.yml | 5 +++ config/locales/fo.yml | 5 +++ config/locales/ga.yml | 5 +++ config/locales/he.yml | 5 +++ config/locales/ia.yml | 11 ++++- config/locales/is.yml | 5 +++ config/locales/lad.yml | 22 ++++++++++ config/locales/nl.yml | 5 +++ config/locales/pt-BR.yml | 31 ++++++++++++++ config/locales/pt-PT.yml | 8 ++++ config/locales/simple_form.be.yml | 2 + config/locales/simple_form.bg.yml | 1 + config/locales/simple_form.cs.yml | 4 +- config/locales/simple_form.da.yml | 2 + config/locales/simple_form.el.yml | 2 + config/locales/simple_form.es-AR.yml | 2 + config/locales/simple_form.es-MX.yml | 2 + config/locales/simple_form.es.yml | 2 + config/locales/simple_form.fo.yml | 2 + config/locales/simple_form.ga.yml | 2 + config/locales/simple_form.he.yml | 2 + config/locales/simple_form.ia.yml | 2 + config/locales/simple_form.is.yml | 1 + config/locales/simple_form.lad.yml | 3 ++ config/locales/simple_form.nl.yml | 2 + config/locales/simple_form.pt-BR.yml | 11 ++++- config/locales/simple_form.pt-PT.yml | 2 + config/locales/simple_form.sq.yml | 2 + config/locales/simple_form.tr.yml | 2 + config/locales/simple_form.vi.yml | 2 + config/locales/simple_form.zh-CN.yml | 2 + config/locales/simple_form.zh-TW.yml | 2 + config/locales/sq.yml | 5 +++ config/locales/tr.yml | 8 ++++ config/locales/vi.yml | 5 +++ config/locales/zh-CN.yml | 5 +++ config/locales/zh-TW.yml | 5 +++ 56 files changed, 386 insertions(+), 12 deletions(-) diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 602563988..c7e102aac 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.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, one {един друг, когото познавате} other {# други, които познавате}}", @@ -40,6 +41,9 @@ "account.featured_tags.last_status_never": "Няма публикации", "account.follow": "Последване", "account.follow_back": "Последване взаимно", + "account.follow_request_cancel": "Отказване на заявката", + "account.follow_request_cancel_short": "Отказ", + "account.follow_request_short": "Заявка", "account.followers": "Последователи", "account.followers.empty": "Още никой не следва потребителя.", "account.followers_counter": "{count, plural, one {{counter} последовател} other {{counter} последователи}}", @@ -238,6 +242,9 @@ "confirmations.missing_alt_text.secondary": "Все пак да се публикува", "confirmations.missing_alt_text.title": "Добавяте ли алтернативен текст?", "confirmations.mute.confirm": "Заглушаване", + "confirmations.quiet_post_quote_info.dismiss": "Без друго напомняне", + "confirmations.quiet_post_quote_info.got_it": "Схванах", + "confirmations.quiet_post_quote_info.title": "Цитиране на публикации за тиха публика", "confirmations.redraft.confirm": "Изтриване и преработване", "confirmations.redraft.message": "Наистина ли искате да изтриете тази публикация и да я направите чернова? Означаванията като любими и подсилванията ще се изгубят, а и отговорите към първоначалната публикация ще осиротеят.", "confirmations.redraft.title": "Изтривате и преработвате ли публикацията?", @@ -247,7 +254,11 @@ "confirmations.revoke_quote.confirm": "Премахване на публикация", "confirmations.revoke_quote.message": "Действието е неотменимо.", "confirmations.revoke_quote.title": "Премахвате ли публикацията?", + "confirmations.unblock.confirm": "Отблокиране", + "confirmations.unblock.title": "Отблокирате ли @{name}?", "confirmations.unfollow.confirm": "Без следване", + "confirmations.unfollow.title": "Спирате ли следване на {name}?", + "confirmations.withdraw_request.confirm": "Оттегляне на заявката", "content_warning.hide": "Скриване на публ.", "content_warning.show": "Нека се покаже", "content_warning.show_more": "Показване на още", @@ -442,10 +453,12 @@ "ignore_notifications_modal.private_mentions_title": "Пренебрегвате ли известия от непоискани лични споменавания?", "info_button.label": "Помощ", "info_button.what_is_alt_text": "

Какво е алтернативен текст?

Алтернативният текст осигурява описания на изображение за хора със зрителни увреждания, връзки с ниска честотна лента или търсещите допълнителен контекст.

Може да подобрите достъпността и разбираемостта за всеки, пишейки ясен, кратък и обективен алтернативен текст.

  • Уловете важните елементи
  • Обобщете текста в образите
  • Употребявайте правилна структура на изречението
  • Избягвайте излишна информация
  • Съсредоточете се върху тенденциите и ключови констатации в сложни онагледявания (като диаграми и карти)
", + "interaction_modal.action": "Трябва да влезете с акаунта си, в който и да е сървър на Mastodon, когото използвате, за да взаимодействате с публикация на {name}.", "interaction_modal.go": "Напред", "interaction_modal.no_account_yet": "Още ли нямате акаунт?", "interaction_modal.on_another_server": "На различен сървър", "interaction_modal.on_this_server": "На този сървър", + "interaction_modal.title": "Влезте, за да продължите", "interaction_modal.username_prompt": "Напр. {example}", "intervals.full.days": "{number, plural, one {# ден} other {# дни}}", "intervals.full.hours": "{number, plural, one {# час} other {# часа}}", @@ -596,6 +609,7 @@ "notification.moderation_warning.action_suspend": "Вашият акаунт е спрян.", "notification.own_poll": "Анкетата ви приключи", "notification.poll": "Анкета, в която гласувахте, приключи", + "notification.quoted_update": "{name} редактира публикация, която цитирахте", "notification.reblog": "{name} подсили ваша публикация", "notification.reblog.name_and_others_with_link": "{name} и {count, plural, one {# друг} other {# други}} подсилиха ваша публикация", "notification.relationships_severance_event": "Изгуби се връзката с {name}", @@ -715,10 +729,17 @@ "privacy.private.short": "Последователи", "privacy.public.long": "Всеки във и извън Mastodon", "privacy.public.short": "Публично", + "privacy.quote.anyone": "{visibility}, всеки може да цитира", + "privacy.quote.disabled": "{visibility}, цитатите са изключени", + "privacy.quote.limited": "{visibility}, цитатите са ограничени", "privacy.unlisted.additional": "Това действие е точно като публичното, с изключение на това, че публикацията няма да се появява в каналите на живо, хаштаговете, разглеждането или търсенето в Mastodon, дори ако сте избрали да се публично видими на ниво акаунт.", "privacy.unlisted.short": "Тиха публика", "privacy_policy.last_updated": "Последно осъвременяване на {date}", "privacy_policy.title": "Политика за поверителност", + "quote_error.edit": "Не може да се добавят цитати, редайтирайки публикация.", + "quote_error.poll": "Не може да се цитира при анкетиране.", + "quote_error.unauthorized": "Нямате право да цитирате тази публикация.", + "quote_error.upload": "Цитирането не е позволено с мултимедийни прикачвания.", "recommended": "Препоръчано", "refresh": "Опресняване", "regeneration_indicator.please_stand_by": "Изчакайте.", @@ -734,6 +755,8 @@ "relative_time.minutes": "{number}м.", "relative_time.seconds": "{number}с.", "relative_time.today": "днес", + "remove_quote_hint.button_label": "Схванах", + "remove_quote_hint.message": "Може да го направите от менюто възможности {icon}.", "reply_indicator.attachments": "{count, plural, one {# прикаване} other {# прикачвания}}", "reply_indicator.cancel": "Отказ", "reply_indicator.poll": "Анкета", @@ -825,13 +848,22 @@ "status.admin_account": "Отваряне на интерфейс за модериране за @{name}", "status.admin_domain": "Отваряне на модериращия интерфейс за {domain}", "status.admin_status": "Отваряне на публикацията в модериращия интерфейс", + "status.all_disabled": "Подсилването и цитатите са изключени", "status.block": "Блокиране на @{name}", "status.bookmark": "Отмятане", "status.cancel_reblog_private": "Край на подсилването", + "status.cannot_quote": "Не е позволено да цитирате тази публикация", "status.cannot_reblog": "Публикацията не може да се подсилва", + "status.context.loading": "Зареждане на още отговори", + "status.context.loading_error": "Не можаха да се заредят нови отговори", + "status.context.loading_success": "Новите отговори заредени", + "status.context.more_replies_found": "Още намерени отговори", + "status.context.retry": "Друг опит", + "status.context.show": "Показване", "status.continued_thread": "Продължена нишка", "status.copy": "Копиране на връзката към публикация", "status.delete": "Изтриване", + "status.delete.success": "Публикацията е изтрита", "status.detailed_status": "Подробен изглед на разговора", "status.direct": "Частно споменаване на @{name}", "status.direct_indicator": "Частно споменаване", @@ -855,23 +887,32 @@ "status.open": "Разширяване на публикацията", "status.pin": "Закачане в профила", "status.quote_error.filtered": "Скрито поради един от филтрите ви", + "status.quote_error.limited_account_hint.title": "Този акаунт е бил скрит от модераторите на {domain}.", "status.quote_error.not_available": "Неналична публикация", "status.quote_error.pending_approval": "Публикацията чака одобрение", + "status.quote_error.revoked": "Премахната публикация от автора", + "status.quote_followers_only": "Само последователи могат да цитират тази публикация", + "status.quote_manual_review": "Авторът ще преглежда ръчно", "status.quote_policy_change": "Промяна кой може да цитира", "status.quote_post_author": "Цитирах публикация от @{name}", + "status.quote_private": "Частните публикации не може да се цитират", "status.read_more": "Още за четене", "status.reblog": "Подсилване", + "status.reblog_or_quote": "Подсилване или цитиране", + "status.reblog_private": "Споделете пак с последователите си", "status.reblogged_by": "{name} подсили", "status.reblogs": "{count, plural, one {подсилване} other {подсилвания}}", "status.reblogs.empty": "Още никого не е подсилвал публикацията. Подсилващият ще се покаже тук.", "status.redraft": "Изтриване и преработване", "status.remove_bookmark": "Премахване на отметката", "status.remove_favourite": "Премахване от любими", + "status.remove_quote": "Премахване", "status.replied_in_thread": "Отговорено в нишката", "status.replied_to": "В отговор до {name}", "status.reply": "Отговор", "status.replyAll": "Отговор на нишка", "status.report": "Докладване на @{name}", + "status.request_quote": "Заявка за цитиране", "status.revoke_quote": "Премахване на моя публикация от публикацията на @{name}", "status.sensitive_warning": "Деликатно съдържание", "status.share": "Споделяне", @@ -910,6 +951,7 @@ "upload_button.label": "Добавете файл с образ, видео или звук", "upload_error.limit": "Превишено ограничението за качване на файлове.", "upload_error.poll": "Качването на файлове не е позволено с анкети.", + "upload_error.quote": "Цитирайки, не може да качвате файл.", "upload_form.drag_and_drop.instructions": "Натиснете интервал или enter, за да подберете мултимедийно прикачване. Провлачвайки, ползвайте клавишите със стрелки, за да премествате мултимедията във всяка дадена посока. Натиснете пак интервал или enter, за да се стовари мултимедийното прикачване в новото си положение или натиснете Esc за отмяна.", "upload_form.drag_and_drop.on_drag_cancel": "Провлачването е отменено. Мултимедийното прикачване {item} е спуснато.", "upload_form.drag_and_drop.on_drag_end": "Мултимедийното прикачване {item} е спуснато.", @@ -935,6 +977,11 @@ "video.volume_up": "Увеличаване на звука", "visibility_modal.button_title": "Задаване на видимост", "visibility_modal.header": "Видимост и взаимодействие", + "visibility_modal.helper.privacy_editing": "Видимостта не може да се променя след публикуване на публикацията.", + "visibility_modal.privacy_label": "Видимост", "visibility_modal.quote_followers": "Само последователи", - "visibility_modal.quote_public": "Някой" + "visibility_modal.quote_label": "Кой може да цитира", + "visibility_modal.quote_nobody": "Само аз", + "visibility_modal.quote_public": "Някой", + "visibility_modal.save": "Запазване" } diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index ff190a6ed..f777e4794 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Järjehoidjatesse pole veel lisatud postitusi. Kui lisad mõne, näed neid siin.", "empty_column.community": "Kohalik ajajoon on tühi. Kirjuta midagi avalikult, et pall veerema ajada!", "empty_column.direct": "Sul pole veel ühtegi privaatset mainimist. Kui saadad või saad mõne, ilmuvad need siin.", + "empty_column.disabled_feed": "See infovoog on serveri peakasutajate poolt välja lülitatud.", "empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.", "empty_column.explore_statuses": "Praegu pole ühtegi trendi. Tule hiljem tagasi!", "empty_column.favourited_statuses": "Pole veel lemmikpostitusi. Kui märgid mõne, näed neid siin.", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index e8357bba4..3a407e7cb 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Tú hevur enn einki goymt uppslag. Tú tú goymir eitt uppslag, kemur tað her.", "empty_column.community": "Lokala tíðarlinjan er tóm. Skriva okkurt alment fyri at fáa boltin á rull!", "empty_column.direct": "Tú hevur ongar privatar umrøður enn. Tá tú sendir ella móttekur eina privata umrøðu, so verður hon sjónlig her.", + "empty_column.disabled_feed": "Hendan rásin er gjørd óvirkin av ambætaraumsitarunum hjá tær.", "empty_column.domain_blocks": "Enn eru eingi blokeraði domenir.", "empty_column.explore_statuses": "Einki rák er beint nú. Royn aftur seinni!", "empty_column.favourited_statuses": "Tú hevur ongar yndispostar enn. Tá tú gevur einum posti yndismerki, so sært tú hann her.", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 5d757f30d..0bf6beecd 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Níl aon phostáil leabharmharcaithe agat fós. Nuair a dhéanann tú leabharmharc, beidh sé le feiceáil anseo.", "empty_column.community": "Tá an amlíne áitiúil folamh. Foilsigh rud éigin go poiblí le tús a chur le cúrsaí!", "empty_column.direct": "Níl aon tagairtí príobháideacha agat fós. Nuair a sheolann tú nó a gheobhaidh tú ceann, beidh sé le feiceáil anseo.", + "empty_column.disabled_feed": "Tá an fotha seo díchumasaithe ag riarthóirí do fhreastalaí.", "empty_column.domain_blocks": "Níl aon fearainn bhactha ann go fóill.", "empty_column.explore_statuses": "Níl rud ar bith ag treochtáil faoi láthair. Tar ar ais ar ball!", "empty_column.favourited_statuses": "Níl aon postálacha is fearr leat fós. Nuair is fearr leat ceann, beidh sé le feiceáil anseo.", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index cd735bbe9..1b5aaa39b 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -172,7 +172,7 @@ "column.domain_blocks": "Dominios blocate", "column.edit_list": "Modificar lista", "column.favourites": "Favorites", - "column.firehose": "Fluxos in directo", + "column.firehose": "Fluxos in vivo", "column.follow_requests": "Requestas de sequimento", "column.home": "Initio", "column.list_members": "Gerer le membros del lista", @@ -333,6 +333,7 @@ "empty_column.bookmarked_statuses": "Tu non ha ancora messages in marcapaginas. Quando tu adde un message al marcapaginas, illo apparera hic.", "empty_column.community": "Le chronologia local es vacue. Scribe qualcosa public pro poner le cosas in marcha!", "empty_column.direct": "Tu non ha ancora mentiones private. Quando tu invia o recipe un mention, illo apparera hic.", + "empty_column.disabled_feed": "Iste canal ha essite disactivate per le adminsistratores de tu servitor.", "empty_column.domain_blocks": "Il non ha dominios blocate ancora.", "empty_column.explore_statuses": "Il non ha tendentias in iste momento. Reveni plus tarde!", "empty_column.favourited_statuses": "Tu non ha alcun message favorite ancora. Quando tu marca un message como favorite, illo apparera hic.", @@ -460,7 +461,7 @@ "ignore_notifications_modal.not_following_title": "Ignorar notificationes de personas que tu non seque?", "ignore_notifications_modal.private_mentions_title": "Ignorar notificationes de mentiones private non requestate?", "info_button.label": "Adjuta", - "info_button.what_is_alt_text": "

Que es texto alternative?

Le texto alternative forni descriptiones de imagines a personas con impedimentos visual, con connexiones lente, o qui cerca contexto additional.

Tu pote meliorar le accessibilitate e le comprension pro totes scribente un texto alternative clar, concise e objective.

  • Captura le elementos importante
  • Summarisa texto in imagines
  • Usa le structura de phrase normal
  • Evita information redundante
  • In figuras complexe (como diagrammas o mappas), concentra te sur le tendentias e punctos clave
", + "info_button.what_is_alt_text": "

Que es texto alternative?

Le texto alternative forni descriptiones de imagines a personas con impedimentos visual, con connexiones lente a internet, o qui cerca contexto supplementari.

Tu pote meliorar le accessibilitate e le comprension pro totes si tu scribe un texto alternative clar, concise e objective.

  • Captura le elementos importante
  • Summarisa texto in imagines
  • Usa un structura conventional de phrases
  • Evita information redundante
  • In figuras complexe (como diagrammas o mappas), concentra te sur le tendentias e punctos clave
", "interaction_modal.action": "Pro interager con le message de {name}, tu debe acceder a tu conto sur le servitor Mastodon que tu usa.", "interaction_modal.go": "Revenir", "interaction_modal.no_account_yet": "Tu non ha ancora un conto?", @@ -574,8 +575,8 @@ "navigation_bar.follows_and_followers": "Sequites e sequitores", "navigation_bar.import_export": "Importar e exportar", "navigation_bar.lists": "Listas", - "navigation_bar.live_feed_local": "Canal in directo (local)", - "navigation_bar.live_feed_public": "Canal in directo (public)", + "navigation_bar.live_feed_local": "Canal in vivo (local)", + "navigation_bar.live_feed_public": "Canal in vivo (public)", "navigation_bar.logout": "Clauder session", "navigation_bar.moderation": "Moderation", "navigation_bar.more": "Plus", @@ -748,7 +749,7 @@ "privacy.quote.anyone": "{visibility}, omnes pote citar", "privacy.quote.disabled": "{visibility}, citation disactivate", "privacy.quote.limited": "{visibility}, citation limitate", - "privacy.unlisted.additional": "Isto es exactemente como public, excepte que le message non apparera in fluxos in directo, in hashtags, in Explorar, o in le recerca de Mastodon, mesmo si tu ha optate pro render tote le conto discoperibile.", + "privacy.unlisted.additional": "Isto es exactemente como public, excepte que le message non apparera in fluxos in vivo, in hashtags, in Explorar, o in le recerca de Mastodon, mesmo si tu ha optate pro render tote le conto discoperibile.", "privacy.unlisted.long": "Non apparera in le resultatos de recerca, tendentias e chronologias public de Mastodon", "privacy.unlisted.short": "Public, non listate", "privacy_policy.last_updated": "Ultime actualisation {date}", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index b223288f5..62ec278e6 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -38,6 +38,8 @@ "account.follow": "Sige", "account.follow_back": "Sige tamyen", "account.follow_back_short": "Sige tambyen", + "account.follow_request": "Solisita segirle", + "account.follow_request_cancel": "Anula solisitud", "account.follow_request_cancel_short": "Anula", "account.follow_request_short": "Solisitud", "account.followers": "Suivantes", @@ -62,6 +64,7 @@ "account.mute_short": "Silensia", "account.muted": "Silensiado", "account.muting": "Silensyando", + "account.mutual": "Vos sigesh mutualmente", "account.no_bio": "No ay deskripsion.", "account.open_original_page": "Avre pajina orijnala", "account.posts": "Publikasyones", @@ -97,6 +100,7 @@ "alert.unexpected.title": "Atyo!", "alt_text_badge.title": "Teksto alternativo", "alt_text_modal.add_alt_text": "Adjusta teksto alternativo", + "alt_text_modal.add_text_from_image": "Adjusta teksto de imaje", "alt_text_modal.cancel": "Anula", "alt_text_modal.change_thumbnail": "Troka minyatura", "alt_text_modal.done": "Fecho", @@ -210,6 +214,7 @@ "confirmations.logout.message": "Estas siguro ke keres salir de tu kuento?", "confirmations.logout.title": "Salir?", "confirmations.missing_alt_text.confirm": "Adjusta teksto alternativo", + "confirmations.missing_alt_text.secondary": "Puvlika de todos modos", "confirmations.missing_alt_text.title": "Adjustar teksto alternativo?", "confirmations.mute.confirm": "Silensia", "confirmations.quiet_post_quote_info.got_it": "Entyendo", @@ -382,6 +387,7 @@ "hints.profiles.see_more_followers": "Ve mas suivantes en {domain}", "hints.profiles.see_more_follows": "Ve mas segidos en {domain}", "hints.profiles.see_more_posts": "Ve mas puvlikasyones en {domain}", + "home.column_settings.show_quotes": "Muestra sitas", "home.column_settings.show_reblogs": "Amostra repartajasyones", "home.column_settings.show_replies": "Amostra repuestas", "home.hide_announcements": "Eskonde pregones", @@ -631,6 +637,7 @@ "privacy_policy.title": "Politika de privasita", "recommended": "Rekomendado", "refresh": "Arefreska", + "regeneration_indicator.please_stand_by": "Aspera por favor.", "relative_time.days": "{number} d", "relative_time.full.days": "antes {number, plural, one {# diya} other {# diyas}}", "relative_time.full.hours": "antes {number, plural, one {# ora} other {# oras}}", @@ -733,8 +740,12 @@ "status.bookmark": "Marka", "status.cancel_reblog_private": "No repartaja", "status.cannot_reblog": "Esta publikasyon no se puede repartajar", + "status.contains_quote": "Kontriene sita", + "status.context.loading_success": "Muevas repuestas kargadas", + "status.context.more_replies_found": "Se toparon mas repuestas", "status.context.retry": "Reprova", "status.context.show": "Amostra", + "status.continued_thread": "Kontinuasion del filo", "status.copy": "Kopia atadijo de publikasyon", "status.delete": "Efasa", "status.delete.success": "Puvlikasyon kitada", @@ -760,9 +771,18 @@ "status.pin": "Fiksa en profil", "status.quote": "Sita", "status.quote.cancel": "Anula la sita", + "status.quote_error.limited_account_hint.action": "Amostra entanto", + "status.quote_error.limited_account_hint.title": "Este kuento fue eskondido por los moderadores de {domain}.", + "status.quote_error.not_available": "Puvlikasyon no desponivle", + "status.quote_error.pending_approval": "Puvlikasyon esta asperando", "status.quote_noun": "Sita", + "status.quote_policy_change": "Troka ken puede sitar", + "status.quote_post_author": "Sito una puvlikasyon de @{name}", + "status.quote_private": "No se puede sitar puvlikasyones privadas", + "status.quotes": "{count, plural, one {sita} other {sitas}}", "status.read_more": "Melda mas", "status.reblog": "Repartaja", + "status.reblog_or_quote": "Repartaja o partaja", "status.reblogged_by": "{name} repartajo", "status.reblogs.empty": "Ainda nadie tiene repartajado esta publikasyon. Kuando algien lo aga, se amostrara aki.", "status.redraft": "Efasa i eskrive de muevo", @@ -823,7 +843,12 @@ "video.pause": "Pauza", "video.play": "Reproduze", "video.unmute": "Desilensia", + "visibility_modal.button_title": "Konfigura la vizibilita", + "visibility_modal.header": "Vizibilita i enteraksyon", "visibility_modal.privacy_label": "Vizivilita", "visibility_modal.quote_followers": "Solo suivantes", + "visibility_modal.quote_label": "Ken puede sitar", + "visibility_modal.quote_nobody": "Solo yo", + "visibility_modal.quote_public": "Todos", "visibility_modal.save": "Guadra" } diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 5457e91db..c80297f67 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}}", @@ -240,6 +246,8 @@ "confirmations.mute.confirm": "Silenciar", "confirmations.quiet_post_quote_info.dismiss": "Não me lembrar novamente", "confirmations.quiet_post_quote_info.got_it": "Entendi", + "confirmations.quiet_post_quote_info.message": "Ao citar uma publicação pública silenciosa, sua postagem será oculta das linhas de tempo em tendência.", + "confirmations.quiet_post_quote_info.title": "Citando publicações públicas silenciadas", "confirmations.redraft.confirm": "Excluir e rascunhar", "confirmations.redraft.message": "Você tem certeza de que quer apagar essa postagem e rascunhá-la? Favoritos e impulsos serão perdidos, e respostas à postagem original ficarão órfãs.", "confirmations.redraft.title": "Excluir e rascunhar publicação?", @@ -249,7 +257,12 @@ "confirmations.revoke_quote.confirm": "Remover publicação", "confirmations.revoke_quote.message": "Essa ação não pode ser desfeita.", "confirmations.revoke_quote.title": "Remover publicação?", + "confirmations.unblock.confirm": "Desbloquear", + "confirmations.unblock.title": "Desbloquear {name}?", "confirmations.unfollow.confirm": "Deixar de seguir", + "confirmations.unfollow.title": "Deixar de seguir {name}?", + "confirmations.withdraw_request.confirm": "Retirar solicitação", + "confirmations.withdraw_request.title": "Cancelar solicitação para seguir {name}?", "content_warning.hide": "Ocultar post", "content_warning.show": "Mostrar mesmo assim", "content_warning.show_more": "Mostrar mais", @@ -320,6 +333,7 @@ "empty_column.bookmarked_statuses": "Nada aqui. Quando você salvar um toot, ele aparecerá aqui.", "empty_column.community": "A linha local está vazia. Publique algo para começar!", "empty_column.direct": "Você ainda não tem mensagens privadas. Quando você enviar ou receber uma, será exibida aqui.", + "empty_column.disabled_feed": "Este feed foi desativado pelos administradores do servidor.", "empty_column.domain_blocks": "Nada aqui.", "empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!", "empty_column.favourited_statuses": "Você ainda não tem publicações favoritas. Quanto você marcar uma como favorita, ela aparecerá aqui.", @@ -448,10 +462,12 @@ "ignore_notifications_modal.private_mentions_title": "Ignorar notificações de menções privadas não solicitadas?", "info_button.label": "Ajuda", "info_button.what_is_alt_text": "

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 +750,11 @@ "privacy.quote.disabled": "{visibility} Citações desabilitadas", "privacy.quote.limited": "{visibility} Citações limitadas", "privacy.unlisted.additional": "Isso se comporta exatamente como público, exceto que a publicação não aparecerá nos _feeds ao vivo_ ou nas _hashtags_, explorar, ou barra de busca, mesmo que você seja escolhido em toda a conta.", - "privacy.unlisted.short": "Público (silencioso)", + "privacy.unlisted.long": "Oculto para os resultados de pesquisa do Mastodon, tendências e linhas do tempo públicas", + "privacy.unlisted.short": "Público silenciado", "privacy_policy.last_updated": "Atualizado {date}", "privacy_policy.title": "Política de privacidade", + "quote_error.edit": "Citações não podem ser adicionadas durante a edição de uma publicação.", "quote_error.poll": "Citações não permitidas com enquetes.", "quote_error.quote": "Apenas uma citação por vez é permitido.", "quote_error.unauthorized": "Você não é autorizado a citar essa publicação.", @@ -756,6 +774,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hoje", + "remove_quote_hint.button_label": "Entendi", + "remove_quote_hint.message": "Você pode fazê-lo no menu de opções {icon}.", + "remove_quote_hint.title": "Deseja remover sua citação publicada?", "reply_indicator.attachments": "{count, plural, one {# attachment} other {# attachments}}", "reply_indicator.cancel": "Cancelar", "reply_indicator.poll": "Enquete", @@ -851,7 +872,15 @@ "status.block": "Bloquear @{name}", "status.bookmark": "Salvar", "status.cancel_reblog_private": "Desfazer boost", + "status.cannot_quote": "Você não tem permissão para citar esta publicação", "status.cannot_reblog": "Este toot não pode receber boost", + "status.contains_quote": "Contém citação", + "status.context.loading": "Carregando mais respostas", + "status.context.loading_error": "Não foi possível carregar novas respostas", + "status.context.loading_success": "Novas respostas carregadas", + "status.context.more_replies_found": "Mais respostas encontradas", + "status.context.retry": "Tentar novamente", + "status.context.show": "Mostrar", "status.continued_thread": "Continuação da conversa", "status.copy": "Copiar link", "status.delete": "Excluir", @@ -881,24 +910,33 @@ "status.quote": "Citar", "status.quote.cancel": "Cancelar citação", "status.quote_error.filtered": "Oculto devido a um dos seus filtros", + "status.quote_error.limited_account_hint.action": "Mostrar mesmo assim", + "status.quote_error.limited_account_hint.title": "Esta conta foi oculta pelos moderadores do {domain}.", "status.quote_error.not_available": "Publicação indisponível", "status.quote_error.pending_approval": "Publicação pendente", + "status.quote_error.pending_approval_popout.body": "No Mastodon, você pode controlar se alguém pode citar você. Esta publicação está pendente enquanto estamos recebendo a aprovação do autor original.", + "status.quote_error.revoked": "Publicação removida pelo autor", "status.quote_followers_only": "Apenas seguidores podem citar sua publicação", "status.quote_manual_review": "Autor irá revisar manualmente", + "status.quote_noun": "Citar", "status.quote_policy_change": "Mude quem pode citar", "status.quote_post_author": "Publicação citada por @{name}", "status.quote_private": "Publicações privadas não podem ser citadas", "status.quotes": "{count, plural, one {# voto} other {# votos}}", "status.quotes.empty": "Ninguém citou essa publicação até agora. Quando alguém citar aparecerá aqui.", + "status.quotes.local_other_disclaimer": "Citações rejeitadas pelo autor não serão exibidas.", + "status.quotes.remote_other_disclaimer": "Apenas citações do {domain} têm a garantia de serem exibidas aqui. Citações rejeitadas pelo autor não serão exibidas.", "status.read_more": "Ler mais", "status.reblog": "Dar boost", "status.reblog_or_quote": "Acelerar ou citar", + "status.reblog_private": "Compartilhar novamente com seus seguidores", "status.reblogged_by": "{name} deu boost", "status.reblogs": "{count, plural, one {boost} other {boosts}}", "status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.", "status.redraft": "Excluir e rascunhar", "status.remove_bookmark": "Remover do Salvos", "status.remove_favourite": "Remover dos favoritos", + "status.remove_quote": "Remover", "status.replied_in_thread": "Respondido na conversa", "status.replied_to": "Em resposta a {name}", "status.reply": "Responder", @@ -970,6 +1008,8 @@ "visibility_modal.button_title": "Selecionar Visibilidade", "visibility_modal.header": "Visibilidade e interação", "visibility_modal.helper.direct_quoting": "Menções privadas escritas no Mastodon.", + "visibility_modal.helper.privacy_editing": "A visibilidade não pode ser alterada após uma publicação ser publicada.", + "visibility_modal.helper.privacy_private_self_quote": "As auto-citações de publicações privadas não podem ser públicas.", "visibility_modal.helper.private_quoting": "Posts somente para seguidores feitos no Mastodon não podem ser citados por outros.", "visibility_modal.helper.unlisted_quoting": "Quando as pessoas citam você, sua publicação também será ocultada das linhas de tempo de tendência.", "visibility_modal.instructions": "Controle quem pode interagir com este post. Você também pode aplicar as configurações para todos os posts futuros navegando para Preferências > Postagem padrão.", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 00181ba8c..c58e790c6 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -333,6 +333,7 @@ "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.", diff --git a/config/locales/be.yml b/config/locales/be.yml index b265585e4..2a9a61c34 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -867,7 +867,7 @@ be: title: Перадвызначана выключыць карыстальнікаў з індэксацыі пашуковымі рухавікамі discovery: follow_recommendations: Выконвайце рэкамендацыі - preamble: Паказ цікавага кантэнту карысны ў прывабліванні новых карыстальнікаў, якія могуць нікога не ведаць у Mastodon. Кантралюйце, як розныя функцыі вынаходства працуюць на Вашым серверы. + preamble: Паказ цікавага кантэнту карысны ў прывабліванні новых карыстальнікаў, якія могуць нікога не ведаць у Mastodon. Кантралюйце, як розныя функцыі выяўлення працуюць на Вашым серверы. privacy: Прыватнасць profile_directory: Дырэкторыя профіляў public_timelines: Публічная паслядоўнасць публікацый @@ -883,6 +883,11 @@ be: authenticated: Толькі аўтэнтыфікаваныя карыстальнікі disabled: Запатрабаваць адмысловую ролю карыстальніка public: Усе + landing_page: + values: + about: Падрабязна + local_feed: Тутэйшая стужка + trends: Трэнды registrations: moderation_recommandation: Пераканайцеся, што ў вас ёсць адэкватная і аператыўная каманда мадэратараў, перш чым адчыняць рэгістрацыю для ўсіх жадаючых! preamble: Кантралюйце, хто можа ствараць уліковы запіс на вашым серверы. diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 60a86c36a..251eef9cb 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -835,6 +835,14 @@ bg: all: До всеки disabled: До никого users: До влезнали локални потребители + feed_access: + modes: + authenticated: Само удостоверени потребители + disabled: Изисква особена потребителска роля + public: Всеки + landing_page: + values: + trends: Пламенности registrations: moderation_recommandation: Уверете се, че имате адекватен и реактивен модераторски екип преди да отворите регистриранията за всеки! preamble: Управлява кой може да създава акаунт на сървъра ви. @@ -888,6 +896,7 @@ bg: no_status_selected: Няма промяна, тъй като няма избрани публикации open: Отваряне на публикация original_status: Първообразна публикация + quotes: Цитати reblogs: Блогване пак replied_to_html: Отговорено до %{acct_link} status_changed: Публикацията променена @@ -895,6 +904,7 @@ bg: title: Публикации на акаунт - @%{name} trending: Изгряващи view_publicly: Преглед като публично + view_quoted_post: Преглед на цитираната публикация visibility: Видимост with_media: С мултимедия strikes: @@ -1165,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 е преведено от доброволци. @@ -1567,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: Достигнахте максималния брой списъци @@ -1719,6 +1739,9 @@ bg: self_vote: Не може да гласувате в свои анкети too_few_options: трябва да има повече от един елемент too_many_options: не може да съдържа повече от %{max} елемента + vote: Гласувам + posting_defaults: + explanation: Тези настройки ще се употребяват като стандартни, когато създавате нови публикации, но може да ги редактирате за всяка публикация в редактора. preferences: other: Друго posting_defaults: По подразбиране за публикации @@ -1874,6 +1897,9 @@ bg: other: "%{count} видеозаписа" boosted_from_html: Раздуто от %{acct_link} content_warning: 'Предупреждение за съдържание: %{warning}' + content_warnings: + hide: Скриване на публ. + show: Показване на още default_language: Същият като езика на интерфейса disallowed_hashtags: one: 'съдържа непозволен хаштаг: %{tags}' @@ -1888,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/cs.yml b/config/locales/cs.yml index 2c8f4c861..9c69ab844 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -872,7 +872,7 @@ cs: 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 @@ -883,6 +883,11 @@ cs: 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. diff --git a/config/locales/da.yml b/config/locales/da.yml index 2114169d1..c6a30afaa 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -855,6 +855,11 @@ da: 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. diff --git a/config/locales/de.yml b/config/locales/de.yml index 450bdb436..e4a579575 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -852,6 +852,9 @@ de: modes: authenticated: Nur authentifizierte Nutzer*innen public: Alle + landing_page: + values: + about: Über 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. 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.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/el.yml b/config/locales/el.yml index aa0aec3a8..0f2339b1c 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -855,6 +855,11 @@ el: authenticated: Πιστοποιημένοι χρήστες μόνο disabled: Να απαιτείται συγκεκριμένος ρόλος χρήστη public: Όλοι + landing_page: + values: + about: Σχετικά + local_feed: Τοπική ροή + trends: Τάσεις registrations: moderation_recommandation: Παρακαλώ βεβαιώσου ότι έχεις μια επαρκής και ενεργή ομάδα συντονισμού πριν ανοίξεις τις εγγραφές για όλους! preamble: Έλεγξε ποιος μπορεί να δημιουργήσει ένα λογαριασμό στον διακομιστή σας. diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index bb82fe39e..129735546 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -855,6 +855,11 @@ es-AR: authenticated: Solo usuarios autenticados disabled: Requerir un rol de específico de usuario public: Todos + landing_page: + values: + about: Acerca de + local_feed: Cronología 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. diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index f5c52260c..ecfc06836 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -855,6 +855,11 @@ es-MX: 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. diff --git a/config/locales/es.yml b/config/locales/es.yml index 226469679..da0d9ac34 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -855,6 +855,11 @@ es: 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. diff --git a/config/locales/et.yml b/config/locales/et.yml index 63adff4c7..8f56b20b1 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -837,6 +837,7 @@ et: title: Otsimootorite indeksitesse kasutajaid vaikimisi ei lisata discovery: follow_recommendations: Jälgi soovitusi + preamble: Huvitava sisu esiletoomine on oluline uute kasutajate kaasamisel, kes ei pruugi Mastodonist kedagi tunda. Kontrolli, kuidas erinevad avastamisfunktsioonid serveris töötavad. privacy: Privaatsus profile_directory: Kasutajate kataloog public_timelines: Avalikud ajajooned @@ -850,7 +851,11 @@ et: feed_access: modes: authenticated: Vaid autenditud kasutajad + disabled: Eelda konkreetse kasutajarolli olemasolu public: Kõik + landing_page: + values: + 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. diff --git a/config/locales/fo.yml b/config/locales/fo.yml index db217841e..3938235ee 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -855,6 +855,11 @@ fo: 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. diff --git a/config/locales/ga.yml b/config/locales/ga.yml index fa91f853e..cb27ec1f9 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -897,6 +897,11 @@ ga: 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í. diff --git a/config/locales/he.yml b/config/locales/he.yml index bac4c44bd..eebc9000d 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -883,6 +883,11 @@ he: authenticated: משתמשים מאומתים בלבד disabled: נדרש תפקיד משתמש מסוים public: כולם + landing_page: + values: + about: אודות + local_feed: פיד מקומי + trends: נושאים חמים registrations: moderation_recommandation: יש לוודא שלאתר יש צוות מנחות ומנחי שיחה מספק ושירותי בטרם תבחרו לפתוח הרשמה לכולם! preamble: שליטה בהרשאות יצירת חשבון בשרת שלך. diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 6918a93cc..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 @@ -837,6 +839,7 @@ ia: title: Excluder le usatores del indexation del motores de recerca per predefinition discovery: follow_recommendations: Recommendationes de contos a sequer + preamble: Presentar contento interessante es essential pro attraher e retener nove usatores qui pote non cognoscer alcun persona sur Mastodon. Controla como varie optiones de discoperta functiona sur tu servitor. privacy: Confidentialitate profile_directory: Directorio de profilos public_timelines: Chronologias public @@ -850,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/is.yml b/config/locales/is.yml index 4cb9da51a..104bd6389 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -857,6 +857,11 @@ is: 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. diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 5c982eff3..c15f513ce 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -693,6 +693,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 @@ -796,6 +797,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 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 @@ -809,6 +811,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. @@ -846,6 +852,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 @@ -860,10 +867,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: @@ -1094,7 +1103,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. @@ -1199,6 +1210,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." @@ -1734,6 +1746,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 @@ -1741,6 +1754,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 @@ -1776,10 +1791,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 @@ -1893,6 +1913,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/nl.yml b/config/locales/nl.yml index 241a22f02..9179337c6 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -855,6 +855,11 @@ nl: 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. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 615432f17..44e6d1831 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -847,6 +847,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. @@ -900,6 +910,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 @@ -907,6 +918,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: @@ -1181,7 +1193,9 @@ 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 discovery: Descobrir localization: body: Mastodon é traduzido por voluntários. @@ -1583,6 +1597,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 @@ -1893,6 +1914,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}' @@ -1907,15 +1931,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 b2e802300..24a21f886 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 @@ -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. diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index e2d90ad1b..c097562a2 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -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: Карыстальнікі будуць атрымліваць запыт на пацвярджэнне даты нараджэння падчас рэгістрацыі @@ -288,6 +289,7 @@ be: content_cache_retention_period: Перыяд захоўвання змесціва з іншых сервераў custom_css: CSS карыстальніка favicon: Значок сайта + landing_page: Старонка прыбыцця для новых наведвальнікаў local_live_feed_access: Доступ да жывых стужак з лакальнымі допісамі local_topic_feed_access: Доступ да хэштэгавых і спасылачных стужак з лакальнымі допісамі mascot: Уласны маскот(спадчына) diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 281124a6b..e14b05ed9 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -242,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: Употреба на системната подразбираща се лента за превъртане diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index d8b803fe1..cd5a51901 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -93,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í @@ -288,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í diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index a4b4a13c0..6c5711aa5 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 @@ -286,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) diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index acfa81ae3..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: Οι χρήστες θα κληθούν να επιβεβαιώσουν την ημερομηνία γέννησής τους κατά την εγγραφή @@ -286,6 +287,7 @@ el: content_cache_retention_period: Περίοδος διατήρησης απομακρυσμένου περιεχομένου custom_css: Προσαρμοσμένο CSS favicon: Favicon + landing_page: Σελίδα προσγείωσης για νέους επισκέπτες local_live_feed_access: Πρόσβαση σε ζωντανές ροές με τοπικές αναρτήσεις local_topic_feed_access: Πρόσβαση σε ροές ετικετών και συνδέσμων με τοπικές αναρτήσεις mascot: Προσαρμοσμένη μασκότ (απαρχαιωμένο) diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 1fe68d5fb..b58d916d6 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 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 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 @@ -286,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 inicio 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) diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 1cbd2f405..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 @@ -286,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) diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 99aaf6427..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 @@ -286,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) diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 0f5424e41..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 @@ -286,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) diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index 203e12b4f..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 @@ -289,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) diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 9de34b6c8..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: משתמשיםות יתבקשו לאשר את תאריך הלידה בתהליך ההרשמה @@ -288,6 +289,7 @@ he: content_cache_retention_period: תקופת השמירה על תוכן חיצוני custom_css: CSS בהתאמה אישית favicon: סמל מועדפים (Favicon) + landing_page: דף נחיתה למבקרים חדשים local_live_feed_access: גישה לפידים חיים המציגים הודעות מקומיות local_topic_feed_access: גישה לפידים של תגיות וקישורים המציגים הודעות מקומיות mascot: סמל השרת (ישן) diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 45fedf9da..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 @@ -286,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) diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 6b8ee6a11..ccaa8dd69 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -286,6 +286,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) diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index de3063a17..a04bf89f9 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -312,6 +312,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 @@ -324,6 +325,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.nl.yml b/config/locales/simple_form.nl.yml index 3289cadb9..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 @@ -286,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) diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 4aa2d15d3..605bcf8d9 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 @@ -56,6 +56,8 @@ pt-BR: 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_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_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 @@ -235,6 +237,7 @@ pt-BR: 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 @@ -244,6 +247,7 @@ 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_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 @@ -277,12 +281,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 diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index 07b801055..e8aa2692e 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -93,6 +93,7 @@ pt-PT: 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 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 @@ -286,6 +287,7 @@ 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) diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 23f848142..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 @@ -285,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) diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 05367bdf9..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 @@ -286,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) diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index eb2610bdb..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ý @@ -285,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) diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index a205039f2..c740aba19 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -93,6 +93,7 @@ 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: 用户注册时必须确认出生日期 @@ -285,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: 自定义吉祥物(旧) diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 4704199c5..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: 使用者將於註冊時被要求確認他們的生日 @@ -285,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) diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 20830e4de..6aa95821d 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -847,6 +847,11 @@ sq: 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. diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 8f2894e0c..3cedf77bb 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. diff --git a/config/locales/vi.yml b/config/locales/vi.yml index fe2a2183f..0d3866f65 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -841,6 +841,11 @@ vi: 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. diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 8245d9716..e7385e392 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -838,6 +838,11 @@ zh-CN: modes: authenticated: 仅已登录用户 public: 所有人 + landing_page: + values: + about: 关于 + local_feed: 本站动态 + trends: 热门 registrations: moderation_recommandation: 在向所有人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! preamble: 控制谁可以在你的服务器上创建账号。 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 5fb797b64..6c56aaf90 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -843,6 +843,11 @@ zh-TW: authenticated: 僅限已登入之使用者 disabled: 需要特定使用者權限 public: 任何人 + landing_page: + values: + about: 關於 + local_feed: 本站時間軸 + trends: 熱門趨勢 registrations: moderation_recommandation: 對所有人開放註冊之前,請確保您有人手充足且反應靈敏的管理員團隊! preamble: 控制誰能於您伺服器上建立帳號。 From 7ba06a661cc77236acc06f44cb400b9104d0c282 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:32:29 +0000 Subject: [PATCH 37/90] Update dependency @reduxjs/toolkit to v2.9.2 (#36572) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b23b2b77d..de2d35bec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3366,8 +3366,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" @@ -3383,7 +3383,7 @@ __metadata: optional: true react-redux: optional: true - checksum: 10c0/11e99b665560c7e4bda80d26ad1308866282156bc177500558d72888d18819c303ebebf1f96121552facde3d6bd9c114b0e1f5c41e618c9ce0eaf464518f39dc + checksum: 10c0/577416200c76ffd82bce6158aaeb63e836ed2c2a14e670253056dcaec505da77643e79b47208b4e493a0c120a4a2bc049efe60cd555a2699053af5b03f2f2953 languageName: node linkType: hard From 4905c194b8c6c346b683b1b6568d035bb62647eb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 09:32:36 +0100 Subject: [PATCH 38/90] Update dependency mail to v2.9.0 (#36575) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8d0a69e05..e36498c30 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -426,7 +426,8 @@ GEM loofah (2.24.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) - mail (2.8.1) + mail (2.9.0) + logger mini_mime (>= 0.1.1) net-imap net-pop From f53c4db05c0618eab7dea2ddd8ac5b05bf2b737e Mon Sep 17 00:00:00 2001 From: Nicholas La Roux Date: Tue, 28 Oct 2025 07:22:41 -0400 Subject: [PATCH 39/90] [Vite] Remove overridden `build.target` in favor of legacy plugin defaults (#36611) --- vite.config.mts | 1 - 1 file changed, 1 deletion(-) diff --git a/vite.config.mts b/vite.config.mts index 6876302dd..30c0741aa 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -73,7 +73,6 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { port: 3036, }, build: { - target: 'modules', commonjsOptions: { transformMixedEsModules: true }, chunkSizeWarningLimit: 1 * 1024 * 1024, // 1MB sourcemap: true, From e322c1777b84d2e289d0323ae72501c39056ecfd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:27:54 +0000 Subject: [PATCH 40/90] Update dependency webmock to v3.26.0 (#36605) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e36498c30..2c6848e17 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) @@ -911,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) From e4fc18abfd7f01e4333e4dfb3fd03e45d9499a35 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:29:07 +0000 Subject: [PATCH 41/90] Update dependency simple_form to v5.4.0 (#36604) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2c6848e17..3904ed099 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) @@ -443,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) @@ -822,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) From 85d0cdb5f73850dc7474c5e2e64b3aa8513bd1d3 Mon Sep 17 00:00:00 2001 From: Echo Date: Tue, 28 Oct 2025 12:33:27 +0100 Subject: [PATCH 42/90] Emoji: Remove final flag (#36409) --- .gitignore | 1 + app/javascript/entrypoints/public.tsx | 2 +- .../mastodon/actions/importer/normalizer.js | 17 +- .../mastodon/components/account_bio.tsx | 44 -- .../mastodon/components/emoji/context.tsx | 10 +- .../mastodon/components/emoji/html.tsx | 35 +- .../components/hover_card_account.tsx | 6 +- .../mastodon/components/html_block/index.tsx | 4 +- app/javascript/mastodon/components/poll.tsx | 7 +- .../mastodon/components/status_content.jsx | 53 -- .../mastodon/components/verified_badge.tsx | 26 +- .../components/account_header.tsx | 7 +- .../mastodon/features/emoji/emoji.js | 7 +- .../features/emoji/emoji_compressed.mjs | 3 +- .../features/emoji/emoji_mart_data_light.ts | 6 +- .../features/emoji/emoji_mart_search_light.js | 12 +- .../mastodon/features/emoji/emoji_picker.tsx | 5 +- .../emoji/emoji_unicode_mapping_light.ts | 2 +- .../mastodon/features/emoji/emoji_utils.js | 41 -- .../mastodon/features/emoji/handlers.ts | 61 --- .../features/emoji/unicode_to_filename.js | 26 - .../features/emoji/unicode_to_unified_name.js | 21 - .../mastodon/features/emoji/unicode_utils.ts | 43 ++ .../components/announcements.jsx | 458 ------------------ .../containers/announcements_container.js | 23 - .../components/announcements/index.tsx | 8 +- .../components/embedded_status_content.tsx | 75 --- .../ui/components/compare_history_modal.jsx | 12 +- app/javascript/mastodon/features/ui/index.jsx | 10 +- app/javascript/mastodon/hooks/useLinks.ts | 81 ---- app/javascript/mastodon/main.tsx | 12 +- app/javascript/mastodon/models/account.ts | 28 +- app/javascript/mastodon/models/poll.ts | 30 +- app/javascript/mastodon/reducers/polls.ts | 8 +- app/javascript/mastodon/utils/environment.ts | 10 +- app/serializers/initial_state_serializer.rb | 2 +- .../preferences/appearance/show.html.haml | 19 +- 37 files changed, 112 insertions(+), 1103 deletions(-) delete mode 100644 app/javascript/mastodon/features/emoji/handlers.ts delete mode 100644 app/javascript/mastodon/features/emoji/unicode_to_filename.js delete mode 100644 app/javascript/mastodon/features/emoji/unicode_to_unified_name.js create mode 100644 app/javascript/mastodon/features/emoji/unicode_utils.ts delete mode 100644 app/javascript/mastodon/features/getting_started/components/announcements.jsx delete mode 100644 app/javascript/mastodon/features/getting_started/containers/announcements_container.js delete mode 100644 app/javascript/mastodon/hooks/useLinks.ts 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/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/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/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/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_content.jsx b/app/javascript/mastodon/components/status_content.jsx index cef2be628..81396bb85 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -15,8 +15,6 @@ import { Poll } from 'mastodon/components/poll'; import { identityContextPropShape, withIdentity } from 'mastodon/identity_context'; import { languages as preloadedLanguages } from 'mastodon/initial_state'; -import { isModernEmojiEnabled } from '../utils/environment'; - import { EmojiHTML } from './emoji/html'; import { HandledLink } from './status/handled_link'; @@ -119,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 => compareUrls(link, 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 () { @@ -164,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]; }; 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/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/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index cc0d6fe19..8ca86d16c 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -1,6 +1,5 @@ import Trie from 'substring-trie'; -import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import { assetHost } from 'mastodon/utils/config'; import { autoPlayGif } from '../../initial_state'; @@ -153,13 +152,9 @@ const emojifyNode = (node, customEmojis) => { * Legacy emoji processing function. * @param {string} str * @param {object} customEmojis - * @param {boolean} force If true, always emojify even if modern emoji is enabled * @returns {string} */ -const emojify = (str, customEmojis = {}, force = false) => { - if (isModernEmojiEnabled() && !force) { - return str; - } +const emojify = (str, customEmojis = {}) => { const wrapper = document.createElement('div'); wrapper.innerHTML = str; diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.mjs b/app/javascript/mastodon/features/emoji/emoji_compressed.mjs index db8a4bc12..c565b861f 100644 --- a/app/javascript/mastodon/features/emoji/emoji_compressed.mjs +++ b/app/javascript/mastodon/features/emoji/emoji_compressed.mjs @@ -14,8 +14,7 @@ import { uncompress as emojiMartUncompress } from 'emoji-mart/dist/utils/data'; import data from './emoji_data.json'; import emojiMap from './emoji_map.json'; -import { unicodeToFilename } from './unicode_to_filename'; -import { unicodeToUnifiedName } from './unicode_to_unified_name'; +import { unicodeToFilename, unicodeToUnifiedName } from './unicode_utils'; emojiMartUncompress(data); diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts index 131551817..59d995e25 100644 --- a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts +++ b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts @@ -9,7 +9,7 @@ import type { ShortCodesToEmojiData, } from 'virtual:mastodon-emoji-compressed'; -import { unicodeToUnifiedName } from './unicode_to_unified_name'; +import { unicodeToUnifiedName } from './unicode_utils'; type Emojis = Record< NonNullable, @@ -23,7 +23,7 @@ type Emojis = Record< const [ shortCodesToEmojiData, - skins, + _skins, categories, short_names, _emojisWithoutShortCodes, @@ -47,4 +47,4 @@ Object.keys(shortCodesToEmojiData).forEach((shortCode) => { }; }); -export { emojis, skins, categories, short_names }; +export { emojis, categories, short_names }; diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js b/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js index 83e154b0b..038dd120c 100644 --- a/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js +++ b/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js @@ -1,7 +1,7 @@ // This code is largely borrowed from: // https://github.com/missive/emoji-mart/blob/5f2ffcc/src/utils/emoji-index.js -import * as data from './emoji_mart_data_light'; +import { emojis, categories } from './emoji_mart_data_light'; import { getData, getSanitizedData, uniq, intersect } from './emoji_utils'; let originalPool = {}; @@ -10,8 +10,8 @@ let emojisList = {}; let emoticonsList = {}; let customEmojisList = []; -for (let emoji in data.emojis) { - let emojiData = data.emojis[emoji]; +for (let emoji in emojis) { + let emojiData = emojis[emoji]; let { short_names, emoticons } = emojiData; let id = short_names[0]; @@ -84,14 +84,14 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo if (include.length || exclude.length) { pool = {}; - data.categories.forEach(category => { + categories.forEach(category => { let isIncluded = include && include.length ? include.indexOf(category.name.toLowerCase()) > -1 : true; let isExcluded = exclude && exclude.length ? exclude.indexOf(category.name.toLowerCase()) > -1 : false; if (!isIncluded || isExcluded) { return; } - category.emojis.forEach(emojiId => pool[emojiId] = data.emojis[emojiId]); + category.emojis.forEach(emojiId => pool[emojiId] = emojis[emojiId]); }); if (custom.length) { @@ -171,7 +171,7 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo if (results) { if (emojisToShowFilter) { - results = results.filter((result) => emojisToShowFilter(data.emojis[result.id])); + results = results.filter((result) => emojisToShowFilter(emojis[result.id])); } if (results && results.length > maxResults) { diff --git a/app/javascript/mastodon/features/emoji/emoji_picker.tsx b/app/javascript/mastodon/features/emoji/emoji_picker.tsx index 38363d431..37fc94dde 100644 --- a/app/javascript/mastodon/features/emoji/emoji_picker.tsx +++ b/app/javascript/mastodon/features/emoji/emoji_picker.tsx @@ -2,7 +2,6 @@ import type { EmojiProps, PickerProps } from 'emoji-mart'; import EmojiRaw from 'emoji-mart/dist-es/components/emoji/nimble-emoji'; import PickerRaw from 'emoji-mart/dist-es/components/picker/nimble-picker'; -import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import { assetHost } from 'mastodon/utils/config'; import { EMOJI_MODE_NATIVE } from './constants'; @@ -27,7 +26,7 @@ const Emoji = ({ sheetSize={sheetSize} sheetColumns={sheetColumns} sheetRows={sheetRows} - native={mode === EMOJI_MODE_NATIVE && isModernEmojiEnabled()} + native={mode === EMOJI_MODE_NATIVE} backgroundImageFn={backgroundImageFn} {...props} /> @@ -51,7 +50,7 @@ const Picker = ({ sheetColumns={sheetColumns} sheetRows={sheetRows} backgroundImageFn={backgroundImageFn} - native={mode === EMOJI_MODE_NATIVE && isModernEmojiEnabled()} + native={mode === EMOJI_MODE_NATIVE} {...props} /> ); diff --git a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts index a53496be2..ecf36e3ea 100644 --- a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts +++ b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts @@ -8,7 +8,7 @@ import type { ShortCodesToEmojiDataKey, } from 'virtual:mastodon-emoji-compressed'; -import { unicodeToFilename } from './unicode_to_filename'; +import { unicodeToFilename } from './unicode_utils'; type UnicodeMapping = Record< FilenameData[number][0], diff --git a/app/javascript/mastodon/features/emoji/emoji_utils.js b/app/javascript/mastodon/features/emoji/emoji_utils.js index c13d25056..75b2acafa 100644 --- a/app/javascript/mastodon/features/emoji/emoji_utils.js +++ b/app/javascript/mastodon/features/emoji/emoji_utils.js @@ -209,50 +209,9 @@ function intersect(a, b) { return uniqA.filter(item => uniqB.indexOf(item) >= 0); } -function deepMerge(a, b) { - let o = {}; - - for (let key in a) { - let originalValue = a[key], - value = originalValue; - - if (Object.hasOwn(b, key)) { - value = b[key]; - } - - if (typeof value === 'object') { - value = deepMerge(originalValue, value); - } - - o[key] = value; - } - - return o; -} - -// https://github.com/sonicdoe/measure-scrollbar -function measureScrollbar() { - const div = document.createElement('div'); - - div.style.width = '100px'; - div.style.height = '100px'; - div.style.overflow = 'scroll'; - div.style.position = 'absolute'; - div.style.top = '-9999px'; - - document.body.appendChild(div); - const scrollbarWidth = div.offsetWidth - div.clientWidth; - document.body.removeChild(div); - - return scrollbarWidth; -} - export { getData, getSanitizedData, uniq, intersect, - deepMerge, - unifiedToNative, - measureScrollbar, }; diff --git a/app/javascript/mastodon/features/emoji/handlers.ts b/app/javascript/mastodon/features/emoji/handlers.ts deleted file mode 100644 index 3b02028f3..000000000 --- a/app/javascript/mastodon/features/emoji/handlers.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { autoPlayGif } from '@/mastodon/initial_state'; - -const PARENT_MAX_DEPTH = 10; - -export function handleAnimateGif(event: MouseEvent) { - // We already check this in ui/index.jsx, but just to be sure. - if (autoPlayGif) { - return; - } - - const { target, type } = event; - const animate = type === 'mouseover'; // Mouse over = animate, mouse out = don't animate. - - if (target instanceof HTMLImageElement) { - setAnimateGif(target, animate); - } else if (!(target instanceof HTMLElement) || target === document.body) { - return; - } - - let parent: HTMLElement | null = null; - let iter = 0; - - if (target.classList.contains('animate-parent')) { - parent = target; - } else { - // Iterate up to PARENT_MAX_DEPTH levels up the DOM tree to find a parent with the class 'animate-parent'. - let current: HTMLElement | null = target; - while (current) { - if (iter >= PARENT_MAX_DEPTH) { - return; // We can just exit right now. - } - current = current.parentElement; - if (current?.classList.contains('animate-parent')) { - parent = current; - break; - } - iter++; - } - } - - // Affect all animated children within the parent. - if (parent) { - const animatedChildren = - parent.querySelectorAll('img.custom-emoji'); - for (const child of animatedChildren) { - setAnimateGif(child, animate); - } - } -} - -function setAnimateGif(image: HTMLImageElement, animate: boolean) { - const { classList, dataset } = image; - if ( - !classList.contains('custom-emoji') || - !dataset.static || - !dataset.original - ) { - return; - } - image.src = animate ? dataset.original : dataset.static; -} diff --git a/app/javascript/mastodon/features/emoji/unicode_to_filename.js b/app/javascript/mastodon/features/emoji/unicode_to_filename.js deleted file mode 100644 index cfe5539c7..000000000 --- a/app/javascript/mastodon/features/emoji/unicode_to_filename.js +++ /dev/null @@ -1,26 +0,0 @@ -// taken from: -// https://github.com/twitter/twemoji/blob/47732c7/twemoji-generator.js#L848-L866 -export const unicodeToFilename = (str) => { - let result = ''; - let charCode = 0; - let p = 0; - let i = 0; - while (i < str.length) { - charCode = str.charCodeAt(i++); - if (p) { - if (result.length > 0) { - result += '-'; - } - result += (0x10000 + ((p - 0xD800) << 10) + (charCode - 0xDC00)).toString(16); - p = 0; - } else if (0xD800 <= charCode && charCode <= 0xDBFF) { - p = charCode; - } else { - if (result.length > 0) { - result += '-'; - } - result += charCode.toString(16); - } - } - return result; -}; diff --git a/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js b/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js deleted file mode 100644 index 15f60aa7c..000000000 --- a/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js +++ /dev/null @@ -1,21 +0,0 @@ -function padLeft(str, num) { - while (str.length < num) { - str = '0' + str; - } - - return str; -} - -export const unicodeToUnifiedName = (str) => { - let output = ''; - - for (let i = 0; i < str.length; i += 2) { - if (i > 0) { - output += '-'; - } - - output += padLeft(str.codePointAt(i).toString(16).toUpperCase(), 4); - } - - return output; -}; diff --git a/app/javascript/mastodon/features/emoji/unicode_utils.ts b/app/javascript/mastodon/features/emoji/unicode_utils.ts new file mode 100644 index 000000000..04175ee9f --- /dev/null +++ b/app/javascript/mastodon/features/emoji/unicode_utils.ts @@ -0,0 +1,43 @@ +// taken from: +// https://github.com/twitter/twemoji/blob/47732c7/twemoji-generator.js#L848-L866 +export function unicodeToFilename(str: string) { + let result = ''; + let charCode = 0; + let p = 0; + let i = 0; + while (i < str.length) { + charCode = str.charCodeAt(i++); + if (p) { + if (result.length > 0) { + result += '-'; + } + result += (0x10000 + ((p - 0xd800) << 10) + (charCode - 0xdc00)).toString( + 16, + ); + p = 0; + } else if (0xd800 <= charCode && charCode <= 0xdbff) { + p = charCode; + } else { + if (result.length > 0) { + result += '-'; + } + result += charCode.toString(16); + } + } + return result; +} + +export function unicodeToUnifiedName(str: string) { + let output = ''; + + for (let i = 0; i < str.length; i += 2) { + if (i > 0) { + output += '-'; + } + + output += + str.codePointAt(i)?.toString(16).toUpperCase().padStart(4, '0') ?? ''; + } + + return output; +} diff --git a/app/javascript/mastodon/features/getting_started/components/announcements.jsx b/app/javascript/mastodon/features/getting_started/components/announcements.jsx deleted file mode 100644 index 96bd995d2..000000000 --- a/app/javascript/mastodon/features/getting_started/components/announcements.jsx +++ /dev/null @@ -1,458 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent, useCallback, useMemo } from 'react'; - -import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl'; - -import classNames from 'classnames'; -import { withRouter } from 'react-router-dom'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - -import { animated, useTransition } from '@react-spring/web'; -import ReactSwipeableViews from 'react-swipeable-views'; - -import elephantUIPlane from '@/images/elephant_ui_plane.svg'; -import AddIcon from '@/material-icons/400-24px/add.svg?react'; -import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; -import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; -import { AnimatedNumber } from 'mastodon/components/animated_number'; -import { Icon } from 'mastodon/components/icon'; -import { IconButton } from 'mastodon/components/icon_button'; -import EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container'; -import { unicodeMapping } from 'mastodon/features/emoji/emoji_unicode_mapping_light'; -import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'mastodon/initial_state'; -import { assetHost } from 'mastodon/utils/config'; -import { WithRouterPropTypes } from 'mastodon/utils/react_router'; - -const messages = defineMessages({ - close: { id: 'lightbox.close', defaultMessage: 'Close' }, - previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, - next: { id: 'lightbox.next', defaultMessage: 'Next' }, -}); - -class ContentWithRouter extends ImmutablePureComponent { - static propTypes = { - announcement: ImmutablePropTypes.map.isRequired, - ...WithRouterPropTypes, - }; - - setRef = c => { - this.node = c; - }; - - componentDidMount () { - this._updateLinks(); - } - - componentDidUpdate () { - this._updateLinks(); - } - - _updateLinks () { - const node = this.node; - - if (!node) { - return; - } - - const links = node.querySelectorAll('a'); - - for (var i = 0; i < links.length; ++i) { - let link = links[i]; - - if (link.classList.contains('status-link')) { - continue; - } - - link.classList.add('status-link'); - - let mention = this.props.announcement.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')); - } 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); - } else { - let status = this.props.announcement.get('statuses').find(item => link.href === item.get('url')); - if (status) { - link.addEventListener('click', this.onStatusClick.bind(this, status), false); - } - link.setAttribute('title', link.href); - link.classList.add('unhandled-link'); - } - - link.setAttribute('target', '_blank'); - link.setAttribute('rel', 'noopener'); - } - } - - 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}`); - } - }; - - onStatusClick = (status, e) => { - if (this.props.history && e.button === 0 && !(e.ctrlKey || e.metaKey)) { - e.preventDefault(); - this.props.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`); - } - }; - - render () { - const { announcement } = this.props; - - return ( -
- ); - } - -} - -const Content = withRouter(ContentWithRouter); - -class Emoji extends PureComponent { - - static propTypes = { - emoji: PropTypes.string.isRequired, - emojiMap: ImmutablePropTypes.map.isRequired, - hovered: PropTypes.bool.isRequired, - }; - - render () { - const { emoji, emojiMap, hovered } = this.props; - - if (unicodeMapping[emoji]) { - const { filename, shortCode } = unicodeMapping[this.props.emoji]; - const title = shortCode ? `:${shortCode}:` : ''; - - return ( - {emoji} - ); - } else if (emojiMap.get(emoji)) { - const filename = (autoPlayGif || hovered) ? emojiMap.getIn([emoji, 'url']) : emojiMap.getIn([emoji, 'static_url']); - const shortCode = `:${emoji}:`; - - return ( - {shortCode} - ); - } else { - return null; - } - } - -} - -class Reaction extends ImmutablePureComponent { - - static propTypes = { - announcementId: PropTypes.string.isRequired, - reaction: ImmutablePropTypes.map.isRequired, - addReaction: PropTypes.func.isRequired, - removeReaction: PropTypes.func.isRequired, - emojiMap: ImmutablePropTypes.map.isRequired, - style: PropTypes.object, - }; - - state = { - hovered: false, - }; - - handleClick = () => { - const { reaction, announcementId, addReaction, removeReaction } = this.props; - - if (reaction.get('me')) { - removeReaction(announcementId, reaction.get('name')); - } else { - addReaction(announcementId, reaction.get('name')); - } - }; - - handleMouseEnter = () => this.setState({ hovered: true }); - - handleMouseLeave = () => this.setState({ hovered: false }); - - render () { - const { reaction } = this.props; - - let shortCode = reaction.get('name'); - - if (unicodeMapping[shortCode]) { - shortCode = unicodeMapping[shortCode].shortCode; - } - - return ( - - - - - - - - - ); - } - -} - -const ReactionsBar = ({ - announcementId, - reactions, - emojiMap, - addReaction, - removeReaction, -}) => { - const visibleReactions = useMemo(() => reactions.filter(x => x.get('count') > 0).toArray(), [reactions]); - - const handleEmojiPick = useCallback((emoji) => { - addReaction(announcementId, emoji.native.replaceAll(/:/g, '')); - }, [addReaction, announcementId]); - - const transitions = useTransition(visibleReactions, { - from: { - scale: 0, - }, - enter: { - scale: 1, - }, - leave: { - scale: 0, - }, - keys: visibleReactions.map(x => x.get('name')), - }); - - return ( -
- {transitions(({ scale }, reaction) => ( - `scale(${s})`) }} - addReaction={addReaction} - removeReaction={removeReaction} - announcementId={announcementId} - emojiMap={emojiMap} - /> - ))} - - {visibleReactions.length < 8 && ( - } - /> - )} -
- ); -}; -ReactionsBar.propTypes = { - announcementId: PropTypes.string.isRequired, - reactions: ImmutablePropTypes.list.isRequired, - addReaction: PropTypes.func.isRequired, - removeReaction: PropTypes.func.isRequired, - emojiMap: ImmutablePropTypes.map.isRequired, -}; - -class Announcement extends ImmutablePureComponent { - - static propTypes = { - announcement: ImmutablePropTypes.map.isRequired, - emojiMap: ImmutablePropTypes.map.isRequired, - addReaction: PropTypes.func.isRequired, - removeReaction: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - selected: PropTypes.bool, - }; - - state = { - unread: !this.props.announcement.get('read'), - }; - - componentDidUpdate () { - const { selected, announcement } = this.props; - if (!selected && this.state.unread !== !announcement.get('read')) { - this.setState({ unread: !announcement.get('read') }); - } - } - - render () { - const { announcement } = this.props; - const { unread } = this.state; - const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at')); - const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at')); - const now = new Date(); - const hasTimeRange = startsAt && endsAt; - const skipTime = announcement.get('all_day'); - - let timestamp = null; - if (hasTimeRange) { - const skipYear = startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear(); - const skipEndDate = startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear(); - timestamp = ( - <> - - - - ); - } else { - const publishedAt = new Date(announcement.get('published_at')); - timestamp = ( - - ); - } - - return ( -
- - - · {timestamp} - - - - - - - {unread && } -
- ); - } - -} - -class Announcements extends ImmutablePureComponent { - - static propTypes = { - announcements: ImmutablePropTypes.list, - emojiMap: ImmutablePropTypes.map.isRequired, - dismissAnnouncement: PropTypes.func.isRequired, - addReaction: PropTypes.func.isRequired, - removeReaction: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - }; - - state = { - index: 0, - }; - - static getDerivedStateFromProps(props, state) { - if (props.announcements.size > 0 && state.index >= props.announcements.size) { - return { index: props.announcements.size - 1 }; - } else { - return null; - } - } - - componentDidMount () { - this._markAnnouncementAsRead(); - } - - componentDidUpdate () { - this._markAnnouncementAsRead(); - } - - _markAnnouncementAsRead () { - const { dismissAnnouncement, announcements } = this.props; - const { index } = this.state; - const announcement = announcements.get(announcements.size - 1 - index); - if (!announcement.get('read')) dismissAnnouncement(announcement.get('id')); - } - - handleChangeIndex = index => { - this.setState({ index: index % this.props.announcements.size }); - }; - - handleNextClick = () => { - this.setState({ index: (this.state.index + 1) % this.props.announcements.size }); - }; - - handlePrevClick = () => { - this.setState({ index: (this.props.announcements.size + this.state.index - 1) % this.props.announcements.size }); - }; - - render () { - const { announcements, intl } = this.props; - const { index } = this.state; - - if (announcements.isEmpty()) { - return null; - } - - return ( -
- - -
- - {announcements.map((announcement, idx) => ( - - )).reverse()} - - - {announcements.size > 1 && ( -
- - {index + 1} / {announcements.size} - -
- )} -
-
- ); - } - -} - -export default injectIntl(Announcements); diff --git a/app/javascript/mastodon/features/getting_started/containers/announcements_container.js b/app/javascript/mastodon/features/getting_started/containers/announcements_container.js deleted file mode 100644 index 3bb1b8e8d..000000000 --- a/app/javascript/mastodon/features/getting_started/containers/announcements_container.js +++ /dev/null @@ -1,23 +0,0 @@ -import { createSelector } from '@reduxjs/toolkit'; -import { Map as ImmutableMap } from 'immutable'; -import { connect } from 'react-redux'; - - -import { addReaction, removeReaction, dismissAnnouncement } from 'mastodon/actions/announcements'; - -import Announcements from '../components/announcements'; - -const customEmojiMap = createSelector([state => state.get('custom_emojis')], items => items.reduce((map, emoji) => map.set(emoji.get('shortcode'), emoji), ImmutableMap())); - -const mapStateToProps = state => ({ - announcements: state.getIn(['announcements', 'items']), - emojiMap: customEmojiMap(state), -}); - -const mapDispatchToProps = dispatch => ({ - dismissAnnouncement: id => dispatch(dismissAnnouncement(id)), - addReaction: (id, name) => dispatch(addReaction(id, name)), - removeReaction: (id, name) => dispatch(removeReaction(id, name)), -}); - -export default connect(mapStateToProps, mapDispatchToProps)(Announcements); diff --git a/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx b/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx index 8c7c70484..335e0f1a3 100644 --- a/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx +++ b/app/javascript/mastodon/features/home_timeline/components/announcements/index.tsx @@ -10,10 +10,8 @@ import ReactSwipeableViews from 'react-swipeable-views'; import elephantUIPlane from '@/images/elephant_ui_plane.svg'; import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; import { IconButton } from '@/mastodon/components/icon_button'; -import LegacyAnnouncements from '@/mastodon/features/getting_started/containers/announcements_container'; import { mascot, reduceMotion } from '@/mastodon/initial_state'; import { createAppSelector, useAppSelector } from '@/mastodon/store'; -import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; @@ -32,7 +30,7 @@ const announcementSelector = createAppSelector( (announcements.get('items')?.toJS() as IAnnouncement[] | undefined) ?? [], ); -export const ModernAnnouncements: FC = () => { +export const Announcements: FC = () => { const intl = useIntl(); const announcements = useAppSelector(announcementSelector); @@ -112,7 +110,3 @@ export const ModernAnnouncements: FC = () => {
); }; - -export const Announcements = isModernEmojiEnabled() - ? ModernAnnouncements - : LegacyAnnouncements; diff --git a/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx b/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx index 1d1b684b8..9e7f66d11 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/embedded_status_content.tsx @@ -1,47 +1,17 @@ import { useCallback, useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; - import type { List } from 'immutable'; -import type { History } from 'history'; - -import type { ApiMentionJSON } from '@/mastodon/api_types/statuses'; import { EmojiHTML } from '@/mastodon/components/emoji/html'; import { useElementHandledLink } from '@/mastodon/components/status/handled_link'; import type { Status } from '@/mastodon/models/status'; -import { isModernEmojiEnabled } from '@/mastodon/utils/environment'; import type { Mention } from './embedded_status'; -const handleMentionClick = ( - history: History, - mention: ApiMentionJSON, - e: MouseEvent, -) => { - if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { - e.preventDefault(); - history.push(`/@${mention.acct}`); - } -}; - -const handleHashtagClick = ( - history: History, - hashtag: string, - e: MouseEvent, -) => { - if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { - e.preventDefault(); - history.push(`/tags/${hashtag.replace(/^#/, '')}`); - } -}; - export const EmbeddedStatusContent: React.FC<{ status: Status; className?: string; }> = ({ status, className }) => { - const history = useHistory(); - const mentions = useMemo( () => (status.get('mentions') as List).toJS(), [status], @@ -57,55 +27,10 @@ export const EmbeddedStatusContent: React.FC<{ hrefToMention, }); - const handleContentRef = useCallback( - (node: HTMLDivElement | null) => { - if (!node || isModernEmojiEnabled()) { - return; - } - - const links = node.querySelectorAll('a'); - - for (const link of links) { - if (link.classList.contains('status-link')) { - continue; - } - - link.classList.add('status-link'); - - const mention = mentions.find((item) => link.href === item.url); - - if (mention) { - link.addEventListener( - 'click', - handleMentionClick.bind(null, history, mention), - false, - ); - link.setAttribute('title', `@${mention.acct}`); - link.setAttribute('href', `/@${mention.acct}`); - } else if ( - link.textContent.startsWith('#') || - link.previousSibling?.textContent?.endsWith('#') - ) { - link.addEventListener( - 'click', - handleHashtagClick.bind(null, history, link.text), - false, - ); - link.setAttribute('href', `/tags/${link.text.replace(/^#/, '')}`); - } else { - link.setAttribute('title', link.href); - link.classList.add('unhandled-link'); - } - } - }, - [mentions, history], - ); - return ( diff --git a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx index f26044426..ae4c4ed4f 100644 --- a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx @@ -14,7 +14,6 @@ import { IconButton } from 'mastodon/components/icon_button'; import InlineAccount from 'mastodon/components/inline_account'; import MediaAttachments from 'mastodon/components/media_attachments'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; -import emojify from 'mastodon/features/emoji/emoji'; import { EmojiHTML } from '@/mastodon/components/emoji/html'; import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; @@ -48,13 +47,8 @@ class CompareHistoryModal extends PureComponent { const { index, versions, language, onClose } = this.props; const currentVersion = versions.get(index); - const emojiMap = currentVersion.get('emojis').reduce((obj, emoji) => { - obj[`:${emoji.get('shortcode')}:`] = emoji.toJS(); - return obj; - }, {}); - - const content = emojify(currentVersion.get('content'), emojiMap); - const spoilerContent = emojify(escapeTextContentForBrowser(currentVersion.get('spoiler_text')), emojiMap); + const content = currentVersion.get('content'); + const spoilerContent = escapeTextContentForBrowser(currentVersion.get('spoiler_text')); const formattedDate = ; const formattedName = ; @@ -99,7 +93,7 @@ class CompareHistoryModal extends PureComponent { diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index f53870a31..209e4b4a8 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -22,12 +22,11 @@ import { identityContextPropShape, withIdentity } from 'mastodon/identity_contex import { layoutFromWindow } from 'mastodon/is_mobile'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; -import { handleAnimateGif } from '../emoji/handlers'; import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose'; import { clearHeight } from '../../actions/height_cache'; import { fetchServer, fetchServerTranslationLanguages } from '../../actions/server'; import { expandHomeTimeline } from '../../actions/timelines'; -import { initialState, me, owner, singleUserMode, trendsEnabled, landingPage, localLiveFeedAccess, disableHoverCards, autoPlayGif } from '../../initial_state'; +import { initialState, me, owner, singleUserMode, trendsEnabled, landingPage, localLiveFeedAccess, disableHoverCards } from '../../initial_state'; import BundleColumnError from './components/bundle_column_error'; import { NavigationBar } from './components/navigation_bar'; @@ -382,11 +381,6 @@ class UI extends PureComponent { window.addEventListener('beforeunload', this.handleBeforeUnload, false); window.addEventListener('resize', this.handleResize, { passive: true }); - if (!autoPlayGif) { - window.addEventListener('mouseover', handleAnimateGif, { passive: true }); - window.addEventListener('mouseout', handleAnimateGif, { passive: true }); - } - document.addEventListener('dragenter', this.handleDragEnter, false); document.addEventListener('dragover', this.handleDragOver, false); document.addEventListener('drop', this.handleDrop, false); @@ -412,8 +406,6 @@ class UI extends PureComponent { window.removeEventListener('blur', this.handleWindowBlur); window.removeEventListener('beforeunload', this.handleBeforeUnload); window.removeEventListener('resize', this.handleResize); - window.removeEventListener('mouseover', handleAnimateGif); - window.removeEventListener('mouseout', handleAnimateGif); document.removeEventListener('dragenter', this.handleDragEnter); document.removeEventListener('dragover', this.handleDragOver); diff --git a/app/javascript/mastodon/hooks/useLinks.ts b/app/javascript/mastodon/hooks/useLinks.ts deleted file mode 100644 index 77609181b..000000000 --- a/app/javascript/mastodon/hooks/useLinks.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { useCallback } from 'react'; - -import { useHistory } from 'react-router-dom'; - -import { isFulfilled, isRejected } from '@reduxjs/toolkit'; - -import { openURL } from 'mastodon/actions/search'; -import { useAppDispatch } from 'mastodon/store'; - -import { isModernEmojiEnabled } from '../utils/environment'; - -const isMentionClick = (element: HTMLAnchorElement) => - element.classList.contains('mention') && - !element.classList.contains('hashtag'); - -const isHashtagClick = (element: HTMLAnchorElement) => - element.textContent.startsWith('#') || - element.previousSibling?.textContent?.endsWith('#'); - -export const useLinks = (skipHashtags?: boolean) => { - const history = useHistory(); - const dispatch = useAppDispatch(); - - const handleHashtagClick = useCallback( - (element: HTMLAnchorElement) => { - const { textContent } = element; - - if (!textContent) return; - - history.push(`/tags/${textContent.replace(/^#/, '')}`); - }, - [history], - ); - - const handleMentionClick = useCallback( - async (element: HTMLAnchorElement) => { - const result = await dispatch(openURL({ url: element.href })); - - if (isFulfilled(result)) { - if (result.payload.accounts[0]) { - history.push(`/@${result.payload.accounts[0].acct}`); - } else if (result.payload.statuses[0]) { - history.push( - `/@${result.payload.statuses[0].account.acct}/${result.payload.statuses[0].id}`, - ); - } else { - window.location.href = element.href; - } - } else if (isRejected(result)) { - window.location.href = element.href; - } - }, - [dispatch, history], - ); - - const handleClick = useCallback( - (e: React.MouseEvent) => { - // Exit early if modern emoji is enabled, as this is handled by HandledLink. - if (isModernEmojiEnabled()) { - return; - } - - const target = (e.target as HTMLElement).closest('a'); - - if (!target || e.button !== 0 || e.ctrlKey || e.metaKey) { - return; - } - - if (isMentionClick(target)) { - e.preventDefault(); - void handleMentionClick(target); - } else if (isHashtagClick(target) && !skipHashtags) { - e.preventDefault(); - handleHashtagClick(target); - } - }, - [skipHashtags, handleMentionClick, handleHashtagClick], - ); - - return handleClick; -}; 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/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/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts index aa125b092..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'; +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/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index d562d9068..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 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 From 2b5f6838ed0322d95ae28df9b0422f5c398fa638 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:59:21 +0000 Subject: [PATCH 43/90] Update dependency annotaterb to v4.20.0 (#36527) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3904ed099..7493732be 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) From 422fa1cf9f1224444579672b678e54b5aef88458 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Tue, 28 Oct 2025 13:36:22 +0100 Subject: [PATCH 44/90] Revert "Fix custom emoji width (#27969)" (#36620) --- app/javascript/styles/mastodon/components.scss | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d403a33e1..1b851803c 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1101,7 +1101,8 @@ font-size: inherit; vertical-align: middle; object-fit: contain; - margin: -0.2ex 0.15em 0; + margin: -0.2ex 0.15em 0.2ex; + width: 16px; height: 16px; img { @@ -1143,6 +1144,7 @@ } .emojione { + width: 20px; height: 20px; margin: -3px 0 0; } @@ -1365,6 +1367,7 @@ overflow-y: auto; .emojione { + width: 20px; height: 20px; margin: -3px 0 0; } @@ -1791,6 +1794,7 @@ line-height: 24px; .emojione { + width: 24px; height: 24px; margin: -1px 0 0; } @@ -7085,6 +7089,7 @@ a.status-card { line-height: 24px; .emojione { + width: 24px; height: 24px; margin: -1px 0 0; } @@ -8416,6 +8421,7 @@ noscript { margin-bottom: 16px; .emojione { + width: 22px; height: 22px; } From ccfac2716d29cc46d80006c06c0b148f815c2dba Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 28 Oct 2025 14:23:05 +0100 Subject: [PATCH 45/90] Add streaming server side filtering for live/topic feed settings (#36585) --- streaming/index.js | 127 +++++++++++++++++++++++++++++---------------- 1 file changed, 81 insertions(+), 46 deletions(-) diff --git a/streaming/index.js b/streaming/index.js index 952b4584a..113eabc03 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -19,6 +19,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'; @@ -44,6 +45,7 @@ initializeLogLevel(process.env, environment); * @property {string[]} scopes * @property {string} accountId * @property {string[]} chosenLanguages + * @property {number} permissions */ @@ -351,7 +353,7 @@ const startServer = async () => { * @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'); @@ -367,6 +369,7 @@ 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, }; }; @@ -583,6 +586,41 @@ 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 @@ -590,10 +628,13 @@ const startServer = async () => { * @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`); /** @@ -641,6 +682,12 @@ 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})`); @@ -946,7 +993,7 @@ const startServer = async () => { const onEnd = streamHttpEnd(req, subscriptionHeartbeat(channelIds)); // @ts-ignore - streamFrom(channelIds, req, req.log, onSend, onEnd, 'eventsource', options.needsFiltering); + streamFrom(channelIds, req, req.log, onSend, onEnd, 'eventsource', options); }).catch(err => { const {statusCode, errorMessage } = extractErrorStatusAndMessage(err); @@ -982,9 +1029,25 @@ const startServer = async () => { * @param {any} 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) => { + /** + * @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({ @@ -1001,46 +1064,22 @@ const startServer = async () => { break; case 'public': - resolve({ - channelIds: ['timeline:public'], - options: { needsFiltering: true }, - }); - + resolveFeed('public', 'timeline:public', { needsFiltering: true }); break; case 'public:local': - resolve({ - channelIds: ['timeline:public:local'], - options: { needsFiltering: true }, - }); - + resolveFeed('public', 'timeline:public:local', { needsFiltering: true }); break; case 'public:remote': - resolve({ - channelIds: ['timeline:public:remote'], - options: { needsFiltering: true }, - }); - + resolveFeed('public', 'timeline:public:remote', { needsFiltering: true }); break; case 'public:media': - resolve({ - channelIds: ['timeline:public:media'], - options: { needsFiltering: true }, - }); - + resolveFeed('public', 'timeline:public:media', { needsFiltering: true }); break; case 'public:local:media': - resolve({ - channelIds: ['timeline:public:local:media'], - options: { needsFiltering: true }, - }); - + resolveFeed('public', 'timeline:public:local:media', { needsFiltering: true }); break; case 'public:remote:media': - resolve({ - channelIds: ['timeline:public:remote:media'], - options: { needsFiltering: true }, - }); - + resolveFeed('public', 'timeline:public:remote:media', { needsFiltering: true }); break; case 'direct': resolve({ @@ -1052,24 +1091,20 @@ const startServer = async () => { case 'hashtag': if (!params.tag) { reject(new RequestError('Missing tag name parameter')); - } else { - resolve({ - channelIds: [`timeline:hashtag:${normalizeHashtag(params.tag)}`], - options: { needsFiltering: true }, - }); + return; } + resolveFeed('hashtag', `timeline:hashtag:${normalizeHashtag(params.tag)}`, { 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 }, - }); + return; } + resolveFeed('hashtag', `timeline:hashtag:${normalizeHashtag(params.tag)}:local`, { needsFiltering: true }); + break; case 'list': if (!params.list) { @@ -1132,7 +1167,7 @@ const startServer = async () => { const onSend = streamToWs(request, websocket, streamNameFromChannelName(channelName, params)); const stopHeartbeat = subscriptionHeartbeat(channelIds); - const listener = streamFrom(channelIds, request, logger, onSend, undefined, 'websocket', options.needsFiltering); + const listener = streamFrom(channelIds, request, logger, onSend, undefined, 'websocket', options); metrics.connectedChannels.labels({ type: 'websocket', channel: channelName }).inc(); From 3cace4098ad512f2f098dedf4bacd2adfc6f86ea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:23:32 +0000 Subject: [PATCH 46/90] Update dependency devise-two-factor to v6.2.0 (#36574) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7493732be..2a0da53d4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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.1) erubi (1.13.1) et-orbi (1.4.0) tzinfo @@ -706,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) From 1f5cdb30c79abca600c183ee53f345e7ea1a3fbe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:23:38 +0000 Subject: [PATCH 47/90] Update dependency @vitejs/plugin-react to v5.1.0 (#36600) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index de2d35bec..9f7e83b68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3398,10 +3398,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 @@ -4886,18 +4886,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 @@ -11302,10 +11302,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 From 3efc747be39f38bf720f20094015bb2ac92127b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:26:05 +0000 Subject: [PATCH 48/90] Update dependency axios to v1.13.0 (#36612) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9f7e83b68..ec4f2cd62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5457,13 +5457,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.12.2 - resolution: "axios@npm:1.12.2" + version: 1.13.0 + resolution: "axios@npm:1.13.0" 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/2af09f8ad9db9565bf97055eb0ddd2fd4abd9a03d23157b409348c9589370a88c3ede02e11fd1268becb780a77b62bdf9488650dd7208eda57edceca1d65622e languageName: node linkType: hard From 9c7d09993d8cc1e3b54c4bb8839bcbc3a778b342 Mon Sep 17 00:00:00 2001 From: Echo Date: Tue, 28 Oct 2025 15:02:37 +0100 Subject: [PATCH 49/90] Fix props in DisplayName component (#36622) --- .../components/display_name/display_name.stories.tsx | 2 +- .../mastodon/components/display_name/no-domain.tsx | 5 ++--- app/javascript/mastodon/components/display_name/simple.tsx | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) 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; } From 8fb524e07fc72ac52b465616e1206867d402aa2b Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 28 Oct 2025 15:05:14 +0100 Subject: [PATCH 50/90] Add support for `Update` of converted object types (#36322) --- app/lib/activitypub/activity/create.rb | 18 +--- app/lib/activitypub/activity/update.rb | 4 +- app/lib/activitypub/parser/status_parser.rb | 21 +++++ .../process_status_update_service.rb | 7 +- spec/lib/activitypub/activity/update_spec.rb | 85 ++++++++++++++++++- 5 files changed, 108 insertions(+), 27 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 3d52c9a56..43c7bb1fe 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/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index 7e2673425..1cdf0b483 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 @@ -351,7 +350,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/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 From 3ccb6632f28999b159a23cea23c029fcd68552e4 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 28 Oct 2025 15:05:39 +0100 Subject: [PATCH 51/90] Fix mention matching ignoring path (#36626) --- app/javascript/mastodon/components/status_content.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 81396bb85..9ff672079 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -75,7 +75,7 @@ const compareUrls = (href1, href2) => { const url1 = new URL(href1); const url2 = new URL(href2); - return url1.origin === url2.origin && url1.path === url2.path && url1.search === url2.search; + return url1.origin === url2.origin && url1.pathname === url2.pathname && url1.search === url2.search; } catch { return false; } From b01d21c4d48b9b508f64a191cc94a3d41c21ef40 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 28 Oct 2025 15:26:08 +0100 Subject: [PATCH 52/90] Hashtag fixes (#36625) --- app/javascript/mastodon/components/status/handled_link.tsx | 7 ++++++- app/models/tag.rb | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/status/handled_link.tsx b/app/javascript/mastodon/components/status/handled_link.tsx index 59305d573..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 ( Date: Tue, 28 Oct 2025 15:45:46 +0100 Subject: [PATCH 53/90] Change styling of column banners (#36531) --- app/javascript/styles/mastodon/components.scss | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 1b851803c..0ef95b014 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4031,6 +4031,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 +4042,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 +5224,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 +5263,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 { From e1bd9b944a9b2f12aec7d2222efe449417a8c186 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Tue, 28 Oct 2025 16:17:33 +0100 Subject: [PATCH 54/90] chore(deps): update dependency eslint-plugin-jsdoc to v60 (#36466) --- app/javascript/mastodon/actions/streaming.js | 37 ++++-- app/javascript/mastodon/stream.js | 12 +- package.json | 2 +- streaming/database.js | 2 +- streaming/index.js | 124 ++++++++++++------- streaming/logging.js | 2 +- streaming/redis.js | 1 + streaming/utils.js | 8 +- yarn.lock | 70 ++++++++--- 9 files changed, 177 insertions(+), 81 deletions(-) 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/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/package.json b/package.json index 16095441d..ae482f478 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/streaming/database.js b/streaming/database.js index 553c9149c..9dd7a97cf 100644 --- a/streaming/database.js +++ b/streaming/database.js @@ -65,7 +65,7 @@ export function configFromEnv(env, environment) { if (typeof parsedUrl.ssl === 'boolean') { baseConfig.ssl = parsedUrl.ssl; } else if (typeof parsedUrl.ssl === 'object' && !Array.isArray(parsedUrl.ssl) && parsedUrl.ssl !== null) { - /** @type {Record} */ + /** @type {Record} */ const sslOptions = parsedUrl.ssl; baseConfig.ssl = {}; diff --git a/streaming/index.js b/streaming/index.js index 113eabc03..637baf21a 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -48,14 +48,25 @@ initializeLogLevel(process.env, environment); * @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 { @@ -172,6 +183,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 @@ -222,7 +234,7 @@ const startServer = async () => { }); /** - * @type {Object.): void>>} + * @type {Object.): void>>} */ const subs = {}; @@ -340,7 +352,7 @@ const startServer = async () => { }; /** - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {string[]} necessaryScopes * @returns {boolean} */ @@ -349,7 +361,7 @@ const startServer = async () => { /** * @param {string} token - * @param {any} req + * @param {Request} req * @returns {Promise} */ const accountFromToken = async (token, req) => { @@ -374,13 +386,13 @@ const startServer = async () => { }; /** - * @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 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')); @@ -389,11 +401,12 @@ const startServer = async () => { const token = authorization ? authorization.replace(/^Bearer /, '') : accessToken; + // @ts-expect-error resolve(accountFromToken(token, req)); }); /** - * @param {any} req + * @param {Request} req * @returns {string|undefined} */ const channelNameFromPath = req => { @@ -425,7 +438,7 @@ const startServer = async () => { }; /** - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {import('pino').Logger} logger * @param {string|undefined} channelName * @returns {Promise.} @@ -463,7 +476,7 @@ const startServer = async () => { */ /** - * @param {any} req + * @param {Request} req * @param {SystemMessageHandlers} eventHandlers * @returns {SubscriptionListener} */ @@ -488,7 +501,7 @@ const startServer = async () => { }; /** - * @param {http.IncomingMessage & ResolvedAccount} req + * @param {Request} req * @param {http.OutgoingMessage} res */ const subscribeHttpToSystemChannel = (req, res) => { @@ -515,8 +528,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) => { @@ -545,8 +558,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) => { @@ -564,16 +577,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(', '); /** * @param {string} listId - * @param {any} req + * @param {Request} req * @returns {Promise.} */ const authorizeListAccess = async (listId, req) => { @@ -623,7 +635,7 @@ const startServer = async () => { /** * @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 @@ -675,6 +687,7 @@ const startServer = async () => { // The channels that need filtering are determined in the function // `channelNameToIds` defined below: if (!needsFiltering || (event !== 'update' && event !== 'status.update')) { + // @ts-expect-error transmit(event, payload); return; } @@ -689,7 +702,9 @@ const startServer = async () => { } // Filter based on 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; } @@ -701,8 +716,9 @@ const startServer = async () => { } // Filter based on domain blocks, blocks, mutes, or custom filters: - // @ts-ignore + // @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 @@ -713,7 +729,7 @@ const startServer = async () => { } const queries = [ - // @ts-ignore + // @ts-expect-error client.query(`SELECT 1 FROM blocks WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) @@ -722,17 +738,19 @@ 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 + // @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 + // @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])); } @@ -741,6 +759,7 @@ const startServer = async () => { // 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; } @@ -757,9 +776,9 @@ const startServer = async () => { // 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]); @@ -789,9 +808,9 @@ const startServer = async () => { // 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 + // @ts-expect-error Object.keys(req.cachedFilters).forEach((key) => { - // @ts-ignore + // @ts-expect-error req.cachedFilters[key].regexp = new RegExp(req.cachedFilters[key].keywords.map(([keyword, whole_word]) => { let expr = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); @@ -812,16 +831,14 @@ 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 + // @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) { @@ -881,8 +898,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) => { @@ -924,7 +941,7 @@ const startServer = async () => { }; /** - * @param {any} req + * @param {Request} req * @param {function(): void} [closeHandler] * @returns {function(string[], SubscriptionListener): void} */ @@ -974,10 +991,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 @@ -988,8 +1008,11 @@ const startServer = async () => { return; } + // @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 @@ -1012,7 +1035,7 @@ const startServer = async () => { */ /** - * @param {any} req + * @param {Request} req * @returns {string[]} */ const channelsForUserStream = req => { @@ -1026,7 +1049,7 @@ const startServer = async () => { }; /** - * @param {any} req + * @param {Request} req * @param {string} name * @param {StreamParams} params * @returns {Promise.<{ channelIds: string[], options: { needsFiltering: boolean, filterLocal?: boolean, filterRemote?: boolean } }>} @@ -1145,7 +1168,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 */ @@ -1271,7 +1294,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) { @@ -1338,9 +1361,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 } @@ -1360,13 +1393,13 @@ const startServer = async () => { setInterval(() => { wss.clients.forEach(ws => { - // @ts-ignore + // @ts-expect-error if (ws.isAlive === false) { ws.terminate(); return; } - // @ts-ignore + // @ts-expect-error ws.isAlive = false; ws.ping('', false); }); @@ -1396,14 +1429,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()); } }); @@ -1418,6 +1453,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 040246fda..e8f28c0f9 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/yarn.lock b/yarn.lock index ec4f2cd62..e74f1029e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2054,16 +2054,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 @@ -2857,7 +2857,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" @@ -4657,13 +4657,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, @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.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" @@ -6368,7 +6375,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: @@ -7135,23 +7142,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 @@ -8159,6 +8168,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" @@ -8908,10 +8924,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 @@ -9867,6 +9883,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" @@ -13387,6 +13412,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" From 795aaa14bfdeba5e63ca1d397b51dfa67b111833 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 28 Oct 2025 16:58:18 +0100 Subject: [PATCH 55/90] Remove environment variables to config Fetch All Replies behaviour (#36627) --- .env.production.sample | 18 ------------------ .../concerns/status/fetch_replies_concern.rb | 6 ++++-- .../activitypub/fetch_all_replies_service.rb | 4 ++-- .../activitypub/fetch_all_replies_worker.rb | 7 ++++--- 4 files changed, 10 insertions(+), 25 deletions(-) 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/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/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/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']) From 4896d2c4c6d3bd6b878c5a075b6611c65d4203b2 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 28 Oct 2025 17:59:37 +0100 Subject: [PATCH 56/90] Change firehose labels depending on which feeds are accessible (#36607) --- .../mastodon/features/firehose/index.jsx | 20 ++++++++++++++++++- .../features/navigation_panel/index.tsx | 11 +++++++++- app/javascript/mastodon/locales/en.json | 2 ++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/firehose/index.jsx b/app/javascript/mastodon/features/firehose/index.jsx index 91704f123..ca3dd7ce3 100644 --- a/app/javascript/mastodon/features/firehose/index.jsx +++ b/app/javascript/mastodon/features/firehose/index.jsx @@ -24,6 +24,14 @@ import StatusListContainer from '../ui/containers/status_list_container'; const messages = defineMessages({ title: { id: 'column.firehose', defaultMessage: 'Live feeds' }, + title_local: { + id: 'column.firehose_local', + defaultMessage: 'Live feed for this server', + }, + title_singular: { + id: 'column.firehose_singular', + defaultMessage: 'Live feed', + }, }); const ColumnSettings = () => { @@ -161,13 +169,23 @@ const Firehose = ({ feedType, multiColumn }) => { /> ); + let title; + + if (canViewFeed(signedIn, permissions, localLiveFeedAccess) && canViewFeed(signedIn, permissions, remoteLiveFeedAccess)) { + title = messages.title; + } else if (canViewFeed(signedIn, permissions, localLiveFeedAccess)) { + title = messages.title_local; + } else { + title = messages.title_singular; + } + return ( = ({ icon='globe' iconComponent={PublicIcon} isActive={isFirehoseActive} - text={intl.formatMessage(messages.firehose)} + text={intl.formatMessage( + canViewFeed(signedIn, permissions, localLiveFeedAccess) && + canViewFeed(signedIn, permissions, remoteLiveFeedAccess) + ? messages.firehose + : messages.firehose_singular, + )} /> )} diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 12fb8f434..f20bae291 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -173,6 +173,8 @@ "column.edit_list": "Edit list", "column.favourites": "Favorites", "column.firehose": "Live feeds", + "column.firehose_local": "Live feed for this server", + "column.firehose_singular": "Live feed", "column.follow_requests": "Follow requests", "column.home": "Home", "column.list_members": "Manage list members", From e437bb919f6938992d4c0634c8491659e5c913aa Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 29 Oct 2025 10:13:12 +0100 Subject: [PATCH 57/90] Change display of blocked and muted quoted users (#36619) --- .../mastodon/components/status_quoted.tsx | 77 ++++++++++++++++++- app/javascript/mastodon/locales/en.json | 3 + app/lib/status_cache_hydrator.rb | 10 +-- app/lib/status_filter.rb | 16 +++- app/serializers/rest/base_quote_serializer.rb | 5 +- 5 files changed, 98 insertions(+), 13 deletions(-) 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/locales/en.json b/app/javascript/mastodon/locales/en.json index f20bae291..0481eb7c0 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -911,9 +911,12 @@ "status.pin": "Pin on profile", "status.quote": "Quote", "status.quote.cancel": "Cancel quote", + "status.quote_error.blocked_account_hint.title": "This post is hidden because you've blocked @{name}.", + "status.quote_error.blocked_domain_hint.title": "This post is hidden because you've blocked {domain}.", "status.quote_error.filtered": "Hidden due to one of your filters", "status.quote_error.limited_account_hint.action": "Show anyway", "status.quote_error.limited_account_hint.title": "This account has been hidden by the moderators of {domain}.", + "status.quote_error.muted_account_hint.title": "This post is hidden because you've muted @{name}.", "status.quote_error.not_available": "Post unavailable", "status.quote_error.pending_approval": "Post pending", "status.quote_error.pending_approval_popout.body": "On Mastodon, you can control whether someone can quote you. This post is pending while we're getting the original author's approval.", diff --git a/app/lib/status_cache_hydrator.rb b/app/lib/status_cache_hydrator.rb index b6a5e3705..be425e129 100644 --- a/app/lib/status_cache_hydrator.rb +++ b/app/lib/status_cache_hydrator.rb @@ -98,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/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 From 7b66eefd3e4acc7eb8d5019923fe5b31dbf8fc2d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 11:13:42 +0100 Subject: [PATCH 58/90] New Crowdin Translations (automated) (#36632) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 2 + app/javascript/mastodon/locales/bg.json | 2 + app/javascript/mastodon/locales/da.json | 2 + app/javascript/mastodon/locales/el.json | 2 + app/javascript/mastodon/locales/es-AR.json | 2 + app/javascript/mastodon/locales/es-MX.json | 2 + app/javascript/mastodon/locales/es.json | 2 + app/javascript/mastodon/locales/fi.json | 5 +- app/javascript/mastodon/locales/he.json | 2 + app/javascript/mastodon/locales/is.json | 2 + app/javascript/mastodon/locales/ko.json | 28 +++++++++ app/javascript/mastodon/locales/lad.json | 10 ++++ app/javascript/mastodon/locales/nl.json | 2 + app/javascript/mastodon/locales/oc.json | 69 ++++++++++++++++++++++ app/javascript/mastodon/locales/pt-PT.json | 2 + app/javascript/mastodon/locales/vi.json | 2 + app/javascript/mastodon/locales/zh-TW.json | 2 + config/locales/devise.ko.yml | 1 + config/locales/es-AR.yml | 4 +- config/locales/fi.yml | 9 +++ config/locales/gl.yml | 5 ++ config/locales/ko.yml | 32 ++++++++++ config/locales/lad.yml | 21 +++++++ config/locales/simple_form.es-AR.yml | 4 +- config/locales/simple_form.fi.yml | 3 + config/locales/simple_form.gl.yml | 2 + config/locales/simple_form.is.yml | 1 + config/locales/simple_form.ko.yml | 13 ++++ config/locales/simple_form.lad.yml | 1 + 29 files changed, 229 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index d54348779..d257ed9f4 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.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": "Кіраванне ўдзельнікамі спіса", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index c7e102aac..88df24cbb 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -978,6 +978,8 @@ "visibility_modal.button_title": "Задаване на видимост", "visibility_modal.header": "Видимост и взаимодействие", "visibility_modal.helper.privacy_editing": "Видимостта не може да се променя след публикуване на публикацията.", + "visibility_modal.helper.privacy_private_self_quote": "Самоцитирането на частни публикации не може да се огласява публично.", + "visibility_modal.instructions": "Управлява кой може да взаимодейства с тази публикация. Може също да приложите настройките за всички бъдещи публикации, навигирайки към Предпочитания > Публикуване по подразбиране.", "visibility_modal.privacy_label": "Видимост", "visibility_modal.quote_followers": "Само последователи", "visibility_modal.quote_label": "Кой може да цитира", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 66e30e47b..0e7733196 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -173,6 +173,8 @@ "column.edit_list": "Redigér liste", "column.favourites": "Favoritter", "column.firehose": "Live feeds", + "column.firehose_local": "Live feed for denne server", + "column.firehose_singular": "Live feed", "column.follow_requests": "Følgeanmodninger", "column.home": "Hjem", "column.list_members": "Håndtér listemedlemmer", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 93c35f646..62e3467a9 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.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": "Διαχείριση μελών λίστας", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 11316799f..bc07edbd7 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -173,6 +173,8 @@ "column.edit_list": "Editar lista", "column.favourites": "Favoritos", "column.firehose": "Líneas temporales en vivo", + "column.firehose_local": "Línea temporal en vivo para este servidor", + "column.firehose_singular": "Línea temporal en vivo", "column.follow_requests": "Solicitudes de seguimiento", "column.home": "Principal", "column.list_members": "Administrar miembros de la lista", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index b6444b4bd..b340851d0 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -173,6 +173,8 @@ "column.edit_list": "Editar lista", "column.favourites": "Favoritos", "column.firehose": "Cronologías", + "column.firehose_local": "Cronología para este servidor", + "column.firehose_singular": "Cronología", "column.follow_requests": "Solicitudes de seguimiento", "column.home": "Inicio", "column.list_members": "Administrar miembros de la lista", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index a1136f71a..77d0f9f93 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -173,6 +173,8 @@ "column.edit_list": "Editar lista", "column.favourites": "Favoritos", "column.firehose": "Cronologías", + "column.firehose_local": "Cronología para este servidor", + "column.firehose_singular": "Cronología", "column.follow_requests": "Solicitudes de seguimiento", "column.home": "Inicio", "column.list_members": "Administrar miembros de la lista", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 94fd2f982..3e73a6e75 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -3,7 +3,7 @@ "about.contact": "Yhteydenotto:", "about.default_locale": "Oletus", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", - "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", + "about.domain_blocks.no_reason_available": "Syytä ei ole ilmoitettu", "about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.", "about.domain_blocks.silenced.title": "Rajoitettu", @@ -173,6 +173,8 @@ "column.edit_list": "Muokkaa listaa", "column.favourites": "Suosikit", "column.firehose": "Livesyötteet", + "column.firehose_local": "Tämän palvelimen livesyöte", + "column.firehose_singular": "Livesyöte", "column.follow_requests": "Seurantapyynnöt", "column.home": "Koti", "column.list_members": "Hallitse listan jäseniä", @@ -333,6 +335,7 @@ "empty_column.bookmarked_statuses": "Et ole vielä lisännyt julkaisuja kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.", "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!", "empty_column.direct": "Yksityismainintoja ei vielä ole. Jos lähetät tai sinulle lähetetään sellaisia, näet ne täällä.", + "empty_column.disabled_feed": "Palvelimen ylläpito on poistanut käytöstä tämän syötteen.", "empty_column.domain_blocks": "Verkkotunnuksia ei ole vielä estetty.", "empty_column.explore_statuses": "Mikään ei ole nyt suosittua. Tarkista myöhemmin uudelleen!", "empty_column.favourited_statuses": "Sinulla ei ole vielä yhtään suosikkijulkaisua. Kun lisäät sellaisen, näkyy se tässä.", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index f99ad99f4..47f4ee914 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.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": "ניהול חברי הרשימה", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 1e96357d8..3f43cfb89 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -173,6 +173,8 @@ "column.edit_list": "Breyta lista", "column.favourites": "Eftirlæti", "column.firehose": "Bein streymi", + "column.firehose_local": "Beint streymi á þessum netþjóni", + "column.firehose_singular": "Beint streymi", "column.follow_requests": "Beiðnir um að fylgjast með", "column.home": "Heim", "column.list_members": "Sýsla með meðlimi listans", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 51f4f3211..152061b55 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.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,6 +41,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}명}}", @@ -167,6 +173,8 @@ "column.edit_list": "리스트 편집", "column.favourites": "좋아요", "column.firehose": "실시간 피드", + "column.firehose_local": "이 서버에 대한 실시간 피드", + "column.firehose_singular": "실시간 피드", "column.follow_requests": "팔로우 요청", "column.home": "홈", "column.list_members": "리스트 구성원 관리", @@ -251,7 +259,12 @@ "confirmations.revoke_quote.confirm": "게시물 삭제", "confirmations.revoke_quote.message": "이 작업은 되돌릴 수 없습니다.", "confirmations.revoke_quote.title": "게시물을 지울까요?", + "confirmations.unblock.confirm": "차단 해제", + "confirmations.unblock.title": "{name} 님을 차단 해제할까요?", "confirmations.unfollow.confirm": "팔로우 해제", + "confirmations.unfollow.title": "{name} 님을 언팔로우 할까요?", + "confirmations.withdraw_request.confirm": "요청 삭제", + "confirmations.withdraw_request.title": "{name} 님에 대한 팔로우 요청을 취소할까요?", "content_warning.hide": "게시물 숨기기", "content_warning.show": "무시하고 보기", "content_warning.show_more": "더 보기", @@ -322,6 +335,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": "아직 좋아요한 게시물이 없습니다. 게시물을 좋아요 하면 여기에 나타납니다.", @@ -454,6 +468,7 @@ "interaction_modal.no_account_yet": "아직 계정이 없나요?", "interaction_modal.on_another_server": "다른 서버에", "interaction_modal.on_this_server": "이 서버에서", + "interaction_modal.title": "로그인해서 계속하기", "interaction_modal.username_prompt": "예시: {example}", "intervals.full.days": "{number} 일", "intervals.full.hours": "{number} 시간", @@ -740,6 +755,7 @@ "privacy.unlisted.short": "조용한 공개", "privacy_policy.last_updated": "{date}에 마지막으로 업데이트됨", "privacy_policy.title": "개인정보처리방침", + "quote_error.edit": "게시물을 수정하면서 인용을 추가할 수 없습니다.", "quote_error.poll": "인용과 투표를 함께 사용할 수 없습니다.", "quote_error.quote": "한 번의 인용만 허용됩니다.", "quote_error.unauthorized": "이 게시물을 인용할 권한이 없습니다.", @@ -860,6 +876,12 @@ "status.cannot_quote": "인용을 비허용한 게시물", "status.cannot_reblog": "이 게시물은 부스트 할 수 없습니다", "status.contains_quote": "인용 포함", + "status.context.loading": "더 많은 답글 불러오는 중", + "status.context.loading_error": "새 답글을 불러올 수 없습니다", + "status.context.loading_success": "새 답글을 불러왔습니다", + "status.context.more_replies_found": "답글을 더 찾았습니다", + "status.context.retry": "재시도", + "status.context.show": "보기", "status.continued_thread": "이어지는 글타래", "status.copy": "게시물 링크 복사", "status.delete": "삭제", @@ -889,8 +911,11 @@ "status.quote": "인용", "status.quote.cancel": "인용 취소", "status.quote_error.filtered": "필터에 의해 가려짐", + "status.quote_error.limited_account_hint.action": "그냥 보기", + "status.quote_error.limited_account_hint.title": "이 계정은 {domain}의 중재자에 의해 숨겨진 상태입니다.", "status.quote_error.not_available": "게시물 사용 불가", "status.quote_error.pending_approval": "게시물 대기중", + "status.quote_error.revoked": "원작성자에 의해 게시물 삭제됨", "status.quote_followers_only": "팔로워만 인용할 수 있는 게시물", "status.quote_manual_review": "작성자가 직접 검토합니다", "status.quote_noun": "인용", @@ -909,6 +934,7 @@ "status.redraft": "지우고 다시 쓰기", "status.remove_bookmark": "북마크 삭제", "status.remove_favourite": "즐겨찾기에서 제거", + "status.remove_quote": "삭제", "status.replied_in_thread": "글타래에 답장", "status.replied_to": "{name} 님에게", "status.reply": "답장", @@ -979,6 +1005,8 @@ "video.volume_up": "음량 증가", "visibility_modal.button_title": "공개범위 설정", "visibility_modal.header": "공개범위와 반응", + "visibility_modal.helper.privacy_private_self_quote": "자신의 비공개 게시물을 공개 게시물로 인용할 수 없습니다.", + "visibility_modal.helper.private_quoting": "마스토돈에서 작성된 팔로워 전용 게시물은 다른 사용자가 인용할 수 없습니다.", "visibility_modal.helper.unlisted_quoting": "사람들에게 인용된 경우, 인용한 게시물도 유행 타임라인에서 감추게 됩니다.", "visibility_modal.instructions": "누가 이 게시물과 상호작용할 수 있는 지 제어합니다. 또한 환경설정 > 게시물 기본설정으로 이동해 향후 모든 게시물의 설정을 적용할 수 있습니다.", "visibility_modal.privacy_label": "공개 범위", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 62ec278e6..6a0bda093 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -31,6 +31,7 @@ "account.edit_profile_short": "Edita", "account.enable_notifications": "Avizame kuando @{name} publike", "account.endorse": "Avalia en profil", + "account.featured": "Avaliado", "account.featured.accounts": "Profiles", "account.featured.hashtags": "Etiketas", "account.featured_tags.last_status_at": "Ultima publikasyon de {date}", @@ -403,8 +404,10 @@ "ignore_notifications_modal.private_mentions_title": "Ignorar avizos de mensyones privadas no solisitadas?", "info_button.label": "Ayuda", "interaction_modal.go": "Va", + "interaction_modal.no_account_yet": "Ainda no tienes kuento?", "interaction_modal.on_another_server": "En otro sirvidor", "interaction_modal.on_this_server": "En este sirvidor", + "interaction_modal.title": "Konektate para kontinuar", "interaction_modal.username_prompt": "Por enshemplo {example}", "intervals.full.days": "{number, plural, one {# diya} other {# diyas}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", @@ -601,6 +604,7 @@ "onboarding.follows.done": "Fecho", "onboarding.follows.empty": "Malorozamente, no se pueden amostrar rezultados en este momento. Puedes aprovar uzar la bushkeda o navigar por la pajina de eksplorasyon para topar personas a las que segir, o aprovarlo de muevo mas tadre.", "onboarding.follows.search": "Bushka", + "onboarding.follows.title": "Sige personas para ampezar", "onboarding.profile.discoverable": "Faz ke mi profil apareska en bushkedas", "onboarding.profile.discoverable_hint": "Kuando permites ke tu profil sea diskuvriravle en Mastodon, tus publikasyones podran apareser en rezultados de bushkedas i trendes i tu profil podra ser sujerido a personas kon intereses similares a los tuyos.", "onboarding.profile.display_name": "Nombre amostrado", @@ -741,6 +745,8 @@ "status.cancel_reblog_private": "No repartaja", "status.cannot_reblog": "Esta publikasyon no se puede repartajar", "status.contains_quote": "Kontriene sita", + "status.context.loading": "Kargando mas repuestas", + "status.context.loading_error": "No se pudieron kargar repuestas muevas", "status.context.loading_success": "Muevas repuestas kargadas", "status.context.more_replies_found": "Se toparon mas repuestas", "status.context.retry": "Reprova", @@ -755,6 +761,7 @@ "status.edit": "Edita", "status.edited": "Ultima edisyon: {date}", "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} vezes}}", + "status.embed": "Obtiene kodiche para enkrustar", "status.favourite": "Te plaze", "status.filter": "Filtra esta publikasyon", "status.history.created": "{name} kriyo {date}", @@ -775,6 +782,8 @@ "status.quote_error.limited_account_hint.title": "Este kuento fue eskondido por los moderadores de {domain}.", "status.quote_error.not_available": "Puvlikasyon no desponivle", "status.quote_error.pending_approval": "Puvlikasyon esta asperando", + "status.quote_error.revoked": "Puvlikasyon kitada por el otor", + "status.quote_followers_only": "Solo los suivantes pueden sitar esta puvlikasyon", "status.quote_noun": "Sita", "status.quote_policy_change": "Troka ken puede sitar", "status.quote_post_author": "Sito una puvlikasyon de @{name}", @@ -794,6 +803,7 @@ "status.reply": "Arisponde", "status.replyAll": "Arisponde al filo", "status.report": "Raporta @{name}", + "status.request_quote": "Solisita sitasyon", "status.sensitive_warning": "Kontenido sensivle", "status.share": "Partaja", "status.show_less_all": "Amostra manko para todo", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 073470b18..fbc9a4ef2 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -173,6 +173,8 @@ "column.edit_list": "Lijst bewerken", "column.favourites": "Favorieten", "column.firehose": "Openbare tijdlijnen", + "column.firehose_local": "Lokale tijdlijn", + "column.firehose_singular": "Openbare tijdlijn", "column.follow_requests": "Volgverzoeken", "column.home": "Start", "column.list_members": "Lijstleden beheren", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index cdd109a71..549203306 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -1,10 +1,12 @@ { "about.blocks": "Servidors moderats", "about.contact": "Contacte :", + "about.default_locale": "Per defaut", "about.disclaimer": "Mastodon es gratuit, un logicial libre e una marca de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Rason pas disponibla", "about.domain_blocks.silenced.title": "Limitats", "about.domain_blocks.suspended.title": "Suspenduts", + "about.language_label": "Lenga", "about.not_available": "Aquesta informacion foguèt pas renduda disponibla sus aqueste servidor.", "about.powered_by": "Malhum social descentralizat propulsat per {mastodon}", "about.rules": "Règlas del servidor", @@ -16,17 +18,26 @@ "account.block_domain": "Tot amagar del domeni {domain}", "account.block_short": "Blocar", "account.blocked": "Blocat", + "account.blocking": "Blocatge", "account.cancel_follow_request": "Retirar la demanda d’abonament", "account.copy": "Copiar lo ligam del perfil", "account.direct": "Mencionar @{name} en privat", "account.disable_notifications": "Quitar de m’avisar quand @{name} publica quicòm", "account.edit_profile": "Modificar lo perfil", + "account.edit_profile_short": "Modificar", "account.enable_notifications": "M’avisar quand @{name} publica quicòm", "account.endorse": "Mostrar pel perfil", + "account.familiar_followers_many": "Seguit per {name1}, {name2} e {othersCount, plural, one {qualqu’un mai que coneissètz} other {# autras personas que coneissètz}}", + "account.familiar_followers_one": "Seguit per {name1}", + "account.familiar_followers_two": "Seguit per {name1} e {name2}", + "account.featured.accounts": "Perfils", + "account.featured.hashtags": "Etiquetas", "account.featured_tags.last_status_at": "Darrièra publicacion lo {date}", "account.featured_tags.last_status_never": "Cap de publicacion", "account.follow": "Sègre", "account.follow_back": "Sègre en retorn", + "account.follow_request_cancel": "Anullar la demanda", + "account.follow_request_cancel_short": "Anullar", "account.followers": "Seguidors", "account.followers.empty": "Degun sèc pas aqueste utilizaire pel moment.", "account.following": "Abonat", @@ -45,16 +56,20 @@ "account.mute_notifications_short": "Amudir las notificacions", "account.mute_short": "Amudir", "account.muted": "Mes en silenci", + "account.mutual": "Vos seguissètz", "account.no_bio": "Cap de descripcion pas fornida.", "account.open_original_page": "Dobrir la pagina d’origina", "account.posts": "Tuts", "account.posts_with_replies": "Tuts e responsas", + "account.remove_from_followers": "Tirar {name} dels seguidors", "account.report": "Senhalar @{name}", "account.requested_follow": "{name} a demandat a vos sègre", + "account.requests_to_follow_you": "Demanda a vos sègre", "account.share": "Partejar lo perfil a @{name}", "account.show_reblogs": "Mostrar los partatges de @{name}", "account.unblock": "Desblocar @{name}", "account.unblock_domain": "Desblocar {domain}", + "account.unblock_domain_short": "Desblocar", "account.unblock_short": "Desblocat", "account.unendorse": "Mostrar pas pel perfil", "account.unfollow": "Quitar de sègre", @@ -97,13 +112,18 @@ "column.blocks": "Personas blocadas", "column.bookmarks": "Marcadors", "column.community": "Flux public local", + "column.create_list": "Crear una lista", "column.direct": "Mencions privadas", "column.directory": "Percórrer los perfils", "column.domain_blocks": "Domenis resconduts", + "column.edit_list": "Modificar la lista", "column.favourites": "Favorits", "column.firehose": "Tuts en dirèct", + "column.firehose_local": "Fial en dirècte d’aqueste servidor", + "column.firehose_singular": "Fial en dirècte", "column.follow_requests": "Demandas d’abonament", "column.home": "Acuèlh", + "column.list_members": "Gestion dels membres de la lista", "column.lists": "Listas", "column.mutes": "Personas rescondudas", "column.notifications": "Notificacions", @@ -116,6 +136,7 @@ "column_header.pin": "Penjar", "column_header.show_settings": "Mostrar los paramètres", "column_header.unpin": "Despenjar", + "column_search.cancel": "Anullar", "community.column_settings.local_only": "Sonque local", "community.column_settings.media_only": "Solament los mèdias", "community.column_settings.remote_only": "Sonque alonhat", @@ -144,14 +165,28 @@ "confirmations.block.confirm": "Blocar", "confirmations.delete.confirm": "Escafar", "confirmations.delete.message": "Volètz vertadièrament escafar l’estatut ?", + "confirmations.delete.title": "Suprimir la publicacion ?", "confirmations.delete_list.confirm": "Suprimir", "confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?", + "confirmations.delete_list.title": "Suprimir la lista ?", "confirmations.discard_edit_media.confirm": "Ignorar", "confirmations.logout.confirm": "Desconnexion", "confirmations.logout.message": "Volètz vertadièrament vos desconnectar ?", + "confirmations.missing_alt_text.confirm": "Apondre un tèxte alternatiu", + "confirmations.missing_alt_text.message": "Vòstra publicacion conten un mèdia sens tèxt alternatiu. L'apondon de descripcions ajuda a rendre vòstre contengut accessible a mai de monde.", + "confirmations.missing_alt_text.secondary": "Publicar malgrat tot", + "confirmations.missing_alt_text.title": "Apondre un tèxte alternatiu ?", "confirmations.mute.confirm": "Rescondre", + "confirmations.quiet_post_quote_info.dismiss": "Me remembrar pas mai", + "confirmations.quiet_post_quote_info.got_it": "Plan comprés", "confirmations.redraft.confirm": "Escafar & tornar formular", + "confirmations.revoke_quote.title": "Suprimir la publicacion ?", + "confirmations.unblock.confirm": "Desblocar", + "confirmations.unblock.title": "Desblocar {name} ?", "confirmations.unfollow.confirm": "Quitar de sègre", + "confirmations.unfollow.title": "Quitar de sègre {name} ?", + "content_warning.hide": "Amagar la publicacion", + "content_warning.show_more": "Ne veire mai", "conversation.delete": "Suprimir la conversacion", "conversation.mark_as_read": "Marcar coma legida", "conversation.open": "Veire la conversacion", @@ -206,6 +241,7 @@ "errors.unexpected_crash.copy_stacktrace": "Copiar las traças al quichapapièrs", "errors.unexpected_crash.report_issue": "Senhalar un problèma", "explore.suggested_follows": "Personas", + "explore.title": "Tendéncia", "explore.trending_links": "Novèlas", "explore.trending_statuses": "Publicacions", "explore.trending_tags": "Etiquetas", @@ -231,6 +267,7 @@ "footer.privacy_policy": "Politica de confidencialitat", "footer.source_code": "Veire lo còdi font", "footer.status": "Estat", + "footer.terms_of_service": "Condicions d’utilizacion", "generic.saved": "Enregistrat", "getting_started.heading": "Per començar", "hashtag.column_header.tag_mode.all": "e {additional}", @@ -246,6 +283,7 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} tut} other {{counter} tuts}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} tut} other {{counter} tuts}} uèi", "hashtag.follow": "Sègre l’etiqueta", + "hashtag.mute": "Amudar #{hashtag}", "hashtag.unfollow": "Quitar de sègre l’etiqueta", "hashtags.and_other": "…e {count, plural, one {}other {# de mai}}", "home.column_settings.show_reblogs": "Mostrar los partatges", @@ -253,6 +291,7 @@ "home.hide_announcements": "Rescondre las anóncias", "home.pending_critical_update.link": "Veire las mesas a jorn", "home.show_announcements": "Mostrar las anóncias", + "info_button.label": "Ajuda", "interaction_modal.on_another_server": "Sus un autre servidor", "interaction_modal.on_this_server": "Sus aqueste servidor", "intervals.full.days": "{number, plural, one {# jorn} other {# jorns}}", @@ -292,21 +331,29 @@ "keyboard_shortcuts.toot": "començar un estatut tot novèl", "keyboard_shortcuts.unfocus": "quitar lo camp tèxte/de recèrca", "keyboard_shortcuts.up": "far montar dins la lista", + "learn_more_link.got_it": "Plan comprés", + "learn_more_link.learn_more": "Ne saber mai", "lightbox.close": "Tampar", "lightbox.next": "Seguent", "lightbox.previous": "Precedent", "limited_account_hint.action": "Afichar lo perfil de tota manièra", "limited_account_hint.title": "Aqueste perfil foguèt rescondut per la moderacion de {domain}.", "link_preview.author": "Per {name}", + "link_preview.more_from_author": "Mai de {name}", "lists.delete": "Suprimir la lista", "lists.edit": "Modificar la lista", "lists.replies_policy.followed": "Quin seguidor que siá", "lists.replies_policy.list": "Membres de la lista", "lists.replies_policy.none": "Degun", + "lists.save": "Enregistrar", + "lists.search": "Recercar", "load_pending": "{count, plural, one {# nòu element} other {# nòu elements}}", "loading_indicator.label": "Cargament…", + "media_gallery.hide": "Rescondre", "navigation_bar.about": "A prepaus", + "navigation_bar.administration": "Administracion", "navigation_bar.advanced_interface": "Dobrir l’interfàcia web avançada", + "navigation_bar.automated_deletion": "Supression auto de las publicacions", "navigation_bar.blocks": "Personas blocadas", "navigation_bar.bookmarks": "Marcadors", "navigation_bar.direct": "Mencions privadas", @@ -316,19 +363,32 @@ "navigation_bar.follow_requests": "Demandas d’abonament", "navigation_bar.followed_tags": "Etiquetas seguidas", "navigation_bar.follows_and_followers": "Abonament e seguidors", + "navigation_bar.import_export": "Import e export", "navigation_bar.lists": "Listas", "navigation_bar.logout": "Desconnexion", + "navigation_bar.moderation": "Moderacion", + "navigation_bar.more": "Mai", "navigation_bar.mutes": "Personas rescondudas", "navigation_bar.preferences": "Preferéncias", "navigation_bar.search": "Recercar", + "navigation_bar.search_trends": "Recèrca / Tendéncia", "not_signed_in_indicator.not_signed_in": "Devètz vos connectar per accedir a aquesta ressorsa.", "notification.admin.report": "{name} senhalèt {target}", "notification.admin.sign_up": "{name} se marquèt", "notification.favourite": "{name} a mes vòstre estatut en favorit", "notification.follow": "{name} vos sèc", "notification.follow_request": "{name} a demandat a vos sègre", + "notification.label.mention": "Mencion", + "notification.label.private_mention": "Mencion privada", + "notification.label.private_reply": "Responsa privada", + "notification.label.quote": "{name} a citat vòstra publicacion", + "notification.label.reply": "Respondre", + "notification.mention": "Mencionar", + "notification.mentioned_you": "{name} vos a mencionat", + "notification.moderation-warning.learn_more": "Ne saber mai", "notification.own_poll": "Vòstre sondatge es acabat", "notification.reblog": "{name} a partejat vòstre estatut", + "notification.relationships_severance_event.learn_more": "Ne saber mai", "notification.status": "{name} ven de publicar", "notification.update": "{name} modiquè sa publicacion", "notifications.clear": "Escafar", @@ -379,7 +439,12 @@ "poll_button.add_poll": "Ajustar un sondatge", "poll_button.remove_poll": "Levar lo sondatge", "privacy.change": "Ajustar la confidencialitat del messatge", + "privacy.direct.long": "Sonque los qu’avètz mencionats dins la publicacion", + "privacy.direct.short": "Mencion privada", + "privacy.private.long": "Mostrar pas qu’als seguidors", + "privacy.private.short": "Seguidors", "privacy.public.short": "Public", + "privacy.unlisted.short": "Public silenciós", "privacy_policy.last_updated": "Darrièra actualizacion {date}", "privacy_policy.title": "Politica de confidencialitat", "refresh": "Actualizar", @@ -423,6 +488,7 @@ "report.target": "Senhalar {target}", "report.thanks.title": "Volètz pas veire aquò ?", "report.unfollow": "Quitar de sègre {name}", + "report.unfollow_explanation": "Seguissètz aqueste compte. Per veire pas pus lors publicacions dins vòstra cronologia, quitatz de lo sègre.", "report_notification.attached_statuses": "{count, plural, one {{count} publicacion junta} other {{count} publicacions juntas}}", "report_notification.categories.other": "Autre", "report_notification.categories.spam": "Messatge indesirable", @@ -454,6 +520,9 @@ "status.bookmark": "Marcador", "status.cancel_reblog_private": "Quitar de partejar", "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat", + "status.context.loading": "Cargament de mai de responsas", + "status.context.more_replies_found": "Mai de responsas trobadas", + "status.continued_thread": "Seguida del fial", "status.copy": "Copiar lo ligam de l’estatut", "status.delete": "Escafar", "status.detailed_status": "Vista detalhada de la convèrsa", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index c58e790c6..b08362d03 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -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", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index bc21886ed..8c475d548 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", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 86e231dd4..7525498c2 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": "管理列表成員", 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/es-AR.yml b/config/locales/es-AR.yml index 129735546..eec0c3f46 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -857,8 +857,8 @@ es-AR: public: Todos landing_page: values: - about: Acerca de - local_feed: Cronología local + 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! diff --git a/config/locales/fi.yml b/config/locales/fi.yml index f52c34b08..864942612 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,6 +839,7 @@ fi: title: Jätä käyttäjät oletusarvoisesti hakukoneindeksoinnin ulkopuolelle discovery: follow_recommendations: Seurantasuositukset + preamble: Mielenkiintoisen sisällön esille tuominen on keskeistä uusien käyttäjien perehdyttämisessä, 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 @@ -850,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. diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 79f9fafaf..85d351d20 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -855,6 +855,11 @@ gl: 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. diff --git a/config/locales/ko.yml b/config/locales/ko.yml index e88236887..118f7ed90 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: 규칙 추가 @@ -835,6 +837,16 @@ ko: all: 모두에게 disabled: 아무에게도 안 함 users: 로그인 한 사용자에게 + feed_access: + modes: + authenticated: 로그인한 사용자들만 + disabled: 특정한 사용자 역할 필요 + public: 모두 + landing_page: + values: + about: 정보 + local_feed: 로컬 피드 + trends: 유행 registrations: moderation_recommandation: 모두에게 가입을 열기 전에 적절하고 반응이 빠른 중재 팀을 데리고 있는지 확인해 주세요! preamble: 누가 이 서버에 계정을 만들 수 있는지 제어합니다. @@ -896,6 +908,7 @@ ko: title: 계정 게시물 - @%{name} trending: 유행 중 view_publicly: 공개시점으로 보기 + view_quoted_post: 인용된 게시물 보기 visibility: 공개 설정 with_media: 미디어 있음 strikes: @@ -1165,7 +1178,10 @@ ko: hint_html: 다른 계정에서 이 계정으로 옮기길 원하는 경우, 여기에서 별칭을 만들 수 있습니다, 기존 계정의 팔로워를 이쪽으로 옮기고 싶은 경우 필요한 과정입니다. 이 행동 자체는 해롭지 않고 되돌리기가 가능합니다.계정 이주는 이전 계정에서 착수하게 됩니다 remove: 별칭 연결 끊기 appearance: + advanced_settings: 고급 설정 animations_and_accessibility: 애니메이션과 접근성 + boosting_preferences: 부스팅 설정 + boosting_preferences_info_html: "팁: 설정에 관계 없이 %{icon}을 쉬프트+클릭하여 곧바로 부스트할 수 있습니다." discovery: 발견하기 localization: body: 마스토돈은 자원봉사자들에 의해 번역되었습니다. @@ -1547,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: 리스트 최대 개수를 초과합니다 @@ -1854,6 +1877,9 @@ ko: other: "%{count} 개의 영상" boosted_from_html: "%{acct_link}의 글을 부스트" content_warning: '열람 주의: %{warning}' + content_warnings: + hide: 게시물 숨기기 + show: 더 보기 default_language: 화면 표시 언어와 동일하게 disallowed_hashtags: other: '허용되지 않은 해시태그를 포함하고 있습니다: %{tags}' @@ -1867,13 +1893,19 @@ ko: 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/lad.yml b/config/locales/lad.yml index c15f513ce..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 @@ -770,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 @@ -950,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: @@ -1028,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 diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index b58d916d6..2be68cd4b 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -93,7 +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 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. + 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 @@ -287,7 +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 inicio para nuevos visitantes + 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) diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 4a1cb3998..296d5def5 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 mitä sivua uudet kävijät näkevät saapuessaan palvelimellesi. Jos valitset "Trendit", trendien tulee olla käytössä Löytöasetuksissa. Jos valitset "Paikallinen syöte", "Pääsy paikallisten julkaisujen live-syötteisiin" tulee asettaa "Kaikille" Löytö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ä @@ -144,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, territoriumi tai valtio, jonka sisäiset substantiiviset lait säätelevät kaikkia vaateita. 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. @@ -285,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) diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index cb088c9b8..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 @@ -286,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) diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index ccaa8dd69..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 diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index a1a9d8954..5b7c6f33e 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: 타임라인의 새 게시물을 자동으로 보여 주는 대신, 클릭해서 나타내도록 합니다 @@ -229,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: 미디어 표시 @@ -242,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: 시스템 기본 스크롤바 사용 @@ -275,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: 왜 도메인이 차단되었는지 보여주기 diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index a04bf89f9..9b626e3c1 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -244,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 From 51877081b435b38e1c5bd449087279469fa7c667 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 29 Oct 2025 12:11:33 +0100 Subject: [PATCH 59/90] Bump version to v4.5.0-rc.1 (#36635) --- CHANGELOG.md | 33 ++++++++++++++++++++++++++++----- lib/mastodon/version.rb | 2 +- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f63450542..6a275d84f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,18 @@ All notable changes to this project will be documented in this file. ### Added -- **Add support for allowing and authoring quotes** (#35355, #35578, #35614, #35618, #35624, #35626, #35652, #35629, #35665, #35653, #35670, #35677, #35690, #35697, #35689, #35699, #35700, #35701, #35709, #35714, #35713, #35715, #35725, #35749, #35769, #35780, #35762, #35804, #35808, #35805, #35819, #35824, #35828, #35822, #35835, #35865, #35860, #35832, #35891, #35894, #35895, #35820, #35917, #35924, #35925, #35914, #35930, #35941, #35939, #35948, #35955, #35967, #35990, #35991, #35975, #35971, #36002, #35986, #36031, #36034, #36038, #36054, #36052, #36055, #36065, #36068, #36083, #36087, #36080, #36091, #36090, #36118, #36119, #36128, #36094, #36129, #36138, #36132, #36151, #36158, #36171, #36194, #36220, #36169, #36130, #36249, #36153, #36299, #36291, #36301, #36315, #36317, #36364, #36383, #36381, #36459, #36464, #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 and #36559 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, and #36607 by @ClearlyClaire)\ + This splits the `timeline_preview` setting into four more granular settings controlling live feeds and topic (hashtag, trending link) feeds, with 3 values each: `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 Traditional Mongolian to posting languages (#36196 by @shimon1024) @@ -28,7 +33,7 @@ All notable changes to this project will be documented in this file. - 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)\ +- 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 and #36409 by @ChaosExAnima and @braddunbar)\ This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places. ### Changed @@ -36,11 +41,17 @@ All notable changes to this project will be documented in this file. - 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 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 +59,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 +70,14 @@ 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 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 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 +100,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/lib/mastodon/version.rb b/lib/mastodon/version.rb index ae88b5351..8f5f0f9c9 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'beta.2' + 'rc.1' end def prerelease From 2a9c7d2b9e51cdfbc636972c0f9ffdbe06c02d59 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 29 Oct 2025 12:56:34 +0100 Subject: [PATCH 60/90] Fix `quote-inline` fallback being removed even for legacy quotes (#36638) --- CHANGELOG.md | 2 +- app/javascript/mastodon/components/status_content.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a275d84f..b706b8ac4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ All notable changes to this project will be documented in this file. - 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 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 and #36409 by @ChaosExAnima and @braddunbar)\ +- 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 and #36638 by @ChaosExAnima, @ClearlyClaire and @braddunbar)\ This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places. ### Changed diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 9ff672079..6bb04ddab 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -177,7 +177,7 @@ class StatusContent extends PureComponent { {children} ); - } else if (element.classList.contains('quote-inline')) { + } else if (element.classList.contains('quote-inline') && this.props.status.get('quote')) { return null; } return undefined; From e4291e9b05611163591bdf572a25a236b202ff16 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 30 Oct 2025 12:21:32 +0100 Subject: [PATCH 61/90] Fix SMTP configuration with `mail` 2.9.0 (#36646) --- lib/mastodon/email_configuration_helper.rb | 14 +++--- .../email_configuration_helper_spec.rb | 43 +++++++++++++------ spec/mailers/user_mailer_spec.rb | 4 +- 3 files changed, 38 insertions(+), 23 deletions(-) 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/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 From 214d59bd373f1c83dca55728e2d15738d33de836 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 30 Oct 2025 20:29:25 +0100 Subject: [PATCH 62/90] Show error when submitting empty post rather than failing silently (#36650) --- app/javascript/mastodon/actions/compose.js | 12 +++++++++++- .../features/compose/components/compose_form.jsx | 5 ++--- app/javascript/mastodon/locales/en.json | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index d6de589e9..2d4f48c20 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'; @@ -88,6 +89,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 +199,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; } diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index ac0a49693..299de12e7 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -123,11 +123,10 @@ class ComposeForm extends ImmutablePureComponent { }; canSubmit = () => { - const { isSubmitting, isChangingUpload, isUploading, anyMedia, maxChars } = this.props; + const { isSubmitting, isChangingUpload, isUploading, maxChars } = this.props; const fulltext = this.getFulltextForCharacterCounting(); - const isOnlyWhitespace = fulltext.length !== 0 && fulltext.trim().length === 0; - return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars || (isOnlyWhitespace && !anyMedia)); + return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars); }; handleSubmit = (e) => { diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 0481eb7c0..ae4950e3b 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -194,6 +194,7 @@ "community.column_settings.local_only": "Local only", "community.column_settings.media_only": "Media Only", "community.column_settings.remote_only": "Remote only", + "compose.error.blank_post": "Post can't be blank.", "compose.language.change": "Change language", "compose.language.search": "Search languages...", "compose.published.body": "Post published.", From e1b6e28829a30b1207873de5c139b36e1ed8cd0a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:30:55 +0100 Subject: [PATCH 63/90] chore(deps): update dependency libvips to v8.17.3 (#36654) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1c9c956b7..c64d52991 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 From ea710df180ae2c4339635a6f9fe48bbf675a5dce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 10:31:57 +0000 Subject: [PATCH 64/90] chore(deps): update dependency axios to v1.13.1 (#36633) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index e74f1029e..d0f54b81c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4657,14 +4657,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.45.0, @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.46.0": +"@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 @@ -5464,13 +5464,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.13.0 - resolution: "axios@npm:1.13.0" + 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/2af09f8ad9db9565bf97055eb0ddd2fd4abd9a03d23157b409348c9589370a88c3ede02e11fd1268becb780a77b62bdf9488650dd7208eda57edceca1d65622e + checksum: 10c0/de9c3c6de43d3ee1146d3afe78645f19450cac6a5d7235bef8b8e8eeb705c2e47e2d231dea99cecaec4dae1897c521118ca9413b9d474063c719c4d94c5b9adc languageName: node linkType: hard From adfabf8c80f32a7053dffa482d8b9ef949f812a0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 14:51:18 +0100 Subject: [PATCH 65/90] New Crowdin Translations for stable-4.5 (automated) (#36670) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 4 +++ app/javascript/mastodon/locales/cs.json | 5 +++ app/javascript/mastodon/locales/da.json | 4 +++ app/javascript/mastodon/locales/de.json | 10 ++++-- app/javascript/mastodon/locales/el.json | 3 ++ app/javascript/mastodon/locales/es-AR.json | 4 +++ app/javascript/mastodon/locales/es-MX.json | 4 +++ app/javascript/mastodon/locales/es.json | 4 +++ app/javascript/mastodon/locales/fi.json | 6 +++- app/javascript/mastodon/locales/fo.json | 5 +++ app/javascript/mastodon/locales/ga.json | 5 +++ app/javascript/mastodon/locales/gd.json | 14 +++++--- app/javascript/mastodon/locales/gl.json | 2 ++ app/javascript/mastodon/locales/he.json | 4 +++ app/javascript/mastodon/locales/hu.json | 6 ++++ app/javascript/mastodon/locales/is.json | 4 +++ app/javascript/mastodon/locales/ko.json | 31 +++++++++++------ app/javascript/mastodon/locales/pt-PT.json | 4 +++ app/javascript/mastodon/locales/sq.json | 5 +++ app/javascript/mastodon/locales/th.json | 39 ++++++++++++++++++++-- app/javascript/mastodon/locales/tr.json | 7 ++++ app/javascript/mastodon/locales/vi.json | 4 +++ app/javascript/mastodon/locales/zh-CN.json | 7 ++++ app/javascript/mastodon/locales/zh-TW.json | 4 +++ config/locales/de.yml | 8 ++++- config/locales/fi.yml | 8 ++--- config/locales/gd.yml | 10 +++++- config/locales/hu.yml | 5 +++ config/locales/ko.yml | 2 +- config/locales/simple_form.de.yml | 10 +++++- config/locales/simple_form.fi.yml | 6 ++-- config/locales/simple_form.gd.yml | 4 ++- config/locales/simple_form.hu.yml | 2 ++ config/locales/simple_form.ko.yml | 2 +- config/locales/th.yml | 24 +++++++++++++ config/locales/zh-CN.yml | 3 ++ 36 files changed, 236 insertions(+), 33 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index d257ed9f4..231cfc252 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -194,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": "Допіс апублікаваны.", @@ -911,9 +912,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 можна кантраляваць магчымасць іншых цытаваць Вас. Гэты допіс будзе знаходзіцца ў стане чакання, пакуль мы не атрымаем ухваленне на цытаванне ад аўтара арыгінальнага допісу.", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 3531a6422..05b31bfb8 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -173,6 +173,8 @@ "column.edit_list": "Upravit seznam", "column.favourites": "Oblíbené", "column.firehose": "Živé kanály", + "column.firehose_local": "Živý kanál pro tento server", + "column.firehose_singular": "Živý kanál", "column.follow_requests": "Žádosti o sledování", "column.home": "Domů", "column.list_members": "Spravovat členy seznamu", @@ -909,9 +911,12 @@ "status.pin": "Připnout na profil", "status.quote": "Citovat", "status.quote.cancel": "Zrušit citování", + "status.quote_error.blocked_account_hint.title": "Tento příspěvek je skryt, protože jste zablokovali @{name}.", + "status.quote_error.blocked_domain_hint.title": "Tento příspěvek je skryt, protože jste zablokovali {domain}.", "status.quote_error.filtered": "Skryté kvůli jednomu z vašich filtrů", "status.quote_error.limited_account_hint.action": "Přesto zobrazit", "status.quote_error.limited_account_hint.title": "Tento účet byl skryt moderátory {domain}.", + "status.quote_error.muted_account_hint.title": "Tento příspěvek je skryt, protože jste ztišili @{name}.", "status.quote_error.not_available": "Příspěvek není dostupný", "status.quote_error.pending_approval": "Příspěvek čeká na schválení", "status.quote_error.pending_approval_popout.body": "Na Mastodonu můžete kontrolovat, zda vás někdo může citovat. Tento příspěvek čeká, dokud neobdržíme schválení od původního autora.", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 0e7733196..2bcf4a704 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -194,6 +194,7 @@ "community.column_settings.local_only": "Kun lokalt", "community.column_settings.media_only": "Kun medier", "community.column_settings.remote_only": "Kun udefra", + "compose.error.blank_post": "Indlæg kan ikke være tomt.", "compose.language.change": "Skift sprog", "compose.language.search": "Søg efter sprog...", "compose.published.body": "Indlæg udgivet.", @@ -911,9 +912,12 @@ "status.pin": "Fastgør til profil", "status.quote": "Citér", "status.quote.cancel": "Annullér citat", + "status.quote_error.blocked_account_hint.title": "Dette indlæg er skjult, fordi du har blokeret @{name}.", + "status.quote_error.blocked_domain_hint.title": "Dette indlæg er skjult, fordi du har blokeret @{domain}.", "status.quote_error.filtered": "Skjult grundet et af filterne", "status.quote_error.limited_account_hint.action": "Vis alligevel", "status.quote_error.limited_account_hint.title": "Denne profil er blevet skjult af {domain}-moderatorerne.", + "status.quote_error.muted_account_hint.title": "Dette indlæg er skjult, fordi du har skjult @{name}.", "status.quote_error.not_available": "Indlæg utilgængeligt", "status.quote_error.pending_approval": "Afventende indlæg", "status.quote_error.pending_approval_popout.body": "På Mastodon kan du kontrollere, om nogen kan citere dig. Dette indlæg afventer, mens vi får den oprindelige forfatters godkendelse.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 86826091f..5d0bb5add 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -173,6 +173,8 @@ "column.edit_list": "Liste bearbeiten", "column.favourites": "Favoriten", "column.firehose": "Live-Feeds", + "column.firehose_local": "Live-Feed für diesen Server", + "column.firehose_singular": "Live-Feed", "column.follow_requests": "Follower-Anfragen", "column.home": "Startseite", "column.list_members": "Listenmitglieder verwalten", @@ -192,6 +194,7 @@ "community.column_settings.local_only": "Nur lokal", "community.column_settings.media_only": "Nur Beiträge mit Medien", "community.column_settings.remote_only": "Nur andere Mastodon-Server", + "compose.error.blank_post": "Beitrag muss einen Inhalt haben.", "compose.language.change": "Sprache festlegen", "compose.language.search": "Sprachen suchen …", "compose.published.body": "Beitrag veröffentlicht.", @@ -257,8 +260,8 @@ "confirmations.revoke_quote.confirm": "Beitrag entfernen", "confirmations.revoke_quote.message": "Diese Aktion kann nicht rückgängig gemacht werden.", "confirmations.revoke_quote.title": "Beitrag entfernen?", - "confirmations.unblock.confirm": "Entsperren", - "confirmations.unblock.title": "{name} entsperren?", + "confirmations.unblock.confirm": "Nicht mehr blockieren", + "confirmations.unblock.title": "{name} nicht mehr blockieren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.title": "{name} entfolgen?", "confirmations.withdraw_request.confirm": "Anfrage zurückziehen", @@ -909,9 +912,12 @@ "status.pin": "Im Profil anheften", "status.quote": "Zitieren", "status.quote.cancel": "Zitat abbrechen", + "status.quote_error.blocked_account_hint.title": "Dieser Beitrag wurde ausgeblendet, weil du @{name} blockiert hast.", + "status.quote_error.blocked_domain_hint.title": "Dieser Beitrag wurde ausgeblendet, weil du {domain} blockiert hast.", "status.quote_error.filtered": "Ausgeblendet wegen eines deiner Filter", "status.quote_error.limited_account_hint.action": "Trotzdem anzeigen", "status.quote_error.limited_account_hint.title": "Dieses Profil wurde von den Moderator*innen von {domain} ausgeblendet.", + "status.quote_error.muted_account_hint.title": "Dieser Beitrag wurde ausgeblendet, weil du @{name} stummgeschaltet hast.", "status.quote_error.not_available": "Beitrag nicht verfügbar", "status.quote_error.pending_approval": "Beitragsveröffentlichung ausstehend", "status.quote_error.pending_approval_popout.body": "Auf Mastodon kann festgelegt werden, ob man zitiert werden möchte. Wir warten auf die Genehmigung des ursprünglichen Profils. Bis dahin steht deine Beitragsveröffentlichung noch aus.", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 62e3467a9..f8773af8e 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -911,9 +911,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, μπορείς να ελέγξεις αν κάποιος μπορεί να σε παραθέσει. Αυτή η ανάρτηση εκκρεμεί ενώ λαμβάνουμε την έγκριση του αρχικού συντάκτη.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index bc07edbd7..b133674eb 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -194,6 +194,7 @@ "community.column_settings.local_only": "Sólo local", "community.column_settings.media_only": "Sólo medios", "community.column_settings.remote_only": "Sólo remoto", + "compose.error.blank_post": "El mensaje no puede estar en blanco.", "compose.language.change": "Cambiar idioma", "compose.language.search": "Buscar idiomas…", "compose.published.body": "Mensaje publicado.", @@ -911,9 +912,12 @@ "status.pin": "Fijar en el perfil", "status.quote": "Citar", "status.quote.cancel": "Cancelar cita", + "status.quote_error.blocked_account_hint.title": "Este mensaje está oculto porque bloqueaste a @{name}.", + "status.quote_error.blocked_domain_hint.title": "Este mensaje está oculto porque bloqueaste {domain}.", "status.quote_error.filtered": "Oculto debido a uno de tus filtros", "status.quote_error.limited_account_hint.action": "Mostrar de todos modos", "status.quote_error.limited_account_hint.title": "Esta cuenta fue ocultada por los moderadores de {domain}.", + "status.quote_error.muted_account_hint.title": "Este mensaje está oculto porque silenciaste a @{name}.", "status.quote_error.not_available": "Mensaje no disponible", "status.quote_error.pending_approval": "Mensaje pendiente", "status.quote_error.pending_approval_popout.body": "En Mastodon, podés controlar si alguien te puede citar. Este mensaje está pendiente hasta obtener la aprobación del autor original.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index b340851d0..5a26dddcb 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -194,6 +194,7 @@ "community.column_settings.local_only": "Solo local", "community.column_settings.media_only": "Solo media", "community.column_settings.remote_only": "Solo remoto", + "compose.error.blank_post": "El mensaje no puede estar en blanco.", "compose.language.change": "Cambiar idioma", "compose.language.search": "Buscar idiomas...", "compose.published.body": "Publicado.", @@ -911,9 +912,12 @@ "status.pin": "Fijar", "status.quote": "Citar", "status.quote.cancel": "Cancelar cita", + "status.quote_error.blocked_account_hint.title": "Esta publicación está oculta porque has bloqueado a @{name}.", + "status.quote_error.blocked_domain_hint.title": "Esta publicación está oculta porque has bloqueado @{domain}.", "status.quote_error.filtered": "Oculto debido a uno de tus filtros", "status.quote_error.limited_account_hint.action": "Mostrar de todas formas", "status.quote_error.limited_account_hint.title": "Esta cuenta ha sido ocultada por los moderadores de {domain}.", + "status.quote_error.muted_account_hint.title": "Esta publicación está oculta porque has silenciado a @{name}.", "status.quote_error.not_available": "Publicación no disponible", "status.quote_error.pending_approval": "Publicación pendiente", "status.quote_error.pending_approval_popout.body": "En Mastodon, puedes controlar si alguien puede citarte. Esta publicación está pendiente mientras obtenemos la aprobación del autor original.", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 77d0f9f93..96376e636 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -194,6 +194,7 @@ "community.column_settings.local_only": "Solo local", "community.column_settings.media_only": "Solo multimedia", "community.column_settings.remote_only": "Solo remoto", + "compose.error.blank_post": "El mensaje no puede estar en blanco.", "compose.language.change": "Cambiar idioma", "compose.language.search": "Buscar idiomas...", "compose.published.body": "Publicado.", @@ -911,9 +912,12 @@ "status.pin": "Fijar", "status.quote": "Citar", "status.quote.cancel": "Cancelar cita", + "status.quote_error.blocked_account_hint.title": "Esta publicación está oculta porque has bloqueado a @{name}.", + "status.quote_error.blocked_domain_hint.title": "Esta publicación está oculta porque has bloqueado @{domain}.", "status.quote_error.filtered": "Oculto debido a uno de tus filtros", "status.quote_error.limited_account_hint.action": "Mostrar de todos modos", "status.quote_error.limited_account_hint.title": "Esta cuenta ha sido ocultada por los moderadores de {domain}.", + "status.quote_error.muted_account_hint.title": "Esta publicación está oculta porque has silenciado a @{name}.", "status.quote_error.not_available": "Publicación no disponible", "status.quote_error.pending_approval": "Publicación pendiente", "status.quote_error.pending_approval_popout.body": "En Mastodon, puedes controlar si alguien puede citarte. Esta publicación está pendiente mientras obtenemos la aprobación del autor original.", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 3e73a6e75..21c1ccaf6 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -3,7 +3,7 @@ "about.contact": "Yhteydenotto:", "about.default_locale": "Oletus", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", - "about.domain_blocks.no_reason_available": "Syytä ei ole ilmoitettu", + "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", "about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.", "about.domain_blocks.silenced.title": "Rajoitettu", @@ -194,6 +194,7 @@ "community.column_settings.local_only": "Vain paikalliset", "community.column_settings.media_only": "Vain media", "community.column_settings.remote_only": "Vain etätilit", + "compose.error.blank_post": "Julkaisu ei voi olla tyhjä.", "compose.language.change": "Vaihda kieli", "compose.language.search": "Hae kieliä…", "compose.published.body": "Julkaisu lähetetty.", @@ -911,9 +912,12 @@ "status.pin": "Kiinnitä profiiliin", "status.quote": "Lainaa", "status.quote.cancel": "Peruuta lainaus", + "status.quote_error.blocked_account_hint.title": "Tämä julkaisu on piilotettu, koska olet estänyt käyttäjän @{name}.", + "status.quote_error.blocked_domain_hint.title": "Tämä julkaisu on piilotettu, koska olet estänyt verkkotunnuksen {domain}.", "status.quote_error.filtered": "Piilotettu jonkin asettamasi suodattimen takia", "status.quote_error.limited_account_hint.action": "Näytä kuitenkin", "status.quote_error.limited_account_hint.title": "Palvelimen {domain} moderaattorit ovat piilottaneet tämän profiilin.", + "status.quote_error.muted_account_hint.title": "Tämä julkaisu on piilotettu, koska olet mykistänyt käyttäjän @{name}.", "status.quote_error.not_available": "Julkaisu ei saatavilla", "status.quote_error.pending_approval": "Julkaisu odottaa", "status.quote_error.pending_approval_popout.body": "Mastodonissa voit hallita, voiko joku lainata sinua. Tämä julkaisu on vireillä siihen asti, että saamme alkuperäisen tekijän hyväksynnän.", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 3a407e7cb..95f95eb0a 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -173,6 +173,8 @@ "column.edit_list": "Broyt lista", "column.favourites": "Dámdir postar", "column.firehose": "Beinleiðis rásir", + "column.firehose_local": "Beinleiðis rás hjá hesum ambætaranum", + "column.firehose_singular": "Beinleiðis rás", "column.follow_requests": "Umbønir at fylgja", "column.home": "Heim", "column.list_members": "Rætta limalista", @@ -909,9 +911,12 @@ "status.pin": "Ger fastan í vangan", "status.quote": "Sitat", "status.quote.cancel": "Ógilda sitat", + "status.quote_error.blocked_account_hint.title": "Hesin posturin er fjaldur, tí tú hevur blokerað @{name}.", + "status.quote_error.blocked_domain_hint.title": "Hesin posturin er fjaldur, tí tú hevur blokerað @{domain}.", "status.quote_error.filtered": "Eitt av tínum filtrum fjalir hetta", "status.quote_error.limited_account_hint.action": "Vís kortini", "status.quote_error.limited_account_hint.title": "Hendan kontan er fjald av kjakleiðarunum á {domain}.", + "status.quote_error.muted_account_hint.title": "Hesin posturin er fjaldur, tí tú hevur doyvt @{name}.", "status.quote_error.not_available": "Postur ikki tøkur", "status.quote_error.pending_approval": "Postur bíðar", "status.quote_error.pending_approval_popout.body": "Á Mastodon kanst tú avgera, um onkur kann sitera teg. Hesin posturin bíðar eftir góðkenning frá upprunahøvundinum.", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 0bf6beecd..9132a567f 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -173,6 +173,8 @@ "column.edit_list": "Cuir liosta in eagar", "column.favourites": "Ceanáin", "column.firehose": "Fothaí beo", + "column.firehose_local": "Fotha beo don fhreastalaí seo", + "column.firehose_singular": "Beo-bheatha", "column.follow_requests": "Iarratais leanúnaí", "column.home": "Baile", "column.list_members": "Bainistigh baill liosta", @@ -909,9 +911,12 @@ "status.pin": "Pionnáil ar do phróifíl", "status.quote": "Luachan", "status.quote.cancel": "Cealaigh an luachan", + "status.quote_error.blocked_account_hint.title": "Tá an post seo i bhfolach mar gur chuir tú bac ar @{name}.", + "status.quote_error.blocked_domain_hint.title": "Tá an post seo i bhfolach mar gur chuir tú bac ar {domain}.", "status.quote_error.filtered": "I bhfolach mar gheall ar cheann de do scagairí", "status.quote_error.limited_account_hint.action": "Taispeáin ar aon nós", "status.quote_error.limited_account_hint.title": "Tá an cuntas seo i bhfolach ag modhnóirí {domain}.", + "status.quote_error.muted_account_hint.title": "Tá an post seo i bhfolach mar gur chuir tú @{name} ar neamhní.", "status.quote_error.not_available": "Níl an postáil ar fáil", "status.quote_error.pending_approval": "Post ar feitheamh", "status.quote_error.pending_approval_popout.body": "Ar Mastodon, is féidir leat a rialú an féidir le duine tú a lua nó nach féidir. Tá an post seo ar feitheamh fad is atá ceadú an údair bhunaidh á fháil againn.", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 00d5629df..3791acd1e 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -173,6 +173,8 @@ "column.edit_list": "Deasaich an liosta", "column.favourites": "Annsachdan", "column.firehose": "An saoghal beò", + "column.firehose_local": "Loidhne-ama bheò an fhrithealaiche seo", + "column.firehose_singular": "Loidhne-ama bheò beò", "column.follow_requests": "Iarrtasan leantainn", "column.home": "Dachaigh", "column.list_members": "Stiùir buill na liosta", @@ -247,7 +249,7 @@ "confirmations.quiet_post_quote_info.dismiss": "Na cuiribh seo ’nam chuimhne a-rithist", "confirmations.quiet_post_quote_info.got_it": "Tha mi agaibh", "confirmations.quiet_post_quote_info.message": "Nuair a luaidheas tu post a tha poblach ach sàmhach, thèid am post agad fhalach o loidhnichean-ama nan treandaichean.", - "confirmations.quiet_post_quote_info.title": "Luaidh air postaichean poblach ach sàmhach", + "confirmations.quiet_post_quote_info.title": "Luaidh air postaichean sàmhach", "confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr", "confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.", "confirmations.redraft.title": "A bheil thu airson am post a sguabadh às ⁊ dreachd ùr a dhèanamh dheth?", @@ -333,6 +335,7 @@ "empty_column.bookmarked_statuses": "Chan eil comharra-lìn ri post agad fhathast. Nuair a nì thu comharra-lìn de dh’fhear, nochdaidh e an-seo.", "empty_column.community": "Tha an loidhne-ama ionadail falamh. Sgrìobh rudeigin gu poblach airson toiseach-tòiseachaidh a dhèanamh!", "empty_column.direct": "Chan eil iomradh prìobhaideach agad fhathast. Nuair a chuireas no a gheibh thu tè, nochdaidh i an-seo.", + "empty_column.disabled_feed": "Chaidh an loidhne-ama seo a chur à comas le rianairean an fhrithealaiche agad.", "empty_column.domain_blocks": "Cha deach àrainn sam bith a bhacadh fhathast.", "empty_column.explore_statuses": "Chan eil dad a’ treandadh an-dràsta fhèin. Thoir sùil a-rithist an ceann greis!", "empty_column.favourited_statuses": "Chan eil annsachd air post agad fhathast. Nuair a nì thu annsachd de dh’fhear, nochdaidh e an-seo.", @@ -745,12 +748,12 @@ "privacy.private.short": "Luchd-leantainn", "privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon", "privacy.public.short": "Poblach", - "privacy.quote.anyone": "{visibility}, luaidhidh neach sam bith e", + "privacy.quote.anyone": "{visibility}, luaidhean fosgailte", "privacy.quote.disabled": "{visibility}, luaidh à comas", "privacy.quote.limited": "{visibility}, luaidh cuingichte", "privacy.unlisted.additional": "Tha seo coltach ris an fhaicsinneachd phoblach ach cha nochd am post air loidhnichean-ama an t-saoghail phoblaich, nan tagaichean hais no an rùrachaidh no ann an toraidhean luirg Mhastodon fiù ’s ma thug thu ro-aonta airson sin seachad.", - "privacy.unlisted.long": "Falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach", - "privacy.unlisted.short": "Poblach ach sàmhach", + "privacy.unlisted.long": "Poblach ach falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach", + "privacy.unlisted.short": "Sàmhach", "privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}", "privacy_policy.title": "Poileasaidh prìobhaideachd", "quote_error.edit": "Chan urrainn dhut luaidh a chur ris nuair a bhios tu ri deasachadh puist.", @@ -908,9 +911,12 @@ "status.pin": "Prìnich ris a’ phròifil", "status.quote": "Luaidh", "status.quote.cancel": "Sguir dhen luaidh", + "status.quote_error.blocked_account_hint.title": "Tha am post seo falaichte on a bhac thu @{name}.", + "status.quote_error.blocked_domain_hint.title": "Tha am post seo falaichte on a bhac thu {domain}.", "status.quote_error.filtered": "Falaichte le criathrag a th’ agad", "status.quote_error.limited_account_hint.action": "Seall e co-dhiù", "status.quote_error.limited_account_hint.title": "Chaidh an cunntas seo fhalach le maoir {domain}.", + "status.quote_error.muted_account_hint.title": "Tha am post seo falaichte on a mhùch thu @{name}.", "status.quote_error.not_available": "Chan eil am post ri fhaighinn", "status.quote_error.pending_approval": "Cha deach dèiligeadh ris a’ phost fhathast", "status.quote_error.pending_approval_popout.body": "Air Mastodon, ’s urrainn dhut stiùireadh am faod cuideigin do luaidh gus nach fhaod. Tha am post seo a’ feitheamh air aonta an ùghdair thùsail.", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 6ce9544cb..3cff91f0d 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -173,6 +173,8 @@ "column.edit_list": "Editar lista", "column.favourites": "Favoritas", "column.firehose": "O que acontece", + "column.firehose_local": "Acontece agora neste servidor", + "column.firehose_singular": "O que acontece", "column.follow_requests": "Peticións de seguimento", "column.home": "Inicio", "column.list_members": "Xestionar membros da lista", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 47f4ee914..a868788e5 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -194,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": "הודעה פורסמה.", @@ -911,9 +912,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": "ברשת מסטודון, ניתן להגביל את האפשרות לצטט הודעות. ההודעה הזו ממתינה עד שהמחבר.ת של ההודעה המקורית יאשרו לך את הציטוט.", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 67c9dcddc..3d662de95 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -173,6 +173,8 @@ "column.edit_list": "Lista módosítása", "column.favourites": "Kedvencek", "column.firehose": "Hírfolyamok", + "column.firehose_local": "Élő hírfolyam a kiszolgálóhoz", + "column.firehose_singular": "Élő hírfolyam", "column.follow_requests": "Követési kérések", "column.home": "Kezdőlap", "column.list_members": "Listatagok kezelése", @@ -192,6 +194,7 @@ "community.column_settings.local_only": "Csak helyi", "community.column_settings.media_only": "Csak média", "community.column_settings.remote_only": "Csak távoli", + "compose.error.blank_post": "A bejegyzés nem lehet üres.", "compose.language.change": "Nyelv megváltoztatása", "compose.language.search": "Nyelvek keresése…", "compose.published.body": "A bejegyzés publikálásra került.", @@ -909,9 +912,12 @@ "status.pin": "Kitűzés a profilodra", "status.quote": "Idézés", "status.quote.cancel": "Idézés elvetése", + "status.quote_error.blocked_account_hint.title": "Ez a bejegyzés rejtett, mert blokkoltad @{name} felhasználót.", + "status.quote_error.blocked_domain_hint.title": "Ez a bejegyzés rejtett, mert blokkoltad a(z) {domain} domaint.", "status.quote_error.filtered": "A szűrőid miatt rejtett", "status.quote_error.limited_account_hint.action": "Megjelenítés mindenképp", "status.quote_error.limited_account_hint.title": "Ezt a fiókot elrejtették a(z) {domain} moderátorai.", + "status.quote_error.muted_account_hint.title": "Ez a bejegyzés rejtett, mert némítottad @{name} felhasználót.", "status.quote_error.not_available": "A bejegyzés nem érhető el", "status.quote_error.pending_approval": "A bejegyzés függőben van", "status.quote_error.pending_approval_popout.body": "A Mastodonon te mondod meg, hogy valaki idézhet-e. Ez a bejegyzés addig függőben marad, amíg az eredeti szerző nem engedélyezi azt.", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 3f43cfb89..597fcbc80 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -194,6 +194,7 @@ "community.column_settings.local_only": "Einungis staðvært", "community.column_settings.media_only": "Einungis myndskrár", "community.column_settings.remote_only": "Einungis fjartengt", + "compose.error.blank_post": "Færsla má ekki vera auð.", "compose.language.change": "Skipta um tungumál", "compose.language.search": "Leita að tungumálum...", "compose.published.body": "Færsla birt.", @@ -911,9 +912,12 @@ "status.pin": "Festa á notandasnið", "status.quote": "Tilvitnun", "status.quote.cancel": "Hætta við tilvitnun", + "status.quote_error.blocked_account_hint.title": "Þessi færsla er falin vegna þess að ú hefur lokað á @{name}.", + "status.quote_error.blocked_domain_hint.title": "Þessi færsla er falin vegna þess að ú hefur lokað á {domain}.", "status.quote_error.filtered": "Falið vegna einnar síu sem er virk", "status.quote_error.limited_account_hint.action": "Birta samt", "status.quote_error.limited_account_hint.title": "Þessi notandaaðgangur hefur verið falinn af stjórnendum á {domain}.", + "status.quote_error.muted_account_hint.title": "Þessi færsla er falin vegna þess að ú hefur þaggað niður í @{name}.", "status.quote_error.not_available": "Færsla ekki tiltæk", "status.quote_error.pending_approval": "Færsla í bið", "status.quote_error.pending_approval_popout.body": "Á Mastodon geturðu stjórnað því hvort aðrir geti vitnað í þig. Þessi færsla bíður eftir samþykki upprunalegs höfundar.", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 152061b55..e53d55357 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -24,7 +24,7 @@ "account.blocking": "차단함", "account.cancel_follow_request": "팔로우 취소", "account.copy": "프로필 링크 복사", - "account.direct": "@{name} 님에게 개인적으로 멘션", + "account.direct": "@{name} 님에게 개인 멘션", "account.disable_notifications": "@{name} 의 게시물 알림 끄기", "account.domain_blocking": "도메인 차단함", "account.edit_profile": "프로필 편집", @@ -167,7 +167,7 @@ "column.bookmarks": "북마크", "column.community": "로컬 타임라인", "column.create_list": "리스트 만들기", - "column.direct": "개인적인 멘션", + "column.direct": "개인 멘션", "column.directory": "프로필 둘러보기", "column.domain_blocks": "차단한 도메인", "column.edit_list": "리스트 편집", @@ -194,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": "게시하였습니다.", @@ -334,7 +335,7 @@ "empty_column.blocks": "아직 아무도 차단하지 않았습니다.", "empty_column.bookmarked_statuses": "아직 북마크에 저장한 게시물이 없습니다. 게시물을 북마크 지정하면 여기에 나타납니다.", "empty_column.community": "로컬 타임라인에 아무것도 없습니다. 아무거나 적어 보세요!", - "empty_column.direct": "개인적인 멘션이 없습니다. 보내거나 받으면 여기에 표시됩니다.", + "empty_column.direct": "개인 멘션이 없습니다. 보내거나 받으면 여기에 표시됩니다.", "empty_column.disabled_feed": "이 피드는 서버 관리자에 의해 비활성화되었습니다.", "empty_column.domain_blocks": "아직 차단한 도메인이 없습니다.", "empty_column.explore_statuses": "아직 유행하는 것이 없습니다. 나중에 다시 확인하세요!", @@ -427,7 +428,7 @@ "hashtag.column_settings.tag_mode.all": "모두", "hashtag.column_settings.tag_mode.any": "어느것이든", "hashtag.column_settings.tag_mode.none": "이것들을 제외하고", - "hashtag.column_settings.tag_toggle": "추가 해시태그를 이 컬럼에 추가합니다", + "hashtag.column_settings.tag_toggle": "추가 해시태그를 이 칼럼에 포함하기", "hashtag.counter_by_accounts": "{count, plural, other {참여자 {counter}명}}", "hashtag.counter_by_uses": "{count, plural, other {게시물 {counter}개}}", "hashtag.counter_by_uses_today": "오늘 {count, plural, other {{counter} 개의 게시물}}", @@ -479,7 +480,7 @@ "keyboard_shortcuts.column": "해당 컬럼에 포커스", "keyboard_shortcuts.compose": "작성창에 포커스", "keyboard_shortcuts.description": "설명", - "keyboard_shortcuts.direct": "개인적인 멘션 컬럼 열기", + "keyboard_shortcuts.direct": "개인 멘션 칼럼 열기", "keyboard_shortcuts.down": "리스트에서 아래로 이동", "keyboard_shortcuts.enter": "게시물 열기", "keyboard_shortcuts.favourite": "게시물 좋아요", @@ -567,7 +568,7 @@ "navigation_bar.automated_deletion": "게시물 자동 삭제", "navigation_bar.blocks": "차단한 사용자", "navigation_bar.bookmarks": "북마크", - "navigation_bar.direct": "개인적인 멘션", + "navigation_bar.direct": "개인 멘션", "navigation_bar.domain_blocks": "차단한 도메인", "navigation_bar.favourites": "좋아요", "navigation_bar.filters": "뮤트한 단어", @@ -673,7 +674,7 @@ "notifications.column_settings.push": "푸시 알림", "notifications.column_settings.quote": "인용:", "notifications.column_settings.reblog": "부스트:", - "notifications.column_settings.show": "컬럼에 표시", + "notifications.column_settings.show": "칼럼에 표시", "notifications.column_settings.sound": "효과음 재생", "notifications.column_settings.status": "새 게시물:", "notifications.column_settings.unread_notifications.category": "읽지 않은 알림", @@ -707,7 +708,7 @@ "notifications.policy.filter_not_following_hint": "내가 수동으로 승인하지 않는 한", "notifications.policy.filter_not_following_title": "내가 팔로우하지 않는 사람들", "notifications.policy.filter_private_mentions_hint": "내가 한 멘션에 단 답글이거나 내가 발신자를 팔로우 한 것이 아닌 이상 걸러집니다", - "notifications.policy.filter_private_mentions_title": "청하지 않은 개인적인 멘션", + "notifications.policy.filter_private_mentions_title": "청하지 않은 개인 멘션", "notifications.policy.title": "알림 조건 설정", "notifications_permission_banner.enable": "데스크탑 알림 활성화", "notifications_permission_banner.how_to_control": "마스토돈이 열려 있지 않을 때에도 알림을 받으려면, 데스크탑 알림을 활성화 하세요. 당신은 어떤 종류의 반응이 데스크탑 알림을 발생할 지를 {icon} 버튼을 통해 세세하게 설정할 수 있습니다.", @@ -887,8 +888,8 @@ "status.delete": "삭제", "status.delete.success": "게시물 삭제됨", "status.detailed_status": "대화 자세히 보기", - "status.direct": "@{name} 님에게 개인적으로 멘션", - "status.direct_indicator": "개인적인 멘션", + "status.direct": "@{name} 님에게 개인 멘션", + "status.direct_indicator": "개인 멘션", "status.edit": "수정", "status.edited": "{date}에 마지막으로 편집됨", "status.edited_x_times": "{count, plural, other {{count}}} 번 수정됨", @@ -910,11 +911,15 @@ "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": "계류 중인 게시물", + "status.quote_error.pending_approval_popout.body": "Mastodon에서는 타인이 인용할 수 있는지 여부를 제어할 수 있습니다. 이 게시물은 원저자의 승인을 얻을 때까지 계류됩니다.", "status.quote_error.revoked": "원작성자에 의해 게시물 삭제됨", "status.quote_followers_only": "팔로워만 인용할 수 있는 게시물", "status.quote_manual_review": "작성자가 직접 검토합니다", @@ -924,6 +929,8 @@ "status.quote_private": "비공개 게시물은 인용할 수 없습니다", "status.quotes": "{count, plural, other {인용}}", "status.quotes.empty": "아직 아무도 이 게시물을 인용하지 않았습니다. 누군가 인용한다면 여기에 표시됩니다.", + "status.quotes.local_other_disclaimer": "원작자가 거부한 인용은 표시되지 않습니다.", + "status.quotes.remote_other_disclaimer": "{domain}의 인용만 여기에 확정적으로 보여집니다. 원작자가 거부한 인용은 보여지지 않습니다.", "status.read_more": "더 보기", "status.reblog": "부스트", "status.reblog_or_quote": "부스트 또는 인용", @@ -1005,6 +1012,8 @@ "video.volume_up": "음량 증가", "visibility_modal.button_title": "공개범위 설정", "visibility_modal.header": "공개범위와 반응", + "visibility_modal.helper.direct_quoting": "마스토돈에서 작성된 개인적인 멘션은 남들이 인용할 수 없습니다.", + "visibility_modal.helper.privacy_editing": "공개범위는 게시한 다음 수정할 수 없습니다.", "visibility_modal.helper.privacy_private_self_quote": "자신의 비공개 게시물을 공개 게시물로 인용할 수 없습니다.", "visibility_modal.helper.private_quoting": "마스토돈에서 작성된 팔로워 전용 게시물은 다른 사용자가 인용할 수 없습니다.", "visibility_modal.helper.unlisted_quoting": "사람들에게 인용된 경우, 인용한 게시물도 유행 타임라인에서 감추게 됩니다.", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index b08362d03..0c48cbc61 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -194,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.", @@ -911,9 +912,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.", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 2e368444e..237ee9eac 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", @@ -905,9 +907,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.", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 63df99769..bf85068c8 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": "การกล่าวถึงแบบส่วนตัว", @@ -827,6 +860,7 @@ "status.redraft": "ลบแล้วร่างใหม่", "status.remove_bookmark": "เอาที่คั่นหน้าออก", "status.remove_favourite": "เอาออกจากรายการโปรด", + "status.remove_quote": "เอาออก", "status.replied_in_thread": "ตอบกลับในกระทู้", "status.replied_to": "ตอบกลับ {name}", "status.reply": "ตอบกลับ", @@ -885,5 +919,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..6f74eb30b 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -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ı.", @@ -333,6 +336,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.", @@ -908,9 +912,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.", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 8c475d548..7c6055c76 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -194,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.", @@ -911,9 +912,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.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 5cf3dbff9..ab68e5ca6 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": "嘟文已发布。", @@ -333,6 +336,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": "你没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。", @@ -908,9 +912,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上,你可以控制其他人引用你嘟文的权限。此嘟文在得到原作者的同意后就会发布。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 7525498c2..e9b648c35 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -194,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": "發嘟成功。", @@ -911,9 +912,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 控制是否允許引用您的嘟文。此嘟文正在等待原始作者審核。", diff --git a/config/locales/de.yml b/config/locales/de.yml index e4a579575..4b2c10fa3 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 @@ -851,10 +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. @@ -1193,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. diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 864942612..e8c9a2568 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -839,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 on keskeistä uusien käyttäjien perehdyttämisessä, jotka eivät ehkä tunne ketään Mastodonissa. Hallitse, miten eri löydettävyysominaisuudet 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 @@ -1200,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 @@ -2085,7 +2085,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/gd.yml b/config/locales/gd.yml index 3b1f956fe..5406b6411 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 @@ -879,7 +881,13 @@ gd: 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. @@ -2028,7 +2036,7 @@ gd: private: Luchd-leantainn a-mhàin public: Poblach public_long: Neach sam bith taobh a-staigh no a-muigh Mhastodon - unlisted: Poblach ach sàmhach + 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/hu.yml b/config/locales/hu.yml index a90e8a5c2..ca3f337f4 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -855,6 +855,11 @@ hu: 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/ko.yml b/config/locales/ko.yml index 118f7ed90..eda169a28 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1895,7 +1895,7 @@ ko: reblog: 부스트는 고정될 수 없습니다 quote_error: not_available: 게시물 사용 불가 - pending_approval: 게시물 대기중 + pending_approval: 계류 중인 게시물 revoked: 원작성자에 의해 게시물 삭제됨 quote_policies: followers: 팔로워만 diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 74b6e5d9e..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 @@ -233,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 @@ -246,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 @@ -280,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) diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 296d5def5..048c27e98 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -93,7 +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 mitä sivua uudet kävijät näkevät saapuessaan palvelimellesi. Jos valitset "Trendit", trendien tulee olla käytössä Löytöasetuksissa. Jos valitset "Paikallinen syöte", "Pääsy paikallisten julkaisujen live-syötteisiin" tulee asettaa "Kaikille" Löytöasetuksissa. + 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ä @@ -145,7 +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, territoriumi tai valtio, jonka sisäiset substantiiviset lait säätelevät kaikkia vaateita. + 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. @@ -174,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ö diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index bc4c3b7f0..3f918c2eb 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -65,7 +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 bhriosnachadh 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 nan %{options_icon} (roghainnean). + 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 @@ -93,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 @@ -288,6 +289,7 @@ 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) diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 0e41641d6..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 @@ -286,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) diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 5b7c6f33e..b8348032f 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -89,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: 고급 웹 인터페이스의 그림을 대체합니다. diff --git a/config/locales/th.yml b/config/locales/th.yml index 202e2c003..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: สำหรับภาษา @@ -792,6 +796,9 @@ th: all: ให้กับทุกคน disabled: ให้กับไม่มีใคร users: ให้กับผู้ใช้ในเซิร์ฟเวอร์ที่เข้าสู่ระบบ + landing_page: + values: + about: เกี่ยวกับ registrations: moderation_recommandation: โปรดตรวจสอบให้แน่ใจว่าคุณมีทีมการกลั่นกรองที่เพียงพอและมีปฏิกิริยาตอบสนองก่อนที่คุณจะเปิดการลงทะเบียนให้กับทุกคน! preamble: ควบคุมผู้ที่สามารถสร้างบัญชีในเซิร์ฟเวอร์ของคุณ @@ -1019,6 +1026,14 @@ th: other: ใช้โดย %{count} คนในช่วงสัปดาห์ที่ผ่านมา title: คำแนะนำและแนวโน้ม trending: กำลังนิยม + username_blocks: + delete: ลบ + edit: + title: แก้ไขกฎชื่อผู้ใช้ + new: + create: สร้างกฎ + title: สร้างกฎชื่อผู้ใช้ใหม่ + title: กฎชื่อผู้ใช้ warning_presets: add_new: เพิ่มใหม่ delete: ลบ @@ -1090,6 +1105,7 @@ th: hint_html: หากคุณต้องการย้ายจากบัญชีอื่นไปยังบัญชีนี้ ที่นี่คุณสามารถสร้างนามแฝง ซึ่งจำเป็นก่อนที่คุณจะสามารถดำเนินการต่อด้วยการย้ายผู้ติดตามจากบัญชีเก่าไปยังบัญชีนี้ การกระทำนี้โดยตัวการกระทำเอง ไม่เป็นอันตรายและย้อนกลับได้ การโยกย้ายบัญชีเริ่มต้นจากบัญชีเก่า remove: เลิกเชื่อมโยงนามแฝง appearance: + advanced_settings: การตั้งค่าขั้นสูง animations_and_accessibility: ภาพเคลื่อนไหวและการช่วยการเข้าถึง discovery: การค้นพบ localization: @@ -1465,6 +1481,11 @@ th: expires_at: หมดอายุเมื่อ uses: การใช้งาน title: เชิญผู้คน + link_preview: + author_html: โดย %{name} + potentially_sensitive_content: + action: คลิกเพื่อแสดง + hide_button: ซ่อน lists: errors: limit: คุณมีรายการถึงจำนวนสูงสุดแล้ว @@ -1765,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/zh-CN.yml b/config/locales/zh-CN.yml index e7385e392..ea98c6e73 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -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: 添加规则 @@ -837,6 +839,7 @@ zh-CN: feed_access: modes: authenticated: 仅已登录用户 + disabled: 需要特定的用户角色 public: 所有人 landing_page: values: From aa579ce286883586c6e56f8f64c322d54fddc878 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Fri, 31 Oct 2025 15:20:59 +0100 Subject: [PATCH 66/90] Fix initially selected language in Rules panel, hide selector when no alternative translations exist (#36672) --- .../features/about/components/rules.tsx | 68 +++++++++++++------ 1 file changed, 46 insertions(+), 22 deletions(-) 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 && ( +
+ + +
+ )} ); }; From af4c372ab22b636742833592235d18418604fcc1 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 31 Oct 2025 14:28:02 +0100 Subject: [PATCH 67/90] Bump version to v4.5.0-rc.2 --- CHANGELOG.md | 2 ++ lib/mastodon/version.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b706b8ac4..cb546c08d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ All notable changes to this project will be documented in this file. - 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 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) @@ -70,6 +71,7 @@ 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) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 8f5f0f9c9..ce2e75e6e 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'rc.1' + 'rc.2' end def prerelease From a209b8e544f496152946022396ae9d8eccd8b5b9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:09:54 +0100 Subject: [PATCH 68/90] chore(deps): update dependency rubyzip to v3.2.2 (#36687) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2a0da53d4..c1b8276ce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -791,7 +791,7 @@ GEM ruby-vips (2.2.5) ffi (~> 1.12) logger - rubyzip (3.2.1) + rubyzip (3.2.2) rufus-scheduler (3.9.2) fugit (~> 1.1, >= 1.11.1) safety_net_attestation (0.5.0) From 93acfdd7d3ae7939a6bf45c2e889b2d2afa5b537 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 12:05:26 +0100 Subject: [PATCH 69/90] chore(deps): update dependency irb to v1.15.3 (#36682) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c1b8276ce..eb1f8e93b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -224,7 +224,7 @@ GEM mail (~> 2.7) email_validator (2.2.4) activemodel - erb (5.1.1) + 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) @@ -691,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 From 6d53ca63d6fa84db527fab9b51b678c76bdf606e Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 3 Nov 2025 14:56:07 +0100 Subject: [PATCH 70/90] Disable paste-link-to-quote flow when composing Private Mentions (#36690) --- app/javascript/mastodon/actions/compose_typed.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/actions/compose_typed.ts b/app/javascript/mastodon/actions/compose_typed.ts index 0f9bf5cfb..808830602 100644 --- a/app/javascript/mastodon/actions/compose_typed.ts +++ b/app/javascript/mastodon/actions/compose_typed.ts @@ -191,7 +191,8 @@ export const pasteLinkCompose = createDataLoadingThunk( composeState.get('is_submitting') || composeState.get('poll') || composeState.get('is_uploading') || - composeState.get('id') + composeState.get('id') || + composeState.get('privacy') === 'direct' ) return; From 16a54f7158eee82dcf408eaaa82b0e307bd001a4 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 3 Nov 2025 15:15:18 +0100 Subject: [PATCH 71/90] Fix issuance of quote approval for remote private statuses (#36693) --- .../activitypub/quote_authorizations_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 05964f571bea223ae6710e9965d997dcd1ce1d97 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 3 Nov 2025 15:16:25 +0100 Subject: [PATCH 72/90] Prevent creation of Private Mentions quoting someone who is not mentioned (#36689) --- app/services/post_status_service.rb | 12 +++++++ config/locales/en.yml | 1 + spec/requests/api/v1/statuses_spec.rb | 45 +++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) 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/config/locales/en.yml b/config/locales/en.yml index b647c5ddf..949eb6d90 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1930,6 +1930,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/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb index ed41e5420..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', @@ -237,7 +237,48 @@ RSpec.describe '/api/v1/statuses' do end it 'returns a quote post, as well as rate limit headers', :aggregate_failures do - subject + 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) From b5a6feb3bf8883b5c5c423914c492e76ce2ee8fe Mon Sep 17 00:00:00 2001 From: Rachael Wright-Munn Date: Mon, 3 Nov 2025 12:56:17 -0500 Subject: [PATCH 73/90] Move "Privacy and reach" from "Public profile" to top-level navigation (#27294) --- app/views/settings/privacy/show.html.haml | 3 +-- app/views/settings/shared/_profile_navigation.html.haml | 1 - config/navigation.rb | 3 ++- 3 files changed, 3 insertions(+), 4 deletions(-) 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/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 From e62baacfc11508eb1d2ac1c1bcc3c4bd615d940b Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 4 Nov 2025 09:29:27 +0100 Subject: [PATCH 74/90] Increase number of quote approval job retries (#36698) --- app/workers/activitypub/refetch_and_verify_quote_worker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From a7ecfc1ca5d2aab3cbbbc88c357a0b0d8042cdfd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 09:41:19 +0100 Subject: [PATCH 75/90] fix(deps): update dependency @rails/ujs to v7.1.600 (#36634) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ae482f478..cbdfe2cdd 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", diff --git a/yarn.lock b/yarn.lock index d0f54b81c..636e89170 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2795,7 +2795,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" @@ -3292,10 +3292,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 From 1baede0a7c757b9ec3c65a5250b9ec0ff4354e13 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:32:38 +0100 Subject: [PATCH 76/90] chore(deps): update dependency brakeman to v7.1.1 (#35434) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index eb1f8e93b..9e0eab42f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) From 449eb03f11aca90ace859469c7212e31b0f11c4b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:41:59 +0100 Subject: [PATCH 77/90] chore(deps): update dependency sidekiq to v8.0.9 (#36699) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9e0eab42f..417b89ffa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -621,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) @@ -805,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) From dd708298a8c885ba53cc5528ad0e9158b58cd9ab Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 4 Nov 2025 11:37:43 +0100 Subject: [PATCH 78/90] Remove option to disable access to local topic feeds for logged-in users (#36703) --- app/javascript/mastodon/initial_state.ts | 2 +- app/models/form/admin_settings.rb | 3 ++- app/views/admin/settings/discovery/show.html.haml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/initial_state.ts b/app/javascript/mastodon/initial_state.ts index 83c6c35e1..86d36468f 100644 --- a/app/javascript/mastodon/initial_state.ts +++ b/app/javascript/mastodon/initial_state.ts @@ -35,7 +35,7 @@ interface InitialStateMeta { streaming_api_base_url: string; local_live_feed_access: 'public' | 'authenticated' | 'disabled'; remote_live_feed_access: 'public' | 'authenticated' | 'disabled'; - local_topic_feed_access: 'public' | 'authenticated' | 'disabled'; + local_topic_feed_access: 'public' | 'authenticated'; remote_topic_feed_access: 'public' | 'authenticated' | 'disabled'; title: string; show_trends: boolean; diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 926995f02..af4ad38ae 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -87,6 +87,7 @@ class Form::AdminSettings DOMAIN_BLOCK_AUDIENCES = %w(disabled users all).freeze REGISTRATION_MODES = %w(open approved none).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) @@ -99,7 +100,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) } diff --git a/app/views/admin/settings/discovery/show.html.haml b/app/views/admin/settings/discovery/show.html.haml index 1272419c3..04c242597 100644 --- a/app/views/admin/settings/discovery/show.html.haml +++ b/app/views/admin/settings/discovery/show.html.haml @@ -43,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 From a978e37f4cb6813ad4af8eaf3f30e402b7f3760c Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 4 Nov 2025 12:01:25 +0100 Subject: [PATCH 79/90] Fix quote dropdown menu item in detailed status view (#36704) --- app/javascript/mastodon/features/status/index.jsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index bcccc1104..140413d1a 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -299,6 +299,12 @@ class Status extends ImmutablePureComponent { dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId, onChange: handleChange } })); }; + handleQuote = (status) => { + const { dispatch } = this.props; + + dispatch(quoteComposeById(status.get('id'))); + }; + handleEditClick = (status) => { const { dispatch, askReplyConfirmation } = this.props; @@ -625,6 +631,7 @@ class Status extends ImmutablePureComponent { onDelete={this.handleDeleteClick} onRevokeQuote={this.handleRevokeQuoteClick} onQuotePolicyChange={this.handleQuotePolicyChange} + onQuote={this.handleQuote} onEdit={this.handleEditClick} onDirect={this.handleDirectClick} onMention={this.handleMentionClick} From 0b50789c5bfdf0225b4d716c11f0ea8977c66078 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 4 Nov 2025 16:30:10 +0100 Subject: [PATCH 80/90] Fix Skeleton placeholders being animated when setting to reduce animations is enabled (#36716) --- app/javascript/styles/mastodon/admin.scss | 4 ++++ 1 file changed, 4 insertions(+) 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 { From 5253527ec4af6f9999a8db8152cd34f748fec4e7 Mon Sep 17 00:00:00 2001 From: Echo Date: Thu, 30 Oct 2025 13:30:42 +0100 Subject: [PATCH 81/90] Add CSS Module support (#36637) --- package.json | 1 + tsconfig.json | 3 +- vite.config.mts | 41 ++++++ yarn.lock | 322 ++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 356 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index cbdfe2cdd..44c60bb4a 100644 --- a/package.json +++ b/package.json @@ -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/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 30c0741aa..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({ diff --git a/yarn.lock b/yarn.lock index 636e89170..48a748a1f 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" @@ -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" @@ -4344,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" @@ -6107,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" @@ -6581,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" @@ -6748,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" @@ -8037,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 @@ -8254,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: @@ -8263,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" @@ -8298,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" @@ -8775,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" @@ -9165,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" @@ -9182,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" @@ -9238,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" @@ -9388,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" @@ -9519,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: @@ -9766,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" @@ -10140,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" @@ -10370,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" @@ -10668,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" @@ -10686,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" @@ -10882,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: @@ -11043,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" @@ -11759,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" @@ -12068,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: @@ -12085,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" @@ -12128,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" @@ -12417,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 @@ -12448,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" @@ -13002,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" @@ -13377,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 @@ -13518,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" @@ -14607,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 From 5bae08d1ff9962c2ab31400c06d1c264c8154460 Mon Sep 17 00:00:00 2001 From: Echo Date: Tue, 4 Nov 2025 17:32:52 +0100 Subject: [PATCH 82/90] Quote Posts: Add notifications for DMs and private posts (#36696) --- app/javascript/mastodon/actions/compose.js | 8 -- .../mastodon/actions/compose_typed.ts | 37 +++++++- .../compose/components/compose_form.jsx | 5 +- .../compose/components/visibility_button.tsx | 6 +- .../containers/compose_form_container.js | 12 ++- .../containers/privacy_dropdown_container.js | 5 +- .../confirmation_modal.tsx | 4 + .../private_quote_notify.tsx | 88 +++++++++++++++++++ .../confirmation_modals/styles.module.css | 7 ++ .../features/ui/components/modal_root.jsx | 2 + .../ui/components/visibility_modal.tsx | 20 ++++- app/javascript/mastodon/locales/en.json | 7 ++ app/javascript/mastodon/reducers/compose.js | 34 +++++-- .../styles/mastodon/components.scss | 28 ++++++ 14 files changed, 236 insertions(+), 27 deletions(-) create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/private_quote_notify.tsx create mode 100644 app/javascript/mastodon/features/ui/components/confirmation_modals/styles.module.css diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 2d4f48c20..232c4b1c1 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -56,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'; @@ -794,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 808830602..03a973ec0 100644 --- a/app/javascript/mastodon/actions/compose_typed.ts +++ b/app/javascript/mastodon/actions/compose_typed.ts @@ -13,10 +13,10 @@ 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 { showAlert } from './alerts'; -import { focusCompose } from './compose'; +import { changeCompose, focusCompose } from './compose'; import { importFetchedStatuses } from './importer'; import { openModal } from './modal'; @@ -67,6 +67,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 ( diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index 299de12e7..770f77604 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -140,7 +140,10 @@ class ComposeForm extends ImmutablePureComponent { return; } - this.props.onSubmit(missingAltTextModal && this.props.missingAltText && this.props.privacy !== 'direct'); + this.props.onSubmit({ + missingAltText: missingAltTextModal && this.props.missingAltText && this.props.privacy !== 'direct', + quoteToPrivate: this.props.quoteToPrivate, + }); if (e) { e.preventDefault(); diff --git a/app/javascript/mastodon/features/compose/components/visibility_button.tsx b/app/javascript/mastodon/features/compose/components/visibility_button.tsx index 1ea504ab1..d93940502 100644 --- a/app/javascript/mastodon/features/compose/components/visibility_button.tsx +++ b/app/javascript/mastodon/features/compose/components/visibility_button.tsx @@ -5,8 +5,10 @@ import { defineMessages, useIntl } from 'react-intl'; import classNames from 'classnames'; -import { changeComposeVisibility } from '@/mastodon/actions/compose'; -import { setComposeQuotePolicy } from '@/mastodon/actions/compose_typed'; +import { + changeComposeVisibility, + setComposeQuotePolicy, +} from '@/mastodon/actions/compose_typed'; import { openModal } from '@/mastodon/actions/modal'; import type { ApiQuotePolicy } from '@/mastodon/api_types/quotes'; import type { StatusVisibility } from '@/mastodon/api_types/statuses'; diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index 3dad46bc5..15b1c7cc4 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -12,6 +12,7 @@ import { } from 'mastodon/actions/compose'; import { pasteLinkCompose } from 'mastodon/actions/compose_typed'; import { openModal } from 'mastodon/actions/modal'; +import { PRIVATE_QUOTE_MODAL_ID } from 'mastodon/features/ui/components/confirmation_modals/private_quote_notify'; import ComposeForm from '../components/compose_form'; @@ -32,6 +33,10 @@ const mapStateToProps = state => ({ isUploading: state.getIn(['compose', 'is_uploading']), anyMedia: state.getIn(['compose', 'media_attachments']).size > 0, missingAltText: state.getIn(['compose', 'media_attachments']).some(media => ['image', 'gifv'].includes(media.get('type')) && (media.get('description') ?? '').length === 0), + quoteToPrivate: + !!state.getIn(['compose', 'quoted_status_id']) + && state.getIn(['compose', 'privacy']) === 'private' + && !state.getIn(['settings', 'dismissed_banners', PRIVATE_QUOTE_MODAL_ID]), isInReply: state.getIn(['compose', 'in_reply_to']) !== null, lang: state.getIn(['compose', 'language']), maxChars: state.getIn(['server', 'server', 'configuration', 'statuses', 'max_characters'], 500), @@ -43,12 +48,17 @@ const mapDispatchToProps = (dispatch, props) => ({ dispatch(changeCompose(text)); }, - onSubmit (missingAltText) { + onSubmit ({ missingAltText, quoteToPrivate }) { if (missingAltText) { dispatch(openModal({ modalType: 'CONFIRM_MISSING_ALT_TEXT', modalProps: {}, })); + } else if (quoteToPrivate) { + dispatch(openModal({ + modalType: 'CONFIRM_PRIVATE_QUOTE_NOTIFY', + modalProps: {}, + })); } else { dispatch(submitCompose((status) => { if (props.redirectOnSuccess) { diff --git a/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js b/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js index 6d3eef13a..803dcb1a4 100644 --- a/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js +++ b/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js @@ -1,8 +1,7 @@ import { connect } from 'react-redux'; -import { changeComposeVisibility } from '../../../actions/compose'; -import { openModal, closeModal } from '../../../actions/modal'; -import { isUserTouching } from '../../../is_mobile'; +import { changeComposeVisibility } from '@/mastodon/actions/compose_typed'; + import PrivacyDropdown from '../components/privacy_dropdown'; const mapStateToProps = state => ({ diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx index 47f9fca89..cfa50855a 100644 --- a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx @@ -18,6 +18,7 @@ export const ConfirmationModal: React.FC< onSecondary?: () => void; onConfirm: () => void; closeWhenConfirm?: boolean; + extraContent?: React.ReactNode; } & BaseConfirmationModalProps > = ({ title, @@ -29,6 +30,7 @@ export const ConfirmationModal: React.FC< secondary, onSecondary, closeWhenConfirm = true, + extraContent, }) => { const handleClick = useCallback(() => { if (closeWhenConfirm) { @@ -49,6 +51,8 @@ export const ConfirmationModal: React.FC<

{title}

{message &&

{message}

} + + {extraContent}
diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/private_quote_notify.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/private_quote_notify.tsx new file mode 100644 index 000000000..ef917a102 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/private_quote_notify.tsx @@ -0,0 +1,88 @@ +import { forwardRef, useCallback, useState } from 'react'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import { submitCompose } from '@/mastodon/actions/compose'; +import { changeSetting } from '@/mastodon/actions/settings'; +import { CheckBox } from '@/mastodon/components/check_box'; +import { useAppDispatch } from '@/mastodon/store'; + +import { ConfirmationModal } from './confirmation_modal'; +import type { BaseConfirmationModalProps } from './confirmation_modal'; +import classes from './styles.module.css'; + +export const PRIVATE_QUOTE_MODAL_ID = 'quote/private_notify'; + +const messages = defineMessages({ + title: { + id: 'confirmations.private_quote_notify.title', + defaultMessage: 'Share with followers and mentioned users?', + }, + message: { + id: 'confirmations.private_quote_notify.message', + defaultMessage: + 'The person you are quoting and other mentions ' + + "will be notified and will be able to view your post, even if they're not following you.", + }, + confirm: { + id: 'confirmations.private_quote_notify.confirm', + defaultMessage: 'Publish post', + }, + cancel: { + id: 'confirmations.private_quote_notify.cancel', + defaultMessage: 'Back to editing', + }, +}); + +export const PrivateQuoteNotify = forwardRef< + HTMLDivElement, + BaseConfirmationModalProps +>( + ( + { onClose }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _ref, + ) => { + const intl = useIntl(); + + const [dismiss, setDismissed] = useState(false); + const handleDismissToggle = useCallback(() => { + setDismissed((prev) => !prev); + }, []); + + const dispatch = useAppDispatch(); + const handleConfirm = useCallback(() => { + dispatch(submitCompose()); + if (dismiss) { + dispatch( + changeSetting(['dismissed_banners', PRIVATE_QUOTE_MODAL_ID], true), + ); + } + }, [dismiss, dispatch]); + + return ( + + {' '} + + + } + /> + ); + }, +); +PrivateQuoteNotify.displayName = 'PrivateQuoteNotify'; diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/styles.module.css b/app/javascript/mastodon/features/ui/components/confirmation_modals/styles.module.css new file mode 100644 index 000000000..f685c4525 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/styles.module.css @@ -0,0 +1,7 @@ +.checkbox_wrapper { + display: flex; + align-items: center; + gap: 0.5rem; + margin: 1rem 0; + cursor: pointer; +} diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx index 944feb325..ad5f16d94 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx @@ -47,6 +47,7 @@ import MediaModal from './media_modal'; import { ModalPlaceholder } from './modal_placeholder'; import VideoModal from './video_modal'; import { VisibilityModal } from './visibility_modal'; +import { PrivateQuoteNotify } from './confirmation_modals/private_quote_notify'; export const MODAL_COMPONENTS = { 'MEDIA': () => Promise.resolve({ default: MediaModal }), @@ -66,6 +67,7 @@ export const MODAL_COMPONENTS = { 'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }), 'CONFIRM_FOLLOW_TO_LIST': () => Promise.resolve({ default: ConfirmFollowToListModal }), 'CONFIRM_MISSING_ALT_TEXT': () => Promise.resolve({ default: ConfirmMissingAltTextModal }), + 'CONFIRM_PRIVATE_QUOTE_NOTIFY': () => Promise.resolve({ default: PrivateQuoteNotify }), 'CONFIRM_REVOKE_QUOTE': () => Promise.resolve({ default: ConfirmRevokeQuoteModal }), 'CONFIRM_QUIET_QUOTE': () => Promise.resolve({ default: QuietPostQuoteInfoModal }), 'MUTE': MuteModal, diff --git a/app/javascript/mastodon/features/ui/components/visibility_modal.tsx b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx index afd9ee7ed..7bc7e0ab9 100644 --- a/app/javascript/mastodon/features/ui/components/visibility_modal.tsx +++ b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx @@ -128,9 +128,12 @@ export const VisibilityModal: FC = forwardRef( const disableVisibility = !!statusId; const disableQuotePolicy = visibility === 'private' || visibility === 'direct'; - const disablePublicVisibilities: boolean = useAppSelector( + const disablePublicVisibilities = useAppSelector( selectDisablePublicVisibilities, ); + const isQuotePost = useAppSelector( + (state) => state.compose.get('quoted_status_id') !== null, + ); const visibilityItems = useMemo[]>(() => { const items: SelectItem[] = [ @@ -315,6 +318,21 @@ export const VisibilityModal: FC = forwardRef( id={quoteDescriptionId} />
+ + {isQuotePost && visibility === 'direct' && ( +
+ + +
+ )}
- - - - - - - - - - - - - - - - - - - - - - + 在社交网络和人们互动。", "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": "复制下列代码以在你的网站中嵌入此嘟文。", @@ -336,7 +341,7 @@ "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加书签。添加书签后的嘟文会显示在这里。", "empty_column.community": "本站时间线还没有内容,写点什么并公开发布,让它活跃起来吧!", "empty_column.direct": "你还未使用过私下提及。当你发出或者收到私下提及时,它将显示在此。", - "empty_column.disabled_feed": "此动态已被您的服务器管理员禁用。", + "empty_column.disabled_feed": "此动态已被你的服务器管理员禁用。", "empty_column.domain_blocks": "暂且没有被屏蔽的站点。", "empty_column.explore_statuses": "目前没有热门内容,稍后再来看看吧!", "empty_column.favourited_statuses": "你没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。", @@ -665,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": "提及:", @@ -759,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": "不允许引用有媒体附件的嘟文。", @@ -811,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}", @@ -864,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": "登录或注册", @@ -961,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": "主页", @@ -1012,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 e9b648c35..924edc7fb 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -247,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": "當引用不於公開時間軸顯示之嘟文時,您的嘟文將自熱門時間軸隱藏。", @@ -605,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} 要求跟隨您", @@ -759,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": "無法引用多媒體內容嘟文。", @@ -1012,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/config/locales/be.yml b/config/locales/be.yml index 2a9a61c34..dd46c81c8 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -2015,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/ca.yml b/config/locales/ca.yml index caa472fb3..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 @@ -895,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 @@ -902,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: @@ -1577,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 @@ -1885,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}' @@ -1899,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 9c69ab844..8bfc5ecd8 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -2015,6 +2015,7 @@ 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 diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 4b875b2c0..54973fe9c 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -911,6 +911,11 @@ cy: 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. diff --git a/config/locales/da.yml b/config/locales/da.yml index c6a30afaa..45f3a9365 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1929,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 4b2c10fa3..71d9eb5b8 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1929,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 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.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.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/el.yml b/config/locales/el.yml index 0f2339b1c..0bbffd2a1 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1929,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/es-AR.yml b/config/locales/es-AR.yml index eec0c3f46..cce8987f7 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1929,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 ecfc06836..d0dfe8273 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1929,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 da0d9ac34..fa1b55fcf 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1929,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 8f56b20b1..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 @@ -855,6 +857,8 @@ et: 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! @@ -1419,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 @@ -1524,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}. @@ -1543,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: @@ -1561,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 @@ -1674,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 @@ -1925,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/fa.yml b/config/locales/fa.yml index 92e305bce..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,6 +839,7 @@ fa: title: درخواست خروج از اندیس‌گذاری پیش‌گزیدهٔ موتور جست‌وجو discovery: follow_recommendations: پیروی از پیشنهادها + preamble: ارائه محتوای جذّاب برای آغاز به کار کاربرانی که شاید کسی را روی ماستودون نشناسند ضروری است. واپایش چگونگی کار کردن ویژگی‌های کشف روی کارسازتان. privacy: محرمانگی profile_directory: شاخهٔ نمایه public_timelines: خط زمانی‌های عمومی @@ -847,6 +850,16 @@ fa: all: برای همه disabled: برای هیچ‌کدام users: برای کاربران محلی واردشده + feed_access: + modes: + authenticated: تنها کاربران تأیید شده + disabled: نیازمند نقش کاربری خاص + public: هرکسی + landing_page: + values: + about: درباره + local_feed: خوراک محلی + trends: داغ‌ها registrations: moderation_recommandation: لطفاً قبل از اینکه ثبت نام را برای همه باز کنید، مطمئن شوید که یک تیم نظارتی مناسب و واکنشی دارید! preamble: کنترل کنید چه کسی می تواند در سرور شما یک حساب ایجاد کند. @@ -900,6 +913,7 @@ fa: no_status_selected: هیچ فرسته‌ای تغییری نکرد زیرا هیچ‌کدام از آن‌ها انتخاب نشده بودند open: گشودن فرسته original_status: فرستهٔ اصلی + quotes: نقل‌ها reblogs: تقویت‌ها replied_to_html: به %{acct_link} پاسخ داد status_changed: فرسته تغییر کرد @@ -907,6 +921,7 @@ fa: title: پست‌های حساب - @%{name} trending: پرطرفدار view_publicly: مشاهده عمومی + view_quoted_post: دیدن فرستهٔ نقل شده visibility: نمایانی with_media: دارای عکس یا ویدیو strikes: @@ -1181,7 +1196,10 @@ fa: hint_html: اگر می‌خواهید از حساب دیگری به این حساب منتقل شوید، این‌جا می‌توانید یک نام مستعار بسازید که برای انتقال از حساب قدیمی به این حساب لازم است. این کار به تنهایی بی‌ضرر و قابل بازگشت است. فرایند انتقال حساب از حساب قدیمی آغاز خواهد شد. remove: حذف ارتباط نام مستعار appearance: + advanced_settings: تنظیمات پیش‌رفته animations_and_accessibility: پویانمایی‌های و دسترسی‌پذیری + boosting_preferences: ترجیحات تقویت + boosting_preferences_info_html: "‏نکته: فارغ از تنظیمات، تبدیل + کلیک روی %{icon} نقشک تقویت بلافاصله تقویت خواهد کرد" discovery: کاوش localization: body: ماستودون توسط داوطلبان ترجمه شده است. @@ -1583,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: به بیشینهٔ تعداد سیاهه‌ها رسیدید @@ -1735,6 +1760,9 @@ fa: self_vote: شما نمی توانید در نظرسنجی خودتان رای دهید too_few_options: حتماً باید بیش از یک گزینه داشته باشد too_many_options: نمی‌تواند بیشتر از %{max} گزینه داشته باشد + vote: رأی + posting_defaults: + explanation: این تنظیمات هنگام ایجاد فرسته به عنوان پیش‌گزیده استفاده خواهند شد؛ ولی می‌توانید در نویسنده برای هر فرسته تغییرش دهید. preferences: other: سایر تنظیمات posting_defaults: تنظیمات پیش‌فرض انتشار @@ -1890,6 +1918,9 @@ fa: other: "%{count} ویدیو" boosted_from_html: تقویت شده از طرف %{acct_link} content_warning: 'هشدا محتوا: %{warning}' + content_warnings: + hide: نهفتن فرسته + show: نمایش بیش‌تر default_language: همانند زبان واسط disallowed_hashtags: one: 'دارای برچسبی غیرمجاز: %{tags}' @@ -1904,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 e8c9a2568..d1203fbee 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1929,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ää diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 3938235ee..6569f6738 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1929,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 b27d53eea..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,6 +837,7 @@ fr-CA: title: Par défaut, ne pas indexer les comptes dans les moteurs de recherche discovery: follow_recommendations: Suivre les recommandations + privacy: Vie privée profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques @@ -821,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. @@ -874,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 @@ -881,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: @@ -1062,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 @@ -1134,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. @@ -1323,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. @@ -1532,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 @@ -1632,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" @@ -1680,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 @@ -1835,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}' @@ -1842,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 6b04aca1a..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,6 +837,7 @@ fr: title: Par défaut, ne pas indexer les comptes dans les moteurs de recherche discovery: follow_recommendations: Suivre les recommandations + privacy: Vie privée profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques @@ -821,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. @@ -874,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é @@ -881,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: @@ -1062,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 @@ -1134,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. @@ -1323,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. @@ -1532,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 @@ -1632,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" @@ -1680,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 @@ -1835,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}' @@ -1842,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/ga.yml b/config/locales/ga.yml index cb27ec1f9..e4a60a143 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -2060,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 5406b6411..13f482a57 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -2015,6 +2015,7 @@ 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 diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 85d351d20..212886dd0 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1929,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 @@ -2115,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 eebc9000d..2670f5126 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -2015,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/is.yml b/config/locales/is.yml index 104bd6389..7f3b2290f 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1933,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 d10612290..c85646ff6 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -855,6 +855,11 @@ it: 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. @@ -1924,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 1ef3aef00..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: コメント (公開) @@ -826,6 +828,9 @@ ja: all: 誰にでも許可 disabled: 誰にも許可しない users: ログイン済みローカルユーザーのみ許可 + landing_page: + values: + trends: トレンド registrations: moderation_recommandation: 登録受付を開始する前に、迅速かつ適切にモデレーションを行うチームを編成しましょう! preamble: あなたのサーバー上でアカウントを作成できるユーザーを制御します。 @@ -879,6 +884,7 @@ ja: no_status_selected: 何も選択されていないため、変更されていません open: 投稿を開く original_status: オリジナルの投稿 + quotes: 引用 reblogs: ブースト replied_to_html: "%{acct_link}さんへの返信" status_changed: 投稿を変更しました @@ -886,6 +892,7 @@ ja: title: 投稿一覧 - @%{name} trending: トレンド view_publicly: 元の投稿を開く + view_quoted_post: 引用されている投稿を見る visibility: 公開範囲 with_media: メディアあり strikes: @@ -1078,6 +1085,7 @@ ja: matches_exactly_html: "%{string}に一致" new: create: ルールを作成 + title: ユーザー名ルールを作成 title: ユーザー名ルール warning_presets: add_new: 追加 @@ -1150,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は有志によって翻訳されています。 @@ -1532,6 +1543,9 @@ ja: expires_at: 有効期限 uses: 使用 title: 新規ユーザーの招待 + link_preview: + potentially_sensitive_content: + hide_button: 非表示 lists: errors: limit: リストの上限数に達しています @@ -1851,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 eda169a28..3c8871049 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1887,6 +1887,7 @@ ko: 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/nan.yml b/config/locales/nan.yml index 8127cc567..508cc4666 100644 --- a/config/locales/nan.yml +++ b/config/locales/nan.yml @@ -841,6 +841,11 @@ nan: 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í ê服侍器註冊ê人。 @@ -1213,6 +1218,46 @@ nan: 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 9179337c6..ede7eb69c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1929,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 c3e37405c..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 @@ -843,7 +845,7 @@ nn: 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/pt-BR.yml b/config/locales/pt-BR.yml index 44e6d1831..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,6 +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: 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 @@ -1196,6 +1199,7 @@ pt-BR: 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. diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 24a21f886..d9efbf6a5 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1929,6 +1929,7 @@ 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 diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 0f79229ca..58b07f787 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -93,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 @@ -290,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) diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index a7c318f04..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 @@ -249,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 @@ -282,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) diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index d244cb528..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: همیشه همهٔ عکس‌ها و ویدیوها را پنهان کن @@ -231,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: نمایش عکس و ویدیو @@ -243,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: از نوار اسکرول پیش فرض سیستم استفاده کنید @@ -276,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: نمایش چرایی مسدودیت دامنه‌ها diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index b0dae1712..676b7638d 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -56,6 +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_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 @@ -223,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 @@ -267,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 @@ -311,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: @@ -357,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 270a259de..109cb4184 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -56,6 +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_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 @@ -223,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 @@ -267,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 @@ -311,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: @@ -357,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.it.yml b/config/locales/simple_form.it.yml index bc06874e3..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 @@ -286,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) diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index db43b701b..01bec9d5f 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -236,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: システムのデフォルトのスクロールバーを使う 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.nn.yml b/config/locales/simple_form.nn.yml index f6916c354..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 @@ -286,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) diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 605bcf8d9..4ba1bae9f 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -54,8 +54,10 @@ 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 @@ -63,6 +65,7 @@ pt-BR: 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 @@ -90,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 @@ -233,6 +237,7 @@ 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 @@ -248,6 +253,7 @@ pt-BR: 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 diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index c740aba19..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: 如果启用,转嘟前会先打开确认对话框,以便更改转嘟的可见性。 @@ -97,7 +97,7 @@ zh-CN: mascot: 覆盖高级网页界面中的绘图形象。 media_cache_retention_period: 来自外站用户嘟文的媒体文件将被缓存到你的实例上。当该值被设为正值时,缓存的媒体文件将在指定天数后被清除。如果媒体文件在被清除后重新被请求,且源站内容仍然可用,它将被重新下载。由于链接预览卡拉取第三方站点的频率受到限制,建议将此值设置为至少 14 天,如果小于该值,链接预览卡将不会按需更新。 min_age: 用户注册时必须确认出生日期 - peers_api_enabled: 本站在联邦宇宙中遇到的站点列表。 此处不包含关于您是否与给定站点联合的数据,只是您的实例知道它。 这由收集一般意义上的联合统计信息的服务使用。 + peers_api_enabled: 本站在联邦宇宙中遇到的站点列表。 此处不包含关于你是否与给定站点联合的数据,只是你的实例知道它。 这由收集一般意义上的联合统计信息的服务使用。 profile_directory: 个人资料目录会列出所有选择可被发现的用户。 require_invite_text: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项 site_contact_email: 他人需要询恰法务或支持信息时的联络方式 @@ -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 格式表示 @@ -339,7 +339,7 @@ zh-CN: reblog: 有人转嘟了我的嘟文 report: 有人提交了新举报 software_updates: - all: 通知所有更新 + all: 通知全部更新 critical: 仅在有关键更新时通知 label: 有新的 Mastodon 版本可用 none: 从不通知更新(不推荐) diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 6aa95821d..819dcd555 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1914,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/tr.yml b/config/locales/tr.yml index 3cedf77bb..2d60feec5 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1929,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/vi.yml b/config/locales/vi.yml index 0d3866f65..ea21c767a 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1886,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 ea98c6e73..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: @@ -805,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: 外观 @@ -821,7 +821,7 @@ zh-CN: preamble: 控制用户生成的内容在 Mastodon 中如何存储。 title: 内容保留 default_noindex: - desc_html: 影响所有尚未更改此设置的用户 + desc_html: 影响全部尚未更改此设置的用户 title: 默认不让用户被搜索引擎索引 discovery: follow_recommendations: 关注推荐 @@ -833,21 +833,21 @@ zh-CN: title: 发现 trends: 热门 domain_blocks: - all: 对所有人 + all: 对每个人 disabled: 不对任何人 users: 对已登录的本站用户 feed_access: modes: authenticated: 仅已登录用户 disabled: 需要特定的用户角色 - public: 所有人 + public: 每个人 landing_page: values: about: 关于 local_feed: 本站动态 trends: 热门 registrations: - moderation_recommandation: 在向所有人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! + moderation_recommandation: 在向每个人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! preamble: 控制谁可以在你的服务器上创建账号。 title: 注册 registrations_mode: @@ -962,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: 不在热门中显示 @@ -1455,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: 确认 @@ -1466,7 +1466,7 @@ zh-CN: order_by: 排序方式 save_changes: 保存更改 select_all_matching_items: - other: 选择匹配你搜索的所有 %{count} 个项目。 + other: 选择匹配你搜索的全部 %{count} 个项目。 today: 今天 validation_errors: other: 出错啦!检查一下下面 %{count} 处出错的地方吧 @@ -1493,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: @@ -1566,7 +1566,7 @@ zh-CN: author_html: 来自 %{name} potentially_sensitive_content: action: 点击查看 - confirm_visit: 您确定要打开此链接吗? + confirm_visit: 你确定要打开此链接吗? hide_button: 隐藏 label: 可能为敏感内容 lists: @@ -1631,7 +1631,7 @@ zh-CN: before: 在继续前,请仔细阅读下列说明: cooldown: 移动后会有一个冷却期,在此期间你将无法再次移动 disabled_account: 此后,你的当前账号将无法使用。但是,你仍然有权导出数据或者重新激活。 - followers: 这步操作将把所有关注者从当前账号移动到新账号 + followers: 这步操作将把全部关注者从当前账号移动到新账号 only_redirect_html: 或者,你可以只在你的账号资料上设置一个跳转。 other_data: 不会自动移动其它数据 redirect: 在收到一个跳转通知后,你当前的账号资料将会更新,并被排除在搜索范围外 @@ -1723,7 +1723,7 @@ zh-CN: too_many_options: 不能超过 %{max} 项 vote: 投票 posting_defaults: - explanation: 这些设置会在您撰写新嘟文时作为默认值应用,但每篇嘟文的设置也可以在编辑器处单独修改。 + explanation: 这些设置会在你撰写新嘟文时作为默认值应用,但每篇嘟文的设置也可以在编辑器处单独修改。 preferences: other: 其他 posting_defaults: 发布默认值 @@ -1733,7 +1733,7 @@ zh-CN: privacy: 隐私 privacy_hint_html: 控制你愿意向他人透露多少信息。通过浏览他人的关注列表和查看他们发嘟所用的应用,人们可以发现有趣的用户和酷炫的应用,但你可能更喜欢将其隐藏起来。 reach: 范围 - reach_hint_html: 控制你是否希望被新人发现和关注。你是否希望你的嘟文出现在“探索”页面上?你是否希望其他人在关注推荐中看到你?你是想自动接受所有新粉丝,还是对每个粉丝都进行仔细的筛选? + reach_hint_html: 控制你是否希望被新人发现和关注。你是否希望你的嘟文出现在“探索”页面上?你是否希望其他人在关注推荐中看到你?你是想自动接受全部新关注者,还是对每个关注者都进行仔细的筛选? search: 搜索 search_hint_html: 控制你希望被找到的方式。你想让人们通过你公开发布的内容来找到你吗?当在网络上搜索时,你是否希望Mastodon之外的人能够找到你的个人资料?请注意,我们无法保证完全排除所有搜索引擎对公开信息的索引。 title: 隐私与可达性 @@ -1750,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: 关注选中的关注者 @@ -1763,7 +1763,7 @@ zh-CN: mutual: 互相关注 primary: 主要 relationship: 关系 - remove_selected_domains: 删除在选定站点中的所有关注者 + remove_selected_domains: 删除在选定站点中的全部关注者 remove_selected_followers: 移除选中的关注者 remove_selected_follows: 取消关注所选用户 status: 账号状态 @@ -1885,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: 仅对被提及的用户可见的帖子不能被置顶 @@ -1954,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} 更新了服务条款" @@ -2041,7 +2042,7 @@ zh-CN: delete_statuses: 你的一些嘟文被发现违反了一条或多条社区准则,并已被 %{instance} 的管理员删除。 disable: 你不能再使用你的账号,但你的个人资料和其他数据保持不变。你可以请求数据备份,更改账号设置或删除账号。 mark_statuses_as_sensitive: 你的一些嘟文已经被 %{instance} 管理员标记为敏感内容。这意味着别人需要在嘟文中点击媒体,才能显示媒体预览。你可以在今后发布嘟文时自行将媒体标记为敏感内容。 - sensitive: 即刻起,你上传的所有媒体文件都将被标记为敏感内容并隐藏,在点击警告后才能查看。 + sensitive: 即刻起,你上传的全部媒体文件都将被标记为敏感内容并隐藏,在点击警告后才能查看。 silence: 你可以继续使用你的账号,但只有已关注你的人才能在看到你在此服务器上的嘟文,并且你会被排除在各类公共列表之外。其他用户仍可以手动关注你。 suspend: 你不能再使用你的账号,并且你的个人资料和其他数据都将无法访问。在大约30天内,你仍可以登录并请求数据备份,之后相关数据将被完全删除。我们会保留一些基础数据以避免封禁失效。 reason: 理由: @@ -2103,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-TW.yml b/config/locales/zh-TW.yml index 6c56aaf90..7c522752a 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1888,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: 無法釘選只有僅提及使用者可見之嘟文 From 26c78392f88afccebb8a88b68bc9994a9ce12648 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 6 Nov 2025 12:39:07 +0100 Subject: [PATCH 90/90] Bump version to v4.5.0 (#36732) --- .github/workflows/build-releases.yml | 4 ++-- CHANGELOG.md | 13 +++++++------ SECURITY.md | 2 +- docker-compose.yml | 6 +++--- lib/mastodon/version.rb | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-releases.yml b/.github/workflows/build-releases.yml index db17b2169..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.3.') }} + 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.3.') }} + latest=${{ startsWith(github.ref, 'refs/tags/v4.5.') }} tags: | type=pep440,pattern={{raw}} type=pep440,pattern=v{{major}}.{{minor}} diff --git a/CHANGELOG.md b/CHANGELOG.md index 15b458e0f..f30b502ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,11 @@ 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, #36528, #36549, #36550, #36559, #36693, #36704, #36690, #36689, #36696, #36721 and #36695 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, #36481, #36583, #36627 and #36547 by @ClearlyClaire, @diondiondion, @Gargron and @renchap) @@ -21,21 +21,22 @@ All notable changes to this project will be documented in this file. - 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 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 and #36638 by @ChaosExAnima, @ClearlyClaire and @braddunbar)\ - This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places. ### Changed 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/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/version.rb b/lib/mastodon/version.rb index 35534791e..3912c3cac 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'rc.3' + '' end def prerelease