diff --git a/.github/workflows/build-container-image.yml b/.github/workflows/build-container-image.yml
index 6204319a6379fa..260730004cc774 100644
--- a/.github/workflows/build-container-image.yml
+++ b/.github/workflows/build-container-image.yml
@@ -1,14 +1,9 @@
on:
workflow_call:
inputs:
- platforms:
- required: true
- type: string
cache:
type: boolean
default: true
- use_native_arm64_builder:
- type: boolean
push_to_images:
type: string
version_prerelease:
@@ -24,42 +19,36 @@ on:
file_to_build:
type: string
+# This builds multiple images with one runner each, allowing us to build for multiple architectures
+# using Github's runners.
+# The two-step process is adapted form:
+# https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
jobs:
+ # Build each (amd64 and arm64) image separately
build-image:
- runs-on: ubuntu-latest
+ runs-on: ${{ startsWith(matrix.platform, 'linux/arm') && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - linux/amd64
+ - linux/arm64
steps:
- uses: actions/checkout@v4
- - uses: docker/setup-qemu-action@v3
- if: contains(inputs.platforms, 'linux/arm64') && !inputs.use_native_arm64_builder
-
- - uses: docker/setup-buildx-action@v3
- id: buildx
- if: ${{ !(inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')) }}
-
- - name: Start a local Docker Builder
- if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')
+ - name: Prepare
+ env:
+ PUSH_TO_IMAGES: ${{ inputs.push_to_images }}
run: |
- docker run --rm -d --name buildkitd -p 1234:1234 --privileged moby/buildkit:latest --addr tcp://0.0.0.0:1234
+ platform=${{ matrix.platform }}
+ echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
+ # Transform multi-line variable into comma-separated variable
+ image_names=${PUSH_TO_IMAGES//$'\n'/,}
+ echo "IMAGE_NAMES=${image_names%,}" >> $GITHUB_ENV
- uses: docker/setup-buildx-action@v3
- id: buildx-native
- if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')
- with:
- driver: remote
- endpoint: tcp://localhost:1234
- platforms: linux/amd64
- append: |
- - endpoint: tcp://${{ vars.DOCKER_BUILDER_HETZNER_ARM64_01_HOST }}:13865
- platforms: linux/arm64
- name: mastodon-docker-builder-arm64-01
- driver-opts:
- - servername=mastodon-docker-builder-arm64-01
- env:
- BUILDER_NODE_1_AUTH_TLS_CACERT: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_CACERT }}
- BUILDER_NODE_1_AUTH_TLS_CERT: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_CERT }}
- BUILDER_NODE_1_AUTH_TLS_KEY: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_KEY }}
+ id: buildx
- name: Log in to Docker Hub
if: contains(inputs.push_to_images, 'tootsuite')
@@ -76,16 +65,18 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- - uses: docker/metadata-action@v5
+ - name: Docker meta
id: meta
+ uses: docker/metadata-action@v5
if: ${{ inputs.push_to_images != '' }}
with:
images: ${{ inputs.push_to_images }}
flavor: ${{ inputs.flavor }}
- tags: ${{ inputs.tags }}
labels: ${{ inputs.labels }}
- - uses: docker/build-push-action@v6
+ - name: Build and push by digest
+ id: build
+ uses: docker/build-push-action@v6
with:
context: .
file: ${{ inputs.file_to_build }}
@@ -93,11 +84,87 @@ jobs:
MASTODON_VERSION_PRERELEASE=${{ inputs.version_prerelease }}
MASTODON_VERSION_METADATA=${{ inputs.version_metadata }}
SOURCE_COMMIT=${{ github.sha }}
- platforms: ${{ inputs.platforms }}
+ platforms: ${{ matrix.platform }}
provenance: false
- builder: ${{ steps.buildx.outputs.name || steps.buildx-native.outputs.name }}
push: ${{ inputs.push_to_images != '' }}
- tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
cache-from: ${{ inputs.cache && 'type=gha' || '' }}
cache-to: ${{ inputs.cache && 'type=gha,mode=max' || '' }}
+ outputs: type=image,"name=${{ env.IMAGE_NAMES }}",push-by-digest=true,name-canonical=true,push=${{ inputs.push_to_images != '' }}
+
+ - name: Export digest
+ if: ${{ inputs.push_to_images != '' }}
+ run: |
+ mkdir -p "${{ runner.temp }}/digests"
+ digest="${{ steps.build.outputs.digest }}"
+ touch "${{ runner.temp }}/digests/${digest#sha256:}"
+
+ - name: Upload digest
+ if: ${{ inputs.push_to_images != '' }}
+ uses: actions/upload-artifact@v4
+ with:
+ # `hashFiles` is used to disambiguate between streaming and non-streaming images
+ name: digests-${{ hashFiles(inputs.file_to_build) }}-${{ env.PLATFORM_PAIR }}
+ path: ${{ runner.temp }}/digests/*
+ if-no-files-found: error
+ retention-days: 1
+
+ # Then merge the docker images into a single one
+ merge-images:
+ if: ${{ inputs.push_to_images != '' }}
+ runs-on: ubuntu-24.04
+ needs:
+ - build-image
+
+ env:
+ PUSH_TO_IMAGES: ${{ inputs.push_to_images }}
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Download digests
+ uses: actions/download-artifact@v4
+ with:
+ path: ${{ runner.temp }}/digests
+ # `hashFiles` is used to disambiguate between streaming and non-streaming images
+ pattern: digests-${{ hashFiles(inputs.file_to_build) }}-*
+ merge-multiple: true
+
+ - name: Log in to Docker Hub
+ if: contains(inputs.push_to_images, 'tootsuite')
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Log in to the GitHub Container registry
+ if: contains(inputs.push_to_images, 'ghcr.io')
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Docker meta
+ id: meta
+ uses: docker/metadata-action@v5
+ if: ${{ inputs.push_to_images != '' }}
+ with:
+ images: ${{ inputs.push_to_images }}
+ flavor: ${{ inputs.flavor }}
+ tags: ${{ inputs.tags }}
+ labels: ${{ inputs.labels }}
+
+ - name: Create manifest list and push
+ working-directory: ${{ runner.temp }}/digests
+ run: |
+ echo "$PUSH_TO_IMAGES" | xargs -I{} \
+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
+ $(printf '{}@sha256:%s ' *)
+
+ - name: Inspect image
+ run: |
+ echo "$PUSH_TO_IMAGES" | xargs -i{} \
+ docker buildx imagetools inspect {}:${{ steps.meta.outputs.version }}
diff --git a/.github/workflows/build-nightly.yml b/.github/workflows/build-nightly.yml
index 0ea553cfda2335..7dda6cb350c941 100644
--- a/.github/workflows/build-nightly.yml
+++ b/.github/workflows/build-nightly.yml
@@ -26,8 +26,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
@@ -47,8 +45,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming
diff --git a/.github/workflows/build-push-pr.yml b/.github/workflows/build-push-pr.yml
index d6324bad89259a..6ec561d2fb589b 100644
--- a/.github/workflows/build-push-pr.yml
+++ b/.github/workflows/build-push-pr.yml
@@ -32,8 +32,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
version_metadata: ${{ needs.compute-suffix.outputs.metadata }}
@@ -49,8 +47,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming
version_metadata: ${{ needs.compute-suffix.outputs.metadata }}
diff --git a/.github/workflows/build-releases.yml b/.github/workflows/build-releases.yml
index 808ffe115d952e..7508e4ff4ee790 100644
--- a/.github/workflows/build-releases.yml
+++ b/.github/workflows/build-releases.yml
@@ -13,8 +13,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
# Do not use cache when building releases, so apt update is always ran and the release always contain the latest packages
@@ -33,8 +31,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming
# Do not use cache when building releases, so apt update is always ran and the release always contain the latest packages
diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml
index 37c8ba59a37d54..32a2d534bd34f5 100644
--- a/.github/workflows/build-security.yml
+++ b/.github/workflows/build-security.yml
@@ -23,8 +23,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
@@ -44,8 +42,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
- platforms: linux/amd64,linux/arm64
- use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming
diff --git a/.github/workflows/test-image-build.yml b/.github/workflows/test-image-build.yml
index 980e071897c911..bde40addd666e4 100644
--- a/.github/workflows/test-image-build.yml
+++ b/.github/workflows/test-image-build.yml
@@ -20,7 +20,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
- platforms: linux/amd64 # Testing only on native platform so it is performant
cache: true
build-image-streaming:
@@ -31,5 +30,4 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
- platforms: linux/amd64 # Testing only on native platform so it is performant
cache: true
diff --git a/Gemfile b/Gemfile
index ebd25d542c2bff..4b702260d44836 100644
--- a/Gemfile
+++ b/Gemfile
@@ -116,7 +116,7 @@ group :opentelemetry do
gem 'opentelemetry-instrumentation-net_http', '~> 0.23.0', require: false
gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false
gem 'opentelemetry-instrumentation-rack', '~> 0.26.0', require: false
- gem 'opentelemetry-instrumentation-rails', '~> 0.35.0', require: false
+ gem 'opentelemetry-instrumentation-rails', '~> 0.36.0', require: false
gem 'opentelemetry-instrumentation-redis', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.26.0', require: false
gem 'opentelemetry-sdk', '~> 1.4', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 4779fdd8d8d4b9..26e1e31b0ae83c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -480,7 +480,7 @@ GEM
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-active_support (~> 0.7)
opentelemetry-instrumentation-base (~> 0.23.0)
- opentelemetry-instrumentation-action_pack (0.11.0)
+ opentelemetry-instrumentation-action_pack (0.12.0)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-rack (~> 0.21)
@@ -498,6 +498,10 @@ GEM
opentelemetry-instrumentation-active_record (0.9.0)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.23.0)
+ opentelemetry-instrumentation-active_storage (0.1.0)
+ opentelemetry-api (~> 1.4.0)
+ opentelemetry-instrumentation-active_support (~> 0.7)
+ opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-active_support (0.8.0)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.23.0)
@@ -530,17 +534,18 @@ GEM
opentelemetry-instrumentation-rack (0.26.0)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.23.0)
- opentelemetry-instrumentation-rails (0.35.1)
+ opentelemetry-instrumentation-rails (0.36.0)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-action_mailer (~> 0.4.0)
- opentelemetry-instrumentation-action_pack (~> 0.11.0)
+ opentelemetry-instrumentation-action_pack (~> 0.12.0)
opentelemetry-instrumentation-action_view (~> 0.9.0)
opentelemetry-instrumentation-active_job (~> 0.8.0)
opentelemetry-instrumentation-active_record (~> 0.9.0)
+ opentelemetry-instrumentation-active_storage (~> 0.1.0)
opentelemetry-instrumentation-active_support (~> 0.8.0)
opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0)
- opentelemetry-instrumentation-redis (0.26.0)
+ opentelemetry-instrumentation-redis (0.26.1)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-sidekiq (0.26.0)
@@ -548,7 +553,7 @@ GEM
opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-registry (0.3.1)
opentelemetry-api (~> 1.1)
- opentelemetry-sdk (1.6.0)
+ opentelemetry-sdk (1.7.0)
opentelemetry-api (~> 1.1)
opentelemetry-common (~> 0.20)
opentelemetry-registry (~> 0.2)
@@ -977,7 +982,7 @@ DEPENDENCIES
opentelemetry-instrumentation-net_http (~> 0.23.0)
opentelemetry-instrumentation-pg (~> 0.30.0)
opentelemetry-instrumentation-rack (~> 0.26.0)
- opentelemetry-instrumentation-rails (~> 0.35.0)
+ opentelemetry-instrumentation-rails (~> 0.36.0)
opentelemetry-instrumentation-redis (~> 0.26.0)
opentelemetry-instrumentation-sidekiq (~> 0.26.0)
opentelemetry-sdk (~> 1.4)
diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb
index 3dca3a96149f8c..14338dd293819e 100644
--- a/app/controllers/admin/base_controller.rb
+++ b/app/controllers/admin/base_controller.rb
@@ -7,17 +7,12 @@ class BaseController < ApplicationController
layout 'admin'
- before_action :set_cache_headers
before_action :set_referrer_policy_header
after_action :verify_authorized
private
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
-
def set_referrer_policy_header
response.headers['Referrer-Policy'] = 'same-origin'
end
diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb
index 34c75995537f73..6e34b6b627228f 100644
--- a/app/controllers/auth/registrations_controller.rb
+++ b/app/controllers/auth/registrations_controller.rb
@@ -12,7 +12,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController
before_action :set_sessions, only: [:edit, :update]
before_action :set_strikes, only: [:edit, :update]
before_action :require_not_suspended!, only: [:update]
- before_action :set_cache_headers, only: [:edit, :update]
before_action :set_rules, only: :new
before_action :require_rules_acceptance!, only: :new
before_action :set_registration_form_time, only: :new
@@ -139,10 +138,6 @@ def require_rules_acceptance!
set_locale { render :rules }
end
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
-
def is_flashing_format? # rubocop:disable Naming/PredicateName
if params[:action] == 'create'
false # Disable flash messages for sign-up
diff --git a/app/controllers/disputes/base_controller.rb b/app/controllers/disputes/base_controller.rb
index dd24a1b7408c98..07677fd3f3d9cb 100644
--- a/app/controllers/disputes/base_controller.rb
+++ b/app/controllers/disputes/base_controller.rb
@@ -8,11 +8,4 @@ class Disputes::BaseController < ApplicationController
skip_before_action :require_functional!
before_action :authenticate_user!
- before_action :set_cache_headers
-
- private
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/controllers/filters/statuses_controller.rb b/app/controllers/filters/statuses_controller.rb
index ca5205d042b237..d85b017aaacb2f 100644
--- a/app/controllers/filters/statuses_controller.rb
+++ b/app/controllers/filters/statuses_controller.rb
@@ -6,7 +6,6 @@ class Filters::StatusesController < ApplicationController
before_action :authenticate_user!
before_action :set_filter
before_action :set_status_filters
- before_action :set_cache_headers
PER_PAGE = 20
@@ -40,8 +39,4 @@ def status_filter_batch_action_params
def action_from_button
'remove' if params[:remove]
end
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb
index c8cac0abe006e3..769aea2afe53f1 100644
--- a/app/controllers/filters_controller.rb
+++ b/app/controllers/filters_controller.rb
@@ -5,7 +5,6 @@ class FiltersController < ApplicationController
before_action :authenticate_user!
before_action :set_filter, only: [:edit, :update, :destroy]
- before_action :set_cache_headers
def index
@filters = current_account.custom_filters.includes(:keywords, :statuses).order(:phrase)
@@ -50,8 +49,4 @@ def set_filter
def resource_params
params.expect(custom_filter: [:title, :expires_in, :filter_action, context: [], keywords_attributes: [[:id, :keyword, :whole_word, :_destroy]]])
end
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb
index c4c52cce1191f5..fc65333ac48c72 100644
--- a/app/controllers/invites_controller.rb
+++ b/app/controllers/invites_controller.rb
@@ -6,7 +6,6 @@ class InvitesController < ApplicationController
layout 'admin'
before_action :authenticate_user!
- before_action :set_cache_headers
def index
authorize :invite, :create?
@@ -45,8 +44,4 @@ def invites
def resource_params
params.expect(invite: [:max_uses, :expires_in, :autofollow, :comment])
end
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb
index 66e774425d7081..deafedeaeffd7f 100644
--- a/app/controllers/oauth/authorizations_controller.rb
+++ b/app/controllers/oauth/authorizations_controller.rb
@@ -5,7 +5,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
before_action :store_current_location
before_action :authenticate_resource_owner!
- before_action :set_cache_headers
content_security_policy do |p|
p.form_action(false)
@@ -32,8 +31,4 @@ def render_success
def truthy_param?(key)
ActiveModel::Type::Boolean.new.cast(params[key])
end
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb
index 9e541e5e3c1c78..8b11a519ea4026 100644
--- a/app/controllers/oauth/authorized_applications_controller.rb
+++ b/app/controllers/oauth/authorized_applications_controller.rb
@@ -6,7 +6,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio
before_action :store_current_location
before_action :authenticate_resource_owner!
before_action :require_not_suspended!, only: :destroy
- before_action :set_cache_headers
before_action :set_last_used_at_by_app, only: :index, unless: -> { request.format == :json }
@@ -30,10 +29,6 @@ def require_not_suspended!
forbidden if current_account.unavailable?
end
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
-
def set_last_used_at_by_app
@last_used_at_by_app = current_resource_owner.applications_last_used
end
diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb
index 43105d70c85aec..7e793fc73427fa 100644
--- a/app/controllers/relationships_controller.rb
+++ b/app/controllers/relationships_controller.rb
@@ -6,7 +6,6 @@ class RelationshipsController < ApplicationController
before_action :authenticate_user!
before_action :set_accounts, only: :show
before_action :set_relationships, only: :show
- before_action :set_cache_headers
helper_method :following_relationship?, :followed_by_relationship?, :mutual_relationship?
@@ -66,8 +65,4 @@ def action_from_button
'remove_domains_from_followers'
end
end
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb
index 188334ac234663..7f2279aa8f9514 100644
--- a/app/controllers/settings/base_controller.rb
+++ b/app/controllers/settings/base_controller.rb
@@ -4,14 +4,9 @@ class Settings::BaseController < ApplicationController
layout 'admin'
before_action :authenticate_user!
- before_action :set_cache_headers
private
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
-
def require_not_suspended!
forbidden if current_account.unavailable?
end
diff --git a/app/controllers/severed_relationships_controller.rb b/app/controllers/severed_relationships_controller.rb
index 965753a26f8ac9..817abebf62d1da 100644
--- a/app/controllers/severed_relationships_controller.rb
+++ b/app/controllers/severed_relationships_controller.rb
@@ -4,7 +4,6 @@ class SeveredRelationshipsController < ApplicationController
layout 'admin'
before_action :authenticate_user!
- before_action :set_cache_headers
before_action :set_event, only: [:following, :followers]
@@ -49,8 +48,4 @@ def followers_data
def acct(account)
account.local? ? account.local_username_and_domain : account.acct
end
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/controllers/statuses_cleanup_controller.rb b/app/controllers/statuses_cleanup_controller.rb
index 028c57d0d3d76f..f4f49031a0a281 100644
--- a/app/controllers/statuses_cleanup_controller.rb
+++ b/app/controllers/statuses_cleanup_controller.rb
@@ -5,7 +5,6 @@ class StatusesCleanupController < ApplicationController
before_action :authenticate_user!
before_action :set_policy
- before_action :set_cache_headers
def show; end
@@ -30,8 +29,4 @@ def set_policy
def resource_params
params.expect(account_statuses_cleanup_policy: [:enabled, :min_status_age, :keep_direct, :keep_pinned, :keep_polls, :keep_media, :keep_self_fav, :keep_self_bookmark, :min_favs, :min_reblogs])
end
-
- def set_cache_headers
- response.cache_control.replace(private: true, no_store: true)
- end
end
diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json
index 5f1efe3d7273a5..a60087890bb308 100644
--- a/app/javascript/mastodon/locales/az.json
+++ b/app/javascript/mastodon/locales/az.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Bilinməyən bir xəta baş verdi.",
"alert.unexpected.title": "Ah!",
"alt_text_badge.title": "Alternativ mətn",
+ "alt_text_modal.add_alt_text": "Alternativ mətn əlavə et",
+ "alt_text_modal.add_text_from_image": "Şəkildəki mətni əlavə et",
+ "alt_text_modal.cancel": "İmtina",
+ "alt_text_modal.change_thumbnail": "Miniatürü dəyişdir",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Eşitmə məhdudiyyətli insanlar üçün bunu izah et…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Görmə məhdudiyyətli insanlar üçün bunu təsvir et…",
+ "alt_text_modal.done": "Oldu",
"announcement.announcement": "Elan",
"annual_report.summary.archetype.booster": "Trend ovçusu",
"annual_report.summary.archetype.lurker": "Lurker",
@@ -211,6 +218,10 @@
"confirmations.logout.confirm": "Çıxış et",
"confirmations.logout.message": "Çıxmaq istədiyinizə əminsiniz?",
"confirmations.logout.title": "Çıxış edilsin?",
+ "confirmations.missing_alt_text.confirm": "Alternativ mətn əlavə et",
+ "confirmations.missing_alt_text.message": "Paylaşımınız alternativ mətn ehtiva etmir. Təsvir əlavə etmək onun daha çox insan üçün əlçatan olmasına kömək edir.",
+ "confirmations.missing_alt_text.secondary": "Yenə də paylaş",
+ "confirmations.missing_alt_text.title": "Alternativ mətn əlavə edilsin?",
"confirmations.mute.confirm": "Səssizləşdir",
"confirmations.redraft.confirm": "Sil və qaralamaya köçür",
"confirmations.redraft.message": "Bu paylaşımı silmək və qaralamaya köçürmək istədiyinizə əminsiniz? Bəyənmələr və gücləndirmələr itəcək və orijinal paylaşıma olan cavablar tənha qalacaq.",
@@ -241,6 +252,7 @@
"dismissable_banner.dismiss": "Bağla",
"dismissable_banner.explore_links": "Bu xəbərlər bu gün fediversedə ən çox paylaşılır. Daha fərqli insanlar tərəfindən dərc edilən daha yeni xəbərlər daha yuxarıda sıralanır.",
"dismissable_banner.explore_statuses": "Fediversedən olan bu paylaşımlar bu gün maraq qazanır. Daha çox gücləndirici və bəyənmə olan daha yeni paylaşımlar daha yuxarıda sıralanır.",
+ "dismissable_banner.explore_tags": "Bu heşteqlər fediverse-də trend olublar. Daha çox fərqli insanlar tərəfindən istifadə olunan heşteqlər daha yuxarıda sıralanır.",
"domain_block_modal.block_account_instead": "@{name} istifadəçisini blokla",
"domain_block_modal.they_can_interact_with_old_posts": "Bu serverdən olan insanlar köhnə paylaşımlarınızla əlaqə qura bilər."
}
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index b30ae5e2158693..c9a22ff8f16cd7 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
"alert.unexpected.title": "Wps!",
"alt_text_badge.title": "Testun Amgen",
+ "alt_text_modal.add_alt_text": "Ychwanegu testun amgen",
+ "alt_text_modal.add_text_from_image": "Ychwanegu testun o'r ddelwedd",
+ "alt_text_modal.cancel": "Diddymu",
+ "alt_text_modal.change_thumbnail": "Newid llun bach",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Disgrifiwch hyn ar gyfer pobl â nam ar eu clyw…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Disgrifiwch hyn ar gyfer pobl â nam ar eu golwg…",
+ "alt_text_modal.done": "Gorffen",
"announcement.announcement": "Cyhoeddiad",
"annual_report.summary.archetype.booster": "Y hyrwyddwr",
"annual_report.summary.archetype.lurker": "Yr arsylwr",
@@ -211,6 +218,10 @@
"confirmations.logout.confirm": "Allgofnodi",
"confirmations.logout.message": "Ydych chi'n siŵr eich bod am allgofnodi?",
"confirmations.logout.title": "Allgofnodi?",
+ "confirmations.missing_alt_text.confirm": "Ychwanegu testun amgen",
+ "confirmations.missing_alt_text.message": "Mae eich postiad yn cynnwys cyfryngau heb destun amgen. Mae ychwanegu disgrifiadau yn helpu i wneud eich cynnwys yn hygyrch i fwy o bobl.",
+ "confirmations.missing_alt_text.secondary": "Postio beth bynnag",
+ "confirmations.missing_alt_text.title": "Ychwanegu testun amgen?",
"confirmations.mute.confirm": "Tewi",
"confirmations.redraft.confirm": "Dileu ac ailddrafftio",
"confirmations.redraft.message": "Ydych chi wir eisiau'r dileu'r postiad hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael eu colli, a bydd atebion i'r post gwreiddiol yn mynd yn amddifad.",
@@ -407,6 +418,8 @@
"ignore_notifications_modal.not_followers_title": "Anwybyddu hysbysiadau gan bobl nad ydynt yn eich dilyn?",
"ignore_notifications_modal.not_following_title": "Anwybyddu hysbysiadau gan bobl nad ydych yn eu dilyn?",
"ignore_notifications_modal.private_mentions_title": "Anwybyddu hysbysiadau o Grybwylliadau Preifat digymell?",
+ "info_button.label": "Cymorth",
+ "info_button.what_is_alt_text": "
Beth yw testun amgen?
Mae Testun Amgen yn darparu disgrifiadau delwedd ar gyfer pobl â nam ar eu golwg, cysylltiadau lled band isel, neu'r rhai sy'n ceisio cyd-destun ychwanegol.
Gallwch wella hygyrchedd a dealltwriaeth i bawb trwy ysgrifennu testun amgen clir, cryno a gwrthrychol.
- Dal elfennau pwysig
- Crynhoi testun mewn delweddau
- Defnyddiwch strwythur brawddegau rheolaidd
- Osgoi gwybodaeth ddiangen
- Canolbwyntio ar dueddiadau a chanfyddiadau allweddol mewn delweddau cymhleth (fel diagramau neu fapiau)
",
"interaction_modal.action.favourite": "I barhau, mae angen i chi hoffi o'ch cyfrif.",
"interaction_modal.action.follow": "I barhau, mae angen i chi ddilyn o'ch cyfrif.",
"interaction_modal.action.reblog": "I barhau, mae angen i chi ail-flogio o'ch cyfrif.",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index e25921f764f684..3fa92cd53ebcbf 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -29,7 +29,7 @@
"account.endorse": "Fremhæv på profil",
"account.featured_tags.last_status_at": "Seneste indlæg {date}",
"account.featured_tags.last_status_never": "Ingen indlæg",
- "account.featured_tags.title": "{name}s fremhævede hashtags",
+ "account.featured_tags.title": "{name}s fremhævede etiketter",
"account.follow": "Følg",
"account.follow_back": "Følg tilbage",
"account.followers": "Følgere",
@@ -102,12 +102,12 @@
"annual_report.summary.followers.followers": "følgere",
"annual_report.summary.followers.total": "{count} i alt",
"annual_report.summary.here_it_is": "Her er dit {year} i sammendrag:",
- "annual_report.summary.highlighted_post.by_favourites": "mest favoritmærkede indlæg",
+ "annual_report.summary.highlighted_post.by_favourites": "mest favoritmarkerede indlæg",
"annual_report.summary.highlighted_post.by_reblogs": "mest fremhævede indlæg",
"annual_report.summary.highlighted_post.by_replies": "mest besvarede indlæg",
"annual_report.summary.highlighted_post.possessive": "{name}s",
"annual_report.summary.most_used_app.most_used_app": "mest benyttede app",
- "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede hashtag",
+ "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede etiket",
"annual_report.summary.most_used_hashtag.none": "Intet",
"annual_report.summary.new_posts.new_posts": "nye indlæg",
"annual_report.summary.percentile.text": "Det betyder, at man er i topaf {domain}-brugere.",
@@ -181,7 +181,7 @@
"compose.saved.body": "Indlæg gemt.",
"compose_form.direct_message_warning_learn_more": "Få mere at vide",
"compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende-krypteret. Del derfor ikke sensitiv information via Mastodon.",
- "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, da kun offentlige indlæg er søgbare via hashtags.",
+ "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under nogen etiket, da kun offentlige indlæg er søgbare via etiketter.",
"compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.",
"compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Hvad tænker du på?",
@@ -250,9 +250,9 @@
"disabled_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret.",
"dismissable_banner.community_timeline": "Disse er de seneste offentlige indlæg fra personer med konti hostet af {domain}.",
"dismissable_banner.dismiss": "Afvis",
- "dismissable_banner.explore_links": "Disse nyhedshistorier deles mest på fediverset i dag. Nyere nyhedshistorier lagt op af flere forskellige personer rangeres højere.",
+ "dismissable_banner.explore_links": "Disse nyhedshistorier deles mest på fødiverset i dag. Nyere nyhedshistorier lagt op af flere forskellige personer rangeres højere.",
"dismissable_banner.explore_statuses": "Disse indlæg på tværs af fødiverset opnår momentum i dag. Nyere indlæg med flere fremhævninger og favoritmærker rangeres højere.",
- "dismissable_banner.explore_tags": "Disse hashtags opnår momentum på fødiverset i dag. Hashtags brugt af flere forskellige personer rangeres højere.",
+ "dismissable_banner.explore_tags": "Disse etiketter opnår momentum på fødiverset i dag. Etiketter brugt af flere forskellige personer rangeres højere.",
"dismissable_banner.public_timeline": "Dette er de seneste offentlige indlæg fra personer på fødiverset, som folk på {domain} følger.",
"domain_block_modal.block": "Blokér server",
"domain_block_modal.block_account_instead": "Blokér i stedet @{name}",
@@ -300,14 +300,14 @@
"empty_column.blocks": "Ingen brugere blokeret endnu.",
"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": "Der er endnu ingen private omtaler. Når en sendes eller modtages, dukker den op hér.",
+ "empty_column.direct": "Der er endnu ingen private omtaler. Når en sendes eller modtages, dukker den op her.",
"empty_column.domain_blocks": "Ingen blokerede domæner endnu.",
"empty_column.explore_statuses": "Ingen nye tendenser lige nu. Tjek igen senere!",
- "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du favoritmarkerer ét, vil det dukke op hér.",
- "empty_column.favourites": "Ingen har endnu favoritmarkeret dette indlæg. Når nogen gør dét, vil det dukke op her.",
+ "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du føjer et opslag til favoritter, vil det dukke op her.",
+ "empty_column.favourites": "Ingen har endnu føjet dette indlæg til favoritter. Når nogen gør det, vil det dukke op her.",
"empty_column.follow_requests": "Du har endnu ingen følgeanmodninger. Når du modtager én, vil den dukke op her.",
- "empty_column.followed_tags": "Ingen hashtags følges endnu. Når det sker, vil de fremgå her.",
- "empty_column.hashtag": "Der er intet med dette hashtag endnu.",
+ "empty_column.followed_tags": "Ingen etiketter følges endnu. Når det sker, vil de fremgå her.",
+ "empty_column.hashtag": "Der er intet med denne etiket endnu.",
"empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at fylde den op.",
"empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå her.",
"empty_column.mutes": "Du har endnu ikke skjult nogle brugere.",
@@ -324,7 +324,7 @@
"explore.title": "Udforsk",
"explore.trending_links": "Nyheder",
"explore.trending_statuses": "Indlæg",
- "explore.trending_tags": "Hashtags",
+ "explore.trending_tags": "Etiketter",
"filter_modal.added.context_mismatch_explanation": "Denne filterkategori omfatter ikke konteksten, hvorunder dette indlæg er tilgået. Redigér filteret, hvis indlægget også ønskes filtreret i denne kontekst.",
"filter_modal.added.context_mismatch_title": "Kontekstmisforhold!",
"filter_modal.added.expired_explanation": "Denne filterkategori er udløbet. Ændr dens udløbsdato, for at anvende den.",
@@ -365,7 +365,7 @@
"follow_suggestions.similar_to_recently_followed_longer": "Svarende til profiler, som for nylig er fulgt",
"follow_suggestions.view_all": "Vis alle",
"follow_suggestions.who_to_follow": "Hvem, som skal følges",
- "followed_tags": "Hashtag, som følges",
+ "followed_tags": "Etiketter, som følges",
"footer.about": "Om",
"footer.directory": "Profiloversigt",
"footer.get_app": "Hent appen",
@@ -381,7 +381,7 @@
"hashtag.column_header.tag_mode.any": "eller {additional}",
"hashtag.column_header.tag_mode.none": "uden {additional}",
"hashtag.column_settings.select.no_options_message": "Ingen forslag fundet",
- "hashtag.column_settings.select.placeholder": "Angiv hashtags…",
+ "hashtag.column_settings.select.placeholder": "Angiv etiketter…",
"hashtag.column_settings.tag_mode.all": "Alle disse",
"hashtag.column_settings.tag_mode.any": "Nogle af disse",
"hashtag.column_settings.tag_mode.none": "Ingen af disse",
@@ -389,8 +389,8 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} deltager} other {{counter} deltagere}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
- "hashtag.follow": "Følg hashtag",
- "hashtag.unfollow": "Stop med at følge hashtag",
+ "hashtag.follow": "Følg etiket",
+ "hashtag.unfollow": "Stop med at følge etiket",
"hashtags.and_other": "…og {count, plural, one {}other {# flere}}",
"hints.profiles.followers_may_be_missing": "Der kan mangle følgere for denne profil.",
"hints.profiles.follows_may_be_missing": "Fulgte kan mangle for denne profil.",
@@ -420,7 +420,7 @@
"ignore_notifications_modal.private_mentions_title": "Ignorér notifikationer fra uopfordrede Private omtaler?",
"info_button.label": "Hjælp",
"info_button.what_is_alt_text": "Hvad er alt-tekst?
Alt-tekst leverer billedbeskrivelser til folk med synsnedsættelser, lav båndbredde-forbindelser eller med ønske om ekstra kontekst.
Tilgængelighed og forståelse kan forbedres for alle ved at skrive klar, kortfattet og objektiv alt-tekst.
- Fang vigtige elementer
- Opsummér tekst i billeder
- Brug almindelig sætningsstruktur
- Undgå overflødig information
- Fokusér på tendenser og centrale resultater i kompleks grafik (såsom diagrammer eller kort)
",
- "interaction_modal.action.favourite": "For at fortsætte, skal man vælge Gør til favorit fra sin konto.",
+ "interaction_modal.action.favourite": "For at fortsætte, skal du føje til favoritter fra din konto.",
"interaction_modal.action.follow": "For at fortsætte, skal man vælge Følg fra sin konto.",
"interaction_modal.action.reblog": "For at fortsætte, skal man vælge Fremhæv fra sin konto.",
"interaction_modal.action.reply": "For at fortsætte, skal man besvar fra sin konto.",
@@ -429,7 +429,7 @@
"interaction_modal.no_account_yet": "Har endnu ingen konto?",
"interaction_modal.on_another_server": "På en anden server",
"interaction_modal.on_this_server": "På denne server",
- "interaction_modal.title.favourite": "Favoritmarkér {name}s indlæg",
+ "interaction_modal.title.favourite": "Føj {name}s indlæg til favoritter",
"interaction_modal.title.follow": "Følg {name}",
"interaction_modal.title.reblog": "Fremhæv {name}s indlæg",
"interaction_modal.title.reply": "Besvar {name}s indlæg",
@@ -447,7 +447,7 @@
"keyboard_shortcuts.direct": "for at åbne kolonnen private omtaler",
"keyboard_shortcuts.down": "Flyt nedad på listen",
"keyboard_shortcuts.enter": "Åbn indlæg",
- "keyboard_shortcuts.favourite": "Favoritmarkér indlæg",
+ "keyboard_shortcuts.favourite": "Føj indlæg til favoritter",
"keyboard_shortcuts.favourites": "Åbn favoritlisten",
"keyboard_shortcuts.federated": "Åbn fødereret tidslinje",
"keyboard_shortcuts.heading": "Tastaturgenveje",
@@ -536,7 +536,7 @@
"navigation_bar.favourites": "Favoritter",
"navigation_bar.filters": "Skjulte ord",
"navigation_bar.follow_requests": "Følgeanmodninger",
- "navigation_bar.followed_tags": "Hashtag, som følges",
+ "navigation_bar.followed_tags": "Etiketter, som følges",
"navigation_bar.follows_and_followers": "Følges og følgere",
"navigation_bar.lists": "Lister",
"navigation_bar.logout": "Log af",
@@ -559,10 +559,10 @@
"notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# anden} other {# andre}} tilmeldte sig",
"notification.annual_report.message": "{year} #Wrapstodon venter! Afslør årets højdepunkter og mindeværdige øjeblikke på Mastodon!",
"notification.annual_report.view": "Vis #Wrapstodon",
- "notification.favourite": "{name} favoritmarkerede dit indlæg",
- "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} favoritmarkerede dit indlæg",
- "notification.favourite_pm": "{name} favoritmarkerede din private omtale",
- "notification.favourite_pm.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} favoritmarkerede dit indlæg",
+ "notification.favourite": "{name} føjede dit indlæg til favoritter",
+ "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} føjede dit indlæg til favoritter",
+ "notification.favourite_pm": "{name} føjede din private omtale til favoritter",
+ "notification.favourite_pm.name_and_others_with_link": "{name} og {count, plural, one {# anden} other {# andre}} føjede dit indlæg til favoritter",
"notification.follow": "{name} begyndte at følge dig",
"notification.follow.name_and_others": "{name} og {count, plural, one {# andre} other {# andre}} begyndte at følge dig",
"notification.follow_request": "{name} har anmodet om at følge dig",
@@ -677,7 +677,7 @@
"onboarding.profile.display_name": "Vist navn",
"onboarding.profile.display_name_hint": "Dit fulde navn eller dit sjove navn…",
"onboarding.profile.note": "Bio",
- "onboarding.profile.note_hint": "Man kan @omtale andre personer eller #hashtags…",
+ "onboarding.profile.note_hint": "Man kan @omtale andre personer eller #etiketter…",
"onboarding.profile.save_and_continue": "Gem og fortsæt",
"onboarding.profile.title": "Profilopsætning",
"onboarding.profile.upload_avatar": "Upload profilbillede",
@@ -702,7 +702,7 @@
"privacy.private.short": "Følgere",
"privacy.public.long": "Alle på og udenfor Mastodon",
"privacy.public.short": "Offentlig",
- "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i realtids-strømme/hashtags, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.",
+ "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i realtids-strømme/etiketter, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.",
"privacy.unlisted.long": "Færre algoritmiske fanfarer",
"privacy.unlisted.short": "Stille offentligt",
"privacy_policy.last_updated": "Senest opdateret {date}",
@@ -779,7 +779,7 @@
"search.placeholder": "Søg",
"search.quick_action.account_search": "Profiler matchende {x}",
"search.quick_action.go_to_account": "Gå til profilen {x}",
- "search.quick_action.go_to_hashtag": "Gå til hashtagget {x}",
+ "search.quick_action.go_to_hashtag": "Gå til etiketten {x}",
"search.quick_action.open_url": "Åbn URL i Mastodon",
"search.quick_action.status_search": "Indlæg matchende {x}",
"search.search_or_paste": "Søg efter eller angiv URL",
@@ -793,19 +793,19 @@
"search_popout.user": "bruger",
"search_results.accounts": "Profiler",
"search_results.all": "Alle",
- "search_results.hashtags": "Hashtags",
+ "search_results.hashtags": "Etiketter",
"search_results.no_results": "Ingen resultater.",
- "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller hashtags.",
+ "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller etiketter.",
"search_results.see_all": "Vis alle",
"search_results.statuses": "Indlæg",
"search_results.title": "Søg efter \"{q}\"",
"server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)",
"server_banner.active_users": "aktive brugere",
"server_banner.administered_by": "Håndteres af:",
- "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, man kan bruge for at deltage i fediverset.",
+ "server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, man kan bruge for at deltage i fødiverset.",
"server_banner.server_stats": "Serverstatstik:",
"sign_in_banner.create_account": "Opret konto",
- "sign_in_banner.follow_anyone": "Følg alle på tværs af fediverset og se alt i kronologisk rækkefølge. Ingen algoritmer, annoncer eller clickbait i syne.",
+ "sign_in_banner.follow_anyone": "Følg alle på tværs af fødiverset og se alt i kronologisk rækkefølge. Ingen algoritmer, annoncer eller clickbait i syne.",
"sign_in_banner.mastodon_is": "Mastodon er den bedste måde at holde sig ajour med, hvad der sker.",
"sign_in_banner.sign_in": "Log ind",
"sign_in_banner.sso_redirect": "Log ind eller Tilmeld",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index 70a194e1fb6013..1974d1e62b9302 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -218,6 +218,10 @@
"confirmations.logout.confirm": "Log out",
"confirmations.logout.message": "Are you sure you want to log out?",
"confirmations.logout.title": "Log out?",
+ "confirmations.missing_alt_text.confirm": "Add alt text",
+ "confirmations.missing_alt_text.message": "Your post contains media without alt text. Adding descriptions helps make your content accessible to more people.",
+ "confirmations.missing_alt_text.secondary": "Post anyway",
+ "confirmations.missing_alt_text.title": "Add alt text?",
"confirmations.mute.confirm": "Mute",
"confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 2e899b2804fd2e..54bc7fd380d9a0 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -86,6 +86,13 @@
"alert.unexpected.message": "Tharla earráid gan choinne.",
"alert.unexpected.title": "Hiúps!",
"alt_text_badge.title": "Téacs alt",
+ "alt_text_modal.add_alt_text": "Cuir téacs alt leis",
+ "alt_text_modal.add_text_from_image": "Cuir téacs ón íomhá leis",
+ "alt_text_modal.cancel": "Cealaigh",
+ "alt_text_modal.change_thumbnail": "Athraigh mionsamhail",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Déan cur síos air seo do dhaoine le lagú éisteachta…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Déan cur síos air seo do dhaoine a bhfuil lagú amhairc orthu…",
+ "alt_text_modal.done": "Déanta",
"announcement.announcement": "Fógra",
"annual_report.summary.archetype.booster": "An sealgair fionnuar",
"annual_report.summary.archetype.lurker": "An lurker",
@@ -211,6 +218,10 @@
"confirmations.logout.confirm": "Logáil amach",
"confirmations.logout.message": "An bhfuil tú cinnte gur mhaith leat logáil amach?",
"confirmations.logout.title": "Logáil Amach?",
+ "confirmations.missing_alt_text.confirm": "Cuir téacs alt leis",
+ "confirmations.missing_alt_text.message": "Tá meáin gan alt téacs i do phostáil. Má chuirtear tuairiscí leis, cabhraíonn sé seo leat d’inneachar a rochtain do níos mó daoine.",
+ "confirmations.missing_alt_text.secondary": "Post ar aon nós",
+ "confirmations.missing_alt_text.title": "Cuir téacs alt leis?",
"confirmations.mute.confirm": "Balbhaigh",
"confirmations.redraft.confirm": "Scrios ⁊ athdhréachtaigh",
"confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an postáil seo a scriosadh agus é a athdhréachtú? Caillfear ceanáin agus treisithe, agus dílleachtaí freagraí ar an mbunphostála.",
@@ -407,6 +418,8 @@
"ignore_notifications_modal.not_followers_title": "An dtugann tú aird ar fhógraí ó dhaoine nach leanann tú?",
"ignore_notifications_modal.not_following_title": "An ndéanann tú neamhaird de fhógraí ó dhaoine nach leanann tú?",
"ignore_notifications_modal.private_mentions_title": "An dtugann tú aird ar fhógraí ó Luaintí Príobháideacha gan iarraidh?",
+ "info_button.label": "Cabhrú",
+ "info_button.what_is_alt_text": "Cad is téacs altach ann?
Soláthraíonn téacs Alt cur síos ar íomhánna do dhaoine le lagú radhairc, naisc íseal-bandaleithead, nó daoine atá ag lorg comhthéacs breise.
Is féidir leat inrochtaineacht agus tuiscint a fheabhsú do chách trí théacs alt soiléir, gonta, oibiachtúil a scríobh.
- Glac gnéithe tábhachtacha
- Déan achoimre ar théacs in íomhánna
- Úsáid struchtúr abairtí rialta
li> - Seachain faisnéis iomarcach
- Fócas ar threochtaí agus ar phríomhthorthaí i bhfíseanna casta (amhail léaráidí nó léarscáileanna)
",
"interaction_modal.action.favourite": "Chun leanúint ar aghaidh, ní mór duit an ceann is fearr leat ó do chuntas.",
"interaction_modal.action.follow": "Chun leanúint ar aghaidh, ní mór duit leanúint ó do chuntas.",
"interaction_modal.action.reblog": "Chun leanúint ar aghaidh, ní mór duit athbhlagáil ó do chuntas.",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 8e3b8a26fac44e..f31de0151d63bb 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -218,6 +218,7 @@
"confirmations.logout.confirm": "Wyloguj",
"confirmations.logout.message": "Czy na pewno chcesz się wylogować?",
"confirmations.logout.title": "Wylogować?",
+ "confirmations.missing_alt_text.message": "Twój wpis zawiera treści graficzne bez opisu pomocniczego. Dodając opis, sprawisz, że będzie on bardziej dostępny dla większej liczby osób.",
"confirmations.mute.confirm": "Wycisz",
"confirmations.redraft.confirm": "Usuń i przeredaguj",
"confirmations.redraft.message": "Czy na pewno chcesz usunąć i przeredagować ten wpis? Polubienia i podbicia zostaną utracone, a odpowiedzi do oryginalnego wpisu zostaną osierocone.",
@@ -414,6 +415,8 @@
"ignore_notifications_modal.not_followers_title": "Ignoruj powiadomienia od użytkowników którzy cię nie obserwują?",
"ignore_notifications_modal.not_following_title": "Ignoruj powiadomienia od użytkowników których nie obserwujesz?",
"ignore_notifications_modal.private_mentions_title": "Ignoruj powiadomienia o nieproszonych wzmiankach prywatnych?",
+ "info_button.label": "Pomoc",
+ "info_button.what_is_alt_text": "Czym jest tekst pomocniczy obrazków?
Tekst pomocniczy zapewnia osobom z zaburzeniem widzenia, słabym łączem internetowym oraz tym, którzy szukają dodatkowego kontekstu opis grafik i zdjęć.
\nMożesz zwiększyć jego dostępność i zrozumienie poprzez jasne, zwięzłe i obiektywne sformułowanie tekstu pomocniczego.
\n\n- Uchwyć ważne elementy
\n- Streść tekst na obrazkach
\n- Używaj standardowej składni zdań
\n- Unikaj wprowadzania zbędnych informacji
\n- Skup się na głównych trendach i kluczowych informacjach w skomplikowanych materiałach (tkaich jak wykresy czy mapy)
\n
",
"interaction_modal.action.favourite": "Aby kontynuować, musisz dodać do ulubionych na swoim koncie.",
"interaction_modal.action.follow": "Aby kontynuować, musisz obserwować ze swojego konta.",
"interaction_modal.action.reblog": "Aby kontynuować, musisz podać dalej ze swojego konta.",
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index a8d864cee2b0a5..5e0ef47ec49e98 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -42,7 +42,7 @@ def filter(timeline_type, status, receiver)
when :home
filter_from_home(status, receiver.id, build_crutches(receiver.id, [status]), :home)
when :list
- (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status]), :list)
+ (filter_from_list?(status, receiver) ? :filter : nil) || filter_from_home(status, receiver.account_id, build_crutches(receiver.account_id, [status], list: receiver), :list)
when :mentions
filter_from_mentions?(status, receiver.id) ? :filter : nil
when :direct
@@ -146,7 +146,7 @@ def merge_into_home(from_account, into_account)
timeline_key = key(:home, into_account.id)
aggregate = into_account.user&.aggregates_reblogs?
- query = from_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
+ query = from_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
@@ -174,7 +174,7 @@ def merge_into_list(from_account, list)
timeline_key = key(:list, list.id)
aggregate = list.account.user&.aggregates_reblogs?
- query = from_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
+ query = from_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
@@ -182,10 +182,10 @@ def merge_into_list(from_account, list)
end
statuses = query.to_a
- crutches = build_crutches(list.account_id, statuses)
+ crutches = build_crutches(list.account_id, statuses, list: list)
statuses.each do |status|
- next if filter_from_home(status, list.account_id, crutches) || filter_from_list?(status, list)
+ next if filter_from_home(status, list.account_id, crutches, :list)
add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate)
end
@@ -297,23 +297,32 @@ def populate_home(account)
limit = FeedManager::MAX_ITEMS / 2
aggregate = account.user&.aggregates_reblogs?
timeline_key = key(:home, account.id)
+ over_limit = false
account.statuses.limit(limit).each do |status|
add_to_feed(:home, account.id, status, aggregate_reblogs: aggregate)
end
account.following.includes(:account_stat).reorder(nil).find_each do |target_account|
- if redis.zcard(timeline_key) >= limit
+ query = target_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(limit)
+
+ over_limit ||= redis.zcard(timeline_key) >= limit
+ if over_limit
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
- last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at)
+ last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at, with_random: false)
# If the feed is full and this account has not posted more recently
# than the last item on the feed, then we can skip the whole account
# because none of its statuses would stay on the feed anyway
next if last_status_score < oldest_home_score
+
+ # No need to get older statuses
+ query = query.where(id: oldest_home_score...)
end
- statuses = target_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, :account, reblog: :account).limit(limit)
+ statuses = query.to_a
+ next if statuses.empty?
+
crutches = build_crutches(account.id, statuses)
statuses.each do |status|
@@ -358,23 +367,32 @@ def populate_list(list)
limit = FeedManager::MAX_ITEMS / 2
aggregate = list.account.user&.aggregates_reblogs?
timeline_key = key(:list, list.id)
+ over_limit = false
list.active_accounts.includes(:account_stat).reorder(nil).find_each do |target_account|
- if redis.zcard(timeline_key) >= limit
+ query = target_account.statuses.list_eligible_visibility.includes(reblog: :account).limit(limit)
+
+ over_limit ||= redis.zcard(timeline_key) >= limit
+ if over_limit
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
- last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at)
+ last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at, with_random: false)
# If the feed is full and this account has not posted more recently
# than the last item on the feed, then we can skip the whole account
# because none of its statuses would stay on the feed anyway
next if last_status_score < oldest_home_score
+
+ # No need to get older statuses
+ query = query.where(id: oldest_home_score...)
end
- statuses = target_account.statuses.list_eligible_visibility.includes(:preloadable_poll, :media_attachments, :account, reblog: :account).limit(limit)
- crutches = build_crutches(list.account_id, statuses)
+ statuses = query.to_a
+ next if statuses.empty?
+
+ crutches = build_crutches(list.account_id, statuses, list: list)
statuses.each do |status|
- next if filter_from_home(status, list.account_id, crutches) || filter_from_list?(status, list)
+ next if filter_from_home(status, list.account_id, crutches, :list)
add_to_feed(:list, list.id, status, aggregate_reblogs: aggregate)
end
@@ -652,8 +670,9 @@ def remove_from_feed(timeline_type, account_id, status, aggregate_reblogs: true)
# are going to be checked by the filtering methods
# @param [Integer] receiver_id
# @param [Array] statuses
+ # @param [List] list
# @return [Hash]
- def build_crutches(receiver_id, statuses)
+ def build_crutches(receiver_id, statuses, list: nil)
crutches = {}
crutches[:active_mentions] = crutches_active_mentions(statuses)
@@ -670,20 +689,33 @@ def build_crutches(receiver_id, statuses)
arr
end
- lists = List.where(account_id: receiver_id, exclusive: true)
-
- crutches[:following] = Follow.where(account_id: receiver_id, target_account_id: statuses.filter_map(&:in_reply_to_account_id)).pluck(:target_account_id).index_with(true)
+ crutches[:following] = crutches_following(receiver_id, statuses, list)
crutches[:languages] = Follow.where(account_id: receiver_id, target_account_id: statuses.map(&:account_id)).pluck(:target_account_id, :languages).to_h
crutches[:hiding_reblogs] = Follow.where(account_id: receiver_id, target_account_id: statuses.filter_map { |s| s.account_id if s.reblog? }, show_reblogs: false).pluck(:target_account_id).index_with(true)
crutches[:blocking] = Block.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true)
crutches[:muting] = Mute.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true)
crutches[:domain_blocking] = AccountDomainBlock.where(account_id: receiver_id, domain: statuses.flat_map { |s| [s.account.domain, s.reblog&.account&.domain] }.compact).pluck(:domain).index_with(true)
crutches[:blocked_by] = Block.where(target_account_id: receiver_id, account_id: statuses.map { |s| [s.account_id, s.reblog&.account_id] }.flatten.compact).pluck(:account_id).index_with(true)
- crutches[:exclusive_list_users] = ListAccount.where(list: lists, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true)
+ crutches[:exclusive_list_users] = crutches_exclusive_list_users(receiver_id, statuses) if list.blank?
crutches
end
+ def crutches_exclusive_list_users(recipient_id, statuses)
+ lists = List.where(account_id: recipient_id, exclusive: true)
+ ListAccount.where(list: lists, account_id: statuses.map(&:account_id)).pluck(:account_id).index_with(true)
+ end
+
+ def crutches_following(recipient_id, statuses, list)
+ if list.blank? || list.show_followed?
+ Follow.where(account_id: recipient_id, target_account_id: statuses.filter_map(&:in_reply_to_account_id)).pluck(:target_account_id).index_with(true)
+ elsif list.show_list?
+ ListAccount.where(list_id: list.id, account_id: statuses.filter_map(&:in_reply_to_account_id)).pluck(:account_id).index_with(true)
+ else
+ {}
+ end
+ end
+
def crutches_active_mentions(statuses)
Mention
.active
diff --git a/config/initializers/prometheus_exporter.rb b/config/initializers/prometheus_exporter.rb
index 197777e3b65bbd..fab095658ff272 100644
--- a/config/initializers/prometheus_exporter.rb
+++ b/config/initializers/prometheus_exporter.rb
@@ -2,6 +2,7 @@
if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true'
if ENV['MASTODON_PROMETHEUS_EXPORTER_LOCAL'] == 'true'
+ require 'prometheus_exporter'
require 'prometheus_exporter/server'
require 'prometheus_exporter/client'
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index c2cf6855035c52..f64040a267c38f 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -1285,6 +1285,7 @@ cy:
too_fast: Cafodd y ffurflen ei chyflwyno'n rhy gyflym, ceisiwch eto.
use_security_key: Defnyddiwch allwedd diogelwch
user_agreement_html: Rwyf wedi darllen ac yn cytuno i delerau gwasanaeth a'r polisi preifatrwydd
+ user_privacy_agreement_html: Rwyf wedi darllen ac yn cytuno i'r polisi preifatrwydd
author_attribution:
example_title: Testun enghreifftiol
hint_html: Ydych chi'n ysgrifennu erthyglau newyddion neu flog y tu allan i Mastodon? Rheolwch sut y byddwch yn cael eich cydnabod pan fyddan nhw'n cael eu rhannu ar Mastodon.
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 59f4789d5b56f8..3ed9d40db97106 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -374,7 +374,7 @@ da:
other: "%{count} verserende anmeldelser"
pending_tags_html:
one: "%{count} afventende hashtag"
- other: "%{count} afventende hashtags"
+ other: "%{count} afventende etiketter"
pending_users_html:
one: "%{count} afventende bruger"
other: "%{count} afventende brugere"
@@ -735,7 +735,7 @@ da:
manage_settings: Håndtere indstillinger
manage_settings_description: Tillader brugere at ændre webstedsindstillinger
manage_taxonomies: Håndtere taksonomier
- manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere hashtag-indstillinger
+ manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere etiket-indstillinger
manage_user_access: Håndtere brugeradgang
manage_user_access_description: Tillader brugere at deaktivere andre brugeres tofaktorgodkendelse, skifte deres e-mailadresse og nulstille deres adgangskode
manage_users: Håndtere brugere
@@ -925,7 +925,7 @@ da:
reset: Nulstil
review: Gennmgangsstatus
search: Søg
- title: Hashtags
+ title: Etiketter
updated_msg: Hashtag-indstillinger opdateret
terms_of_service:
back: Tilbage til Tjenestevilkår
@@ -1014,14 +1014,14 @@ da:
tag_servers_dimension: Topservere
tag_servers_measure: forskellige servere
tag_uses_measure: anvendelser i alt
- description_html: Disse er hashtags, som pt. vises i en masse indlæg, som serveren ser. Det kan hjælpe brugerne til at finde ud af, hvad folk taler mest om pt. Ingen hashtags vises offentligt, før man godkender dem.
+ description_html: Disse er etiketter, som pt. vises i en masse indlæg, som serveren ser. Det kan hjælpe brugerne til at finde ud af, hvad folk taler mest om pt. Ingen etiketter vises offentligt, før man godkender dem.
listable: Kan foreslås
no_tag_selected: Intet tag ændret (da intet var valgt)
not_listable: Foreslås ikke
not_trendable: Vises ikke under tendenser
not_usable: Kan ikke anvendes
peaked_on_and_decaying: Toppede pr. %{date}, nu for nedadgående
- title: Populære hashtags
+ title: Populære etiketter
trendable: Kan vises under tendenser
trending_rank: 'Populær #%{rank}'
usable: Kan anvendes
@@ -1093,7 +1093,7 @@ da:
new_trending_statuses:
title: Populære opslag
new_trending_tags:
- title: Populære hashtags
+ title: Populære etiketter
subject: Nye tendenser klar til gennemgang på %{instance}
aliases:
add_new: Opret alias
@@ -1104,7 +1104,7 @@ da:
remove: Fjern aliaslinkning
appearance:
advanced_web_interface: Avanceret webgrænseflade
- advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede webgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, federeret tidslinje, et hvilket som helst antal lister og hashtags.'
+ advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede netgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, fødereret tidslinje, et hvilket som helst antal lister og etiketter.'
animations_and_accessibility: Animationer og tilgængelighed
confirmation_dialogs: Bekræftelsesdialoger
discovery: Opdagelse
@@ -1331,8 +1331,8 @@ da:
featured_tags:
add_new: Tilføj nyt
errors:
- limit: Det maksimale antal hashtags er allerede fremhævet
- hint_html: "Hvad er fremhævede hashtags? De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse hashtags. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter."
+ limit: Det maksimale antal etiketter er allerede fremhævet
+ hint_html: "Hvad er fremhævede etiketter? De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse etiketter. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter."
filters:
contexts:
account: Profiler
@@ -1704,7 +1704,7 @@ da:
content_warning: 'Indholdsadvarsel:'
descriptions:
account: Offentlige indlæg fra @%{acct}
- tag: 'Offentlige indlæg tagget #%{hashtag}'
+ tag: 'Offentlige indlæg etiketteret #%{hashtag}'
scheduled_statuses:
over_daily_limit: Den daglige grænse på %{limit} planlagte indlæg er nået
over_total_limit: Grænsen på %{limit} planlagte indlæg er nået
@@ -1769,7 +1769,7 @@ da:
development: Udvikling
edit_profile: Redigér profil
export: Eksport
- featured_tags: Udvalgte hashtags
+ featured_tags: Udvalgte etiketter
import: Import
import_and_export: Import og eksport
migrate: Kontomigrering
@@ -1809,8 +1809,8 @@ da:
content_warning: 'Indholdsadvarsel: %{warning}'
default_language: Samme som UI-sproget
disallowed_hashtags:
- one: 'indeholdte et ikke tilladt hashtag: %{tags}'
- other: 'indeholdte de ikke tilladte hashtags: %{tags}'
+ one: 'indeholdte en ikke tilladt etiket: %{tags}'
+ other: 'indeholdte de ikke tilladte etiketter: %{tags}'
edited_at_html: Redigeret %{date}
errors:
in_reply_not_found: Indlægget, der forsøges besvaret, ser ikke ud til at eksistere.
@@ -2003,8 +2003,8 @@ da:
one: "%{people} person de seneste 2 dage"
other: "%{people} personer de seneste 2 dage"
hashtags_subtitle: Udforsk de seneste 2 dages tendenser
- hashtags_title: Populære hashtags
- hashtags_view_more: Se flere populære hashtags
+ hashtags_title: Populære etiketter
+ hashtags_view_more: Se flere populære etiketter
post_action: Skriv
post_step: Sig hej til verden med tekst, fotos, videoer eller afstemninger.
post_title: Opret det første indlæg
diff --git a/config/locales/ga.yml b/config/locales/ga.yml
index 56f66609c31a7c..9945e44c07343e 100644
--- a/config/locales/ga.yml
+++ b/config/locales/ga.yml
@@ -1266,6 +1266,7 @@ ga:
too_fast: Cuireadh an fhoirm isteach róthapa, triail arís.
use_security_key: Úsáid eochair shlándála
user_agreement_html: Léigh mé agus aontaím leis na téarmaí seirbhíse agus polasaí príobháideachais
+ user_privacy_agreement_html: Léigh mé agus aontaím leis an polasaí príobháideachais
author_attribution:
example_title: Téacs samplach
hint_html: An bhfuil tú ag scríobh altanna nuachta nó blag lasmuigh de Mastodon? Rialú conas a gheobhaidh tú creidmheas nuair a roinntear iad ar Mastodon.
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index e2e28600591a3c..5770b4ce0cdeaa 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -1247,6 +1247,7 @@ pl:
too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie.
use_security_key: Użyj klucza bezpieczeństwa
user_agreement_html: Przeczytałem i akceptuję warunki korzystania z usługi oraz politykę prywatności
+ user_privacy_agreement_html: Przeczytałem/am/o i akceptuję politykę prywatności
author_attribution:
example_title: Przykładowy tekst
hint_html: Piszesz wiadomości albo bloga poza Mastodonem? Kontroluj jak będą ci przypisywane podczas dizielenia się nimi na Mastodonie.
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index 1220ceabf3aca9..805f8f93af57dd 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -3,6 +3,7 @@ cy:
simple_form:
hints:
account:
+ attribution_domains: Un i bob llinell. Yn amddiffyn rhag priodoli ffug.
discoverable: Mae'n bosibl y bydd eich postiadau cyhoeddus a'ch proffil yn cael sylw neu'n cael eu hargymell mewn gwahanol feysydd o Mastodon ac efallai y bydd eich proffil yn cael ei awgrymu i ddefnyddwyr eraill.
display_name: Eich enw llawn neu'ch enw hwyl.
fields: Eich tudalen cartref, rhagenwau, oed, neu unrhyw beth.
@@ -155,6 +156,7 @@ cy:
url: I ble bydd digwyddiadau'n cael eu hanfon
labels:
account:
+ attribution_domains: Gwefannau sy'n cael caniatâd i'ch cydnabod chi
discoverable: Proffil nodwedd a phostiadau mewn algorithmau darganfod
fields:
name: Label
@@ -231,6 +233,7 @@ cy:
setting_display_media_show_all: Dangos popeth
setting_expand_spoilers: Dangos postiadau wedi'u marcio â rhybudd cynnwys bob tro
setting_hide_network: Cuddio eich graff cymdeithasol
+ setting_missing_alt_text_modal: Dangos deialog cadarnhau cyn postio cyfrwng heb destun amgen
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.da.yml b/config/locales/simple_form.da.yml
index b92341c4e81162..1548e3e24e5b10 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -8,7 +8,7 @@ da:
display_name: Dit fulde navn eller dit sjove navn.
fields: Din hjemmeside, dine pronominer, din alder, eller hvad du har lyst til.
indexable: Dine offentlige indlæg vil kunne vises i Mastodon-søgeresultater. Folk, som har interageret med dem, vil kunne finde dem uanset.
- note: 'Du kan @omtale andre personer eller #hashtags.'
+ note: 'Du kan @omtale andre personer eller #etiketter.'
show_collections: Folk vil ikke kunne tjekke dine Følger og Følgere. Folk, du selv følger, vil stadig kunne se dette.
unlocked: Man vil kunne følges af folk uden først at godkende dem. Ønsker man at gennemgå Følg-anmodninger og individuelt acceptere/afvise nye følgere, så fjern markeringen.
account_alias:
@@ -16,7 +16,7 @@ da:
account_migration:
acct: Angiv brugernavn@domain for den konto, hvortil du vil flytte
account_warning_preset:
- text: Du kan bruge indlægssyntaks, såsom URL'er, hashtags og omtaler
+ text: Du kan bruge indlægssyntaks, såsom URL'er, etiketter og omtaler
title: Valgfri. Ikke synlig for modtageren
admin_account_action:
include_statuses: Brugeren vil se, hvilke indlæg, som har forårsaget modereringen/advarslen
@@ -71,7 +71,7 @@ da:
domain: Dette kan være domænenavnet vist i den benyttede i e-mailadresse eller MX-post. Begge tjekkes under tilmelding.
with_dns_records: Et forsøg på at opløse det givne domænes DNS-poster foretages, og resultaterne blokeres ligeledes
featured_tag:
- name: 'Her er nogle af dine hyppigst brugte hashtags:'
+ name: 'Her er nogle af dine hyppigst brugte etiketter:'
filters:
action: Vælg handlingen til eksekvering, når et indlæg matcher filteret
actions:
@@ -102,7 +102,7 @@ da:
thumbnail: Et ca. 2:1 billede vist sammen med serveroplysningerne.
timeline_preview: Udloggede besøgende kan gennemse serverens seneste offentlige indlæg.
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: Tendenser viser, hvilke indlæg, etiketter og nyheder opnår momentum på serveren.
trends_as_landing_page: Vis tendensindhold til udloggede brugere og besøgende i stedet for en beskrivelse af denne server. Kræver, at tendenser er aktiveret.
form_challenge:
current_password: Du bevæger dig ind på et sikkert område
@@ -327,10 +327,10 @@ da:
indexable: Inkludér profilside i søgemaskiner
show_application: Vis, fra hvilken app et indlæg er sendt
tag:
- listable: Tillad visning af dette hashtag i søgninger og forslag
+ listable: Tillad visning af denne etiket i søgninger og forslag
name: Hashtag
- trendable: Tillad visning af dette hashtag under trends
- usable: Tillad indlæg at benytte dette hashtag lokalt
+ trendable: Tillad visning af denne etiket under tendenser
+ usable: Tillad indlæg at benytte denne etiket lokalt
terms_of_service:
changelog: Hvad der er ændret?
text: Tjenestevilkår
diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml
index fa7868cc765fca..8a4cb247c76542 100644
--- a/config/locales/simple_form.en-GB.yml
+++ b/config/locales/simple_form.en-GB.yml
@@ -233,6 +233,7 @@ en-GB:
setting_display_media_show_all: Show all
setting_expand_spoilers: Always expand posts marked with content warnings
setting_hide_network: Hide your social graph
+ setting_missing_alt_text_modal: Show confirmation dialogue before posting media without alt text
setting_reduce_motion: Reduce motion in animations
setting_system_font_ui: Use system's default font
setting_system_scrollbars_ui: Use system's default scrollbar
diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml
index 93eff4a89ddee8..93a1090cf811f1 100644
--- a/config/locales/simple_form.ga.yml
+++ b/config/locales/simple_form.ga.yml
@@ -3,6 +3,7 @@ ga:
simple_form:
hints:
account:
+ attribution_domains: Ceann in aghaidh an líne. Cosnaíonn sé ó sannadh bréagach.
discoverable: Seans go mbeidh do phostálacha poiblí agus do phróifíl le feiceáil nó molta i réimsí éagsúla de Mastodon agus is féidir do phróifíl a mholadh d’úsáideoirí eile.
display_name: D'ainm iomlán nó d'ainm spraoi.
fields: Do leathanach baile, forainmneacha, aois, rud ar bith is mian leat.
@@ -155,6 +156,7 @@ ga:
url: An áit a seolfar imeachtaí chuig
labels:
account:
+ attribution_domains: Tá cead ag suíomhanna Gréasáin creidmheas a thabhairt duit
discoverable: Próifíl gné agus postálacha in halgartaim fionnachtana
fields:
name: Lipéad
@@ -231,6 +233,7 @@ ga:
setting_display_media_show_all: Taispeáin uile
setting_expand_spoilers: Méadaigh postálacha atá marcáilte le rabhaidh inneachair i gcónaí
setting_hide_network: Folaigh do ghraf sóisialta
+ setting_missing_alt_text_modal: Taispeáin dialóg deimhnithe sula bpostálann tú meán gan alt téacs
setting_reduce_motion: Laghdú ar an tairiscint i beochan
setting_system_font_ui: Úsáid cló réamhshocraithe an chórais
setting_system_scrollbars_ui: Bain úsáid as scrollbharra réamhshocraithe an chórais
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index efa17c1a9bd12d..74dc8218a9a10d 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -137,6 +137,10 @@ pl:
admin_email: Zawiadomienia prawne obejmują środki zapobiegawcze, nakazy sądowe, wnioski o popełnienie sprawy oraz wnioski organów ścigania.
arbitration_address: Może być taki sam jak adres fizyczny powyżej lub „N/A” jeśli używasz adresu e-mail
arbitration_website: Może być formularzem internetowym lub „N/A”, jeśli używasz adresu e-mail
+ dmca_address: W przypadku operatorów z USA należy użyć adresu zarejestrowanego w DMCA Designated Agent Directory. Lista skrytek pocztowych dostępna jest na bezpośrednią prośbę użytkownika. Użyj DMCA Agent Post Office Box Waiver Request, aby wysłać email do Copyright Office z informacją, że jesteś domowym administratorm treści i z powodu obawy o zemstę lub odwetu za swoje działania, musisz użyć skrytki pocztowej, żeby usunąć swój adres domowy z dostępu publicznego.
+ dmca_email: Adres email może być taki sam jak wcześniejszy "adres e-mail przeznaczony do celów prawnych"
+ domain: Unikalny numer identyfikacji świadczonej przez Ciebie usługi online.
+ jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo.
user:
chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu
role: Rola kontroluje uprawnienia użytkownika.
@@ -152,6 +156,7 @@ pl:
url: Dokąd będą wysłane zdarzenia
labels:
account:
+ attribution_domains: Strony które mogą ci przypisywać autorstwo
discoverable: Udostępniaj profil i wpisy funkcjom odkrywania
fields:
name: Nazwa
@@ -228,6 +233,7 @@ pl:
setting_display_media_show_all: Pokaż wszystko
setting_expand_spoilers: Zawsze rozwijaj wpisy oznaczone ostrzeżeniem o zawartości
setting_hide_network: Ukryj swoją sieć
+ setting_missing_alt_text_modal: Pokaż okno potwierdzenia przed opublikowaniem materiałów bez pomocniczego opisu obrazów
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
@@ -329,6 +335,7 @@ pl:
changelog: Co się zmieniło?
text: Warunki korzystania z usługi
terms_of_service_generator:
+ admin_email: Adres e-mail przeznaczony do celów prawnych
arbitration_address: Adres fizyczny powiadomień arbitrażowych
arbitration_website: Strona internetowa do składania zgłoszeń arbitrażowych
dmca_address: Adres fizyczny dla zgłoszeń naruszenia DMCA/praw autorskich
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index e7fb218e2d68cc..a1257d4cd48d17 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -1365,6 +1365,7 @@ sk:
explanation: Tu nájdeš nejaké tipy do začiatku
feature_action: Zisti viac
follow_action: Nasleduj
+ follow_title: Prispôsob svoj domáci kanál
follows_title: Koho nasledovať
post_title: Vytvor svoj prvý príspevok
share_action: Zdieľaj
diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb
index 4ce6f5d34ac916..f6885bb865c966 100644
--- a/spec/lib/feed_manager_spec.rb
+++ b/spec/lib/feed_manager_spec.rb
@@ -203,6 +203,28 @@
end
end
+ context 'with list feed' do
+ let(:list) { Fabricate(:list, account: bob) }
+
+ before do
+ bob.follow!(alice)
+ list.list_accounts.create!(account: alice)
+ end
+
+ it "returns false for followee's status" do
+ status = Fabricate(:status, text: 'Hello world', account: alice)
+
+ expect(subject.filter?(:list, status, list)).to be false
+ end
+
+ it 'returns false for reblog by followee' do
+ status = Fabricate(:status, text: 'Hello world', account: jeff)
+ reblog = Fabricate(:status, reblog: status, account: alice)
+
+ expect(subject.filter?(:list, reblog, list)).to be false
+ end
+ end
+
context 'with mentions feed' do
it 'returns true for status that mentions blocked account' do
bob.block!(jeff)