From 7201f99cf83a74331febd1624ca9aaace68af5e6 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 03:41:59 -0400
Subject: [PATCH 001/215] Change default ruby version to 3.3.1 (#28013)

---
 .github/workflows/test-ruby.yml | 6 +++---
 .ruby-version                   | 2 +-
 Dockerfile                      | 6 +++---
 Gemfile.lock                    | 2 +-
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml
index 3a78f8b43..b28f5261c 100644
--- a/.github/workflows/test-ruby.yml
+++ b/.github/workflows/test-ruby.yml
@@ -115,8 +115,8 @@ jobs:
       matrix:
         ruby-version:
           - '3.1'
+          - '3.2'
           - '.ruby-version'
-          - '3.3'
     steps:
       - uses: actions/checkout@v4
 
@@ -190,8 +190,8 @@ jobs:
       matrix:
         ruby-version:
           - '3.1'
+          - '3.2'
           - '.ruby-version'
-          - '3.3'
 
     steps:
       - uses: actions/checkout@v4
@@ -289,8 +289,8 @@ jobs:
       matrix:
         ruby-version:
           - '3.1'
+          - '3.2'
           - '.ruby-version'
-          - '3.3'
         search-image:
           - docker.elastic.co/elasticsearch/elasticsearch:7.17.13
         include:
diff --git a/.ruby-version b/.ruby-version
index 351227fca..bea438e9a 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-3.2.4
+3.3.1
diff --git a/Dockerfile b/Dockerfile
index a95d41a65..4278242bc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,15 +7,15 @@
 ARG TARGETPLATFORM=${TARGETPLATFORM}
 ARG BUILDPLATFORM=${BUILDPLATFORM}
 
-# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.2.4"]
-ARG RUBY_VERSION="3.2.4"
+# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.1"]
+ARG RUBY_VERSION="3.3.1"
 # # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
 ARG NODE_MAJOR_VERSION="20"
 # Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
 ARG DEBIAN_VERSION="bookworm"
 # Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
 FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim as node
-# Ruby image to use for base image based on combined variables (ex: 3.2.4-slim-bookworm)
+# Ruby image to use for base image based on combined variables (ex: 3.3.1-slim-bookworm)
 FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} as ruby
 
 # Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
diff --git a/Gemfile.lock b/Gemfile.lock
index 620da8499..18564ea68 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -952,7 +952,7 @@ DEPENDENCIES
   xorcist (~> 1.1)
 
 RUBY VERSION
-   ruby 3.2.3p157
+   ruby 3.3.1p55
 
 BUNDLED WITH
    2.5.9

From 4f4b77920eeb3ba65346862d489945494dfeab64 Mon Sep 17 00:00:00 2001
From: David Beck <davbeck@users.noreply.github.com>
Date: Mon, 29 Apr 2024 00:55:58 -0700
Subject: [PATCH 002/215] Remove home marker updates (#22721)

---
 app/javascript/mastodon/actions/markers.ts | 22 ----------------------
 1 file changed, 22 deletions(-)

diff --git a/app/javascript/mastodon/actions/markers.ts b/app/javascript/mastodon/actions/markers.ts
index 6ecc86716..91f78ee28 100644
--- a/app/javascript/mastodon/actions/markers.ts
+++ b/app/javascript/mastodon/actions/markers.ts
@@ -1,5 +1,3 @@
-import { List as ImmutableList } from 'immutable';
-
 import { debounce } from 'lodash';
 
 import type { MarkerJSON } from 'mastodon/api_types/markers';
@@ -71,19 +69,6 @@ interface MarkerParam {
   last_read_id?: string;
 }
 
-function getLastHomeId(state: RootState): string | undefined {
-  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
-  return (
-    // eslint-disable-next-line @typescript-eslint/no-unsafe-call
-    state
-      // @ts-expect-error state.timelines is not yet typed
-      .getIn(['timelines', 'home', 'items'], ImmutableList())
-      // @ts-expect-error state.timelines is not yet typed
-      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
-      .find((item) => item !== null)
-  );
-}
-
 function getLastNotificationId(state: RootState): string | undefined {
   // @ts-expect-error state.notifications is not yet typed
   // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call
@@ -93,15 +78,8 @@ function getLastNotificationId(state: RootState): string | undefined {
 const buildPostMarkersParams = (state: RootState) => {
   const params = {} as { home?: MarkerParam; notifications?: MarkerParam };
 
-  const lastHomeId = getLastHomeId(state);
   const lastNotificationId = getLastNotificationId(state);
 
-  if (lastHomeId && compareId(lastHomeId, state.markers.home) > 0) {
-    params.home = {
-      last_read_id: lastHomeId,
-    };
-  }
-
   if (
     lastNotificationId &&
     compareId(lastNotificationId, state.markers.notifications) > 0

From 36909065b544d06e8487f1e0679e595fd01a7f22 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Mon, 29 Apr 2024 10:02:41 +0200
Subject: [PATCH 003/215] Convert easy entrypoints files to Typescript (#30102)

---
 .../{application.js => application.ts}           |  4 ++--
 .../entrypoints/{error.js => error.ts}           |  6 +++++-
 .../entrypoints/{inert.js => inert.ts}           |  0
 .../entrypoints/{mailer.js => mailer.ts}         |  0
 .../{public-path.js => public-path.ts}           | 10 ++++++----
 .../entrypoints/{share.jsx => share.tsx}         | 16 ++++++++++------
 package.json                                     |  1 +
 yarn.lock                                        |  8 ++++++++
 8 files changed, 32 insertions(+), 13 deletions(-)
 rename app/javascript/entrypoints/{application.js => application.ts} (81%)
 rename app/javascript/entrypoints/{error.js => error.ts} (64%)
 rename app/javascript/entrypoints/{inert.js => inert.ts} (100%)
 rename app/javascript/entrypoints/{mailer.js => mailer.ts} (100%)
 rename app/javascript/entrypoints/{public-path.js => public-path.ts} (69%)
 rename app/javascript/entrypoints/{share.jsx => share.tsx} (64%)

diff --git a/app/javascript/entrypoints/application.js b/app/javascript/entrypoints/application.ts
similarity index 81%
rename from app/javascript/entrypoints/application.js
rename to app/javascript/entrypoints/application.ts
index d13388b47..1087b1c4c 100644
--- a/app/javascript/entrypoints/application.js
+++ b/app/javascript/entrypoints/application.ts
@@ -1,5 +1,5 @@
 import './public-path';
-import main from "mastodon/main";
+import main from 'mastodon/main';
 
 import { start } from '../mastodon/common';
 import { loadLocale } from '../mastodon/locales';
@@ -10,6 +10,6 @@ start();
 loadPolyfills()
   .then(loadLocale)
   .then(main)
-  .catch(e => {
+  .catch((e: unknown) => {
     console.error(e);
   });
diff --git a/app/javascript/entrypoints/error.js b/app/javascript/entrypoints/error.ts
similarity index 64%
rename from app/javascript/entrypoints/error.js
rename to app/javascript/entrypoints/error.ts
index 6376dc2f5..db68484f3 100644
--- a/app/javascript/entrypoints/error.js
+++ b/app/javascript/entrypoints/error.ts
@@ -2,7 +2,9 @@ import './public-path';
 import ready from '../mastodon/ready';
 
 ready(() => {
-  const image = document.querySelector('img');
+  const image = document.querySelector<HTMLImageElement>('img');
+
+  if (!image) return;
 
   image.addEventListener('mouseenter', () => {
     image.src = '/oops.gif';
@@ -11,4 +13,6 @@ ready(() => {
   image.addEventListener('mouseleave', () => {
     image.src = '/oops.png';
   });
+}).catch((e: unknown) => {
+  console.error(e);
 });
diff --git a/app/javascript/entrypoints/inert.js b/app/javascript/entrypoints/inert.ts
similarity index 100%
rename from app/javascript/entrypoints/inert.js
rename to app/javascript/entrypoints/inert.ts
diff --git a/app/javascript/entrypoints/mailer.js b/app/javascript/entrypoints/mailer.ts
similarity index 100%
rename from app/javascript/entrypoints/mailer.js
rename to app/javascript/entrypoints/mailer.ts
diff --git a/app/javascript/entrypoints/public-path.js b/app/javascript/entrypoints/public-path.ts
similarity index 69%
rename from app/javascript/entrypoints/public-path.js
rename to app/javascript/entrypoints/public-path.ts
index f4d166a77..ac4b9355b 100644
--- a/app/javascript/entrypoints/public-path.js
+++ b/app/javascript/entrypoints/public-path.ts
@@ -2,7 +2,7 @@
 // to share the same assets regardless of instance configuration.
 // See https://webpack.js.org/guides/public-path/#on-the-fly
 
-function removeOuterSlashes(string) {
+function removeOuterSlashes(string: string) {
   return string.replace(/^\/*/, '').replace(/\/*$/, '');
 }
 
@@ -15,7 +15,9 @@ function formatPublicPath(host = '', path = '') {
   return `${formattedHost}/${formattedPath}/`;
 }
 
-const cdnHost = document.querySelector('meta[name=cdn-host]');
+const cdnHost = document.querySelector<HTMLMetaElement>('meta[name=cdn-host]');
 
-// eslint-disable-next-line no-undef
-__webpack_public_path__ = formatPublicPath(cdnHost ? cdnHost.content : '', process.env.PUBLIC_OUTPUT_PATH);
+__webpack_public_path__ = formatPublicPath(
+  cdnHost ? cdnHost.content : '',
+  process.env.PUBLIC_OUTPUT_PATH,
+);
diff --git a/app/javascript/entrypoints/share.jsx b/app/javascript/entrypoints/share.tsx
similarity index 64%
rename from app/javascript/entrypoints/share.jsx
rename to app/javascript/entrypoints/share.tsx
index 7b5723091..792625085 100644
--- a/app/javascript/entrypoints/share.jsx
+++ b/app/javascript/entrypoints/share.tsx
@@ -2,7 +2,7 @@ import './public-path';
 import { createRoot } from 'react-dom/client';
 
 import { start } from '../mastodon/common';
-import ComposeContainer  from '../mastodon/containers/compose_container';
+import ComposeContainer from '../mastodon/containers/compose_container';
 import { loadPolyfills } from '../mastodon/polyfills';
 import ready from '../mastodon/ready';
 
@@ -16,7 +16,7 @@ function loaded() {
 
     if (!attr) return;
 
-    const props = JSON.parse(attr);
+    const props = JSON.parse(attr) as object;
     const root = createRoot(mountNode);
 
     root.render(<ComposeContainer {...props} />);
@@ -24,9 +24,13 @@ function loaded() {
 }
 
 function main() {
-  ready(loaded);
+  ready(loaded).catch((error: unknown) => {
+    console.error(error);
+  });
 }
 
-loadPolyfills().then(main).catch(error => {
-  console.error(error);
-});
+loadPolyfills()
+  .then(main)
+  .catch((error: unknown) => {
+    console.error(error);
+  });
diff --git a/package.json b/package.json
index 0b5c3484d..24d81ea47 100644
--- a/package.json
+++ b/package.json
@@ -167,6 +167,7 @@
     "@types/redux-immutable": "^4.0.3",
     "@types/requestidlecallback": "^0.3.5",
     "@types/webpack": "^4.41.33",
+    "@types/webpack-env": "^1.18.4",
     "@typescript-eslint/eslint-plugin": "^7.0.0",
     "@typescript-eslint/parser": "^7.0.0",
     "babel-jest": "^29.5.0",
diff --git a/yarn.lock b/yarn.lock
index 0b60c39c9..ffc64ba08 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2766,6 +2766,7 @@ __metadata:
     "@types/redux-immutable": "npm:^4.0.3"
     "@types/requestidlecallback": "npm:^0.3.5"
     "@types/webpack": "npm:^4.41.33"
+    "@types/webpack-env": "npm:^1.18.4"
     "@typescript-eslint/eslint-plugin": "npm:^7.0.0"
     "@typescript-eslint/parser": "npm:^7.0.0"
     arrow-key-navigation: "npm:^1.2.0"
@@ -3990,6 +3991,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/webpack-env@npm:^1.18.4":
+  version: 1.18.4
+  resolution: "@types/webpack-env@npm:1.18.4"
+  checksum: 10c0/3fa77dbff0ed71685404576b0a1cf74587567fe2ee1cfd11d56d6eefcab7a61e4c9ead0eced264e289d2cf0fc74296dbd55ed6c95774fe0fd6264d156c5a59f0
+  languageName: node
+  linkType: hard
+
 "@types/webpack-sources@npm:*":
   version: 3.2.2
   resolution: "@types/webpack-sources@npm:3.2.2"

From d8a4cea41b7def0815912cfba01aee7f95a24cde Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 10:08:43 +0200
Subject: [PATCH 004/215] Update dependency haml_lint to v0.58.0 (#30094)

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 18564ea68..f57562370 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -304,7 +304,7 @@ GEM
       activesupport (>= 5.1)
       haml (>= 4.0.6)
       railties (>= 5.1)
-    haml_lint (0.57.0)
+    haml_lint (0.58.0)
       haml (>= 5.0)
       parallel (~> 1.10)
       rainbow
@@ -498,7 +498,7 @@ GEM
     orm_adapter (0.5.0)
     ox (2.14.18)
     parallel (1.24.0)
-    parser (3.3.0.5)
+    parser (3.3.1.0)
       ast (~> 2.4.1)
       racc
     parslet (2.0.0)

From 31f3dd57e08282b679bb0033b6b69f0172fde678 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 10:08:58 +0200
Subject: [PATCH 005/215] Update dependency rubocop to v1.63.4 (#30096)

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 f57562370..4f4ca89dc 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -644,7 +644,7 @@ GEM
       rspec-mocks (~> 3.0)
       sidekiq (>= 5, < 8)
     rspec-support (3.13.1)
-    rubocop (1.63.3)
+    rubocop (1.63.4)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)

From c0584a6f4f91c00b28bf6a1e307c0f0228b5ad67 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 08:09:27 +0000
Subject: [PATCH 006/215] Update devDependencies (non-major) (#30109)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 64 +++++++++++++++++++++++++++----------------------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index ffc64ba08..0ef97cdd8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1983,7 +1983,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/selector-specificity@npm:^3.0.2, @csstools/selector-specificity@npm:^3.0.3":
+"@csstools/selector-specificity@npm:^3.0.3":
   version: 3.0.3
   resolution: "@csstools/selector-specificity@npm:3.0.3"
   peerDependencies:
@@ -3332,8 +3332,8 @@ __metadata:
   linkType: hard
 
 "@testing-library/react@npm:^15.0.0":
-  version: 15.0.2
-  resolution: "@testing-library/react@npm:15.0.2"
+  version: 15.0.5
+  resolution: "@testing-library/react@npm:15.0.5"
   dependencies:
     "@babel/runtime": "npm:^7.12.5"
     "@testing-library/dom": "npm:^10.0.0"
@@ -3341,7 +3341,7 @@ __metadata:
   peerDependencies:
     react: ^18.0.0
     react-dom: ^18.0.0
-  checksum: 10c0/8d75e4850f8f749244bf4f30b0f99a5d4aa1156ee5a59eea0772f47971c38535d1fb31d021c4f0f0b816346ae664870dc223d5d997ab399dfb1b6211f0e2acf1
+  checksum: 10c0/8759cc8e7e6b4d8964f151d8872ea3c91b6ef6d8fb3b9116fae53350b9a6b29e5ad45b18408c22525924d050263f7ea77cd17ca803918759f22a760f68a42227
   languageName: node
   linkType: hard
 
@@ -6509,10 +6509,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"css-functions-list@npm:^3.2.1":
-  version: 3.2.1
-  resolution: "css-functions-list@npm:3.2.1"
-  checksum: 10c0/e6e2d9580437ad6df9f2cf18cff3f941691ec5cbbaebd4cb17a5da40d8d5dac50004807ddd05c00a121d2f21a224e2c5d339fe8e13614af21c00181d7d1c22b9
+"css-functions-list@npm:^3.2.2":
+  version: 3.2.2
+  resolution: "css-functions-list@npm:3.2.2"
+  checksum: 10c0/8638a63d0cf1bdc50d4a752ec1c94a57e9953c3b03eace4f5526db20bec3c061e95089f905dbb4999c44b9780ce777ba856967560f6d15119a303f6030901c10
   languageName: node
   linkType: hard
 
@@ -14329,10 +14329,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0":
-  version: 18.2.0
-  resolution: "react-is@npm:18.2.0"
-  checksum: 10c0/6eb5e4b28028c23e2bfcf73371e72cd4162e4ac7ab445ddae2afe24e347a37d6dc22fae6e1748632cd43c6d4f9b8f86dcf26bf9275e1874f436d129952528ae0
+"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.3.1":
+  version: 18.3.1
+  resolution: "react-is@npm:18.3.1"
+  checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072
   languageName: node
   linkType: hard
 
@@ -14581,15 +14581,15 @@ __metadata:
   linkType: hard
 
 "react-test-renderer@npm:^18.2.0":
-  version: 18.2.0
-  resolution: "react-test-renderer@npm:18.2.0"
+  version: 18.3.1
+  resolution: "react-test-renderer@npm:18.3.1"
   dependencies:
-    react-is: "npm:^18.2.0"
+    react-is: "npm:^18.3.1"
     react-shallow-renderer: "npm:^16.15.0"
-    scheduler: "npm:^0.23.0"
+    scheduler: "npm:^0.23.2"
   peerDependencies:
-    react: ^18.2.0
-  checksum: 10c0/53dfada1da1e8dd0498a5601e9eea3dc6ca23c6c2694d1cab9712faea869c11e4ce1c9a618d674cb668a668b41fb6bcf9a7b0a078cd853b1922f002fa22f42c8
+    react: ^18.3.1
+  checksum: 10c0/c633558ef9af33bc68f0c4dbb5163a004c4fb9eade7bd0a7cfc0355fb367f36bd9d96533c90b7e85a146be6c525113a15f58683d269e0177ad77e2b04d4fe51c
   languageName: node
   linkType: hard
 
@@ -15314,12 +15314,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"scheduler@npm:^0.23.0":
-  version: 0.23.0
-  resolution: "scheduler@npm:0.23.0"
+"scheduler@npm:^0.23.0, scheduler@npm:^0.23.2":
+  version: 0.23.2
+  resolution: "scheduler@npm:0.23.2"
   dependencies:
     loose-envify: "npm:^1.1.0"
-  checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd
+  checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78
   languageName: node
   linkType: hard
 
@@ -16408,18 +16408,18 @@ __metadata:
   linkType: hard
 
 "stylelint@npm:^16.0.2":
-  version: 16.3.1
-  resolution: "stylelint@npm:16.3.1"
+  version: 16.4.0
+  resolution: "stylelint@npm:16.4.0"
   dependencies:
     "@csstools/css-parser-algorithms": "npm:^2.6.1"
     "@csstools/css-tokenizer": "npm:^2.2.4"
     "@csstools/media-query-list-parser": "npm:^2.1.9"
-    "@csstools/selector-specificity": "npm:^3.0.2"
+    "@csstools/selector-specificity": "npm:^3.0.3"
     "@dual-bundle/import-meta-resolve": "npm:^4.0.0"
     balanced-match: "npm:^2.0.0"
     colord: "npm:^2.9.3"
     cosmiconfig: "npm:^9.0.0"
-    css-functions-list: "npm:^3.2.1"
+    css-functions-list: "npm:^3.2.2"
     css-tree: "npm:^2.3.1"
     debug: "npm:^4.3.4"
     fast-glob: "npm:^3.3.2"
@@ -16448,11 +16448,11 @@ __metadata:
     strip-ansi: "npm:^7.1.0"
     supports-hyperlinks: "npm:^3.0.0"
     svg-tags: "npm:^1.0.0"
-    table: "npm:^6.8.1"
+    table: "npm:^6.8.2"
     write-file-atomic: "npm:^5.0.1"
   bin:
     stylelint: bin/stylelint.mjs
-  checksum: 10c0/1660bb359002ff8e07cea044018b13abc73f48cf02a5062953b086f4d58611cd10677787560774c1acabeb192b6d059ce7fcf4c11defa7f64e50dca908fc664f
+  checksum: 10c0/7e603a0d88732180b60528c9f2edfca7fdf8c966f42c260af16131854c3acb5acfa30403b1f4fd72cd1470eb9ba625ca4de84e8cb379942df54127c55afc1288
   languageName: node
   linkType: hard
 
@@ -16584,16 +16584,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"table@npm:^6.8.1":
-  version: 6.8.1
-  resolution: "table@npm:6.8.1"
+"table@npm:^6.8.2":
+  version: 6.8.2
+  resolution: "table@npm:6.8.2"
   dependencies:
     ajv: "npm:^8.0.1"
     lodash.truncate: "npm:^4.4.2"
     slice-ansi: "npm:^4.0.0"
     string-width: "npm:^4.2.3"
     strip-ansi: "npm:^6.0.1"
-  checksum: 10c0/591ed84b2438b01c9bc02248e2238e21e8bfb73654bc5acca0d469053eb39be3db2f57d600dcf08ac983b6f50f80842c44612c03877567c2afee3aec4a033e5f
+  checksum: 10c0/f8b348af38ee34e419d8ce7306ba00671ce6f20e861ccff22555f491ba264e8416086063ce278a8d81abfa8d23b736ec2cca7ac4029b5472f63daa4b4688b803
   languageName: node
   linkType: hard
 

From 23223369e083a38e0234c9c9552ddfebba967ad8 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 10:09:50 +0200
Subject: [PATCH 007/215] Update eslint (non-major) (#30110)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 102 +++++++++++++++++++++++++++---------------------------
 1 file changed, 51 insertions(+), 51 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 0ef97cdd8..e8f4075e2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4049,14 +4049,14 @@ __metadata:
   linkType: hard
 
 "@typescript-eslint/eslint-plugin@npm:^7.0.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/eslint-plugin@npm:7.7.0"
+  version: 7.7.1
+  resolution: "@typescript-eslint/eslint-plugin@npm:7.7.1"
   dependencies:
     "@eslint-community/regexpp": "npm:^4.10.0"
-    "@typescript-eslint/scope-manager": "npm:7.7.0"
-    "@typescript-eslint/type-utils": "npm:7.7.0"
-    "@typescript-eslint/utils": "npm:7.7.0"
-    "@typescript-eslint/visitor-keys": "npm:7.7.0"
+    "@typescript-eslint/scope-manager": "npm:7.7.1"
+    "@typescript-eslint/type-utils": "npm:7.7.1"
+    "@typescript-eslint/utils": "npm:7.7.1"
+    "@typescript-eslint/visitor-keys": "npm:7.7.1"
     debug: "npm:^4.3.4"
     graphemer: "npm:^1.4.0"
     ignore: "npm:^5.3.1"
@@ -4069,25 +4069,25 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/d1f4c40523d284bce4b8272750c68aae5c0289ddb1c9267dd3477e0bfb8c8855bfb0c6e86dfec9911ca8302ef729d5f4e47d686a566f363b0f89bf7dc7670b5c
+  checksum: 10c0/11a085240e7daf4bdeb011aa53ac7cfeea6263c60d53607823f5c314eb5c9d559b28fce0d6686acb9702ee3d0cb0406534fafae61163e5a903eaf818c48194ad
   languageName: node
   linkType: hard
 
 "@typescript-eslint/parser@npm:^7.0.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/parser@npm:7.7.0"
+  version: 7.7.1
+  resolution: "@typescript-eslint/parser@npm:7.7.1"
   dependencies:
-    "@typescript-eslint/scope-manager": "npm:7.7.0"
-    "@typescript-eslint/types": "npm:7.7.0"
-    "@typescript-eslint/typescript-estree": "npm:7.7.0"
-    "@typescript-eslint/visitor-keys": "npm:7.7.0"
+    "@typescript-eslint/scope-manager": "npm:7.7.1"
+    "@typescript-eslint/types": "npm:7.7.1"
+    "@typescript-eslint/typescript-estree": "npm:7.7.1"
+    "@typescript-eslint/visitor-keys": "npm:7.7.1"
     debug: "npm:^4.3.4"
   peerDependencies:
     eslint: ^8.56.0
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/d756c2292737499a93913647af7493aded5dc720a5f4ab6f8e96d6cc81f19cf6a1769a1df0f516f8facd276d34f8464f1711e57b0216082e32eb6b75da81b12e
+  checksum: 10c0/ace43eeb8123bbee61e936650e1d57a2cf70f2030870c6dcad8602fce3f7cdf2cce350121dbbc66cffd60bac36652f426a1c5293c45ed28998b90cd95673b5c9
   languageName: node
   linkType: hard
 
@@ -4101,22 +4101,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/scope-manager@npm:7.7.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/scope-manager@npm:7.7.0"
+"@typescript-eslint/scope-manager@npm:7.7.1":
+  version: 7.7.1
+  resolution: "@typescript-eslint/scope-manager@npm:7.7.1"
   dependencies:
-    "@typescript-eslint/types": "npm:7.7.0"
-    "@typescript-eslint/visitor-keys": "npm:7.7.0"
-  checksum: 10c0/014a3631c12bfbd5e33146a48e4b9eb5cc1c5c95bb458de33f8847eed33c04d7b9e66283971e48297673c4b92c3239d67e6dc3717efbe5836e0269a538c13d2e
+    "@typescript-eslint/types": "npm:7.7.1"
+    "@typescript-eslint/visitor-keys": "npm:7.7.1"
+  checksum: 10c0/4032da8fce8922044a6b659c8435ba203377778d5b7de6a5572c1172f2e3cf8ddd890a0f9e083c5d5315a9c2dba323707528ee4ad3cc1be2bd334de2527ef5cb
   languageName: node
   linkType: hard
 
-"@typescript-eslint/type-utils@npm:7.7.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/type-utils@npm:7.7.0"
+"@typescript-eslint/type-utils@npm:7.7.1":
+  version: 7.7.1
+  resolution: "@typescript-eslint/type-utils@npm:7.7.1"
   dependencies:
-    "@typescript-eslint/typescript-estree": "npm:7.7.0"
-    "@typescript-eslint/utils": "npm:7.7.0"
+    "@typescript-eslint/typescript-estree": "npm:7.7.1"
+    "@typescript-eslint/utils": "npm:7.7.1"
     debug: "npm:^4.3.4"
     ts-api-utils: "npm:^1.3.0"
   peerDependencies:
@@ -4124,7 +4124,7 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/064c28d4087a97fd175e07e02c0a9cf4526f61cc6a17b4199fba626932979210037643a30f868bda8174fad567a8ac6aed34120631d1ecfd502e0ea1e830f9e9
+  checksum: 10c0/bd083c4106e207aa8c2a71251eca52d23c7ea905399b8c62004f3bb1e85b9c88d601db9dcecae88beef0f8362d53450bb2721aab353ee731c1665496fea3fbda
   languageName: node
   linkType: hard
 
@@ -4135,10 +4135,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/types@npm:7.7.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/types@npm:7.7.0"
-  checksum: 10c0/eb50793650c9a911c73586150807912e7b7a0ae12eeb26c7a322ac8ebb8edef15960cc9a4b7049dbb89b82500079963145f67d15583f5de270fe8290974db533
+"@typescript-eslint/types@npm:7.7.1":
+  version: 7.7.1
+  resolution: "@typescript-eslint/types@npm:7.7.1"
+  checksum: 10c0/7d240503d9d0b12d68c8204167690609f02ededb77dcb035c1c8b932da08cf43553829c29a5f7889824a7337463c300343bc5abe532479726d4c83443a7e2704
   languageName: node
   linkType: hard
 
@@ -4161,12 +4161,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/typescript-estree@npm:7.7.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/typescript-estree@npm:7.7.0"
+"@typescript-eslint/typescript-estree@npm:7.7.1":
+  version: 7.7.1
+  resolution: "@typescript-eslint/typescript-estree@npm:7.7.1"
   dependencies:
-    "@typescript-eslint/types": "npm:7.7.0"
-    "@typescript-eslint/visitor-keys": "npm:7.7.0"
+    "@typescript-eslint/types": "npm:7.7.1"
+    "@typescript-eslint/visitor-keys": "npm:7.7.1"
     debug: "npm:^4.3.4"
     globby: "npm:^11.1.0"
     is-glob: "npm:^4.0.3"
@@ -4176,24 +4176,24 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/19da9bf0948c9800fde19c5a408a80a3a4cf357ff67d47b516df5d2a05701a4fdd2b9ab5b692866bd84bfc17cea9132d1575a1423e01763a4c2918b5d77d0b34
+  checksum: 10c0/c6b32bd96fd13b9da0a30de01935066f7505f6214f5759e3cd019f7d1852f7bf19358765f62e51de72be47647656aa0e8f07ac0ab316c4149a4e6bd1dd12cbb6
   languageName: node
   linkType: hard
 
-"@typescript-eslint/utils@npm:7.7.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/utils@npm:7.7.0"
+"@typescript-eslint/utils@npm:7.7.1":
+  version: 7.7.1
+  resolution: "@typescript-eslint/utils@npm:7.7.1"
   dependencies:
     "@eslint-community/eslint-utils": "npm:^4.4.0"
     "@types/json-schema": "npm:^7.0.15"
     "@types/semver": "npm:^7.5.8"
-    "@typescript-eslint/scope-manager": "npm:7.7.0"
-    "@typescript-eslint/types": "npm:7.7.0"
-    "@typescript-eslint/typescript-estree": "npm:7.7.0"
+    "@typescript-eslint/scope-manager": "npm:7.7.1"
+    "@typescript-eslint/types": "npm:7.7.1"
+    "@typescript-eslint/typescript-estree": "npm:7.7.1"
     semver: "npm:^7.6.0"
   peerDependencies:
     eslint: ^8.56.0
-  checksum: 10c0/c5f18ce198b420bdc201fd4278b4fa97bfe86178db565f3c4e1991bb452c9ea0b657e7980572555e2ec2fe218d07c42c794d217b9369903019cf784eea7e2164
+  checksum: 10c0/0986b8c297d6bfdbd2ac8cd3bcf447ef9b934e2dae536771d3368a5c284a0b16c0ea041f82aa100c48d05acc33198e1a3d9d721d3319ae80abba0f5e69c21633
   languageName: node
   linkType: hard
 
@@ -4224,13 +4224,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/visitor-keys@npm:7.7.0":
-  version: 7.7.0
-  resolution: "@typescript-eslint/visitor-keys@npm:7.7.0"
+"@typescript-eslint/visitor-keys@npm:7.7.1":
+  version: 7.7.1
+  resolution: "@typescript-eslint/visitor-keys@npm:7.7.1"
   dependencies:
-    "@typescript-eslint/types": "npm:7.7.0"
+    "@typescript-eslint/types": "npm:7.7.1"
     eslint-visitor-keys: "npm:^3.4.3"
-  checksum: 10c0/0f3b9720a962c04462a75d4872714c07320c8f672841881ada797ae960f9f6bd0e5f7494178917034f42635ef76f0f09fa3c8d4bd84f31ec58ee968fe75bada7
+  checksum: 10c0/19cbd14ac9a234d847f457cbd880cbd98b83c331a46d2dc2d8c0e6cb54ce6159552f6dd2f7236035be1a71f13f48df4a2aa09e70ad1f1e2ff3da7c3622927bd3
   languageName: node
   linkType: hard
 
@@ -7816,11 +7816,11 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-react-hooks@npm:^4.6.0":
-  version: 4.6.0
-  resolution: "eslint-plugin-react-hooks@npm:4.6.0"
+  version: 4.6.2
+  resolution: "eslint-plugin-react-hooks@npm:4.6.2"
   peerDependencies:
     eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
-  checksum: 10c0/58c7e10ea5792c33346fcf5cb4024e14837035ce412ff99c2dcb7c4f903dc9b17939078f80bfef826301ce326582c396c00e8e0ac9d10ac2cde2b42d33763c65
+  checksum: 10c0/4844e58c929bc05157fb70ba1e462e34f1f4abcbc8dd5bbe5b04513d33e2699effb8bca668297976ceea8e7ebee4e8fc29b9af9d131bcef52886feaa2308b2cc
   languageName: node
   linkType: hard
 

From 0efa9854a1ff8123782ebc6a420d430da4a3c7a1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 10:10:04 +0200
Subject: [PATCH 008/215] Update libretranslate/libretranslate Docker tag to
 v1.5.7 (#30111)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .devcontainer/docker-compose.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index d14af5d7d..97331f74e 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -70,7 +70,7 @@ services:
         hard: -1
 
   libretranslate:
-    image: libretranslate/libretranslate:v1.5.6
+    image: libretranslate/libretranslate:v1.5.7
     restart: unless-stopped
     volumes:
       - lt-data:/home/libretranslate/.local

From 00aec2f33a03e173e8e4a2de346846e8388686ae Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 08:10:20 +0000
Subject: [PATCH 009/215] Update peter-evans/create-pull-request action to
 v6.0.5 (#30112)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .github/workflows/crowdin-download.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml
index 256dcffc7..1df7672d6 100644
--- a/.github/workflows/crowdin-download.yml
+++ b/.github/workflows/crowdin-download.yml
@@ -52,7 +52,7 @@ jobs:
 
       # Create or update the pull request
       - name: Create Pull Request
-        uses: peter-evans/create-pull-request@v6.0.4
+        uses: peter-evans/create-pull-request@v6.0.5
         with:
           commit-message: 'New Crowdin translations'
           title: 'New Crowdin Translations (automated)'

From 9be7efedf09491fefc5c287a1c67660eb7a6b633 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 08:15:43 +0000
Subject: [PATCH 010/215] New Crowdin Translations (automated) (#30092)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/bg.json    | 13 +++++++++++++
 app/javascript/mastodon/locales/br.json    |  3 +++
 app/javascript/mastodon/locales/ca.json    | 10 +++++++++-
 app/javascript/mastodon/locales/cs.json    | 13 +++++++++++++
 app/javascript/mastodon/locales/es-AR.json | 15 ++++++++++++++-
 app/javascript/mastodon/locales/es-MX.json | 13 +++++++++++++
 app/javascript/mastodon/locales/es.json    | 13 +++++++++++++
 app/javascript/mastodon/locales/he.json    |  9 +++++++++
 app/javascript/mastodon/locales/hu.json    |  6 +++---
 app/javascript/mastodon/locales/ja.json    |  4 ++++
 app/javascript/mastodon/locales/ko.json    | 13 +++++++++++++
 app/javascript/mastodon/locales/lad.json   |  4 ++++
 app/javascript/mastodon/locales/sk.json    |  2 ++
 app/javascript/mastodon/locales/sv.json    |  9 +++++++++
 app/javascript/mastodon/locales/th.json    | 15 ++++++++++++++-
 app/javascript/mastodon/locales/tr.json    | 13 +++++++++++++
 app/javascript/mastodon/locales/vi.json    | 13 +++++++++++++
 app/javascript/mastodon/locales/zh-HK.json | 13 +++++++++++++
 config/locales/be.yml                      |  8 ++++++++
 config/locales/bg.yml                      |  1 +
 config/locales/br.yml                      |  2 ++
 config/locales/ca.yml                      |  1 +
 config/locales/cs.yml                      |  1 +
 config/locales/da.yml                      |  1 +
 config/locales/de.yml                      |  1 +
 config/locales/doorkeeper.be.yml           |  1 +
 config/locales/doorkeeper.cs.yml           |  1 +
 config/locales/doorkeeper.ja.yml           |  1 +
 config/locales/doorkeeper.th.yml           |  1 +
 config/locales/es-AR.yml                   |  1 +
 config/locales/es-MX.yml                   |  1 +
 config/locales/es.yml                      |  5 +++--
 config/locales/eu.yml                      |  1 +
 config/locales/fi.yml                      |  1 +
 config/locales/fo.yml                      |  1 +
 config/locales/he.yml                      |  1 +
 config/locales/hu.yml                      |  1 +
 config/locales/is.yml                      |  1 +
 config/locales/it.yml                      |  1 +
 config/locales/nl.yml                      |  3 ++-
 config/locales/nn.yml                      |  1 +
 config/locales/pl.yml                      |  1 +
 config/locales/simple_form.an.yml          |  4 ----
 config/locales/simple_form.ar.yml          |  4 ----
 config/locales/simple_form.ast.yml         |  3 ---
 config/locales/simple_form.be.yml          |  4 ----
 config/locales/simple_form.bg.yml          |  8 ++++----
 config/locales/simple_form.ca.yml          |  8 ++++----
 config/locales/simple_form.cs.yml          |  8 ++++----
 config/locales/simple_form.cy.yml          |  4 ----
 config/locales/simple_form.da.yml          |  8 ++++----
 config/locales/simple_form.de.yml          |  8 ++++----
 config/locales/simple_form.el.yml          |  4 ----
 config/locales/simple_form.en-GB.yml       |  4 ----
 config/locales/simple_form.eo.yml          |  4 ----
 config/locales/simple_form.es-AR.yml       |  8 ++++----
 config/locales/simple_form.es-MX.yml       |  8 ++++----
 config/locales/simple_form.es.yml          |  8 ++++----
 config/locales/simple_form.et.yml          |  4 ----
 config/locales/simple_form.eu.yml          |  8 ++++----
 config/locales/simple_form.fa.yml          |  4 ----
 config/locales/simple_form.fi.yml          |  5 +----
 config/locales/simple_form.fo.yml          |  8 ++++----
 config/locales/simple_form.fr-CA.yml       |  4 ----
 config/locales/simple_form.fr.yml          |  4 ----
 config/locales/simple_form.fy.yml          |  4 ----
 config/locales/simple_form.gd.yml          |  4 ----
 config/locales/simple_form.gl.yml          |  4 ----
 config/locales/simple_form.he.yml          |  5 +----
 config/locales/simple_form.hu.yml          |  8 ++++----
 config/locales/simple_form.id.yml          |  4 ----
 config/locales/simple_form.ie.yml          |  4 ----
 config/locales/simple_form.io.yml          |  4 ----
 config/locales/simple_form.is.yml          |  6 ++----
 config/locales/simple_form.it.yml          |  8 ++++----
 config/locales/simple_form.ja.yml          |  4 ----
 config/locales/simple_form.ko.yml          |  4 ----
 config/locales/simple_form.ku.yml          |  4 ----
 config/locales/simple_form.lad.yml         |  4 ----
 config/locales/simple_form.lt.yml          |  2 --
 config/locales/simple_form.lv.yml          |  4 ----
 config/locales/simple_form.ms.yml          |  4 ----
 config/locales/simple_form.my.yml          |  4 ----
 config/locales/simple_form.nl.yml          |  8 ++++----
 config/locales/simple_form.nn.yml          |  8 ++++----
 config/locales/simple_form.no.yml          |  4 ----
 config/locales/simple_form.pl.yml          |  8 ++++----
 config/locales/simple_form.pt-BR.yml       |  4 ----
 config/locales/simple_form.pt-PT.yml       |  4 ----
 config/locales/simple_form.ru.yml          |  4 ----
 config/locales/simple_form.sco.yml         |  4 ----
 config/locales/simple_form.sl.yml          |  4 ----
 config/locales/simple_form.sq.yml          |  4 ----
 config/locales/simple_form.sr-Latn.yml     |  4 ----
 config/locales/simple_form.sr.yml          |  4 ----
 config/locales/simple_form.sv.yml          |  4 ----
 config/locales/simple_form.th.yml          |  5 +----
 config/locales/simple_form.tr.yml          |  8 ++++----
 config/locales/simple_form.uk.yml          |  8 +-------
 config/locales/simple_form.vi.yml          |  8 ++++----
 config/locales/simple_form.zh-CN.yml       |  8 ++++----
 config/locales/simple_form.zh-HK.yml       |  8 ++++----
 config/locales/simple_form.zh-TW.yml       |  8 ++++----
 config/locales/th.yml                      |  1 +
 config/locales/tr.yml                      |  1 +
 config/locales/uk.yml                      |  1 +
 config/locales/vi.yml                      |  1 +
 config/locales/zh-CN.yml                   |  1 +
 config/locales/zh-HK.yml                   |  1 +
 config/locales/zh-TW.yml                   |  1 +
 110 files changed, 303 insertions(+), 253 deletions(-)

diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index dabefd1f4..95d60b71e 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.",
   "follow_suggestions.curated_suggestion": "Избор на персонал",
   "follow_suggestions.dismiss": "Без ново показване",
+  "follow_suggestions.featured_longer": "Ръчно избрано от отбора на {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Популярно измежду хората, които следвате",
   "follow_suggestions.hints.featured": "Този профил е ръчно подбран от отбора на {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Този профил е популярен измежду хората, които следвате.",
   "follow_suggestions.hints.most_followed": "Този профил е един от най-следваните при {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Този профил е подобен на профилите, които сте последвали наскоро.",
   "follow_suggestions.personalized_suggestion": "Персонализирано предложение",
   "follow_suggestions.popular_suggestion": "Популярно предложение",
+  "follow_suggestions.popular_suggestion_longer": "Популярно из {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Подобни на профилите, които наскоро сте последвали",
   "follow_suggestions.view_all": "Преглед на всички",
   "follow_suggestions.who_to_follow": "Кого да се следва",
   "followed_tags": "Последвани хаштагове",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} ви последва",
   "notification.follow_request": "{name} поиска да ви последва",
   "notification.mention": "{name} ви спомена",
+  "notification.moderation-warning.learn_more": "Научете повече",
+  "notification.moderation_warning": "Получихте предупреждение за модериране",
+  "notification.moderation_warning.action_delete_statuses": "Някои от публикациите ви са премахнати.",
+  "notification.moderation_warning.action_disable": "Вашият акаунт е изключен.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Някои от публикациите ви са означени като деликатни.",
+  "notification.moderation_warning.action_none": "Акаунтът ви получи предупреждение за модериране.",
+  "notification.moderation_warning.action_sensitive": "Публикациите ви ще се означават като деликатни от сега нататък.",
+  "notification.moderation_warning.action_silence": "Вашият акаунт е ограничен.",
+  "notification.moderation_warning.action_suspend": "Вашият акаунт е спрян.",
   "notification.own_poll": "Анкетата ви приключи",
   "notification.poll": "Анкета, в която гласувахте, приключи",
   "notification.reblog": "{name} подсили ваша публикация",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index f51121bcd..9ec26c8c1 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -263,6 +263,8 @@
   "follow_request.authorize": "Aotren",
   "follow_request.reject": "Nac'hañ",
   "follow_requests.unlocked_explanation": "Daoust ma n'eo ket ho kont prennet, skipailh {domain} a soñj e fellfe deoc'h gwiriekaat pedadennoù heuliañ deus ar c'hontoù-se diwar-zorn.",
+  "follow_suggestions.friends_of_friends_longer": "Diouzh ar c'hiz e-touez an dud heuliet ganeoc'h",
+  "follow_suggestions.popular_suggestion_longer": "Diouzh ar c'hiz war {domain}",
   "follow_suggestions.view_all": "Gwelet pep tra",
   "followed_tags": "Hashtagoù o heuliañ",
   "footer.about": "Diwar-benn",
@@ -395,6 +397,7 @@
   "notification.follow": "heuliañ a ra {name} ac'hanoc'h",
   "notification.follow_request": "Gant {name} eo bet goulennet ho heuliañ",
   "notification.mention": "Gant {name} oc'h bet meneget",
+  "notification.moderation-warning.learn_more": "Gouzout hiroc'h",
   "notification.own_poll": "Echu eo ho sontadeg",
   "notification.poll": "Ur sontadeg ho deus mouezhet warnañ a zo echuet",
   "notification.reblog": "Gant {name} eo bet skignet ho toud",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 6dfe06a92..25aeea9b4 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -318,7 +318,7 @@
   "follow_suggestions.personalized_suggestion": "Suggeriment personalitzat",
   "follow_suggestions.popular_suggestion": "Suggeriment popular",
   "follow_suggestions.popular_suggestion_longer": "Popular a {domain}",
-  "follow_suggestions.similar_to_recently_followed_longer": "Semblant a perfils que has seguit fa poc",
+  "follow_suggestions.similar_to_recently_followed_longer": "Semblant a perfils que seguiu fa poc",
   "follow_suggestions.view_all": "Mostra-ho tot",
   "follow_suggestions.who_to_follow": "A qui seguir",
   "followed_tags": "Etiquetes seguides",
@@ -473,6 +473,14 @@
   "notification.follow": "{name} et segueix",
   "notification.follow_request": "{name} ha sol·licitat de seguir-te",
   "notification.mention": "{name} t'ha esmentat",
+  "notification.moderation_warning": "Heu rebut un avís de moderació",
+  "notification.moderation_warning.action_delete_statuses": "S'han eliminat algunes de les vostres publicacions.",
+  "notification.moderation_warning.action_disable": "S'ha desactivat el vostre compte.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "S'ha marcat com a sensibles algunes de les vostres publicacions.",
+  "notification.moderation_warning.action_none": "El vostre compte ha rebut un avís de moderació.",
+  "notification.moderation_warning.action_sensitive": "A partir d'ara les vostres publicacions es marcaran com sensibles.",
+  "notification.moderation_warning.action_silence": "S'ha limitat el vostre compte.",
+  "notification.moderation_warning.action_suspend": "S'ha suspès el vostre compte.",
   "notification.own_poll": "La teva enquesta ha finalitzat",
   "notification.poll": "Ha finalitzat una enquesta en què has votat",
   "notification.reblog": "{name} t'ha impulsat",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 2fc01f3ac..f2a1f023a 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, personál {domain} usoudil, že byste mohli chtít tyto požadavky na sledování zkontrolovat ručně.",
   "follow_suggestions.curated_suggestion": "Výběr personálů",
   "follow_suggestions.dismiss": "Znovu nezobrazovat",
+  "follow_suggestions.featured_longer": "Ručně vybráno týmem {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Populární mezi lidmi, které sledujete",
   "follow_suggestions.hints.featured": "Tento profil byl ručně vybrán týmem {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Tento profil je populární mezi lidmi, které sledujete.",
   "follow_suggestions.hints.most_followed": "Tento profil je jedním z nejvíce sledovaných na {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilům, které jste nedávno sledovali.",
   "follow_suggestions.personalized_suggestion": "Přizpůsobený návrh",
   "follow_suggestions.popular_suggestion": "Populární návrh",
+  "follow_suggestions.popular_suggestion_longer": "Populární na {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Podobné profilům, které jste nedávno sledovali",
   "follow_suggestions.view_all": "Zobrazit vše",
   "follow_suggestions.who_to_follow": "Koho sledovat",
   "followed_tags": "Sledované hashtagy",
@@ -469,6 +473,15 @@
   "notification.follow": "Uživatel {name} vás začal sledovat",
   "notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat",
   "notification.mention": "Uživatel {name} vás zmínil",
+  "notification.moderation-warning.learn_more": "Zjistit více",
+  "notification.moderation_warning": "Obdrželi jste moderační varování",
+  "notification.moderation_warning.action_delete_statuses": "Některé z vašich příspěvků byly odstraněny.",
+  "notification.moderation_warning.action_disable": "Váš účet je zablokován.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Některé z vašich příspěvků byly označeny jako citlivé.",
+  "notification.moderation_warning.action_none": "Váš účet obdržel moderační varování.",
+  "notification.moderation_warning.action_sensitive": "Vaše příspěvky budou od nynějška označeny jako citlivé.",
+  "notification.moderation_warning.action_silence": "Váš účet byl omezen.",
+  "notification.moderation_warning.action_suspend": "Váš účet byl pozastaven.",
   "notification.own_poll": "Vaše anketa skončila",
   "notification.poll": "Anketa, ve které jste hlasovali, skončila",
   "notification.reblog": "Uživatel {name} boostnul váš příspěvek",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 2cf419862..2d42b3e94 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -241,7 +241,7 @@
   "emoji_button.nature": "Naturaleza",
   "emoji_button.not_found": "No se encontraron emojis coincidentes",
   "emoji_button.objects": "Objetos",
-  "emoji_button.people": "Gente",
+  "emoji_button.people": "Cuentas",
   "emoji_button.recent": "Usados frecuentemente",
   "emoji_button.search": "Buscar...",
   "emoji_button.search_results": "Resultados de búsqueda",
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el equipo de {domain} pensó que podrías querer revisar manualmente las solicitudes de seguimiento de estas cuentas.",
   "follow_suggestions.curated_suggestion": "Selección del equipo",
   "follow_suggestions.dismiss": "No mostrar de nuevo",
+  "follow_suggestions.featured_longer": "Seleccionada a mano por el equipo de {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Populares entre las cuentas que seguís",
   "follow_suggestions.hints.featured": "Este perfil fue seleccionado a mano por el equipo de {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las cuentas que seguís.",
   "follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los que comenzaste a seguir.",
   "follow_suggestions.personalized_suggestion": "Sugerencia personalizada",
   "follow_suggestions.popular_suggestion": "Sugerencia popular",
+  "follow_suggestions.popular_suggestion_longer": "Popular en {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Similares a perfiles que comenzaste a seguir recientemente",
   "follow_suggestions.view_all": "Ver todo",
   "follow_suggestions.who_to_follow": "A quién seguir",
   "followed_tags": "Etiquetas seguidas",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} te empezó a seguir",
   "notification.follow_request": "{name} solicitó seguirte",
   "notification.mention": "{name} te mencionó",
+  "notification.moderation-warning.learn_more": "Aprendé más",
+  "notification.moderation_warning": "Recibiste una advertencia de moderación",
+  "notification.moderation_warning.action_delete_statuses": "Se eliminaron algunos de tus mensajes.",
+  "notification.moderation_warning.action_disable": "Se deshabilitó tu cuenta.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se marcaron como sensibles a algunos de tus mensajes.",
+  "notification.moderation_warning.action_none": "Tu cuenta recibió una advertencia de moderación.",
+  "notification.moderation_warning.action_sensitive": "A partir de ahora, tus mensajes serán marcados como sensibles.",
+  "notification.moderation_warning.action_silence": "Tu cuenta fue limitada.",
+  "notification.moderation_warning.action_suspend": "Tu cuenta fue suspendida.",
   "notification.own_poll": "Tu encuesta finalizó",
   "notification.poll": "Finalizó una encuesta en la que votaste",
   "notification.reblog": "{name} adhirió a tu mensaje",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index 1d8d4cedf..b529f48eb 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.",
   "follow_suggestions.curated_suggestion": "Recomendaciones del equipo",
   "follow_suggestions.dismiss": "No mostrar de nuevo",
+  "follow_suggestions.featured_longer": "Escogidos por el equipo de {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Populares entre las personas a las que sigues",
   "follow_suggestions.hints.featured": "Este perfil ha sido seleccionado a mano por el equipo de {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las personas que sigues.",
   "follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los perfiles que has seguido recientemente.",
   "follow_suggestions.personalized_suggestion": "Sugerencia personalizada",
   "follow_suggestions.popular_suggestion": "Sugerencia popular",
+  "follow_suggestions.popular_suggestion_longer": "Populares en {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Similares a los perfiles que has seguido recientemente",
   "follow_suggestions.view_all": "Ver todo",
   "follow_suggestions.who_to_follow": "Recomendamos seguir",
   "followed_tags": "Hashtags seguidos",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} te empezó a seguir",
   "notification.follow_request": "{name} ha solicitado seguirte",
   "notification.mention": "{name} te ha mencionado",
+  "notification.moderation-warning.learn_more": "Saber más",
+  "notification.moderation_warning": "Has recibido una advertencia de moderación",
+  "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",
+  "notification.moderation_warning.action_disable": "Se ha desactivado su cuenta.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.",
+  "notification.moderation_warning.action_none": "Tu cuenta ha recibido un aviso de moderación.",
+  "notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.",
+  "notification.moderation_warning.action_silence": "Se ha limitado tu cuenta.",
+  "notification.moderation_warning.action_suspend": "Se ha suspendido tu cuenta.",
   "notification.own_poll": "Tu encuesta ha terminado",
   "notification.poll": "Una encuesta en la que has votado ha terminado",
   "notification.reblog": "{name} ha retooteado tu estado",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 149a37d74..ed01a3337 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.",
   "follow_suggestions.curated_suggestion": "Recomendaciones del equipo",
   "follow_suggestions.dismiss": "No mostrar de nuevo",
+  "follow_suggestions.featured_longer": "Escogidos por el equipo de {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Populares entre las personas a las que sigues",
   "follow_suggestions.hints.featured": "Este perfil ha sido elegido a mano por el equipo de {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Este perfil es popular entre las personas que sigues.",
   "follow_suggestions.hints.most_followed": "Este perfil es uno de los más seguidos en {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Este perfil es similar a los perfiles que has seguido recientemente.",
   "follow_suggestions.personalized_suggestion": "Sugerencia personalizada",
   "follow_suggestions.popular_suggestion": "Sugerencia popular",
+  "follow_suggestions.popular_suggestion_longer": "Populares en {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Similares a los perfiles que has seguido recientemente",
   "follow_suggestions.view_all": "Ver todo",
   "follow_suggestions.who_to_follow": "A quién seguir",
   "followed_tags": "Etiquetas seguidas",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} te empezó a seguir",
   "notification.follow_request": "{name} ha solicitado seguirte",
   "notification.mention": "{name} te ha mencionado",
+  "notification.moderation-warning.learn_more": "Saber más",
+  "notification.moderation_warning": "Has recibido una advertencia de moderación",
+  "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",
+  "notification.moderation_warning.action_disable": "Se ha desactivado su cuenta.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.",
+  "notification.moderation_warning.action_none": "Tu cuenta ha recibido un aviso de moderación.",
+  "notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.",
+  "notification.moderation_warning.action_silence": "Se ha limitado tu cuenta.",
+  "notification.moderation_warning.action_suspend": "Se ha suspendido tu cuenta.",
   "notification.own_poll": "Tu encuesta ha terminado",
   "notification.poll": "Una encuesta en la que has votado ha terminado",
   "notification.reblog": "{name} ha impulsado tu publicación",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 0b66a27fa..600de3959 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -473,6 +473,15 @@
   "notification.follow": "{name} במעקב אחרייך",
   "notification.follow_request": "{name} ביקשו לעקוב אחריך",
   "notification.mention": "אוזכרת על ידי {name}",
+  "notification.moderation-warning.learn_more": "למידע נוסף",
+  "notification.moderation_warning": "קיבלת אזהרה מצוות ניהול התוכן",
+  "notification.moderation_warning.action_delete_statuses": "חלק מהודעותיך הוסרו.",
+  "notification.moderation_warning.action_disable": "חשבונך הושבת.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "חלק מהודעותיך סומנו כרגישות.",
+  "notification.moderation_warning.action_none": "חשבונך קיבל אזהרה מצוות ניהול התוכן.",
+  "notification.moderation_warning.action_sensitive": "הודעותיך יסומנו כרגישות מעתה ואילך.",
+  "notification.moderation_warning.action_silence": "חשבונך הוגבל.",
+  "notification.moderation_warning.action_suspend": "חשבונך הושעה.",
   "notification.own_poll": "הסקר שלך הסתיים",
   "notification.poll": "סקר שהצבעת בו הסתיים",
   "notification.reblog": "הודעתך הודהדה על ידי {name}",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 42ce84258..ba7fd6ddc 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -309,7 +309,7 @@
   "follow_suggestions.curated_suggestion": "A stáb választása",
   "follow_suggestions.dismiss": "Ne jelenjen meg újra",
   "follow_suggestions.featured_longer": "A {domain} csapata által kézzel kiválasztott",
-  "follow_suggestions.friends_of_friends_longer": "Népszerű az Ön által követett emberek körében",
+  "follow_suggestions.friends_of_friends_longer": "Népszerű az általad követett emberek körében",
   "follow_suggestions.hints.featured": "Ezt a profilt a(z) {domain} csapata választotta ki.",
   "follow_suggestions.hints.friends_of_friends": "Ez a profil népszerű az általad követett emberek körében.",
   "follow_suggestions.hints.most_followed": "Ez a profil a leginkább követett a(z) {domain} oldalon.",
@@ -318,7 +318,7 @@
   "follow_suggestions.personalized_suggestion": "Személyre szabott javaslat",
   "follow_suggestions.popular_suggestion": "Népszerű javaslat",
   "follow_suggestions.popular_suggestion_longer": "Népszerű itt: {domain}",
-  "follow_suggestions.similar_to_recently_followed_longer": "Hasonló profilok, melyeket nemrég követett",
+  "follow_suggestions.similar_to_recently_followed_longer": "Hasonló azokhoz a profilokhoz, melyeket nemrég követtél be",
   "follow_suggestions.view_all": "Összes megtekintése",
   "follow_suggestions.who_to_follow": "Kit érdemes követni",
   "followed_tags": "Követett hashtagek",
@@ -473,7 +473,7 @@
   "notification.follow": "{name} követ téged",
   "notification.follow_request": "{name} követni szeretne téged",
   "notification.mention": "{name} megemlített",
-  "notification.moderation-warning.learn_more": "További információk",
+  "notification.moderation-warning.learn_more": "További információ",
   "notification.moderation_warning": "Moderációs figyelmeztetést kaptál",
   "notification.moderation_warning.action_delete_statuses": "Néhány bejegyzésedet eltávolították.",
   "notification.moderation_warning.action_disable": "A fiókod le van tiltva.",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index f20d93753..6824a76a3 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "あなたのアカウントは承認制ではありませんが、{domain}のスタッフはこれらのアカウントからのフォローリクエストの確認が必要であると判断しました。",
   "follow_suggestions.curated_suggestion": "サーバースタッフ公認",
   "follow_suggestions.dismiss": "今後表示しない",
+  "follow_suggestions.featured_longer": "{domain} スタッフ公認",
+  "follow_suggestions.friends_of_friends_longer": "フォロー中のユーザーに人気",
   "follow_suggestions.hints.featured": "{domain} の運営スタッフが選んだアカウントです。",
   "follow_suggestions.hints.friends_of_friends": "フォロー中のユーザーのあいだで人気のアカウントです。",
   "follow_suggestions.hints.most_followed": "{domain} でもっともフォローされているアカウントのひとつです。",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "最近フォローしたユーザーに似ているアカウントです。",
   "follow_suggestions.personalized_suggestion": "フォローに基づく提案",
   "follow_suggestions.popular_suggestion": "人気のアカウント",
+  "follow_suggestions.popular_suggestion_longer": "{domain} で人気",
+  "follow_suggestions.similar_to_recently_followed_longer": "最近フォローしたユーザーと似ているアカウント",
   "follow_suggestions.view_all": "すべて表示",
   "follow_suggestions.who_to_follow": "フォローを増やしてみませんか?",
   "followed_tags": "フォロー中のハッシュタグ",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 8628dbb33..52ce9455a 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "귀하의 계정이 잠긴 계정이 아닐지라도, {domain} 스태프는 이 계정들의 팔로우 요청을 수동으로 처리해 주시면 좋겠다고 생각했습니다.",
   "follow_suggestions.curated_suggestion": "스태프의 추천",
   "follow_suggestions.dismiss": "다시 보지 않기",
+  "follow_suggestions.featured_longer": "{domain} 팀이 손수 고름",
+  "follow_suggestions.friends_of_friends_longer": "내가 팔로우 하는 사람들 사이에서 인기",
   "follow_suggestions.hints.featured": "이 프로필은 {domain} 팀이 손수 선택했습니다.",
   "follow_suggestions.hints.friends_of_friends": "이 프로필은 내가 팔로우 하는 사람들에게서 유명합니다.",
   "follow_suggestions.hints.most_followed": "이 프로필은 {domain}에서 가장 많이 팔로우 된 사람들 중 하나입니다.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "이 프로필은 내가 최근에 팔로우 한 프로필들과 유사합니다.",
   "follow_suggestions.personalized_suggestion": "개인화된 추천",
   "follow_suggestions.popular_suggestion": "인기있는 추천",
+  "follow_suggestions.popular_suggestion_longer": "{domain}에서 인기",
+  "follow_suggestions.similar_to_recently_followed_longer": "내가 최근에 팔로우 한 프로필들과 유사",
   "follow_suggestions.view_all": "모두 보기",
   "follow_suggestions.who_to_follow": "팔로우할 만한 사람",
   "followed_tags": "팔로우 중인 해시태그",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} 님이 나를 팔로우했습니다",
   "notification.follow_request": "{name} 님이 팔로우 요청을 보냈습니다",
   "notification.mention": "{name} 님의 멘션",
+  "notification.moderation-warning.learn_more": "더 알아보기",
+  "notification.moderation_warning": "중재 경고를 받았습니다",
+  "notification.moderation_warning.action_delete_statuses": "게시물 몇 개가 삭제되었습니다.",
+  "notification.moderation_warning.action_disable": "계정이 비활성화되었습니다.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "게시물 몇 개가 민감함 처리되었습니다.",
+  "notification.moderation_warning.action_none": "계정에 중재 경고를 받았습니다.",
+  "notification.moderation_warning.action_sensitive": "앞으로의 게시물을 민감한 것으로 표시됩니다.",
+  "notification.moderation_warning.action_silence": "계정이 제한되었습니다.",
+  "notification.moderation_warning.action_suspend": "계정이 정지되었습니다.",
   "notification.own_poll": "설문을 마침",
   "notification.poll": "참여한 설문이 종료됨",
   "notification.reblog": "{name} 님이 부스트했습니다",
diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json
index cf6c3f772..533f07400 100644
--- a/app/javascript/mastodon/locales/lad.json
+++ b/app/javascript/mastodon/locales/lad.json
@@ -295,6 +295,7 @@
   "follow_requests.unlocked_explanation": "Aunke tu kuento no esta serrado, la taifa de {domain} kreye ke talvez keres revizar manualmente las solisitudes de segimento de estos kuentos.",
   "follow_suggestions.curated_suggestion": "Seleksyon de la taifa",
   "follow_suggestions.dismiss": "No amostra mas",
+  "follow_suggestions.friends_of_friends_longer": "Popular entre personas a las kualas siges",
   "follow_suggestions.hints.featured": "Este profil tiene sido eskojido por la taifa de {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Este profil es popular entre las personas ke siges.",
   "follow_suggestions.hints.most_followed": "Este profil es uno de los mas segidos en {domain}.",
@@ -454,6 +455,9 @@
   "notification.follow": "{name} te ampeso a segir",
   "notification.follow_request": "{name} tiene solisitado segirte",
   "notification.mention": "{name} te enmento",
+  "notification.moderation-warning.learn_more": "Ambezate mas",
+  "notification.moderation_warning.action_silence": "Tu kuento tiene sido limitado.",
+  "notification.moderation_warning.action_suspend": "Tu kuento tiene sido suspendido.",
   "notification.own_poll": "Tu anketa eskapo",
   "notification.poll": "Anketa en ke votates eskapo",
   "notification.reblog": "{name} repartajo tu publikasyon",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index d143fda52..ea46b8223 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -293,6 +293,7 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Tento profil je podobný profilom, ktoré ste nedávno začali sledovať.",
   "follow_suggestions.personalized_suggestion": "Prispôsobený návrh",
   "follow_suggestions.popular_suggestion": "Obľúbený návrh",
+  "follow_suggestions.popular_suggestion_longer": "Populárne na {domain}",
   "follow_suggestions.view_all": "Zobraziť všetky",
   "follow_suggestions.who_to_follow": "Koho sledovať",
   "followed_tags": "Sledované hashtagy",
@@ -442,6 +443,7 @@
   "notification.follow": "{name} vás sleduje",
   "notification.follow_request": "{name} vás žiada sledovať",
   "notification.mention": "{name} vás spomína",
+  "notification.moderation-warning.learn_more": "Zisti viac",
   "notification.own_poll": "Vaša anketa sa skončila",
   "notification.poll": "Anketa, v ktorej ste hlasovali, sa skončila",
   "notification.reblog": "{name} zdieľa váš príspevok",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index c2dd5297d..5ac4b4648 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -297,6 +297,7 @@
   "filter_modal.select_filter.subtitle": "Använd en befintlig kategori eller skapa en ny",
   "filter_modal.select_filter.title": "Filtrera detta inlägg",
   "filter_modal.title.status": "Filtrera ett inlägg",
+  "filtered_notifications_banner.mentions": "{count, plural, one {omnämning} other {omnämnanden}}",
   "filtered_notifications_banner.pending_requests": "Aviseringar från {count, plural, =0 {ingen} one {en person} other {# personer}} du kanske känner",
   "filtered_notifications_banner.title": "Filtrerade aviseringar",
   "firehose.all": "Allt",
@@ -307,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Även om ditt konto inte är låst tror {domain}-personalen att du kanske vill granska dessa följares förfrågningar manuellt.",
   "follow_suggestions.curated_suggestion": "Utvald av personalen",
   "follow_suggestions.dismiss": "Visa inte igen",
+  "follow_suggestions.featured_longer": "Handplockad av {domain}-teamet",
+  "follow_suggestions.friends_of_friends_longer": "Populärt bland personer du följer",
   "follow_suggestions.hints.featured": "Denna profil är handplockad av {domain}-teamet.",
   "follow_suggestions.hints.friends_of_friends": "Denna profil är populär bland de personer du följer.",
   "follow_suggestions.hints.most_followed": "Denna profil är en av de mest följda på {domain}.",
@@ -314,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Denna profil liknar de profiler som du nyligen har följt.",
   "follow_suggestions.personalized_suggestion": "Personligt förslag",
   "follow_suggestions.popular_suggestion": "Populärt förslag",
+  "follow_suggestions.popular_suggestion_longer": "Populärt på {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Liknar profiler du nyligen följde",
   "follow_suggestions.view_all": "Visa alla",
   "follow_suggestions.who_to_follow": "Rekommenderade profiler",
   "followed_tags": "Följda hashtags",
@@ -469,10 +474,14 @@
   "notification.follow_request": "{name} har begärt att följa dig",
   "notification.mention": "{name} nämnde dig",
   "notification.moderation-warning.learn_more": "Läs mer",
+  "notification.moderation_warning": "Du har mottagit en modereringsvarning",
   "notification.moderation_warning.action_delete_statuses": "Några av dina inlägg har tagits bort.",
   "notification.moderation_warning.action_disable": "Ditt konto har inaktiverats.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Några av dina inlägg har markerats som känsliga.",
+  "notification.moderation_warning.action_none": "Ditt konto har mottagit en modereringsvarning.",
+  "notification.moderation_warning.action_sensitive": "Dina inlägg kommer markeras som känsliga från och med nu.",
   "notification.moderation_warning.action_silence": "Ditt konto har begränsats.",
+  "notification.moderation_warning.action_suspend": "Ditt konto har stängts av.",
   "notification.own_poll": "Din röstning har avslutats",
   "notification.poll": "En omröstning du röstat i har avslutats",
   "notification.reblog": "{name} boostade ditt inlägg",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 379aebbb1..7c6b2ade4 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -308,13 +308,17 @@
   "follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง",
   "follow_suggestions.curated_suggestion": "คัดสรรโดยพนักงาน",
   "follow_suggestions.dismiss": "ไม่ต้องแสดงอีก",
+  "follow_suggestions.featured_longer": "คัดสรรโดยทีม {domain}",
+  "follow_suggestions.friends_of_friends_longer": "เป็นที่นิยมในหมู่ผู้คนที่คุณติดตาม",
   "follow_suggestions.hints.featured": "โปรไฟล์นี้ได้รับการคัดสรรโดยทีม {domain}",
-  "follow_suggestions.hints.friends_of_friends": "โปรไฟล์นี้ได้รับความนิยมในหมู่ผู้คนที่คุณติดตาม",
+  "follow_suggestions.hints.friends_of_friends": "โปรไฟล์นี้เป็นที่นิยมในหมู่ผู้คนที่คุณติดตาม",
   "follow_suggestions.hints.most_followed": "โปรไฟล์นี้เป็นหนึ่งในโปรไฟล์ที่ได้รับการติดตามมากที่สุดใน {domain}",
   "follow_suggestions.hints.most_interactions": "โปรไฟล์นี้เพิ่งได้รับความสนใจอย่างมากใน {domain}",
   "follow_suggestions.hints.similar_to_recently_followed": "โปรไฟล์นี้คล้ายกับโปรไฟล์ที่คุณได้ติดตามล่าสุด",
   "follow_suggestions.personalized_suggestion": "ข้อเสนอแนะเฉพาะบุคคล",
   "follow_suggestions.popular_suggestion": "ข้อเสนอแนะยอดนิยม",
+  "follow_suggestions.popular_suggestion_longer": "เป็นที่นิยมใน {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "คล้ายกับโปรไฟล์ที่คุณได้ติดตามล่าสุด",
   "follow_suggestions.view_all": "ดูทั้งหมด",
   "follow_suggestions.who_to_follow": "ติดตามใครดี",
   "followed_tags": "แฮชแท็กที่ติดตาม",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} ได้ติดตามคุณ",
   "notification.follow_request": "{name} ได้ขอติดตามคุณ",
   "notification.mention": "{name} ได้กล่าวถึงคุณ",
+  "notification.moderation-warning.learn_more": "เรียนรู้เพิ่มเติม",
+  "notification.moderation_warning": "คุณได้รับคำเตือนการกลั่นกรอง",
+  "notification.moderation_warning.action_delete_statuses": "เอาโพสต์บางส่วนของคุณออกแล้ว",
+  "notification.moderation_warning.action_disable": "ปิดใช้งานบัญชีของคุณแล้ว",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "ทำเครื่องหมายโพสต์บางส่วนของคุณว่าละเอียดอ่อนแล้ว",
+  "notification.moderation_warning.action_none": "บัญชีของคุณได้รับคำเตือนการกลั่นกรอง",
+  "notification.moderation_warning.action_sensitive": "จะทำเครื่องหมายโพสต์ของคุณว่าละเอียดอ่อนนับจากนี้ไป",
+  "notification.moderation_warning.action_silence": "จำกัดบัญชีของคุณแล้ว",
+  "notification.moderation_warning.action_suspend": "ระงับบัญชีของคุณแล้ว",
   "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว",
   "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว",
   "notification.reblog": "{name} ได้ดันโพสต์ของคุณ",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index dc07480ef..c46080cfb 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Hesabınız kilitli olmasa da, {domain} personeli bu hesaplardan gelen takip isteklerini gözden geçirmek isteyebileceğinizi düşündü.",
   "follow_suggestions.curated_suggestion": "Çalışanların seçtikleri",
   "follow_suggestions.dismiss": "Tekrar gösterme",
+  "follow_suggestions.featured_longer": "{domain} takımı tarafından elle seçildi",
+  "follow_suggestions.friends_of_friends_longer": "Takip ettiğiniz kişiler arasında popüler",
   "follow_suggestions.hints.featured": "Bu profil {domain} ekibi tarafından elle seçilmiştir.",
   "follow_suggestions.hints.friends_of_friends": "Bu profil takip ettiğiniz insanlar arasında popülerdir.",
   "follow_suggestions.hints.most_followed": "Bu, {domain} sunucusunda en fazla izlenen profildir.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Bu profil, son zamanlarda takip ettiğiniz profillere benziyor.",
   "follow_suggestions.personalized_suggestion": "Kişiselleşmiş öneriler",
   "follow_suggestions.popular_suggestion": "Popüler öneriler",
+  "follow_suggestions.popular_suggestion_longer": "{domain} üzerinde popüler",
+  "follow_suggestions.similar_to_recently_followed_longer": "Yakın zamanda takip ettiğiniz hesaplara benziyor",
   "follow_suggestions.view_all": "Tümünü gör",
   "follow_suggestions.who_to_follow": "Takip edebileceklerin",
   "followed_tags": "Takip edilen etiketler",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} seni takip etti",
   "notification.follow_request": "{name} size takip isteği gönderdi",
   "notification.mention": "{name} senden bahsetti",
+  "notification.moderation-warning.learn_more": "Daha fazlası",
+  "notification.moderation_warning": "Bir denetim uyarısı aldınız",
+  "notification.moderation_warning.action_delete_statuses": "Bazı gönderileriniz kaldırıldı.",
+  "notification.moderation_warning.action_disable": "Hesabınız devre dışı bırakıldı.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Bazı gönderileriniz hassas olarak işaretlendi.",
+  "notification.moderation_warning.action_none": "Hesabınız bir denetim uyarısı aldı.",
+  "notification.moderation_warning.action_sensitive": "Gönderileriniz artık hassas olarak işaretlenecek.",
+  "notification.moderation_warning.action_silence": "Hesabınız sınırlandırıldı.",
+  "notification.moderation_warning.action_suspend": "Hesabınız askıya alındı.",
   "notification.own_poll": "Anketiniz sona erdi",
   "notification.poll": "Oy verdiğiniz bir anket sona erdi",
   "notification.reblog": "{name} gönderini yeniden paylaştı",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index e1f886b1f..b188488f0 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Mặc dù tài khoản của bạn đang ở chế độ công khai, quản trị viên của {domain} vẫn tin rằng bạn sẽ muốn xem lại yêu cầu theo dõi từ những người khác.",
   "follow_suggestions.curated_suggestion": "Gợi ý từ máy chủ",
   "follow_suggestions.dismiss": "Không hiện lại",
+  "follow_suggestions.featured_longer": "Tuyển chọn bởi {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Nổi tiếng với những người mà bạn theo dõi",
   "follow_suggestions.hints.featured": "Người này được đội ngũ {domain} đề xuất.",
   "follow_suggestions.hints.friends_of_friends": "Người này nổi tiếng với những người bạn theo dõi.",
   "follow_suggestions.hints.most_followed": "Người này được theo dõi nhiều nhất trên {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Người này có nét giống những người mà bạn theo dõi gần đây.",
   "follow_suggestions.personalized_suggestion": "Gợi ý cá nhân hóa",
   "follow_suggestions.popular_suggestion": "Những người nổi tiếng",
+  "follow_suggestions.popular_suggestion_longer": "Nổi tiếng trên {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Tương tự những người mà bạn theo dõi gần đây",
   "follow_suggestions.view_all": "Xem tất cả",
   "follow_suggestions.who_to_follow": "Gợi ý theo dõi",
   "followed_tags": "Hashtag theo dõi",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} theo dõi bạn",
   "notification.follow_request": "{name} yêu cầu theo dõi bạn",
   "notification.mention": "{name} nhắc đến bạn",
+  "notification.moderation-warning.learn_more": "Tìm hiểu",
+  "notification.moderation_warning": "Bạn đã nhận một cảnh báo kiểm duyệt",
+  "notification.moderation_warning.action_delete_statuses": "Một vài tút của bạn bị gỡ.",
+  "notification.moderation_warning.action_disable": "Tài khoản của bạn đã bị vô hiệu hóa.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Vài tút bạn bị đánh dấu nhạy cảm.",
+  "notification.moderation_warning.action_none": "Bạn đã nhận một cảnh báo kiểm duyệt.",
+  "notification.moderation_warning.action_sensitive": "Tút của bạn sẽ bị đánh dấu nhạy cảm kể từ bây giờ.",
+  "notification.moderation_warning.action_silence": "Tài khoản của bạn đã bị hạn chế.",
+  "notification.moderation_warning.action_suspend": "Tài khoản của bạn đã bị vô hiệu hóa.",
   "notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc",
   "notification.poll": "Cuộc bình chọn đã kết thúc",
   "notification.reblog": "{name} đăng lại tút của bạn",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 3ca9a8d11..6b08e4028 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "即使您的帳號未上鎖,{domain} 的工作人員認為您可能會想手動審核來自這些帳號的追蹤請求。",
   "follow_suggestions.curated_suggestion": "編輯精選",
   "follow_suggestions.dismiss": "不再顯示",
+  "follow_suggestions.featured_longer": "{domain} 團隊精選",
+  "follow_suggestions.friends_of_friends_longer": "受你的追蹤對象歡迎",
   "follow_suggestions.hints.featured": "這個人檔案是由 {domain} 團隊精挑細選。",
   "follow_suggestions.hints.friends_of_friends": "這個人檔案在你追蹤的人當中很受歡迎。",
   "follow_suggestions.hints.most_followed": "這個人檔案是在 {domain} 上最多追蹤之一。",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "這個人檔案與你最近追蹤的類似。",
   "follow_suggestions.personalized_suggestion": "個人化推薦",
   "follow_suggestions.popular_suggestion": "熱門推薦",
+  "follow_suggestions.popular_suggestion_longer": "{domain} 熱門",
+  "follow_suggestions.similar_to_recently_followed_longer": "與你最近追蹤的帳號相似",
   "follow_suggestions.view_all": "查看所有",
   "follow_suggestions.who_to_follow": "追蹤對象",
   "followed_tags": "已追蹤標籤",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} 開始追蹤你",
   "notification.follow_request": "{name} 要求追蹤你",
   "notification.mention": "{name} 提及你",
+  "notification.moderation-warning.learn_more": "了解更多",
+  "notification.moderation_warning": "你收到一則審核警告",
+  "notification.moderation_warning.action_delete_statuses": "你的部份帖文已被刪除。",
+  "notification.moderation_warning.action_disable": "你的帳號已被停用。",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "你某些帖文已被標記為敏感內容。",
+  "notification.moderation_warning.action_none": "你的帳號收到一則審核警告。",
+  "notification.moderation_warning.action_sensitive": "從現在起,你的帖文將被標記為敏感內容。",
+  "notification.moderation_warning.action_silence": "你的帳號已受到限制。",
+  "notification.moderation_warning.action_suspend": "你的帳號已被停權。",
   "notification.own_poll": "你的投票已結束",
   "notification.poll": "你參與過的一個投票已經結束",
   "notification.reblog": "{name} 轉推你的文章",
diff --git a/config/locales/be.yml b/config/locales/be.yml
index cdfc9cb39..13daa9897 100644
--- a/config/locales/be.yml
+++ b/config/locales/be.yml
@@ -621,6 +621,9 @@ be:
       actions_description_html: Вырашыце, якія дзеянні распачаць, каб вырашыць гэтую скаргу. Калі вы прымеце меры пакарання ў дачыненні да ўліковага запісу, пра які паведамляецца, ім будзе адпраўлена апавяшчэнне па электроннай пошце, за выключэннем выпадкаў, калі выбрана катэгорыя <strong>Спам</strong>.
       actions_description_remote_html: Вырашыце як паступіць з гэтай скаргай. Гэта паўплывае толькі на тое як <strong>ваш</strong> сервер звязваецца з аддалёным уліковым запісам і апрацоўвае яго кантэнт.
       add_to_report: Дадаць яшчэ дэталяў да скаргі
+      already_suspended_badges:
+        local: Ужо прыпынена на гэтым сэрвэры
+        remote: Ужо прыпынена на іх сэрвэры
       are_you_sure: Вы ўпэўнены?
       assign_to_self: Прызначыць мне
       assigned: Прызначаны мадэратар
@@ -1708,6 +1711,7 @@ be:
     preferences: Налады
     profile: Профіль
     relationships: Падпіскі і падпісчыкі
+    severed_relationships: Разрыў сувязяў
     statuses_cleanup: Аўтавыдаленне допісаў
     strikes: Папярэджанні мадэратараў
     two_factor_authentication: Двухфактарная аўтэнтыфікацыя
@@ -1715,10 +1719,13 @@ be:
   severed_relationships:
     download: Спампаваць (%{count})
     event_type:
+      account_suspension: Прыпыненне ўліковага запісу (%{target_name})
+      domain_block: Прыпыненне сервера (%{target_name})
       user_domain_block: Вы заблакіравалі %{target_name}
     lost_followers: Страчаныя падпісчыкі
     lost_follows: Страчаныя падпіскі
     preamble: Вы можаце страціць падпіскі і падпісчыкаў, калі заблакіруеце дамен або калі вашы мадэратары вырашаць прыпыніць зносіны з серверам. Калі гэта адбудзецца, вы зможаце загрузіць спіс страчаных зносін, каб праверыць іх і, магчыма, імпартаваць на іншы сервер.
+    purged: Інфармацыя аб гэтым серверы была выдалена адміністратарамі вашага сервера.
     type: Падзея
   statuses:
     attached:
@@ -1825,6 +1832,7 @@ be:
     contrast: Mastodon (высокі кантраст)
     default: Mastodon (цёмная)
     mastodon-light: Mastodon (светлая)
+    system: Аўтаматычна (выкарыстоўваць сістэмную тэму)
   time:
     formats:
       default: "%d.%m.%Y %H:%M"
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 0c4ce3be4..f242039ed 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -751,6 +751,7 @@ bg:
         desc_html: Това разчита на външни скриптове от hCaptcha, което може да е проблем за сигурността и поверителността. В допълнение <strong>това може да направи процеса на регистриране значимо по-малко достъпно за някои хора (особено с увреждания).</strong>. Заради тези причини, то обмислете алтернативни мерки такива като регистрация на базата на одобрение или на покана.
         title: Изисква се новите потребители да разгадават капчата, за да потвърдят акаунтите си
       content_retention:
+        danger_zone: Опасна зона
         preamble: Управление на това как съдържание, породено от потребители, се съхранява в Mastodon.
         title: Задържане на съдържание
       default_noindex:
diff --git a/config/locales/br.yml b/config/locales/br.yml
index fa6d266f6..03537a5b8 100644
--- a/config/locales/br.yml
+++ b/config/locales/br.yml
@@ -245,6 +245,8 @@ br:
         title: Diwar-benn
       appearance:
         title: Neuz
+      content_retention:
+        danger_zone: Takad dañjer
       discovery:
         title: Dizoloadur
         trends: Luskadoù
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 032dc1e35..08fef7364 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -751,6 +751,7 @@ ca:
         desc_html: Això es basa en scripts externs de hCaptcha, que poden ser un problema de privacitat i seguretat. A més, <strong>això pot fer que el procés de registre sigui significativament menys accesible per algunes (especialment discapacitades) persones</strong>. Per aquestes raons, si us plau considera alternatives com ara registre amb aprovació necessària o basada en invitacions.
         title: Demana als nous usuaris que resolguin un CAPTCHA per a confirmar el seu compte
       content_retention:
+        danger_zone: Zona de perill
         preamble: Controla com es desa a Mastodon el contingut generat per l'usuari.
         title: Retenció de contingut
       default_noindex:
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index bccbb75c4..569307731 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -779,6 +779,7 @@ cs:
         desc_html: Toto spoléhá na externí skripty z hCaptcha, což může být budit obavy o bezpečnost a soukromí. Navíc <strong>to může způsobit, že proces registrace bude pro některé osoby (zejména se zdravotním postižením) hůře přístupný</strong>. Z těchto důvodů zvažte alternativní přístup, jako je schvalování registrace nebo pozvánky.
         title: Vyžadovat po nových uživatelích, aby vyřešili CAPTCHU pro potvrzení jejich účtu
       content_retention:
+        danger_zone: Nebezpečná zóna
         preamble: Určuje, jak je obsah generovaný uživatelem uložen v Mastodonu.
         title: Uchovávání obsahu
       default_noindex:
diff --git a/config/locales/da.yml b/config/locales/da.yml
index acab53d15..252d0e2b5 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -751,6 +751,7 @@ da:
         desc_html: Dette er afhængig af eksterne scripts fra hCaptcha, som kan være en sikkerhed og privatlivets fred. Derudover kan <strong>dette gøre registreringsprocessen betydeligt mindre tilgængelig for nogle (især deaktiveret) personer</strong>. Af disse grunde bedes De overveje alternative foranstaltninger såsom godkendelsesbaseret eller inviteret til at blive registreret.
         title: Kræv nye brugere for at løse en CAPTCHA for at bekræfte deres konto
       content_retention:
+        danger_zone: Farezone
         preamble: Styr, hvordan Mastodon gemmer brugergenereret indhold.
         title: Indholdsopbevaring
       default_noindex:
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 923682ea1..b19315e39 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -751,6 +751,7 @@ de:
         desc_html: Dies beruht auf externen Skripten von hCaptcha, die ein Sicherheits- und Datenschutzproblem darstellen könnten. Darüber hinaus <strong>kann das den Registrierungsprozess für manche Menschen (insbesondere für Menschen mit Behinderung) erheblich erschweren</strong>. Aus diesen Gründen solltest du alternative Maßnahmen in Betracht ziehen, z. B. eine Registrierung basierend auf einer Einladung oder auf Genehmigungen.
         title: Neue Nutzer*innen müssen ein CAPTCHA lösen, um das Konto zu bestätigen
       content_retention:
+        danger_zone: Gefahrenzone
         preamble: Lege fest, wie lange Inhalte von Nutzer*innen auf deinem Mastodon-Server gespeichert bleiben.
         title: Cache & Archive
       default_noindex:
diff --git a/config/locales/doorkeeper.be.yml b/config/locales/doorkeeper.be.yml
index 748cbeafa..5f0536c8d 100644
--- a/config/locales/doorkeeper.be.yml
+++ b/config/locales/doorkeeper.be.yml
@@ -174,6 +174,7 @@ be:
       read:filters: бачыць свае фільтры
       read:follows: бачыць свае падпіскі
       read:lists: бачыць свае спісы
+      read:me: чытайце толькі базавую інфармацыю аб сваім уліковым запісе
       read:mutes: бачыць свае ігнараванні
       read:notifications: бачыць свае абвесткі
       read:reports: бачыць свае скаргі
diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml
index be2a4d971..9719a9a24 100644
--- a/config/locales/doorkeeper.cs.yml
+++ b/config/locales/doorkeeper.cs.yml
@@ -174,6 +174,7 @@ cs:
       read:filters: vidět vaše filtry
       read:follows: vidět vaše sledování
       read:lists: vidět vaše seznamy
+      read:me: číst pouze základní informace vašeho účtu
       read:mutes: vidět vaše skrytí
       read:notifications: vidět vaše oznámení
       read:reports: vidět vaše hlášení
diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml
index 62f2a3eb0..af61dbdcb 100644
--- a/config/locales/doorkeeper.ja.yml
+++ b/config/locales/doorkeeper.ja.yml
@@ -174,6 +174,7 @@ ja:
       read:filters: フィルターの読み取り
       read:follows: フォローの読み取り
       read:lists: リストの読み取り
+      read:me: 自分のアカウントの基本的な情報の読み取りのみ
       read:mutes: ミュートの読み取り
       read:notifications: 通知の読み取り
       read:reports: 通報の読み取り
diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml
index 067e06558..8a28566a0 100644
--- a/config/locales/doorkeeper.th.yml
+++ b/config/locales/doorkeeper.th.yml
@@ -174,6 +174,7 @@ th:
       read:filters: ดูตัวกรองของคุณ
       read:follows: ดูการติดตามของคุณ
       read:lists: ดูรายการของคุณ
+      read:me: อ่านเฉพาะข้อมูลพื้นฐานของบัญชีของคุณเท่านั้น
       read:mutes: ดูการซ่อนของคุณ
       read:notifications: ดูการแจ้งเตือนของคุณ
       read:reports: ดูรายงานของคุณ
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 7bfe3b90b..aa3668d92 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -751,6 +751,7 @@ es-AR:
         desc_html: Esto depende de scripts externos de hCaptcha, que pueden ser una preocupación de seguridad y privacidad. Además, <strong>esto puede hacer el proceso de registro significativamente menos accesible para algunas personas (especialmente para gente con discapacidades)</strong>. Por estas razones, por favor, considerá medidas alternativas, como el registro basado en la aprobación o la invitación.
         title: Solicitar a los nuevos usuarios que resuelvan una CAPTCHA para confirmar su cuenta
       content_retention:
+        danger_zone: Zona de peligro
         preamble: Controlá cómo el contenido generado por el usuario se almacena en Mastodon.
         title: Retención de contenido
       default_noindex:
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 4d17de4d0..6a306b07b 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -751,6 +751,7 @@ es-MX:
         desc_html: Esto se basa en scripts externos de hCaptcha, que pueden suponer una preocupación de seguridad y privacidad. Además, <strong>esto puede volver el proceso de registro significativamente menos accesible para algunas personas (especialmente con discapacidades)</strong>. Por estas razones, por favor, considera medidas alternativas como el registro por aprobación manual o con invitación.
         title: Solicita a los nuevos usuarios que resuelvan un CAPTCHA para confirmar su cuenta
       content_retention:
+        danger_zone: Zona peligrosa
         preamble: Controlar cómo el contenido generado por el usuario se almacena en Mastodon.
         title: Retención de contenido
       default_noindex:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 086e8e2ef..e7db7c8b0 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -214,12 +214,12 @@ es:
         resend_user: Reenviar Correo de Confirmación
         reset_password_user: Restablecer Contraseña
         resolve_report: Resolver Reporte
-        sensitive_account: Marcar multimedia en tu cuenta como sensible
+        sensitive_account: Marcar cuenta como sensible
         silence_account: Silenciar Cuenta
         suspend_account: Suspender Cuenta
         unassigned_report: Desasignar Reporte
         unblock_email_account: Desbloquear dirección de correo
-        unsensitive_account: Desmarcar multimedia en tu cuenta como sensible
+        unsensitive_account: Desmarcar cuenta como sensible
         unsilence_account: Dejar de Silenciar Cuenta
         unsuspend_account: Dejar de Suspender Cuenta
         update_announcement: Actualizar Anuncio
@@ -751,6 +751,7 @@ es:
         desc_html: Esto se basa en scripts externos de hCaptcha, que pueden suponer una preocupación de seguridad y privacidad. Además, <strong>esto puede volver el proceso de registro significativamente menos accesible para algunas personas (especialmente con discapacidades)</strong>. Por estas razones, por favor, considera medidas alternativas como el registro por aprobación manual o con invitación.
         title: Solicita a los nuevos usuarios que resuelvan un CAPTCHA para confirmar su cuenta
       content_retention:
+        danger_zone: Zona peligrosa
         preamble: Controlar cómo el contenido generado por el usuario se almacena en Mastodon.
         title: Retención de contenido
       default_noindex:
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index a05aa3c92..22ca8135d 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -753,6 +753,7 @@ eu:
         desc_html: Hori egiteko hCaptcha-ko scriptak behar dira, hirugarrenenak izanik, segurtasun eta pribatutasun arazoak ekarri ditzaketeenak. Horrez gain, <strong>script horiengatik nabarmen zailagoa egiten zaie pertsona batzuei izena ematea (batez ere desgaitasunen bat duenei)</strong>. Hori dela eta, hausnartu beste neurri batzuk hartu ditzakezun, esaterako onarpenean oinarritutako izen ematea, edo gonbidapenen bidezkoa.
         title: Eskatu erabiltzaile berriei CAPTCHA bat ebazteko beren kontua berresteko
       content_retention:
+        danger_zone: Eremu arriskutsua
         preamble: Kontrolatu erabiltzaileek sortutako edukia nola biltegiratzen den Mastodonen.
         title: Edukia atxikitzea
       default_noindex:
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index f82a592ec..5f96f611b 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -751,6 +751,7 @@ fi:
         desc_html: Tämä perustuu ulkoisiin skripteihin hCaptchasta, mikä voi olla turvallisuus- ja yksityisyysongelma. Lisäksi <strong>tämä voi tehdä rekisteröinnin ihmisille huomattavasti (erityisesti vammaisten) helpommaksi</strong>. Harkitse vaihtoehtoisia toimenpiteitä, kuten hyväksymisperusteista tai kutsupohjaista rekisteröintiä.
         title: Vaadi uusia käyttäjiä vahvistaamaan tilinsä ratkaisemalla CAPTCHA-vahvistus
       content_retention:
+        danger_zone: Vaaravyöhyke
         preamble: Määritä, miten käyttäjän luoma sisältö tallennetaan Mastodoniin.
         title: Sisällön säilyttäminen
       default_noindex:
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index b6c8b306f..15c9c7dc0 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -751,6 +751,7 @@ fo:
         desc_html: Hetta er bundið at uttanhýsis skriptum frá hCaptcha, sum kann vera ein trygdar- og privatlívsváði. Harafturat, so <strong>kann hetta gera skrásetingartilgongdina munandi minni atkomuliga til summi (brekaði) fólk</strong>. Tískil eigur tú at umhugsa aðrar hættir sosum góðkenningar-grundaða ella innbjóðingar-grundaða skráseting.
         title: Set krav til nýggjar brúkarar at loysa eina CAPTHA fyri at vátta teirra kontu
       content_retention:
+        danger_zone: Vandaøki
         preamble: Stýr hvussu brúkara-skapt tilfar er goymt í Mastodon.
         title: Varðveitsla av tilfari
       default_noindex:
diff --git a/config/locales/he.yml b/config/locales/he.yml
index ddb3417ff..14da27ec7 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -779,6 +779,7 @@ he:
         desc_html: אפשרות זו ניסמכת על קטעי קוד חיצוניים של hCaptcha שעלולים להיות סיכון אבטחה ופרטיות. בנוסף, <strong>זה עשוי להפוך את תהליך ההרשמה לבלתי נגיש לא.נשים, במיוחד בעלות ובעלי מוגבלויות</strong>. מסיבות אלו, כדאי לשקול חלופות כמו אשרור מנהלים ידני או הרשמה רק על בסיס הזמנה.
         title: לדרוש פתרון CAPTCHA כדי לאשרר למשתמשים את חשבונם
       content_retention:
+        danger_zone: אזור מסוכן
         preamble: שליטה על דרך אחסון תוכן המשתמשים במסטודון.
         title: תקופת השמירה של תכנים
       default_noindex:
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 43f769253..c48d527ca 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -751,6 +751,7 @@ hu:
         desc_html: Ez hCaptcha-ból származó külső scripteket használ, mely biztonsági vagy adatvédelmi résnek bizonyulhat. Ezen kívül ez <strong>a regisztrációs folyamatot jelentősen megnehezítheti bizonyos (kifejezetten különleges szükségletű) emberek számára</strong>. Emiatt fontold meg más módszerek, mint pl. jóváhagyás-alapú vagy meghívásalapú regisztráció használatát.
         title: Az új felhasználóknak egy CAPTCHA-t kell megoldaniuk, hogy megerősítsék a fiókjuk regisztrációját
       content_retention:
+        danger_zone: Veszélyzóna
         preamble: A felhasználók által előállított tartalom Mastodonon való tárolásának szabályozása.
         title: Tartalom megtartása
       default_noindex:
diff --git a/config/locales/is.yml b/config/locales/is.yml
index ba1785d9e..2eeba976b 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -753,6 +753,7 @@ is:
           Aukinheldur <strong> gæti þetta gert nýskráningarferlið óaðgengilegra sumum (sérstaklega fyrir fatlaða)</strong>. Þess vegna er rétt að skoða aðra valmöguleika svo sem nýskráningar háðar samþykki eða boði.
         title: Nýir notendur munu þurfa að standast Turing skynpróf til að staðfesta notendaaðganginn
       content_retention:
+        danger_zone: Hættusvæði
         preamble: Stýrðu hvernig efni frá notendum sé geymt í Mastodon.
         title: Geymsla efnis
       default_noindex:
diff --git a/config/locales/it.yml b/config/locales/it.yml
index f12735cfb..bda681ac0 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -751,6 +751,7 @@ it:
         desc_html: Questo si basa su script esterni da hCaptcha, che possono rappresentare un problema di sicurezza e privacy. Inoltre, <strong>questo può rendere il processo di registrazione significativamente meno accessibile ad alcune persone (soprattutto disabili)</strong>. Per questi motivi, prendi in considerazione misure alternative come la registrazione basata su approvazione o su invito.
         title: Richiedi ai nuovi utenti di risolvere un CAPTCHA per confermare il loro account
       content_retention:
+        danger_zone: Zona pericolosa
         preamble: Controlla come vengono memorizzati i contenuti generati dall'utente in Mastodon.
         title: Conservazione dei contenuti
       default_noindex:
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 553c780be..74dea29b0 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -745,12 +745,13 @@ nl:
         preamble: Mastodons webomgeving aanpassen.
         title: Weergave
       branding:
-        preamble: De branding van jouw server laat zien hoe het met andere servers in het netwerk verschilt. Deze informatie wordt op verschillende plekken getoond, zoals in de webomgeving van Mastodon, in mobiele apps, in voorvertoningen op andere websites en berichten-apps, enz. Daarom is het belangrijk om de informatie helder, kort en beknopt te houden.
+        preamble: De branding van jouw server laat zien hoe het met andere servers in het netwerk verschilt. Deze informatie wordt op verschillende plekken getoond, zoals in de webomgeving van Mastodon, in mobiele apps, in linkvoorbeelden op andere websites en berichten-apps, enz. Daarom is het belangrijk om de informatie helder, kort en beknopt te houden.
         title: Branding
       captcha_enabled:
         desc_html: Dit is afhankelijk van externe scripts van hCaptcha, wat veiligheids- en privacyrisico's met zich mee kan brengen. Bovendien kan <strong>dit het registratieproces aanzienlijk minder toegankelijk maken voor sommige (vooral gehandicapte) mensen</strong>. Om deze redenen kun je het beste alternatieve maatregelen overwegen, zoals registratie op basis van goedkeuring of op uitnodiging.
         title: Nieuwe gebruikers dienen een CAPTCHA op te lossen om hun account te bevestigen
       content_retention:
+        danger_zone: Gevarenzone
         preamble: Toezicht houden op hoe berichten en media van gebruikers op Mastodon worden bewaard.
         title: Bewaartermijn berichten
       default_noindex:
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index 8a7cb18a4..013674ca5 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -751,6 +751,7 @@ nn:
         desc_html: Dette baserer seg på eksterne skript frå hCaptcha, noko som kan vera eit tryggleiks- og personvernsproblem. <strong>I tillegg kan dette gjera registreringsprosessen monaleg mindre tilgjengeleg (særleg for folk med nedsett funksjonsevne)</strong>. Dette gjer at du bør du vurdera alternative tiltak, som til dømes godkjennings- eller invitasjonsbasert registrering.
         title: Krev at nye brukarar løyser ein CAPTCHA for å bekrefte kontoen sin
       content_retention:
+        danger_zone: Faresone
         preamble: Styr korleis brukargenerert innhald blir lagra i Mastodon.
         title: Bevaring av innhald
       default_noindex:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index d3d16fe37..7c037d7d0 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -779,6 +779,7 @@ pl:
         desc_html: Wymaga użycia zewnętrznych skryptów hCaptcha, co może negatywnie wpływać na bezpieczeństwo i prywatność. <strong>Może również przyczynić się do znaczącego utrudnienia procesu rejestracji niektórym, np. niepełnosprawnym, osobom.</strong> Dlatego sugeruje się używanie zaproszeń bądź ręcznie potwierdzanie kont.
         title: W celu potwierdzenia ich kont wymagaj rozwiązania zadania CAPTCHA przez nowych użytkowników
       content_retention:
+        danger_zone: Strefa niebezpieczeństwa
         preamble: Kontroluj, jak treści generowane przez użytkownika są przechowywane w Mastodon.
         title: Retencja treści
       default_noindex:
diff --git a/config/locales/simple_form.an.yml b/config/locales/simple_form.an.yml
index 6ec8380f2..e409c39ae 100644
--- a/config/locales/simple_form.an.yml
+++ b/config/locales/simple_form.an.yml
@@ -66,13 +66,10 @@ an:
           warn: Amagar lo conteniu filtrau dezaga d'una alvertencia mencionando lo titol d'o filtro
       form_admin_settings:
         activity_api_enabled: Conteyo de publicacions locals, usuarios activos y nuevos rechistros en periodos semanals
-        backups_retention_period: Mantener los fichers d'usuario cheneraus entre lo numero de días especificau.
         bootstrap_timeline_accounts: Estas cuentas amaneixerán en a parte superior d'as recomendacions d'os nuevos usuarios.
         closed_registrations_message: Amostrau quan los rechistros son zarraus
-        content_cache_retention_period: Las publicacions d'atros servidors s'eliminarán dimpués d'o numero especificau de días quan s'estableixca una valor positiva. Esto puede estar irreversible.
         custom_css: Puetz aplicar estilos personalizaus a la versión web de Mastodon.
         mascot: Reemplaza la ilustración en a interficie web abanzada.
-        media_cache_retention_period: Los fichers multimedia descargaus s'eliminarán dimpués d'o numero especificau de días quan s'estableixca una valor positiva, y se redescargarán baixo demanda.
         peers_api_enabled: Una lista de nombres de dominio que este servidor ha trobau en o Fediverso. Aquí no s'incluye garra dato sobre si federas con un servidor determinau, nomás que lo tuyo servidor lo conoixe. Esto ye emplegau per los servicios que replegan estatisticas sobre la federación en un sentiu cheneral.
         profile_directory: Lo directorio de perfils lista a totz los usuarios que han optado per que la suya cuenta pueda estar descubierta.
         require_invite_text: Quan los rechistros requieren aprebación manual, fa obligatoria la dentrada de texto "Per qué quiers unir-te?" en cuenta d'opcional
@@ -221,7 +218,6 @@ an:
         backups_retention_period: Periodo de retención d'o fichero d'usuario
         bootstrap_timeline_accounts: Recomendar siempre estas cuentas a nuevos usuarios
         closed_registrations_message: Mensache personalizau quan los rechistros no son disponibles
-        content_cache_retention_period: Periodo de retención de caché de conteniu
         custom_css: CSS personalizau
         mascot: Mascota personalizada (legado)
         media_cache_retention_period: Periodo de retención de caché multimedia
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index da27fd8dc..29e525b2c 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -77,13 +77,10 @@ ar:
           warn: إخفاء المحتوى الذي تم تصفيته خلف تحذير يذكر عنوان الفلتر
       form_admin_settings:
         activity_api_enabled: عدد المنشورات المحلية و المستخدمين الناشطين و التسجيلات الأسبوعية الجديدة
-        backups_retention_period: الاحتفاظ بأرشيف المستخدم الذي تم إنشاؤه لعدد محدد من الأيام.
         bootstrap_timeline_accounts: سيتم تثبيت هذه الحسابات على قمة التوصيات للمستخدمين الجدد.
         closed_registrations_message: ما سيعرض عند إغلاق التسجيلات
-        content_cache_retention_period: سيتم حذف كافة المنشورات والمعاد نشرها من الخوادم الأخرى بعد عدد الأيام المحدد. قد لا تكون بعض المنشورات قابلة للاسترداد. كافة الفواصل المرجعية والمفضلات والمعاد نشرها ذات الصلة سوف تضيع ويستحيل التراجع عن هذا الإجراء.
         custom_css: يمكنك تطبيق أساليب مخصصة على نسخة الويب من ماستدون.
         mascot: تجاوز الرسوم التوضيحية في واجهة الويب المتقدمة.
-        media_cache_retention_period: سيتم حذف ملفات الوسائط التي تم تنزيلها بعد عدد الأيام المحدد عند تعيينها إلى قيمة موجبة، وإعادة تنزيلها عند الطلب.
         peers_api_enabled: قائمة بأسماء النطاقات التي صادفها هذا الخادم في الفدرالية. لا توجد بيانات هنا حول ما إذا كنت تتحد مع خادم معين، فقط أن خادمك يعرف عنها. ويستخدم هذا الخدمات التي تجمع الإحصاءات المتعلقة بالاتحاد بشكل عام.
         profile_directory: دليل الملف الشخصي يسرد جميع المستخدمين الذين اختاروا الدخول ليكونوا قابلين للاكتشاف.
         require_invite_text: عندما تتطلب التسجيلات الموافقة اليدوية، اجعل إدخال النص "لماذا تريد الانضمام ؟" إلزاميا بدلا من اختياري
@@ -243,7 +240,6 @@ ar:
         backups_retention_period: فترة الاحتفاظ بأرشيف المستخدم
         bootstrap_timeline_accounts: أوصي دائما بهذه الحسابات للمستخدمين الجدد
         closed_registrations_message: رسالة مخصصة عندما يكون التسجيل غير متاح
-        content_cache_retention_period: مدة الاحتفاظ بالتخزين المؤقت للوسائط
         custom_css: سي أس أس CSS مخصص
         mascot: جالب حظ مخصص (قديم)
         media_cache_retention_period: مدة الاحتفاظ بالتخزين المؤقت للوسائط
diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml
index e39696256..d1950ab15 100644
--- a/config/locales/simple_form.ast.yml
+++ b/config/locales/simple_form.ast.yml
@@ -33,11 +33,9 @@ ast:
       featured_tag:
         name: 'Equí tán dalgunes de les etiquetes qu''usesti apocayá:'
       form_admin_settings:
-        backups_retention_period: Caltién los archivos xeneraos polos perfiles demientres el númberu de díes especificáu.
         closed_registrations_message: Apaez cuando'l rexistru ta desactiváu
         custom_css: Pues aplicar estilos personalizaos a la versión web de Mastodon.
         mascot: Anula la ilustración na interfaz web avanzada.
-        media_cache_retention_period: Los ficheros multimedia baxaos desaníciense dempués del númberu de díes especificáu al configurar un valor positivu, ya vuelven baxase baxo demanda.
         require_invite_text: Cuando los rexistros riquen una aprobación manual, el campu «¿Por qué quies xunite?» vuélvese obligatoriu
         site_extended_description: Cualesquier tipu d'información adicional que pueda ser útil pa visitantes ya pa perfiles rexistraos. El testu pue estructurase cola sintaxis de Mastodon.
         site_short_description: Un descripción curtia qu'ayuda a identificar de forma única al sirvidor. ¿Quién lu lleva?, ¿pa quién ye?
@@ -134,7 +132,6 @@ ast:
       form_admin_settings:
         backups_retention_period: Periodu de retención de los archivos de los perfiles
         closed_registrations_message: Mensaxe personalizáu cuando'l rexistru nun ta disponible
-        content_cache_retention_period: Periodu de retención de la caché de conteníu
         media_cache_retention_period: Periodu de retención de la caché multimedia
         registrations_mode: Quién pue rexistrase
         require_invite_text: Riquir un motivu pa rexistrase
diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml
index 245c1e852..f8000a1c8 100644
--- a/config/locales/simple_form.be.yml
+++ b/config/locales/simple_form.be.yml
@@ -77,13 +77,10 @@ be:
           warn: Схаваць адфільтраваны кантэнт за папярэджаннем з назвай фільтру
       form_admin_settings:
         activity_api_enabled: Падлік лакальна апублікаваных пастоў, актыўных карыстальнікаў і новых рэгістрацый у тыдзень
-        backups_retention_period: Захоўваць створаныя архівы карыстальніка адзначаную колькасць дзён.
         bootstrap_timeline_accounts: Гэтыя ўліковыя запісы будуць замацаваны ў топе рэкамендацый для новых карыстальнікаў.
         closed_registrations_message: Паказваецца, калі рэгістрацыя закрытая
-        content_cache_retention_period: Допісы з іншых сервераў будуць выдаляцца пасля выстаўленай колькасці дзён, калі выстаўлены станоўчы лік. Гэта можа быць незваротным.
         custom_css: Вы можаце прымяняць карыстальніцкія стылі ў вэб-версіі Mastodon.
         mascot: Замяняе ілюстрацыю ў пашыраным вэб-інтэрфейсе.
-        media_cache_retention_period: Спампаваныя медыя будуць выдаляцца пасля выстаўленай колькасці дзён, калі выстаўлены станоўчы лік, і спампоўвацца нанова па запыце.
         peers_api_enabled: Спіс даменных імён, з якімі сутыкнуўся гэты сервер у федэсвеце. Дадзеныя аб тым, ці знаходзіцеся вы з пэўным серверам у федэрацыі, не ўключаныя, ёсць толькі тое, што ваш сервер ведае пра гэта. Гэта выкарыстоўваецца сэрвісамі, якія збіраюць статыстыку па федэрацыі ў агульным сэнсе.
         profile_directory: Дырэкторыя профіляў змяшчае спіс усіх карыстальнікаў, якія вырашылі быць бачнымі.
         require_invite_text: Калі рэгістрацыя патрабуе ручнога пацвержання, зрабіце поле "Чаму вы хочаце далучыцца?" абавязковым
@@ -243,7 +240,6 @@ be:
         backups_retention_period: Працягласць захавання архіву карыстальніка
         bootstrap_timeline_accounts: Заўсёды раіць гэтыя ўліковыя запісы новым карыстальнікам
         closed_registrations_message: Уласнае паведамленне, калі рэгістрацыя немагчымая
-        content_cache_retention_period: Працягласць захавання кэшу для змесціва
         custom_css: CSS карыстальніка
         mascot: Уласны маскот(спадчына)
         media_cache_retention_period: Працягласць захавання кэшу для медыя
diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml
index e85e753e8..a4a202713 100644
--- a/config/locales/simple_form.bg.yml
+++ b/config/locales/simple_form.bg.yml
@@ -77,13 +77,13 @@ bg:
           warn: Скриване на филтрираното съдържание зад предупреждение, споменавайки заглавието на филтъра
       form_admin_settings:
         activity_api_enabled: Броят на местните публикувани публикации, дейни потребители и нови регистрации в седмични кофи
-        backups_retention_period: Задържане на породените потребителски архиви за определения брой дни.
+        backups_retention_period: Потребителите имат способността да пораждат архиви от публикациите си за по-късно изтегляне. Задавайки положителна стойност, тези архиви самодейно ще се изтрият от хранилището ви след определения брой дни.
         bootstrap_timeline_accounts: Тези акаунти ще се закачат в горния край на препоръките за следване на нови потребители.
         closed_registrations_message: Показва се, когато е затворено за регистрации
-        content_cache_retention_period: Всички публикации и подсилвания от други сървъри ще се изтрият след определен брой дни. Някои публикации може да не се възстановят. Всички сродни отметки, любими и подсилвания също ще се загубят и невъзможно да се отмени.
+        content_cache_retention_period: Всички публикации от други сървъри, включително подсилвания и отговори, ще се изтрият след посочения брой дни, без да се взема предвид каквото и да е взаимодействие на местния потребител с тези публикации. Това включва публикации, които местния потребител е означил като отметки или любими. Личните споменавания между потребители от различни инстанции също ще се загубят и невъзможно да се възстановят. Употребата на тази настройка е предназначена за случаи със специално предназначение и разбива очакванията на много потребители, когато се изпълнява за употреба с общо предназначение.
         custom_css: Може да прилагате собствени стилове в уебверсията на Mastodon.
         mascot: Замества илюстрацията в разширения уеб интерфейс.
-        media_cache_retention_period: Изтеглените мултимедийни файлове ще се изтрият след посочения брой дни, задавайки положително число, и ще се изтеглят пак при поискване.
+        media_cache_retention_period: Мултимедийни файлове от публикации, направени от отдалечени потребители, се сринаха в сървъра ви. Задавайки положителна стойност, мултимедията ще се изтрие след посочения брой дни. Ако се искат мултимедийни данни след изтриването, то ще се изтегли пак, ако още е наличен източникът на съдържание. Поради ограниченията за това колко често картите за предварващ преглед на връзките анкетират сайтове на трети страни, се препоръчва да зададете тази стойност на поне 14 дни или картите за предварващ преглед на връзките няма да се обновяват при поискване преди този момент.
         peers_api_enabled: Списък от имена на домейни, с които сървърът се е свързал във федивселената. Тук не се включват данни за това дали федерирате с даден сървър, а само за това дали сървърът ви знае за него. Това се ползва от услуги, събиращи статистика за федерацията в общия смисъл.
         profile_directory: Указателят на профили вписва всички потребители, избрали да бъдат откриваеми.
         require_invite_text: Когато регистрацията изисква ръчно одобрение, то направете текстовото поле за това "Защо желаете да се присъедините?" по-скоро задължително, отколкото по желание
@@ -243,7 +243,7 @@ bg:
         backups_retention_period: Период за съхранение на потребителския архив
         bootstrap_timeline_accounts: Винаги да се препоръчват следните акаунти на нови потребители
         closed_registrations_message: Съобщение при неналична регистрация
-        content_cache_retention_period: Период на съхранение на кеша за съдържание
+        content_cache_retention_period: Период на запазване на отдалечено съдържание
         custom_css: Персонализиран CSS
         mascot: Плашило талисман по избор (остаряло)
         media_cache_retention_period: Период на запазване на мултимедийния кеш
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index e4bee0214..62c1da55b 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -77,13 +77,13 @@ ca:
           warn: Oculta el contingut filtrat darrere d'un avís mencionant el títol del filtre
       form_admin_settings:
         activity_api_enabled: Contador de tuts publicats localment, usuaris actius i registres nous en períodes setmanals
-        backups_retention_period: Manté els arxius d'usuari generats durant el nombre de dies especificats.
+        backups_retention_period: Els usuaris poden generar arxius de les seves publicacions per a baixar-los més endavant. Quan tingui un valor positiu, els arxius s'esborraran del vostre emmagatzematge després del nombre donat de dies.
         bootstrap_timeline_accounts: Aquests comptes es fixaran en la part superior de les recomanacions de seguiment dels nous usuaris.
         closed_registrations_message: Es mostra quan el registres estan tancats
-        content_cache_retention_period: Els tuts d'altres servidors se suprimiran després del nombre de dies especificat quan s'estableix un valor positiu. Això pot ser irreversible.
+        content_cache_retention_period: S'esborraran totes les publicacions d'altres servidors (impulsos i respostes inclosos) passats els dies indicats, sense tenir en consideració les interaccions d'usuaris locals amb aquestes publicacions. Això inclou les publicacions que un usuari local hagi marcat com a favorites. També es perdran, i no es podran recuperar, les mencions privades entre usuaris d'instàncies diferents. Aquest paràmetre està pensat per a instàncies amb un propòsit especial i trencarà les expectatives dels usuaris si s'utilitza en una instància convencional.
         custom_css: Pots aplicar estils personalitzats en la versió web de Mastodon.
         mascot: Anul·la la il·lustració en la interfície web avançada.
-        media_cache_retention_period: Els fitxers multimèdia descarregats s'esborraran després del nombre de dies especificat quan el valor configurat és positiu, i tornats a descarregats sota demanda.
+        media_cache_retention_period: El vostre servidor conserva una còpia dels fitxers multimèdia de les publicacions dels usuaris remots. Si s'indica un valor positiu, s'esborraran passats els dies indicats. Si el fitxer es torna a demanar un cop esborrat, es tornarà a baixar si el contingut origen segueix disponible. Per causa de les restriccions en la freqüència amb què es poden demanar les targetes de previsualització d'altres servidors, es recomana definir aquest valor com a mínim a 14 dies, o les targetes de previsualització no s'actualizaran a demanda abans d'aquest termini.
         peers_api_enabled: Una llista de noms de domini que aquest servidor ha trobat al fedivers. No inclou cap dada sobre si estàs federat amb un servidor determinat, només si el teu en sap res. La fan servir, en un sentit general, serveis que recol·lecten estadístiques sobre la federació.
         profile_directory: El directori de perfils llista tots els usuaris que tenen activat ser descoberts.
         require_invite_text: Quan el registre requereixi aprovació manual, fes que sigui obligatori en lloc d'opcional d'escriure el text de la sol·licitud d'invitació "Per què vols unir-te?"
@@ -243,7 +243,7 @@ ca:
         backups_retention_period: Període de retenció del arxiu d'usuari
         bootstrap_timeline_accounts: Recomana sempre aquests comptes als nous usuaris
         closed_registrations_message: Missatge personalitzat quan el registre no és accessible
-        content_cache_retention_period: Període de retenció de la memòria cau de contingut
+        content_cache_retention_period: Període de retenció del contingut remot
         custom_css: CSS personalitzat
         mascot: Mascota personalitzada (llegat)
         media_cache_retention_period: Període de retenció del cau multimèdia
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index f91f82673..54edc4149 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -77,13 +77,13 @@ cs:
           warn: Schovat filtrovaný obsah za varováním zmiňujicím název filtru
       form_admin_settings:
         activity_api_enabled: Počty lokálně zveřejnělých příspěvků, aktivních uživatelů a nových registrací v týdenních intervalech
-        backups_retention_period: Zachovat generované uživatelské archivy pro zadaný počet dní.
+        backups_retention_period: Uživatelé mají možnost vytvářet archivy svých příspěvků, které si mohou stáhnout později. Pokud je nastaveno na kladnou hodnotu, budou tyto archivy po zadaném počtu dní automaticky odstraněny z úložiště.
         bootstrap_timeline_accounts: Tyto účty budou připnuty na vrchol nových uživatelů podle doporučení.
         closed_registrations_message: Zobrazeno při zavření registrace
-        content_cache_retention_period: Příspěvky z jiných serverů budou odstraněny po zadaném počtu dní, pokud je nastavena kladná hodnota. To může být nevratné.
+        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.
         mascot: Přepíše ilustraci v pokročilém webovém rozhraní.
-        media_cache_retention_period: Stažené mediální soubory budou po zadaném počtu dní odstraněny, pokud je nastavena kladná hodnota, a na požádání znovu staženy.
+        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.
         peers_api_enabled: Seznam názvů domén se kterými se tento server setkal ve fediversu. Neobsahuje žádná data o tom, zda jste federovali s daným serverem, pouze že o něm váš server ví. Toto je využíváno službami, které sbírají o federování statistiku v obecném smyslu.
         profile_directory: Adresář profilu obsahuje seznam všech uživatelů, kteří se přihlásili, aby mohli být nalezeni.
         require_invite_text: Pokud přihlášení vyžaduje ruční schválení, měl by být textový vstup „Proč se chcete připojit?“ povinný spíše než volitelný
@@ -243,7 +243,7 @@ cs:
         backups_retention_period: Doba uchovávání archivu uživatelů
         bootstrap_timeline_accounts: Vždy doporučovat tyto účty novým uživatelům
         closed_registrations_message: Vlastní zpráva, když přihlášení není k dispozici
-        content_cache_retention_period: Doba uchování mezipaměti obsahu
+        content_cache_retention_period: Doba uchovávání vzdáleného obsahu
         custom_css: Vlastní CSS
         mascot: Vlastní maskot (zastaralé)
         media_cache_retention_period: Doba uchovávání mezipaměti médií
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index 21cd1ddc0..6b5e8787d 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -77,13 +77,10 @@ cy:
           warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd
       form_admin_settings:
         activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol
-        backups_retention_period: Cadw archifau defnyddwyr a gynhyrchwyd am y nifer penodedig o ddyddiau.
         bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd.
         closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau
-        content_cache_retention_period: Bydd postiadau o weinyddion eraill yn cael eu dileu ar ôl y nifer penodedig o ddyddiau pan fyddan nhw wedi'u gosod i werth positif. Gall nad oes modd dadwneud hyn.
         custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon.
         mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch.
-        media_cache_retention_period: Bydd ffeiliau cyfryngau wedi'u llwytho i lawr yn cael eu dileu ar ôl y nifer penodedig o ddyddiau pan gânt eu gosod i werth cadarnhaol, a'u hail-lwytho i lawr ar alw.
         peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol.
         profile_directory: Mae'r cyfeiriadur proffil yn rhestru'r holl ddefnyddwyr sydd wedi dewis i fod yn ddarganfyddiadwy.
         require_invite_text: Pan fydd angen cymeradwyaeth â llaw ar gyfer cofrestriadau, gwnewch y “Pam ydych chi am ymuno?” mewnbwn testun yn orfodol yn hytrach na dewisol
@@ -243,7 +240,6 @@ cy:
         backups_retention_period: Cyfnod cadw archif defnyddwyr
         bootstrap_timeline_accounts: Argymhellwch y cyfrifon hyn i ddefnyddwyr newydd bob amser
         closed_registrations_message: Neges bersonol pan nad yw cofrestriadau ar gael
-        content_cache_retention_period: Cyfnod cadw storfa cynnwys
         custom_css: CSS cyfaddas
         mascot: Mascot cyfaddas (hen)
         media_cache_retention_period: Cyfnod cadw storfa cyfryngau
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index 6c8d995bf..c9dcd4fa8 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -77,13 +77,13 @@ da:
           warn: Skjul filtreret indhold bag en advarsel, der nævner filterets titel
       form_admin_settings:
         activity_api_enabled: Antal lokalt opslåede indlæg, aktive brugere samt nye tilmeldinger i ugentlige opdelinger
-        backups_retention_period: Behold genererede brugerarkiver i det angivne antal dage.
+        backups_retention_period: Brugere har mulighed for at generere arkiver af deres indlæg til senere downloade. Når sat til positiv værdi, vil disse arkiver automatisk blive slettet fra lagerpladsen efter det angivne antal dage.
         bootstrap_timeline_accounts: Disse konti fastgøres øverst på nye brugeres følg-anbefalinger.
         closed_registrations_message: Vises, når tilmeldinger er lukket
-        content_cache_retention_period: Indlæg fra andre servere slettes efter det angivne antal dage, når sat til en positiv værdi. Dette kan være irreversibelt.
+        content_cache_retention_period: Alle indlæg fra andre servere (herunder boosts 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.
         mascot: Tilsidesætter illustrationen i den avancerede webgrænseflade.
-        media_cache_retention_period: Downloadede mediefiler slettes efter det angivne antal dage, når sat til en positiv værdi, og gendownloades på forlangende.
+        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.
         peers_api_enabled: En liste med domænenavne, som denne server har stødt på i fediverset. Ingen data inkluderes her om, hvorvidt der fødereres med en given server, blot at din server kender til det. Dette bruges af tjenester, som indsamler generelle føderationsstatistikker.
         profile_directory: Profilmappen oplister alle brugere, som har valgt at kunne opdages.
         require_invite_text: Når tilmelding kræver manuel godkendelse, så gør “Hvorfor ønsker du at deltage?” tekstinput obligatorisk i stedet for valgfrit
@@ -243,7 +243,7 @@ da:
         backups_retention_period: Brugerarkivs opbevaringsperiode
         bootstrap_timeline_accounts: Anbefal altid disse konti til nye brugere
         closed_registrations_message: Tilpasset besked, når tilmelding er utilgængelig
-        content_cache_retention_period: Indholds-cache opbevaringsperiode
+        content_cache_retention_period: Opbevaringsperiode for eksternt indhold
         custom_css: Tilpasset CSS
         mascot: Tilpasset maskot (ældre funktion)
         media_cache_retention_period: Media-cache opbevaringsperiode
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 1d3fba787..758d02028 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -77,13 +77,13 @@ de:
           warn: Den gefilterten Beitrag hinter einer Warnung, die den Filtertitel beinhaltet, ausblenden
       form_admin_settings:
         activity_api_enabled: Anzahl der wöchentlichen Beiträge, aktiven Profile und Registrierungen auf diesem Server
-        backups_retention_period: Behalte die Archive, die von den Benutzer*innen erstellt worden sind, für die angegebene Anzahl an Tagen.
+        backups_retention_period: Nutzer*innen haben die Möglichkeit, Archive ihrer Beiträge zu erstellen, die sie später herunterladen können. Wenn ein positiver Wert gesetzt ist, werden diese Archive nach der festgelegten Anzahl von Tagen automatisch aus deinem Speicher gelöscht.
         bootstrap_timeline_accounts: Diese Konten werden bei den Follower-Empfehlungen für neu registrierte Nutzer*innen oben angeheftet.
         closed_registrations_message: Wird angezeigt, wenn Registrierungen deaktiviert sind
-        content_cache_retention_period: Sowohl alle Beiträge als auch geteilte Beiträge von anderen Servern werden nach der angegebenen Anzahl von Tagen gelöscht. Alle zugehörigen Lesezeichen, Favoriten und geteilte Beiträge werden ebenfalls verloren gehen. Dies kann nicht mehr rückgängig gemacht werden.
+        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. Das Verwenden dieser Option richtet sich ausschließlich an Server für spezielle Zwecke 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.
         mascot: Überschreibt die Abbildung in der erweiterten Weboberfläche.
-        media_cache_retention_period: Von anderen Servern übertragene Mediendateien werden nach der angegebenen Anzahl an Tagen – sofern das Feld eine positive Zahl enthält – aus dem Cache gelöscht und bei Bedarf erneut heruntergeladen.
+        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.
         peers_api_enabled: Eine Liste von Domains, die diesem Server im Fediverse begegnet sind. Hierbei werden keine Angaben darüber gemacht, ob du mit einem bestimmten Server föderierst, sondern nur, dass dein Server davon weiß. Dies wird von Diensten verwendet, die allgemein Statistiken übers Ferdiverse sammeln.
         profile_directory: Dieses Verzeichnis zeigt alle Profile an, die sich dafür entschieden haben, entdeckt zu werden.
         require_invite_text: Wenn Registrierungen eine manuelle Genehmigung erfordern, dann werden Nutzer einen Grund für ihre Registrierung angeben müssen
@@ -243,7 +243,7 @@ de:
         backups_retention_period: Aufbewahrungsfrist für Archive
         bootstrap_timeline_accounts: Neuen Nutzern immer diese Konten empfehlen
         closed_registrations_message: Nachricht, falls Registrierungen deaktiviert sind
-        content_cache_retention_period: Aufbewahrungsfrist für Inhalte im Cache
+        content_cache_retention_period: Aufbewahrungsfrist für externe Inhalte
         custom_css: Eigenes CSS
         mascot: Benutzerdefiniertes Maskottchen (Legacy)
         media_cache_retention_period: Aufbewahrungsfrist für Medien im Cache
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 4ffc496d0..29b9f59e1 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -67,13 +67,10 @@ el:
           warn: Απόκρυψη φιλτραρισμένου περιεχομένου πίσω από μια προειδοποίηση που αναφέρει τον τίτλο του φίλτρου
       form_admin_settings:
         activity_api_enabled: Καταμέτρηση τοπικά δημοσιευμένων δημοσιεύσεων, ενεργών χρηστών και νέων εγγραφών σε εβδομαδιαία πακέτα
-        backups_retention_period: Διατήρηση αρχείων χρηστών που δημιουργήθηκαν για τον καθορισμένο αριθμό ημερών.
         bootstrap_timeline_accounts: Αυτοί οι λογαριασμοί θα καρφιτσωθούν στην κορυφή των νέων χρηστών που ακολουθούν τις συστάσεις.
         closed_registrations_message: Εμφανίζεται όταν κλείνουν οι εγγραφές
-        content_cache_retention_period: Αναρτήσεις από άλλους διακομιστές θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών όταν οριστεί μια θετική τιμή. Αυτό μπορεί να είναι μη αναστρέψιμο.
         custom_css: Μπορείς να εφαρμόσεις προσαρμοσμένα στυλ στην έκδοση ιστοσελίδας του Mastodon.
         mascot: Παρακάμπτει την εικονογραφία στην προηγμένη διεπαφή ιστού.
-        media_cache_retention_period: Τα ληφθέντα αρχεία πολυμέσων θα διαγραφούν μετά τον καθορισμένο αριθμό ημερών, όταν οριστεί σε θετική τιμή, και να γίνει εκ νέου λήψη κατά απαίτηση.
         peers_api_enabled: Μια λίστα με ονόματα τομέα που συνάντησε αυτός ο διακομιστής στο fediverse. Δεν περιλαμβάνονται δεδομένα εδώ για το αν συναλλάσσετε με ένα συγκεκριμένο διακομιστή, μόνο ότι ο διακομιστής σας το ξέρει. Χρησιμοποιείται από υπηρεσίες που συλλέγουν στατιστικά στοιχεία για την συναλλαγή με γενική έννοια.
         profile_directory: Ο κατάλογος προφίλ παραθέτει όλους τους χρήστες που έχουν επιλέξει να είναι ανακαλύψιμοι.
         require_invite_text: 'Όταν η εγγραφή απαιτεί χειροκίνητη έγκριση, κάνε το πεδίο κειμένου: «Γιατί θέλετε να συμμετάσχετε;» υποχρεωτικό αντί για προαιρετικό'
@@ -224,7 +221,6 @@ el:
         backups_retention_period: Περίοδος αρχειοθέτησης του χρήστη
         bootstrap_timeline_accounts: Πρότεινε πάντα αυτούς τους λογαριασμούς σε νέους χρήστες
         closed_registrations_message: Προσαρμοσμένο μήνυμα όταν οι εγγραφές δεν είναι διαθέσιμες
-        content_cache_retention_period: Περίοδος διατήρησης προσωρινής μνήμης περιεχομένου
         custom_css: Προσαρμοσμένο CSS
         mascot: Προσαρμοσμένη μασκότ (απαρχαιωμένο)
         media_cache_retention_period: Περίοδος διατήρησης προσωρινής μνήμης πολυμέσων
diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml
index e5c9b1b2b..f4668ccad 100644
--- a/config/locales/simple_form.en-GB.yml
+++ b/config/locales/simple_form.en-GB.yml
@@ -77,13 +77,10 @@ en-GB:
           warn: Hide the filtered content behind a warning mentioning the filter's title
       form_admin_settings:
         activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
-        backups_retention_period: Keep generated user archives for the specified number of days.
         bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
         closed_registrations_message: Displayed when sign-ups are closed
-        content_cache_retention_period: Posts from other servers will be deleted after the specified number of days when set to a positive value. This may be irreversible.
         custom_css: You can apply custom styles on the web version of Mastodon.
         mascot: Overrides the illustration in the advanced web interface.
-        media_cache_retention_period: Downloaded media files will be deleted after the specified number of days when set to a positive value, and re-downloaded on demand.
         peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
         profile_directory: The profile directory lists all users who have opted-in to be discoverable.
         require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
@@ -243,7 +240,6 @@ en-GB:
         backups_retention_period: User archive retention period
         bootstrap_timeline_accounts: Always recommend these accounts to new users
         closed_registrations_message: Custom message when sign-ups are not available
-        content_cache_retention_period: Content cache retention period
         custom_css: Custom CSS
         mascot: Custom mascot (legacy)
         media_cache_retention_period: Media cache retention period
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index ef4641d3e..e83f71a2c 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -75,13 +75,10 @@ eo:
           warn: Kaŝi la enhavon filtritan malantaŭ averto mencianta la nomon de la filtro
       form_admin_settings:
         activity_api_enabled: Nombroj de loke publikigitaj afiŝoj, aktivaj uzantoj kaj novaj registradoj en semajnaj siteloj
-        backups_retention_period: Konservi generitajn uzantoarkivojn por la kvanto de tagoj.
         bootstrap_timeline_accounts: Ĉi tiuj kontoj pinglitas al la supro de sekvorekomendoj de novaj uzantoj.
         closed_registrations_message: Montrita kiam registroj fermitas
-        content_cache_retention_period: Mesaĝoj de aliaj serviloj forigitas post la kvanto de tagoj kiam fiksitas al pozitiva nombro.
         custom_css: Vi povas meti propajn stilojn en la retversio de Mastodon.
         mascot: Anstatauigi la ilustraĵon en la altnivela retinterfaco.
-        media_cache_retention_period: Elŝutitaj audovidaĵojn forigotas post la kvanto de tagoj kiam fiksitas al pozitiva nombro.
         peers_api_enabled: Listo de domajnaj nomoj kiujn ĉi tiu servilo renkontis en la fediverso. Neniuj datumoj estas inkluditaj ĉi tie pri ĉu vi federacias kun donita servilo, nur ke via servilo scias pri ĝi. Ĉi tio estas uzata de servoj kiuj kolektas statistikojn pri federacio en ĝenerala signifo.
         profile_directory: La profilujo listigas ĉiujn uzantojn kiu volonte malkovrebli.
         require_invite_text: Kiam registroj bezonas permanan aprobon, igi la "Kial vi volas aliĝi?" tekstoenigon deviga anstau nedeviga
@@ -240,7 +237,6 @@ eo:
         backups_retention_period: Uzantoarkivretendauro
         bootstrap_timeline_accounts: Ĉiam rekomendi ĉi tiujn kontojn al novaj uzantoj
         closed_registrations_message: Kutima mesaĝo kiam registroj ne estas disponeblaj
-        content_cache_retention_period: Enhavkaŝaĵretendauro
         custom_css: Propa CSS
         mascot: Propa maskoto
         media_cache_retention_period: Audovidaĵkaŝaĵretendauro
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index 011162408..cd1b68168 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -77,13 +77,13 @@ es-AR:
           warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro
       form_admin_settings:
         activity_api_enabled: Conteos de mensajes publicados localmente, cuentas activas y nuevos registros en tandas semanales
-        backups_retention_period: Conservar los archivos historiales generados por el usuario durante el número de días especificado.
+        backups_retention_period: Los usuarios tienen la capacidad de generar archivos historiales de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente de su almacenamiento después del número especificado de días.
         bootstrap_timeline_accounts: Estas cuentas serán fijadas a la parte superior de las recomendaciones de cuentas a seguir para nuevos usuarios.
         closed_registrations_message: Mostrado cuando los registros están cerrados
-        content_cache_retention_period: Todos los mensajes y adhesiones de otros servidores se eliminarán después del número especificado de días. Es posible que algunos mensajes no sean recuperables. Todos los marcadores relacionados, mensajes marcados como favoritos y adhesiones también se perderán y será imposible de deshacer.
+        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.
         mascot: Reemplaza la ilustración en la interface web avanzada.
-        media_cache_retention_period: Los archivos de medios descargados se eliminarán después del número especificado de días cuando se establezca un valor positivo, y se volverán a descargar a pedido.
+        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.
         peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Acá no se incluye ningún dato sobre si federás con un servidor determinado, sólo que tu servidor lo conoce. Esto es usado por los servicios que recopilan estadísticas sobre la federación en un sentido general.
         profile_directory: El directorio de perfiles lista a todos los usuarios que han optado a que su cuenta pueda ser descubierta.
         require_invite_text: Cuando registros aprobación manual, hacé que la solicitud de invitación "¿Por qué querés unirte?" sea obligatoria, en vez de opcional
@@ -243,7 +243,7 @@ es-AR:
         backups_retention_period: Período de retención del archivo historial del usuario
         bootstrap_timeline_accounts: Siempre recomendar estas cuentas a usuarios nuevos
         closed_registrations_message: Mensaje personalizado cuando los registros no están disponibles
-        content_cache_retention_period: Período de retención de la caché de contenido
+        content_cache_retention_period: Período de retención de contenido remoto
         custom_css: CSS personalizado
         mascot: Mascota personalizada (legado)
         media_cache_retention_period: Período de retención de la caché de medios
diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml
index 28253d385..90e223dec 100644
--- a/config/locales/simple_form.es-MX.yml
+++ b/config/locales/simple_form.es-MX.yml
@@ -77,13 +77,13 @@ es-MX:
           warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro
       form_admin_settings:
         activity_api_enabled: Conteo de publicaciones publicadas localmente, usuarios activos, y nuevos registros en periodos semanales
-        backups_retention_period: Mantener los archivos de usuario generados durante el número de días especificado.
+        backups_retention_period: Los usuarios tienen la capacidad de generar archivos de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente del almacenamiento después del número de días especificado.
         bootstrap_timeline_accounts: Estas cuentas aparecerán en la parte superior de las recomendaciones de los nuevos usuarios.
         closed_registrations_message: Mostrado cuando los registros están cerrados
-        content_cache_retention_period: Las publicaciones de otros servidores se eliminarán después del número especificado de días cuando se establezca un valor positivo. Esto puede ser irreversible.
+        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.
         mascot: Reemplaza la ilustración en la interfaz web avanzada.
-        media_cache_retention_period: Los archivos multimedia descargados se eliminarán después del número especificado de días cuando se establezca un valor positivo, y se redescargarán bajo demanda.
+        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.
         peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el fediverso. Aquí no se incluye ningún dato sobre si usted federa con un servidor determinado, sólo que su servidor lo sabe. Esto es utilizado por los servicios que recopilan estadísticas sobre la federación en un sentido general.
         profile_directory: El directorio de perfiles lista a todos los usuarios que han optado por que su cuenta pueda ser descubierta.
         require_invite_text: Cuando los registros requieren aprobación manual, hace obligatoria la entrada de texto "¿Por qué quieres unirte?" en lugar de opcional
@@ -243,7 +243,7 @@ es-MX:
         backups_retention_period: Período de retención del archivo de usuario
         bootstrap_timeline_accounts: Recomendar siempre estas cuentas a nuevos usuarios
         closed_registrations_message: Mensaje personalizado cuando los registros no están disponibles
-        content_cache_retention_period: Período de retención de caché de contenido
+        content_cache_retention_period: Período de retención de contenido remoto
         custom_css: CSS personalizado
         mascot: Mascota personalizada (legado)
         media_cache_retention_period: Período de retención de caché multimedia
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 008ac1607..1d75bc423 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -77,13 +77,13 @@ es:
           warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro
       form_admin_settings:
         activity_api_enabled: Conteo de publicaciones publicadas localmente, usuarios activos y registros nuevos cada semana
-        backups_retention_period: Mantener los archivos de usuario generados durante el número de días especificado.
+        backups_retention_period: Los usuarios tienen la capacidad de generar archivos de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente del almacenamiento después del número de días especificado.
         bootstrap_timeline_accounts: Estas cuentas aparecerán en la parte superior de las recomendaciones de los nuevos usuarios.
         closed_registrations_message: Mostrado cuando los registros están cerrados
-        content_cache_retention_period: Las publicaciones de otros servidores se eliminarán después del número especificado de días cuando se establezca un valor positivo. Esto puede ser irreversible.
+        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.
         mascot: Reemplaza la ilustración en la interfaz web avanzada.
-        media_cache_retention_period: Los archivos multimedia descargados se eliminarán después del número especificado de días cuando se establezca un valor positivo, y se redescargarán bajo demanda.
+        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.
         peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Aquí no se incluye ningún dato sobre si federas con un servidor determinado, solo que tu servidor lo conoce. Esto es utilizado por los servicios que recopilan estadísticas sobre la federación en un sentido general.
         profile_directory: El directorio de perfiles lista a todos los usuarios que han optado por que su cuenta pueda ser descubierta.
         require_invite_text: Cuando los registros requieren aprobación manual, hace obligatoria la entrada de texto "¿Por qué quieres unirte?" en lugar de opcional
@@ -243,7 +243,7 @@ es:
         backups_retention_period: Período de retención del archivo de usuario
         bootstrap_timeline_accounts: Recomendar siempre estas cuentas a nuevos usuarios
         closed_registrations_message: Mensaje personalizado cuando los registros no están disponibles
-        content_cache_retention_period: Período de retención de caché de contenido
+        content_cache_retention_period: Período de retención de contenido remoto
         custom_css: CSS personalizado
         mascot: Mascota personalizada (legado)
         media_cache_retention_period: Período de retención de caché multimedia
diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml
index 1f7d94004..b2ad4c51c 100644
--- a/config/locales/simple_form.et.yml
+++ b/config/locales/simple_form.et.yml
@@ -77,13 +77,10 @@ et:
           warn: Varja filtreeritud sisu hoiatusega, nimetades filtri pealkirja
       form_admin_settings:
         activity_api_enabled: Kohalike postituste, aktiivsete kasutajate ja uute registreerumistr arv nädala kaupa grupeeritult
-        backups_retention_period: Talleta genereeritud kasutajaarhiivid määratud arv päevi.
         bootstrap_timeline_accounts: Need kasutajad kinnitatakse uute kasutajate jälgimissoovituste esiritta.
         closed_registrations_message: Kuvatakse, kui liitumised pole võimalikud
-        content_cache_retention_period: Teiste serverite postitused kustutatakse pärast määratud päevade arvu, kui see on seatud positiivsele väärtusele. See võib olla pöördumatu.
         custom_css: Kohandatud stiile on võimalik kasutada Mastodoni veebiliideses.
         mascot: Asendab kohandatud veebiliidese illustratsiooni.
-        media_cache_retention_period: Positiivse väärtuse korral kustutatakse allalaetud meediafailid määratud päevade möödudes. Vajadusel laaditakse need uuesti alla.
         peers_api_enabled: Domeeninimede loetelu, mida see server on Fediversumis kohanud. Mitte mingeid andmeid selle serveri födereerumise kohta antud serverite pole, vaid üksnes info, et sellest serverist ollakse teadlik. Seda kasutavad teenused, mis koguvad üldist födereerumise statistikat.
         profile_directory: Kasutajate kataloog kuvab nimekirja kasutajatest, kes on seda lubanud.
         require_invite_text: Kui liitumisi on tarvis kinnitada, oleks "Miks soovid liituda?" vastus vajalik
@@ -243,7 +240,6 @@ et:
         backups_retention_period: Kasutajate arhiivi talletusperiood
         bootstrap_timeline_accounts: Alati soovita neid kontosid uutele kasutajatele
         closed_registrations_message: Kohandatud teade, kui liitumine pole võimalik
-        content_cache_retention_period: Meediapuhvri talletusperiood
         custom_css: Kohandatud CSS
         mascot: Kohandatud maskott (kunagine)
         media_cache_retention_period: Meediapuhvri talletusperiood
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 5ed3b9efa..ba4c9ebcf 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -77,13 +77,13 @@ eu:
           warn: Ezkutatu iragazitako edukia iragazkiaren izenburua duen abisu batekin
       form_admin_settings:
         activity_api_enabled: Lokalki argitaratutako bidalketak, erabiltzaile aktiboak, eta izen-emateen kopuruak astero zenbatzen ditu
-        backups_retention_period: Mantendu sortutako erabiltzailearen artxiboa zehazturiko egun kopuruan.
+        backups_retention_period: Erabiltzaileek geroago deskarga dezaketen beren argitalpenen artxiboak sor ditzakete. Balio positibo bat ezartzean, artxibo hauek biltegiratzetik automatikoki ezabatuko dira zehazturiko egunen buruan.
         bootstrap_timeline_accounts: Kontu hauek erabiltzaile berrien jarraitzeko gomendioen goiko aldean ainguratuko dira.
         closed_registrations_message: Izen-ematea itxia dagoenean bistaratua
-        content_cache_retention_period: Balio positibo bat ezarriz gero, egun kopuru horretara iristean beste zerbitzarietako bidalketak ezabatuko dira. Hau ezin da desegin.
+        content_cache_retention_period: Beste zerbitzarietako argitalpen guztiak (bultzadak eta erantzunak barne) ezabatuko dira zehazturiko egunen buruan, argitalpen horiek izan ditzaketen erabiltzaile lokalaren interakzioa kontuan izanik gabe. Instantzia desberdinetako erabiltzaileen arteko aipamen pribatuak ere galdu egingo dira eta ezin izango dira berreskuratu. Ezarpen honen erabilera xede berezia duten instantziei zuzendua dago eta erabiltzaileen itxaropena hausten da orotariko erabilerarako inplementatzean.
         custom_css: Estilo pertsonalizatuak aplikatu ditzakezu Mastodonen web bertsioan.
         mascot: Web interfaze aurreratuko ilustrazioa gainidazten du.
-        media_cache_retention_period: Balio positibo bat ezarriz gero, egun kopuru horretara iristean beste zerbitzarietatik deskargatutako multimedia fitxategiak ezabatuko dira. Ondoren, eskatu ahala deskargatuko dira berriz.
+        media_cache_retention_period: Multimedia-fitxategiak dituzten urruneko erabiltzaileen argitalpenak zure zerbitzarian gordetzen dira cachean. Balio positiboa ezartzean, multimedia zehazturiko egunen buruan ezabatuko da. Multimedia-datuak eskatzen badira ezabatu ostean, berriro deskargatuko dira, iturburuko edukia oraindik erabilgarri badago. Estekaren aurrebistako txartelek hirugarrenen guneei zenbatetan dei diezaieketen mugatzen dieten murrizketak direla eta, balio honi, gutxienez, 14 egunen balioa ezartzea gomendatzen da, bestela, esteken aurrebistako txartelak ez dira eguneratuko eskatu ahala denbora horren aurretik.
         peers_api_enabled: Zerbitzari honek fedibertsoan ikusi dituen zerbitzarien domeinu-izenen zerrenda. Ez da daturik ematen zerbitzari jakin batekin federatzearen ala ez federatzearen inguruan, zerbitzariak haien berri duela soilik. Federazioari buruzko estatistika orokorrak biltzen dituzten zerbitzuek erabiltzen dute hau.
         profile_directory: Profilen direktorioan ikusgai egotea aukeratu duten erabiltzaile guztiak zerrendatzen dira.
         require_invite_text: Izen emateak eskuz onartu behar direnean, "Zergatik elkartu nahi duzu?" testu sarrera derrigorrezko bezala ezarri, ez hautazko
@@ -243,7 +243,7 @@ eu:
         backups_retention_period: Erabiltzailearen artxiboa gordetzeko epea
         bootstrap_timeline_accounts: Gomendatu beti kontu hauek erabiltzaile berriei
         closed_registrations_message: Izen-emateak itxita daudenerako mezu pertsonalizatua
-        content_cache_retention_period: Edukiaren cache-a atxikitzeko epea
+        content_cache_retention_period: Urruneko edukiaren atxikipen-aldia
         custom_css: CSS pertsonalizatua
         mascot: Maskota pertsonalizatua (zaharkitua)
         media_cache_retention_period: Multimediaren cachea atxikitzeko epea
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index 03f187545..dd1c56e3b 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -75,13 +75,10 @@ fa:
           warn: نهفتن محتوای پالوده پشت هشداری که به عنوان پالایه اشاره می‌کند
       form_admin_settings:
         activity_api_enabled: تعداد بوق‌های منتشرهٔ محلی، کاربران فعال، و کاربران تازه در هر هفته
-        backups_retention_period: نگه داشتن بایگانی‌های کاربری برای روزهای مشخّص شده.
         bootstrap_timeline_accounts: سنجاق کردنThese accounts will be pinned to the top of new users' follow recommendations.
         closed_registrations_message: نمایش داده هنگام بسته بودن ثبت‌نام‌ها
-        content_cache_retention_period: همهٔ فرسته‌ها و تقویت‌ها از دیگر کارسازها پس از روزهای نشخّص حذف خواهند شد. ممکن است برخی فرسته‌ها قابل بازیابی نباشند. همهٔ نشانک‌ها، پسندها و تقویت‌ها نیز از دست خواهند رفت و قابل بازگشت نخواهند بود.
         custom_css: می‌توانیدروی نگارش وب ماستودون سبک‌های سفارشی اعمال کنید.
         mascot: نقش میانای وب پیش‌رفته را پایمال می‌کند.
-        media_cache_retention_period: اگر به مقدار مثبتی تنظیم شود، پرونده‌های رسانهٔ بارگرفته پس از روزهای مشخّص شده حذف خواهند شد و هنگام درخواست دوباره بارگرفته می‌شوند.
         peers_api_enabled: فهرستی از نام‌های دامنه‌ای که این کارساز در فدیورس با آن مواجه شده است. هیچ اطلاعاتی در مورد اینکه آیا شما با یک کارساز داده شده متعهد هستید، در اینجا گنجانده نشده است، فقط کارساز شما در مورد آن می‌داند. این توسط خدماتی استفاده می‌شود که آمار مربوط به فدراسیون را به معنای کلی جمع‌آوری می‌کنند.
         profile_directory: شاخهٔ نمایه، همهٔ کاربرانی که کشف‌پذیری را برگزیده‌اند سیاهه می‌کند.
         require_invite_text: زمانی که نام‌نویسی ها نیازمند تایید دستی است، متن «چرا می‌خواهید بپیوندید؟» بخش درخواست دعوت را به جای اختیاری، اجباری کنید
@@ -225,7 +222,6 @@ fa:
         backups_retention_period: دورهٔ نگه‌داری بایگانی کاربری
         bootstrap_timeline_accounts: پیشنهاد همیشگی این حساب‌ها به کاربران جدید
         closed_registrations_message: پیام سفارشی هنگام در دسترس نبودن ثبت‌نام‌ها
-        content_cache_retention_period: دورهٔ نگه‌داری انبارهٔ محتوا
         custom_css: سبک CSS سفارشی
         mascot: نشان سفارشی (قدیمی)
         media_cache_retention_period: دورهٔ نگه‌داری انبارهٔ رسانه
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index c3fbd4372..c342dde33 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -77,13 +77,10 @@ fi:
           warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi
       form_admin_settings:
         activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä
-        backups_retention_period: Säilytä luodut arkistot määritetyn määrän päiviä.
         bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun.
         closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu
-        content_cache_retention_period: Kaikki julkaisut ja tehostukset muilta palvelimilta poistetaan, kun määritelty määrä päiviä on kulunut. Osaa julkaisuista voi olla mahdoton palauttaa. Kaikki julkaisuihin liittyvät kirjanmerkit, suosikit ja tehostukset menetetään, eikä niitä voi palauttaa.
         custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa.
         mascot: Ohittaa kuvituksen edistyneessä selainkäyttöliittymässä.
-        media_cache_retention_period: Ladatut mediatiedostot poistetaan määritetyn määrän päiviä jälkeen, kun arvo on positiivinen ja ladataan uudelleen pyynnöstä.
         peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, oletko liitossa tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla.
         profile_directory: Profiilihakemisto lueteloi kaikki käyttäjät, jotka ovat ilmoittaneet olevansa löydettävissä.
         require_invite_text: Kun rekisteröityminen vaatii manuaalisen hyväksynnän, tee ”Miksi haluat liittyä?” -tekstikentästä pakollinen vapaaehtoisen sijaan
@@ -243,7 +240,7 @@ fi:
         backups_retention_period: Käyttäjän arkiston säilytysaika
         bootstrap_timeline_accounts: Suosittele aina näitä tilejä uusille käyttäjille
         closed_registrations_message: Mukautettu viesti, kun rekisteröityminen ei ole saatavilla
-        content_cache_retention_period: Sisällön välimuistin säilytysaika
+        content_cache_retention_period: Etäsisällön säilytysaika
         custom_css: Mukautettu CSS
         mascot: Mukautettu maskotti (vanhentunut ominaisuus)
         media_cache_retention_period: Mediasisältövälimuistin säilytysaika
diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml
index 599e79ea2..c7c003322 100644
--- a/config/locales/simple_form.fo.yml
+++ b/config/locales/simple_form.fo.yml
@@ -77,13 +77,13 @@ fo:
           warn: Fjal filtreraða innihaldið aftan fyri eina ávaring, sum nevnir heitið á filtrinum
       form_admin_settings:
         activity_api_enabled: Tal av lokalt útgivnum postum, virknum brúkarum og nýggjum skrásetingum býtt vikuliga
-        backups_retention_period: Varðveit gjørd brúkarasøvn í ásetta talið av døgum.
+        backups_retention_period: Brúkarar hava møguleika at gera trygdaravrit av teirra postum, sum tey kunnu taka niður seinni. Tá hetta er sett til eitt virði størri enn 0, so verða hesi trygdaravrit strikaði av sær sjálvum frá tínar goymslu eftir ásetta talið av døgum.
         bootstrap_timeline_accounts: Hesar kontur verða festar ovast á listanum yvir brúkarar, sum tey nýggju verða mælt til at fylgja.
         closed_registrations_message: Víst tá stongt er fyri tilmeldingum
-        content_cache_retention_period: Postar frá øðrum ambætarum verða strikaðir eftir ásetta talið av døgum, tá hetta er sett til eitt positivt virði. Hetta kann møguliga ikki broytast.
+        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.
         mascot: Skúgvar til viks myndprýðingina í framkomna vev-markamótinum.
-        media_cache_retention_period: Miðlafílur, sum eru tiknar niður, verða strikaðar eftir ásetta talið av døgum, tá hetta er sett til eitt positivt virði, og takast niður umaftur eftir ynski.
+        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.
         peers_api_enabled: Ein listi við navnaøkjum, sum hesin ambætarin er komin framat í fediversinum. Ongar dátur eru tiknar við her um tú er sameind/ur við ein givnan ambætara, einans at tín ambætari veit um hann. Hetta verður brúkt av tænastum, sum gera hagtøl um sameining yvirhøvur.
         profile_directory: Vangaskráin listar allar brúkarar, sum hava valt at kunna uppdagast.
         require_invite_text: Tá tilmeldingar krevja serskilda góðkenning, set so "Hví vil tú vera við?" tekstateigin til at vera kravdan heldur enn valfrían
@@ -243,7 +243,7 @@ fo:
         backups_retention_period: Hvussu leingi verða brúkarasøvn goymd
         bootstrap_timeline_accounts: Mæl altíð nýggjum brúkarum at fylgja hesar kontur
         closed_registrations_message: Serskild boð, tá tað ikki er møguligt at tilmelda seg
-        content_cache_retention_period: Tíðarskeið, har innihaldgoymslan verður varðveitt
+        content_cache_retention_period: Tíðarskeið fyri varðveiðslu av fjartilfari
         custom_css: Serskilt CSS
         mascot: Serskildur maskottur (arvur)
         media_cache_retention_period: Tíðarskeið, har miðlagoymslur verða varðveittar
diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml
index 823929c55..4b3f53e22 100644
--- a/config/locales/simple_form.fr-CA.yml
+++ b/config/locales/simple_form.fr-CA.yml
@@ -77,13 +77,10 @@ fr-CA:
           warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre
       form_admin_settings:
         activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire
-        backups_retention_period: Conserve les archives générées par l'utilisateur selon le nombre de jours spécifié.
         bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs.
         closed_registrations_message: Affiché lorsque les inscriptions sont fermées
-        content_cache_retention_period: Les publications depuis d'autres serveurs seront supprimées après un nombre de jours spécifiés lorsque défini sur une valeur positive. Cela peut être irréversible.
         custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon.
         mascot: Remplace l'illustration dans l'interface Web avancée.
-        media_cache_retention_period: Les fichiers multimédias téléchargés seront supprimés après le nombre de jours spécifiés lorsque la valeur est positive, et seront téléchargés à nouveau sur demande.
         peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général.
         profile_directory: L'annuaire des profils répertorie tous les utilisateurs qui ont opté pour être découverts.
         require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif
@@ -243,7 +240,6 @@ fr-CA:
         backups_retention_period: Période d'archivage utilisateur
         bootstrap_timeline_accounts: Toujours recommander ces comptes aux nouveaux utilisateurs
         closed_registrations_message: Message personnalisé lorsque les inscriptions ne sont pas disponibles
-        content_cache_retention_period: Durée de rétention du contenu dans le cache
         custom_css: CSS personnalisé
         mascot: Mascotte personnalisée (héritée)
         media_cache_retention_period: Durée de rétention des médias dans le cache
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 4c8de1b20..476f197f4 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -77,13 +77,10 @@ fr:
           warn: Cacher le contenu filtré derrière un avertissement mentionnant le nom du filtre
       form_admin_settings:
         activity_api_enabled: Nombre de messages publiés localement, de comptes actifs et de nouvelles inscriptions par tranche hebdomadaire
-        backups_retention_period: Conserve les archives générées par l'utilisateur selon le nombre de jours spécifié.
         bootstrap_timeline_accounts: Ces comptes seront épinglés en tête de liste des recommandations pour les nouveaux utilisateurs.
         closed_registrations_message: Affiché lorsque les inscriptions sont fermées
-        content_cache_retention_period: Lorsque la valeur est positive, les messages publiés depuis d'autres serveurs seront supprimés après le nombre de jours défini. Cela peut être irréversible.
         custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon.
         mascot: Remplace l'illustration dans l'interface Web avancée.
-        media_cache_retention_period: Lorsque la valeur est positive, les fichiers multimédias téléchargés seront supprimés après le nombre de jours défini et pourront être à nouveau téléchargés sur demande.
         peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général.
         profile_directory: L'annuaire des profils répertorie tous les comptes qui choisi d'être découvrables.
         require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif
@@ -243,7 +240,6 @@ fr:
         backups_retention_period: Durée de rétention des archives utilisateur
         bootstrap_timeline_accounts: Toujours recommander ces comptes aux nouveaux⋅elles utilisateur⋅rice⋅s
         closed_registrations_message: Message personnalisé lorsque les inscriptions ne sont pas disponibles
-        content_cache_retention_period: Durée de rétention du contenu dans le cache
         custom_css: CSS personnalisé
         mascot: Mascotte personnalisée (héritée)
         media_cache_retention_period: Durée de rétention des médias dans le cache
diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml
index e2e40f04d..fa1633c90 100644
--- a/config/locales/simple_form.fy.yml
+++ b/config/locales/simple_form.fy.yml
@@ -77,13 +77,10 @@ fy:
           warn: Ferstopje de filtere ynhâld efter in warskôging, mei de titel fan it filter as warskôgingstekst
       form_admin_settings:
         activity_api_enabled: Tal lokaal publisearre artikelen, aktive brûkers en nije registraasjes yn wyklikse werjefte
-        backups_retention_period: De oanmakke brûkersargiven foar it opjûne oantal dagen behâlde.
         bootstrap_timeline_accounts: Dizze accounts wurde boppe oan de oanrekommandaasjes oan nije brûkers toand. Meardere brûkersnammen troch komma’s skiede.
         closed_registrations_message: Werjûn wannear’t registraasje fan nije accounts útskeakele is
-        content_cache_retention_period: 'Berjochten fan oare servers wurde nei it opjûne oantal dagen fuortsmiten. Let op: Dit is definityf.'
         custom_css: Jo kinne oanpaste CSS tapasse op de webferzje fan dizze Mastodon-server.
         mascot: Oerskriuwt de yllustraasje yn de avansearre webomjouwing.
-        media_cache_retention_period: Mediabestannen dy’t fan oare servers download binne wurde nei it opjûne oantal dagen fuortsmiten en wurde op fersyk opnij download.
         peers_api_enabled: In list mei domeinnammen, dêr’t dizze server yn fediverse kontakt hân mei hat. Hjir wurdt gjin data dield, oft jo mei in bepaalde server federearrest, mar alinnich, dat jo server dat wit. Dit wurdt foar tsjinsten brûkt, dy’t statistiken oer federaasje yn algemiene sin sammelet.
         profile_directory: De brûkersgids befettet in list fan alle brûkers dy¥t derfoar keazen hawwe om ûntdekt wurde te kinnen.
         require_invite_text: Meitsje it ynfoljen fan ‘Wêrom wolle jo jo hjir registrearje?’ ferplicht yn stee fan opsjoneel, wannear’t registraasjes hânmjittich goedkard wurde moatte
@@ -243,7 +240,6 @@ fy:
         backups_retention_period: Bewartermyn brûkersargyf
         bootstrap_timeline_accounts: Accounts dy’t altyd oan nije brûkers oanrekommandearre wurde
         closed_registrations_message: Oanpast berjocht wannear registraasje útskeakele is
-        content_cache_retention_period: Bewartermyn berjochtebuffer
         custom_css: Oanpaste CSS
         mascot: Oanpaste maskotte (legacy)
         media_cache_retention_period: Bewartermyn mediabuffer
diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml
index 168e7168e..8a36f73dc 100644
--- a/config/locales/simple_form.gd.yml
+++ b/config/locales/simple_form.gd.yml
@@ -77,13 +77,10 @@ gd:
           warn: Falaich an t-susbaint chriathraichte air cùlaibh rabhaidh a dh’innseas tiotal na criathraige
       form_admin_settings:
         activity_api_enabled: Cunntasan nam postaichean a chaidh fhoillseachadh gu h-ionadail, nan cleachdaichean gnìomhach ’s nan clàraidhean ùra an am bucaidean seachdaineil
-        backups_retention_period: Cùm na tasg-lannan a chaidh a ghintinn dhan luchd-cleachdaidh rè an àireamh de làithean a shònraich thu.
         bootstrap_timeline_accounts: Thèid na cunntasan seo a phrìneachadh air bàrr nam molaidhean leantainn dhan luchd-cleachdaidh ùr.
         closed_registrations_message: Thèid seo a shealltainn nuair a bhios an clàradh dùinte
-        content_cache_retention_period: Thèid gach post is brosnachadh o fhrithealaichean eile a sguabadh às às dèidh an àireamh de làithean a shònraicheas tu. Dh’fhaoidte nach gabh a h-uile post aiseag. Thèid gach comharran-lìn, annsachd is brosnachadh co-cheangailte riutha air chall cuideachd agus cha ghabh sin a neo-dhèanamh.
         custom_css: "’S urrainn dhut stoidhlean gnàthaichte a chur an sàs air an tionndadh-lìn de Mhastodon."
         mascot: Tar-àithnidh seo an sgead-dhealbh san eadar-aghaidh-lìn adhartach.
-        media_cache_retention_period: Thèid na faidhlichean meadhain air an luchdadh a-nuas a sguabadh às às dèidh an àireamh de làithean a shònraich thu nuair a bhios luach dearbh air agus an ath-luachdadh nuair a thèid an iarraidh an uairsin.
         peers_api_enabled: Seo liosta de dh’ainmean àrainne ris an do thachair am frithealaiche seo sa cho-shaoghal. Chan eil dàta sam bith ’ga ghabhail a-staigh an-seo mu a bheil thu co-naisgte ri frithealaiche sònraichte gus nach eil ach dìreach gu bheil am frithealaiche agad eòlach air. Thèid seo a chleachdadh le seirbheisean a chruinnicheas stadastaireachd air a’ cho-nasgadh san fharsaingeachd.
         profile_directory: Seallaidh eòlaire nam pròifil liosta dhen luchd-cleachdaidh a dh’aontaich gun gabh an rùrachadh.
         require_invite_text: Nuair a bhios aontachadh a làimh riatanach dhan chlàradh, dèan an raon teacsa “Carson a bu mhiann leat ballrachd fhaighinn?” riatanach seach roghainneil
@@ -243,7 +240,6 @@ gd:
         backups_retention_period: Ùine glèidhidh aig tasg-lannan an luchd-cleachdaidh
         bootstrap_timeline_accounts: Mol na cunntasan seo do chleachdaichean ùra an-còmhnaidh
         closed_registrations_message: Teachdaireachd ghnàthaichte nuair nach eil clàradh ri fhaighinn
-        content_cache_retention_period: Ùine glèidhidh aig tasgadan na susbainte
         custom_css: CSS gnàthaichte
         mascot: Suaichnean gnàthaichte (dìleabach)
         media_cache_retention_period: Ùine glèidhidh aig tasgadan nam meadhanan
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index ffb12d31b..bd7c850df 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -77,13 +77,10 @@ gl:
           warn: Agochar o contido filtrado tras un aviso que conteña o nome do filtro
       form_admin_settings:
         activity_api_enabled: Conta do número de publicacións locais, usuarias activas, e novos rexistros en acumulados semanais
-        backups_retention_period: Gardar os arquivos xerados pola usuaria durante o número de días indicado.
         bootstrap_timeline_accounts: Estas contas aparecerán fixas na parte superior das recomendacións para as usuarias.
         closed_registrations_message: Móstrase cando non se admiten novas usuarias
-        content_cache_retention_period: As publicacións desde outros servidores serán eliminadas despois do número de días indicados ao poñer un valor positivo. É unha acción irreversible.
         custom_css: Podes aplicar deseños personalizados na versión web de Mastodon.
         mascot: Sobrescribe a ilustración na interface web avanzada.
-        media_cache_retention_period: Os ficheiros multimedia descargados serán eliminados despois do número de días indicado ao establecer un valor positivo, e voltos a descargar baixo petición.
         peers_api_enabled: Unha lista dos nomes de dominio que este servidor atopou no fediverso. Non se inclúen aquí datos acerca de se estás a federar con eles ou non, só que o teu servidor os recoñeceu. Ten utilidade para servizos que recollen estatísticas acerca da federación nun amplo senso.
         profile_directory: O directorio de perfís inclúe a tódalas usuarias que optaron por ser descubribles.
         require_invite_text: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo
@@ -243,7 +240,6 @@ gl:
         backups_retention_period: Período de retención do arquivo da usuaria
         bootstrap_timeline_accounts: Recomendar sempre estas contas ás novas usuarias
         closed_registrations_message: Mensaxe personalizada para cando o rexistro está pechado
-        content_cache_retention_period: Período de retención da caché do contido
         custom_css: CSS personalizado
         mascot: Mascota propia (herdado)
         media_cache_retention_period: Período de retención da caché multimedia
diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml
index 4f2611666..b07ed8b8b 100644
--- a/config/locales/simple_form.he.yml
+++ b/config/locales/simple_form.he.yml
@@ -77,13 +77,10 @@ he:
           warn: הסתר את התוכן המסונן מאחורי אזהרה עם כותרת המסנן
       form_admin_settings:
         activity_api_enabled: מספר ההודעות שפורסמו מקומית, משתמשים פעילים, והרשמות חדשות בדליים שבועיים
-        backups_retention_period: לשמור ארכיון משתמש שנוצר למשך מספר הימים המצוין.
         bootstrap_timeline_accounts: חשבונות אלו יוצמדו לראש רשימת המלצות המעקב של משתמשים חדשים.
         closed_registrations_message: להציג כאשר הרשמות חדשות אינן מאופשרות
-        content_cache_retention_period: הודעות משרתים אחרים ימחקו אחרי מספר הימים המצוין כאשר מצוין מספר חיובי. פעולה זו אינה הפיכה.
         custom_css: ניתן לבחור ערכות סגנון אישיות בגרסת הדפדפן של מסטודון.
         mascot: בחירת ציור למנשק הווב המתקדם.
-        media_cache_retention_period: קבצי מדיה שהורדו ימחקו אחרי מספר הימים שיצוינו אם נבחר מספר חיובי, או-אז יורדו שוב מחדש בהתאם לצורך.
         peers_api_enabled: רשימת השרתים ששרת זה פגש בפדיוורס. לא כולל מידע לגבי קשר ישיר עם שרת נתון, אלא רק שידוע לשרת זה על קיומו. מידע זה משמש שירותים האוספים סטטיסטיקות כלליות על הפדרציה.
         profile_directory: ספריית הפרופילים מציגה ברשימה את כל המשתמשים שביקשו להיות ניתנים לגילוי.
         require_invite_text: כאשר הרשמות דורשות אישור ידני, הפיכת טקסט ה"מדוע את/ה רוצה להצטרף" להכרחי במקום אופציונלי
@@ -243,7 +240,7 @@ he:
         backups_retention_period: תקופת השמירה של ארכיון המשתמש
         bootstrap_timeline_accounts: המלצה על חשבונות אלה למשתמשים חדשים
         closed_registrations_message: הודעה מיוחדת כשההרשמה לא מאופשרת
-        content_cache_retention_period: תקופת שמירת מטמון תוכן
+        content_cache_retention_period: תקופת השמירה על תוכן חיצוני
         custom_css: CSS בהתאמה אישית
         mascot: סמל השרת (ישן)
         media_cache_retention_period: תקופת שמירת מטמון מדיה
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index 242c86327..e2040cafd 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -77,13 +77,13 @@ hu:
           warn: A szűrt tartalom a szűrő címét említő figyelmeztetés mögé rejtése
       form_admin_settings:
         activity_api_enabled: Helyi bejegyzések, aktív felhasználók és új regisztrációk száma heti bontásban
-        backups_retention_period: Az előállított felhasználói archívumok megtartása a megadott napokig.
+        backups_retention_period: A felhasználók archívumokat állíthatnak elő a bejegyzéseikből, hogy később letöltsék azokat. Ha pozitív értékre van állítva, akkor a megadott számú nap után automatikusan törölve lesznek a tárhelyedről.
         bootstrap_timeline_accounts: Ezek a fiókok ki lesznek tűzve az új felhasználók követési javaslatainak élére.
         closed_registrations_message: Akkor jelenik meg, amikor a regisztráció le van zárva
-        content_cache_retention_period: A más kiszolgálókról származó bejegyzések megadott számú nap után törölve lesznek, ha pozitív értékre van állítva. Ez lehet, hogy nem fordítható vissza.
+        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.
         mascot: Felülbírálja a speciális webes felületen található illusztrációt.
-        media_cache_retention_period: A letöltött médiafájlok megadott számú nap után törölve lesznek, ha pozitív értékre van állítva, és igény szerint újból le lesznek töltve.
+        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.
         peers_api_enabled: Azon domainek listája, melyekkel ez a kiszolgáló találkozott a fediverzumban. Nem csatolunk adatot arról, hogy föderált kapcsolatban vagy-e az adott kiszolgálóval, csak arról, hogy a kiszolgálód tud a másikról. Ezt olyan szolgáltatások használják, melyek általában a föderációról készítenek statisztikákat.
         profile_directory: A profilok jegyzéke minden olyan felhasználót felsorol, akik engedélyezték a felfedezhetőségüket.
         require_invite_text: Ha a regisztrációhoz manuális jóváhagyásra van szükség, akkor a „Miért akarsz csatlakozni?” válasz kitöltése legyen kötelező, és ne opcionális
@@ -243,7 +243,7 @@ hu:
         backups_retention_period: Felhasználói archívum megtartási időszaka
         bootstrap_timeline_accounts: Mindig javasoljuk ezeket a fiókokat az új felhasználók számára
         closed_registrations_message: A feliratkozáskor megjelenő egyéni üzenet nem érhető el
-        content_cache_retention_period: Tartalom-gyorsítótár megtartási időszaka
+        content_cache_retention_period: Távoli tartalmak megtartási időszaka
         custom_css: Egyéni CSS
         mascot: Egyéni kabala (örökölt)
         media_cache_retention_period: Média-gyorsítótár megtartási időszaka
diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml
index 8b9e74406..856f312ed 100644
--- a/config/locales/simple_form.id.yml
+++ b/config/locales/simple_form.id.yml
@@ -63,13 +63,10 @@ id:
           hide: Sembunyikan konten yang disaring, seperti itu tidak ada
           warn: Sembunyikan konten yang disaring di belakang sebuah peringatan menyebutkan judul saringan
       form_admin_settings:
-        backups_retention_period: Simpan arsip pengguna yang dibuat untuk jumlah hari yang ditetapkan.
         bootstrap_timeline_accounts: Akun ini akan disematkan di atas rekomendasi ikut pengguna baru.
         closed_registrations_message: Ditampilkan ketika pendaftaran ditutup
-        content_cache_retention_period: Kiriman dari server lain akan dihapus setelah jumlah hari yang ditentukan jika nilai positif ditetapkan. Ini mungkin tidak dapat diurungkan.
         custom_css: Anda dapat menerapkan gaya kustom di versi web Mastodon.
         mascot: Menimpa ilustrasi di antarmuka web tingkat lanjut.
-        media_cache_retention_period: File media yang diunduh akan dihapus setelah beberapa hari yang ditentukan ketika ditetapkan ke nilai yang positif, dan diunduh ulang pada permintaan.
         profile_directory: Direktori profil mendaftarka semua pengguna yang ingin untuk dapat ditemukan.
         require_invite_text: Ketika pendaftaran membutuhkan persetujuan manual, buat masukan teks "Mengapa Anda ingin bergabung?" dibutuhkan daripada opsional
         site_contact_email: Bagaimana orang dapat menghubungi Anda untuk kebutuhan hukum atau dukungan.
@@ -216,7 +213,6 @@ id:
         backups_retention_period: Rentang retensi arsip pengguna
         bootstrap_timeline_accounts: Selalu rekomendasikan akun ini ke pengguna baru
         closed_registrations_message: Pesan kustom ketika pendaftaran tidak tersedia
-        content_cache_retention_period: Rentang retensi tembolok konten
         custom_css: CSS kustom
         mascot: Maskot kustom (lawas)
         media_cache_retention_period: Rentang retensi tembolok media
diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml
index e142617fc..e482bd828 100644
--- a/config/locales/simple_form.ie.yml
+++ b/config/locales/simple_form.ie.yml
@@ -77,13 +77,10 @@ ie:
           warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre
       form_admin_settings:
         activity_api_enabled: Númeres de postas publicat localmen, activ usatores, e nov adhesiones in periodes semanal
-        backups_retention_period: Mantener usator-generat archives por li specificat quantitá de dies.
         bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores.
         closed_registrations_message: Monstrat quande adhesiones es cludet
-        content_cache_retention_period: Omni postas e boosts de altri servitores va esser deletet pos li specificat quantitá de dies. Quelc postas fórsan va esser ínrestaurabil. Omni pertinent marcatores, favorites e boosts anc va esser perdit e ínpossibil a restaurar.
         custom_css: On posse aplicar customisat stiles al web-version de Mastodon.
         mascot: Substitue li ilustration in li avansat interfacie web.
-        media_cache_retention_period: Descargat files de media va esser deletet pos li specificat quantitá de dies quande li valore es positiv, e re-descargat sur demanda.
         peers_api_enabled: Un liste de nómines de dominia queles ti-ci servitor ha incontrat in li fediverse. Ci null data es includet pri ca tu confedera con un cert servitor o ne; it indica solmen que tui servitor conosse it. Usat per servicies colectent general statisticas pri federation.
         profile_directory: Li profilarium monstra omni usatores volent esser decovribil.
         require_invite_text: Quande registrationes besona manual aprobation, fa que li textu "Pro quo tu vole registrar te?" es obligatori vice facultativ
@@ -243,7 +240,6 @@ ie:
         backups_retention_period: Periode de retener archives de usator
         bootstrap_timeline_accounts: Sempre recomandar ti-ci contos a nov usatores
         closed_registrations_message: Customisat missage quande registration ne disponibil
-        content_cache_retention_period: Periode de retention por cachat contenete
         custom_css: Custom CSS
         mascot: Customisat mascot (hereditat)
         media_cache_retention_period: Periode de retention por cachat medie
diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml
index 57a2aeb64..81f298249 100644
--- a/config/locales/simple_form.io.yml
+++ b/config/locales/simple_form.io.yml
@@ -75,13 +75,10 @@ io:
           warn: Celez filtrita kontenajo dop avert quo montras titulo di filtrilo
       form_admin_settings:
         activity_api_enabled: Quanto de lokale publikigita posti, aktiva uzanti e nova registri, donita semanope
-        backups_retention_period: Retenez igita uzantoarkivi por la diiquanto.
         bootstrap_timeline_accounts: Ca konti pinglagesos a super sequorekomendi di nova uzanti.
         closed_registrations_message: Montresas kande registradi klozesas
-        content_cache_retention_period: Omna posti e repeti de altra servili efacesos pos la specigita nombro de dii. Kelka posti forsan ne esos restaurebla. Omna relata libromarki, favoriziti e repeti anke esos perdita e neposible restaurota.
         custom_css: Vu povas pozar kustumizita staili en retverso di Mastodon.
         mascot: Remplas montreso en avanca retintervizajo.
-        media_cache_retention_period: Deschargita mediifaili efacesos pos la diiquanto kande fixesas a positiva nombro, e rideschargesas irgatempe.
         peers_api_enabled: Listo di domeni quin ca servilo trovis en la fediverso. Nula informo inkluzesas hike pri ka vu federas kun partikulara servilo, nur ke vua servilo savas pri lo. Co es uzata da enti qui kolektas statistiki pri federeso generale.
         profile_directory: La profilcheflisto montras omna uzanti quo voluntale volas esar deskovrebla.
         require_invite_text: Kande registradi bezonas manuala aprobo, ol kauzigas "Por quo vu volas juntas?" textoenpozo esar obliganta
@@ -239,7 +236,6 @@ io:
         backups_retention_period: Uzantoarkivretendurtempo
         bootstrap_timeline_accounts: Sempre rekomendez ca konti a nova uzanti
         closed_registrations_message: Kustumizita mesajo kande registradi ne esas disponebla
-        content_cache_retention_period: Kontenajmemorajretendurtempo
         custom_css: Kustumizita CSS
         mascot: Kustumizita reprezentimajo (oldo)
         media_cache_retention_period: Mediimemorajretendurtempo
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
index cae9bbed5..a2c437a32 100644
--- a/config/locales/simple_form.is.yml
+++ b/config/locales/simple_form.is.yml
@@ -77,13 +77,11 @@ is:
           warn: Fela síað efni á bakvið aðvörun sem tekur fram titil síunnar
       form_admin_settings:
         activity_api_enabled: Fjöldi staðværra stöðufærslna, virkra notenda og nýskráninga í vikulegum skömmtum
-        backups_retention_period: Halda safni notandans í tiltekinn fjölda daga.
+        backups_retention_period: Notendur hafa kost á að útbúa safnskrár með færslunum sínum til að sækja svo síðar. Þegar þetta er stillt á jákvætt gildi, verður þessum safnskrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga.
         bootstrap_timeline_accounts: Þessir notendaaðgangar verða festir efst í meðmælum til nýrra notenda um að fylgjast með þeim.
         closed_registrations_message: Birtist þegar lokað er á nýskráningar
-        content_cache_retention_period: Færslum af öðrum netþjónum verður eytt eftir tiltekinn fjölda daga þegar þetta er jákvætt gildi. Þetta gæti verið óafturkallanleg aðgerð.
         custom_css: Þú getur virkjað sérsniðna stíla í vefútgáfu Mastodon.
         mascot: Þetta tekyr yfir myndskreytinguna í ítarlega vefviðmótinu.
-        media_cache_retention_period: Sóttu myndefni verður eytt eftir tiltekinn fjölda daga þegar þetta er jákvætt gildi og síðan sótt aftur eftir þörfum.
         peers_api_enabled: Listi yfir þau lénaheiti sem þessi netþjónn hefur rekist á í skýjasambandinu. Engin gögn eru hér sem gefa til kynna hvort þú sért í sambandi við tiltekinn netþjón, bara að netþjónninn þinn viti um hann. Þetta er notað af þjónustum sem safna tölfræði um skýjasambönd á almennan hátt.
         profile_directory: Notendamappan telur upp alla þá notendur sem hafa valið að vera uppgötvanlegir.
         require_invite_text: Þegar nýskráningar krefjast handvirks samþykkis, þá skal gera textann í “Hvers vegna viltu taka þátt?” að kröfu en ekki valkvæðan
@@ -243,7 +241,7 @@ is:
         backups_retention_period: Tímalengd sem safni notandans er haldið eftir
         bootstrap_timeline_accounts: Alltaf mæla með þessum notendaaðgöngum fyrir nýja notendur
         closed_registrations_message: Sérsniðin skilaboð þegar ekki er hægt að nýskrá
-        content_cache_retention_period: Tímalengd sem haldið er í biðminni
+        content_cache_retention_period: Tímabil sem á að geyma fjartengt efni
         custom_css: Sérsniðið CSS
         mascot: Sérsniðið gæludýr (eldra)
         media_cache_retention_period: Tímalengd sem myndefni haldið
diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml
index bf294a48c..5c0e6aa4e 100644
--- a/config/locales/simple_form.it.yml
+++ b/config/locales/simple_form.it.yml
@@ -77,13 +77,13 @@ it:
           warn: Nascondi il contenuto filtrato e mostra invece un avviso, citando il titolo del filtro
       form_admin_settings:
         activity_api_enabled: Conteggi di post pubblicati localmente, utenti attivi e nuove registrazioni in gruppi settimanali
-        backups_retention_period: Conserva gli archivi utente generati per il numero di giorni specificato.
+        backups_retention_period: Gli utenti hanno la possibilità di generare archivi dei propri post da scaricare successivamente. Se impostati su un valore positivo, questi archivi verranno automaticamente eliminati dallo spazio di archiviazione dopo il numero di giorni specificato.
         bootstrap_timeline_accounts: Questi account verranno aggiunti in cima ai consigli da seguire dei nuovi utenti.
         closed_registrations_message: Visualizzato alla chiusura delle iscrizioni
-        content_cache_retention_period: I post da altri server verranno eliminati dopo il numero di giorni specificato se impostato su un valore positivo. Questo potrebbe essere irreversibile.
+        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.
         mascot: Sostituisce l'illustrazione nell'interfaccia web avanzata.
-        media_cache_retention_period: I file multimediali scaricati verranno eliminati dopo il numero di giorni specificato se impostati su un valore positivo e scaricati nuovamente su richiesta.
+        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.
         peers_api_enabled: Un elenco di nomi di dominio che questo server ha incontrato nel fediverse. Qui non sono inclusi dati sul fatto se si federano con un dato server, solo che il server ne è a conoscenza. Questo viene utilizzato dai servizi che raccolgono statistiche sulla federazione in senso generale.
         profile_directory: La directory del profilo elenca tutti gli utenti che hanno acconsentito ad essere individuabili.
         require_invite_text: 'Quando le iscrizioni richiedono l''approvazione manuale, rendi la domanda: "Perché vuoi unirti?" obbligatoria anziché facoltativa'
@@ -243,7 +243,7 @@ it:
         backups_retention_period: Periodo di conservazione dell'archivio utente
         bootstrap_timeline_accounts: Consiglia sempre questi account ai nuovi utenti
         closed_registrations_message: Messaggio personalizzato quando le iscrizioni non sono disponibili
-        content_cache_retention_period: Periodo di conservazione della cache dei contenuti
+        content_cache_retention_period: Periodo di ritenzione del contenuto remoto
         custom_css: Personalizza CSS
         mascot: Personalizza mascotte (legacy)
         media_cache_retention_period: Periodo di conservazione della cache multimediale
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 81615c134..5e35bc14c 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -77,13 +77,10 @@ ja:
           warn: フィルタに一致した投稿を非表示にし、フィルタのタイトルを含む警告を表示します
       form_admin_settings:
         activity_api_enabled: 週単位でローカルで公開された投稿数、アクティブユーザー数、新規登録者数を表示します
-        backups_retention_period: 生成されたユーザーのアーカイブを指定した日数の間保持します。
         bootstrap_timeline_accounts: これらのアカウントは、新しいユーザー向けのおすすめユーザーの一番上にピン留めされます。
         closed_registrations_message: アカウント作成を停止している時に表示されます
-        content_cache_retention_period: 指定した日数が経過した他のサーバーの投稿とブーストを削除します。削除された投稿は再取得できない場合があります。削除された投稿についたブックマークやお気に入り、ブーストも失われ、元に戻せません。
         custom_css: ウェブ版のMastodonでカスタムスタイルを適用できます。
         mascot: 上級者向けWebインターフェースのイラストを上書きします。
-        media_cache_retention_period: 正の値に設定されている場合、ダウンロードされたメディアファイルは指定された日数の後に削除され、リクエストに応じて再ダウンロードされます。
         peers_api_enabled: このサーバーが Fediverse で遭遇したドメイン名のリストです。このサーバーが知っているだけで、特定のサーバーと連合しているかのデータは含まれません。これは一般的に Fediverse に関する統計情報を収集するサービスによって使用されます。
         profile_directory: ディレクトリには、掲載する設定をしたすべてのユーザーが一覧表示されます。
         require_invite_text: アカウント登録が承認制の場合、登録の際の申請事由の入力を必須にします
@@ -243,7 +240,6 @@ ja:
         backups_retention_period: ユーザーアーカイブの保持期間
         bootstrap_timeline_accounts: おすすめユーザーに常に表示するアカウント
         closed_registrations_message: アカウント作成を停止している時のカスタムメッセージ
-        content_cache_retention_period: コンテンツキャッシュの保持期間
         custom_css: カスタムCSS
         mascot: カスタムマスコット(レガシー)
         media_cache_retention_period: メディアキャッシュの保持期間
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index 790bcd061..6ab4e0322 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -77,13 +77,10 @@ ko:
           warn: 필터 제목을 언급하는 경고 뒤에 걸러진 내용을 숨기기
       form_admin_settings:
         activity_api_enabled: 주별 로컬에 게시된 글, 활성 사용자 및 새로운 가입자 수
-        backups_retention_period: 생성된 사용자 아카이브를 며칠동안 저장할 지.
         bootstrap_timeline_accounts: 이 계정들은 팔로우 추천 목록 상단에 고정됩니다.
         closed_registrations_message: 새 가입을 차단했을 때 표시됩니다
-        content_cache_retention_period: 다른 서버의 게시물과 부스트들은 지정한 일수가 지나면 삭제될 것입니다. 몇몇 게시물들은 복구가 불가능할 것입니다. 관련된 북마크, 좋아요, 부스트 또한 잃어버릴 것이며 취소도 할 수 없습니다.
         custom_css: 사용자 지정 스타일을 웹 버전의 마스토돈에 지정할 수 있습니다.
         mascot: 고급 웹 인터페이스의 그림을 대체합니다.
-        media_cache_retention_period: 양수로 설정된 경우 다운로드된 미디어 파일들은 지정된 일수가 지나면 삭제될 것이고 필요할 때 다시 다운로드 될 것입니다.
         peers_api_enabled: 이 서버가 연합우주에서 만났던 서버들에 대한 도메인 네임의 목록입니다. 해당 서버와 어떤 연합을 했는지에 대한 정보는 전혀 포함되지 않고, 단순히 그 서버를 알고 있는지에 대한 것입니다. 이것은 일반적으로 연합에 대한 통계를 수집할 때 사용됩니다.
         profile_directory: 프로필 책자는 발견되기를 희망하는 모든 사람들의 목록을 나열합니다.
         require_invite_text: 가입이 수동 승인을 필요로 할 때, "왜 가입하려고 하나요?" 항목을 선택사항으로 두는 것보다는 필수로 두는 것이 낫습니다
@@ -243,7 +240,6 @@ ko:
         backups_retention_period: 사용자 아카이브 유지 기한
         bootstrap_timeline_accounts: 새로운 사용자들에게 추천할 계정들
         closed_registrations_message: 가입이 불가능 할 때의 사용자 지정 메시지
-        content_cache_retention_period: 콘텐츠 캐시 유지 기한
         custom_css: 사용자 정의 CSS
         mascot: 사용자 정의 마스코트 (legacy)
         media_cache_retention_period: 미디어 캐시 유지 기한
diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml
index aa8501bf2..0c4f87213 100644
--- a/config/locales/simple_form.ku.yml
+++ b/config/locales/simple_form.ku.yml
@@ -65,13 +65,10 @@ ku:
           hide: Naveroka parzûnkirî bi tevahî veşêre, mîna ku ew tune be tevbigere
           warn: Naveroka parzûnkirî li pişt hişyariyek ku sernavê parzûnê qal dike veşêre
       form_admin_settings:
-        backups_retention_period: Arşîvên bikarhênerên çêkirî ji bo rojên diyarkirî tomar bike.
         bootstrap_timeline_accounts: Ev ajimêr wê di pêşnîyarên şopandina bikarhênerên nû de werin derzîkirin.
         closed_registrations_message: Dema ku tomarkirin girtî bin têne xuyakirin
-        content_cache_retention_period: Şandiyên ji rajekarên din wê piştî çend rojên diyarkirî dema ku li ser nirxek erênî were danîn werin jêbirin. Dibe ku ev bê veger be.
         custom_css: Tu dikarî awayên kesane li ser guhertoya malperê ya Mastodon bicîh bikî.
         mascot: Îlustrasyona navrûyê webê yê pêşketî bêbandor dike.
-        media_cache_retention_period: Pelên medyayê yên daxistî wê piştî çend rojên diyarkirî dema ku li ser nirxek erênî were danîn werin jêbirin, û li gorî daxwazê ​​ji nû ve werin daxistin.
         profile_directory: Pelrêça profîlê hemû bikarhênerên keşfbûnê hilbijartine lîste dike.
         require_invite_text: Gava ku tomarkirin pêdiviya pejirandina destan dike, Têketina nivîsê "Tu çima dixwazî beşdar bibî?" Bike sereke ji devla vebijêrkî
         site_contact_email: Mirov dikarin ji bo pirsên qanûnî yan jî yên piştgiriyê çawa xwe digihînin te.
@@ -218,7 +215,6 @@ ku:
         backups_retention_period: Serdema tomarkirina arşîva bikarhêner
         bootstrap_timeline_accounts: Van ajimêran ji bikarhênerên nû re pêşniyar bike
         closed_registrations_message: Peyama kesane dema ku tomarkirin peyda nebin
-        content_cache_retention_period: Serdema tomarkirina bîrdanka naverokê
         custom_css: CSS a kesanekirî
         mascot: Mascot a kesanekirî (legacy)
         media_cache_retention_period: Serdema tomarkirina bîrdanka medyayê
diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml
index 75113be18..cef58e460 100644
--- a/config/locales/simple_form.lad.yml
+++ b/config/locales/simple_form.lad.yml
@@ -77,13 +77,10 @@ lad:
           warn: Eskonde el kontenido filtrado detras de una avertensya enmentando el titolo del filtro
       form_admin_settings:
         activity_api_enabled: Numero de publikasyones publikadas lokalmente, utilizadores activos i enrejistrasyones muevas kada semana
-        backups_retention_period: Manten las dosyas de utilizador djeneradas durante el numero de diyas espesifikado.
         bootstrap_timeline_accounts: Estos kuentos apareseran en la parte superior de las rekomendasiones de los muevos utilizadores.
         closed_registrations_message: Amostrado kuando las enrejistrasyones estan serrados
-        content_cache_retention_period: Las publikasyones de otros sirvidores se supremiran dempues del numero espesifikado de diyas kuando se establezka una valuta pozitiva. Esto puede ser irreversivle.
         custom_css: Puedes aplikar estilos personalizados a la version web de Mastodon.
         mascot: Reemplaza la ilustrasyon en la enterfaz web avanzada.
-        media_cache_retention_period: Las dosyas de multimedia abashadas se supremiran dempues del numero espesifikado de diyas kuando se establezka una valuta pozitiva, i se reabasharan basho demanda.
         peers_api_enabled: Una lista de nombres de domeno ke este sirvidor tiene topado en el Fediverso. Aki no se inkluye dingun dato sovre si federas kon un sirvidor determinado, solo ke tu sirvidor lo konese. Esto es utilizado por los servisyos ke rekopilan estatistikas sovre la federasyon en un senso djeneral.
         profile_directory: El katalogo de profiles lista a todos los utilizadores ke tienen optado por ke sus kuento pueda ser deskuvierto.
         require_invite_text: Kuando las enrejistrasyones rekieren achetasyon manuala, faze obligatoria la entrada de teksto "Por ke keres unirte?" en lugar de ser opsyonal
@@ -243,7 +240,6 @@ lad:
         backups_retention_period: Periodo de retensyon de la dosya de utilizador
         bootstrap_timeline_accounts: Rekomenda siempre estos kuentos a muevos utilizadores
         closed_registrations_message: Mesaj personalizado kuando las enrejistrasyones no estan desponivles
-        content_cache_retention_period: Periodo de retensyon de kashe de kontenido
         custom_css: CSS personalizado
         mascot: Maskota personalizada (legado)
         media_cache_retention_period: Periodo de retensyon de kashe multimedia
diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml
index 5431ea1b1..00485fc87 100644
--- a/config/locales/simple_form.lt.yml
+++ b/config/locales/simple_form.lt.yml
@@ -74,7 +74,6 @@ lt:
           warn: Slėpti filtruojamą turinį po įspėjimu, paminint filtro pavadinimą
       form_admin_settings:
         activity_api_enabled: Vietinių paskelbtų įrašų, aktyvių naudotojų ir naujų registracijų skaičiai kas savaitę
-        backups_retention_period: Laikyti sukurtus naudotojų archyvus nurodytą dienų skaičių.
         peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme.
         site_contact_email: Kaip žmonės gali su tavimi susisiekti teisiniais ar pagalbos užklausimais.
         site_contact_username: Kaip žmonės gali tave pasiekti Mastodon.
@@ -146,7 +145,6 @@ lt:
       form_admin_settings:
         activity_api_enabled: Skelbti suvestinį statistiką apie naudotojų veiklą per API
         bootstrap_timeline_accounts: Visada rekomenduoti šias paskyras naujiems naudotojams
-        content_cache_retention_period: Turinio talpyklos išlaikymo laikotarpis
         custom_css: Pasirinktinis CSS
         mascot: Pasirinktinis talismanas (pasenęs)
         registrations_mode: Kas gali užsiregistruoti
diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml
index 002761065..711484b64 100644
--- a/config/locales/simple_form.lv.yml
+++ b/config/locales/simple_form.lv.yml
@@ -77,13 +77,10 @@ lv:
           warn: Paslēp filtrēto saturu aiz brīdinājuma, kurā minēts filtra nosaukums
       form_admin_settings:
         activity_api_enabled: Vietēji publicēto ziņu, aktīvo lietotāju un jauno reģistrāciju skaits nedēļas kopās
-        backups_retention_period: Saglabā ģenerētos lietotāju arhīvus norādīto dienu skaitā.
         bootstrap_timeline_accounts: Šie konti tiks piesprausti jauno lietotāju ieteikumu augšdaļā.
         closed_registrations_message: Tiek rādīts, kad reģistrēšanās ir slēgta
-        content_cache_retention_period: Ziņas no citiem serveriem tiks dzēstas pēc norādītā dienu skaita, ja ir iestatīta pozitīva vērtība. Tas var būt neatgriezeniski.
         custom_css: Vari lietot pielāgotus stilus Mastodon tīmekļa versijā.
         mascot: Ignorē ilustrāciju uzlabotajā tīmekļa saskarnē.
-        media_cache_retention_period: Lejupielādētie multivides faili tiks dzēsti pēc norādītā dienu skaita, kad tie būs iestatīti uz pozitīvu vērtību, un pēc pieprasījuma tiks lejupielādēti atkārtoti.
         peers_api_enabled: Domēna vārdu saraksts, ar kuriem šis serveris ir saskāries fediversā. Šeit nav iekļauti dati par to, vai tu veic federāciju ar noteiktu serveri, tikai tavs serveris par to zina. To izmanto dienesti, kas apkopo statistiku par federāciju vispārīgā nozīmē.
         profile_directory: Profilu direktorijā ir uzskaitīti visi lietotāji, kuri ir izvēlējušies būt atklājami.
         require_invite_text: 'Ja pierakstīšanai nepieciešama manuāla apstiprināšana, izdari tā, lai teksta: “Kāpēc vēlaties pievienoties?” ievade ir obligāta, nevis opcionāla'
@@ -242,7 +239,6 @@ lv:
         backups_retention_period: Lietotāja arhīva glabāšanas periods
         bootstrap_timeline_accounts: Vienmēr iesaki šos kontus jaunajiem lietotājiem
         closed_registrations_message: Pielāgots ziņojums, ja reģistrēšanās nav pieejama
-        content_cache_retention_period: Satura arhīva glabāšanas periods
         custom_css: Pielāgots CSS
         mascot: Pielāgots talismans (mantots)
         media_cache_retention_period: Multivides kešatmiņas saglabāšanas periods
diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml
index 9e9931cc3..ae375149e 100644
--- a/config/locales/simple_form.ms.yml
+++ b/config/locales/simple_form.ms.yml
@@ -75,13 +75,10 @@ ms:
           warn: Sembunyikan kandungan yang ditapis di sebalik amaran yang menyebut tajuk penapis
       form_admin_settings:
         activity_api_enabled: Kiraan siaran tempatan yang diterbitkan, pengguna aktif dan pendaftaran baharu dalam baldi mingguan
-        backups_retention_period: Simpan arkib pengguna yang dijana untuk bilangan hari yang ditentukan.
         bootstrap_timeline_accounts: Akaun ini akan disematkan pada bahagian atas cadangan ikutan pengguna baharu.
         closed_registrations_message: Dipaparkan semasa pendaftaran ditutup
-        content_cache_retention_period: Semua pos dan rangsangan daripada server lain akan dipadamkan selepas bilangan hari yang ditentukan. Sesetengah siaran mungkin tidak boleh dipulihkan. Semua penanda halaman, kegemaran dan rangsangan yang berkaitan juga akan hilang dan mustahil untuk dibuat asal.
         custom_css: Anda boleh menggunakan gaya tersuai pada versi web Mastodon.
         mascot: Mengatasi ilustrasi dalam antara muka web lanjutan.
-        media_cache_retention_period: Fail media yang dimuat turun akan dipadamkan selepas bilangan hari yang ditetapkan apabila ditetapkan kepada nilai positif dan dimuat turun semula atas permintaan.
         peers_api_enabled: Senarai nama domain yang pernah ditemui oleh server ini dalam fediverse. Tiada data disertakan di sini tentang sama ada anda bersekutu dengan server tertentu, cuma server anda mengetahuinya. Ini digunakan oleh perkhidmatan yang mengumpul statistik mengenai persekutuan dalam pengertian umum.
         profile_directory: Direktori profil menyenaraikan semua pengguna yang telah mengikut serta untuk ditemui.
         require_invite_text: Apabila pendaftaran memerlukan kelulusan manual, buat "Mengapa anda mahu menyertai?" input teks wajib dan bukannya pilihan
@@ -240,7 +237,6 @@ ms:
         backups_retention_period: Tempoh pengekalan arkib pengguna
         bootstrap_timeline_accounts: Sentiasa mengesyorkan akaun ini kepada pengguna baharu
         closed_registrations_message: Mesej tersuai apabila pendaftaran tidak tersedia
-        content_cache_retention_period: Tempoh pengekalan cache kandungan
         custom_css: CSS tersuai
         mascot: Maskot tersuai (warisan)
         media_cache_retention_period: Tempoh pengekalan cache media
diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml
index 4f8a39782..20c862ab2 100644
--- a/config/locales/simple_form.my.yml
+++ b/config/locales/simple_form.my.yml
@@ -75,13 +75,10 @@ my:
           warn: စစ်ထုတ်မှုခေါင်းစဉ်ကိုဖော်ပြသည့်သတိပေးချက်နောက်တွင် စစ်ထုတ်ထားသောအကြောင်းအရာကို ဖျောက်ထားပါ
       form_admin_settings:
         activity_api_enabled: အပတ်စဉ် စာရင်းများတွင် ဒေသတွင်းတင်ထားသောပို့စ်များ၊ လက်ရှိအသုံးပြုသူများနှင့် စာရင်းသွင်းမှုအသစ်များ
-        backups_retention_period: သတ်မှတ်ထားသော ရက်အရေအတွက်အလိုက် အသုံးပြုသူမှတ်တမ်းများကို သိမ်းဆည်းပါ။
         bootstrap_timeline_accounts: ဤအကောင့်များကို အသုံးပြုသူအသစ်များ၏ စောင့်ကြည့်မှု အကြံပြုချက်များ၏ထိပ်ဆုံးတွင် ပင်ချိတ်ထားပါမည်။
         closed_registrations_message: အကောင့်ဖွင့်ခြင်းများကို ပိတ်ထားသည့်အခါတွင် ပြသထားသည်
-        content_cache_retention_period: သတ်မှတ်ထားသောရက်များပြီးနောက် အခြားဆာဗာများမှ ပို့စ်များကို ဖျက်လိုက်ပါမည်။ ပြန်လည်ပြင်ဆင်၍မရပါ။
         custom_css: Mastodon ဝဘ်ဗားရှင်းတွင် စိတ်ကြိုက်စတိုင်များကို အသုံးပြုနိုင်ပါသည်။
         mascot: အဆင့်မြင့် ဝဘ်ပုံစံတွင်တွင် ရုပ်ပုံဖြင့်ဖော်ပြထားသည်။
-        media_cache_retention_period: သတ်မှတ်ထားသောရက်များပြီးနောက် ဒေါင်းလုဒ်လုပ်ထားသော မီဒီယာဖိုင်များကို ဖျက်လိုက်ပါမည်။ တောင်းဆိုပါက ပြန်လည်ဒေါင်းလုဒ် လုပ်ခွင့်ရှိသည်။
         peers_api_enabled: ဤဆာဗာမှတွေ့ရသော ဖက်ဒီနယ်ပယ်ပေါင်းစုံရှိ ဒိုမိန်းအမည်များစာရင်း။ ဖက်ဒီနယ်ပယ်များမှာ သင်အသုံးပြုနေသည့်ဆာဗာနှင့် ပေါင်းစပ်ခြင်းရှိသည်ဖြစ်စေ၊ မရှိသည်ဖြစ်စေ ဤနေရာတွင် အချက်အလက်များကို မပြသထားပါ။ ယေဘုယျအားဖြင့် ဖက်ဒရယ်ဆိုင်ရာ စာရင်းအင်းများစုဆောင်းသည့် ဝန်ဆောင်မှုကိုသာ အသုံးပြုထားသည်။
         profile_directory: ပရိုဖိုင်လမ်းညွှန်တွင် ရှာဖွေ‌နိုင်သည့်အသုံးပြုသူအားလုံးကို စာရင်းပြုစုထားသည်။
         require_invite_text: အကောင့်ဖွင့်ရာတွင် လူကိုယ်တိုင်ခွင့်ပြုချက်လိုအပ်သောအခါ “ဘာကြောင့်ပါဝင်ချင်သလဲ” ဟုလုပ်ပါ။ စိတ်ကြိုက်ရွေးချယ်မည့်အစား စာသားထည့်သွင်းရန်မဖြစ်မနေထည့်သွင်းပါ။
@@ -240,7 +237,6 @@ my:
         backups_retention_period: အသုံးပြုသူ၏ မှတ်တမ်းကာလ
         bootstrap_timeline_accounts: ဤအကောင့်များကို အသုံးပြုသူအသစ်များအတွက် အကြံပြုပေးပါ
         closed_registrations_message: အကောင့်ဖွင့်ခြင်းများ မရတော့သောအခါ စိတ်ကြိုက်မက်ဆေ့ချ်ပို့ခြင်း
-        content_cache_retention_period: အကြောင်းအရာ ကက်ရှ်ထိန်းသိမ်းသည့်ကာလ
         custom_css: စိတ်ကြိုက်ပြုလုပ်ထားသော CSS
         mascot: စိတ်ကြိုက်ပြုလုပ်ထားသော mascot (legacy)
         media_cache_retention_period: မီဒီယာကက်ရှ် ထိန်းသိမ်းသည့်ကာလ
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 2f2107b13..3b1005319 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -77,13 +77,13 @@ nl:
           warn: Verberg de gefilterde inhoud achter een waarschuwing, met de titel van het filter als waarschuwingstekst
       form_admin_settings:
         activity_api_enabled: Aantallen lokaal gepubliceerde berichten, actieve gebruikers en nieuwe registraties per week
-        backups_retention_period: De aangemaakte gebruikersarchieven voor het opgegeven aantal dagen behouden.
+        backups_retention_period: Gebruikers hebben de mogelijkheid om archieven van hun berichten te genereren om later te downloaden. Indien ingesteld op een positieve waarde, worden deze archieven automatisch verwijderd uit jouw opslag na het opgegeven aantal dagen.
         bootstrap_timeline_accounts: Deze accounts worden bovenaan de aanbevelingen aan nieuwe gebruikers getoond. Meerdere gebruikersnamen met komma's scheiden.
         closed_registrations_message: Weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld
-        content_cache_retention_period: Alle berichten van andere servers worden na het opgegeven aantal dagen verwijderd. Deze berichten kunnen daarna hoogstwaarschijnlijk niet meer worden hersteld. Alle gerelateerde bladwijzers, favorieten en boosts worden eveneens onomkeerbaar verwijderd.
+        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.
         mascot: Overschrijft de illustratie in de geavanceerde webomgeving.
-        media_cache_retention_period: Mediabestanden die van andere servers zijn gedownload worden na het opgegeven aantal dagen verwijderd en worden op verzoek opnieuw gedownload.
+        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.
         peers_api_enabled: Een lijst met domeinnamen die deze server heeft aangetroffen in de fediverse. Er zijn hier geen gegevens inbegrepen over de vraag of je verbonden bent met een bepaalde server, alleen dat je server er van weet. Dit wordt gebruikt door diensten die statistieken over de federatie in algemene zin verzamelen.
         profile_directory: De gebruikersgids bevat een lijst van alle gebruikers die ervoor gekozen hebben om ontdekt te kunnen worden.
         require_invite_text: Maak het invullen van "Waarom wil je je hier registreren?" verplicht in plaats van optioneel, wanneer registraties handmatig moeten worden goedgekeurd
@@ -243,7 +243,7 @@ nl:
         backups_retention_period: Bewaartermijn gebruikersarchief
         bootstrap_timeline_accounts: Accounts die altijd aan nieuwe gebruikers worden aanbevolen
         closed_registrations_message: Aangepast bericht wanneer registratie is uitgeschakeld
-        content_cache_retention_period: Bewaartermijn berichtencache
+        content_cache_retention_period: Bewaartermijn voor externe inhoud
         custom_css: Aangepaste CSS
         mascot: Aangepaste mascotte (legacy)
         media_cache_retention_period: Bewaartermijn mediacache
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index a9f5f609f..51dce245d 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -77,13 +77,13 @@ nn:
           warn: Skjul det filtrerte innhaldet bak ei åtvaring som nemner tittelen på filteret
       form_admin_settings:
         activity_api_enabled: Tal på lokale innlegg, aktive brukarar og nyregistreringar kvar veke
-        backups_retention_period: Ta vare på genererte brukararkiv i angitt antal dagar.
+        backups_retention_period: Brukarar har moglegheit til å generere arkiv av sine innlegg for å laste ned seinare. Når sett til ein positiv verdi, blir desse arkiva automatisk sletta frå lagringa etter eit gitt antal dagar.
         bootstrap_timeline_accounts: Desse kontoane vil bli festa øverst på fylgjaranbefalingane til nye brukarar.
         closed_registrations_message: Vist når det er stengt for registrering
-        content_cache_retention_period: Innlegg frå andre tenarar vil bli sletta etter det angitte talet på dagar når det er sett til ein positiv verdi. Dette kan vera irreversibelt.
+        content_cache_retention_period: Alle innlegg frå andre serverar (inkludert boostar og svar) vil bli sletta etter dei gitte antal dagar, uten hensyn til lokale brukarinteraksjonar med desse innlegga. Dette inkluderer innlegg der ein lokal brukar har merka det som bokmerker eller som favorittar. Òg private nemningar mellom brukarar frå ulike førekomstar vil gå tapt og vere umogleg å gjenskape. Bruk av denne innstillinga er rekna på spesielle førekomstar og bryt mange brukarforventingar når dette blir tatt i generell bruk.
         custom_css: Du kan bruka eigendefinerte stilar på nettversjonen av Mastodon.
         mascot: Overstyrer illustrasjonen i det avanserte webgrensesnittet.
-        media_cache_retention_period: Mediafiler som har blitt lasta ned vil bli sletta etter det angitte talet på dagar når det er sett til ein positiv verdi, og lasta ned på nytt ved etterspørsel.
+        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.
         peers_api_enabled: Ei liste over domenenamn denne tenaren har møtt på i allheimen. Det står ingenting om tenaren din samhandlar med ein annan tenar, berre om tenaren din veit om den andre. Dette blir brukt av tenester som samlar statistikk om føderering i det heile.
         profile_directory: Profilkatalogen viser alle brukarar som har valt å kunne bli oppdaga.
         require_invite_text: Når registrering krev manuell godkjenning, lyt du gjera tekstfeltet "Kvifor vil du bli med?" obligatorisk i staden for valfritt
@@ -243,7 +243,7 @@ nn:
         backups_retention_period: Arkiveringsperiode for brukararkiv
         bootstrap_timeline_accounts: Tilrå alltid desse kontoane for nye brukarar
         closed_registrations_message: Eigendefinert melding når registrering ikkje er mogleg
-        content_cache_retention_period: Oppbevaringsperiode for innhaldsbuffer
+        content_cache_retention_period: Oppbevaringstid for eksternt innhald
         custom_css: Egendefinert CSS
         mascot: Eigendefinert maskot (eldre funksjon)
         media_cache_retention_period: Oppbevaringsperiode for mediebuffer
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
index a1050c9f9..de3788aa4 100644
--- a/config/locales/simple_form.no.yml
+++ b/config/locales/simple_form.no.yml
@@ -77,13 +77,10 @@
           warn: Skjul det filtrerte innholdet bak et varsel som omtaler filterets tittel
       form_admin_settings:
         activity_api_enabled: Teller med lokale publiserte innlegg, aktive brukere og nye registreringer i ukentlige bøtter
-        backups_retention_period: Behold genererte brukerarkiv i det angitte antall dager.
         bootstrap_timeline_accounts: Disse kontoene vil bli festet til toppen av nye brukeres følge-anbefalinger.
         closed_registrations_message: Vises når det er stengt for registrering
-        content_cache_retention_period: Innlegg fra andre tjenere vil slettes etter det angitte antall dager når det er satt til en positiv verdi. Dette kan være irreversibelt.
         custom_css: Du kan bruke egendefinerte stiler på nettversjonen av Mastodon.
         mascot: Overstyrer illustrasjonen i det avanserte webgrensesnittet.
-        media_cache_retention_period: Mediafiler som lastes ned vil bli slettet etter det angitte antall dager når det settes til en positiv verdi, og blir lastet ned på nytt ved behov.
         peers_api_enabled: En liste over domenenavn denne serveren har oppstått i fødiverset. Det finnes ikke data om du føderer med en gitt server, for akkurat det serveren din vet om. Dette brukes av tjenester som i all hovedsak innhenter føderasjonsstatistikk.
         profile_directory: Profilkatalogen viser alle brukere som har valgt å kunne bli oppdaget.
         require_invite_text: Når registreringer krever manuell godkjenning, må du gjøre «Hvorfor vil du bli med?»-tekstinput obligatorisk i stedet for valgfritt
@@ -242,7 +239,6 @@
         backups_retention_period: Brukers oppbevaringsperiode for arkiv
         bootstrap_timeline_accounts: Anbefaler alltid disse kontoene til nye brukere
         closed_registrations_message: Egendefinert melding når registrering ikke er tilgjengelig
-        content_cache_retention_period: Oppbevaringsperiode for innholdsbuffer
         custom_css: Egendefinert CSS
         mascot: Egendefinert maskot (legacy)
         media_cache_retention_period: Oppbevaringsperiode for mediebuffer
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 3a1c619f7..5c0c64028 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -77,13 +77,13 @@ pl:
           warn: Ukryj filtrowaną zawartość za ostrzeżeniem wskazującym tytuł filtra
       form_admin_settings:
         activity_api_enabled: Liczby opublikowanych lokalnych postów, aktywnych użytkowników i nowych rejestracji w tygodniowych przedziałach
-        backups_retention_period: Zachowaj wygenerowane archiwa użytkownika przez określoną liczbę dni.
+        backups_retention_period: Użytkownicy mogą generować archiwa wpisów do późniejszego pobrania. Jeżeli ta wartość jest dodatnia, te archiwa zostaną automatycznie usunięte z twojego serwera po danej liczbie dni.
         bootstrap_timeline_accounts: Te konta zostaną przypięte na górze rekomendacji obserwacji nowych użytkowników.
         closed_registrations_message: Wyświetlane po zamknięciu rejestracji
-        content_cache_retention_period: Posty z innych serwerów zostaną usunięte po określonej liczbie dni, kiedy liczba jest ustawiona na wartość dodatnią. Może to być nieodwracalne.
+        content_cache_retention_period: Wszystkie wpisy z innych serwerów (w tym podbicia i odpowiedzi) zostaną usunięte po danej liczbie dni, bez względu na interakcje z nimi twoich użytkowników. Zawierają się w tym wpisy, które twoi użytkownicy dodali do zakładek lub ulubionych. Prywatne wzmianki od innych instancji zostaną utracone i będą nieprzywracalne. To ustawienie jest przeznaczone dla instancji zastosowania specjalnego i jest niezgodne z wieloma oczekiwaniami użytkowników.
         custom_css: Możesz zastosować niestandardowe style w internetowej wersji Mastodon.
         mascot: Nadpisuje ilustrację w zaawansowanym interfejsie internetowym.
-        media_cache_retention_period: Pobrane pliki multimedialne zostaną usunięte po określonej liczbie dni po ustawieniu na wartość dodatnią i ponownie pobrane na żądanie.
+        media_cache_retention_period: Media z wpisów od obcych użytkowników są cache'owane na twoim serwerze. Kiedy dana wartość jest dodatnia, media te będą usunięte po tylu dniach. Jeżeli usunięte media zostaną potem zażądane, oryginał zostanie ponownie pobrany (o ile jest dalej dostępny). Z powodu ograniczeń dot. częstotliwości z jaką karty podglądu linków dopytują się o dane od stron trzecich, zalecana wartość to min. 14 dni, bo karty podglądu linków nie będą wcześniej odświeżane na żądane.
         peers_api_enabled: Lista nazw domen, z którymi ten serwer spotkał się w fediverse. Nie są tu zawarte żadne dane o tym, czy użytkownik dokonuje federacji z danym serwerem, a jedynie, że jego serwer o tym wie. Jest to wykorzystywane przez serwisy, które zbierają statystyki dotyczące federacji w ogólnym sensie.
         profile_directory: Katalog profili zawiera listę wszystkich użytkowników, którzy zgodzili się na bycie znalezionymi.
         require_invite_text: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne
@@ -243,7 +243,7 @@ pl:
         backups_retention_period: Okres przechowywania archiwum użytkownika
         bootstrap_timeline_accounts: Zawsze rekomenduj te konta nowym użytkownikom
         closed_registrations_message: Niestandardowa wiadomość, gdy rejestracje nie są dostępne
-        content_cache_retention_period: Okres przechowywania pamięci podręcznej
+        content_cache_retention_period: Okres zachowywania zdalnych treści
         custom_css: Niestandardowy CSS
         mascot: Własna ikona
         media_cache_retention_period: Okres przechowywania pamięci podręcznej
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index c3eea9f11..f68eef8a6 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -77,13 +77,10 @@ pt-BR:
           warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro
       form_admin_settings:
         activity_api_enabled: Contagem de publicações locais, usuários ativos e novos usuários semanais
-        backups_retention_period: Manter os arquivos de usuário gerados pelo número de dias especificados.
         bootstrap_timeline_accounts: Estas contas serão fixadas no topo das recomendações de novos usuários para seguir.
         closed_registrations_message: Exibido quando as inscrições estiverem fechadas
-        content_cache_retention_period: Postagens de outros servidores serão excluídas após o número de dias especificados, quando definido com um valor positivo. Isso pode ser irreversível.
         custom_css: Você pode aplicar estilos personalizados na versão da web do Mastodon.
         mascot: Substitui a ilustração na interface web avançada.
-        media_cache_retention_period: Os arquivos de mídia baixados serão excluídos após o número especificado de dias, quando definido para um valor positivo, e baixados novamente na demanda.
         peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no "fediverse". Nenhum dado é incluído aqui sobre se você concorda com os padroes operacionais de um determinado servidor, apenas que o seu servidor sabe disso. Esta ferramenta é utilizado por serviços que recolhem estatísticas sob as normas da federação (grupo de empresas que concordam sob paramentros operacionais específicos), em termos gerais.
         profile_directory: O diretório de perfis lista todos os usuários que optaram por permitir que suas contas sejam descobertas.
         require_invite_text: 'Quando o cadastro de novas contas exigir aprovação manual, tornar obrigatório, ao invés de opcional, o texto de solicitação de convite: "Por que você deseja ingressar nessa comunidade?"'
@@ -243,7 +240,6 @@ pt-BR:
         backups_retention_period: Período de retenção do arquivo de usuário
         bootstrap_timeline_accounts: Sempre recomendar essas contas para novos usuários
         closed_registrations_message: Mensagem personalizada quando inscrições não estão disponíveis
-        content_cache_retention_period: Período de retenção do cachê de conteúdo
         custom_css: CSS personalizável
         mascot: Mascote personalizado (legado)
         media_cache_retention_period: Período de retenção do cachê de mídia
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index a84f97f88..3292c4828 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -77,13 +77,10 @@ pt-PT:
           warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro
       form_admin_settings:
         activity_api_enabled: Contagem, em blocos semanais, de publicações locais, utilizadores ativos e novos registos
-        backups_retention_period: Manter os ficheiros gerados pelos utilizadores durante um número concreto de dias.
         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: Publicações de outros servidores serão apagadas decorrido o número de dias especificado, se estiver definido um valor positivo. Isso pode ser irreversível.
         custom_css: Pode aplicar estilos personalizados na versão web do Mastodon.
         mascot: Sobrepõe-se à ilustração na interface web avançada.
-        media_cache_retention_period: Os ficheiros de media descarregados serão apagados decorrido o número de dias especificado, quando definido com um valor positivo, e descarregados novamente quando solicitados.
         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.
         require_invite_text: Quando as incrições exigirem aprovação manual, faça o texto "Por que se quer juntar a nós?" da solicitação de convite ser obrigatório, em vez de opcional
@@ -243,7 +240,6 @@ pt-PT:
         backups_retention_period: Período de retenção de arquivos de utilizador
         bootstrap_timeline_accounts: Recomendar sempre estas contas para novos utilizadores
         closed_registrations_message: Mensagem personalizada quando as inscrições não estiverem disponíveis
-        content_cache_retention_period: Período de retenção de conteúdo em cache
         custom_css: CSS personalizado
         mascot: Mascote personalizada (legado)
         media_cache_retention_period: Período de retenção de ficheiros de media em cache
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index 192a2f96d..a050b5a52 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -75,13 +75,10 @@ ru:
           warn: Скрыть отфильтрованный контент за предупреждением с указанием названия фильтра
       form_admin_settings:
         activity_api_enabled: Подсчёт количества локальных постов, активных пользователей и новых регистраций на еженедельной основе
-        backups_retention_period: Сохранять сгенерированные пользовательские архивы для указанного количества дней.
         bootstrap_timeline_accounts: Эти аккаунты будут рекомендованы для подписки новым пользователям.
         closed_registrations_message: Отображается, когда регистрация закрыта
-        content_cache_retention_period: Записи с других серверов будут удалены после указанного количества дней, когда установлено положительное значение. Это может быть необратимо.
         custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon.
         mascot: Заменяет иллюстрацию в расширенном веб-интерфейсе.
-        media_cache_retention_period: Скачанные медиа-файлы будут удалены после указанного количества дней, когда установлено положительное значение и повторно загружены по требованию.
         peers_api_enabled: Список доменных имен, с которыми сервер столкнулся в fediverse. Здесь нет данных о том, федерировались ли вы с данным сервером, только что ваш сервер знает об этом. Это используется службами, которые собирают статистику по федерации в общем смысле.
         profile_directory: В каталоге профилей перечислены все пользователи, которые согласились быть доступными для обнаружения.
         require_invite_text: Когда регистрация требует ручного одобрения, сделайте текстовый ввод "Почему вы хотите присоединиться?" обязательным, а не опциональным
@@ -240,7 +237,6 @@ ru:
         backups_retention_period: Период хранения архива пользователя
         bootstrap_timeline_accounts: Всегда рекомендовать эти учетные записи новым пользователям
         closed_registrations_message: Сообщение, когда регистрация недоступна
-        content_cache_retention_period: Период хранения кэша содержимого
         custom_css: Пользовательский CSS
         mascot: Пользовательский маскот (устаревшее)
         media_cache_retention_period: Период хранения кэша медиафайлов
diff --git a/config/locales/simple_form.sco.yml b/config/locales/simple_form.sco.yml
index 7eeaca375..f9dc4ba29 100644
--- a/config/locales/simple_form.sco.yml
+++ b/config/locales/simple_form.sco.yml
@@ -63,13 +63,10 @@ sco:
           hide: Totally plank the filtert content, ackin as if it didnae exist
           warn: Plank the filtert content ahin a warnin menshiein the filter's title
       form_admin_settings:
-        backups_retention_period: Haud generatit uiser archives fir the specified nummer o days.
         bootstrap_timeline_accounts: Thir accoonts wull get preenit tae the tap o new uisers' follae recommendations.
         closed_registrations_message: Displayit whan sign-ups is shut
-        content_cache_retention_period: Posts fae ither servers wull get deletit efter the specified nummer o days whan set tae a positive value. This wull mibbie be irreversible.
         custom_css: Ye kin pit custom styles on tae the web version o Mastodon.
         mascot: Owerrides the illustration in the advanced web interface.
-        media_cache_retention_period: Doonloadit media files wull be deletit efter the specified nummer o days whan set tae a positive value, an re-doonloadit on demand.
         profile_directory: The profile directory lists aw uisers thit hae opted-in fir tae be discoverable.
         require_invite_text: Whan sign-ups require approval bi haun, mak the “Hou dae ye want tae jyne?” text input mandatory raither nor optional
         site_contact_email: Hou fowk kin reach ye fir legal or support inquiries.
@@ -216,7 +213,6 @@ sco:
         backups_retention_period: Uiser archive retention period
         bootstrap_timeline_accounts: Aye recommend thir accoonts tae new uisers
         closed_registrations_message: Custom message whan sign-ups urnae available
-        content_cache_retention_period: Content cache retention period
         custom_css: Custom CSS
         mascot: Custom mascot (legacy)
         media_cache_retention_period: Media cache retention period
diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml
index cbf057018..a4abb737c 100644
--- a/config/locales/simple_form.sl.yml
+++ b/config/locales/simple_form.sl.yml
@@ -77,13 +77,10 @@ sl:
           warn: Skrij filtrirano vsebino za opozorilom, ki pomenja naslov filtra
       form_admin_settings:
         activity_api_enabled: Številke krajevno objavljenih objav, dejavnih uporabnikov in novih registracij na tedenskih seznamih
-        backups_retention_period: Hani tvorjene arhive uporabnikov navedeno število dni.
         bootstrap_timeline_accounts: Ti računi bodo pripeti na vrh priporočenih sledenj za nove uporabnike.
         closed_registrations_message: Prikazano, ko so registracije zaprte
-        content_cache_retention_period: Objave z drugih strežnikov bodo izbrisane po navedenem številu dni, če je vrednost pozitivna. Ta dejanja lahko nepovratna.
         custom_css: Spletni različici Mastodona lahko uveljavite sloge po meri.
         mascot: Preglasi ilustracijo v naprednem spletnem vmesniku.
-        media_cache_retention_period: Prenesene predstavnostne datoteke bodo izbrisane po navedenem številu dni, če je vrednost pozitivna, in ponovno prenesene na zahtevo.
         peers_api_enabled: Seznam imen domen, na katere je ta strežnik naletel v fediverzumu. Sem niso vključeni podatki o tem, ali ste v federaciji z danim strežnikom, zgolj to, ali vaš strežnik ve zanj. To uporabljajo storitve, ki zbirajo statistične podatke o federaciji v splošnem smislu.
         profile_directory: Imenik profilov izpiše vse uporabnike, ki so dovolili, da so v njem navedeni.
         require_invite_text: Če registracije zahtevajo ročno potrditev, nastavite vnos besedila pod »Zakaj se želite pridružiti?« za obveznega.
@@ -243,7 +240,6 @@ sl:
         backups_retention_period: Obdobje hrambe arhivov uporabnikov
         bootstrap_timeline_accounts: Vedno priporočaj te račune novim uporabnikom
         closed_registrations_message: Sporočilo po meri, ko registracije niso na voljo
-        content_cache_retention_period: Obdobje hrambe predpomnilnika vsebine
         custom_css: CSS po meri
         mascot: Maskota po meri (opuščeno)
         media_cache_retention_period: Obdobje hrambe predpomnilnika predstavnosti
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index 41ee3d9bd..a6c930338 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -77,13 +77,10 @@ sq:
           warn: Fshihe lëndën e filtruar pas një sinjalizimi që përmend titullin e filtrit
       form_admin_settings:
         activity_api_enabled: Numër postimesh të botuar lokalisht, përdoruesish aktiv dhe regjistrimesh të reja sipas matjesh javore
-        backups_retention_period: Mbaji arkivat e prodhuara të përdoruesve për aq ditë sa numri i dhënë.
         bootstrap_timeline_accounts: Këto llogari do të fiksohen në krye të rekomandimeve për ndjekje nga përdorues të rinj.
         closed_registrations_message: Shfaqur kur mbyllen dritare regjistrimesh
-        content_cache_retention_period: Postimet prej shërbyesve të tjerë do të fshihen pas numrit të dhënë të ditëve, kur këtij i jepet një vlerë pozitive. Kjo mund të jetë e pakthyeshme.
         custom_css: Stile vetjakë mund të aplikoni në versionin web të Mastodon-it.
         mascot: Anashkalon ilustrimin te ndërfaqja web e thelluar.
-        media_cache_retention_period: Kartelat media të shkarkuara do të fshihen pas numrit të dhënë të ditëve, kur këtij i jepet një vlerë pozitive dhe rishkarkohen po u kërkua.
         peers_api_enabled: Një listë emrash përkatësish që ky shërbyes ka hasur në fedivers. Këtu s’jepen të dhëna nëse jeni i federuar me shërbyesin e dhënë, thjesht tregohet se shërbyesi juaj e njeh. Kjo përdoret nga shërbime që mbledhin statistika mbi federimin në kuptimin e përgjithshëm.
         profile_directory: Drejtoria e profileve paraqet krejt përdoruesit që kanë zgjedhur të jenë të zbulueshëm.
         require_invite_text: Kur regjistrimet lypin miratim dorazi, bëje tekstin “Përse doni të bëheni pjesë?” të detyrueshëm, në vend se opsional
@@ -243,7 +240,6 @@ sq:
         backups_retention_period: Periudhë mbajtjeje arkivash përdoruesish
         bootstrap_timeline_accounts: Rekomandoju përherë këto llogari përdoruesve të rinj
         closed_registrations_message: Mesazh vetjak për pamundësi regjistrimesh të reja
-        content_cache_retention_period: Periudhë mbajtjeje lënde fshehtine
         custom_css: CSS Vetjake
         mascot: Simbol vetjak (e dikurshme)
         media_cache_retention_period: Periudhë mbajtjeje lënde media
diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml
index 13296a04c..bc4eafb96 100644
--- a/config/locales/simple_form.sr-Latn.yml
+++ b/config/locales/simple_form.sr-Latn.yml
@@ -77,13 +77,10 @@ sr-Latn:
           warn: Sakrij filtrirani sadržaj iza upozorenja u kome se navodi naziv filtera
       form_admin_settings:
         activity_api_enabled: Brojevi lokalno postavljenih objava, aktivnih korisnika i novih registracija na nedeljnoj bazi
-        backups_retention_period: Čuvaj generisane korisničke arhive navedeni broj dana.
         bootstrap_timeline_accounts: Ovi nalozi će biti zakačeni na vrh preporuka za praćenje novih korisnika.
         closed_registrations_message: Prikazuje se kada su registracije zatvorene
-        content_cache_retention_period: Sve objave i podržavanja sa drugih servera će biti izbrisani nakon navedenog broja dana. Neke objave se možda neće moći oporaviti. Svi povezani obeleživači, omiljeni i podržavanja će takođe biti izgubljeni i nemoguće je opozvati radnju.
         custom_css: Možete da primenite prilagođene stilove na veb verziji Mastodon-a.
         mascot: Zamenjuje ilustraciju u naprednom veb okruženju.
-        media_cache_retention_period: Kada se postavi na pozitivnu vrednost, preuzete medijske datoteke će biti izbrisane nakon navedenog broja dana, i ponovo preuzete na zahtev.
         peers_api_enabled: Lista domena sa kojima se ovaj server susreo u fediverzumu. Ovde nisu sadržani podaci o tome da li se Vaš server federiše sa drugim serverima, već samo da Vaš server zna za njih. Ove informacije koriste servisi koji prikupljaju podatke i vode statistiku o federaciji u širem smislu.
         profile_directory: Direktorijum profila navodi sve korisnike koji su se opredelili da budu vidljivi.
         require_invite_text: Kada registracije zahtevaju ručno odobrenje, postavite da odgovor na „Zašto želite da se pridružite?“ bude obavezan, a ne opcionalan
@@ -243,7 +240,6 @@ sr-Latn:
         backups_retention_period: Period čuvanja korisničke arhive
         bootstrap_timeline_accounts: Uvek preporuči ove naloge novim korisnicima
         closed_registrations_message: Prilagođena poruka kada prijave nisu moguće
-        content_cache_retention_period: Period čuvanja keša sadržaja
         custom_css: Prilagođeni CSS
         mascot: Prilagođena maskota (nasleđe)
         media_cache_retention_period: Period čuvanja keša medija
diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml
index 982048218..006f4cf6d 100644
--- a/config/locales/simple_form.sr.yml
+++ b/config/locales/simple_form.sr.yml
@@ -77,13 +77,10 @@ sr:
           warn: Сакриј филтрирани садржај иза упозорења у коме се наводи назив филтера
       form_admin_settings:
         activity_api_enabled: Бројеви локално постављених објава, активних корисника и нових регистрација на недељној бази
-        backups_retention_period: Чувај генерисане корисничке архиве наведени број дана.
         bootstrap_timeline_accounts: Ови налози ће бити закачени на врх препорука за праћење нових корисника.
         closed_registrations_message: Приказује се када су регистрације затворене
-        content_cache_retention_period: Све објаве и подржавања са других сервера ће бити избрисани након наведеног броја дана. Неке објаве се можда неће моћи опоравити. Сви повезани обележивачи, омиљени и подржавања ће такође бити изгубљени и немогуће је опозвати радњу.
         custom_css: Можете да примените прилагођене стилове на веб верзији Mastodon-а.
         mascot: Замењује илустрацију у напредном веб окружењу.
-        media_cache_retention_period: Када се постави на позитивну вредност, преузете медијске датотеке ће бити избрисане након наведеног броја дана, и поново преузете на захтев.
         peers_api_enabled: Листа домена са којима се овај сервер сусрео у федиверзуму. Овде нису садржани подаци о томе да ли се Ваш сервер федерише са другим серверима, већ само да Ваш сервер зна за њих. Ове информације користе сервиси који прикупљају податке и воде статистику о федерацији у ширем смислу.
         profile_directory: Директоријум профила наводи све кориснике који су се определили да буду видљиви.
         require_invite_text: Када регистрације захтевају ручно одобрење, поставите да одговор на „Зашто желите да се придружите?“ буде обавезан, а не опционалан
@@ -243,7 +240,6 @@ sr:
         backups_retention_period: Период чувања корисничке архиве
         bootstrap_timeline_accounts: Увек препоручи ове налоге новим корисницима
         closed_registrations_message: Прилагођена порука када пријаве нису могуће
-        content_cache_retention_period: Период чувања кеша садржаја
         custom_css: Прилагођени CSS
         mascot: Прилагођена маскота (наслеђе)
         media_cache_retention_period: Период чувања кеша медија
diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml
index 37372cac2..3ab16bf69 100644
--- a/config/locales/simple_form.sv.yml
+++ b/config/locales/simple_form.sv.yml
@@ -77,13 +77,10 @@ sv:
           warn: Dölj det filtrerade innehållet bakom en varning som visar filtrets rubrik
       form_admin_settings:
         activity_api_enabled: Antalet lokalt publicerade inlägg, aktiva användare och nya registrerade konton per vecka
-        backups_retention_period: Behåll genererade användararkiv i det angivna antalet dagar.
         bootstrap_timeline_accounts: Dessa konton kommer fästas högst upp i nya användares följrekommendationer.
         closed_registrations_message: Visas när nyregistreringar är avstängda
-        content_cache_retention_period: Inlägg från andra servrar kommer att raderas efter det angivna antalet dagar när detta är inställt på ett positivt värde. Åtgärden kan vara oåterkallelig.
         custom_css: Du kan använda anpassade stilar på webbversionen av Mastodon.
         mascot: Åsidosätter illustrationen i det avancerade webbgränssnittet.
-        media_cache_retention_period: Nedladdade mediefiler kommer raderas efter det angivna antalet dagar, om inställt till ett positivt värde, och laddas ned på nytt vid behov.
         peers_api_enabled: En lista över domänen den här servern har stött på i fediversum. Ingen data inkluderas om du har federerat med servern, bara att din server känner till den. Detta används av tjänster som samlar statistik om federering i allmänhet.
         profile_directory: Profilkatalogen visar alla användare som har samtyckt till att bli upptäckbara.
         require_invite_text: Gör fältet "Varför vill du gå med?" obligatoriskt när nyregistreringar kräver manuellt godkännande
@@ -243,7 +240,6 @@ sv:
         backups_retention_period: Lagringsperiod för användararkivet
         bootstrap_timeline_accounts: Rekommendera alltid dessa konton till nya användare
         closed_registrations_message: Anpassat meddelande när nyregistreringar inte är tillgängliga
-        content_cache_retention_period: Tid för bibehållande av innehållscache
         custom_css: Anpassad CSS
         mascot: Anpassad maskot (tekniskt arv)
         media_cache_retention_period: Tid för bibehållande av mediecache
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index b41cf0bea..bfc2d2e6b 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -77,13 +77,10 @@ th:
           warn: ซ่อนเนื้อหาที่กรองอยู่หลังคำเตือนที่กล่าวถึงชื่อเรื่องของตัวกรอง
       form_admin_settings:
         activity_api_enabled: จำนวนโพสต์ที่เผยแพร่ในเซิร์ฟเวอร์, ผู้ใช้ที่ใช้งานอยู่ และการลงทะเบียนใหม่ในบักเก็ตรายสัปดาห์
-        backups_retention_period: เก็บการเก็บถาวรผู้ใช้ที่สร้างขึ้นตามจำนวนวันที่ระบุ
         bootstrap_timeline_accounts: จะปักหมุดบัญชีเหล่านี้ไว้ด้านบนสุดของคำแนะนำการติดตามของผู้ใช้ใหม่
         closed_registrations_message: แสดงเมื่อมีการปิดการลงทะเบียน
-        content_cache_retention_period: จะลบโพสต์และการดันทั้งหมดจากเซิร์ฟเวอร์อื่น ๆ หลังจากจำนวนวันที่ระบุ โพสต์บางส่วนอาจไม่สามารถกู้คืนได้ ที่คั่นหน้า, รายการโปรด และการดันที่เกี่ยวข้องทั้งหมดจะสูญหายและไม่สามารถเลิกทำได้เช่นกัน
         custom_css: คุณสามารถนำไปใช้ลักษณะที่กำหนดเองใน Mastodon รุ่นเว็บ
         mascot: เขียนทับภาพประกอบในส่วนติดต่อเว็บขั้นสูง
-        media_cache_retention_period: จะลบไฟล์สื่อที่ดาวน์โหลดหลังจากจำนวนวันที่ระบุเมื่อตั้งเป็นค่าบวก และดาวน์โหลดใหม่ตามความต้องการ
         peers_api_enabled: รายการชื่อโดเมนที่เซิร์ฟเวอร์นี้พบในจักรวาลสหพันธ์ ไม่มีข้อมูลรวมอยู่ที่นี่เกี่ยวกับว่าคุณติดต่อกับเซิร์ฟเวอร์ที่กำหนดหรือไม่ เพียงแค่ว่าเซิร์ฟเวอร์ของคุณทราบเกี่ยวกับเซิร์ฟเวอร์ที่กำหนด มีการใช้สิ่งนี้โดยบริการที่เก็บรวบรวมสถิติในการติดต่อกับภายนอกในความหมายทั่วไป
         profile_directory: ไดเรกทอรีโปรไฟล์แสดงรายการผู้ใช้ทั้งหมดที่ได้เลือกรับให้สามารถค้นพบได้
         require_invite_text: เมื่อการลงทะเบียนต้องการการอนุมัติด้วยตนเอง ทำให้การป้อนข้อความ “ทำไมคุณจึงต้องการเข้าร่วม?” บังคับแทนที่จะไม่จำเป็น
@@ -243,7 +240,7 @@ th:
         backups_retention_period: ระยะเวลาการเก็บรักษาการเก็บถาวรผู้ใช้
         bootstrap_timeline_accounts: แนะนำบัญชีเหล่านี้ให้กับผู้ใช้ใหม่เสมอ
         closed_registrations_message: ข้อความที่กำหนดเองเมื่อการลงทะเบียนไม่พร้อมใช้งาน
-        content_cache_retention_period: ระยะเวลาการเก็บรักษาแคชเนื้อหา
+        content_cache_retention_period: ระยะเวลาการเก็บรักษาเนื้อหาระยะไกล
         custom_css: CSS ที่กำหนดเอง
         mascot: มาสคอตที่กำหนดเอง (ดั้งเดิม)
         media_cache_retention_period: ระยะเวลาการเก็บรักษาแคชสื่อ
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 758d1dc4d..4ec35f102 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -77,13 +77,13 @@ tr:
           warn: Süzgeçlenmiş içeriği, süzgecinin başlığından söz eden bir uyarının arkasında gizle
       form_admin_settings:
         activity_api_enabled: Yerel olarak yayınlanan gönderi, etkin kullanıcı ve yeni kayıtların haftalık sayıları
-        backups_retention_period: Üretilen kullanıcı arşivlerini belirli gün sayısı kadar sakla.
+        backups_retention_period: Kullanıcılar, gönderilerinin arşivlerini daha sonra indirmek üzere oluşturabilirler. Pozitif bir değer verdilğinde bu arşivler verilmiş olan gün sonunda deponuzdan otomatik olarak silinecektir.
         bootstrap_timeline_accounts: Bu hesaplar, yeni kullanıcıların takip önerilerinin tepesinde sabitlenecektir.
         closed_registrations_message: Kayıt olma kapalıyken görüntülenir
-        content_cache_retention_period: Pozitif bir sayı girildiğinde, diğer sunuculardan gelen gönderiler belirli bir gün sonra silinecektir. Silme geri alınamayabilir.
+        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.
         mascot: Gelişmiş web arayüzündeki illüstrasyonu geçersiz kılar.
-        media_cache_retention_period: Pozitif bir sayı girildiğinde, diğer sunuculardan indirilen medya dosyaları belirli bir gün sonra silinecektir, isteğe bağlı olarak tekrar indirilebilir.
+        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.
         peers_api_enabled: Bu sunucunun fediverse'te karşılaştığı alan adlarının bir listesi. İlgili sunucuyla birleştirme mi yapıyorsunuz yoksa sunucunuz sadece onu biliyor mu hakkında bir bilgi burada yok. Bu blgi genel olarak federasyın hakkında istatistik toplamak isteyen hizmetler tarafından kullanılıyor.
         profile_directory: Profil dizini keşfedilebilir olmayı kabul eden tüm kullanıcıları listeler.
         require_invite_text: Kayıt olmak elle doğrulama gerektiriyorsa, "Neden katılmak istiyorsunuz?" metin girdisini isteğe bağlı yerine zorunlu yapın
@@ -243,7 +243,7 @@ tr:
         backups_retention_period: Kullanıcı arşivi saklama süresi
         bootstrap_timeline_accounts: Bu hesapları yeni kullanıcılara her zaman öner
         closed_registrations_message: Kayıt olma mevcut değilken gösterilen özel ileti
-        content_cache_retention_period: İçerik önbelleği saklama süresi
+        content_cache_retention_period: Uzak içerik saklama süresi
         custom_css: Özel CSS
         mascot: Özel maskot (eski)
         media_cache_retention_period: Medya önbelleği saklama süresi
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index db8e4b4d2..1d69f5c57 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -77,16 +77,10 @@ uk:
           warn: Сховати відфільтрований вміст за попередженням, у якому вказано заголовок фільтра
       form_admin_settings:
         activity_api_enabled: Кількість локальних опублікованих дописів, активних і нових користувачів у тижневих розрізах
-        backups_retention_period: Зберігати створені архіви користувача вказану кількість днів.
         bootstrap_timeline_accounts: Ці облікові записи будуть закріплені в топі пропозицій для нових користувачів.
         closed_registrations_message: Показується, коли реєстрація закрита
-        content_cache_retention_period: |-
-          Матеріали з інших серверів будуть видалені після вказаної кількості днів, коли встановлено позитивне значення. Ця дія може бути незворотна.
-
-          Матеріали з інших серверів будуть видалені після вказаної кількості днів. Ця дія може бути незворотна. Усі пов'язані з ними закладки та поширення також будуть втрачені.
         custom_css: Ви можете застосувати користувацькі стилі у вебверсії Mastodon.
         mascot: Змінює ілюстрацію в розширеному вебінтерфейсі.
-        media_cache_retention_period: Завантажені медіафайли будуть видалені після вказаної кількості днів після встановлення додатного значення та повторного завантаження за запитом.
         peers_api_enabled: Список доменів імен цього сервера з'явився у федівсесвіті. Сюди не входять дані чи ви пов'язані федерацією з цим сервером, а лише відомості, що вашому серверу відомо про нього. Його використовують служби, які збирають загальну статистику про федерації.
         profile_directory: У каталозі профілів перераховані всі користувачі, які погодились бути видимими.
         require_invite_text: Якщо реєстрація вимагає власноручного затвердження, зробіть текстове поле «Чому ви хочете приєднатися?» обов'язковим, а не додатковим
@@ -246,7 +240,7 @@ uk:
         backups_retention_period: Період утримання архіву користувача
         bootstrap_timeline_accounts: Завжди рекомендувати новим користувачам ці облікові записи
         closed_registrations_message: Показуване повідомлення, якщо реєстрація недоступна
-        content_cache_retention_period: Час зберігання кешу контенту
+        content_cache_retention_period: Період збереження віддаленого вмісту
         custom_css: Користувацький CSS
         mascot: Користувацький символ (застарілий)
         media_cache_retention_period: Період збереження кешу медіа
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index f4d9f526b..bc9a181ed 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -77,13 +77,13 @@ vi:
           warn: Ẩn nội dung đã lọc đằng sau một cảnh báo đề cập đến tiêu đề của bộ lọc
       form_admin_settings:
         activity_api_enabled: Số lượng tút được đăng trong máy chủ, người dùng đang hoạt động và đăng ký mới hàng tuần
-        backups_retention_period: Lưu trữ dữ liệu người dùng đã tạo trong số ngày được chỉ định.
+        backups_retention_period: Người dùng có khả năng tạo bản sao lưu các tút của họ để tải xuống sau. Các bản sao lưu này sẽ tự động bị xóa khỏi bộ nhớ của bạn sau số ngày được chỉ định.
         bootstrap_timeline_accounts: Những người này sẽ được ghim vào đầu các gợi ý theo dõi của người mới.
         closed_registrations_message: Được hiển thị khi đóng đăng ký
-        content_cache_retention_period: Tút từ các máy chủ khác sẽ bị xóa sau số ngày được chỉ định. Sau đó có thể không thể phục hồi được.
+        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.
         mascot: Ghi đè hình minh họa trong giao diện web nâng cao.
-        media_cache_retention_period: Media đã tải xuống sẽ bị xóa sau số ngày được chỉ định và sẽ tải xuống lại theo yêu cầu.
+        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 đó.
         peers_api_enabled: Danh sách các máy chủ khác mà máy chủ này đã liên hợp. Không có dữ liệu nào được đưa vào đây về việc bạn có liên kết với một máy chủ nhất định hay không, chỉ là máy chủ của bạn biết về nó. Điều này được sử dụng bởi các dịch vụ thu thập số liệu thống kê về liên kết theo nghĩa chung.
         profile_directory: Liệt kê tất cả người đã chọn tham gia để có thể khám phá.
         require_invite_text: Khi đăng ký yêu cầu phê duyệt thủ công, hãy đặt câu hỏi "Tại sao bạn muốn tham gia?" nhập văn bản bắt buộc thay vì tùy chọn
@@ -243,7 +243,7 @@ vi:
         backups_retention_period: Thời hạn lưu trữ nội dung người dùng sao lưu
         bootstrap_timeline_accounts: Luôn đề xuất những người này đến người mới
         closed_registrations_message: Thông báo tùy chỉnh khi tắt đăng ký
-        content_cache_retention_period: Thời hạn lưu trữ cache nội dung
+        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
         mascot: Tùy chỉnh linh vật (kế thừa)
         media_cache_retention_period: Thời hạn lưu trữ cache media
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 7f2eee023..a06a5ab4e 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -77,13 +77,13 @@ zh-CN:
           warn: 在警告中提及过滤器标题后,隐藏过滤内容
       form_admin_settings:
         activity_api_enabled: 本站每周的嘟文数、活跃用户数和新注册用户数
-        backups_retention_period: 将在指定天数内保留生成的用户存档。
+        backups_retention_period: 用户可以生成其嘟文存档以供之后下载。当该值被设为正值时,这些存档将在指定的天数后自动从您的存储中删除。
         bootstrap_timeline_accounts: 这些账号将在新用户关注推荐中置顶。
         closed_registrations_message: 在关闭注册时显示
-        content_cache_retention_period: 设为正数值时,来自其他服务器的嘟文将在指定天数后被删除。删除有可能会是不可逆的。
+        content_cache_retention_period: 来自其它实例的所有嘟文(包括转嘟与回复)都将在指定天数后被删除,不论本实例用户是否与这些嘟文产生过交互。这包括被本实例用户喜欢和收藏的嘟文。实例间用户的私下提及也将丢失并无法恢复。此设置针对的是特殊用途的实例,用于一般用途时会打破许多用户的期望。
         custom_css: 你可以为网页版 Mastodon 应用自定义样式。
         mascot: 覆盖高级网页界面中的绘图形象。
-        media_cache_retention_period: 设为正数值时,来自其他服务器的媒体文件将在指定天数后被删除,并在需要时再次下载。
+        media_cache_retention_period: 来自外站用户嘟文的媒体文件将被缓存到你的实例上。当该值被设为正值时,缓存的媒体文件将在指定天数后被清除。如果媒体文件在被清除后重新被请求,且源站内容仍然可用,它将被重新下载。由于链接预览卡拉取第三方站点的频率受到限制,建议将此值设置为至少 14 天,如果小于该值,链接预览卡将不会按需更新。
         peers_api_enabled: 此服务器在联邦宇宙中遇到的域名列表。 这里不包含关于您是否与给定服务器联合的数据,只是您的服务器知道它。 这由收集一般意义上的联邦统计信息的服务使用。
         profile_directory: 个人资料目录会列出所有选择可被发现的用户。
         require_invite_text: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项
@@ -243,7 +243,7 @@ zh-CN:
         backups_retention_period: 用户存档保留期
         bootstrap_timeline_accounts: 推荐新用户关注以下账号
         closed_registrations_message: 在关闭注册时显示的自定义消息
-        content_cache_retention_period: 内容缓存保留期
+        content_cache_retention_period: 外站内容保留期
         custom_css: 自定义 CSS
         mascot: 自定义吉祥物(旧)
         media_cache_retention_period: 媒体缓存保留期
diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml
index f6e40720f..0e2ee81db 100644
--- a/config/locales/simple_form.zh-HK.yml
+++ b/config/locales/simple_form.zh-HK.yml
@@ -77,13 +77,13 @@ zh-HK:
           warn: 將已篩選的內容隱藏在篩選器標題的警告後面。
       form_admin_settings:
         activity_api_enabled: 每週本站發佈的帖文、活躍使用者及新註冊的數量
-        backups_retention_period: 繼續封存生成的使用者到指定的天數。
+        backups_retention_period: 使用者可以生成帖文存檔,以便日後下載。如果設定為正值,這些存檔將在指定天數後自動從你的儲存空間中刪除。
         bootstrap_timeline_accounts: 這些帳號會被置頂在新使用者的追蹤建議上。
         closed_registrations_message: 關閉註冊時顯示
-        content_cache_retention_period: 當設定為正數時,來自其他伺服器的帖文將在指定天數後被刪除。無法還原這個操作。
+        content_cache_retention_period: 所有來自其他伺服器的帖文(包括轉推和回覆),不論本站使用者有否與這些帖文互動,帖文都將在指定天數後被刪除。這包括本地使用者標記為書籤或加入最愛的帖文。不同站點之間的私人提及也將丟失,並且無法恢復。此設定適用於有特殊用途的站點,一般使用可能會破壞使用者體驗。
         custom_css: 你可以在 Mastodon 網頁版套用自訂樣式。
         mascot: 覆蓋進階網頁介面中的插圖。
-        media_cache_retention_period: 當設定為正數時,已下載的媒體檔案將在指定天數後被刪除,並視乎需要重新下載。
+        media_cache_retention_period: 遠端使用者帖文中的媒體檔案會緩存到你的伺服器上。當設定為正值時,媒體將在指定天數後被刪除。如果媒體資料在刪除後被請求,而源內容仍然可用,則會重新下載該媒體。由於連結預覽卡輪詢第三方網站的頻率有限制,建議將此值設定為至少 14 天,否則在此之前不會按需要更新連結預覽卡。
         peers_api_enabled: 本伺服器於聯邦宇宙相遇的網域名單。這裏不包括你與某伺服器有否聯網的數據,僅表示你的伺服器已知的網域。這是供收集一般跨站數據的服務使用。
         profile_directory: 個人檔案目錄羅列了所有選擇被發現的使用者。
         require_invite_text: 如果需要手動審核註冊,請將「為何你想加入?」文字欄設定為必填,而非選填。
@@ -243,7 +243,7 @@ zh-HK:
         backups_retention_period: 封存使用者保留期
         bootstrap_timeline_accounts: 總是向新使用者推薦這些帳號
         closed_registrations_message: 無法註冊時的自訂訊息
-        content_cache_retention_period: 內容快取保留期
+        content_cache_retention_period: 遠端內容保留期
         custom_css: 自訂 CSS
         mascot: 自訂吉祥物 (舊版)
         media_cache_retention_period: 媒體快取保留期
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index 69a2794e6..a9e5921be 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -77,13 +77,13 @@ zh-TW:
           warn: 隱藏過濾內容於過濾器標題之警告後
       form_admin_settings:
         activity_api_enabled: 本站使用者的嘟文數量,以及本站的活躍使用者與一週內新使用者數量
-        backups_retention_period: 將已產生的使用者封存資料保存特定天數。
+        backups_retention_period: 使用者能產生他們嘟文的備份以便日後下載。當設定為正值時,這些嘟文備份將於指定之天數後自您的儲存空間中自動刪除。
         bootstrap_timeline_accounts: 這些帳號將被釘選於新帳號跟隨推薦之上。
         closed_registrations_message: 於註冊關閉時顯示
-        content_cache_retention_period: 所有來自其他伺服器之嘟文及轉嘟將於指定天數後被刪除。這項操作可能是不可逆的。所有相關之書籤、最愛、轉嘟將會遺失並且無法回復。
+        content_cache_retention_period: 所有來自其他伺服器之嘟文(包括轉嘟與回嘟)將於指定之天數後自動刪除,不論這些嘟文與本地使用者間的任何互動。這將包含本地使用者已標記為書籤或最愛之嘟文。不同站點使用者間之私訊亦將遺失且不可回復。此設定應適用於特殊情況,若常規使用將超乎多數使用者預期。
         custom_css: 您於 Mastodon 網頁版本中能套用客製化風格。
         mascot: 覆寫進階網頁介面中的圖例。
-        media_cache_retention_period: 當設定成正值時,已下載的多媒體檔案會於指定天數後被刪除,並且視需要重新下載。
+        media_cache_retention_period: 來自遠端伺服器嘟文中之多媒體內容將快取於您的伺服器。當設定為正值時,這些多媒體內容將於指定之天數後自您的儲存空間中自動刪除。若多媒體資料於刪除後被請求,且原始內容仍可存取,它們將被重新下載。由於連結預覽中第三方網站查詢頻率限制,建議將其設定為至少 14 日,否則於此之前連結預覽將不被即時更新。
         peers_api_enabled: 浩瀚聯邦宇宙中與此伺服器曾經擦肩而過的網域列表。不包含關於您是否與此伺服器是否有與之串連,僅僅表示您的伺服器已知此網域。這是供收集聯邦宇宙中一般性統計資料服務使用。
         profile_directory: 個人檔案目錄將會列出那些有選擇被發現的使用者。
         require_invite_text: 如果已設定為手動審核註冊,請將「為什麼想要加入呢?」設定為必填項目。
@@ -243,7 +243,7 @@ zh-TW:
         backups_retention_period: 使用者封存資料保留期間
         bootstrap_timeline_accounts: 永遠推薦這些帳號給新使用者
         closed_registrations_message: 當註冊關閉時的客製化訊息
-        content_cache_retention_period: 內容快取資料保留期間
+        content_cache_retention_period: 遠端內容保留期限
         custom_css: 自訂 CSS
         mascot: 自訂吉祥物 (legacy)
         media_cache_retention_period: 多媒體快取資料保留期間
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 17ff6a5cc..0d7483d79 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -737,6 +737,7 @@ th:
         desc_html: สิ่งนี้พึ่งพาสคริปต์ภายนอกจาก hCaptcha ซึ่งอาจเป็นข้อกังวลด้านความปลอดภัยและความเป็นส่วนตัว นอกจากนี้ <strong>สิ่งนี้สามารถทำให้กระบวนการการลงทะเบียนเข้าถึงได้น้อยลงอย่างมีนัยสำคัญสำหรับผู้คนบางส่วน (โดยเฉพาะอย่างยิ่งผู้พิการ)</strong> ด้วยเหตุผลเหล่านี้ โปรดพิจารณามาตรการทางเลือก เช่น การลงทะเบียนตามการอนุมัติหรือตามคำเชิญ
         title: ต้องให้ผู้ใช้ใหม่แก้ CAPTCHA เพื่อยืนยันบัญชีของเขา
       content_retention:
+        danger_zone: โซนอันตราย
         preamble: ควบคุมวิธีการจัดเก็บเนื้อหาที่ผู้ใช้สร้างขึ้นใน Mastodon
         title: การเก็บรักษาเนื้อหา
       default_noindex:
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 4bd0e3455..7b9cf50aa 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -751,6 +751,7 @@ tr:
         desc_html: Bu, güvenlik ve gizlilikle ilgili bir endişe kaynağı olabilecek hCaptcha'nın harici komut dosyalarına dayanır. Ayrıca <strong>bu, kayıt sürecini bazı (özellikle engelli) kişiler için önemli ölçüde daha az erişilebilir hale getirebilir</strong>. Bu nedenlerle, lütfen onaya dayalı veya davete dayalı kayıt gibi alternatif önlemleri göz önünde bulundurun.
         title: Yeni kullanıcıların hesaplarını doğrulamaları için bir CAPTCHA çözmelerini gerektir
       content_retention:
+        danger_zone: Tehlikeli bölge
         preamble: Kullanıcıların ürettiği içeriğin Mastodon'da nasıl saklanacağını denetleyin.
         title: İçerik saklama
       default_noindex:
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 7c7652d69..5d0ebe2de 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -779,6 +779,7 @@ uk:
         desc_html: Це залежить від зовнішніх скриптів hCaptcha, що може становити загрозу безпеці та приватності. Крім того, <strong>це може зробити процес реєстрації значно менш доступним для деяких людей (особливо з обмеженими можливостями)</strong>. З цих причин, будь ласка, розгляньте альтернативні заходи, такі як реєстрація на основі схвалення або на основі запрошення.
         title: Вимагати нових користувачів розв'язувати CAPTCHA для підтвердження облікового запису
       content_retention:
+        danger_zone: Зони небезпеки
         preamble: Контролюйте, як зберігаються користувацькі матеріали в Mastodon.
         title: Зберігання вмісту
       default_noindex:
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index ec851a828..5d9e881ea 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -737,6 +737,7 @@ vi:
         desc_html: Điều này phụ thuộc vào các mã lệnh bên ngoài từ hCaptcha, đây có thể là mối lo ngại về bảo mật và quyền riêng tư. Thêm vào đó, <strong>điều này có thể làm cho quá trình đăng ký khó hơn đối với một số người (đặc biệt là người khuyết tật)</strong>. Vì những lý do này, vui lòng xem xét các biện pháp thay thế như duyệt đăng ký thủ công hoặc tạo thư mời.
         title: Yêu cầu người dùng mới dùng CAPTCHA để xác minh tài khoản của họ
       content_retention:
+        danger_zone: Khu vực nguy hiểm
         preamble: Kiểm soát cách lưu trữ nội dung cá nhân trong Mastodon.
         title: Lưu giữ nội dung
       default_noindex:
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 79764539d..3140ebdd3 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -737,6 +737,7 @@ zh-CN:
         desc_html: 这依赖于来自hCaptcha的外部脚本,可能会带来安全和隐私问题。此外,<strong>这可能使注册过程对某些人(尤其是残疾人)的注册简易程度大幅下降</strong>。出于这些原因,请考虑采取其他措施,如基于批准或邀请的注册方式。
         title: 要求新用户输入验证码以确认他们的账户
       content_retention:
+        danger_zone: 危险操作区
         preamble: 控制用户生成的内容在 Mastodon 中如何存储。
         title: 内容保留
       default_noindex:
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 1dc50c284..1bfbe38bb 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -737,6 +737,7 @@ zh-HK:
         desc_html: 這倚賴 hCaptcha 的外部腳本,或會引起安全和私隱疑慮。此外,<strong>此註冊流程亦可能對特定人士(尤其是殘疾人士)有較多障礙</strong>。有鑑於此,請考慮使用其他以審核或邀請的註冊方式。
         title: 要求新使用者解答 CAPTCHA 以驗證帳號
       content_retention:
+        danger_zone: 危險區域
         preamble: 控制使用者生成的內容如何儲存在 Mastodon。
         title: 內容留存
       default_noindex:
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 407931c20..cdedd759e 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -739,6 +739,7 @@ zh-TW:
           此外,<strong>這將大幅降低註冊流程對某些族群之易用性,特別是無障礙需求人士</strong>。基於此因,請考慮其他替代性方案,例如審核制或是邀請制之註冊流程。
         title: 要求新使用者完成 CAPTCHA 挑戰以確認帳號
       content_retention:
+        danger_zone: 危險區域!
         preamble: 控制使用者產生內容如何儲存於 Mastodon 上。
         title: 內容保留期間
       default_noindex:

From 4527e012daa61dc07258eaedf3e03179b59fca8d Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Mon, 29 Apr 2024 10:23:05 +0200
Subject: [PATCH 011/215] Convert `entrypoints/sign_up` to Typescript (#30106)

---
 app/javascript/entrypoints/sign_up.js | 42 -----------------------
 app/javascript/entrypoints/sign_up.ts | 48 +++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 42 deletions(-)
 delete mode 100644 app/javascript/entrypoints/sign_up.js
 create mode 100644 app/javascript/entrypoints/sign_up.ts

diff --git a/app/javascript/entrypoints/sign_up.js b/app/javascript/entrypoints/sign_up.js
deleted file mode 100644
index cf9c83777..000000000
--- a/app/javascript/entrypoints/sign_up.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import './public-path';
-import axios from 'axios';
-
-import ready from '../mastodon/ready';
-
-ready(() => {
-  setInterval(() => {
-    axios.get('/api/v1/emails/check_confirmation').then((response) => {
-      if (response.data) {
-        window.location = '/start';
-      }
-    }).catch(error => {
-      console.error(error);
-    });
-  }, 5000);
-
-  document.querySelectorAll('.timer-button').forEach(button => {
-    let counter = 30;
-
-    const container = document.createElement('span');
-
-    const updateCounter = () => {
-      container.innerText = ` (${counter})`;
-    };
-
-    updateCounter();
-
-    const countdown = setInterval(() => {
-      counter--;
-
-      if (counter === 0) {
-        button.disabled = false;
-        button.removeChild(container);
-        clearInterval(countdown);
-      } else {
-        updateCounter();
-      }
-    }, 1000);
-
-    button.appendChild(container);
-  });
-});
diff --git a/app/javascript/entrypoints/sign_up.ts b/app/javascript/entrypoints/sign_up.ts
new file mode 100644
index 000000000..880738fcb
--- /dev/null
+++ b/app/javascript/entrypoints/sign_up.ts
@@ -0,0 +1,48 @@
+import './public-path';
+import axios from 'axios';
+
+import ready from '../mastodon/ready';
+
+async function checkConfirmation() {
+  const response = await axios.get('/api/v1/emails/check_confirmation');
+
+  if (response.data) {
+    window.location.href = '/start';
+  }
+}
+
+ready(() => {
+  setInterval(() => {
+    void checkConfirmation();
+  }, 5000);
+
+  document
+    .querySelectorAll<HTMLButtonElement>('button.timer-button')
+    .forEach((button) => {
+      let counter = 30;
+
+      const container = document.createElement('span');
+
+      const updateCounter = () => {
+        container.innerText = ` (${counter})`;
+      };
+
+      updateCounter();
+
+      const countdown = setInterval(() => {
+        counter--;
+
+        if (counter === 0) {
+          button.disabled = false;
+          button.removeChild(container);
+          clearInterval(countdown);
+        } else {
+          updateCounter();
+        }
+      }, 1000);
+
+      button.appendChild(container);
+    });
+}).catch((e: unknown) => {
+  throw e;
+});

From f0c9cbaf3b079700b8179222d409c644dfd8ff66 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 05:01:46 -0400
Subject: [PATCH 012/215] Use `EXPIRATION_DURATIONS` constant in `CustomFilter`
 class (#30088)

---
 app/models/custom_filter.rb                | 4 +++-
 app/views/filters/_filter_fields.html.haml | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index 2d8f5b6cb..94fadc700 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -28,6 +28,8 @@ class CustomFilter < ApplicationRecord
     account
   ).freeze
 
+  EXPIRATION_DURATIONS = [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].freeze
+
   include Expireable
   include Redisable
 
@@ -52,7 +54,7 @@ class CustomFilter < ApplicationRecord
     return @expires_in if defined?(@expires_in)
     return nil if expires_at.nil?
 
-    [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].find { |expires_in| expires_in.from_now >= expires_at }
+    EXPIRATION_DURATIONS.find { |expires_in| expires_in.from_now >= expires_at }
   end
 
   def irreversible=(value)
diff --git a/app/views/filters/_filter_fields.html.haml b/app/views/filters/_filter_fields.html.haml
index 5b297a6a9..0f4049ffb 100644
--- a/app/views/filters/_filter_fields.html.haml
+++ b/app/views/filters/_filter_fields.html.haml
@@ -6,7 +6,7 @@
               wrapper: :with_label
   .fields-row__column.fields-row__column-6.fields-group
     = f.input :expires_in,
-              collection: [30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].map(&:to_i),
+              collection: CustomFilter::EXPIRATION_DURATIONS.map(&:to_i),
               include_blank: I18n.t('invites.expires_in_prompt'),
               label_method: ->(i) { I18n.t("invites.expires_in.#{i}") },
               wrapper: :with_label

From 2123281f7c24620f81dde503b83674cb3824a8cd Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 05:02:47 -0400
Subject: [PATCH 013/215] Move `Account` limits to constants (#30087)

---
 app/models/account.rb | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/app/models/account.rb b/app/models/account.rb
index 2bf00b2be..3efa7d88b 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -71,6 +71,9 @@ class Account < ApplicationRecord
   MENTION_RE    = %r{(?<![=/[:word:]])@((#{USERNAME_RE})(?:@[[:word:].-]+[[:word:]]+)?)}i
   URL_PREFIX_RE = %r{\Ahttp(s?)://[^/]+}
   USERNAME_ONLY_RE = /\A#{USERNAME_RE}\z/i
+  USERNAME_LENGTH_LIMIT = 30
+  DISPLAY_NAME_LENGTH_LIMIT = 30
+  NOTE_LENGTH_LIMIT = 500
 
   include Attachmentable # Load prior to Avatar & Header concerns
 
@@ -100,10 +103,10 @@ class Account < ApplicationRecord
   validates :uri, presence: true, unless: :local?, on: :create
 
   # Local user validations
-  validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: 30 }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
+  validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: USERNAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
   validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
-  validates :display_name, length: { maximum: 30 }, if: -> { local? && will_save_change_to_display_name? }
-  validates :note, note_length: { maximum: 500 }, if: -> { local? && will_save_change_to_note? }
+  validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? }
+  validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? }
   validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? }
   validates :uri, absence: true, if: :local?, on: :create
   validates :inbox_url, absence: true, if: :local?, on: :create

From 6931cf5727907f9bc28568e028f28c4adc4caf6e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 09:03:27 +0000
Subject: [PATCH 014/215] Update dependency aws-sdk-s3 to v1.148.0 (#30076)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile.lock | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 4f4ca89dc..d73de0320 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -102,17 +102,17 @@ GEM
     attr_required (1.0.2)
     awrence (1.2.1)
     aws-eventstream (1.3.0)
-    aws-partitions (1.916.0)
-    aws-sdk-core (3.192.1)
+    aws-partitions (1.920.0)
+    aws-sdk-core (3.193.0)
       aws-eventstream (~> 1, >= 1.3.0)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.8)
       jmespath (~> 1, >= 1.6.1)
-    aws-sdk-kms (1.79.0)
-      aws-sdk-core (~> 3, >= 3.191.0)
+    aws-sdk-kms (1.80.0)
+      aws-sdk-core (~> 3, >= 3.193.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.147.0)
-      aws-sdk-core (~> 3, >= 3.192.0)
+    aws-sdk-s3 (1.148.0)
+      aws-sdk-core (~> 3, >= 3.193.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.8)
     aws-sigv4 (1.8.0)

From bbf1b603e0bb3c0ffeb4eba8a1d5faf645335d91 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 05:04:35 -0400
Subject: [PATCH 015/215] Remove unused `Account.popular` scope (#30068)

---
 app/models/account.rb | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/models/account.rb b/app/models/account.rb
index 3efa7d88b..3c533822f 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -138,7 +138,6 @@ class Account < ApplicationRecord
   scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).joins(:account_stat) }
   scope :by_recent_status, -> { includes(:account_stat).merge(AccountStat.by_recent_status).references(:account_stat) }
   scope :by_recent_activity, -> { left_joins(:user, :account_stat).order(coalesced_activity_timestamps.desc).order(id: :desc) }
-  scope :popular, -> { order('account_stats.followers_count desc') }
   scope :by_domain_and_subdomains, ->(domain) { where(domain: Instance.by_domain_and_subdomains(domain).select(:domain)) }
   scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) }
   scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) }

From 2739d8d5a493db7e6845ce85dc8534c275ab2cdc Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 05:10:23 -0400
Subject: [PATCH 016/215] Use shorter `render` call in `admin/webhooks` view
 (#30071)

---
 app/views/admin/webhooks/edit.html.haml | 2 +-
 app/views/admin/webhooks/new.html.haml  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/views/admin/webhooks/edit.html.haml b/app/views/admin/webhooks/edit.html.haml
index 2c2a7aa03..abc9bdfab 100644
--- a/app/views/admin/webhooks/edit.html.haml
+++ b/app/views/admin/webhooks/edit.html.haml
@@ -2,6 +2,6 @@
   = t('admin.webhooks.edit')
 
 = simple_form_for @webhook, url: admin_webhook_path(@webhook) do |form|
-  = render partial: 'form', object: form
+  = render form
   .actions
     = form.button :button, t('generic.save_changes'), type: :submit
diff --git a/app/views/admin/webhooks/new.html.haml b/app/views/admin/webhooks/new.html.haml
index f51b039ce..50fcdc2be 100644
--- a/app/views/admin/webhooks/new.html.haml
+++ b/app/views/admin/webhooks/new.html.haml
@@ -2,6 +2,6 @@
   = t('admin.webhooks.new')
 
 = simple_form_for @webhook, url: admin_webhooks_path do |form|
-  = render partial: 'form', object: form
+  = render form
   .actions
     = form.button :button, t('admin.webhooks.add_new'), type: :submit

From b9b4db483cc588a2eb334b63fe6740c8dad9b57b Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Mon, 29 Apr 2024 11:29:59 +0200
Subject: [PATCH 017/215] Remove usage of deprecated `defaultTypes` on React
 functional components (#30099)

---
 app/javascript/mastodon/components/badge.jsx | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/app/javascript/mastodon/components/badge.jsx b/app/javascript/mastodon/components/badge.jsx
index 5e0b2587b..2a335d7f5 100644
--- a/app/javascript/mastodon/components/badge.jsx
+++ b/app/javascript/mastodon/components/badge.jsx
@@ -7,7 +7,7 @@ import PersonIcon from '@/material-icons/400-24px/person.svg?react';
 import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react';
 
 
-export const Badge = ({ icon, label, domain, roleId }) => (
+export const Badge = ({ icon = <PersonIcon />, label, domain, roleId }) => (
   <div className='account-role' data-account-role-id={roleId}>
     {icon}
     {label}
@@ -22,10 +22,6 @@ Badge.propTypes = {
   roleId: PropTypes.string
 };
 
-Badge.defaultProps = {
-  icon: <PersonIcon />,
-};
-
 export const GroupBadge = () => (
   <Badge icon={<GroupsIcon />} label={<FormattedMessage id='account.badges.group' defaultMessage='Group' />} />
 );

From a9816f051d3a83763b5a07423da2684fa2d05ca9 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 05:33:06 -0400
Subject: [PATCH 018/215] Use shared form partial for `admin/warning_presets`
 views (#30069)

---
 app/views/admin/warning_presets/_form.html.haml |  7 +++++++
 app/views/admin/warning_presets/edit.html.haml  | 10 +++-------
 app/views/admin/warning_presets/index.html.haml | 10 +++-------
 3 files changed, 13 insertions(+), 14 deletions(-)
 create mode 100644 app/views/admin/warning_presets/_form.html.haml

diff --git a/app/views/admin/warning_presets/_form.html.haml b/app/views/admin/warning_presets/_form.html.haml
new file mode 100644
index 000000000..cba74163c
--- /dev/null
+++ b/app/views/admin/warning_presets/_form.html.haml
@@ -0,0 +1,7 @@
+.fields-group
+  = form.input :title,
+               wrapper: :with_block_label
+
+.fields-group
+  = form.input :text,
+               wrapper: :with_block_label
diff --git a/app/views/admin/warning_presets/edit.html.haml b/app/views/admin/warning_presets/edit.html.haml
index b5c5107ef..f0bd9c12e 100644
--- a/app/views/admin/warning_presets/edit.html.haml
+++ b/app/views/admin/warning_presets/edit.html.haml
@@ -1,14 +1,10 @@
 - content_for :page_title do
   = t('admin.warning_presets.edit_preset')
 
-= simple_form_for @warning_preset, url: admin_warning_preset_path(@warning_preset) do |f|
+= simple_form_for @warning_preset, url: admin_warning_preset_path(@warning_preset) do |form|
   = render 'shared/error_messages', object: @warning_preset
 
-  .fields-group
-    = f.input :title, wrapper: :with_block_label
-
-  .fields-group
-    = f.input :text, wrapper: :with_block_label
+  = render form
 
   .actions
-    = f.button :button, t('generic.save_changes'), type: :submit
+    = form.button :button, t('generic.save_changes'), type: :submit
diff --git a/app/views/admin/warning_presets/index.html.haml b/app/views/admin/warning_presets/index.html.haml
index b26a13d96..22fee2105 100644
--- a/app/views/admin/warning_presets/index.html.haml
+++ b/app/views/admin/warning_presets/index.html.haml
@@ -2,17 +2,13 @@
   = t('admin.warning_presets.title')
 
 - if can? :create, :account_warning_preset
-  = simple_form_for @warning_preset, url: admin_warning_presets_path do |f|
+  = simple_form_for @warning_preset, url: admin_warning_presets_path do |form|
     = render 'shared/error_messages', object: @warning_preset
 
-    .fields-group
-      = f.input :title, wrapper: :with_block_label
-
-    .fields-group
-      = f.input :text, wrapper: :with_block_label
+    = render form
 
     .actions
-      = f.button :button, t('admin.warning_presets.add_new'), type: :submit
+      = form.button :button, t('admin.warning_presets.add_new'), type: :submit
 
   %hr.spacer/
 

From e3364668946e4426b15df664a69624a9ea647263 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 05:33:27 -0400
Subject: [PATCH 019/215] Use shared form partial for `admin/rules` views
 (#30067)

---
 app/views/admin/rules/_form.html.haml |  7 +++++++
 app/views/admin/rules/edit.html.haml  | 10 +++-------
 app/views/admin/rules/index.html.haml | 10 +++-------
 3 files changed, 13 insertions(+), 14 deletions(-)
 create mode 100644 app/views/admin/rules/_form.html.haml

diff --git a/app/views/admin/rules/_form.html.haml b/app/views/admin/rules/_form.html.haml
new file mode 100644
index 000000000..9fc54e288
--- /dev/null
+++ b/app/views/admin/rules/_form.html.haml
@@ -0,0 +1,7 @@
+.fields-group
+  = form.input :text,
+               wrapper: :with_block_label
+
+.fields-group
+  = form.input :hint,
+               wrapper: :with_block_label
diff --git a/app/views/admin/rules/edit.html.haml b/app/views/admin/rules/edit.html.haml
index 77815588d..9e3c91581 100644
--- a/app/views/admin/rules/edit.html.haml
+++ b/app/views/admin/rules/edit.html.haml
@@ -1,14 +1,10 @@
 - content_for :page_title do
   = t('admin.rules.edit')
 
-= simple_form_for @rule, url: admin_rule_path(@rule) do |f|
+= simple_form_for @rule, url: admin_rule_path(@rule) do |form|
   = render 'shared/error_messages', object: @rule
 
-  .fields-group
-    = f.input :text, wrapper: :with_block_label
-
-  .fields-group
-    = f.input :hint, wrapper: :with_block_label
+  = render form
 
   .actions
-    = f.button :button, t('generic.save_changes'), type: :submit
+    = form.button :button, t('generic.save_changes'), type: :submit
diff --git a/app/views/admin/rules/index.html.haml b/app/views/admin/rules/index.html.haml
index dd15ce03c..5a2789edc 100644
--- a/app/views/admin/rules/index.html.haml
+++ b/app/views/admin/rules/index.html.haml
@@ -6,17 +6,13 @@
 %hr.spacer/
 
 - if can? :create, :rule
-  = simple_form_for @rule, url: admin_rules_path do |f|
+  = simple_form_for @rule, url: admin_rules_path do |form|
     = render 'shared/error_messages', object: @rule
 
-    .fields-group
-      = f.input :text, wrapper: :with_block_label
-
-    .fields-group
-      = f.input :hint, wrapper: :with_block_label
+    = render form
 
     .actions
-      = f.button :button, t('admin.rules.add_new'), type: :submit
+      = form.button :button, t('admin.rules.add_new'), type: :submit
 
   %hr.spacer/
 

From 95e9de577752a71ed8804ecc5fcd314bca47adee Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 29 Apr 2024 11:45:58 +0200
Subject: [PATCH 020/215] Prevent accidental serialization of `Account` and
 `User` records (#30079)

---
 app/models/application_record.rb | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/app/models/application_record.rb b/app/models/application_record.rb
index 014a73997..299aad634 100644
--- a/app/models/application_record.rb
+++ b/app/models/application_record.rb
@@ -22,4 +22,10 @@ class ApplicationRecord < ActiveRecord::Base
       value
     end
   end
+
+  # Prevent implicit serialization in ActiveModel::Serializer or other code paths.
+  # This is a hardening step to avoid accidental leaking of attributes.
+  def as_json
+    raise NotImplementedError
+  end
 end

From ac7f4d57bb8f92ce0fbc91736cba8665174f41d4 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 05:55:37 -0400
Subject: [PATCH 021/215] Use composable query in `Status.without_replies`
 scope (#30086)

---
 app/models/status.rb | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/models/status.rb b/app/models/status.rb
index c2d7985b4..2ff803bf0 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -106,7 +106,9 @@ class Status < ApplicationRecord
   scope :remote, -> { where(local: false).where.not(uri: nil) }
   scope :local,  -> { where(local: true).or(where(uri: nil)) }
   scope :with_accounts, ->(ids) { where(id: ids).includes(:account) }
-  scope :without_replies, -> { where('statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id') }
+  scope :without_replies, -> { not_reply.or(reply_to_account) }
+  scope :not_reply, -> { where(reply: false) }
+  scope :reply_to_account, -> { where(arel_table[:in_reply_to_account_id].eq arel_table[:account_id]) }
   scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) }
   scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) }
   scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) }

From 7d3fe2b4c3cd9511df8f8026890c71b2119719f3 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 29 Apr 2024 11:55:41 +0200
Subject: [PATCH 022/215] Add loading indicator and empty result message to
 advanced interface search (#30085)

---
 .../compose/components/search_results.jsx     | 112 +++++++++---------
 .../containers/search_results_container.js    |  20 ----
 .../mastodon/features/compose/index.jsx       |   4 +-
 app/javascript/mastodon/reducers/search.js    |   1 +
 4 files changed, 62 insertions(+), 75 deletions(-)
 delete mode 100644 app/javascript/mastodon/features/compose/containers/search_results_container.js

diff --git a/app/javascript/mastodon/features/compose/components/search_results.jsx b/app/javascript/mastodon/features/compose/components/search_results.jsx
index 667662781..6a482c8ec 100644
--- a/app/javascript/mastodon/features/compose/components/search_results.jsx
+++ b/app/javascript/mastodon/features/compose/components/search_results.jsx
@@ -1,16 +1,16 @@
-import PropTypes from 'prop-types';
+import { useCallback } from 'react';
 
 import { FormattedMessage } from 'react-intl';
 
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-
 import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react';
 import PeopleIcon from '@/material-icons/400-24px/group.svg?react';
 import TagIcon from '@/material-icons/400-24px/tag.svg?react';
+import { expandSearch } from 'mastodon/actions/search';
 import { Icon }  from 'mastodon/components/icon';
 import { LoadMore } from 'mastodon/components/load_more';
+import { LoadingIndicator } from 'mastodon/components/loading_indicator';
 import { SearchSection } from 'mastodon/features/explore/components/search_section';
+import { useAppDispatch, useAppSelector } from 'mastodon/store';
 
 import { ImmutableHashtag as Hashtag } from '../../../components/hashtag';
 import AccountContainer from '../../../containers/account_container';
@@ -26,62 +26,68 @@ const withoutLastResult = list => {
   }
 };
 
-class SearchResults extends ImmutablePureComponent {
+export const SearchResults = () => {
+  const results = useAppSelector((state) => state.getIn(['search', 'results']));
+  const isLoading = useAppSelector((state) => state.getIn(['search', 'isLoading']));
 
-  static propTypes = {
-    results: ImmutablePropTypes.map.isRequired,
-    expandSearch: PropTypes.func.isRequired,
-    searchTerm: PropTypes.string,
-  };
+  const dispatch = useAppDispatch();
 
-  handleLoadMoreAccounts = () => this.props.expandSearch('accounts');
+  const handleLoadMoreAccounts = useCallback(() => {
+    dispatch(expandSearch('accounts'));
+  }, [dispatch]);
 
-  handleLoadMoreStatuses = () => this.props.expandSearch('statuses');
+  const handleLoadMoreStatuses = useCallback(() => {
+    dispatch(expandSearch('statuses'));
+  }, [dispatch]);
 
-  handleLoadMoreHashtags = () => this.props.expandSearch('hashtags');
+  const handleLoadMoreHashtags = useCallback(() => {
+    dispatch(expandSearch('hashtags'));
+  }, [dispatch]);
 
-  render () {
-    const { results } = this.props;
+  let accounts, statuses, hashtags;
 
-    let accounts, statuses, hashtags;
-
-    if (results.get('accounts') && results.get('accounts').size > 0) {
-      accounts = (
-        <SearchSection title={<><Icon id='users' icon={PeopleIcon} /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>}>
-          {withoutLastResult(results.get('accounts')).map(accountId => <AccountContainer key={accountId} id={accountId} />)}
-          {(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreAccounts} />}
-        </SearchSection>
-      );
-    }
-
-    if (results.get('hashtags') && results.get('hashtags').size > 0) {
-      hashtags = (
-        <SearchSection title={<><Icon id='hashtag' icon={TagIcon} /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>}>
-          {withoutLastResult(results.get('hashtags')).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
-          {(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreHashtags} />}
-        </SearchSection>
-      );
-    }
-
-    if (results.get('statuses') && results.get('statuses').size > 0) {
-      statuses = (
-        <SearchSection title={<><Icon id='quote-right' icon={FindInPageIcon} /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>}>
-          {withoutLastResult(results.get('statuses')).map(statusId => <StatusContainer key={statusId} id={statusId} />)}
-          {(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreStatuses} />}
-        </SearchSection>
-      );
-    }
-
-
-    return (
-      <div className='search-results'>
-        {accounts}
-        {hashtags}
-        {statuses}
-      </div>
+  if (results.get('accounts') && results.get('accounts').size > 0) {
+    accounts = (
+      <SearchSection title={<><Icon id='users' icon={PeopleIcon} /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>}>
+        {withoutLastResult(results.get('accounts')).map(accountId => <AccountContainer key={accountId} id={accountId} />)}
+        {(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={handleLoadMoreAccounts} />}
+      </SearchSection>
     );
   }
 
-}
+  if (results.get('hashtags') && results.get('hashtags').size > 0) {
+    hashtags = (
+      <SearchSection title={<><Icon id='hashtag' icon={TagIcon} /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>}>
+        {withoutLastResult(results.get('hashtags')).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
+        {(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={handleLoadMoreHashtags} />}
+      </SearchSection>
+    );
+  }
 
-export default SearchResults;
+  if (results.get('statuses') && results.get('statuses').size > 0) {
+    statuses = (
+      <SearchSection title={<><Icon id='quote-right' icon={FindInPageIcon} /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>}>
+        {withoutLastResult(results.get('statuses')).map(statusId => <StatusContainer key={statusId} id={statusId} />)}
+        {(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={handleLoadMoreStatuses} />}
+      </SearchSection>
+    );
+  }
+
+  return (
+    <div className='search-results'>
+      {!accounts && !hashtags && !statuses && (
+        isLoading ? (
+          <LoadingIndicator />
+        ) : (
+          <div className='empty-column-indicator'>
+            <FormattedMessage id='search_results.nothing_found' defaultMessage='Could not find anything for these search terms' />
+          </div>
+        )
+      )}
+      {accounts}
+      {hashtags}
+      {statuses}
+    </div>
+  );
+
+};
diff --git a/app/javascript/mastodon/features/compose/containers/search_results_container.js b/app/javascript/mastodon/features/compose/containers/search_results_container.js
deleted file mode 100644
index 54c2af317..000000000
--- a/app/javascript/mastodon/features/compose/containers/search_results_container.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { connect } from 'react-redux';
-
-import { expandSearch } from 'mastodon/actions/search';
-import { fetchSuggestions, dismissSuggestion } from 'mastodon/actions/suggestions';
-
-import SearchResults from '../components/search_results';
-
-const mapStateToProps = state => ({
-  results: state.getIn(['search', 'results']),
-  suggestions: state.getIn(['suggestions', 'items']),
-  searchTerm: state.getIn(['search', 'searchTerm']),
-});
-
-const mapDispatchToProps = dispatch => ({
-  fetchSuggestions: () => dispatch(fetchSuggestions()),
-  expandSearch: type => dispatch(expandSearch(type)),
-  dismissSuggestion: account => dispatch(dismissSuggestion(account.get('id'))),
-});
-
-export default connect(mapStateToProps, mapDispatchToProps)(SearchResults);
diff --git a/app/javascript/mastodon/features/compose/index.jsx b/app/javascript/mastodon/features/compose/index.jsx
index ce8eb9e05..83c741fd1 100644
--- a/app/javascript/mastodon/features/compose/index.jsx
+++ b/app/javascript/mastodon/features/compose/index.jsx
@@ -29,9 +29,9 @@ import { mascot } from '../../initial_state';
 import { isMobile } from '../../is_mobile';
 import Motion from '../ui/util/optional_motion';
 
+import { SearchResults } from './components/search_results';
 import ComposeFormContainer from './containers/compose_form_container';
 import SearchContainer from './containers/search_container';
-import SearchResultsContainer from './containers/search_results_container';
 
 const messages = defineMessages({
   start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@@ -138,7 +138,7 @@ class Compose extends PureComponent {
             <Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
               {({ x }) => (
                 <div className='drawer__inner darker' style={{ transform: `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>
-                  <SearchResultsContainer />
+                  <SearchResults />
                 </div>
               )}
             </Motion>
diff --git a/app/javascript/mastodon/reducers/search.js b/app/javascript/mastodon/reducers/search.js
index 72835eb91..7828d49ee 100644
--- a/app/javascript/mastodon/reducers/search.js
+++ b/app/javascript/mastodon/reducers/search.js
@@ -50,6 +50,7 @@ export default function search(state = initialState, action) {
     return state.set('hidden', true);
   case SEARCH_FETCH_REQUEST:
     return state.withMutations(map => {
+      map.set('results', ImmutableMap());
       map.set('isLoading', true);
       map.set('submitted', true);
       map.set('type', action.searchType);

From f1a4b4e228ed077692c5bbe6af094308b87c2874 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 08:32:06 -0400
Subject: [PATCH 023/215] Disable `Style/SignalException` cop (#30064)

---
 .rubocop_todo.yml                                        | 8 --------
 lib/devise/strategies/two_factor_ldap_authenticatable.rb | 2 +-
 lib/devise/strategies/two_factor_pam_authenticatable.rb  | 2 +-
 3 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index c2826d718..e65657814 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -205,14 +205,6 @@ Style/SafeNavigation:
   Exclude:
     - 'app/models/concerns/account/finder_concern.rb'
 
-# This cop supports safe autocorrection (--autocorrect).
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: only_raise, only_fail, semantic
-Style/SignalException:
-  Exclude:
-    - 'lib/devise/strategies/two_factor_ldap_authenticatable.rb'
-    - 'lib/devise/strategies/two_factor_pam_authenticatable.rb'
-
 # This cop supports unsafe autocorrection (--autocorrect-all).
 # Configuration parameters: Mode.
 Style/StringConcatenation:
diff --git a/lib/devise/strategies/two_factor_ldap_authenticatable.rb b/lib/devise/strategies/two_factor_ldap_authenticatable.rb
index 065aa2de8..c8258deb1 100644
--- a/lib/devise/strategies/two_factor_ldap_authenticatable.rb
+++ b/lib/devise/strategies/two_factor_ldap_authenticatable.rb
@@ -16,7 +16,7 @@ module Devise
         if resource && !resource.otp_required_for_login?
           success!(resource)
         else
-          fail(:invalid)
+          fail(:invalid) # rubocop:disable Style/SignalException -- method is from Warden::Strategies::Base
         end
       end
 
diff --git a/lib/devise/strategies/two_factor_pam_authenticatable.rb b/lib/devise/strategies/two_factor_pam_authenticatable.rb
index 5ce723b33..a9db1b6a2 100644
--- a/lib/devise/strategies/two_factor_pam_authenticatable.rb
+++ b/lib/devise/strategies/two_factor_pam_authenticatable.rb
@@ -15,7 +15,7 @@ module Devise
         if resource && !resource.otp_required_for_login?
           success!(resource)
         else
-          fail(:invalid)
+          fail(:invalid) # rubocop:disable Style/SignalException -- method is from Warden::Strategies::Base
         end
       end
 

From 924af400da330f8a168afe2b4ffb5dc50dbd8ce9 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 29 Apr 2024 08:49:31 -0400
Subject: [PATCH 024/215] Remove unused memoization in
 `CustomFilter#expires_in` method (#30117)

---
 app/models/custom_filter.rb | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index 94fadc700..bacf15826 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -51,7 +51,6 @@ class CustomFilter < ApplicationRecord
   after_commit :invalidate_cache!
 
   def expires_in
-    return @expires_in if defined?(@expires_in)
     return nil if expires_at.nil?
 
     EXPIRATION_DURATIONS.find { |expires_in| expires_in.from_now >= expires_at }

From f5d6362e9013fa5a1c53ebb7a422916a412a05dd Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Apr 2024 17:48:34 +0200
Subject: [PATCH 025/215] Update dependency ws to v8.17.0 (#30097)

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 e8f4075e2..878d43d10 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -18276,8 +18276,8 @@ __metadata:
   linkType: hard
 
 "ws@npm:^8.11.0, ws@npm:^8.12.1, ws@npm:^8.16.0":
-  version: 8.16.0
-  resolution: "ws@npm:8.16.0"
+  version: 8.17.0
+  resolution: "ws@npm:8.17.0"
   peerDependencies:
     bufferutil: ^4.0.1
     utf-8-validate: ">=5.0.2"
@@ -18286,7 +18286,7 @@ __metadata:
       optional: true
     utf-8-validate:
       optional: true
-  checksum: 10c0/a7783bb421c648b1e622b423409cb2a58ac5839521d2f689e84bc9dc41d59379c692dd405b15a997ea1d4c0c2e5314ad707332d0c558f15232d2bc07c0b4618a
+  checksum: 10c0/55241ec93a66fdfc4bf4f8bc66c8eb038fda2c7a4ee8f6f157f2ca7dc7aa76aea0c0da0bf3adb2af390074a70a0e45456a2eaf80e581e630b75df10a64b0a990
   languageName: node
   linkType: hard
 

From b8f0a504350a4c30339a755cac0edeadafa9841d Mon Sep 17 00:00:00 2001
From: Shlee <github@shl.ee>
Date: Tue, 30 Apr 2024 03:31:14 +1000
Subject: [PATCH 026/215] docker-compose.yml  `version` is obsolete (#30120)

---
 docker-compose.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 154754d45..3f2336f1d 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,4 +1,3 @@
-version: '3'
 services:
   db:
     restart: always

From 81f0002e7653b03c65f4c8feeaa4730fdf681b0d Mon Sep 17 00:00:00 2001
From: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
Date: Tue, 30 Apr 2024 10:48:02 +0200
Subject: [PATCH 027/215] Fix missing destory audit logs for Domain Allows
 (#30125)

---
 app/controllers/admin/domain_allows_controller.rb | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/controllers/admin/domain_allows_controller.rb b/app/controllers/admin/domain_allows_controller.rb
index 31be1978b..b0f139e3a 100644
--- a/app/controllers/admin/domain_allows_controller.rb
+++ b/app/controllers/admin/domain_allows_controller.rb
@@ -25,6 +25,8 @@ class Admin::DomainAllowsController < Admin::BaseController
   def destroy
     authorize @domain_allow, :destroy?
     UnallowDomainService.new.call(@domain_allow)
+    log_action :destroy, @domain_allow
+
     redirect_to admin_instances_path, notice: I18n.t('admin.domain_allows.destroyed_msg')
   end
 

From f5376c477d142d4c43826b5cea0f9b2f53bf64b7 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 30 Apr 2024 10:50:42 +0200
Subject: [PATCH 028/215] Update babel monorepo to v7.24.5 (#30124)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 290 +++++++++++++++++++++++++++---------------------------
 1 file changed, 145 insertions(+), 145 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 878d43d10..70395894b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -42,7 +42,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2":
+"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.2":
   version: 7.24.2
   resolution: "@babel/code-frame@npm:7.24.2"
   dependencies:
@@ -60,37 +60,37 @@ __metadata:
   linkType: hard
 
 "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1":
-  version: 7.24.4
-  resolution: "@babel/core@npm:7.24.4"
+  version: 7.24.5
+  resolution: "@babel/core@npm:7.24.5"
   dependencies:
     "@ampproject/remapping": "npm:^2.2.0"
     "@babel/code-frame": "npm:^7.24.2"
-    "@babel/generator": "npm:^7.24.4"
+    "@babel/generator": "npm:^7.24.5"
     "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-module-transforms": "npm:^7.23.3"
-    "@babel/helpers": "npm:^7.24.4"
-    "@babel/parser": "npm:^7.24.4"
+    "@babel/helper-module-transforms": "npm:^7.24.5"
+    "@babel/helpers": "npm:^7.24.5"
+    "@babel/parser": "npm:^7.24.5"
     "@babel/template": "npm:^7.24.0"
-    "@babel/traverse": "npm:^7.24.1"
-    "@babel/types": "npm:^7.24.0"
+    "@babel/traverse": "npm:^7.24.5"
+    "@babel/types": "npm:^7.24.5"
     convert-source-map: "npm:^2.0.0"
     debug: "npm:^4.1.0"
     gensync: "npm:^1.0.0-beta.2"
     json5: "npm:^2.2.3"
     semver: "npm:^6.3.1"
-  checksum: 10c0/fc136966583e64d6f84f4a676368de6ab4583aa87f867186068655b30ef67f21f8e65a88c6d446a7efd219ad7ffb9185c82e8a90183ee033f6f47b5026641e16
+  checksum: 10c0/e26ba810a77bc8e21579a12fc36c79a0a60554404dc9447f2d64eb1f26d181c48d3b97d39d9f158e9911ec7162a8280acfaf2b4b210e975f0dd4bd4dbb1ee159
   languageName: node
   linkType: hard
 
-"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4, @babel/generator@npm:^7.7.2":
-  version: 7.24.4
-  resolution: "@babel/generator@npm:7.24.4"
+"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.7.2":
+  version: 7.24.5
+  resolution: "@babel/generator@npm:7.24.5"
   dependencies:
-    "@babel/types": "npm:^7.24.0"
+    "@babel/types": "npm:^7.24.5"
     "@jridgewell/gen-mapping": "npm:^0.3.5"
     "@jridgewell/trace-mapping": "npm:^0.3.25"
     jsesc: "npm:^2.5.1"
-  checksum: 10c0/67a1b2f7cc985aaaa11b01e8ddd4fffa4f285837bc7a209738eb8203aa34bdafeb8507ed75fd883ddbabd641a036ca0a8d984e760f28ad4a9d60bff29d0a60bb
+  checksum: 10c0/0d64f880150e7dfb92ceff2b4ac865f36aa1e295120920246492ffd0146562dabf79ba8699af1c8833f8a7954818d4d146b7b02f808df4d6024fb99f98b2f78d
   languageName: node
   linkType: hard
 
@@ -135,22 +135,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4":
-  version: 7.24.4
-  resolution: "@babel/helper-create-class-features-plugin@npm:7.24.4"
+"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4, @babel/helper-create-class-features-plugin@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/helper-create-class-features-plugin@npm:7.24.5"
   dependencies:
     "@babel/helper-annotate-as-pure": "npm:^7.22.5"
     "@babel/helper-environment-visitor": "npm:^7.22.20"
     "@babel/helper-function-name": "npm:^7.23.0"
-    "@babel/helper-member-expression-to-functions": "npm:^7.23.0"
+    "@babel/helper-member-expression-to-functions": "npm:^7.24.5"
     "@babel/helper-optimise-call-expression": "npm:^7.22.5"
     "@babel/helper-replace-supers": "npm:^7.24.1"
     "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5"
-    "@babel/helper-split-export-declaration": "npm:^7.22.6"
+    "@babel/helper-split-export-declaration": "npm:^7.24.5"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/6ebb38375dcd44c79f40008c2de4d023376cf436c135439f15c9c54603c2d6a8ada39b2e07be545da684d9e40b602a0cb0d1670f3877d056deb5f0d786c4bf86
+  checksum: 10c0/afc72e8075a249663f8024ef1760de4c0b9252bdde16419ac955fa7e15b8d4096ca1e01f796df4fa8cfdb056708886f60b631ad492242a8e47307974fc305920
   languageName: node
   linkType: hard
 
@@ -208,12 +208,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-member-expression-to-functions@npm:^7.23.0":
-  version: 7.23.0
-  resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0"
+"@babel/helper-member-expression-to-functions@npm:^7.23.0, @babel/helper-member-expression-to-functions@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/helper-member-expression-to-functions@npm:7.24.5"
   dependencies:
-    "@babel/types": "npm:^7.23.0"
-  checksum: 10c0/b810daddf093ffd0802f1429052349ed9ea08ef7d0c56da34ffbcdecbdafac86f95bdea2fe30e0e0e629febc7dd41b56cb5eacc10d1a44336d37b755dac31fa4
+    "@babel/types": "npm:^7.24.5"
+  checksum: 10c0/a3c0276a1ede8648a0e6fd86ad846cd57421d05eddfa29446b8b5a013db650462022b9ec1e65ea32c747d0542d729c80866830697f94fb12d603e87c51f080a5
   languageName: node
   linkType: hard
 
@@ -226,18 +226,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-module-transforms@npm:^7.23.3":
-  version: 7.23.3
-  resolution: "@babel/helper-module-transforms@npm:7.23.3"
+"@babel/helper-module-transforms@npm:^7.23.3, @babel/helper-module-transforms@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/helper-module-transforms@npm:7.24.5"
   dependencies:
     "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-module-imports": "npm:^7.22.15"
-    "@babel/helper-simple-access": "npm:^7.22.5"
-    "@babel/helper-split-export-declaration": "npm:^7.22.6"
-    "@babel/helper-validator-identifier": "npm:^7.22.20"
+    "@babel/helper-module-imports": "npm:^7.24.3"
+    "@babel/helper-simple-access": "npm:^7.24.5"
+    "@babel/helper-split-export-declaration": "npm:^7.24.5"
+    "@babel/helper-validator-identifier": "npm:^7.24.5"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946
+  checksum: 10c0/6e77d72f62b7e87abaea800ea0bccd4d54cde26485750969f5f493c032eb63251eb50c3522cace557781565d51c1d0c4bcc866407d24becfb109c18fb92c978d
   languageName: node
   linkType: hard
 
@@ -250,10 +250,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
-  version: 7.24.0
-  resolution: "@babel/helper-plugin-utils@npm:7.24.0"
-  checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da
+"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.24.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
+  version: 7.24.5
+  resolution: "@babel/helper-plugin-utils@npm:7.24.5"
+  checksum: 10c0/4ae40094e6a2f183281213344f4df60c66b16b19a2bc38d2bb11810a6dc0a0e7ec638957d0e433ff8b615775b8f3cd1b7edbf59440d1b50e73c389fc22913377
   languageName: node
   linkType: hard
 
@@ -283,12 +283,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-simple-access@npm:^7.22.5":
-  version: 7.22.5
-  resolution: "@babel/helper-simple-access@npm:7.22.5"
+"@babel/helper-simple-access@npm:^7.22.5, @babel/helper-simple-access@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/helper-simple-access@npm:7.24.5"
   dependencies:
-    "@babel/types": "npm:^7.22.5"
-  checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369
+    "@babel/types": "npm:^7.24.5"
+  checksum: 10c0/d96a0ab790a400f6c2dcbd9457b9ca74b9ba6d0f67ff9cd5bcc73792c8fbbd0847322a0dddbd8987dd98610ee1637c680938c7d83d3ffce7d06d7519d823d996
   languageName: node
   linkType: hard
 
@@ -301,26 +301,26 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-split-export-declaration@npm:^7.22.6":
-  version: 7.22.6
-  resolution: "@babel/helper-split-export-declaration@npm:7.22.6"
+"@babel/helper-split-export-declaration@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/helper-split-export-declaration@npm:7.24.5"
   dependencies:
-    "@babel/types": "npm:^7.22.5"
-  checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44
+    "@babel/types": "npm:^7.24.5"
+  checksum: 10c0/d7a812d67d031a348f3fb0e6263ce2dbe6038f81536ba7fb16db385383bcd6542b71833194303bf6d3d0e4f7b6b584c9c8fae8772122e2ce68fc9bdf07f4135d
   languageName: node
   linkType: hard
 
-"@babel/helper-string-parser@npm:^7.23.4":
-  version: 7.23.4
-  resolution: "@babel/helper-string-parser@npm:7.23.4"
-  checksum: 10c0/f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac
+"@babel/helper-string-parser@npm:^7.24.1":
+  version: 7.24.1
+  resolution: "@babel/helper-string-parser@npm:7.24.1"
+  checksum: 10c0/2f9bfcf8d2f9f083785df0501dbab92770111ece2f90d120352fda6dd2a7d47db11b807d111e6f32aa1ba6d763fe2dc6603d153068d672a5d0ad33ca802632b2
   languageName: node
   linkType: hard
 
-"@babel/helper-validator-identifier@npm:^7.22.20":
-  version: 7.22.20
-  resolution: "@babel/helper-validator-identifier@npm:7.22.20"
-  checksum: 10c0/dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e
+"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/helper-validator-identifier@npm:7.24.5"
+  checksum: 10c0/05f957229d89ce95a137d04e27f7d0680d84ae48b6ad830e399db0779341f7d30290f863a93351b4b3bde2166737f73a286ea42856bb07c8ddaa95600d38645c
   languageName: node
   linkType: hard
 
@@ -342,14 +342,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helpers@npm:^7.24.4":
-  version: 7.24.4
-  resolution: "@babel/helpers@npm:7.24.4"
+"@babel/helpers@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/helpers@npm:7.24.5"
   dependencies:
     "@babel/template": "npm:^7.24.0"
-    "@babel/traverse": "npm:^7.24.1"
-    "@babel/types": "npm:^7.24.0"
-  checksum: 10c0/747ef62b7fe87de31a2f3c19ff337a86cbb79be2f6c18af63133b614ab5a8f6da5b06ae4b06fb0e71271cb6a27efec6f8b6c9f44c60b8a18777832dc7929e6c5
+    "@babel/traverse": "npm:^7.24.5"
+    "@babel/types": "npm:^7.24.5"
+  checksum: 10c0/0630b0223c3a9a34027ddc05b3bac54d68d5957f84e92d2d4814b00448a76e12f9188f9c85cfce2011696d82a8ffcbd8189da097c0af0181d32eb27eca34185e
   languageName: node
   linkType: hard
 
@@ -365,24 +365,24 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4":
-  version: 7.24.4
-  resolution: "@babel/parser@npm:7.24.4"
+"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/parser@npm:7.24.5"
   bin:
     parser: ./bin/babel-parser.js
-  checksum: 10c0/8381e1efead5069cb7ed2abc3a583f4a86289b2f376c75cecc69f59a8eb36df18274b1886cecf2f97a6a0dff5334b27330f58535be9b3e4e26102cc50e12eac8
+  checksum: 10c0/8333a6ad5328bad34fa0e12bcee147c3345ea9a438c0909e7c68c6cfbea43c464834ffd7eabd1cbc1c62df0a558e22ffade9f5b29440833ba7b33d96a71f88c0
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.4":
-  version: 7.24.4
-  resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.4"
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.5"
   dependencies:
     "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/9aed453a1a21e4fd29add0b4a2d82a2c6f43a47c80d28411f8327f2a714064bc93a6f622c701d263970e0d72d7901d28f7f51e91ba91a31306efe8f17c411182
+  checksum: 10c0/b471972dcc4a3ba32821329a57725e2b563421e975d7ffec7fcabd70af0fced6a50bcc9ed2a8cbd4a9ac7c09cfbf43c7116e82f3b9064b33a22309500b632108
   languageName: node
   linkType: hard
 
@@ -712,14 +712,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-block-scoping@npm:^7.24.4":
-  version: 7.24.4
-  resolution: "@babel/plugin-transform-block-scoping@npm:7.24.4"
+"@babel/plugin-transform-block-scoping@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-block-scoping@npm:7.24.5"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/62f55fd1b60a115506e9553c3bf925179b1ab8a42dc31471c4e3ada20573a488b5c5e3317145da352493ef07f1d9750ce1f8a49cb3f39489ac1ab42e5ddc883d
+  checksum: 10c0/85997fc8179b7d26e8af30865aeb91789f3bc1f0cd5643ed25f25891ff9c071460ec1220599b19070b424a3b902422f682e9b02e515872540173eae2e25f760c
   languageName: node
   linkType: hard
 
@@ -748,21 +748,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-classes@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-classes@npm:7.24.1"
+"@babel/plugin-transform-classes@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-classes@npm:7.24.5"
   dependencies:
     "@babel/helper-annotate-as-pure": "npm:^7.22.5"
     "@babel/helper-compilation-targets": "npm:^7.23.6"
     "@babel/helper-environment-visitor": "npm:^7.22.20"
     "@babel/helper-function-name": "npm:^7.23.0"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
     "@babel/helper-replace-supers": "npm:^7.24.1"
-    "@babel/helper-split-export-declaration": "npm:^7.22.6"
+    "@babel/helper-split-export-declaration": "npm:^7.24.5"
     globals: "npm:^11.1.0"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/586a95826be4d68056fa23d8e6c34353ce2ea59bf3ca8cf62bc784e60964d492d76e1b48760c43fd486ffb65a79d3fed9a4f91289e4f526f88c3b6acc0dfb00e
+  checksum: 10c0/4affcbb7cb01fa4764c7a4b534c30fd24a4b68e680a2d6e242dd7ca8726490f0f1426c44797deff84a38a162e0629718900c68d28daffe2b12adf5b4194156a7
   languageName: node
   linkType: hard
 
@@ -778,14 +778,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-destructuring@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-destructuring@npm:7.24.1"
+"@babel/plugin-transform-destructuring@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-destructuring@npm:7.24.5"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/a08e706a9274a699abc3093f38c72d4a5354eac11c44572cc9ea049915b6e03255744297069fd94fcce82380725c5d6b1b11b9a84c0081aa3aa6fc2fdab98ef6
+  checksum: 10c0/6a37953a95f04b335bf3e2118fb93f50dd9593c658d1b2f8918a380a2ee30f1b420139eccf7ec3873c86a8208527895fcf6b7e21c0e734a6ad6e5d5042eace4d
   languageName: node
   linkType: hard
 
@@ -1017,17 +1017,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-object-rest-spread@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1"
+"@babel/plugin-transform-object-rest-spread@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.5"
   dependencies:
     "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
     "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3"
-    "@babel/plugin-transform-parameters": "npm:^7.24.1"
+    "@babel/plugin-transform-parameters": "npm:^7.24.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e301f1a66b63bafc2bce885305cc88ab30ec875b5e2c7933fb7f9cbf0d954685aa10334ffcecf147ba19d6a1d7ffab37baf4ce871849d395941c56fdb3060f73
+  checksum: 10c0/91d7303af9b5744b8f569c1b8e45c9c9322ded05e7ee94e71b9ff2327f0d2c7b5aa87e040697a6baacc2dcb5c5e5e00913087c36f24c006bdaa4f958fd5bfd2d
   languageName: node
   linkType: hard
 
@@ -1055,27 +1055,27 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-optional-chaining@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1"
+"@babel/plugin-transform-optional-chaining@npm:^7.24.1, @babel/plugin-transform-optional-chaining@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.5"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
     "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5"
     "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/b4688795229c9e9ce978eccf979fe515eb4e8d864d2dcd696baa937c8db13e3d46cff664a3cd6119dfe60e261f5d359b10c6783effab7cc91d75d03ad7f43d05
+  checksum: 10c0/f4e9446ec69f58f40b7843ce7603cfc50332976e6e794d4ddbe6b24670cd50ebc7766c4e3cbaecf0fbb744e98cbfbb54146f4e966314b1d58511b8bbf3d2722b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-parameters@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-parameters@npm:7.24.1"
+"@babel/plugin-transform-parameters@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-parameters@npm:7.24.5"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/eee8d2f72d3ee0876dc8d85f949f4adf34685cfe36c814ebc20c96315f3891a53d43c764d636b939e34d55e6a6a4af9aa57ed0d7f9439eb5771a07277c669e55
+  checksum: 10c0/e08b8c46a24b1b21dde7783cb0aeb56ffe9ef6d6f1795649ce76273657158d3bfa5370c6594200ed7d371983b599c8e194b76108dffed9ab5746fe630ef2e8f5
   languageName: node
   linkType: hard
 
@@ -1091,17 +1091,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-private-property-in-object@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1"
+"@babel/plugin-transform-private-property-in-object@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.5"
   dependencies:
     "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.1"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-class-features-plugin": "npm:^7.24.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
     "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/33d2b9737de7667d7a1b704eef99bfecc6736157d9ea28c2e09010d5f25e33ff841c41d89a4430c5d47f4eb3384e24770fa0ec79600e1e38d6d16e2f9333b4b5
+  checksum: 10c0/de7182bfde298e56c08a5d7ee1156f83c9af8c856bbe2248438848846a4ce544e050666bd0482e16a6006195e8be4923abd14650bef51fa0edd7f82014c2efcd
   languageName: node
   linkType: hard
 
@@ -1272,14 +1272,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-typeof-symbol@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.1"
+"@babel/plugin-transform-typeof-symbol@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.5"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/d392f549bfd13414f59feecdf3fb286f266a3eb9107a9de818e57907bda56eed08d1f6f8e314d09bf99252df026a7fd4d5df839acd45078a777abcebaa9a8593
+  checksum: 10c0/5f0b5e33a86b84d89673829ffa2b5f175e102d3d0f45917cda121bc2b3650e1e5bb7a653f8cc1059c5b3a7b2e91e1aafd6623028b96ae752715cc5c2171c96e5
   languageName: node
   linkType: hard
 
@@ -1345,14 +1345,14 @@ __metadata:
   linkType: hard
 
 "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4":
-  version: 7.24.4
-  resolution: "@babel/preset-env@npm:7.24.4"
+  version: 7.24.5
+  resolution: "@babel/preset-env@npm:7.24.5"
   dependencies:
     "@babel/compat-data": "npm:^7.24.4"
     "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.5"
     "@babel/helper-validator-option": "npm:^7.23.5"
-    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.4"
+    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.5"
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1"
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1"
     "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1"
@@ -1379,12 +1379,12 @@ __metadata:
     "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3"
     "@babel/plugin-transform-async-to-generator": "npm:^7.24.1"
     "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1"
-    "@babel/plugin-transform-block-scoping": "npm:^7.24.4"
+    "@babel/plugin-transform-block-scoping": "npm:^7.24.5"
     "@babel/plugin-transform-class-properties": "npm:^7.24.1"
     "@babel/plugin-transform-class-static-block": "npm:^7.24.4"
-    "@babel/plugin-transform-classes": "npm:^7.24.1"
+    "@babel/plugin-transform-classes": "npm:^7.24.5"
     "@babel/plugin-transform-computed-properties": "npm:^7.24.1"
-    "@babel/plugin-transform-destructuring": "npm:^7.24.1"
+    "@babel/plugin-transform-destructuring": "npm:^7.24.5"
     "@babel/plugin-transform-dotall-regex": "npm:^7.24.1"
     "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1"
     "@babel/plugin-transform-dynamic-import": "npm:^7.24.1"
@@ -1404,13 +1404,13 @@ __metadata:
     "@babel/plugin-transform-new-target": "npm:^7.24.1"
     "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1"
     "@babel/plugin-transform-numeric-separator": "npm:^7.24.1"
-    "@babel/plugin-transform-object-rest-spread": "npm:^7.24.1"
+    "@babel/plugin-transform-object-rest-spread": "npm:^7.24.5"
     "@babel/plugin-transform-object-super": "npm:^7.24.1"
     "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1"
-    "@babel/plugin-transform-optional-chaining": "npm:^7.24.1"
-    "@babel/plugin-transform-parameters": "npm:^7.24.1"
+    "@babel/plugin-transform-optional-chaining": "npm:^7.24.5"
+    "@babel/plugin-transform-parameters": "npm:^7.24.5"
     "@babel/plugin-transform-private-methods": "npm:^7.24.1"
-    "@babel/plugin-transform-private-property-in-object": "npm:^7.24.1"
+    "@babel/plugin-transform-private-property-in-object": "npm:^7.24.5"
     "@babel/plugin-transform-property-literals": "npm:^7.24.1"
     "@babel/plugin-transform-regenerator": "npm:^7.24.1"
     "@babel/plugin-transform-reserved-words": "npm:^7.24.1"
@@ -1418,7 +1418,7 @@ __metadata:
     "@babel/plugin-transform-spread": "npm:^7.24.1"
     "@babel/plugin-transform-sticky-regex": "npm:^7.24.1"
     "@babel/plugin-transform-template-literals": "npm:^7.24.1"
-    "@babel/plugin-transform-typeof-symbol": "npm:^7.24.1"
+    "@babel/plugin-transform-typeof-symbol": "npm:^7.24.5"
     "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1"
     "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1"
     "@babel/plugin-transform-unicode-regex": "npm:^7.24.1"
@@ -1431,7 +1431,7 @@ __metadata:
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/72a79d0cd38cb26f143509dd0c58db34b5b1ae90116863f55a404f0eb06a64a3cdcb1abd0b6435fafe463bbf55b82ffcf56aedee91e8d37797bf53e4ae74c413
+  checksum: 10c0/2cc0edae09205d6409a75d02e53aaa1c590e89adbb7b389019c7b75e4c47b6b63eeb1a816df5c42b672ce410747e7ddc23b6747e8e41a6c95d6fa00c665509e2
   languageName: node
   linkType: hard
 
@@ -1496,11 +1496,11 @@ __metadata:
   linkType: hard
 
 "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
-  version: 7.24.4
-  resolution: "@babel/runtime@npm:7.24.4"
+  version: 7.24.5
+  resolution: "@babel/runtime@npm:7.24.5"
   dependencies:
     regenerator-runtime: "npm:^0.14.0"
-  checksum: 10c0/785aff96a3aa8ff97f90958e1e8a7b1d47f793b204b47c6455eaadc3f694f48c97cd5c0a921fe3596d818e71f18106610a164fb0f1c71fd68c622a58269d537c
+  checksum: 10c0/05730e43e8ba6550eae9fd4fb5e7d9d3cb91140379425abcb2a1ff9cebad518a280d82c4c4b0f57ada26a863106ac54a748d90c775790c0e2cd0ddd85ccdf346
   languageName: node
   linkType: hard
 
@@ -1515,32 +1515,32 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/traverse@npm:7.24.1"
+"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.5":
+  version: 7.24.5
+  resolution: "@babel/traverse@npm:7.24.5"
   dependencies:
-    "@babel/code-frame": "npm:^7.24.1"
-    "@babel/generator": "npm:^7.24.1"
+    "@babel/code-frame": "npm:^7.24.2"
+    "@babel/generator": "npm:^7.24.5"
     "@babel/helper-environment-visitor": "npm:^7.22.20"
     "@babel/helper-function-name": "npm:^7.23.0"
     "@babel/helper-hoist-variables": "npm:^7.22.5"
-    "@babel/helper-split-export-declaration": "npm:^7.22.6"
-    "@babel/parser": "npm:^7.24.1"
-    "@babel/types": "npm:^7.24.0"
+    "@babel/helper-split-export-declaration": "npm:^7.24.5"
+    "@babel/parser": "npm:^7.24.5"
+    "@babel/types": "npm:^7.24.5"
     debug: "npm:^4.3.1"
     globals: "npm:^11.1.0"
-  checksum: 10c0/c087b918f6823776537ba246136c70e7ce0719fc05361ebcbfd16f4e6f2f6f1f8f4f9167f1d9b675f27d12074839605189cc9d689de20b89a85e7c140f23daab
+  checksum: 10c0/3f22534bc2b2ed9208e55ef48af3b32939032b23cb9dc4037447cb108640df70bbb0b9fea86e9c58648949fdc2cb14e89aa79ffa3c62a5dd43459a52fe8c01d1
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
-  version: 7.24.0
-  resolution: "@babel/types@npm:7.24.0"
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
+  version: 7.24.5
+  resolution: "@babel/types@npm:7.24.5"
   dependencies:
-    "@babel/helper-string-parser": "npm:^7.23.4"
-    "@babel/helper-validator-identifier": "npm:^7.22.20"
+    "@babel/helper-string-parser": "npm:^7.24.1"
+    "@babel/helper-validator-identifier": "npm:^7.24.5"
     to-fast-properties: "npm:^2.0.0"
-  checksum: 10c0/777a0bb5dbe038ca4c905fdafb1cdb6bdd10fe9d63ce13eca0bd91909363cbad554a53dc1f902004b78c1dcbc742056f877f2c99eeedff647333b1fadf51235d
+  checksum: 10c0/e1284eb046c5e0451b80220d1200e2327e0a8544a2fe45bb62c952e5fdef7099c603d2336b17b6eac3cc046b7a69bfbce67fe56e1c0ea48cd37c65cb88638f2a
   languageName: node
   linkType: hard
 

From 40d7a553d222157aac56b2f5d9e224403e57eec3 Mon Sep 17 00:00:00 2001
From: Shlee <github@shl.ee>
Date: Tue, 30 Apr 2024 18:51:39 +1000
Subject: [PATCH 029/215] Minor phrasing on tootcli statuses remove (#30122)

---
 lib/mastodon/cli/statuses.rb | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/lib/mastodon/cli/statuses.rb b/lib/mastodon/cli/statuses.rb
index 57b03c941..f441dbcd8 100644
--- a/lib/mastodon/cli/statuses.rb
+++ b/lib/mastodon/cli/statuses.rb
@@ -191,24 +191,24 @@ module Mastodon::CLI
 
     def vacuum_and_analyze_statuses
       if options[:compress_database]
-        say('Run VACUUM FULL ANALYZE to statuses...')
+        say('Running "VACUUM FULL ANALYZE statuses"...')
         ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE statuses')
-        say('Run REINDEX to statuses...')
+        say('Running "REINDEX TABLE statuses"...')
         ActiveRecord::Base.connection.execute('REINDEX TABLE statuses')
       else
-        say('Run ANALYZE to statuses...')
+        say('Running "ANALYZE statuses"...')
         ActiveRecord::Base.connection.execute('ANALYZE statuses')
       end
     end
 
     def vacuum_and_analyze_conversations
       if options[:compress_database]
-        say('Run VACUUM FULL ANALYZE to conversations...')
+        say('Running "VACUUM FULL ANALYZE conversations"...')
         ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE conversations')
-        say('Run REINDEX to conversations...')
+        say('Running "REINDEX TABLE conversations"...')
         ActiveRecord::Base.connection.execute('REINDEX TABLE conversations')
       else
-        say('Run ANALYZE to conversations...')
+        say('Running "ANALYZE conversations"...')
         ActiveRecord::Base.connection.execute('ANALYZE conversations')
       end
     end

From 56821ed87991eab3609dae53b2e2416053e42fd0 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 30 Apr 2024 11:05:53 +0200
Subject: [PATCH 030/215] New Crowdin Translations (automated) (#30128)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/cy.json | 64 +++++++++++++++++++++++++
 app/javascript/mastodon/locales/ia.json |  1 +
 app/javascript/mastodon/locales/ja.json |  4 +-
 app/javascript/mastodon/locales/lt.json | 14 ++++++
 app/javascript/mastodon/locales/sk.json |  1 +
 config/locales/cy.yml                   | 27 ++++++++++-
 config/locales/doorkeeper.cy.yml        |  1 +
 config/locales/doorkeeper.lt.yml        |  1 +
 config/locales/gl.yml                   |  1 +
 config/locales/ia.yml                   |  5 ++
 config/locales/lt.yml                   |  2 +
 config/locales/simple_form.cy.yml       |  4 ++
 config/locales/simple_form.fi.yml       |  1 +
 config/locales/simple_form.gl.yml       |  4 ++
 config/locales/simple_form.ia.yml       |  5 ++
 config/locales/simple_form.is.yml       |  2 +
 config/locales/simple_form.lt.yml       |  4 ++
 config/locales/sv.yml                   |  1 +
 18 files changed, 139 insertions(+), 3 deletions(-)

diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index d2731b629..fd8fc74be 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -89,6 +89,14 @@
   "announcement.announcement": "Cyhoeddiad",
   "attachments_list.unprocessed": "(heb eu prosesu)",
   "audio.hide": "Cuddio sain",
+  "block_modal.remote_users_caveat": "Byddwn yn gofyn i'r gweinydd {domain} barchu eich penderfyniad. Fodd bynnag, nid yw cydymffurfiad wedi'i warantu gan y gall rhai gweinyddwyr drin rhwystro mewn ffyrdd gwahanol. Mae'n bosibl y bydd postiadau cyhoeddus yn dal i fod yn weladwy i ddefnyddwyr nad ydynt wedi mewngofnodi.",
+  "block_modal.show_less": "Dangos llai",
+  "block_modal.show_more": "Dangos mwy",
+  "block_modal.they_cant_mention": "Nid ydynt yn gallu eich crybwyll na'ch dilyn.",
+  "block_modal.they_cant_see_posts": "Nid ydynt yn gallu gweld eich postiadau ac ni fyddwch yn gweld eu rhai hwy.",
+  "block_modal.they_will_know": "Gallant weld eu bod wedi'u rhwystro.",
+  "block_modal.title": "Rhwystro defnyddiwr?",
+  "block_modal.you_wont_see_mentions": "Ni welwch bostiadau sy'n sôn amdanynt.",
   "boost_modal.combo": "Mae modd pwyso {combo} er mwyn hepgor hyn tro nesa",
   "bundle_column_error.copy_stacktrace": "Copïo'r adroddiad gwall",
   "bundle_column_error.error.body": "Nid oedd modd cynhyrchu'r dudalen honno. Gall fod oherwydd gwall yn ein cod neu fater cydnawsedd porwr.",
@@ -169,6 +177,7 @@
   "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?",
   "confirmations.discard_edit_media.confirm": "Dileu",
   "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?",
+  "confirmations.domain_block.confirm": "Rhwystro gweinydd",
   "confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.",
   "confirmations.edit.confirm": "Golygu",
   "confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?",
@@ -200,6 +209,27 @@
   "dismissable_banner.explore_statuses": "Mae'r rhain yn bostiadau o bob rhan o'r we gymdeithasol sydd ar gynnydd heddiw. Mae postiadau mwy diweddar sydd â mwy o hybiau a ffefrynu'n cael eu graddio'n uwch.",
   "dismissable_banner.explore_tags": "Mae'r rhain yn hashnodau sydd ar gynnydd ar y we gymdeithasol heddiw. Mae hashnodau sy'n cael eu defnyddio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.",
   "dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y we gymdeithasol y mae pobl ar {domain} yn eu dilyn.",
+  "domain_block_modal.block": "Rhwystro gweinydd",
+  "domain_block_modal.block_account_instead": "Rhwystro @{name} yn lle hynny",
+  "domain_block_modal.they_can_interact_with_old_posts": "Gall pobl o'r gweinydd hwn ryngweithio â'ch hen bostiadau.",
+  "domain_block_modal.they_cant_follow": "Ni all neb o'r gweinydd hwn eich dilyn.",
+  "domain_block_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu rhwystro.",
+  "domain_block_modal.title": "Rhwystro parth?",
+  "domain_block_modal.you_will_lose_followers": "Bydd eich holl ddilynwyr o'r gweinydd hwn yn cael eu tynnu.",
+  "domain_block_modal.you_wont_see_posts": "Fyddwch chi ddim yn gweld postiadau na hysbysiadau gan ddefnyddwyr ar y gweinydd hwn.",
+  "domain_pill.activitypub_lets_connect": "Mae'n caniatáu ichi gysylltu a rhyngweithio â phobl nid yn unig ar Mastodon, ond ar draws gwahanol apiau cymdeithasol hefyd.",
+  "domain_pill.activitypub_like_language": "Mae ActivityPub fel yr iaith y mae Mastodon yn ei siarad â rhwydweithiau cymdeithasol eraill.",
+  "domain_pill.server": "Gweinydd",
+  "domain_pill.their_handle": "Eu handlen:",
+  "domain_pill.their_server": "Eu cartref digidol, lle mae eu holl negeseuon yn byw.",
+  "domain_pill.their_username": "Eu dynodwr unigryw ar eu gweinydd. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
+  "domain_pill.username": "Enw Defnyddiwr",
+  "domain_pill.whats_in_a_handle": "Beth sydd mewn handlen?",
+  "domain_pill.who_they_are": "Gan fod handlen yn dweud pwy yw rhywun a ble maen nhw, gallwch chi ryngweithio â phobl ar draws gwe gymdeithasol <button>llwyfannau wedi'u pweru gan ActivityPub</button> .",
+  "domain_pill.who_you_are": "Oherwydd bod eich handlen yn dweud pwy ydych chi a ble rydych chi, gall pobl ryngweithio â chi ar draws gwe gymdeithasol <button>llwyfannau wedi'u pweru gan ActivityPub</button> .",
+  "domain_pill.your_handle": "Eich handlen:",
+  "domain_pill.your_server": "Eich cartref digidol, lle mae'ch holl bostiadau'n byw. Ddim yn hoffi'r un hon? Trosglwyddwch weinyddion ar unrhyw adeg a dewch â'ch dilynwyr hefyd.",
+  "domain_pill.your_username": "Eich dynodwr unigryw ar y gweinydd hwn. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
   "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
   "embed.preview": "Dyma sut olwg fydd arno:",
   "emoji_button.activity": "Gweithgarwch",
@@ -267,6 +297,8 @@
   "filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd",
   "filter_modal.select_filter.title": "Hidlo'r postiad hwn",
   "filter_modal.title.status": "Hidlo postiad",
+  "filtered_notifications_banner.mentions": "{count, plural, one {crybwylliad} other {crybwylliad}}",
+  "filtered_notifications_banner.pending_requests": "Hysbysiadau gan {count, plural, =0 {neb} one {un person} other {# person}} efallai y gwyddoch amdanyn nhw",
   "filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo",
   "firehose.all": "Popeth",
   "firehose.local": "Gweinydd hwn",
@@ -276,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, roedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.",
   "follow_suggestions.curated_suggestion": "Dewis staff",
   "follow_suggestions.dismiss": "Peidio â dangos hwn eto",
+  "follow_suggestions.featured_longer": "Wedi'i ddewis â llaw gan dîm {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Yn boblogaidd ymhlith y bobl rydych chi'n eu dilyn",
   "follow_suggestions.hints.featured": "Mae'r proffil hwn wedi'i ddewis yn arbennig gan dîm {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Mae'r proffil hwn yn boblogaidd ymhlith y bobl rydych chi'n eu dilyn.",
   "follow_suggestions.hints.most_followed": "Mae'r proffil hwn yn un o'r rhai sy'n cael ei ddilyn fwyaf ar {domain}.",
@@ -283,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Mae'r proffil hwn yn debyg i'r proffiliau rydych chi wedi'u dilyn yn fwyaf diweddar.",
   "follow_suggestions.personalized_suggestion": "Awgrym personol",
   "follow_suggestions.popular_suggestion": "Awgrym poblogaidd",
+  "follow_suggestions.popular_suggestion_longer": "Yn boblogaidd ar {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Yn debyg i broffiliau y gwnaethoch chi eu dilyn yn ddiweddar",
   "follow_suggestions.view_all": "Gweld y cyfan",
   "follow_suggestions.who_to_follow": "Pwy i ddilyn",
   "followed_tags": "Hashnodau rydych yn eu dilyn",
@@ -396,6 +432,15 @@
   "loading_indicator.label": "Yn llwytho…",
   "media_gallery.toggle_visible": "{number, plural, one {Cuddio delwedd} other {Cuddio delwedd}}",
   "moved_to_account_banner.text": "Ar hyn y bryd, mae eich cyfrif {disabledAccount} wedi ei analluogi am i chi symud i {movedToAccount}.",
+  "mute_modal.hide_from_notifications": "Cuddio rhag hysbysiadau",
+  "mute_modal.hide_options": "Cuddio'r dewis",
+  "mute_modal.indefinite": "Nes i mi eu dad-dewi",
+  "mute_modal.show_options": "Dangos y dewis",
+  "mute_modal.they_can_mention_and_follow": "Gallan nhw eich crybwyll a'ch dilyn, ond fyddwch chi ddim yn eu gweld.",
+  "mute_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu tawelu.",
+  "mute_modal.title": "Tewi defnyddiwr?",
+  "mute_modal.you_wont_see_mentions": "Welwch chi ddim postiadau sy'n sôn amdanyn nhw.",
+  "mute_modal.you_wont_see_posts": "Gallan nhw weld eich postiadau o hyd, ond fyddwch chi ddim yn gweld eu rhai hwy.",
   "navigation_bar.about": "Ynghylch",
   "navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch",
   "navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
@@ -428,9 +473,23 @@
   "notification.follow": "Dilynodd {name} chi",
   "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
   "notification.mention": "Crybwyllodd {name} amdanoch chi",
+  "notification.moderation-warning.learn_more": "Dysgu mwy",
+  "notification.moderation_warning": "Rydych wedi derbyn rhybudd cymedroli",
+  "notification.moderation_warning.action_delete_statuses": "Mae rhai o'ch postiadau wedi'u dileu.",
+  "notification.moderation_warning.action_disable": "Mae eich cyfrif wedi'i analluogi.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Mae rhai o'ch postiadau wedi'u marcio'n sensitif.",
+  "notification.moderation_warning.action_none": "Mae eich cyfrif wedi derbyn rhybudd cymedroli.",
+  "notification.moderation_warning.action_sensitive": "Bydd eich postiadau'n cael eu marcio'n sensitif o hyn ymlaen.",
+  "notification.moderation_warning.action_silence": "Mae eich cyfrif wedi'i gyfyngu.",
+  "notification.moderation_warning.action_suspend": "Mae eich cyfrif wedi'i hatal.",
   "notification.own_poll": "Mae eich pleidlais wedi dod i ben",
   "notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben",
   "notification.reblog": "Hybodd {name} eich post",
+  "notification.relationships_severance_event": "Wedi colli cysylltiad â {name}",
+  "notification.relationships_severance_event.account_suspension": "Mae gweinyddwr o {from} wedi atal {target}, sy'n golygu na allwch dderbyn diweddariadau ganddynt mwyach na rhyngweithio â nhw.",
+  "notification.relationships_severance_event.domain_block": "Mae gweinyddwr o {from} wedi rhwystro {target}, gan gynnwys {followersCount} o'ch dilynwyr a {followingCount, plural, one {# cyfrif} other {# cyfrif}} arall rydych chi'n ei ddilyn.",
+  "notification.relationships_severance_event.learn_more": "Dysgu mwy",
+  "notification.relationships_severance_event.user_domain_block": "Rydych wedi rhwystro {target}, gan ddileu {followersCount} o'ch dilynwyr a {followingCount, plural, one {# cyfrif} other {#cyfrifon}} arall rydych yn ei ddilyn.",
   "notification.status": "{name} newydd ei bostio",
   "notification.update": "Golygodd {name} bostiad",
   "notification_requests.accept": "Derbyn",
@@ -443,6 +502,8 @@
   "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:",
   "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
   "notifications.column_settings.favourite": "Ffefrynnau:",
+  "notifications.column_settings.filter_bar.advanced": "Dangos pob categori",
+  "notifications.column_settings.filter_bar.category": "Bar hidlo cyflym",
   "notifications.column_settings.follow": "Dilynwyr newydd:",
   "notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:",
   "notifications.column_settings.mention": "Crybwylliadau:",
@@ -653,9 +714,11 @@
   "status.direct": "Crybwyll yn breifat @{name}",
   "status.direct_indicator": "Crybwyll preifat",
   "status.edit": "Golygu",
+  "status.edited": "Golygwyd ddiwethaf {date}",
   "status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}",
   "status.embed": "Mewnblannu",
   "status.favourite": "Hoffi",
+  "status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}",
   "status.filter": "Hidlo'r postiad hwn",
   "status.filtered": "Wedi'i hidlo",
   "status.hide": "Cuddio'r postiad",
@@ -676,6 +739,7 @@
   "status.reblog": "Hybu",
   "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
   "status.reblogged_by": "Hybodd {name}",
+  "status.reblogs": "{count, plural, one {hwb} other {hwb}}",
   "status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
   "status.redraft": "Dileu ac ailddrafftio",
   "status.remove_bookmark": "Tynnu nod tudalen",
diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index 73634b99c..1b969639d 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -469,6 +469,7 @@
   "notification.follow": "{name} te ha sequite",
   "notification.follow_request": "{name} ha requestate de sequer te",
   "notification.mention": "{name} te ha mentionate",
+  "notification.moderation-warning.learn_more": "Apprender plus",
   "notification.own_poll": "Tu sondage ha finite",
   "notification.poll": "Un sondage in le qual tu ha votate ha finite",
   "notification.reblog": "{name} ha impulsate tu message",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 6824a76a3..c11e4a2af 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -299,7 +299,7 @@
   "filter_modal.title.status": "投稿をフィルターする",
   "filtered_notifications_banner.mentions": "{count, plural, one {メンション} other {メンション}}",
   "filtered_notifications_banner.pending_requests": "{count, plural, =0 {通知がブロックされているアカウントはありません} other {#アカウントからの通知がブロックされています}}",
-  "filtered_notifications_banner.title": "ブロック済みの通知",
+  "filtered_notifications_banner.title": "保留中の通知",
   "firehose.all": "すべて",
   "firehose.local": "このサーバー",
   "firehose.remote": "ほかのサーバー",
@@ -486,7 +486,7 @@
   "notification_requests.accept": "受け入れる",
   "notification_requests.dismiss": "無視",
   "notification_requests.notifications_from": "{name}からの通知",
-  "notification_requests.title": "ブロック済みの通知",
+  "notification_requests.title": "保留中の通知",
   "notifications.clear": "通知を消去",
   "notifications.clear_confirmation": "本当に通知を消去しますか?",
   "notifications.column_settings.admin.report": "新しい通報:",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 7b3511cfe..546b9b755 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -282,6 +282,7 @@
   "filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.",
   "filter_modal.select_filter.title": "Filtruoti šį įrašą",
   "filter_modal.title.status": "Filtruoti įrašą",
+  "filtered_notifications_banner.mentions": "{count, plural, one {paminėjimas} few {paminėjimai} many {paminėjimo} other {paminėjimų}}",
   "firehose.all": "Visi",
   "firehose.local": "Šis serveris",
   "firehose.remote": "Kiti serveriai",
@@ -290,6 +291,8 @@
   "follow_requests.unlocked_explanation": "Nors tavo paskyra neužrakinta, {domain} personalas mano, kad galbūt norėsi rankiniu būdu patikrinti šių paskyrų sekimo prašymus.",
   "follow_suggestions.curated_suggestion": "Personalo pasirinkimai",
   "follow_suggestions.dismiss": "Daugiau nerodyti",
+  "follow_suggestions.featured_longer": "Rankomis atrinkta {domain} komanda",
+  "follow_suggestions.friends_of_friends_longer": "Populiarus tarp žmonių, kurių seki",
   "follow_suggestions.hints.featured": "Šį profilį atrinko {domain} komanda.",
   "follow_suggestions.hints.friends_of_friends": "Šis profilis yra populiarus tarp žmonių, kuriuos seki.",
   "follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų {domain}.",
@@ -297,6 +300,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Šis profilis panašus į profilius, kuriuos neseniai sekei.",
   "follow_suggestions.personalized_suggestion": "Suasmenintas pasiūlymas",
   "follow_suggestions.popular_suggestion": "Populiarus pasiūlymas",
+  "follow_suggestions.popular_suggestion_longer": "Populiarus domene {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Panašūs į profilius, kuriuos neseniai seki",
   "follow_suggestions.view_all": "Peržiūrėti viską",
   "follow_suggestions.who_to_follow": "Ką sekti",
   "followed_tags": "Sekami saitažodžiai",
@@ -442,6 +447,15 @@
   "notification.follow": "{name} seka tave",
   "notification.follow_request": "{name} paprašė tave sekti",
   "notification.mention": "{name} paminėjo tave",
+  "notification.moderation-warning.learn_more": "Sužinoti daugiau",
+  "notification.moderation_warning": "Gavai prižiūrėjimo įspėjimą",
+  "notification.moderation_warning.action_delete_statuses": "Kai kurie tavo įrašai buvo pašalintos.",
+  "notification.moderation_warning.action_disable": "Tavo paskyra buvo išjungta.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Kai kurie tavo įrašai buvo pažymėtos kaip jautrios.",
+  "notification.moderation_warning.action_none": "Tavo paskyra gavo prižiūrėjimo įspėjimą.",
+  "notification.moderation_warning.action_sensitive": "Nuo šiol tavo įrašai bus pažymėti kaip jautrūs.",
+  "notification.moderation_warning.action_silence": "Tavo paskyra buvo apribota.",
+  "notification.moderation_warning.action_suspend": "Tavo paskyra buvo sustabdyta.",
   "notification.own_poll": "Tavo apklausa baigėsi",
   "notification.poll": "Apklausa, kurioje balsavai, pasibaigė",
   "notification.reblog": "{name} pakėlė tavo įrašą",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index ea46b8223..e126fdef0 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -246,6 +246,7 @@
   "empty_column.list": "Tento zoznam je zatiaľ prázdny. Keď ale členovia tohoto zoznamu uverejnia nové príspevky, objavia sa tu.",
   "empty_column.lists": "Zatiaľ nemáte žiadne zoznamy. Keď nejaký vytvoríte, zobrazí sa tu.",
   "empty_column.mutes": "Zatiaľ ste si nikoho nestíšili.",
+  "empty_column.notification_requests": "Všetko čisté! Nič tu nieje. Keď dostaneš nové oboznámenia, zobrazia sa tu podľa tvojich nastavení.",
   "empty_column.notifications": "Zatiaľ nemáte žiadne upozornenia. Začnú vám pribúdať, keď s vami začnú interagovať ostatní.",
   "empty_column.public": "Zatiaľ tu nič nie je. Napíšte niečo verejné alebo začnite sledovať účty z iných serverov, aby tu niečo pribudlo.",
   "error.unexpected_crash.explanation": "Pre chybu v našom kóde alebo problém s kompatibilitou prehliadača nebolo túto stránku možné zobraziť správne.",
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 93d249cb5..f96068f21 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -645,6 +645,9 @@ cy:
       actions_description_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Os byddwch yn cymryd camau cosbol yn erbyn y cyfrif a adroddwyd, bydd hysbysiad e-bost yn cael ei anfon atyn nhw, ac eithrio pan fydd y categori <strong>Sbam</strong> yn cael ei ddewis.
       actions_description_remote_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Bydd hyn ond yn effeithio ar sut <strong>mae'ch</strong> gweinydd yn cyfathrebu â'r cyfrif hwn o bell ac yn trin ei gynnwys.
       add_to_report: Ychwanegu rhagor i adroddiad
+      already_suspended_badges:
+        local: Wedi atal dros dro ar y gweinydd hwn yn barod
+        remote: Wedi'i atal eisoes ar eu gweinydd
       are_you_sure: Ydych chi'n siŵr?
       assign_to_self: Neilltuo i mi
       assigned: Cymedrolwr wedi'i neilltuo
@@ -804,6 +807,7 @@ cy:
         desc_html: Mae hyn yn dibynnu ar sgriptiau allanol gan hCaptcha, a all fod yn bryder diogelwch a phreifatrwydd. Yn ogystal, <strong>gall hyn wneud y broses gofrestru yn llawer llai hygyrch i rai pobl (yn enwedig yr anabl)</strong>. Am y rhesymau hyn, ystyriwch fesurau eraill fel cofrestru ar sail cymeradwyaeth neu ar sail gwahoddiad.
         title: Ei gwneud yn ofynnol i ddefnyddwyr newydd ddatrys CAPTCHA i gadarnhau eu cyfrif
       content_retention:
+        danger_zone: Parth perygl
         preamble: Rheoli sut mae cynnwys sy'n cael ei gynhyrchu gan ddefnyddwyr yn cael ei storio yn Mastodon.
         title: Cadw cynnwys
       default_noindex:
@@ -1756,13 +1760,26 @@ cy:
     import: Mewnforio
     import_and_export: Mewnforio ac allforio
     migrate: Mudo cyfrif
+    notifications: Hysbysiadau e-bost
     preferences: Dewisiadau
     profile: Proffil cyhoeddus
     relationships: Yn dilyn a dilynwyr
+    severed_relationships: Perthynasau wedi'u torri
     statuses_cleanup: Dileu postiadau'n awtomatig
     strikes: Rhybuddion cymedroli
     two_factor_authentication: Dilysu dau-ffactor
     webauthn_authentication: Allweddi diogelwch
+  severed_relationships:
+    download: Llwytho i lawr (%{count})
+    event_type:
+      account_suspension: Atal cyfrif (%{target_name})
+      domain_block: Ataliad gweinydd (%{target_name})
+      user_domain_block: Rydych wedi rhwystro %{target_name}
+    lost_followers: Dilynwyr coll
+    lost_follows: Yn dilyn coll
+    preamble: Efallai y byddwch yn colli dilynwyr a'r rhai rydych yn eu dilyn pan fyddwch yn rhwystro parth neu pan fydd eich cymedrolwyr yn penderfynu atal gweinydd o bell. Pan fydd hynny'n digwydd, byddwch yn gallu llwytho i lawr rhestrau o berthnasoedd wedi'u torri, i'w harchwilio ac o bosibl eu mewnforio ar weinydd arall.
+    purged: Mae gwybodaeth am y gweinydd hwn wedi'i dynnu gan weinyddwyr eich gweinydd.
+    type: Digwyddiad
   statuses:
     attached:
       audio:
@@ -1880,6 +1897,7 @@ cy:
     contrast: Mastodon (Cyferbyniad uchel)
     default: Mastodon (Tywyll)
     mastodon-light: Mastodon (Golau)
+    system: Awtomatig (defnyddio thema system)
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
@@ -1992,6 +2010,13 @@ cy:
       follows_subtitle: Dilynwch gyfrifon adnabyddus
       follows_title: Pwy i ddilyn
       follows_view_more: Gweld mwy o bobl i ddilyn
+      hashtags_recent_count:
+        few: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
+        many: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
+        one: "%{people} person yn ystod y 2 ddiwrnod diwethaf"
+        other: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
+        two: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
+        zero: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
       hashtags_subtitle: Gweld beth sy'n tueddu dros y 2 ddiwrnod diwethaf
       hashtags_title: Hashnodau tuedd
       hashtags_view_more: Gweld mwy o hashnodau tuedd
@@ -1999,7 +2024,7 @@ cy:
       post_step: Dywedwch helo wrth y byd gyda thestun, lluniau, fideos neu arolygon barn.
       post_title: Creu'ch postiad cyntaf
       share_action: Rhannu
-      share_step: Gadewch i'ch ffrindiau wybod sut i ddod o hyd i chi ar Mastodon!
+      share_step: Gadewch i'ch ffrindiau wybod sut i ddod o hyd i chi ar Mastodon.
       share_title: Rhannwch eich proffil Mastodon
       sign_in_action: Mewngofnodi
       subject: Croeso i Mastodon
diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml
index e79aa0359..88cd2b9d5 100644
--- a/config/locales/doorkeeper.cy.yml
+++ b/config/locales/doorkeeper.cy.yml
@@ -174,6 +174,7 @@ cy:
       read:filters: gweld eich hidlwyr
       read:follows: gweld eich dilynwyr
       read:lists: gweld eich rhestrau
+      read:me: darllen dim ond manylion elfennol eich cyfrif
       read:mutes: gweld eich anwybyddiadau
       read:notifications: gweld eich hysbysiadau
       read:reports: gweld eich adroddiadau
diff --git a/config/locales/doorkeeper.lt.yml b/config/locales/doorkeeper.lt.yml
index 6f63e0309..847f41e81 100644
--- a/config/locales/doorkeeper.lt.yml
+++ b/config/locales/doorkeeper.lt.yml
@@ -174,6 +174,7 @@ lt:
       read:filters: matyti tavo filtrus
       read:follows: matyti tavo sekimus
       read:lists: matyti tavo sąrašus
+      read:me: skaityti tik pagrindinę paskyros informaciją
       read:mutes: matyti tavo nutildymus
       read:notifications: matyti tavo pranešimus
       read:reports: matyti tavo ataskaitas
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index f36d6783c..bdf6e5a75 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -751,6 +751,7 @@ gl:
         desc_html: Ten dependencia de scripts externos desde hCaptcha, que podería ser un problema de seguridade e privacidade. Ademáis, <strong>pode diminuír a accesiblidade para algunhas persoas (principalmente as discapacitadas)</strong>. Por estas razóns, considera medidas alternativas como o rexistro por convite e a aprobación manual das contas.
         title: Pedirlle ás novas usuarias resolver un CAPTCHA para confirmar a súa conta
       content_retention:
+        danger_zone: Zona perigosa
         preamble: Controla como se gardan en Mastodon os contidos creados polas usuarias.
         title: Retención do contido
       default_noindex:
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 6c9929315..9ec64b139 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -130,6 +130,7 @@ ia:
       silenced: Limitate
       statuses: Messages
       subscribe: Subscriber
+      suspend: Suspender
       suspended: Suspendite
       title: Contos
       unblock_email: Disblocar adresse de e-mail
@@ -141,6 +142,8 @@ ia:
       view_domain: Vider summario de dominio
     action_logs:
       action_types:
+        change_email_user: Cambiar e-mail pro le usator
+        change_role_user: Cambiar le rolo del usator
         confirm_user: Confirmar le usator
         create_account_warning: Crear un advertimento
         create_announcement: Crear annuncio
@@ -155,6 +158,7 @@ ia:
         enable_custom_emoji: Activar emoji personalisate
         enable_user: Activar le usator
         promote_user: Promover usator
+        resend_user: Reinviar message de confirmation
         reset_password_user: Reinitialisar contrasigno
         silence_account: Limitar conto
         unblock_email_account: Disblocar adresse de e-mail
@@ -187,6 +191,7 @@ ia:
       delete: Deler
       disable: Disactivar
       disabled: Disactivate
+      disabled_msg: Emoji disactivate con successo
       enable: Activar
       enabled: Activate
       enabled_msg: Emoji activate con successo
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 9664a4ab5..82fbde6ce 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -502,6 +502,8 @@ lt:
     settings:
       captcha_enabled:
         desc_html: Tai priklauso nuo hCaptcha išorinių skriptų, kurie gali kelti susirūpinimą dėl saugumo ir privatumo. Be to, <strong>dėl to registracijos procesas kai kuriems žmonėms (ypač neįgaliesiems) gali būti gerokai sunkiau prieinami</strong>. Dėl šių priežasčių apsvarstyk alternatyvias priemones, pavyzdžiui, patvirtinimu arba kvietimu grindžiamą registraciją.
+      content_retention:
+        danger_zone: Pavojinga zona
       domain_blocks:
         all: Visiems
       registrations:
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index 6b5e8787d..51a3aac27 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -77,10 +77,13 @@ cy:
           warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd
       form_admin_settings:
         activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol
+        backups_retention_period: Mae gan ddefnyddwyr y gallu i gynhyrchu archifau o'u postiadau i'w llwytho i lawr yn ddiweddarach. Pan gânt eu gosod i werth positif, bydd yr archifau hyn yn cael eu dileu'n awtomatig o'ch storfa ar ôl y nifer penodedig o ddyddiau.
         bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd.
         closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau
+        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.
         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.
         peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol.
         profile_directory: Mae'r cyfeiriadur proffil yn rhestru'r holl ddefnyddwyr sydd wedi dewis i fod yn ddarganfyddiadwy.
         require_invite_text: Pan fydd angen cymeradwyaeth â llaw ar gyfer cofrestriadau, gwnewch y “Pam ydych chi am ymuno?” mewnbwn testun yn orfodol yn hytrach na dewisol
@@ -240,6 +243,7 @@ cy:
         backups_retention_period: Cyfnod cadw archif defnyddwyr
         bootstrap_timeline_accounts: Argymhellwch y cyfrifon hyn i ddefnyddwyr newydd bob amser
         closed_registrations_message: Neges bersonol pan nad yw cofrestriadau ar gael
+        content_cache_retention_period: Cyfnod cadw cynnwys o bell
         custom_css: CSS cyfaddas
         mascot: Mascot cyfaddas (hen)
         media_cache_retention_period: Cyfnod cadw storfa cyfryngau
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index c342dde33..510b880e3 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -77,6 +77,7 @@ fi:
           warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi
       form_admin_settings:
         activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä
+        backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun tämä on asetettu positiiviseksi arvoksi, nämä arkistot poistetaan automaattisesti asetetun päivien määrän jälkeen.
         bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun.
         closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu
         custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa.
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index bd7c850df..043349601 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -77,10 +77,13 @@ gl:
           warn: Agochar o contido filtrado tras un aviso que conteña o nome do filtro
       form_admin_settings:
         activity_api_enabled: Conta do número de publicacións locais, usuarias activas, e novos rexistros en acumulados semanais
+        backups_retention_period: As usuarias poden crear arquivos das súas publicacións para descargalos. Cando se establece un valor positivo, estes arquivos serán borrados automáticamente da túa almacenaxe despois do número de días establecido.
         bootstrap_timeline_accounts: Estas contas aparecerán fixas na parte superior das recomendacións para as usuarias.
         closed_registrations_message: Móstrase cando non se admiten novas usuarias
+        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.
         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.
         peers_api_enabled: Unha lista dos nomes de dominio que este servidor atopou no fediverso. Non se inclúen aquí datos acerca de se estás a federar con eles ou non, só que o teu servidor os recoñeceu. Ten utilidade para servizos que recollen estatísticas acerca da federación nun amplo senso.
         profile_directory: O directorio de perfís inclúe a tódalas usuarias que optaron por ser descubribles.
         require_invite_text: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo
@@ -240,6 +243,7 @@ gl:
         backups_retention_period: Período de retención do arquivo da usuaria
         bootstrap_timeline_accounts: Recomendar sempre estas contas ás novas usuarias
         closed_registrations_message: Mensaxe personalizada para cando o rexistro está pechado
+        content_cache_retention_period: Período de retención de contido remoto
         custom_css: CSS personalizado
         mascot: Mascota propia (herdado)
         media_cache_retention_period: Período de retención da caché multimedia
diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml
index 7012cdb1c..5e9dda2a1 100644
--- a/config/locales/simple_form.ia.yml
+++ b/config/locales/simple_form.ia.yml
@@ -5,8 +5,10 @@ ia:
       account:
         note: 'Tu pote @mentionar altere personas o #hashtags.'
       defaults:
+        password: Usa al minus 8 characteres
         setting_display_media_hide_all: Sempre celar le medios
         setting_display_media_show_all: Sempre monstrar le medios
+        username: Tu pote usar litteras, numeros e tractos de sublineamento
       webhook:
         events: Selige le eventos a inviar
         url: Ubi le eventos essera inviate
@@ -24,7 +26,10 @@ ia:
       admin_account_action:
         type: Action
         types:
+          disable: Gelar
           none: Inviar un advertimento
+          silence: Limitar
+          suspend: Suspender
       announcement:
         text: Annuncio
       defaults:
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
index a2c437a32..6f3072758 100644
--- a/config/locales/simple_form.is.yml
+++ b/config/locales/simple_form.is.yml
@@ -80,8 +80,10 @@ is:
         backups_retention_period: Notendur hafa kost á að útbúa safnskrár með færslunum sínum til að sækja svo síðar. Þegar þetta er stillt á jákvætt gildi, verður þessum safnskrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga.
         bootstrap_timeline_accounts: Þessir notendaaðgangar verða festir efst í meðmælum til nýrra notenda um að fylgjast með þeim.
         closed_registrations_message: Birtist þegar lokað er á nýskráningar
+        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.
         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.
         peers_api_enabled: Listi yfir þau lénaheiti sem þessi netþjónn hefur rekist á í skýjasambandinu. Engin gögn eru hér sem gefa til kynna hvort þú sért í sambandi við tiltekinn netþjón, bara að netþjónninn þinn viti um hann. Þetta er notað af þjónustum sem safna tölfræði um skýjasambönd á almennan hátt.
         profile_directory: Notendamappan telur upp alla þá notendur sem hafa valið að vera uppgötvanlegir.
         require_invite_text: Þegar nýskráningar krefjast handvirks samþykkis, þá skal gera textann í “Hvers vegna viltu taka þátt?” að kröfu en ekki valkvæðan
diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml
index 00485fc87..f6a3ad937 100644
--- a/config/locales/simple_form.lt.yml
+++ b/config/locales/simple_form.lt.yml
@@ -74,6 +74,9 @@ lt:
           warn: Slėpti filtruojamą turinį po įspėjimu, paminint filtro pavadinimą
       form_admin_settings:
         activity_api_enabled: Vietinių paskelbtų įrašų, aktyvių naudotojų ir naujų registracijų skaičiai kas savaitę
+        backups_retention_period: Naudotojai gali generuoti savo įrašų archyvus, kuriuos vėliau galės atsisiųsti. Nustačius teigiamą reikšmę, šie archyvai po nurodyto dienų skaičiaus bus automatiškai ištrinti iš saugyklos.
+        content_cache_retention_period: Visi įrašai iš kitų serverių (įskaitant pakėlimus ir atsakymus) bus ištrinti po nurodyto dienų skaičiaus, neatsižvelgiant į bet kokią vietinio naudotojo sąveiką su tais įrašais. Tai taikoma ir tiems įrašams, kuriuos vietinis naudotojas yra pažymėjęs kaip žymes ar mėgstamus. Privačios paminėjimai tarp naudotojų iš skirtingų instancijų taip pat bus prarastos ir jų bus neįmanoma atkurti. Šis nustatymas skirtas naudoti ypatingos paskirties instancijose, o įgyvendinus jį bendram naudojimui, pažeidžiami daugelio naudotojų lūkesčiai.
+        media_cache_retention_period: Nuotolinių naudotojų įrašytų įrašų medijos failai talpinami tavo serveryje. Nustačius teigiamą reikšmę, medijos bus ištrinamos po nurodyto dienų skaičiaus. Jei medijos duomenų bus paprašyta po to, kai jie bus ištrinti, jie bus atsiųsti iš naujo, jei šaltinio turinys vis dar prieinamas. Dėl apribojimų, susijusių su nuorodų peržiūros kortelių apklausos dažnumu trečiųjų šalių svetainėse, rekomenduojama nustatyti šią reikšmę ne trumpesnę kaip 14 dienų, kitaip nuorodų peržiūros kortelės nebus atnaujinamos pagal pareikalavimą iki to laiko.
         peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme.
         site_contact_email: Kaip žmonės gali su tavimi susisiekti teisiniais ar pagalbos užklausimais.
         site_contact_username: Kaip žmonės gali tave pasiekti Mastodon.
@@ -145,6 +148,7 @@ lt:
       form_admin_settings:
         activity_api_enabled: Skelbti suvestinį statistiką apie naudotojų veiklą per API
         bootstrap_timeline_accounts: Visada rekomenduoti šias paskyras naujiems naudotojams
+        content_cache_retention_period: Nuotolinio turinio saugojimo laikotarpis
         custom_css: Pasirinktinis CSS
         mascot: Pasirinktinis talismanas (pasenęs)
         registrations_mode: Kas gali užsiregistruoti
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index d078cf720..11e1fce3f 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -751,6 +751,7 @@ sv:
         desc_html: Detta bygger på externa skript från hCaptcha vilket kan vara ett säkerhets- och integritetsproblem. Dessutom,<strong>kan detta göra registreringsprocessen betydligt mindre tillgänglig för vissa personer (särskilt funktionsnedsatta)</strong>. Av dessa skäl bör du överväga alternativa åtgärder såsom godkänningsbaserad eller inbjudningsbaserad registrering.
         title: Kräv att nya användare löser en CAPTCHA för att erkänna sitt konto
       content_retention:
+        danger_zone: Farozon
         preamble: Kontrollera hur användargenererat innehåll lagras i Mastodon.
         title: Bibehållande av innehåll
       default_noindex:

From f3ea90b89eea93d0a4d86ac1eef9ae52f93a61fd Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 30 Apr 2024 11:12:25 +0200
Subject: [PATCH 031/215] Update workbox monorepo to v7.1.0 (#30047)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 357 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 195 insertions(+), 162 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 70395894b..5e83223a2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -59,7 +59,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1":
+"@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1, @babel/core@npm:^7.24.4":
   version: 7.24.5
   resolution: "@babel/core@npm:7.24.5"
   dependencies:
@@ -3073,19 +3073,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@rollup/plugin-node-resolve@npm:^11.2.1":
-  version: 11.2.1
-  resolution: "@rollup/plugin-node-resolve@npm:11.2.1"
+"@rollup/plugin-node-resolve@npm:^15.2.3":
+  version: 15.2.3
+  resolution: "@rollup/plugin-node-resolve@npm:15.2.3"
   dependencies:
-    "@rollup/pluginutils": "npm:^3.1.0"
-    "@types/resolve": "npm:1.17.1"
-    builtin-modules: "npm:^3.1.0"
+    "@rollup/pluginutils": "npm:^5.0.1"
+    "@types/resolve": "npm:1.20.2"
     deepmerge: "npm:^4.2.2"
+    is-builtin-module: "npm:^3.2.1"
     is-module: "npm:^1.0.0"
-    resolve: "npm:^1.19.0"
+    resolve: "npm:^1.22.1"
   peerDependencies:
-    rollup: ^1.20.0||^2.0.0
-  checksum: 10c0/a8226b01352ee1f7133b1b59b3906267e11c99020a55e3b7a313e03889f790d1cd94e7f7769d3963261e897c3265082533ba595976f8e3f08cf70aa88bf1ddd7
+    rollup: ^2.78.0||^3.0.0||^4.0.0
+  peerDependenciesMeta:
+    rollup:
+      optional: true
+  checksum: 10c0/598c15615086f26e28c4b3dbf966682af7fb0e5bc277cc4e57f559668a3be675a63ab261eb34729ce9569c3a51342c48863e50b5efe02e0fc1571828f0113f9d
   languageName: node
   linkType: hard
 
@@ -3101,6 +3104,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@rollup/plugin-terser@npm:^0.4.3":
+  version: 0.4.4
+  resolution: "@rollup/plugin-terser@npm:0.4.4"
+  dependencies:
+    serialize-javascript: "npm:^6.0.1"
+    smob: "npm:^1.0.0"
+    terser: "npm:^5.17.4"
+  peerDependencies:
+    rollup: ^2.0.0||^3.0.0||^4.0.0
+  peerDependenciesMeta:
+    rollup:
+      optional: true
+  checksum: 10c0/b9cb6c8f02ac1c1344019e9fb854321b74f880efebc41b6bdd84f18331fce0f4a2aadcdb481042245cd3f409b429ac363af71f9efec4a2024731d67d32af36ee
+  languageName: node
+  linkType: hard
+
 "@rollup/pluginutils@npm:^3.1.0":
   version: 3.1.0
   resolution: "@rollup/pluginutils@npm:3.1.0"
@@ -3114,6 +3133,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@rollup/pluginutils@npm:^5.0.1":
+  version: 5.1.0
+  resolution: "@rollup/pluginutils@npm:5.1.0"
+  dependencies:
+    "@types/estree": "npm:^1.0.0"
+    estree-walker: "npm:^2.0.2"
+    picomatch: "npm:^2.3.1"
+  peerDependencies:
+    rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+  peerDependenciesMeta:
+    rollup:
+      optional: true
+  checksum: 10c0/c7bed15711f942d6fdd3470fef4105b73991f99a478605e13d41888963330a6f9e32be37e6ddb13f012bc7673ff5e54f06f59fd47109436c1c513986a8a7612d
+  languageName: node
+  linkType: hard
+
 "@sinclair/typebox@npm:^0.27.8":
   version: 0.27.8
   resolution: "@sinclair/typebox@npm:0.27.8"
@@ -3470,10 +3505,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/estree@npm:*":
-  version: 1.0.3
-  resolution: "@types/estree@npm:1.0.3"
-  checksum: 10c0/5171f467fdd77852e28d7eec575222bc6c900e117a44e916a5ff65807ae8e1ed15f57d21e8954d6bd532e37c49a8ecfee730fcb152b7b44234d38681978b2caa
+"@types/estree@npm:*, @types/estree@npm:^1.0.0":
+  version: 1.0.5
+  resolution: "@types/estree@npm:1.0.5"
+  checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d
   languageName: node
   linkType: hard
 
@@ -3889,12 +3924,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/resolve@npm:1.17.1":
-  version: 1.17.1
-  resolution: "@types/resolve@npm:1.17.1"
-  dependencies:
-    "@types/node": "npm:*"
-  checksum: 10c0/6eeb9c27d99bf4b393bf168d43208f63e78cefca5644662a0bdb2bdbf8352386f4f3aca66add138fc41bce5f66fd48a0de430a1473f11b612fbed0375ae78031
+"@types/resolve@npm:1.20.2":
+  version: 1.20.2
+  resolution: "@types/resolve@npm:1.20.2"
+  checksum: 10c0/c5b7e1770feb5ccfb6802f6ad82a7b0d50874c99331e0c9b259e415e55a38d7a86ad0901c57665d93f75938be2a6a0bc9aa06c9749192cadb2e4512800bbc6e6
   languageName: node
   linkType: hard
 
@@ -5662,7 +5695,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"builtin-modules@npm:^3.1.0, builtin-modules@npm:^3.3.0":
+"builtin-modules@npm:^3.3.0":
   version: 3.3.0
   resolution: "builtin-modules@npm:3.3.0"
   checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a
@@ -7987,6 +8020,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"estree-walker@npm:^2.0.2":
+  version: 2.0.2
+  resolution: "estree-walker@npm:2.0.2"
+  checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af
+  languageName: node
+  linkType: hard
+
 "esutils@npm:^2.0.2":
   version: 2.0.3
   resolution: "esutils@npm:2.0.3"
@@ -10744,7 +10784,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"jest-worker@npm:^26.2.1, jest-worker@npm:^26.5.0":
+"jest-worker@npm:^26.5.0":
   version: 26.6.2
   resolution: "jest-worker@npm:26.6.2"
   dependencies:
@@ -15023,7 +15063,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.4":
+"resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4":
   version: 1.22.8
   resolution: "resolve@npm:1.22.8"
   dependencies:
@@ -15049,7 +15089,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin<compat/resolve>":
+"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin<compat/resolve>":
   version: 1.22.8
   resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>::version=1.22.8&hash=c3c19d"
   dependencies:
@@ -15156,20 +15196,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rollup-plugin-terser@npm:^7.0.0":
-  version: 7.0.2
-  resolution: "rollup-plugin-terser@npm:7.0.2"
-  dependencies:
-    "@babel/code-frame": "npm:^7.10.4"
-    jest-worker: "npm:^26.2.1"
-    serialize-javascript: "npm:^4.0.0"
-    terser: "npm:^5.0.0"
-  peerDependencies:
-    rollup: ^2.0.0
-  checksum: 10c0/f79b851c6f7b06555d3a8ce7a4e32abd2b7cb8318e89fb8db73e662fa6e3af1a59920e881d111efc65a7437fd9582b61b1f4859b6fd839ba948616829d92432d
-  languageName: node
-  linkType: hard
-
 "rollup@npm:^2.43.1":
   version: 2.79.1
   resolution: "rollup@npm:2.79.1"
@@ -15439,15 +15465,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"serialize-javascript@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "serialize-javascript@npm:4.0.0"
-  dependencies:
-    randombytes: "npm:^2.1.0"
-  checksum: 10c0/510dfe7f0311c0b2f7ab06311afa1668ba2969ab2f1faaac0a4924ede76b7f22ba85cfdeaa0052ec5a047bca42c8cd8ac8df8f0efe52f9bd290b3a39ae69fe9d
-  languageName: node
-  linkType: hard
-
 "serialize-javascript@npm:^5.0.1":
   version: 5.0.1
   resolution: "serialize-javascript@npm:5.0.1"
@@ -15457,6 +15474,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"serialize-javascript@npm:^6.0.1":
+  version: 6.0.2
+  resolution: "serialize-javascript@npm:6.0.2"
+  dependencies:
+    randombytes: "npm:^2.1.0"
+  checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2
+  languageName: node
+  linkType: hard
+
 "serve-index@npm:^1.9.1":
   version: 1.9.1
   resolution: "serve-index@npm:1.9.1"
@@ -15697,6 +15723,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"smob@npm:^1.0.0":
+  version: 1.5.0
+  resolution: "smob@npm:1.5.0"
+  checksum: 10c0/a1067f23265812de8357ed27312101af49b89129eb973e3f26ab5856ea774f88cace13342e66e32470f933ccfa916e0e9d0f7ca8bbd4f92dfab2af45c15956c2
+  languageName: node
+  linkType: hard
+
 "snapdragon-node@npm:^2.0.1":
   version: 2.1.1
   resolution: "snapdragon-node@npm:2.1.1"
@@ -16672,9 +16705,9 @@ __metadata:
   languageName: node
   linkType: hard
 
-"terser@npm:^5.0.0, terser@npm:^5.3.4":
-  version: 5.19.4
-  resolution: "terser@npm:5.19.4"
+"terser@npm:^5.17.4, terser@npm:^5.3.4":
+  version: 5.31.0
+  resolution: "terser@npm:5.31.0"
   dependencies:
     "@jridgewell/source-map": "npm:^0.3.3"
     acorn: "npm:^8.8.2"
@@ -16682,7 +16715,7 @@ __metadata:
     source-map-support: "npm:~0.5.20"
   bin:
     terser: bin/terser
-  checksum: 10c0/39c6687609f5b9061f2fb82bee02d2f9d7756fcb5bd50c67da1482f52cf5977e03e0c5df5cb4ce17e549428024c8859075137c461ec4a9ae8cf91a505759255a
+  checksum: 10c0/cb127a579b03fb9dcee0d293ff24814deedcd430f447933b618e8593b7454f615b5c8493c68e86a4b0188769d5ea2af5251b5d507edb208114f7e8aebdc7c850
   languageName: node
   linkType: hard
 
@@ -17975,36 +18008,37 @@ __metadata:
   languageName: node
   linkType: hard
 
-"workbox-background-sync@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-background-sync@npm:7.0.0"
+"workbox-background-sync@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-background-sync@npm:7.1.0"
   dependencies:
     idb: "npm:^7.0.1"
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/91eb064c608cfb4cf7aa4f062215d8217a99b93d67c4ae571e5abdda1b020c5ab45c7bddab99cb77d334aae8d259f0fe91b7c42ee6e7ad10db32b4a971991489
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/9538c49a377d8eb06acee3848fbca09bac1940a2ca9e904fed765c39aa32f77c20d72c3ba6fa1eb47bee81289b1d527556a1cd3e02728960a4c40400ce6d0e91
   languageName: node
   linkType: hard
 
-"workbox-broadcast-update@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-broadcast-update@npm:7.0.0"
+"workbox-broadcast-update@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-broadcast-update@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/3c3a6e1e72c19d2971d187297b99b242f304b1ec442f6f1ec84ea9c6e125dc01cd626d51e6ecf1c8d89226e6a286dccaa9f950bd5ef6183518af10ba0f4f524e
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/4a6e201cedcbc11b9d2f63f63477ba4564a35ce07bd54640198db6ff6a3b8347a65e0b4973c8f8463e8a622fd1ad93d7b3bab42338608811d23c7db01fef475e
   languageName: node
   linkType: hard
 
-"workbox-build@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-build@npm:7.0.0"
+"workbox-build@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-build@npm:7.1.0"
   dependencies:
     "@apideck/better-ajv-errors": "npm:^0.3.1"
-    "@babel/core": "npm:^7.11.1"
+    "@babel/core": "npm:^7.24.4"
     "@babel/preset-env": "npm:^7.11.0"
     "@babel/runtime": "npm:^7.11.2"
     "@rollup/plugin-babel": "npm:^5.2.0"
-    "@rollup/plugin-node-resolve": "npm:^11.2.1"
+    "@rollup/plugin-node-resolve": "npm:^15.2.3"
     "@rollup/plugin-replace": "npm:^2.4.1"
+    "@rollup/plugin-terser": "npm:^0.4.3"
     "@surma/rollup-plugin-off-main-thread": "npm:^2.2.3"
     ajv: "npm:^8.6.0"
     common-tags: "npm:^1.8.0"
@@ -18014,169 +18048,168 @@ __metadata:
     lodash: "npm:^4.17.20"
     pretty-bytes: "npm:^5.3.0"
     rollup: "npm:^2.43.1"
-    rollup-plugin-terser: "npm:^7.0.0"
     source-map: "npm:^0.8.0-beta.0"
     stringify-object: "npm:^3.3.0"
     strip-comments: "npm:^2.0.1"
     tempy: "npm:^0.6.0"
     upath: "npm:^1.2.0"
-    workbox-background-sync: "npm:7.0.0"
-    workbox-broadcast-update: "npm:7.0.0"
-    workbox-cacheable-response: "npm:7.0.0"
-    workbox-core: "npm:7.0.0"
-    workbox-expiration: "npm:7.0.0"
-    workbox-google-analytics: "npm:7.0.0"
-    workbox-navigation-preload: "npm:7.0.0"
-    workbox-precaching: "npm:7.0.0"
-    workbox-range-requests: "npm:7.0.0"
-    workbox-recipes: "npm:7.0.0"
-    workbox-routing: "npm:7.0.0"
-    workbox-strategies: "npm:7.0.0"
-    workbox-streams: "npm:7.0.0"
-    workbox-sw: "npm:7.0.0"
-    workbox-window: "npm:7.0.0"
-  checksum: 10c0/a090aeee836f59d42ca9eda8b82aa5a0ee8f4ce3f3095b6fcbe157a9a154c492e4ba86b5c4d6aa50ef7c37ea1c38c965442b56d1404911fd0351d0fc9a859a3c
+    workbox-background-sync: "npm:7.1.0"
+    workbox-broadcast-update: "npm:7.1.0"
+    workbox-cacheable-response: "npm:7.1.0"
+    workbox-core: "npm:7.1.0"
+    workbox-expiration: "npm:7.1.0"
+    workbox-google-analytics: "npm:7.1.0"
+    workbox-navigation-preload: "npm:7.1.0"
+    workbox-precaching: "npm:7.1.0"
+    workbox-range-requests: "npm:7.1.0"
+    workbox-recipes: "npm:7.1.0"
+    workbox-routing: "npm:7.1.0"
+    workbox-strategies: "npm:7.1.0"
+    workbox-streams: "npm:7.1.0"
+    workbox-sw: "npm:7.1.0"
+    workbox-window: "npm:7.1.0"
+  checksum: 10c0/c482fde713bad582bd7d4861113d7367ab4722eba9c102864c71048815792c623e9117a8f79957e0388d0c08e8303962d1fb23931456da73909e87d06638d101
   languageName: node
   linkType: hard
 
-"workbox-cacheable-response@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-cacheable-response@npm:7.0.0"
+"workbox-cacheable-response@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-cacheable-response@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/ddf123b3461070e215af51d88c672f3302b540b93ecf61ad5f3853f0a997194973eedb2c9ed21e849b7419f68804ef8a8d876dced3836a7eb2c697099e3d408f
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/52ea73bb184c9ef9280cc8f00a1ab7d103d495e12a7a6378fae02fd0aa1a9b893aac5d8074f14ed8c198527123e4401f4703fbfd2be98e184ca783b9216cb4c5
   languageName: node
   linkType: hard
 
-"workbox-core@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-core@npm:7.0.0"
-  checksum: 10c0/aaaf7b66978456bf5d6a90b1068b5acd82bf451f4a23c5a416201524b50ea4e0bc62a01365499bc088b4c18cddc513fdebbe8b048ab15aff960fe7cbbf55d5bd
+"workbox-core@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-core@npm:7.1.0"
+  checksum: 10c0/fb0b6e23a52e085da00b7a74b1f1854f06c695eb2bd4c244aa335165f59156a4febb4f116b9893b9fb7e0e8bac092d32eecceb4d00f930a93f64737cb2be9531
   languageName: node
   linkType: hard
 
-"workbox-expiration@npm:7.0.0, workbox-expiration@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "workbox-expiration@npm:7.0.0"
+"workbox-expiration@npm:7.1.0, workbox-expiration@npm:^7.0.0":
+  version: 7.1.0
+  resolution: "workbox-expiration@npm:7.1.0"
   dependencies:
     idb: "npm:^7.0.1"
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/990a6c2c9b177d796c012b0112913621e41b283e2736d83acb58cb9645591ddc7a6aef585145c5686f9b071d73ce12b4b1887765754624322545b0f4125d649f
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/669d76f87c1550ce9b425232c3202a26fdea4c4c9bdc1b71c1cee741a5d011423098994452e508576174d3c0b4bec0f4b35012b6d7257e300684c87fdddb7949
   languageName: node
   linkType: hard
 
-"workbox-google-analytics@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-google-analytics@npm:7.0.0"
+"workbox-google-analytics@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-google-analytics@npm:7.1.0"
   dependencies:
-    workbox-background-sync: "npm:7.0.0"
-    workbox-core: "npm:7.0.0"
-    workbox-routing: "npm:7.0.0"
-    workbox-strategies: "npm:7.0.0"
-  checksum: 10c0/7656ab4bff15fbcbc7f546d86628ccbc74736a99139ec70a166c465fc4ff59656aecd44cc0aef45b4690fd88a4980d6c9f27ce8c6606fd12d026162259a8069d
+    workbox-background-sync: "npm:7.1.0"
+    workbox-core: "npm:7.1.0"
+    workbox-routing: "npm:7.1.0"
+    workbox-strategies: "npm:7.1.0"
+  checksum: 10c0/4178d94fb7f3f7b789f117c104b2ff33945256dc550418b0e9c81130c1e2c2bcd72ec6a1661d91326c04de360e6592edd505f0e2142e8e1043fe0c45f9c1a3fe
   languageName: node
   linkType: hard
 
-"workbox-navigation-preload@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-navigation-preload@npm:7.0.0"
+"workbox-navigation-preload@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-navigation-preload@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/f29ac8364c7f7f392daa1f886134adc780057199b218ab6c6eef298841b8825d6cbc4bc88e655299929bdf14c700edfb9f217ca5c0b46094627247528f655011
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/b667a3ba0cae4d43a53a6e211f0f33f6ebc1d9fec6cbb93de83f72a37b81cc39d887b969db9b1cd5c396a1ce34636c89c3b157cc64a5265635d0b274e362db0e
   languageName: node
   linkType: hard
 
-"workbox-precaching@npm:7.0.0, workbox-precaching@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "workbox-precaching@npm:7.0.0"
+"workbox-precaching@npm:7.1.0, workbox-precaching@npm:^7.0.0":
+  version: 7.1.0
+  resolution: "workbox-precaching@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-    workbox-routing: "npm:7.0.0"
-    workbox-strategies: "npm:7.0.0"
-  checksum: 10c0/1b47cb151bb6ec7442b2dc8981203feff22527a4383510f2399730338b620ef0d03076bd3dbc1eb9a05272d5d6f4803fb4262f320bf5645f0818981e91077f39
+    workbox-core: "npm:7.1.0"
+    workbox-routing: "npm:7.1.0"
+    workbox-strategies: "npm:7.1.0"
+  checksum: 10c0/53b2d0a658109b4d83ee2b1913f884ee1c757a12b8931a7102272bd1e228d29f9430e7d060f328f465bca2aa24bf0719d026eef4f4d21395fa1f678f8d6a3c06
   languageName: node
   linkType: hard
 
-"workbox-range-requests@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-range-requests@npm:7.0.0"
+"workbox-range-requests@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-range-requests@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/909f0ed7a176e5dc55692792825e67b577dacf1015a3f3775389fcec34ff5b3441b15595109455fe226f0bc4dce4789a7c86e5e9c5963c13b4d6482f6d01d44f
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/bf4aa597d04cbb533796af64f4006a1f472f8a14ea91f96fe37b2d5e63ffe86dcb944dab9a41317e69d368d83bee20f03ff32b339ae5addef50f325703ad4b77
   languageName: node
   linkType: hard
 
-"workbox-recipes@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-recipes@npm:7.0.0"
+"workbox-recipes@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-recipes@npm:7.1.0"
   dependencies:
-    workbox-cacheable-response: "npm:7.0.0"
-    workbox-core: "npm:7.0.0"
-    workbox-expiration: "npm:7.0.0"
-    workbox-precaching: "npm:7.0.0"
-    workbox-routing: "npm:7.0.0"
-    workbox-strategies: "npm:7.0.0"
-  checksum: 10c0/c024141f24b0778355bdfbfe2b4a24a3f74e279f6f7541635758533e79318e15986f9f556a899c97717a9c25a1738d9e112d17dd36aa19cebf901462ebeeb8e4
+    workbox-cacheable-response: "npm:7.1.0"
+    workbox-core: "npm:7.1.0"
+    workbox-expiration: "npm:7.1.0"
+    workbox-precaching: "npm:7.1.0"
+    workbox-routing: "npm:7.1.0"
+    workbox-strategies: "npm:7.1.0"
+  checksum: 10c0/5a8c2444f6338c6092be87cc6fd69c8b0cbb413bfc0a11a8f10961bfb2b8059359c4be0264ffa0c01deff3ab5dba15bbcf61d4dedbc93d8bfe1f8a2841b1657c
   languageName: node
   linkType: hard
 
-"workbox-routing@npm:7.0.0, workbox-routing@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "workbox-routing@npm:7.0.0"
+"workbox-routing@npm:7.1.0, workbox-routing@npm:^7.0.0":
+  version: 7.1.0
+  resolution: "workbox-routing@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/74ad651a0643506cfd3ca51eee754f5fe34e3f1460e6b772ed213e0422028cf002d70f91da32d13261bc5ee2160527ffb5436ac209fdbe8d0e7071784aa65190
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/efd630fff594bd50276770840bce274660972587e79c097a9f1a84e8347351736aac13f11c6d7655ff550b13195d370d5c3b81a075bf452f358fc144ee868ad9
   languageName: node
   linkType: hard
 
-"workbox-strategies@npm:7.0.0, workbox-strategies@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "workbox-strategies@npm:7.0.0"
+"workbox-strategies@npm:7.1.0, workbox-strategies@npm:^7.0.0":
+  version: 7.1.0
+  resolution: "workbox-strategies@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/4fe122b80e547b347bedf187aeb2c2eb34efc3fbde2733b7709530cccb6b6e03b29adcbccecf301e4fcaad0d5cd4a74e1e704f769d949c32439dca358130a613
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/b08712a69b1b13e354345cc228c29f0c759043f7ca7cf6ce9b82fe79c9d423142bfa4a118f91f1a57054047a730127fa4474d59d9306fb2ed42fe9ef568be01a
   languageName: node
   linkType: hard
 
-"workbox-streams@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-streams@npm:7.0.0"
+"workbox-streams@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-streams@npm:7.1.0"
   dependencies:
-    workbox-core: "npm:7.0.0"
-    workbox-routing: "npm:7.0.0"
-  checksum: 10c0/9a1a9b8200f5b315523ac49c61a9b88791009377bbdedd44cf19c4b2258e710bd2fbc6f74ef53b72db7849da7ce9965ced5983f167785ccfc7efa1df761e3371
+    workbox-core: "npm:7.1.0"
+    workbox-routing: "npm:7.1.0"
+  checksum: 10c0/1d75c046fcb7b25e1cf85457e3610309dd5513f68752ef333529fcf155df2114b72f3d6f416bb68393e51b5396e3f6df7171e8e2889d0e9e1805e315754b771e
   languageName: node
   linkType: hard
 
-"workbox-sw@npm:7.0.0":
-  version: 7.0.0
-  resolution: "workbox-sw@npm:7.0.0"
-  checksum: 10c0/06d9713398ca92d8b2cad70a7d302825ec7650e05e2e0c8e68f453442fdf9a9227350c856484f7b649df6cb429cc03a103f8ecd9596e83bfa52e845bf25ffbcd
+"workbox-sw@npm:7.1.0":
+  version: 7.1.0
+  resolution: "workbox-sw@npm:7.1.0"
+  checksum: 10c0/2084f1b58c8509d7ca53ce8a13d93e57d1f13307e0279fedc87942e83c8cb96bc2e5ed3992a89af6245ad2a66897a92908cb60d0717fb90492056eb6fbf20dc6
   languageName: node
   linkType: hard
 
 "workbox-webpack-plugin@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "workbox-webpack-plugin@npm:7.0.0"
+  version: 7.1.0
+  resolution: "workbox-webpack-plugin@npm:7.1.0"
   dependencies:
     fast-json-stable-stringify: "npm:^2.1.0"
     pretty-bytes: "npm:^5.4.1"
     upath: "npm:^1.2.0"
     webpack-sources: "npm:^1.4.3"
-    workbox-build: "npm:7.0.0"
+    workbox-build: "npm:7.1.0"
   peerDependencies:
-    webpack: ^4.4.0 || ^5.9.0
-  checksum: 10c0/3d585842bb6f801db5571e4d3e5c1d7c141f91d9ba2ed0c36b617d86a00b37bdefc055e6cc981c557f21f878ff4a9cf8b82e4b0b31084ddf4d9d149673ce8882
+    webpack: ^4.4.0 || ^5.91.0
+  checksum: 10c0/516fa68a6a6958ee1560299dd1146032dda68474a2ab01643cbde78fc65b75a3157aef60cb45dcc1984cc458ce44d4e3090cda08dd7cefd0952351270e963a00
   languageName: node
   linkType: hard
 
-"workbox-window@npm:7.0.0, workbox-window@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "workbox-window@npm:7.0.0"
+"workbox-window@npm:7.1.0, workbox-window@npm:^7.0.0":
+  version: 7.1.0
+  resolution: "workbox-window@npm:7.1.0"
   dependencies:
     "@types/trusted-types": "npm:^2.0.2"
-    workbox-core: "npm:7.0.0"
-  checksum: 10c0/8070fb80734a8543248ed6e3b186b8d3ee64419400a6d6d75f78809c44bf16321c5d9739bdf60ee62f631461ebb67a8a7dd78192504678d00bf2a9d3683f1324
+    workbox-core: "npm:7.1.0"
+  checksum: 10c0/c989a6e3a0488f049eead3892f8249387604fb04898aa79d0cf14cd7b684f0758f1edf1996745f4755bd30c31c449f628803e507d39b2ea91cc9c36f7d5e9c72
   languageName: node
   linkType: hard
 

From 75470f1256cbc962be5ed7d92f4e522146cfaac5 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Tue, 30 Apr 2024 09:00:39 -0400
Subject: [PATCH 032/215] Use implicit dotenv load (#30121)

---
 config/application.rb | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/config/application.rb b/config/application.rb
index 1b3878992..402c7f061 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -51,12 +51,8 @@ require_relative '../lib/active_record/database_tasks_extensions'
 require_relative '../lib/active_record/batches'
 require_relative '../lib/simple_navigation/item_extensions'
 
-Dotenv::Rails.load
-
 Bundler.require(:pam_authentication) if ENV['PAM_ENABLED'] == 'true'
 
-require_relative '../lib/mastodon/redis_config'
-
 module Mastodon
   class Application < Rails::Application
     # Initialize configuration defaults for originally generated Rails version.
@@ -98,6 +94,10 @@ module Mastodon
       app.deprecators[:mastodon] = ActiveSupport::Deprecation.new('4.3', 'mastodon/mastodon')
     end
 
+    config.before_configuration do
+      require 'mastodon/redis_config'
+    end
+
     config.to_prepare do
       Doorkeeper::AuthorizationsController.layout 'modal'
       Doorkeeper::AuthorizedApplicationsController.layout 'admin'

From 26e10aa203d18e452cdf836209875f05a6e01882 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Wed, 1 May 2024 01:39:28 +0200
Subject: [PATCH 033/215] Change width breakpoint for mobile placement behavior
 (#30131)

---
 app/javascript/styles/mastodon/components.scss | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 9cb03bedf..51596ec24 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -5616,7 +5616,7 @@ a.status-card {
   user-select: text;
   display: flex;
 
-  @media screen and (max-width: $no-gap-breakpoint) {
+  @media screen and (width <= 630px) {
     margin-top: auto;
   }
 }

From a9dd68b90a8f8ae5bffb7ad97a34919bcf0f9d17 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 10:00:43 +0200
Subject: [PATCH 034/215] Update dependency react-redux to v9.1.2 (#30146)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 5e83223a2..f6e89bb26 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -14456,24 +14456,21 @@ __metadata:
   linkType: hard
 
 "react-redux@npm:^9.0.4":
-  version: 9.1.1
-  resolution: "react-redux@npm:9.1.1"
+  version: 9.1.2
+  resolution: "react-redux@npm:9.1.2"
   dependencies:
     "@types/use-sync-external-store": "npm:^0.0.3"
     use-sync-external-store: "npm:^1.0.0"
   peerDependencies:
     "@types/react": ^18.2.25
     react: ^18.0
-    react-native: ">=0.69"
     redux: ^5.0.0
   peerDependenciesMeta:
     "@types/react":
       optional: true
-    react-native:
-      optional: true
     redux:
       optional: true
-  checksum: 10c0/40ccdc8d48aefeed02c025f46e4a2e6641a2996fe985feb70d25feaaf8f101f6ef937cd1420909cad4c8869a8c79323ee071f5b090b011b950e5ae09100f5767
+  checksum: 10c0/56ac98228e011b26e0202346af9c8dd408ad5ea8235d8761c8e05ea0953b8ca801cdf9d1f481fdec7b285d7f30ceef7238b46b3df7636ef77dd5c2ea8c5be5b2
   languageName: node
   linkType: hard
 

From 62992ba54a102a52ba49087f13c86a662f9d5807 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 10:14:45 +0200
Subject: [PATCH 035/215] Update dependency sass to v1.76.0 (#30138)

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 f6e89bb26..e45da3a48 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15309,15 +15309,15 @@ __metadata:
   linkType: hard
 
 "sass@npm:^1.62.1":
-  version: 1.75.0
-  resolution: "sass@npm:1.75.0"
+  version: 1.76.0
+  resolution: "sass@npm:1.76.0"
   dependencies:
     chokidar: "npm:>=3.0.0 <4.0.0"
     immutable: "npm:^4.0.0"
     source-map-js: "npm:>=0.6.2 <2.0.0"
   bin:
     sass: sass.js
-  checksum: 10c0/1564ab2c8041c99a330cec93127fe8abcf65ac63eecb471610ed7f3126a2599a58b788a3a98eb8719f7f40b9b04e00c92bc9e11a9c2180ad582b8cba9fb030b0
+  checksum: 10c0/976baf2c378e104f8d4ffca5375c8aa6f3d24f59d5c0a5db8d68a51f89edce45dedc25cfcd304b309fc8568d146de9e2c6cd189395e97bb2840d39feb13932ff
   languageName: node
   linkType: hard
 

From 474e5ffaaeba42db6abacd0194720cdfc66f79f3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 10:15:49 +0200
Subject: [PATCH 036/215] Update dependency dotenv to v3.1.1 (#30133)

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 d73de0320..45815e6b4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -220,7 +220,7 @@ GEM
     domain_name (0.6.20240107)
     doorkeeper (5.6.9)
       railties (>= 5)
-    dotenv (3.1.0)
+    dotenv (3.1.1)
     drb (2.2.1)
     ed25519 (1.3.0)
     elasticsearch (7.13.3)

From ac1d830e6cd795b7658d0ae7fe7cec52cd24cf6e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 10:27:47 +0200
Subject: [PATCH 037/215] Update dependency aws-sdk-s3 to v1.149.0 (#30136)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile.lock | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 45815e6b4..ad94d0047 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -102,8 +102,8 @@ GEM
     attr_required (1.0.2)
     awrence (1.2.1)
     aws-eventstream (1.3.0)
-    aws-partitions (1.920.0)
-    aws-sdk-core (3.193.0)
+    aws-partitions (1.922.0)
+    aws-sdk-core (3.194.0)
       aws-eventstream (~> 1, >= 1.3.0)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.8)
@@ -111,8 +111,8 @@ GEM
     aws-sdk-kms (1.80.0)
       aws-sdk-core (~> 3, >= 3.193.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.148.0)
-      aws-sdk-core (~> 3, >= 3.193.0)
+    aws-sdk-s3 (1.149.0)
+      aws-sdk-core (~> 3, >= 3.194.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.8)
     aws-sigv4 (1.8.0)

From d97d31cce664281d868e4c661451687a301c97c8 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 10:28:13 +0200
Subject: [PATCH 038/215] Update dependency irb to v1.13.0 (#30143)

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 ad94d0047..3394930e0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -350,8 +350,8 @@ GEM
       activesupport (>= 3.0)
       nokogiri (>= 1.6)
     io-console (0.7.2)
-    irb (1.12.0)
-      rdoc
+    irb (1.13.0)
+      rdoc (>= 4.0.0)
       reline (>= 0.4.2)
     jmespath (1.6.2)
     json (2.7.2)
@@ -605,7 +605,7 @@ GEM
     redlock (1.3.2)
       redis (>= 3.0.0, < 6.0)
     regexp_parser (2.9.0)
-    reline (0.5.2)
+    reline (0.5.4)
       io-console (~> 0.5)
     request_store (1.6.0)
       rack (>= 1.4)

From 2447497a4cc6ea305f9431e4d8002b7abb750c7e Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Thu, 2 May 2024 04:31:06 -0400
Subject: [PATCH 039/215] Status length validation spec updates (#30132)

---
 .../status_length_validator_spec.rb           | 35 +++++++++++++------
 1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/spec/validators/status_length_validator_spec.rb b/spec/validators/status_length_validator_spec.rb
index 06625917b..ead69dfe2 100644
--- a/spec/validators/status_length_validator_spec.rb
+++ b/spec/validators/status_length_validator_spec.rb
@@ -4,6 +4,8 @@ require 'rails_helper'
 
 describe StatusLengthValidator do
   describe '#validate' do
+    before { stub_const("#{described_class}::MAX_CHARS", 500) } # Example values below are relative to this baseline
+
     it 'does not add errors onto remote statuses' do
       status = instance_double(Status, local?: false)
       allow(status).to receive(:errors)
@@ -22,27 +24,27 @@ describe StatusLengthValidator do
       expect(status).to_not have_received(:errors)
     end
 
-    it 'adds an error when content warning is over 500 characters' do
-      status = instance_double(Status, spoiler_text: 'a' * 520, text: '', errors: activemodel_errors, local?: true, reblog?: false)
+    it 'adds an error when content warning is over character limit' do
+      status = status_double(spoiler_text: 'a' * 520)
       subject.validate(status)
       expect(status.errors).to have_received(:add)
     end
 
-    it 'adds an error when text is over 500 characters' do
-      status = instance_double(Status, spoiler_text: '', text: 'a' * 520, errors: activemodel_errors, local?: true, reblog?: false)
+    it 'adds an error when text is over character limit' do
+      status = status_double(text: 'a' * 520)
       subject.validate(status)
       expect(status.errors).to have_received(:add)
     end
 
-    it 'adds an error when text and content warning are over 500 characters total' do
-      status = instance_double(Status, spoiler_text: 'a' * 250, text: 'b' * 251, errors: activemodel_errors, local?: true, reblog?: false)
+    it 'adds an error when text and content warning are over character limit total' do
+      status = status_double(spoiler_text: 'a' * 250, text: 'b' * 251)
       subject.validate(status)
       expect(status.errors).to have_received(:add)
     end
 
     it 'counts URLs as 23 characters flat' do
       text   = ('a' * 476) + " http://#{'b' * 30}.com/example"
-      status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false)
+      status = status_double(text: text)
 
       subject.validate(status)
       expect(status.errors).to_not have_received(:add)
@@ -50,7 +52,7 @@ describe StatusLengthValidator do
 
     it 'does not count non-autolinkable URLs as 23 characters flat' do
       text   = ('a' * 476) + "http://#{'b' * 30}.com/example"
-      status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false)
+      status = status_double(text: text)
 
       subject.validate(status)
       expect(status.errors).to have_received(:add)
@@ -58,14 +60,14 @@ describe StatusLengthValidator do
 
     it 'does not count overly long URLs as 23 characters flat' do
       text = "http://example.com/valid?#{'#foo?' * 1000}"
-      status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false)
+      status = status_double(text: text)
       subject.validate(status)
       expect(status.errors).to have_received(:add)
     end
 
     it 'counts only the front part of remote usernames' do
       text   = ('a' * 475) + " @alice@#{'b' * 30}.com"
-      status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false)
+      status = status_double(text: text)
 
       subject.validate(status)
       expect(status.errors).to_not have_received(:add)
@@ -73,7 +75,7 @@ describe StatusLengthValidator do
 
     it 'does count both parts of remote usernames for overly long domains' do
       text   = "@alice@#{'b' * 500}.com"
-      status = instance_double(Status, spoiler_text: '', text: text, errors: activemodel_errors, local?: true, reblog?: false)
+      status = status_double(text: text)
 
       subject.validate(status)
       expect(status.errors).to have_received(:add)
@@ -82,6 +84,17 @@ describe StatusLengthValidator do
 
   private
 
+  def status_double(spoiler_text: '', text: '')
+    instance_double(
+      Status,
+      spoiler_text: spoiler_text,
+      text: text,
+      errors: activemodel_errors,
+      local?: true,
+      reblog?: false
+    )
+  end
+
   def activemodel_errors
     instance_double(ActiveModel::Errors, add: nil)
   end

From 309f352e6a2fe68729ef5b723c986bc536fe0773 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 10:57:30 +0200
Subject: [PATCH 040/215] New Crowdin Translations (automated) (#30140)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/ia.json      | 12 +++
 app/javascript/mastodon/locales/pt-BR.json   | 13 +++
 app/javascript/mastodon/locales/sk.json      |  2 +
 app/javascript/mastodon/locales/sr-Latn.json | 13 +++
 app/javascript/mastodon/locales/sr.json      | 13 +++
 config/locales/devise.ia.yml                 |  1 +
 config/locales/doorkeeper.fy.yml             |  1 +
 config/locales/doorkeeper.sr-Latn.yml        |  1 +
 config/locales/doorkeeper.sr.yml             |  1 +
 config/locales/fy.yml                        | 34 ++++++++
 config/locales/ia.yml                        | 92 ++++++++++++++++++++
 config/locales/simple_form.fy.yml            |  4 +
 config/locales/simple_form.ia.yml            | 57 ++++++++++++
 config/locales/simple_form.pt-BR.yml         |  1 +
 config/locales/simple_form.sr-Latn.yml       |  4 +
 config/locales/simple_form.sr.yml            |  4 +
 config/locales/sk.yml                        | 79 +++++++++++++++++
 config/locales/sr-Latn.yml                   |  1 +
 config/locales/sr.yml                        |  1 +
 19 files changed, 334 insertions(+)

diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index 1b969639d..d30038d9c 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Benque tu conto non es serrate, le personal de {domain} pensa que es un bon idea que tu revide manualmente le sequente requestas de iste contos.",
   "follow_suggestions.curated_suggestion": "Selection del equipa",
   "follow_suggestions.dismiss": "Non monstrar novemente",
+  "follow_suggestions.featured_longer": "Seligite con cura per le equipa de {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Popular inter le gente que tu seque",
   "follow_suggestions.hints.featured": "Iste profilo ha essite seligite manualmente per le equipa de {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Iste profilo es popular inter le gente que tu seque.",
   "follow_suggestions.hints.most_followed": "Iste profilo es un del plus sequites sur {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Iste profilo es similar al profilos que tu ha recentemente sequite.",
   "follow_suggestions.personalized_suggestion": "Suggestion personalisate",
   "follow_suggestions.popular_suggestion": "Suggestion personalisate",
+  "follow_suggestions.popular_suggestion_longer": "Popular sur {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Similar al profilos que tu ha sequite recentemente",
   "follow_suggestions.view_all": "Vider toto",
   "follow_suggestions.who_to_follow": "Qui sequer",
   "followed_tags": "Hashtags sequite",
@@ -470,6 +474,14 @@
   "notification.follow_request": "{name} ha requestate de sequer te",
   "notification.mention": "{name} te ha mentionate",
   "notification.moderation-warning.learn_more": "Apprender plus",
+  "notification.moderation_warning": "Tu ha recipite un advertimento de moderation",
+  "notification.moderation_warning.action_delete_statuses": "Alcunes de tu messages ha essite removite.",
+  "notification.moderation_warning.action_disable": "Tu conto ha essite disactivate.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Alcunes de tu messages ha essite marcate como sensibile.",
+  "notification.moderation_warning.action_none": "Tu conto ha recipite un advertimento de moderation.",
+  "notification.moderation_warning.action_sensitive": "Tu messages essera marcate como sensibile a partir de ora.",
+  "notification.moderation_warning.action_silence": "Tu conto ha essite limitate.",
+  "notification.moderation_warning.action_suspend": "Tu conto ha essite suspendite.",
   "notification.own_poll": "Tu sondage ha finite",
   "notification.poll": "Un sondage in le qual tu ha votate ha finite",
   "notification.reblog": "{name} ha impulsate tu message",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 6bda11058..b11daeaaa 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Apesar de seu perfil não ser trancado, {domain} exige que você revise a solicitação para te seguir destes perfis manualmente.",
   "follow_suggestions.curated_suggestion": "Escolha da equipe",
   "follow_suggestions.dismiss": "Não mostrar novamente",
+  "follow_suggestions.featured_longer": "Escolhido à mão pela equipe de {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Popular entre as pessoas que você segue",
   "follow_suggestions.hints.featured": "Este perfil foi escolhido a dedo pela equipe {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Este perfil é popular entre as pessoas que você segue.",
   "follow_suggestions.hints.most_followed": "Este perfil é um dos mais seguidos em {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Este perfil é semelhante aos perfis que você seguiu recentemente.",
   "follow_suggestions.personalized_suggestion": "Sugestão personalizada",
   "follow_suggestions.popular_suggestion": "Sugestão popular",
+  "follow_suggestions.popular_suggestion_longer": "Popular em {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Similar a perfis que você seguiu recentemente",
   "follow_suggestions.view_all": "Visualizar tudo",
   "follow_suggestions.who_to_follow": "Quem seguir",
   "followed_tags": "Hashtags seguidas",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} te seguiu",
   "notification.follow_request": "{name} quer te seguir",
   "notification.mention": "{name} te mencionou",
+  "notification.moderation-warning.learn_more": "Aprender mais",
+  "notification.moderation_warning": "Você recebeu um aviso de moderação",
+  "notification.moderation_warning.action_delete_statuses": "Algumas das suas publicações foram removidas.",
+  "notification.moderation_warning.action_disable": "Sua conta foi desativada.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algumas de suas publicações foram marcadas por ter conteúdo sensível.",
+  "notification.moderation_warning.action_none": "Sua conta recebeu um aviso de moderação.",
+  "notification.moderation_warning.action_sensitive": "Suas publicações serão marcadas como sensíveis a partir de agora.",
+  "notification.moderation_warning.action_silence": "Sua conta foi limitada.",
+  "notification.moderation_warning.action_suspend": "Sua conta foi suspensa.",
   "notification.own_poll": "Sua enquete terminou",
   "notification.poll": "Uma enquete que você votou terminou",
   "notification.reblog": "{name} deu boost no teu toot",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index e126fdef0..286344241 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -448,6 +448,7 @@
   "notification.own_poll": "Vaša anketa sa skončila",
   "notification.poll": "Anketa, v ktorej ste hlasovali, sa skončila",
   "notification.reblog": "{name} zdieľa váš príspevok",
+  "notification.relationships_severance_event": "Stratené prepojenia s {name}",
   "notification.relationships_severance_event.learn_more": "Zisti viac",
   "notification.status": "{name} uverejňuje niečo nové",
   "notification.update": "{name} upravuje príspevok",
@@ -490,6 +491,7 @@
   "notifications.policy.filter_new_accounts_title": "Nové účty",
   "notifications.policy.filter_not_followers_title": "Ľudia, ktorí ťa nenasledujú",
   "notifications.policy.filter_not_following_title": "Ľudia, ktorých nenasleduješ",
+  "notifications.policy.filter_private_mentions_title": "Nevyžiadané priame spomenutia",
   "notifications.policy.title": "Filtrovať oznámenia od…",
   "notifications_permission_banner.enable": "Povoliť upozornenia na ploche",
   "notifications_permission_banner.how_to_control": "Ak chcete dostávať upozornenia, keď Mastodon nie je otvorený, povoľte upozornenia na ploche. Po ich zapnutí môžete presne kontrolovať, ktoré typy interakcií generujú upozornenia na ploche, a to prostredníctvom tlačidla {icon} vyššie.",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 3eea87d5e..67b706fa1 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Iako vaš nalog nije zaključan, osoblje {domain} smatra da biste možda želeli da ručno pregledate zahteve za praćenje sa ovih naloga.",
   "follow_suggestions.curated_suggestion": "Izbor osoblja",
   "follow_suggestions.dismiss": "Ne prikazuj ponovo",
+  "follow_suggestions.featured_longer": "Ručno odabrao tim {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Popularno među ljudima koje pratite",
   "follow_suggestions.hints.featured": "Ovaj profil je ručno izabrao tim {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Ovaj profil je popularan među ljudima koje pratite.",
   "follow_suggestions.hints.most_followed": "Ovaj profil je jedan od najpraćenijih na {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Ovaj profil je sličan profilima koje ste nedavno zapratili.",
   "follow_suggestions.personalized_suggestion": "Personalizovani predlog",
   "follow_suggestions.popular_suggestion": "Popularni predlog",
+  "follow_suggestions.popular_suggestion_longer": "Popularno na {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Slično profilima koje ste nedavno zapratili",
   "follow_suggestions.view_all": "Prikaži sve",
   "follow_suggestions.who_to_follow": "Koga pratiti",
   "followed_tags": "Praćene heš oznake",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} vas je zapratio",
   "notification.follow_request": "{name} je zatražio da vas prati",
   "notification.mention": "{name} vas je pomenuo",
+  "notification.moderation-warning.learn_more": "Saznajte više",
+  "notification.moderation_warning": "Dobili ste moderatorsko upozorenje",
+  "notification.moderation_warning.action_delete_statuses": "Neke od vaših objava su uklonjene.",
+  "notification.moderation_warning.action_disable": "Vaš nalog je onemogućen.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Neke od vaših objava su obeležene kao osetljive.",
+  "notification.moderation_warning.action_none": "Vaš nalog je dobio moderatorsko upozorenje.",
+  "notification.moderation_warning.action_sensitive": "Vaše objave će ubuduće biti označene kao osetljive.",
+  "notification.moderation_warning.action_silence": "Vaš nalog je ograničen.",
+  "notification.moderation_warning.action_suspend": "Vaš nalog je suspendovan.",
   "notification.own_poll": "Vaša anketa je završena",
   "notification.poll": "Završena je anketa u kojoj ste glasali",
   "notification.reblog": "{name} je podržao vašu objavu",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 69f755a0b..9898a10a3 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Иако ваш налог није закључан, особље {domain} сматра да бисте можда желели да ручно прегледате захтеве за праћење са ових налога.",
   "follow_suggestions.curated_suggestion": "Избор особља",
   "follow_suggestions.dismiss": "Не приказуј поново",
+  "follow_suggestions.featured_longer": "Ручно одабрао тим {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Популарно међу људима које пратите",
   "follow_suggestions.hints.featured": "Овај профил је ручно изабрао тим {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Овај профил је популаран међу људима које пратите.",
   "follow_suggestions.hints.most_followed": "Овај профил је један од најпраћенијих на {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Овај профил је сличан профилима које сте недавно запратили.",
   "follow_suggestions.personalized_suggestion": "Персонализовани предлог",
   "follow_suggestions.popular_suggestion": "Популарни предлог",
+  "follow_suggestions.popular_suggestion_longer": "Популарно на {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Слично профилима које сте недавно запратили",
   "follow_suggestions.view_all": "Прикажи све",
   "follow_suggestions.who_to_follow": "Кога пратити",
   "followed_tags": "Праћене хеш ознаке",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} вас је запратио",
   "notification.follow_request": "{name} је затражио да вас прати",
   "notification.mention": "{name} вас је поменуо",
+  "notification.moderation-warning.learn_more": "Сазнајте више",
+  "notification.moderation_warning": "Добили сте модераторско упозорење",
+  "notification.moderation_warning.action_delete_statuses": "Неке од ваших објава су уклоњене.",
+  "notification.moderation_warning.action_disable": "Ваш налог је онемогућен.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Неке од ваших објава су обележене као осетљиве.",
+  "notification.moderation_warning.action_none": "Ваш налог је добио модераторско упозорење.",
+  "notification.moderation_warning.action_sensitive": "Ваше објаве ће убудуће бити означене као осетљиве.",
+  "notification.moderation_warning.action_silence": "Ваш налог је ограничен.",
+  "notification.moderation_warning.action_suspend": "Ваш налог је суспендован.",
   "notification.own_poll": "Ваша анкета је завршена",
   "notification.poll": "Завршена је анкета у којој сте гласали",
   "notification.reblog": "{name} је подржао вашу објаву",
diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml
index d180a46a6..6c89f4c6d 100644
--- a/config/locales/devise.ia.yml
+++ b/config/locales/devise.ia.yml
@@ -16,6 +16,7 @@ ia:
       pending: Tu conto es ancora sub revision.
       timeout: Tu session ha expirate. Per favor reaperi session pro continuar.
       unauthenticated: Es necessari aperir session o crear un conto ante de continuar.
+      unconfirmed: Es necessari confirmar tu adresse de e-mail ante de continuar.
     mailer:
       confirmation_instructions:
         action: Verificar adresse de e-mail
diff --git a/config/locales/doorkeeper.fy.yml b/config/locales/doorkeeper.fy.yml
index a43defc42..51f0055ff 100644
--- a/config/locales/doorkeeper.fy.yml
+++ b/config/locales/doorkeeper.fy.yml
@@ -174,6 +174,7 @@ fy:
       read:filters: jo filters besjen
       read:follows: de accounts dy’tsto folgest besjen
       read:lists: jo listen besjen
+      read:me: allinnich de basisgegevens fan jo account lêze
       read:mutes: jo negearre brûkers besjen
       read:notifications: jo meldingen besjen
       read:reports: jo rapportearre berjochten besjen
diff --git a/config/locales/doorkeeper.sr-Latn.yml b/config/locales/doorkeeper.sr-Latn.yml
index a4eb7bd33..58ed5e8b6 100644
--- a/config/locales/doorkeeper.sr-Latn.yml
+++ b/config/locales/doorkeeper.sr-Latn.yml
@@ -174,6 +174,7 @@ sr-Latn:
       read:filters: pogledaj svoje filtere
       read:follows: pogledaj koga pratiš
       read:lists: pogledaj svoje liste
+      read:me: čita samo osnovne informacije o vašem nalogu
       read:mutes: pogledaj ignorisanja
       read:notifications: pogledaj svoja obaveštenja
       read:reports: pogledaj svoje prijave
diff --git a/config/locales/doorkeeper.sr.yml b/config/locales/doorkeeper.sr.yml
index 010eb23eb..f40a05e90 100644
--- a/config/locales/doorkeeper.sr.yml
+++ b/config/locales/doorkeeper.sr.yml
@@ -174,6 +174,7 @@ sr:
       read:filters: погледај своје филтере
       read:follows: погледај кога пратиш
       read:lists: погледај своје листе
+      read:me: чита само основне информације о вашем налогу
       read:mutes: погледај игнорисања
       read:notifications: погледај своја обавештења
       read:reports: погледај своје пријаве
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
index 1d62f7c6a..1f1a27fec 100644
--- a/config/locales/fy.yml
+++ b/config/locales/fy.yml
@@ -597,6 +597,9 @@ fy:
       actions_description_html: Beslis hokker maatregel nommen wurde moat om dizze rapportaazje op te lossen. Wannear’t jo in (straf)maatregel tsjin it rapportearre account nimme, kriget de account in e-mailmelding, behalve wannear’t de <strong>spam</strong>-kategory keazen is.
       actions_description_remote_html: Beslút hokker aksje nommen wurde moat om dizze rapportaazje ôf te hanneljen. Dit hat allinnich ynfloed op hoe’t <strong>jo</strong> server kommunisearret mei dizze eksterne account en omgiet mei de ynhâld.
       add_to_report: Mear oan de rapportaazje tafoegje
+      already_suspended_badges:
+        local: Al opskoarte op dizze server
+        remote: Al opskoarte op harren server
       are_you_sure: Binne jo wis?
       assign_to_self: Oan my tawize
       assigned: Tawizen moderator
@@ -748,6 +751,7 @@ fy:
         desc_html: Dit is ôfhinklik fan eksterne scripts fan hCaptcha, wat feilichheids- en privacyrisiko’s meibringe kin. Boppe dat kin <strong>dit it registraasjeproses bot minder tagonklik meitsje foar guon (foaral handicapte) minsken</strong>. Om dizze redenen kinne jo it beste alternative maatregels oerweagje, lykas registraasje op basis fan goedkarring of op útnûging.
         title: Nije brûkers moatte in CAPTCHA oplosse om harren account te befêstigjen
       content_retention:
+        danger_zone: Gefaresône
         preamble: Tafersjoch hâlde op hoe’t berjochten en media fan brûkers op Mastodon bewarre wurde.
         title: Bewartermyn berjochten
       default_noindex:
@@ -767,6 +771,7 @@ fy:
         disabled: Oan net ien
         users: Oan oanmelde lokale brûkers
       registrations:
+        moderation_recommandation: Soargje derfoar dat jo in adekwaat en responsyf moderaasjeteam hawwe eardat jo registraasjes foar elkenien iepenstelle!
         preamble: Tafersjoch hâlde op wa’t in account op dizze server registrearje kin.
         title: Registraasjes
       registrations_mode:
@@ -1647,13 +1652,24 @@ fy:
     import: Ymportearje
     import_and_export: Ymportearje en eksportearje
     migrate: Accountmigraasje
+    notifications: E-mailmeldingen
     preferences: Ynstellingen
     profile: Profyl
     relationships: Folgers en folgjenden
+    severed_relationships: Ferbrutsen folchrelaasjes
     statuses_cleanup: Automatysk berjochten fuortsmite
     strikes: Fêststelde skeiningen
     two_factor_authentication: Twa-stapsferifikaasje
     webauthn_authentication: Befeiligingskaaien
+  severed_relationships:
+    download: Downloade (%{count})
+    event_type:
+      account_suspension: Accountopskoarting (%{target_name})
+      domain_block: Serveropskoarting (%{target_name})
+      user_domain_block: Jo hawwe %{target_name} blokkearre
+    lost_followers: Ferlerne folgers
+    lost_follows: Ferlerne folge accounts
+    type: Barren
   statuses:
     attached:
       audio:
@@ -1747,6 +1763,7 @@ fy:
     contrast: Mastodon (heech kontrast)
     default: Mastodon (donker)
     mastodon-light: Mastodon (ljocht)
+    system: Automatysk (systeemtema brûke)
   time:
     formats:
       default: "%d %B %Y om %H:%M"
@@ -1838,13 +1855,30 @@ fy:
       apps_ios_action: Fia de App Store downloade
       apps_step: Us offisjele apps downloade
       apps_title: Mastodon-apps
+      checklist_subtitle: 'Litte wy oan dit nije sosjale aventoer begjinne:'
+      checklist_title: Wolkomstkontrôlelist
       edit_profile_action: Personalisearje
+      edit_profile_step: Wannear’t jo mear oer josels fertelle, krije jo mear ynteraksje mei oare minsken.
       edit_profile_title: Jo profyl personalisearje
       explanation: Hjir binne inkelde tips om jo op wei te helpen
       feature_action: Mear ynfo
+      feature_audience: Mastodon biedt jo in unike mooglikheid om jo publyk te behearen sûnder tuskenpersoanen. Mastodon, ymplemintearre yn jo eigen ynfrastruktuer, stelt jo yn steat om elke oare Mastodon-server online te folgjen en troch harren folge te wurden, en stiet ûnder kontrôle fan net ien, útsein dy fan jo.
+      feature_audience_title: Bou jo publyk yn fertrouwen op
+      feature_control: Jo witte sels it bêste wat jo op jo tiidline sjen wolle. Gjin algoritmen of advertinsjes om jo tiid te fergriemen. Folgje elkenien op elke Mastodon-server fan ien account ôf en ûntfang harren berjochten yn gronologyske folchoarder, en meitsje jo hoekje op it ynternet in bytsje mear as josels.
+      feature_control_title: Hâld kontrôle oer jo eigen tiidline
+      feature_creativity: Mastodon stipet audio-, fideo- en fotoberjochten, tagonklikheidsbeskriuwingen, enkêten, ynhâldswarskôgingen, animearre avatars, oanpaste emoji, kontrôle oer it bywurkjen fan miniatueren en mear, om jo te helpen josels online te uterjen. Oft jo no jo keunst, muzyk of podcast publisearje, Mastodon stiet foar jo klear.
+      feature_creativity_title: Bjusterbaarlike kreativiteit
+      feature_moderation: Mastodon leit de beslútfoarming wer yn jo hannen. Elke server makket harren eigen rigels en foarskriften, dy’t lokaal hanthavene wurde en net fan boppe ôf, lykas sosjale media fan bedriuwen, wêrtroch it it meast fleksibel is yn it reagearjen op de behoeften fan ferskate groepen minsken. Wurd lid fan in server mei de rigels wêrmei’t jo akkoard geane, of host jo eigen.
+      feature_moderation_title: Moderaasje sa as it heart
       follow_action: Folgje
+      follow_step: Op Mastodon draait it hielendal om it folgjen fan ynteressante minsken.
+      follow_title: Personalisearje jo starttiidline
+      follows_subtitle: Folgje bekende accounts
       follows_title: Wa te folgjen
       follows_view_more: Mear minsken om te folgjen besjen
+      hashtags_recent_count:
+        one: "%{people} persoan yn de ôfrûne 2 dagen"
+        other: "%{people} persoanen yn de ôfrûne 2 dagen"
       hashtags_subtitle: Wat der yn de ôfrûne 2 dagen bard is ferkenne
       hashtags_title: Populêre hashtags
       hashtags_view_more: Mear populêre hashtags besjen
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 9ec64b139..ff7b47c1f 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -111,12 +111,23 @@ ia:
       public: Public
       push_subscription_expires: Subscription PuSH expira le
       redownload: Actualisar profilo
+      redownloaded_msg: Le profilo de %{username} ha essite actualisate desde le origine
+      reject: Rejectar
+      rejected_msg: Le demanda de inscription de %{username} ha essite rejectate
+      remote_suspension_irreversible: Le datos de iste conto ha essite irreversibilemente delite.
+      remote_suspension_reversible_hint_html: Le conto ha essite suspendite sur su servitor, e le datos essera removite completemente le %{date}. Usque alora, le servitor remote pote restaurar iste conto sin effectos negative. Si tu vole remover immediatemente tote le datos del conto, tu pote facer lo hic infra.
+      remove_avatar: Remover avatar
+      remove_header: Remover capite
+      removed_avatar_msg: Le imagine de avatar de %{username} ha essite removite
+      removed_header_msg: Le imagine de capite de %{username} ha essite removite
       resend_confirmation:
         already_confirmed: Iste usator jam es confirmate
         send: Reinviar ligamine de confirmation
         success: Ligamine de confirmation inviate con successo!
       reset: Reinitialisar
       reset_password: Reinitialisar contrasigno
+      resubscribe: Resubscriber
+      role: Rolo
       search: Cercar
       search_same_email_domain: Altere usatores con le mesme dominio de e-mail
       search_same_ip: Altere usatores con le mesme IP
@@ -124,22 +135,34 @@ ia:
       security_measures:
         only_password: Solmente contrasigno
         password_and_2fa: Contrasigno e 2FA
+      sensitive: Fortiar sensibile
+      sensitized: Marcate como sensibile
+      shared_inbox_url: URL del cassa de entrata condividite
       show:
         created_reports: Reportos facite
         targeted_reports: Signalate per alteres
+      silence: Limitar
       silenced: Limitate
       statuses: Messages
+      strikes: Previe admonitiones
       subscribe: Subscriber
       suspend: Suspender
       suspended: Suspendite
+      suspension_irreversible: Le datos de iste conto ha essite irreversibilemente delite. Tu pote disfacer le suspension de iste conto pro render lo usabile, ma isto non recuperara alcun datos precedente.
+      suspension_reversible_hint_html: Le conto ha essite suspendite, e le datos essera removite completemente le %{date}. Usque alora, le conto pote esser restaurate sin effectos negative. Si tu vole remover immediatemente tote le datos del conto, tu pote facer lo hic infra.
       title: Contos
       unblock_email: Disblocar adresse de e-mail
       unblocked_email_msg: Adresse de e-mail de %{username} disblocate con successo
       unconfirmed_email: E-mail non confirmate
+      undo_sensitized: Non plus fortiar sensibile
       undo_silenced: Disfacer le limite
       undo_suspension: Disfacer le suspension
+      unsilenced_msg: Le limite del conto de %{username} ha essite cancellate
+      unsubscribe: Desubscriber
       username: Nomine de usator
       view_domain: Vider summario de dominio
+      warn: Avisar
+      web: Web
     action_logs:
       action_types:
         change_email_user: Cambiar e-mail pro le usator
@@ -148,6 +171,7 @@ ia:
         create_account_warning: Crear un advertimento
         create_announcement: Crear annuncio
         create_ip_block: Crear un regula IP
+        create_user_role: Crear un rolo
         destroy_announcement: Deler annuncio
         destroy_ip_block: Deler le regula IP
         destroy_status: Deler le message
@@ -167,6 +191,7 @@ ia:
         update_custom_emoji: Actualisar emoji personalisate
         update_ip_block: Actualisar le regula IP
         update_status: Actualisar le message
+        update_user_role: Actualisar rolo
       actions:
         change_email_user_html: "%{name} cambiava le adresse de e-mail address del usator %{target}"
         create_announcement_html: "%{name} creava un nove annuncio %{target}"
@@ -205,6 +230,7 @@ ia:
       media_storage: Immagazinage de medios
       new_users: nove usatores
       opened_reports: reportos aperte
+      software: Software
       top_languages: Linguas le plus active
       top_servers: Servitores le plus active
       website: Sito web
@@ -220,6 +246,10 @@ ia:
       edit: Modificar un bloco de dominio
       export: Exportar
       import: Importar
+      new:
+        severity:
+          silence: Limitar
+          suspend: Suspender
       private_comment: Commento private
       public_comment: Commento public
     email_domain_blocks:
@@ -239,9 +269,16 @@ ia:
       status: Stato
       title: Sequer le recommendationes
     instances:
+      back_to_all: Toto
+      back_to_limited: Limitate
       back_to_warning: Advertimento
       by_domain: Dominio
       content_policies:
+        comment: Nota interne
+        policies:
+          silence: Limitar
+          suspend: Suspender
+        policy: Politica
         reason: Ration public
       dashboard:
         instance_accounts_dimension: Contos le plus sequite
@@ -249,14 +286,23 @@ ia:
       delivery:
         unavailable: Non disponibile
       empty: Necun dominios trovate.
+      moderation:
+        all: Toto
+        limited: Limitate
+        title: Moderation
       private_comment: Commento private
       public_comment: Commento public
+      title: Federation
       total_blocked_by_us: Blocate per nos
       total_followed_by_us: Sequite per nos
     invites:
       deactivate_all: Disactivar toto
       filter:
+        all: Toto
         available: Disponibile
+        expired: Expirate
+        title: Filtro
+      title: Invitationes
     ip_blocks:
       add_new: Crear regula
       delete: Deler
@@ -264,15 +310,19 @@ ia:
         '1209600': 2 septimanas
         '15778476': 6 menses
         '2629746': 1 mense
+        '31556952': 1 anno
         '86400': 1 die
+        '94670856': 3 annos
       new:
         title: Crear un nove regula IP
       title: Regulas IP
     relays:
       delete: Deler
+      description_html: Un <strong>repetitor de federation</strong> es un servitor intermediari que excambia grande volumines de messages public inter le servitores que se inscribe e publica a illo. <strong>Illo pote adjutar le servitores micre e medie a discoperir le contento del fediverso</strong>, sin requirer que le usatores local seque manualmente altere personas sur servitores distante.
       disable: Disactivar
       disabled: Disactivate
       enable: Activar
+      enable_hint: Un vice activate, tu servitor se inscribera a tote le messages public de iste repetitor, e comenciara a inviar le messages public de iste servitor a illo.
       enabled: Activate
       save_and_enable: Salveguardar e activar
       status: Stato
@@ -283,9 +333,11 @@ ia:
       category: Categoria
       confirm: Confirmar
       delete_and_resolve: Deler le messages
+      no_one_assigned: Nemo
       notes:
         create: Adder un nota
         delete: Deler
+        title: Notas
       skip_to_actions: Saltar al actiones
       status: Stato
       updated_at: Actualisate
@@ -294,6 +346,11 @@ ia:
       assigned_users:
         one: "%{count} usator"
         other: "%{count} usatores"
+      categories:
+        invites: Invitationes
+        moderation: Moderation
+        special: Special
+      delete: Deler
       everyone: Permissiones predefinite
       privileges:
         delete_user_data: Deler le datos de usator
@@ -302,6 +359,7 @@ ia:
         manage_rules: Gerer le regulas
         manage_settings: Gerer le parametros
         manage_users: Gerer usatores
+      title: Rolos
     rules:
       delete: Deler
     settings:
@@ -317,8 +375,25 @@ ia:
       title: Parametros de servitor
     site_uploads:
       delete: Deler file incargate
+    software_updates:
+      documentation_link: Pro saper plus
+      title: Actualisationes disponibile
+      type: Typo
+      types:
+        major: Version major
+        minor: Version minor
+      version: Version
     statuses:
+      account: Autor
+      application: Application
+      batch:
+        report: Reporto
+      deleted: Delite
+      favourites: Favoritos
+      history: Chronologia del versiones
       language: Lingua
+      media:
+        title: Medios
       metadata: Metadatos
       open: Aperir message
       original_status: Message original
@@ -337,6 +412,8 @@ ia:
         action: Vider le actualisationes disponibile
       upload_check_privacy_error:
         action: Verifica hic pro plus de information
+  application_mailer:
+    unsubscribe: Desubscriber
   edit_profile:
     other: Alteres
   existing_username_validator:
@@ -397,6 +474,21 @@ ia:
   login_activities:
     authentication_methods:
       password: contrasigno
+  mail_subscriptions:
+    unsubscribe:
+      action: Si, desubscriber
+      complete: Desubscribite
+      confirmation_html: Es tu secur de voler cancellar le subscription al %{type} de Mastodon sur %{domain} pro tu adresse de e-mail %{email}? Tu pote sempre resubscriber te a partir del <a href="%{settings_path}">parametros de notification in e-mail</a>.
+      emails:
+        notification_emails:
+          favourite: notificationes de favorites in e-mail
+          follow: notificationes de sequimento in e-mail
+          follow_request: requestas de sequimento in e-mail
+          mention: notificationes de mentiones in e-mail
+          reblog: notificationes de impulsos in e-mail
+      resubscribe_html: Si tu ha cancellate le subscription in error, tu pote resubscriber te a partir del <a href="%{settings_path}">parametros de notification in e-mail</a>.
+      success_html: Tu non recipera plus %{type} pro Mastodon sur %{domain} a tu adresse de e-mail %{email}.
+      title: Desubcriber
   migrations:
     errors:
       not_found: non poterea esser trovate
diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml
index fa1633c90..8d599324b 100644
--- a/config/locales/simple_form.fy.yml
+++ b/config/locales/simple_form.fy.yml
@@ -77,10 +77,13 @@ fy:
           warn: Ferstopje de filtere ynhâld efter in warskôging, mei de titel fan it filter as warskôgingstekst
       form_admin_settings:
         activity_api_enabled: Tal lokaal publisearre artikelen, aktive brûkers en nije registraasjes yn wyklikse werjefte
+        backups_retention_period: Brûkers hawwe de mooglikheid om argiven fan harren berjochten te generearjen om letter te downloaden. Wannear ynsteld op in positive wearde, wurde dizze argiven automatysk fuortsmiten út jo ûnthâld nei it opjûne oantal dagen.
         bootstrap_timeline_accounts: Dizze accounts wurde boppe oan de oanrekommandaasjes oan nije brûkers toand. Meardere brûkersnammen troch komma’s skiede.
         closed_registrations_message: Werjûn wannear’t registraasje fan nije accounts útskeakele is
+        content_cache_retention_period: Alle berjochten fan oare servers (ynklusyf boosts en reaksjes) wurde fuortsmiten nei it opjûne oantal dagen, nettsjinsteande iennige lokale brûkersynteraksje mei dy berjochten. Dit oanbelanget ek berjochten dy’t in lokale brûker oan harren blêdwizers tafoege hat of as favoryt markearre hat. Priveeberjochten tusken brûkers fan ferskate servers gean ek ferlern en binne ûnmooglik te werstellen. It gebrûk fan dizze ynstelling is bedoeld foar servers dy’t in spesjaal doel tsjinje en oertrêdet in protte brûkersferwachtingen wannear’t dizze foar algemien gebrûk ymplemintearre wurdt.
         custom_css: Jo kinne oanpaste CSS tapasse op de webferzje fan dizze Mastodon-server.
         mascot: Oerskriuwt de yllustraasje yn de avansearre webomjouwing.
+        media_cache_retention_period: Mediabestannen fan berjochten fan eksterne brûkers wurde op jo server yn de buffer bewarre. Wannear ynsteld op in positive wearde, wurde media fuortsmiten nei it opjûne oantal dagen. As de mediagegevens opfrege wurde neidat se fuortsmiten binne, wurde se opnij download wannear de orizjinele ynhâld noch hieltyd beskikber is. Fanwegen beheiningen op hoe faak keppelingsfoarbylden websites fan tredden rieplachtsje, wurdt oanrekommandearre om dizze wearde yn te stellen op op syn minste 14 dagen. Oars wurde keppelingsfoarbylden net op oanfraach bywurke.
         peers_api_enabled: In list mei domeinnammen, dêr’t dizze server yn fediverse kontakt hân mei hat. Hjir wurdt gjin data dield, oft jo mei in bepaalde server federearrest, mar alinnich, dat jo server dat wit. Dit wurdt foar tsjinsten brûkt, dy’t statistiken oer federaasje yn algemiene sin sammelet.
         profile_directory: De brûkersgids befettet in list fan alle brûkers dy¥t derfoar keazen hawwe om ûntdekt wurde te kinnen.
         require_invite_text: Meitsje it ynfoljen fan ‘Wêrom wolle jo jo hjir registrearje?’ ferplicht yn stee fan opsjoneel, wannear’t registraasjes hânmjittich goedkard wurde moatte
@@ -240,6 +243,7 @@ fy:
         backups_retention_period: Bewartermyn brûkersargyf
         bootstrap_timeline_accounts: Accounts dy’t altyd oan nije brûkers oanrekommandearre wurde
         closed_registrations_message: Oanpast berjocht wannear registraasje útskeakele is
+        content_cache_retention_period: Bewartermyn foar eksterne ynhâld
         custom_css: Oanpaste CSS
         mascot: Oanpaste maskotte (legacy)
         media_cache_retention_period: Bewartermyn mediabuffer
diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml
index 5e9dda2a1..05a5fa501 100644
--- a/config/locales/simple_form.ia.yml
+++ b/config/locales/simple_form.ia.yml
@@ -3,12 +3,58 @@ ia:
   simple_form:
     hints:
       account:
+        discoverable: Tu messages public e tu profilo pote esser consiliate o recommendate in varie areas de Mastodon e tu profilo pote esser suggerite a altere usatores.
+        display_name: Tu prenomine e nomine de familia o tu pseudonymo.
+        fields: Tu pagina principal, pronomines, etate, toto lo que tu vole.
+        indexable: Tu messages public pote apparer in resultatos del recerca sur Mastodon. Illes qui ha interagite con tu messages totevia pote cercar les.
         note: 'Tu pote @mentionar altere personas o #hashtags.'
+        show_collections: Le personas potera navigar per tu sequites e sequaces. Le personas potera navigar per tu sequites e sequaces.
+        unlocked: Le personas potera sequer te sin requestar approbation. Dismarca si tu desira revider le requestas de sequer e selige si acceptar o rejectar nove sequaces.
+      account_alias:
+        acct: Specifica le nomine_de_usator@dominio del conto ab que tu vole mover
+      account_migration:
+        acct: Specifica le nomine_de_usator@dominio del conto a que tu vole mover
+      account_warning_preset:
+        text: Tu pote usar le syntaxe de message, tal como URLs, hashtags e mentiones
+        title: Optional. Non visibile al destinatario
+      admin_account_action:
+        include_statuses: Le usator videra que messages ha causate le action o aviso de moderation
+        send_email_notification: Le usator recipera un explication de cosa eveniva con lor conto
+        text_html: Optional. Tu pote usar le syntaxe de message. Tu pote <a href="%{path}">adder avisos preconfigurate</a> pro sparniar tempore
+        type_html: Selige lo que tu vole facer con <strong>%{acct}</strong>
+        types:
+          disable: Impedir al usator de usar lor conto, sin deler o celar lor contentos.
+          none: Usar lo pro inviar un aviso al usator, sin discatenar ulle altere action.
+          sensitive: Fortiar tote le annexos multimedial de iste usator a esser signalate como sensibile.
+          silence: Impedir al usator de poter publicar messages con public visibilitate, celar lor messages e notificationes ab gente non sequente illes. Clauder tote le reportos contra iste conto.
+          suspend: Impedir ulle interaction de o a iste conto e deler su contentos. Reversibile intra 30 dies. Clauder tote le reportos contra iste conto.
+        warning_preset_id: Optional. Tu pote ancora adder personal texto a fin del preconfigurate
+      announcement:
+        all_day: Si marcate, solo le datas del campo tempore sera monstrate
+        ends_at: Le annuncio sera automaticamente obscurate a iste tempore
+        scheduled_at: Lassar blanc pro publicar le annuncio immediatemente
+        starts_at: Optional. In caso tu annuncio es ligate con un specific campo tempore
+        text: Tu pote usar le syntaxe de message. Presta attention al spatio que le annuncio occupara sur le schermo de usator
+      appeal:
+        text: Tu pote solo appellar te un vice
       defaults:
+        autofollow: Illes qui se inscribe per le invitation automaticamente devenira tu sequaces
+        avatar: WEBP, PNG, GIF or JPG. Al maximo %{size}. Sera diminuite a %{dimensions}px
+        bot: Signala a alteres que le conto principalmente exeque actiones automatisate e poterea non esser surveliate
+        context: Un o plure contextos ubi le filtro deberea applicar se
+        current_password: Pro propositos de securitate insere le contrasigno del conto actual
+        current_username: Pro confirmar, insere le nomine de usator del conto actual
+        digest: Solo inviate post un longe periodo de inactivitate e solo si tu ha recipite alcun messages personal in tu absentia
+        email: Te sera inviate un email de confirmation
+        header: WEBP, PNG, GIF or JPG. Al maximo %{size}. Sera diminuite a %{dimensions}px
+        inbox_url: Copia le URL ab le pagina principal del repetitor que tu vole usar
         password: Usa al minus 8 characteres
         setting_display_media_hide_all: Sempre celar le medios
         setting_display_media_show_all: Sempre monstrar le medios
         username: Tu pote usar litteras, numeros e tractos de sublineamento
+      ip_block:
+        severities:
+          no_access: Blocar accesso a tote le ressources
       webhook:
         events: Selige le eventos a inviar
         url: Ubi le eventos essera inviate
@@ -28,6 +74,7 @@ ia:
         types:
           disable: Gelar
           none: Inviar un advertimento
+          sensitive: Sensibile
           silence: Limitar
           suspend: Suspender
       announcement:
@@ -53,10 +100,12 @@ ia:
         setting_system_font_ui: Usar typo de litteras predefinite del systema
         setting_theme: Thema de sito
         setting_trends: Monstrar le tendentias de hodie
+        severity: Severitate
         sign_in_token_attempt: Codice de securitate
         title: Titulo
         username: Nomine de usator
         username_or_email: Nomine de usator o e-mail
+        whole_word: Parola integre
       featured_tag:
         name: Hashtag
       filters:
@@ -75,8 +124,13 @@ ia:
         status_page_url: URL del pagina de stato
         theme: Thema predefinite
         trends: Activar tendentias
+      invite:
+        comment: Commento
       ip_block:
         comment: Commento
+        ip: IP
+        severities:
+          no_access: Blocar le accesso
         severity: Regula
       notification_emails:
         software_updates:
@@ -94,11 +148,14 @@ ia:
         name: Hashtag
         usable: Permitter al messages usar iste hashtag
       user:
+        role: Rolo
         time_zone: Fuso horari
       user_role:
         name: Nomine
         permissions_as_keys: Permissiones
         position: Prioritate
+      webhook:
+        events: Eventos activate
     not_recommended: Non recommendate
     recommended: Recommendate
     required:
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index f68eef8a6..9044546f2 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -240,6 +240,7 @@ pt-BR:
         backups_retention_period: Período de retenção do arquivo de usuário
         bootstrap_timeline_accounts: Sempre recomendar essas contas para novos usuários
         closed_registrations_message: Mensagem personalizada quando inscrições não estão disponíveis
+        content_cache_retention_period: Período de retenção de conteúdo remoto
         custom_css: CSS personalizável
         mascot: Mascote personalizado (legado)
         media_cache_retention_period: Período de retenção do cachê de mídia
diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml
index bc4eafb96..6bee31a42 100644
--- a/config/locales/simple_form.sr-Latn.yml
+++ b/config/locales/simple_form.sr-Latn.yml
@@ -77,10 +77,13 @@ sr-Latn:
           warn: Sakrij filtrirani sadržaj iza upozorenja u kome se navodi naziv filtera
       form_admin_settings:
         activity_api_enabled: Brojevi lokalno postavljenih objava, aktivnih korisnika i novih registracija na nedeljnoj bazi
+        backups_retention_period: Korisnici imaju mogućnost da generišu arhive svojih objava za kasnije preuzimanje. Kada se podese na pozitivnu vrednost, ove arhive će se automatski izbrisati iz vašeg skladišta nakon navedenog broja dana.
         bootstrap_timeline_accounts: Ovi nalozi će biti zakačeni na vrh preporuka za praćenje novih korisnika.
         closed_registrations_message: Prikazuje se kada su registracije zatvorene
+        content_cache_retention_period: Sve objave sa drugih servera (uključujući podržavanja i odgovore) će biti izbrisane nakon navedenog broja dana, bez obzira na bilo kakvu interakciju lokalnog korisnika sa tim objavama. Ovo uključuje objave u kojima ih je lokalni korisnik označio kao obeleživače ili omiljene. Privatna pominjanja između korisnika sa različitih instanci će takođe biti izgubljena i nemoguće ih je vratiti. Korišćenje ove postavke je namenjeno za slučajeve posebne namene i krši mnoga očekivanja korisnika kada se primeni za upotrebu opšte namene.
         custom_css: Možete da primenite prilagođene stilove na veb verziji Mastodon-a.
         mascot: Zamenjuje ilustraciju u naprednom veb okruženju.
+        media_cache_retention_period: Medijske datoteke iz objava udaljenih korisnika se keširaju na vašem serveru. Kada se podesi na pozitivnu vrednost, mediji će biti izbrisani nakon navedenog broja dana. Ako se medijski podaci zahtevaju nakon brisanja, biće ponovo preuzeti, ako je izvorni sadržaj i dalje dostupan. Zbog ograničenja koliko često kartice za pregled veza anketiraju sajtove trećih strana, preporučuje se da ovu vrednost postavite na najmanje 14 dana, inače kartice za pregled veza neće biti ažurirane na zahtev pre tog vremena.
         peers_api_enabled: Lista domena sa kojima se ovaj server susreo u fediverzumu. Ovde nisu sadržani podaci o tome da li se Vaš server federiše sa drugim serverima, već samo da Vaš server zna za njih. Ove informacije koriste servisi koji prikupljaju podatke i vode statistiku o federaciji u širem smislu.
         profile_directory: Direktorijum profila navodi sve korisnike koji su se opredelili da budu vidljivi.
         require_invite_text: Kada registracije zahtevaju ručno odobrenje, postavite da odgovor na „Zašto želite da se pridružite?“ bude obavezan, a ne opcionalan
@@ -240,6 +243,7 @@ sr-Latn:
         backups_retention_period: Period čuvanja korisničke arhive
         bootstrap_timeline_accounts: Uvek preporuči ove naloge novim korisnicima
         closed_registrations_message: Prilagođena poruka kada prijave nisu moguće
+        content_cache_retention_period: Period zadržavanja udaljenog sadržaja
         custom_css: Prilagođeni CSS
         mascot: Prilagođena maskota (nasleđe)
         media_cache_retention_period: Period čuvanja keša medija
diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml
index 006f4cf6d..4ec837407 100644
--- a/config/locales/simple_form.sr.yml
+++ b/config/locales/simple_form.sr.yml
@@ -77,10 +77,13 @@ sr:
           warn: Сакриј филтрирани садржај иза упозорења у коме се наводи назив филтера
       form_admin_settings:
         activity_api_enabled: Бројеви локално постављених објава, активних корисника и нових регистрација на недељној бази
+        backups_retention_period: Корисници имају могућност да генеришу архиве својих објава за касније преузимање. Када се подесе на позитивну вредност, ове архиве ће се аутоматски избрисати из вашег складишта након наведеног броја дана.
         bootstrap_timeline_accounts: Ови налози ће бити закачени на врх препорука за праћење нових корисника.
         closed_registrations_message: Приказује се када су регистрације затворене
+        content_cache_retention_period: Све објаве са других сервера (укључујући подржавања и одговоре) ће бити избрисане након наведеног броја дана, без обзира на било какву интеракцију локалног корисника са тим објавама. Ово укључује објаве у којима их је локални корисник означио као обележиваче или омиљене. Приватна помињања између корисника са различитих инстанци ће такође бити изгубљена и немогуће их је вратити. Коришћење ове поставке је намењено за случајеве посебне намене и крши многа очекивања корисника када се примени за употребу опште намене.
         custom_css: Можете да примените прилагођене стилове на веб верзији Mastodon-а.
         mascot: Замењује илустрацију у напредном веб окружењу.
+        media_cache_retention_period: Медијске датотеке из објава удаљених корисника се кеширају на вашем серверу. Када се подеси на позитивну вредност, медији ће бити избрисани након наведеног броја дана. Ако се медијски подаци захтевају након брисања, биће поново преузети, ако је изворни садржај и даље доступан. Због ограничења колико често картице за преглед веза анкетирају сајтове трећих страна, препоручује се да ову вредност поставите на најмање 14 дана, иначе картице за преглед веза неће бити ажуриране на захтев пре тог времена.
         peers_api_enabled: Листа домена са којима се овај сервер сусрео у федиверзуму. Овде нису садржани подаци о томе да ли се Ваш сервер федерише са другим серверима, већ само да Ваш сервер зна за њих. Ове информације користе сервиси који прикупљају податке и воде статистику о федерацији у ширем смислу.
         profile_directory: Директоријум профила наводи све кориснике који су се определили да буду видљиви.
         require_invite_text: Када регистрације захтевају ручно одобрење, поставите да одговор на „Зашто желите да се придружите?“ буде обавезан, а не опционалан
@@ -240,6 +243,7 @@ sr:
         backups_retention_period: Период чувања корисничке архиве
         bootstrap_timeline_accounts: Увек препоручи ове налоге новим корисницима
         closed_registrations_message: Прилагођена порука када пријаве нису могуће
+        content_cache_retention_period: Период задржавања удаљеног садржаја
         custom_css: Прилагођени CSS
         mascot: Прилагођена маскота (наслеђе)
         media_cache_retention_period: Период чувања кеша медија
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index d4cd86585..400059770 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -236,10 +236,12 @@ sk:
         confirm_user_html: "%{name} potvrdil/a emailovú adresu používateľa %{target}"
         create_account_warning_html: "%{name} poslal/a upozornenie užívateľovi %{target}"
         create_announcement_html: "%{name} vytvoril/a nové oboznámenie %{target}"
+        create_canonical_email_block_html: "%{name} zablokoval/a email s hašom %{target}"
         create_custom_emoji_html: "%{name} nahral/a novú emotikonu %{target}"
         create_domain_allow_html: "%{name} povolil/a federáciu s doménou %{target}"
         create_domain_block_html: "%{name} zablokoval/a doménu %{target}"
         create_email_domain_block_html: "%{name} zablokoval/a e-mailovú doménu %{target}"
+        create_ip_block_html: "%{name} vytvoril/a pravidlo pre IP %{target}"
         create_user_role_html: "%{name} vytvoril/a rolu pre %{target}"
         demote_user_html: "%{name} degradoval/a užívateľa %{target}"
         destroy_announcement_html: "%{name} vymazal/a oboznámenie %{target}"
@@ -621,6 +623,7 @@ sk:
       branding:
         title: Značka
       content_retention:
+        danger_zone: Riziková zóna
         title: Ponechanie obsahu
       discovery:
         follow_recommendations: Odporúčania pre nasledovanie
@@ -726,10 +729,16 @@ sk:
       tags:
         dashboard:
           tag_accounts_measure: unikátnych použití
+          tag_languages_dimension: Najpoužívanejšie jazyky
+          tag_servers_dimension: Najpoužívanejšie servery
           tag_servers_measure: iné servery
           tag_uses_measure: užívateľov celkovo
+        listable: Môže byť navrhnutý
+        not_listable: Nebude navrhnutý
+        not_trendable: Neobjaví sa medzi trendmi
         not_usable: Nemôže byť použitý
         title: Populárne štítky
+        trendable: Môže sa objaviť medzi trendmi
         trending_rank: 'Populárne #%{rank}'
         usable: Môže byť použitý
       title: Trendy
@@ -752,6 +761,7 @@ sk:
     new_appeal:
       actions:
         delete_statuses: vymazať ich príspevky
+        disable: zmraziť ich účet
         none: varovanie
         silence: obmedziť ich účet
     new_pending_account:
@@ -888,14 +898,21 @@ sk:
     strikes:
       action_taken: Vykonaný zákrok
       appeal: Namietni
+      appeal_submitted_at: Námietka odoslaná
       appeals:
         submit: Pošli námietku
       approve_appeal: Schváľ námietku
       created_at: Dátumom
       recipient: Adresované pre
+      reject_appeal: Zamietni námietku
       title_actions:
+        disable: Zmrazenie účtu
+        mark_statuses_as_sensitive: Označenie príspevkov za chúlostivé
         none: Varovanie
+        sensitive: Označenie účtu ako chúlostivý
         silence: Obmedzenie účtu
+      your_appeal_approved: Tvoja námietka bola schválená
+      your_appeal_pending: Odoslal si námietku
   domain_validator:
     invalid_domain: nieje správny tvar domény
   edit_profile:
@@ -956,7 +973,11 @@ sk:
       expires_on: Expiruje dňa %{date}
       title: Triedenia
     new:
+      save: Uložiť nový filter
       title: Pridaj nové triedenie
+    statuses:
+      batch:
+        remove: Odstrániť z filtrovania
   generic:
     all: Všetko
     cancel: Zruš
@@ -975,15 +996,28 @@ sk:
   imports:
     errors:
       over_rows_processing_limit: obsahuje viac než %{count} riadkov
+      too_large: Súbor je príliš veľký
+    failures: Zlyhaní(a)
+    imported: Nahrané
     modes:
       merge: Spoj dohromady
       merge_long: Ponechaj existujúce záznamy a pridaj k nim nové
       overwrite: Prepíš
       overwrite_long: Nahraď súčasné záznamy novými
     preface: Môžeš nahrať dáta ktoré si exportoval/a z iného Mastodon serveru, ako sú napríklad zoznamy ľudí ktorých sleduješ, alebo blokuješ.
+    recent_imports: Nedávne nahrania
+    states:
+      finished: Dokončené
+      unconfirmed: Nepotvrdených
+    status: Stav
     success: Tvoje dáta boli nahraté úspešne, a teraz budú spracované v danom čase
+    titles:
+      bookmarks: Nahrávanie záložiek
+      domain_blocking: Nahrávanie blokovaných domén
+      lists: Nahrávanie zoznamov
     type_groups:
       constructive: Sledovania a záložky
+      destructive: Blokovania a utíšenia
     types:
       blocking: Zoznam blokovaných
       bookmarks: Záložky
@@ -1026,6 +1060,9 @@ sk:
       sign_in_token: emailovým bezpečtnostným kódom
       webauthn: bezpečnostnými kľúčmi
     title: História overení
+  mail_subscriptions:
+    unsubscribe:
+      title: Ukonči odber
   media_attachments:
     validations:
       images_and_video: K príspevku ktorý už obsahuje obrázky nemôžeš priložiť video
@@ -1121,7 +1158,11 @@ sk:
     posting_defaults: Východiskové nastavenia príspevkov
     public_timelines: Verejné časové osi
   privacy:
+    privacy: Súkromie
+    search: Vyhľadávanie
     title: Súkromie a dosah
+  privacy_policy:
+    title: Pravidlá ochrany súkromia
   reactions:
     errors:
       limit_reached: Maximálny počet rôznorodých reakcií bol dosiahnutý
@@ -1152,6 +1193,11 @@ sk:
     status: Stav účtu
   remote_follow:
     missing_resource: Nemožno nájsť potrebnú presmerovaciu adresu k tvojmu účtu
+  rss:
+    content_warning: 'Varovanie o obsahu:'
+    descriptions:
+      account: Verejné príspevky od @%{acct}
+      tag: 'Verejné príspevky otagované #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Prekročil/a si denný limit %{limit} predplánovaných príspevkov
     over_total_limit: Prekročil/a si limit %{limit} predplánovaných príspevkov
@@ -1203,6 +1249,7 @@ sk:
     profile: Profil
     relationships: Sledovania a následovatelia
     two_factor_authentication: Dvojfázové overenie
+    webauthn_authentication: Bezpečnostné kľúče
   severed_relationships:
     lost_followers: Stratení nasledovatelia
     lost_follows: Stratené sledovania
@@ -1216,11 +1263,13 @@ sk:
         other: "%{count} obrázky"
     boosted_from_html: Vyzdvihnuté od %{acct_link}
     content_warning: 'Varovanie o obsahu: %{warning}'
+    default_language: Rovnaký ako jazyk rozhrania
     disallowed_hashtags:
       few: 'obsah nepovolených haštagov: %{tags}'
       many: 'obsah nepovolených haštagov: %{tags}'
       one: 'obsahoval nepovolený haštag: %{tags}'
       other: 'obsahoval nepovolené haštagy: %{tags}'
+    edited_at_html: Upravené %{date}
     errors:
       in_reply_not_found: Príspevok, na ktorý sa snažíš odpovedať, pravdepodobne neexistuje.
     open_in_web: Otvor v okne na webe
@@ -1245,6 +1294,7 @@ sk:
     show_thread: Ukáž diskusné vlákno
     title: '%{name}: „%{quote}"'
     visibilities:
+      direct: Súkromne
       private: Iba pre sledovateľov
       private_long: Ukáž iba následovateľom
       public: Verejné
@@ -1252,10 +1302,24 @@ sk:
       unlisted: Nezaradené
       unlisted_long: Všetci môžu vidieť, ale nieje zaradené do verejnej osi
   statuses_cleanup:
+    exceptions: Výnimky
+    ignore_favs: Ignoruj obľúbené
+    ignore_reblogs: Ignoruj vyzdvihnutia
+    keep_direct: Ponechaj súkromné správy
     keep_pinned: Ponechaj pripnuté príspevky
     keep_pinned_hint: Nevymaže žiadne s tvojich pripnutých príspevkov
+    keep_polls: Ponechaj ankety
     keep_self_bookmark: Ponechaj príspevky, ktoré sú záložkami
     keep_self_fav: Ponechať príspevky, ktoré si si obľúbil/a
+    min_age:
+      '1209600': 2 týždne
+      '15778476': 6 mesačné
+      '2629746': 1 mesačné
+      '31556952': 1 ročné
+      '5259492': 2 mesačné
+      '604800': 1 týždeň
+      '63113904': 2 ročné
+      '7889238': 3 mesačné
   stream_entries:
     sensitive_content: Senzitívny obsah
   tags:
@@ -1282,8 +1346,10 @@ sk:
   user_mailer:
     appeal_approved:
       action: Nastavenia účtu
+      title: Námietka schválená
     appeal_rejected:
       subtitle: Tvoje odvolanie bolo zamietnuté.
+      title: Námietka zamietnutá
     backup_ready:
       explanation: Vyžiadal/a si si úplnú zálohu svojho Mastodon účtu.
       extra: Teraz je pripravená na stiahnutie!
@@ -1291,23 +1357,36 @@ sk:
       title: Odber archívu
     failed_2fa:
       details: 'Tu sú podrobnosti o pokuse o prihlásenie:'
+    suspicious_sign_in:
+      change_password: zmeň svoje heslo
+      title: Nové prihlásenie
     warning:
+      appeal: Pošli námietku
+      reason: 'Dôvod:'
       subject:
         disable: Tvoj účet %{acct} bol zamrazený
         none: Varovanie pre %{acct}
         silence: Tvoj účet %{acct} bol obmedzený
         suspend: Tvoj účet %{acct} bol vylúčený
       title:
+        delete_statuses: Príspevky vymazané
         disable: Účet bol zamrazený
+        mark_statuses_as_sensitive: Príspevky označené za chúlostivé
         none: Varovanie
+        sensitive: Účet označený za chúlostivý
         silence: Účet bol obmedzený
         suspend: Tvoj účet bol vylúčený
     welcome:
+      apps_android_action: Získaj ju na Google Play
+      apps_ios_action: Stiahni z App Store
+      apps_step: Stiahni naše oficiálne aplikácie.
       apps_title: Mastodon aplikácie
       edit_profile_action: Prispôsob
+      edit_profile_title: Prispôsob si svoj profil
       explanation: Tu nájdeš nejaké tipy do začiatku
       feature_action: Zisti viac
       follow_action: Nasleduj
+      follows_title: Koho nasledovať
       post_title: Vytvor svoj prvý príspevok
       share_action: Zdieľaj
       sign_in_action: Prihlás sa
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index e0fe9a710..b4976f898 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -765,6 +765,7 @@ sr-Latn:
         desc_html: Ovo se oslanja na eksterne skripte iz hCaptcha, što može predstavljati zabrinutost za bezbednost i privatnost. Pored toga, <strong>ovo može učiniti proces registracije znatno manje dostupnim nekim (posebno osobama sa invaliditetom)</strong>. Iz ovih razloga, razmotrite alternativne mere kao što je registracija zasnovana na odobrenju ili na pozivu.
         title: Zahtevaj od novih korisnika da reše CAPTCHA da bi potvrdili svoj nalog
       content_retention:
+        danger_zone: Opasna zona
         preamble: Kontrolišite kako se sadržaj generisan od strane korisnika skladišti na Mastodon-u.
         title: Zadržavanje sadržaja
       default_noindex:
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 1c4ffc8c0..aec6d399d 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -765,6 +765,7 @@ sr:
         desc_html: Ово се ослања на екстерне скрипте из hCaptcha, што може представљати забринутост за безбедност и приватност. Поред тога, <strong>ово може учинити процес регистрације знатно мање доступним неким (посебно особама са инвалидитетом)</strong>. Из ових разлога, размотрите алтернативне мере као што је регистрација заснована на одобрењу или на позиву.
         title: Захтевај од нових корисника да реше CAPTCHA да би потврдили свој налог
       content_retention:
+        danger_zone: Опасна зона
         preamble: Контролишите како се садржај генерисан од стране корисника складишти на Mastodon-у.
         title: Задржавање садржаја
       default_noindex:

From 1e7d5d2957678788fdea8ade77eced98848ff4ff Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Thu, 2 May 2024 05:31:41 -0400
Subject: [PATCH 041/215] Update `devise-two-factor` to version 5.0.0 (#28325)

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
---
 Gemfile                                       |  2 +-
 Gemfile.lock                                  |  8 +-
 app/models/concerns/legacy_otp_secret.rb      | 77 +++++++++++++++++++
 app/models/user.rb                            |  8 +-
 config/environments/development.rb            |  3 +-
 config/environments/production.rb             |  1 +
 config/environments/test.rb                   |  1 +
 .../20231210154528_add_otp_secret_to_user.rb  |  7 ++
 ...80905_migrate_devise_two_factor_secrets.rb | 39 ++++++++++
 db/schema.rb                                  |  1 +
 lib/tasks/tests.rake                          | 18 ++++-
 spec/models/user_spec.rb                      | 15 +++-
 12 files changed, 162 insertions(+), 18 deletions(-)
 create mode 100644 app/models/concerns/legacy_otp_secret.rb
 create mode 100644 db/migrate/20231210154528_add_otp_secret_to_user.rb
 create mode 100644 db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb

diff --git a/Gemfile b/Gemfile
index a10613b30..eb507e9d1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -31,7 +31,7 @@ gem 'browser'
 gem 'charlock_holmes', '~> 0.7.7'
 gem 'chewy', '~> 7.3'
 gem 'devise', '~> 4.9'
-gem 'devise-two-factor', '~> 4.1'
+gem 'devise-two-factor'
 
 group :pam_authentication, optional: true do
   gem 'devise_pam_authenticatable2', '~> 9.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index 3394930e0..a23178540 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -97,8 +97,6 @@ GEM
       activerecord (>= 3.2, < 8.0)
       rake (>= 10.4, < 14.0)
     ast (2.4.2)
-    attr_encrypted (4.0.0)
-      encryptor (~> 3.0.0)
     attr_required (1.0.2)
     awrence (1.2.1)
     aws-eventstream (1.3.0)
@@ -204,9 +202,8 @@ GEM
       railties (>= 4.1.0)
       responders
       warden (~> 1.2.3)
-    devise-two-factor (4.1.1)
+    devise-two-factor (5.0.0)
       activesupport (~> 7.0)
-      attr_encrypted (>= 1.3, < 5, != 2)
       devise (~> 4.0)
       railties (~> 7.0)
       rotp (~> 6.0)
@@ -236,7 +233,6 @@ GEM
       htmlentities (~> 4.3.3)
       launchy (~> 2.1)
       mail (~> 2.7)
-    encryptor (3.0.0)
     erubi (1.12.0)
     et-orbi (1.2.11)
       tzinfo
@@ -842,7 +838,7 @@ DEPENDENCIES
   database_cleaner-active_record
   debug (~> 1.8)
   devise (~> 4.9)
-  devise-two-factor (~> 4.1)
+  devise-two-factor
   devise_pam_authenticatable2 (~> 9.2)
   discard (~> 1.2)
   doorkeeper (~> 5.6)
diff --git a/app/models/concerns/legacy_otp_secret.rb b/app/models/concerns/legacy_otp_secret.rb
new file mode 100644
index 000000000..466c4ec9b
--- /dev/null
+++ b/app/models/concerns/legacy_otp_secret.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+# TODO: This file is here for legacy support during devise-two-factor upgrade.
+# It should be removed after all records have been migrated.
+
+module LegacyOtpSecret
+  extend ActiveSupport::Concern
+
+  private
+
+  # Decrypt and return the `encrypted_otp_secret` attribute which was used in
+  # prior versions of devise-two-factor
+  # @return [String] The decrypted OTP secret
+  def legacy_otp_secret
+    return nil unless self[:encrypted_otp_secret]
+    return nil unless self.class.otp_secret_encryption_key
+
+    hmac_iterations = 2000 # a default set by the Encryptor gem
+    key = self.class.otp_secret_encryption_key
+    salt = Base64.decode64(encrypted_otp_secret_salt)
+    iv = Base64.decode64(encrypted_otp_secret_iv)
+
+    raw_cipher_text = Base64.decode64(encrypted_otp_secret)
+    # The last 16 bytes of the ciphertext are the authentication tag - we use
+    # Galois Counter Mode which is an authenticated encryption mode
+    cipher_text = raw_cipher_text[0..-17]
+    auth_tag =  raw_cipher_text[-16..-1] # rubocop:disable Style/SlicingWithRange
+
+    # this alrorithm lifted from
+    # https://github.com/attr-encrypted/encryptor/blob/master/lib/encryptor.rb#L54
+
+    # create an OpenSSL object which will decrypt the AES cipher with 256 bit
+    # keys in Galois Counter Mode (GCM). See
+    # https://ruby.github.io/openssl/OpenSSL/Cipher.html
+    cipher = OpenSSL::Cipher.new('aes-256-gcm')
+
+    # tell the cipher we want to decrypt. Symmetric algorithms use a very
+    # similar process for encryption and decryption, hence the same object can
+    # do both.
+    cipher.decrypt
+
+    # Use a Password-Based Key Derivation Function to generate the key actually
+    # used for encryptoin from the key we got as input.
+    cipher.key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(key, salt, hmac_iterations, cipher.key_len)
+
+    # set the Initialization Vector (IV)
+    cipher.iv = iv
+
+    # The tag must be set after calling Cipher#decrypt, Cipher#key= and
+    # Cipher#iv=, but before calling Cipher#final. After all decryption is
+    # performed, the tag is verified automatically in the call to Cipher#final.
+    #
+    # If the auth_tag does not verify, then #final will raise OpenSSL::Cipher::CipherError
+    cipher.auth_tag = auth_tag
+
+    # auth_data must be set after auth_tag has been set when decrypting See
+    # http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html#method-i-auth_data-3D
+    # we are not adding any authenticated data but OpenSSL docs say this should
+    # still be called.
+    cipher.auth_data = ''
+
+    # #update is (somewhat confusingly named) the method which actually
+    # performs the decryption on the given chunk of data. Our OTP secret is
+    # short so we only need to call it once.
+    #
+    # It is very important that we call #final because:
+    #
+    # 1. The authentication tag is checked during the call to #final
+    # 2. Block based cipher modes (e.g. CBC) work on fixed size chunks. We need
+    #    to call #final to get it to process the last chunk properly. The output
+    #    of #final should be appended to the decrypted value. This isn't
+    #    required for streaming cipher modes but including it is a best practice
+    #    so that your code will continue to function correctly even if you later
+    #    change to a block cipher mode.
+    cipher.update(cipher_text) + cipher.final
+  end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index 584120cf2..8bc0b23ce 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -39,6 +39,7 @@
 #  role_id                   :bigint(8)
 #  settings                  :text
 #  time_zone                 :string
+#  otp_secret                :string
 #
 
 class User < ApplicationRecord
@@ -72,6 +73,8 @@ class User < ApplicationRecord
   devise :two_factor_authenticatable,
          otp_secret_encryption_key: Rails.configuration.x.otp_secret
 
+  include LegacyOtpSecret # Must be after the above `devise` line in order to override the legacy method
+
   devise :two_factor_backupable,
          otp_number_of_backup_codes: 10
 
@@ -131,11 +134,6 @@ class User < ApplicationRecord
   normalizes :time_zone, with: ->(time_zone) { ActiveSupport::TimeZone[time_zone].nil? ? nil : time_zone }
   normalizes :chosen_languages, with: ->(chosen_languages) { chosen_languages.compact_blank.presence }
 
-  # This avoids a deprecation warning from Rails 5.1
-  # It seems possible that a future release of devise-two-factor will
-  # handle this itself, and this can be removed from our User class.
-  attribute :otp_secret
-
   has_many :session_activations, dependent: :destroy
 
   delegate :can?, to: :role
diff --git a/config/environments/development.rb b/config/environments/development.rb
index a855f5a16..a3254125c 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -87,8 +87,7 @@ Rails.application.configure do
   # Otherwise, use letter_opener, which launches a browser window to view sent mail.
   config.action_mailer.delivery_method = ENV['HEROKU'] || ENV['VAGRANT'] || ENV['REMOTE_DEV'] ? :letter_opener_web : :letter_opener
 
-  # We provide a default secret for the development environment here.
-  # This value should not be used in production environments!
+  # TODO: Remove once devise-two-factor data migration complete
   config.x.otp_secret = ENV.fetch('OTP_SECRET', '1fc2b87989afa6351912abeebe31ffc5c476ead9bf8b3d74cbc4a302c7b69a45b40b1bbef3506ddad73e942e15ed5ca4b402bf9a66423626051104f4b5f05109')
 
   # Raise error when a before_action's only/except options reference missing actions
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 49e02b53d..6b1101ea1 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -157,6 +157,7 @@ Rails.application.configure do
     'Referrer-Policy' => 'same-origin',
   }
 
+  # TODO: Remove once devise-two-factor data migration complete
   config.x.otp_secret = ENV.fetch('OTP_SECRET')
 
   # Enable DNS rebinding protection and other `Host` header attacks.
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 13e197338..49b0c1f30 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -44,6 +44,7 @@ Rails.application.configure do
   # Print deprecation notices to the stderr.
   config.active_support.deprecation = :stderr
 
+  # TODO: Remove once devise-two-factor data migration complete
   config.x.otp_secret = '100c7faeef00caa29242f6b04156742bf76065771fd4117990c4282b8748ff3d99f8fdae97c982ab5bd2e6756a159121377cce4421f4a8ecd2d67bd7749a3fb4'
 
   # Generate random VAPID keys
diff --git a/db/migrate/20231210154528_add_otp_secret_to_user.rb b/db/migrate/20231210154528_add_otp_secret_to_user.rb
new file mode 100644
index 000000000..b2ce0a4f7
--- /dev/null
+++ b/db/migrate/20231210154528_add_otp_secret_to_user.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddOtpSecretToUser < ActiveRecord::Migration[7.1]
+  def change
+    add_column :users, :otp_secret, :string
+  end
+end
diff --git a/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb b/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb
new file mode 100644
index 000000000..360e4806d
--- /dev/null
+++ b/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class MigrateDeviseTwoFactorSecrets < ActiveRecord::Migration[7.1]
+  disable_ddl_transaction!
+
+  class MigrationUser < ApplicationRecord
+    self.table_name = :users
+
+    devise :two_factor_authenticatable,
+           otp_secret_encryption_key: Rails.configuration.x.otp_secret
+
+    include LegacyOtpSecret # Must be after the above `devise` line in order to override the legacy method
+  end
+
+  def up
+    MigrationUser.reset_column_information
+
+    users_with_otp_enabled.find_each do |user|
+      # Gets the new value on already-updated users
+      # Falls back to legacy value on not-yet-migrated users
+      otp_secret = user.otp_secret
+
+      Rails.logger.debug { "Processing #{user.email}" }
+
+      # This is a no-op for migrated users and updates format for not migrated
+      user.update!(otp_secret: otp_secret)
+    end
+  end
+
+  def down
+    raise ActiveRecord::IrreversibleMigration
+  end
+
+  private
+
+  def users_with_otp_enabled
+    MigrationUser.where(otp_required_for_login: true, otp_secret: nil)
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index a875c6ffc..11f1a202f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1199,6 +1199,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.bigint "role_id"
     t.text "settings"
     t.string "time_zone"
+    t.string "otp_secret"
     t.index ["account_id"], name: "index_users_on_account_id"
     t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
     t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id", where: "(created_by_application_id IS NOT NULL)"
diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake
index 0caebf92a..c8e0312bb 100644
--- a/lib/tasks/tests.rake
+++ b/lib/tasks/tests.rake
@@ -127,6 +127,14 @@ namespace :tests do
         exit(1)
       end
 
+      # This is checking the attribute rather than the method, to avoid the legacy fallback
+      # and ensure the data has been migrated
+      unless Account.find_local('qcuser').user[:otp_secret] == 'anotpsecretthatshouldbeencrypted'
+        puts "DEBUG: #{Account.find_local('qcuser').user.inspect}"
+        puts 'OTP secret for user not preserved as expected'
+        exit(1)
+      end
+
       puts 'No errors found. Database state is consistent with a successful migration process.'
     end
 
@@ -213,9 +221,15 @@ namespace :tests do
           (4, 10, 'kmruser@localhost', now(), now(), false, 'ku', '{en,kmr,ku,ckb}');
 
         INSERT INTO "users"
-          (id, account_id, email, created_at, updated_at, locale)
+          (id, account_id, email, created_at, updated_at, locale,
+           encrypted_otp_secret, encrypted_otp_secret_iv, encrypted_otp_secret_salt,
+           otp_required_for_login)
         VALUES
-          (5, 11, 'qcuser@localhost', now(), now(), 'fr-QC');
+          (5, 11, 'qcuser@localhost', now(), now(), 'fr-QC',
+           E'Fttsy7QAa0edaDfdfSz094rRLAxc8cJweDQ4BsWH/zozcdVA8o9GLqcKhn2b\nGi/V\n',
+           'rys3THICkr60BoWC',
+           '_LMkAGvdg7a+sDIKjI3mR2Q==',
+           true);
 
         INSERT INTO "settings"
           (id, thing_type, thing_id, var, value, created_at, updated_at)
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 714d595dc..fa0a0503a 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -9,14 +9,25 @@ RSpec.describe User do
 
   it_behaves_like 'two_factor_backupable'
 
-  describe 'otp_secret' do
+  describe 'legacy_otp_secret' do
     it 'is encrypted with OTP_SECRET environment variable' do
       user = Fabricate(:user,
                        encrypted_otp_secret: "Fttsy7QAa0edaDfdfSz094rRLAxc8cJweDQ4BsWH/zozcdVA8o9GLqcKhn2b\nGi/V\n",
                        encrypted_otp_secret_iv: 'rys3THICkr60BoWC',
                        encrypted_otp_secret_salt: '_LMkAGvdg7a+sDIKjI3mR2Q==')
 
-      expect(user.otp_secret).to eq 'anotpsecretthatshouldbeencrypted'
+      expect(user.send(:legacy_otp_secret)).to eq 'anotpsecretthatshouldbeencrypted'
+    end
+  end
+
+  describe 'otp_secret' do
+    it 'encrypts the saved value' do
+      user = Fabricate(:user, otp_secret: '123123123')
+
+      user.reload
+
+      expect(user.otp_secret).to eq '123123123'
+      expect(user.attributes_before_type_cast[:otp_secret]).to_not eq '123123123'
     end
   end
 

From 88882fbbeefe0a5a91985a4c50c44f897e30aabd Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Thu, 2 May 2024 05:40:05 -0400
Subject: [PATCH 042/215] Move Rails/HABTM cop out of todo (#30118)

---
 .rubocop_todo.yml                           | 8 --------
 app/models/concerns/account/associations.rb | 2 +-
 app/models/status.rb                        | 2 +-
 app/models/tag.rb                           | 2 ++
 4 files changed, 4 insertions(+), 10 deletions(-)

diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index e65657814..25b573017 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -42,14 +42,6 @@ RSpec/MultipleMemoizedHelpers:
 RSpec/NestedGroups:
   Max: 6
 
-# Configuration parameters: Include.
-# Include: app/models/**/*.rb
-Rails/HasAndBelongsToMany:
-  Exclude:
-    - 'app/models/concerns/account/associations.rb'
-    - 'app/models/status.rb'
-    - 'app/models/tag.rb'
-
 Rails/OutputSafety:
   Exclude:
     - 'config/initializers/simple_form.rb'
diff --git a/app/models/concerns/account/associations.rb b/app/models/concerns/account/associations.rb
index b2e9d255f..1c67b07e5 100644
--- a/app/models/concerns/account/associations.rb
+++ b/app/models/concerns/account/associations.rb
@@ -62,7 +62,7 @@ module Account::Associations
     has_many :aliases, class_name: 'AccountAlias', dependent: :destroy, inverse_of: :account
 
     # Hashtags
-    has_and_belongs_to_many :tags
+    has_and_belongs_to_many :tags # rubocop:disable Rails/HasAndBelongsToMany
     has_many :featured_tags, -> { includes(:tag) }, dependent: :destroy, inverse_of: :account
 
     # Account deletion requests
diff --git a/app/models/status.rb b/app/models/status.rb
index 2ff803bf0..0bb5c0ce2 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -82,7 +82,7 @@ class Status < ApplicationRecord
   has_many :local_reblogged, -> { merge(Account.local) }, through: :reblogs, source: :account
   has_many :local_bookmarked, -> { merge(Account.local) }, through: :bookmarks, source: :account
 
-  has_and_belongs_to_many :tags
+  has_and_belongs_to_many :tags # rubocop:disable Rails/HasAndBelongsToMany
 
   has_one :preview_cards_status, inverse_of: :status, dependent: :delete
 
diff --git a/app/models/tag.rb b/app/models/tag.rb
index 58baa48c0..35be921e2 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -21,8 +21,10 @@
 
 class Tag < ApplicationRecord
   include Paginable
+  # rubocop:disable Rails/HasAndBelongsToMany
   has_and_belongs_to_many :statuses
   has_and_belongs_to_many :accounts
+  # rubocop:enable Rails/HasAndBelongsToMany
 
   has_many :passive_relationships, class_name: 'TagFollow', inverse_of: :tag, dependent: :destroy
   has_many :featured_tags, dependent: :destroy, inverse_of: :tag

From 616e2f26668d578ae81043a3836e881178d3e806 Mon Sep 17 00:00:00 2001
From: mogaminsk <mgmnjp@icloud.com>
Date: Thu, 2 May 2024 18:40:18 +0900
Subject: [PATCH 043/215] Fix word breaking in filtered notifications badge
 (#30114)

---
 app/javascript/styles/mastodon/components.scss | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 51596ec24..12c987a02 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -10145,6 +10145,7 @@ noscript {
     font-weight: 500;
     font-size: 11px;
     line-height: 16px;
+    word-break: keep-all;
 
     &__badge {
       background: $ui-button-background-color;

From 9e260014c72fa83740d70d2d603e836f86e64b55 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Thu, 2 May 2024 14:02:13 +0200
Subject: [PATCH 044/215] Convert `entrypoints/two_factor_authentication` to
 Typescript (#30105)

---
 .../entrypoints/two_factor_authentication.js  | 119 -----------
 .../entrypoints/two_factor_authentication.ts  | 197 ++++++++++++++++++
 2 files changed, 197 insertions(+), 119 deletions(-)
 delete mode 100644 app/javascript/entrypoints/two_factor_authentication.js
 create mode 100644 app/javascript/entrypoints/two_factor_authentication.ts

diff --git a/app/javascript/entrypoints/two_factor_authentication.js b/app/javascript/entrypoints/two_factor_authentication.js
deleted file mode 100644
index e77965c75..000000000
--- a/app/javascript/entrypoints/two_factor_authentication.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import * as WebAuthnJSON from '@github/webauthn-json';
-import axios from 'axios';
-
-import ready from '../mastodon/ready';
-import 'regenerator-runtime/runtime';
-
-function getCSRFToken() {
-  var CSRFSelector = document.querySelector('meta[name="csrf-token"]');
-  if (CSRFSelector) {
-    return CSRFSelector.getAttribute('content');
-  } else {
-    return null;
-  }
-}
-
-function hideFlashMessages() {
-  Array.from(document.getElementsByClassName('flash-message')).forEach(function(flashMessage) {
-    flashMessage.classList.add('hidden');
-  });
-}
-
-function callback(url, body) {
-  axios.post(url, JSON.stringify(body), {
-    headers: {
-      'Content-Type': 'application/json',
-      'Accept': 'application/json',
-      'X-CSRF-Token': getCSRFToken(),
-    },
-    credentials: 'same-origin',
-  }).then(function(response) {
-    window.location.replace(response.data.redirect_path);
-  }).catch(function(error) {
-    if (error.response.status === 422) {
-      const errorMessage = document.getElementById('security-key-error-message');
-      errorMessage.classList.remove('hidden');
-      console.error(error.response.data.error);
-    } else {
-      console.error(error);
-    }
-  });
-}
-
-ready(() => {
-  if (!WebAuthnJSON.supported()) {
-    const unsupported_browser_message = document.getElementById('unsupported-browser-message');
-    if (unsupported_browser_message) {
-      unsupported_browser_message.classList.remove('hidden');
-      document.querySelector('.btn.js-webauthn').disabled = true;
-    }
-  }
-
-
-  const webAuthnCredentialRegistrationForm = document.getElementById('new_webauthn_credential');
-  if (webAuthnCredentialRegistrationForm) {
-    webAuthnCredentialRegistrationForm.addEventListener('submit', (event) => {
-      event.preventDefault();
-
-      var nickname = event.target.querySelector('input[name="new_webauthn_credential[nickname]"]');
-      if (nickname.value) {
-        axios.get('/settings/security_keys/options')
-          .then((response) => {
-            const credentialOptions = response.data;
-
-            WebAuthnJSON.create({ 'publicKey': credentialOptions }).then((credential) => {
-              var params = { 'credential': credential, 'nickname': nickname.value };
-              callback('/settings/security_keys', params);
-            }).catch((error) => {
-              const errorMessage = document.getElementById('security-key-error-message');
-              errorMessage.classList.remove('hidden');
-              console.error(error);
-            });
-          }).catch((error) => {
-            console.error(error.response.data.error);
-          });
-      } else {
-        nickname.focus();
-      }
-    });
-  }
-
-  const webAuthnCredentialAuthenticationForm = document.getElementById('webauthn-form');
-  if (webAuthnCredentialAuthenticationForm) {
-    webAuthnCredentialAuthenticationForm.addEventListener('submit', (event) => {
-      event.preventDefault();
-
-      axios.get('sessions/security_key_options')
-        .then((response) => {
-          const credentialOptions = response.data;
-
-          WebAuthnJSON.get({ 'publicKey': credentialOptions }).then((credential) => {
-            var params = { 'user': { 'credential': credential } };
-            callback('sign_in', params);
-          }).catch((error) => {
-            const errorMessage = document.getElementById('security-key-error-message');
-            errorMessage.classList.remove('hidden');
-            console.error(error);
-          });
-        }).catch((error) => {
-          console.error(error.response.data.error);
-        });
-    });
-
-    const otpAuthenticationForm = document.getElementById('otp-authentication-form');
-
-    const linkToOtp = document.getElementById('link-to-otp');
-    linkToOtp.addEventListener('click', () => {
-      webAuthnCredentialAuthenticationForm.classList.add('hidden');
-      otpAuthenticationForm.classList.remove('hidden');
-      hideFlashMessages();
-    });
-
-    const linkToWebAuthn = document.getElementById('link-to-webauthn');
-    linkToWebAuthn.addEventListener('click', () => {
-      otpAuthenticationForm.classList.add('hidden');
-      webAuthnCredentialAuthenticationForm.classList.remove('hidden');
-      hideFlashMessages();
-    });
-  }
-});
diff --git a/app/javascript/entrypoints/two_factor_authentication.ts b/app/javascript/entrypoints/two_factor_authentication.ts
new file mode 100644
index 000000000..981481694
--- /dev/null
+++ b/app/javascript/entrypoints/two_factor_authentication.ts
@@ -0,0 +1,197 @@
+import * as WebAuthnJSON from '@github/webauthn-json';
+import axios, { AxiosError } from 'axios';
+
+import ready from '../mastodon/ready';
+
+import 'regenerator-runtime/runtime';
+
+type PublicKeyCredentialCreationOptionsJSON =
+  WebAuthnJSON.CredentialCreationOptionsJSON['publicKey'];
+
+function exceptionHasAxiosError(
+  error: unknown,
+): error is AxiosError<{ error: unknown }> {
+  return (
+    error instanceof AxiosError &&
+    typeof error.response?.data === 'object' &&
+    'error' in error.response.data
+  );
+}
+
+function logAxiosResponseError(error: unknown) {
+  if (exceptionHasAxiosError(error)) console.error(error);
+}
+
+function getCSRFToken() {
+  return document
+    .querySelector<HTMLMetaElement>('meta[name="csrf-token"]')
+    ?.getAttribute('content');
+}
+
+function hideFlashMessages() {
+  document.querySelectorAll('.flash-message').forEach((flashMessage) => {
+    flashMessage.classList.add('hidden');
+  });
+}
+
+async function callback(
+  url: string,
+  body:
+    | {
+        credential: WebAuthnJSON.PublicKeyCredentialWithAttestationJSON;
+        nickname: string;
+      }
+    | {
+        user: { credential: WebAuthnJSON.PublicKeyCredentialWithAssertionJSON };
+      },
+) {
+  try {
+    const response = await axios.post<{ redirect_path: string }>(
+      url,
+      JSON.stringify(body),
+      {
+        headers: {
+          'Content-Type': 'application/json',
+          Accept: 'application/json',
+          'X-CSRF-Token': getCSRFToken(),
+        },
+      },
+    );
+
+    window.location.replace(response.data.redirect_path);
+  } catch (error) {
+    if (error instanceof AxiosError && error.response?.status === 422) {
+      const errorMessage = document.getElementById(
+        'security-key-error-message',
+      );
+      errorMessage?.classList.remove('hidden');
+
+      logAxiosResponseError(error);
+    } else {
+      console.error(error);
+    }
+  }
+}
+
+async function handleWebauthnCredentialRegistration(nickname: string) {
+  try {
+    const response = await axios.get<PublicKeyCredentialCreationOptionsJSON>(
+      '/settings/security_keys/options',
+    );
+
+    const credentialOptions = response.data;
+
+    try {
+      const credential = await WebAuthnJSON.create({
+        publicKey: credentialOptions,
+      });
+
+      const params = {
+        credential: credential,
+        nickname: nickname,
+      };
+
+      await callback('/settings/security_keys', params);
+    } catch (error) {
+      const errorMessage = document.getElementById(
+        'security-key-error-message',
+      );
+      errorMessage?.classList.remove('hidden');
+      console.error(error);
+    }
+  } catch (error) {
+    logAxiosResponseError(error);
+  }
+}
+
+async function handleWebauthnCredentialAuthentication() {
+  try {
+    const response = await axios.get<PublicKeyCredentialCreationOptionsJSON>(
+      'sessions/security_key_options',
+    );
+
+    const credentialOptions = response.data;
+
+    try {
+      const credential = await WebAuthnJSON.get({
+        publicKey: credentialOptions,
+      });
+
+      const params = { user: { credential: credential } };
+      void callback('sign_in', params);
+    } catch (error) {
+      const errorMessage = document.getElementById(
+        'security-key-error-message',
+      );
+      errorMessage?.classList.remove('hidden');
+      console.error(error);
+    }
+  } catch (error) {
+    logAxiosResponseError(error);
+  }
+}
+
+ready(() => {
+  if (!WebAuthnJSON.supported()) {
+    const unsupported_browser_message = document.getElementById(
+      'unsupported-browser-message',
+    );
+    if (unsupported_browser_message) {
+      unsupported_browser_message.classList.remove('hidden');
+      const button = document.querySelector<HTMLButtonElement>(
+        'button.btn.js-webauthn',
+      );
+      if (button) button.disabled = true;
+    }
+  }
+
+  const webAuthnCredentialRegistrationForm =
+    document.querySelector<HTMLFormElement>('form#new_webauthn_credential');
+  if (webAuthnCredentialRegistrationForm) {
+    webAuthnCredentialRegistrationForm.addEventListener('submit', (event) => {
+      event.preventDefault();
+
+      if (!(event.target instanceof HTMLFormElement)) return;
+
+      const nickname = event.target.querySelector<HTMLInputElement>(
+        'input[name="new_webauthn_credential[nickname]"]',
+      );
+
+      if (nickname?.value) {
+        void handleWebauthnCredentialRegistration(nickname.value);
+      } else {
+        nickname?.focus();
+      }
+    });
+  }
+
+  const webAuthnCredentialAuthenticationForm =
+    document.getElementById('webauthn-form');
+  if (webAuthnCredentialAuthenticationForm) {
+    webAuthnCredentialAuthenticationForm.addEventListener('submit', (event) => {
+      event.preventDefault();
+      void handleWebauthnCredentialAuthentication();
+    });
+
+    const otpAuthenticationForm = document.getElementById(
+      'otp-authentication-form',
+    );
+
+    const linkToOtp = document.getElementById('link-to-otp');
+
+    linkToOtp?.addEventListener('click', () => {
+      webAuthnCredentialAuthenticationForm.classList.add('hidden');
+      otpAuthenticationForm?.classList.remove('hidden');
+      hideFlashMessages();
+    });
+
+    const linkToWebAuthn = document.getElementById('link-to-webauthn');
+    linkToWebAuthn?.addEventListener('click', () => {
+      otpAuthenticationForm?.classList.add('hidden');
+      webAuthnCredentialAuthenticationForm.classList.remove('hidden');
+      hideFlashMessages();
+    });
+  }
+}).catch((e: unknown) => {
+  throw e;
+});

From 253ead3aa7f69053eb6b275ba3016c43be2d3675 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 2 May 2024 22:56:21 +0200
Subject: [PATCH 045/215] Fix not being able to block a subdomain of an
 already-blocked domain through the API (#30119)

---
 .../api/v1/admin/domain_blocks_controller.rb  |  9 +++-
 .../api/v1/admin/domain_blocks_spec.rb        | 41 ++++++++++++++++++-
 2 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb
index b589d277d..ae94ac59c 100644
--- a/app/controllers/api/v1/admin/domain_blocks_controller.rb
+++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb
@@ -29,10 +29,11 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
   def create
     authorize :domain_block, :create?
 
+    @domain_block = DomainBlock.new(resource_params)
     existing_domain_block = resource_params[:domain].present? ? DomainBlock.rule_for(resource_params[:domain]) : nil
-    return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if existing_domain_block.present?
+    return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if conflicts_with_existing_block?(@domain_block, existing_domain_block)
 
-    @domain_block = DomainBlock.create!(resource_params)
+    @domain_block.save!
     DomainBlockWorker.perform_async(@domain_block.id)
     log_action :create, @domain_block
     render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
@@ -55,6 +56,10 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
 
   private
 
+  def conflicts_with_existing_block?(domain_block, existing_domain_block)
+    existing_domain_block.present? && (existing_domain_block.domain == TagManager.instance.normalize_domain(domain_block.domain) || !domain_block.stricter_than?(existing_domain_block))
+  end
+
   def set_domain_blocks
     @domain_blocks = filtered_domain_blocks.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
   end
diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb
index 47aaf44d8..415281a93 100644
--- a/spec/requests/api/v1/admin/domain_blocks_spec.rb
+++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb
@@ -130,7 +130,7 @@ RSpec.describe 'Domain Blocks' do
     it_behaves_like 'forbidden for wrong role', ''
     it_behaves_like 'forbidden for wrong role', 'Moderator'
 
-    it 'returns expected domain name and severity', :aggregate_failures do
+    it 'creates a domain block with the expected domain name and severity', :aggregate_failures do
       subject
 
       body = body_as_json
@@ -146,7 +146,44 @@ RSpec.describe 'Domain Blocks' do
       expect(DomainBlock.find_by(domain: 'foo.bar.com')).to be_present
     end
 
-    context 'when a stricter domain block already exists' do
+    context 'when a looser domain block already exists on a higher level domain' do
+      let(:params) { { domain: 'foo.bar.com', severity: :suspend } }
+
+      before do
+        Fabricate(:domain_block, domain: 'bar.com', severity: :silence)
+      end
+
+      it 'creates a domain block with the expected domain name and severity', :aggregate_failures do
+        subject
+
+        body = body_as_json
+
+        expect(response).to have_http_status(200)
+        expect(body).to match a_hash_including(
+          {
+            domain: 'foo.bar.com',
+            severity: 'suspend',
+          }
+        )
+
+        expect(DomainBlock.find_by(domain: 'foo.bar.com')).to be_present
+      end
+    end
+
+    context 'when a domain block already exists on the same domain' do
+      before do
+        Fabricate(:domain_block, domain: 'foo.bar.com', severity: :silence)
+      end
+
+      it 'returns existing domain block in error', :aggregate_failures do
+        subject
+
+        expect(response).to have_http_status(422)
+        expect(body_as_json[:existing_domain_block][:domain]).to eq('foo.bar.com')
+      end
+    end
+
+    context 'when a stricter domain block already exists on a higher level domain' do
       before do
         Fabricate(:domain_block, domain: 'bar.com', severity: :suspend)
       end

From 4b2054ee57b41c304f85eab6236baebe0b732d95 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 23:22:26 +0200
Subject: [PATCH 046/215] Update Yarn to v4.2.1 (#30153)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 package.json           | 2 +-
 streaming/package.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 24d81ea47..3abc11c34 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@mastodon/mastodon",
   "license": "AGPL-3.0-or-later",
-  "packageManager": "yarn@4.1.1",
+  "packageManager": "yarn@4.2.1",
   "engines": {
     "node": ">=18"
   },
diff --git a/streaming/package.json b/streaming/package.json
index a0e7d96bb..c4dcccf1f 100644
--- a/streaming/package.json
+++ b/streaming/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@mastodon/streaming",
   "license": "AGPL-3.0-or-later",
-  "packageManager": "yarn@4.1.1",
+  "packageManager": "yarn@4.2.1",
   "engines": {
     "node": ">=18"
   },

From 9380805fc15f0a0bfc4ed9e70c393191f64e2718 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 3 May 2024 10:48:09 +0200
Subject: [PATCH 047/215] Update dependency rubocop-rspec to v2.29.2 (#30158)

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 a23178540..cb36bc2dd 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -651,8 +651,8 @@ GEM
       rubocop-ast (>= 1.31.1, < 2.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 2.4.0, < 3.0)
-    rubocop-ast (1.31.2)
-      parser (>= 3.3.0.4)
+    rubocop-ast (1.31.3)
+      parser (>= 3.3.1.0)
     rubocop-capybara (2.20.0)
       rubocop (~> 1.41)
     rubocop-factory_bot (2.25.1)
@@ -665,7 +665,7 @@ GEM
       rack (>= 1.1)
       rubocop (>= 1.33.0, < 2.0)
       rubocop-ast (>= 1.31.1, < 2.0)
-    rubocop-rspec (2.29.1)
+    rubocop-rspec (2.29.2)
       rubocop (~> 1.40)
       rubocop-capybara (~> 2.17)
       rubocop-factory_bot (~> 2.22)

From d5444a2c6c6bf9597503297dba9181e6d9bfad46 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 3 May 2024 11:15:06 +0200
Subject: [PATCH 048/215] New Crowdin Translations (automated) (#30160)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 config/locales/ia.yml             | 52 +++++++++++++++++++++++++++
 config/locales/simple_form.ia.yml | 60 +++++++++++++++++++++++++++++++
 config/locales/simple_form.sv.yml |  4 +++
 3 files changed, 116 insertions(+)

diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index ff7b47c1f..59dd2dbc0 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -159,42 +159,94 @@ ia:
       undo_suspension: Disfacer le suspension
       unsilenced_msg: Le limite del conto de %{username} ha essite cancellate
       unsubscribe: Desubscriber
+      unsuspended_msg: Annullate suspension del conto %{username} con successo
       username: Nomine de usator
       view_domain: Vider summario de dominio
       warn: Avisar
       web: Web
+      whitelisted: Permittite pro federation
     action_logs:
       action_types:
+        approve_appeal: Approbar appello
+        approve_user: Approbar usator
+        assigned_to_self_report: Assignar reporto
         change_email_user: Cambiar e-mail pro le usator
         change_role_user: Cambiar le rolo del usator
         confirm_user: Confirmar le usator
         create_account_warning: Crear un advertimento
         create_announcement: Crear annuncio
+        create_canonical_email_block: Crear blocada de email
+        create_custom_emoji: Crear emoticone personalisate
+        create_domain_allow: Crear permisso de dominio
+        create_domain_block: Crear blocada de dominio
+        create_email_domain_block: Crear blocada de dominio email
         create_ip_block: Crear un regula IP
+        create_unavailable_domain: Crear dominio indisponibile
         create_user_role: Crear un rolo
+        demote_user: Degradar usator
         destroy_announcement: Deler annuncio
+        destroy_canonical_email_block: Deler blocada de email
+        destroy_custom_emoji: Deler emoticone personalisate
+        destroy_domain_allow: Deler permisso de dominio
+        destroy_domain_block: Deler blocada de dominio
+        destroy_email_domain_block: Crear blocada de dominio email
+        destroy_instance: Purgar dominio
         destroy_ip_block: Deler le regula IP
         destroy_status: Deler le message
         destroy_unavailable_domain: Deler le dominio non disponibile
+        destroy_user_role: Destruer rolo
         disable_2fa_user: Disactivar 2FA
         disable_custom_emoji: Disactivar emoji personalisate
+        disable_sign_in_token_auth_user: Disactivar le authentication per testimonio via email pro usator
         disable_user: Disactivar le usator
         enable_custom_emoji: Activar emoji personalisate
+        enable_sign_in_token_auth_user: Activar le authentication per testimonio via email pro usator
         enable_user: Activar le usator
+        memorialize_account: Commemorar conto
         promote_user: Promover usator
+        reject_appeal: Rejectar appello
+        reject_user: Rejectar usator
+        remove_avatar_user: Remover avatar
+        reopen_report: Reaperir reporto
         resend_user: Reinviar message de confirmation
         reset_password_user: Reinitialisar contrasigno
+        resolve_report: Resolver reporto
+        sensitive_account: Marcar como sensibile le medios del conto
         silence_account: Limitar conto
+        suspend_account: Suspender conto
+        unassigned_report: Disassignar reporto
         unblock_email_account: Disblocar adresse de e-mail
+        unsensitive_account: Dismarcar como sensibile le medios del conto
         unsilence_account: Disfacer le limite de conto
+        unsuspend_account: Annullar suspension de conto
         update_announcement: Actualisar annuncio
         update_custom_emoji: Actualisar emoji personalisate
+        update_domain_block: Actualisar blocada de dominio
         update_ip_block: Actualisar le regula IP
         update_status: Actualisar le message
         update_user_role: Actualisar rolo
       actions:
+        approve_appeal_html: "%{name} approbava appello del decision de moderation de %{target}"
+        approve_user_html: "%{name} approbava inscription de %{target}"
+        assigned_to_self_report_html: "%{name} assignava reporto %{target} a se mesme"
         change_email_user_html: "%{name} cambiava le adresse de e-mail address del usator %{target}"
+        change_role_user_html: "%{name} cambiava rolo de %{target}"
+        confirm_user_html: "%{name} confirmava le adresse email del usator %{target}"
+        create_account_warning_html: "%{name} inviava un advertimento a %{target}"
         create_announcement_html: "%{name} creava un nove annuncio %{target}"
+        create_canonical_email_block_html: "%{name} blocava email con le hash %{target}"
+        create_custom_emoji_html: "%{name} cargava nove emoticone %{target}"
+        create_domain_allow_html: "%{name} permitteva federation con dominio %{target}"
+        create_domain_block_html: "%{name} blocava dominio %{target}"
+        create_email_domain_block_html: "%{name} blocava dominio email %{target}"
+        create_ip_block_html: "%{name} creava regula pro IP %{target}"
+        create_unavailable_domain_html: "%{name} stoppava consignation a dominio %{target}"
+        create_user_role_html: "%{name} creava rolo de %{target}"
+        demote_user_html: "%{name} degradava usator %{target}"
+        destroy_announcement_html: "%{name} deleva annuncio %{target}"
+        destroy_custom_emoji_html: "%{name} deleva emoji %{target}"
+        destroy_domain_block_html: "%{name} disblocava dominio %{target}"
+        destroy_user_role_html: "%{name} deleva le rolo de %{target}"
       deleted_account: conto delite
     announcements:
       destroyed_msg: Annuncio delite con successo!
diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml
index 05a5fa501..b5ec14e60 100644
--- a/config/locales/simple_form.ia.yml
+++ b/config/locales/simple_form.ia.yml
@@ -48,10 +48,48 @@ ia:
         email: Te sera inviate un email de confirmation
         header: WEBP, PNG, GIF or JPG. Al maximo %{size}. Sera diminuite a %{dimensions}px
         inbox_url: Copia le URL ab le pagina principal del repetitor que tu vole usar
+        irreversible: Le messages filtrate disparera irreversibilemente, mesmo si le filtro es plus tarde removite
+        locale: Le lingua del interfacie de usator, del emails e del notificationes pulsate
         password: Usa al minus 8 characteres
+        phrase: Sera concordate ignorante majuscule/minuscule in le texto o avisos de contento de un message
+        scopes: A que APIs sera permittite acceder al application. Si tu selige un ambito de maxime nivello, tu non besonia de seliger los singulemente.
+        setting_aggregate_reblogs: Non monstra nove stimulos pro messages que ha essite recentemente stimulate (stimulos solo affice los novemente recipite)
+        setting_always_send_emails: Normalmente le avisos de email non sera inviate quando tu activemente usa Mastodon
+        setting_default_sensitive: Le medios sensibile es celate de ordinario e pote esser revelate con un clic
+        setting_display_media_default: Celar le medios marcate como sensibile
         setting_display_media_hide_all: Sempre celar le medios
         setting_display_media_show_all: Sempre monstrar le medios
+        setting_use_blurhash: Le imagines degradate es basate sur le colores del medios visual celate, ma illos offusca qualcunque detalios
+        setting_use_pending_items: Celar le classification temporal detra un clic in vice que automaticamente rolante le fluxo
         username: Tu pote usar litteras, numeros e tractos de sublineamento
+        whole_word: Quando le parola o expression clave es solo alphanumeric, illo sera solo applicate si illo concorda con tote le parola
+      domain_allow:
+        domain: Iste dominio potera reportar datos ab iste servitor e le datos in ingresso ab illo sera processate e immagazinate
+      email_domain_block:
+        domain: Isto pote esser le nomine de dominio que apparera in le adresse email o le registration MX que illo usa. Illos sera verificate durante le inscription.
+        with_dns_records: Un tentativa sera facite pro resolver le registrationes de DNS del dominio date e le resultatos sera alsi blocate
+      featured_tag:
+        name: 'Ecce alcun del hashtags que tu usava le plus recentemente:'
+      filters:
+        action: Selige que action exequer quando un message concorda con le filtro
+        actions:
+          hide: Completemente celar le contento filtrate, comportar se como si illo non existerea
+          warn: Celar le contento filtrate detra un aviso citante le titulo del filtro
+      form_admin_settings:
+        activity_api_enabled: Numeros de messages localmente publicate, usatores active, e nove registrationes in gruppos septimanal
+        backups_retention_period: Le usatores pote generar archivos de lor messages pro discargar los plus tarde. Quando predefinite a un valor positive, iste archivos sera automaticamente delite de tu immagazinage post le specificate numero de dies.
+        bootstrap_timeline_accounts: Iste contos sera appunctate al summitate del recommendationes a sequer del nove usatores.
+        closed_registrations_message: Monstrate quando le inscriptiones es claudite
+        content_cache_retention_period: Tote messages de altere servitores (includite stimulos e responsas) sera delite post le specificate numero de dies, sin considerar alcun interaction de usator local con ille messages. Isto include messages ubi un usator local los ha marcate como marcapaginas o favoritos. Mentiones private inter usatores de differente instantias sera alsi perdite e impossibile a restaurar. Le uso de iste parametros es intendite pro specific instantias e infringe multe expectationes de usator quando implementate pro uso general.
+        custom_css: Tu pote applicar stilos personalisate sur le version de web de Mastodon.
+        mascot: Illo substitue le illustration in le interfacie web avantiate.
+        media_cache_retention_period: Le files multimedial de messages producite per usatores remote es in cache sur tu servitor. Quando predefinite a un valor positive, le medios sera delite post le numero de dies specificate. Le datos multimedial requirite post que illo es delite, sera re-discargate, si le contento original sera ancora disponibile. Per limitationes sur le frequentia con que le schedas de pre-visualisation de ligamine scruta le sitos de tertie partes, il es recommendate de predefinir iste valor a al minus 14 dies, o le schedas de pre-visualisation de ligamine non sera actualisate sur demanda ante ille tempore.
+        peers_api_enabled: Un lista de nomines de dominio que iste servitor ha incontrate in le fediverso. Nulle datos es includite ci re tu federation con un date servitor, justo que tu servitor lo cognosce. Isto es usate per servicios que collige statistica re le federation in senso general.
+        profile_directory: Le directorio de profilo lista tote le usatores qui ha optate pro esser detectabile.
+        require_invite_text: Quando le inscriptiones require approbation manual, rende obligatori, plus tosto que optional, le entrata de texto “Perque vole tu junger te?”
+        site_contact_email: Como pote contactar te le personas pro questiones legal o de supporto.
+        site_contact_username: Como pote contactar te le personas re Mastodon.
+        site_extended_description: Qualcunque information additional que pote esser utile al visitatores e a tu usatores. Pote esser structurate con syntaxe de markdown.
       ip_block:
         severities:
           no_access: Blocar accesso a tote le ressources
@@ -68,8 +106,11 @@ ia:
         show_collections: Monstrar sequites e sequitores in le profilo
         unlocked: Acceptar automaticamente nove sequitores
       account_warning_preset:
+        text: Texto predefinite
         title: Titulo
       admin_account_action:
+        send_email_notification: Notificar le usator per e-mail
+        text: Advertimento personalisate
         type: Action
         types:
           disable: Gelar
@@ -78,6 +119,7 @@ ia:
           silence: Limitar
           suspend: Suspender
       announcement:
+        starts_at: Initio del evento
         text: Annuncio
       defaults:
         autofollow: Invitar a sequer tu conto
@@ -85,24 +127,38 @@ ia:
         chosen_languages: Filtrar linguas
         confirm_new_password: Confirmar nove contrasigno
         confirm_password: Confirmar contrasigno
+        context: Contextos del filtro
         current_password: Contrasigno actual
+        data: Datos
         display_name: Nomine a monstrar
         email: Adresse de e-mail
+        expires_in: Expira post
+        fields: Campos extra
+        header: Imagine titulo
+        honeypot: "%{label} (non compilar)"
+        inbox_url: URL del cassa de ingresso de repetitor
         locale: Lingua de interfacie
+        max_uses: Numero max de usos
         new_password: Nove contrasigno
+        note: Bio
+        otp_attempt: Codice a duo factores
         password: Contrasigno
+        phrase: Parola o phrase clave
         setting_advanced_layout: Activar le interfacie web avantiate
         setting_always_send_emails: Sempre inviar notificationes per e-mail
         setting_default_language: Lingua de publication
+        setting_display_media: Visualisation de medios
         setting_display_media_default: Predefinite
         setting_display_media_hide_all: Celar toto
         setting_display_media_show_all: Monstrar toto
         setting_system_font_ui: Usar typo de litteras predefinite del systema
         setting_theme: Thema de sito
         setting_trends: Monstrar le tendentias de hodie
+        setting_use_pending_items: Modo lente
         severity: Severitate
         sign_in_token_attempt: Codice de securitate
         title: Titulo
+        type: Importar le typo
         username: Nomine de usator
         username_or_email: Nomine de usator o e-mail
         whole_word: Parola integre
@@ -123,6 +179,7 @@ ia:
         site_title: Nomine de servitor
         status_page_url: URL del pagina de stato
         theme: Thema predefinite
+        thumbnail: Miniatura de servitor
         trends: Activar tendentias
       invite:
         comment: Commento
@@ -133,6 +190,7 @@ ia:
           no_access: Blocar le accesso
         severity: Regula
       notification_emails:
+        digest: Inviar emails compendio
         software_updates:
           all: Notificar sur tote le actualisationes
           critical: Notificar solmente sur actualisationes critic
@@ -156,8 +214,10 @@ ia:
         position: Prioritate
       webhook:
         events: Eventos activate
+    'no': 'No'
     not_recommended: Non recommendate
     recommended: Recommendate
     required:
+      mark: "*"
       text: requirite
     'yes': Si
diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml
index 3ab16bf69..5e5c6f954 100644
--- a/config/locales/simple_form.sv.yml
+++ b/config/locales/simple_form.sv.yml
@@ -77,10 +77,13 @@ sv:
           warn: Dölj det filtrerade innehållet bakom en varning som visar filtrets rubrik
       form_admin_settings:
         activity_api_enabled: Antalet lokalt publicerade inlägg, aktiva användare och nya registrerade konton per vecka
+        backups_retention_period: Användare har möjlighet att generera arkiv av sina inlägg för att ladda ned senare. När det sätts till ett positivt värde raderas dessa arkiv automatiskt från din lagring efter det angivna antalet dagar.
         bootstrap_timeline_accounts: Dessa konton kommer fästas högst upp i nya användares följrekommendationer.
         closed_registrations_message: Visas när nyregistreringar är avstängda
+        content_cache_retention_period: Alla inlägg från andra servrar (inklusive booster och svar) kommer att raderas efter det angivna antalet dagar, utan hänsyn till någon lokal användarinteraktion med dessa inlägg. Detta inkluderar inlägg där en lokal användare har markerat det som bokmärke eller favoriter. Privata omnämnanden mellan användare från olika instanser kommer också att gå förlorade och blir omöjliga att återställa. Användningen av denna inställning är avsedd för specialfall och bryter många användarförväntningar när de implementeras för allmänt bruk.
         custom_css: Du kan använda anpassade stilar på webbversionen av Mastodon.
         mascot: Åsidosätter illustrationen i det avancerade webbgränssnittet.
+        media_cache_retention_period: Mediafiler från inlägg som gjorts av fjärranvändare cachas på din server. När inställd på ett positivt värde kommer media att raderas efter det angivna antalet dagar. Om mediadatat begärs efter att det har raderats, kommer det att laddas ned igen om källinnehållet fortfarande är tillgängligt. På grund av begränsningar för hur ofta förhandsgranskningskort för länkar hämtas från tredjepartswebbplatser, rekommenderas det att ange detta värde till minst 14 dagar, annars kommer förhandsgranskningskorten inte att uppdateras på begäran före den tiden.
         peers_api_enabled: En lista över domänen den här servern har stött på i fediversum. Ingen data inkluderas om du har federerat med servern, bara att din server känner till den. Detta används av tjänster som samlar statistik om federering i allmänhet.
         profile_directory: Profilkatalogen visar alla användare som har samtyckt till att bli upptäckbara.
         require_invite_text: Gör fältet "Varför vill du gå med?" obligatoriskt när nyregistreringar kräver manuellt godkännande
@@ -240,6 +243,7 @@ sv:
         backups_retention_period: Lagringsperiod för användararkivet
         bootstrap_timeline_accounts: Rekommendera alltid dessa konton till nya användare
         closed_registrations_message: Anpassat meddelande när nyregistreringar inte är tillgängliga
+        content_cache_retention_period: Förvaringsperiod för fjärrinnehåll
         custom_css: Anpassad CSS
         mascot: Anpassad maskot (tekniskt arv)
         media_cache_retention_period: Tid för bibehållande av mediecache

From 9aa31be8d3fd7f20a537bfb08b5e4ef11f636c34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A2u=20Cao?= <842+raucao@users.noreply.github.com>
Date: Fri, 3 May 2024 11:22:48 +0200
Subject: [PATCH 049/215] Fix local account search on LDAP login being
 case-sensitive (#30113)

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
---
 app/models/concerns/user/ldap_authenticable.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/models/concerns/user/ldap_authenticable.rb b/app/models/concerns/user/ldap_authenticable.rb
index 180df9d31..c8e9fa934 100644
--- a/app/models/concerns/user/ldap_authenticable.rb
+++ b/app/models/concerns/user/ldap_authenticable.rb
@@ -22,7 +22,7 @@ module User::LdapAuthenticable
         safe_username = safe_username.gsub(keys, replacement)
       end
 
-      resource = joins(:account).find_by(accounts: { username: safe_username })
+      resource = joins(:account).merge(Account.where(Account.arel_table[:username].lower.eq safe_username.downcase)).take
 
       if resource.blank?
         resource = new(

From 33368e3e79a6edfcaf65fd2b80b636a7c1e56e48 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Fri, 3 May 2024 11:26:24 +0200
Subject: [PATCH 050/215] Change ActiveRecordEncryption variable to be more
 explicit (#30151)

---
 config/initializers/active_record_encryption.rb |  4 ++--
 lib/tasks/db.rake                               | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/config/initializers/active_record_encryption.rb b/config/initializers/active_record_encryption.rb
index f99585b4a..7cda8c621 100644
--- a/config/initializers/active_record_encryption.rb
+++ b/config/initializers/active_record_encryption.rb
@@ -6,9 +6,9 @@
   ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY
 ).each do |key|
   ENV.fetch(key) do
-    raise <<~MESSAGE
+    abort <<~MESSAGE
 
-      The ActiveRecord encryption feature requires that these variables are set:
+      Mastodon now requires that these variables are set:
 
         - ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY
         - ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT
diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake
index 4208c2ae4..07de08776 100644
--- a/lib/tasks/db.rake
+++ b/lib/tasks/db.rake
@@ -1,6 +1,22 @@
 # frozen_string_literal: true
 
+# We are providing our own task with our own format
+Rake::Task['db:encryption:init'].clear
+
 namespace :db do
+  namespace :encryption do
+    desc 'Generate a set of keys for configuring Active Record encryption in a given environment'
+    task init: :environment do
+      puts <<~MSG
+        Add these environment variables to your Mastodon environment:#{' '}
+
+        ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=#{SecureRandom.alphanumeric(32)}
+        ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=#{SecureRandom.alphanumeric(32)}
+        ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=#{SecureRandom.alphanumeric(32)}
+      MSG
+    end
+  end
+
   namespace :migrate do
     desc 'Setup the db or migrate depending on state of db'
     task setup: :environment do

From b7902225d698a107df2cf8b4ca221caad38fa464 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Fri, 3 May 2024 10:56:48 -0400
Subject: [PATCH 051/215] Use built-in github annotation output for `stylelint`
 (#30165)

---
 .github/stylelint-matcher.json | 21 ---------------------
 .github/workflows/lint-css.yml |  6 +-----
 2 files changed, 1 insertion(+), 26 deletions(-)
 delete mode 100644 .github/stylelint-matcher.json

diff --git a/.github/stylelint-matcher.json b/.github/stylelint-matcher.json
deleted file mode 100644
index cdfd4086b..000000000
--- a/.github/stylelint-matcher.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "problemMatcher": [
-    {
-      "owner": "stylelint",
-      "pattern": [
-        {
-          "regexp": "^([^\\s].*)$",
-          "file": 1
-        },
-        {
-          "regexp": "^\\s+((\\d+):(\\d+))?\\s+(✖|×)\\s+(.*)\\s{2,}(.*)$",
-          "line": 2,
-          "column": 3,
-          "message": 5,
-          "code": 6,
-          "loop": true
-        }
-      ]
-    }
-  ]
-}
diff --git a/.github/workflows/lint-css.yml b/.github/workflows/lint-css.yml
index e5f487487..d3b8035cd 100644
--- a/.github/workflows/lint-css.yml
+++ b/.github/workflows/lint-css.yml
@@ -38,9 +38,5 @@ jobs:
       - name: Set up Javascript environment
         uses: ./.github/actions/setup-javascript
 
-      - uses: xt0rted/stylelint-problem-matcher@v1
-
-      - run: echo "::add-matcher::.github/stylelint-matcher.json"
-
       - name: Stylelint
-        run: yarn lint:css
+        run: yarn lint:css -f github

From 2f73e486b7e107763e92b47b8659e152f363d988 Mon Sep 17 00:00:00 2001
From: Tim Rogers <rogers.timothy.john@gmail.com>
Date: Sat, 4 May 2024 21:24:10 -0500
Subject: [PATCH 052/215] =?UTF-8?q?Switched=20HTMLEntities=20to=20the=20ex?=
 =?UTF-8?q?panded=20flavor=20which=20supports=20a=20larger=20=E2=80=A6=20(?=
 =?UTF-8?q?#30173)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/lib/link_details_extractor.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb
index bec7d3a45..07776c369 100644
--- a/app/lib/link_details_extractor.rb
+++ b/app/lib/link_details_extractor.rb
@@ -282,6 +282,6 @@ class LinkDetailsExtractor
   end
 
   def html_entities
-    @html_entities ||= HTMLEntities.new
+    @html_entities ||= HTMLEntities.new(:expanded)
   end
 end

From e4841ca82b58f33ec42742b40211f38fef1e7338 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 10:26:12 +0200
Subject: [PATCH 053/215] Update dependency irb to v1.13.1 (#30177)

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 cb36bc2dd..27d858ed0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -346,7 +346,7 @@ GEM
       activesupport (>= 3.0)
       nokogiri (>= 1.6)
     io-console (0.7.2)
-    irb (1.13.0)
+    irb (1.13.1)
       rdoc (>= 4.0.0)
       reline (>= 0.4.2)
     jmespath (1.6.2)
@@ -601,7 +601,7 @@ GEM
     redlock (1.3.2)
       redis (>= 3.0.0, < 6.0)
     regexp_parser (2.9.0)
-    reline (0.5.4)
+    reline (0.5.5)
       io-console (~> 0.5)
     request_store (1.6.0)
       rack (>= 1.4)

From d544b83f917773749f9664be4bca4eec4078a2b6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 10:26:28 +0200
Subject: [PATCH 054/215] Update formatjs monorepo (#30175)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index e45da3a48..7f0747faa 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2307,23 +2307,23 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@formatjs/intl@npm:2.10.1":
-  version: 2.10.1
-  resolution: "@formatjs/intl@npm:2.10.1"
+"@formatjs/intl@npm:2.10.2":
+  version: 2.10.2
+  resolution: "@formatjs/intl@npm:2.10.2"
   dependencies:
     "@formatjs/ecma402-abstract": "npm:1.18.2"
     "@formatjs/fast-memoize": "npm:2.2.0"
     "@formatjs/icu-messageformat-parser": "npm:2.7.6"
     "@formatjs/intl-displaynames": "npm:6.6.6"
     "@formatjs/intl-listformat": "npm:7.5.5"
-    intl-messageformat: "npm:10.5.11"
+    intl-messageformat: "npm:10.5.12"
     tslib: "npm:^2.4.0"
   peerDependencies:
     typescript: ^4.7 || 5
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/24eee77382d1efd226aee7590228d3ae80f66a8547a65295f8028986b15b6abbfea3e380f4a338ece0e841e1db6f36554ca48124d84c0830382e3a9d395b5d75
+  checksum: 10c0/20df407e141055e8c7b2605c06e952b643be7ea01d992862e13fc623ca2db034069744eae2be16655bf7888b3add1bfc2653fd0a08bcfdb67fb9b72a306f7718
   languageName: node
   linkType: hard
 
@@ -9615,15 +9615,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"intl-messageformat@npm:10.5.11, intl-messageformat@npm:^10.3.5":
-  version: 10.5.11
-  resolution: "intl-messageformat@npm:10.5.11"
+"intl-messageformat@npm:10.5.12, intl-messageformat@npm:^10.3.5":
+  version: 10.5.12
+  resolution: "intl-messageformat@npm:10.5.12"
   dependencies:
     "@formatjs/ecma402-abstract": "npm:1.18.2"
     "@formatjs/fast-memoize": "npm:2.2.0"
     "@formatjs/icu-messageformat-parser": "npm:2.7.6"
     tslib: "npm:^2.4.0"
-  checksum: 10c0/423f1c879ce2d0e7b9e0b4c1787a81ead7fe4d1734e0366a20fef56b06c09146e7ca3618e2e78b4f8b8f2b59cafe6237ceed21530fe0c16cfb47d915fc80222d
+  checksum: 10c0/f95734e98a05ef7f51de0c27904d3a994528e3a174963bd1b3a6db9416b5fd84bbd8f7d26d84fc547d51af69ccf46dd3f73a3f4f20a2ccef5c9cd90e946ad82c
   languageName: node
   linkType: hard
 
@@ -14346,18 +14346,18 @@ __metadata:
   linkType: hard
 
 "react-intl@npm:^6.4.2":
-  version: 6.6.5
-  resolution: "react-intl@npm:6.6.5"
+  version: 6.6.6
+  resolution: "react-intl@npm:6.6.6"
   dependencies:
     "@formatjs/ecma402-abstract": "npm:1.18.2"
     "@formatjs/icu-messageformat-parser": "npm:2.7.6"
-    "@formatjs/intl": "npm:2.10.1"
+    "@formatjs/intl": "npm:2.10.2"
     "@formatjs/intl-displaynames": "npm:6.6.6"
     "@formatjs/intl-listformat": "npm:7.5.5"
     "@types/hoist-non-react-statics": "npm:^3.3.1"
     "@types/react": "npm:16 || 17 || 18"
     hoist-non-react-statics: "npm:^3.3.2"
-    intl-messageformat: "npm:10.5.11"
+    intl-messageformat: "npm:10.5.12"
     tslib: "npm:^2.4.0"
   peerDependencies:
     react: ^16.6.0 || 17 || 18
@@ -14365,7 +14365,7 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/31f231701af080bc923fdf25ff22ae7ad56bd7892602879fe6fa3de0c6ab95aab10ff86595372be155e0be45a7130a2cca91dbab73e558359cebc1785711ded2
+  checksum: 10c0/04c1d1ca783f2a5e605544290c93e57629500be6811d7c2c3342903bf9f9a720d2e4c9cf3924133bf84e510ee879bf3d870a3ff269f5b197f894a49047bd089d
   languageName: node
   linkType: hard
 

From a96b82802380f2220d7e2a059ca3c773c9ce3472 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 10:26:33 +0200
Subject: [PATCH 055/215] Update dependency postcss-preset-env to v9.5.11
 (#30171)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 376 +++++++++++++++++++++++++++---------------------------
 1 file changed, 188 insertions(+), 188 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 7f0747faa..ddc789b5f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1551,13 +1551,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/cascade-layer-name-parser@npm:^1.0.9":
-  version: 1.0.9
-  resolution: "@csstools/cascade-layer-name-parser@npm:1.0.9"
+"@csstools/cascade-layer-name-parser@npm:^1.0.11":
+  version: 1.0.11
+  resolution: "@csstools/cascade-layer-name-parser@npm:1.0.11"
   peerDependencies:
-    "@csstools/css-parser-algorithms": ^2.6.1
-    "@csstools/css-tokenizer": ^2.2.4
-  checksum: 10c0/f6e28c7cdeca44711288400cf20de9ebc4db71eafa39ca9a6b3e9f5d3295ba636dd986aac9fcb9e6171c84d436712d68ced923504d78d5fda0601c880eb352fe
+    "@csstools/css-parser-algorithms": ^2.6.3
+    "@csstools/css-tokenizer": ^2.3.1
+  checksum: 10c0/52ac8369877c8072ff5c111f656bd87e9a2a4b9e44e48fe005c26faeb6cffd83bfe2f463f4f385a2ae5cfe1f82bbf95d26ddaabca18b66c6b657c4fe1520fb43
   languageName: node
   linkType: hard
 
@@ -1568,52 +1568,52 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/css-calc@npm:^1.2.0":
-  version: 1.2.0
-  resolution: "@csstools/css-calc@npm:1.2.0"
+"@csstools/css-calc@npm:^1.2.2":
+  version: 1.2.2
+  resolution: "@csstools/css-calc@npm:1.2.2"
   peerDependencies:
-    "@csstools/css-parser-algorithms": ^2.6.1
-    "@csstools/css-tokenizer": ^2.2.4
-  checksum: 10c0/ef12dc08ccdb9903e5cb24d81b469080b94c79123415f62f707196a85c53420b7729be608930314c7a9404f50c832fe5256f647c0567d1c825079cb77f6a8719
+    "@csstools/css-parser-algorithms": ^2.6.3
+    "@csstools/css-tokenizer": ^2.3.1
+  checksum: 10c0/6032b482764a11c1b882d7502928950ab11760044fa7a2c23ecee802002902f6ea8fca045ee2919302af5a5c399e7baa9f68dff001ac6246ac7fef48fb3f6df7
   languageName: node
   linkType: hard
 
-"@csstools/css-color-parser@npm:^2.0.0":
-  version: 2.0.0
-  resolution: "@csstools/css-color-parser@npm:2.0.0"
+"@csstools/css-color-parser@npm:^2.0.2":
+  version: 2.0.2
+  resolution: "@csstools/css-color-parser@npm:2.0.2"
   dependencies:
     "@csstools/color-helpers": "npm:^4.2.0"
-    "@csstools/css-calc": "npm:^1.2.0"
+    "@csstools/css-calc": "npm:^1.2.2"
   peerDependencies:
-    "@csstools/css-parser-algorithms": ^2.6.1
-    "@csstools/css-tokenizer": ^2.2.4
-  checksum: 10c0/295f844a194dec4f51439e8760dbb4a142901b8b60cd9d676a62c15c0e8408eb7bcdcbb40be52cdd5f67d020e655a1c3267a28923cfc4f6bae2b74aa48fce426
+    "@csstools/css-parser-algorithms": ^2.6.3
+    "@csstools/css-tokenizer": ^2.3.1
+  checksum: 10c0/c5ae4ad78745e425dce56da9f1ab053fb4f7963399735df3303305b32123bed0b2237689c2e7e99da2c62387e3226c12ea85e70e275c4027c7507e4ac929bffa
   languageName: node
   linkType: hard
 
-"@csstools/css-parser-algorithms@npm:^2.6.1":
-  version: 2.6.1
-  resolution: "@csstools/css-parser-algorithms@npm:2.6.1"
+"@csstools/css-parser-algorithms@npm:^2.6.1, @csstools/css-parser-algorithms@npm:^2.6.3":
+  version: 2.6.3
+  resolution: "@csstools/css-parser-algorithms@npm:2.6.3"
   peerDependencies:
-    "@csstools/css-tokenizer": ^2.2.4
-  checksum: 10c0/2c60377c4ffc96bbeb962cab19c09fccbcc834785928747219ed3bd916a34e52977393935d1d36501403f3f95ff59d358dd741d1dddcdaf9564ab36d73926aa6
+    "@csstools/css-tokenizer": ^2.3.1
+  checksum: 10c0/6648fda75a1c08096320fb5c04fd13656a0168de13584d2795547fecfb26c2c7d8b3b1fb79ba7aa758714851e98bfbec20d89e28697f999f41f91133eafe4207
   languageName: node
   linkType: hard
 
-"@csstools/css-tokenizer@npm:^2.2.4":
-  version: 2.2.4
-  resolution: "@csstools/css-tokenizer@npm:2.2.4"
-  checksum: 10c0/23997db5874514f4b951ebd215e1e6cc8baf03adf9a35fc6fd028b84cb52aa2dc053860722108c09859a9b37b455f62b84181fe15539cd37797ea699b9ff85f0
+"@csstools/css-tokenizer@npm:^2.2.4, @csstools/css-tokenizer@npm:^2.3.1":
+  version: 2.3.1
+  resolution: "@csstools/css-tokenizer@npm:2.3.1"
+  checksum: 10c0/fed6619fb5108e109d4dd10b0e967035a92793bae8fb84544e1342058b6df4e306d9d075623e2201fe88831b1ada797aea3546a8d12229d2d81cd7a5dfee4444
   languageName: node
   linkType: hard
 
-"@csstools/media-query-list-parser@npm:^2.1.9":
-  version: 2.1.9
-  resolution: "@csstools/media-query-list-parser@npm:2.1.9"
+"@csstools/media-query-list-parser@npm:^2.1.11, @csstools/media-query-list-parser@npm:^2.1.9":
+  version: 2.1.11
+  resolution: "@csstools/media-query-list-parser@npm:2.1.11"
   peerDependencies:
-    "@csstools/css-parser-algorithms": ^2.6.1
-    "@csstools/css-tokenizer": ^2.2.4
-  checksum: 10c0/602e9b5631928c078e670018df20b959bfb8e42ea11024d5218f1604e5ef94e070a74934a919ccbff3713e506d99096057947fa0c2e4768939f7b22479553534
+    "@csstools/css-parser-algorithms": ^2.6.3
+    "@csstools/css-tokenizer": ^2.3.1
+  checksum: 10c0/9bcd99f7d28ae3cdaba73fbbfef571b0393dd4e841f522cc796fe5161744f17e327ba1713dad3c481626fade1357c55890e3d365177abed50e857b69130a9be5
   languageName: node
   linkType: hard
 
@@ -1629,46 +1629,46 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-color-function@npm:^3.0.14":
-  version: 3.0.14
-  resolution: "@csstools/postcss-color-function@npm:3.0.14"
+"@csstools/postcss-color-function@npm:^3.0.16":
+  version: 3.0.16
+  resolution: "@csstools/postcss-color-function@npm:3.0.16"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/81592b0eb3ad7022313ecafd028908b167de42acc6765f708c9b10631f86123c2b803aca27378f021c2b3dab8cc47770c0364fe5a3c1e18ec006deaf72e17c38
+  checksum: 10c0/41756a4601a3f1086290dab6ca92b54e201bd94637b54b439c66a04fd628a14e2a0bd1452ad294d2981e2f4bb306758fa5f44639b1c4332320435050749aa487
   languageName: node
   linkType: hard
 
-"@csstools/postcss-color-mix-function@npm:^2.0.14":
-  version: 2.0.14
-  resolution: "@csstools/postcss-color-mix-function@npm:2.0.14"
+"@csstools/postcss-color-mix-function@npm:^2.0.16":
+  version: 2.0.16
+  resolution: "@csstools/postcss-color-mix-function@npm:2.0.16"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/1dd3c63bbbbb9d3094699f169bbb9d26e86a49accb5f9abaa2441b54cb8a6f4cd332409666684a275eca867e3ef0ea3f6eafdf9fb87f2cbfa17c6296fb1ed4d7
+  checksum: 10c0/70cd5b291dd615e20e4475517bf0027c90c433241397a66866f89acedb12cb91f45552a162bdd1000636ec56f7d6a099b65e44fe100fd03228fc65f17cfae285
   languageName: node
   linkType: hard
 
-"@csstools/postcss-exponential-functions@npm:^1.0.5":
-  version: 1.0.5
-  resolution: "@csstools/postcss-exponential-functions@npm:1.0.5"
+"@csstools/postcss-exponential-functions@npm:^1.0.7":
+  version: 1.0.7
+  resolution: "@csstools/postcss-exponential-functions@npm:1.0.7"
   dependencies:
-    "@csstools/css-calc": "npm:^1.2.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-calc": "npm:^1.2.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/45e18ca9025597da29cbef214cef39fcabef1e169bbb1f5c015de5f677e2927a1c3b8ae18558d815701e8d3e64db1043412a222af35036c92c25011a0e1e027d
+  checksum: 10c0/2079c81c3437686ef432d88502fa3a13bf8a27b7af105b4c6c2eb8e779f14adc8967a5a3ed03271ab919eeaf999fc4489fe4b37d32a8f61ab3212439517bddcc
   languageName: node
   linkType: hard
 
@@ -1684,46 +1684,46 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-gamut-mapping@npm:^1.0.7":
-  version: 1.0.7
-  resolution: "@csstools/postcss-gamut-mapping@npm:1.0.7"
+"@csstools/postcss-gamut-mapping@npm:^1.0.9":
+  version: 1.0.9
+  resolution: "@csstools/postcss-gamut-mapping@npm:1.0.9"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/7b349db44fcd697d57172ab63b7a02a56c0b49bce17e48cb72aa0fa246bd2be83fe693c507fd400a9ed83597a711d18ece9319ee3af8000c8fd3a2761e228a11
+  checksum: 10c0/412ae1410f3fce240401576441637c2c4e71d1a54153ac9b7a991b3de7519c253d03e10db78b09872eb10b0776d7f960b442779efabc11332b5be6672163c836
   languageName: node
   linkType: hard
 
-"@csstools/postcss-gradients-interpolation-method@npm:^4.0.15":
-  version: 4.0.15
-  resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.15"
+"@csstools/postcss-gradients-interpolation-method@npm:^4.0.17":
+  version: 4.0.17
+  resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.17"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/dc0bbf6a4787d5ad3f9fe268dfa9776ecdc25b6cc0a49486bf53238341a339647f1e475240ead3cec1f4af9a237f6518ace015103e90ce8afe4d44539a566e04
+  checksum: 10c0/465ac42856ca1a57aa2b9ea41ede31d9e2bcf2fe84345dbc182ae41f463069a0cfd41041b834b5133108c702cd85ecb8636b51b0b88fff8a221628639b59f386
   languageName: node
   linkType: hard
 
-"@csstools/postcss-hwb-function@npm:^3.0.13":
-  version: 3.0.13
-  resolution: "@csstools/postcss-hwb-function@npm:3.0.13"
+"@csstools/postcss-hwb-function@npm:^3.0.15":
+  version: 3.0.15
+  resolution: "@csstools/postcss-hwb-function@npm:3.0.15"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/684c3d408ceb027e7276c4f25c9a17ef9bd52f0948268cf58b5184097e9b71f5364a41b42bab44691938c6fadffcba0c8e66f809a339a8b282f4a432d32d00ef
+  checksum: 10c0/fdfaeefbab1008ab1e4a98a2b45cc3db002b2724c404fa0600954b411a68b1fa4028286250bf9898eed10fa80c44e4d6b4e55f1aca073c3dfce8198a0aaedf3f
   languageName: node
   linkType: hard
 
@@ -1761,17 +1761,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-light-dark-function@npm:^1.0.3":
-  version: 1.0.3
-  resolution: "@csstools/postcss-light-dark-function@npm:1.0.3"
+"@csstools/postcss-light-dark-function@npm:^1.0.5":
+  version: 1.0.5
+  resolution: "@csstools/postcss-light-dark-function@npm:1.0.5"
   dependencies:
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/99a1b72aba08a6fa5c7271d42f4459d86f001fe83f533c0ed3d21556f53ee227f65f94cda1feee1aa910890fc42482f15a4dfb3edbc7afdad828ce8897d0c52b
+  checksum: 10c0/4fbeda98372d0da25d3ed87da09903c9a0a5d0b8c13cc9de82a98acce4a8f8367e5ba33bfc25c2534d10f2b1db9d5b4278df4ebab755e27ef2b03a95e0ebe264
   languageName: node
   linkType: hard
 
@@ -1813,42 +1813,42 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-logical-viewport-units@npm:^2.0.7":
-  version: 2.0.7
-  resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.7"
+"@csstools/postcss-logical-viewport-units@npm:^2.0.9":
+  version: 2.0.9
+  resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.9"
   dependencies:
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/9493f5395ccfe88d0d0740e54f77f0c844afc79b164068fdd907aed75004b4252ba9423dea22194ad98114dd1a2e77c14e307604305d926425251d4ab3013949
+  checksum: 10c0/25b01e36b08c571806d09046be63582dbebf97a4612df59be405fa8a92e6eebcd4e768ad7fbe53b0b8739d6ab04d56957964fb04d6a3ea129fc5f72e6d0adf95
   languageName: node
   linkType: hard
 
-"@csstools/postcss-media-minmax@npm:^1.1.4":
-  version: 1.1.4
-  resolution: "@csstools/postcss-media-minmax@npm:1.1.4"
+"@csstools/postcss-media-minmax@npm:^1.1.6":
+  version: 1.1.6
+  resolution: "@csstools/postcss-media-minmax@npm:1.1.6"
   dependencies:
-    "@csstools/css-calc": "npm:^1.2.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
-    "@csstools/media-query-list-parser": "npm:^2.1.9"
+    "@csstools/css-calc": "npm:^1.2.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
+    "@csstools/media-query-list-parser": "npm:^2.1.11"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/620bb85065195c72cf9c0abe9af822f9feeaf919b53bfd47ec09f75b644cb544bd967b09278c48f829348808b34c552718c1aa3eb5342e2dec983e22eb63b0a0
+  checksum: 10c0/2cbfb3728a232c655d82f63d5ac7da36876d14e5fee5d62a0738efed40c58f20ef11f600395ade24d5063d750e8e093251dd93cc361f782b5a6c0e0f80288f51
   languageName: node
   linkType: hard
 
-"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^2.0.7":
-  version: 2.0.7
-  resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:2.0.7"
+"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^2.0.9":
+  version: 2.0.9
+  resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:2.0.9"
   dependencies:
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
-    "@csstools/media-query-list-parser": "npm:^2.1.9"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
+    "@csstools/media-query-list-parser": "npm:^2.1.11"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/d5d52a744f9a9466d86a506aab430811778dfa681d3f52f5486ee9b686390919eaae9ad356b84bc782d263227f35913ef68d9a6c3eefcfc38d8ffaccc9b94de0
+  checksum: 10c0/d431d2900a7177c938d9dc2d5bdf3c1930758adc214cc72f94b34e6bbd02fd917c200dc81482db515519c97d4f1e766ba3200f3ec9b55081887f2f8111f68e20
   languageName: node
   linkType: hard
 
@@ -1875,18 +1875,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-oklab-function@npm:^3.0.14":
-  version: 3.0.14
-  resolution: "@csstools/postcss-oklab-function@npm:3.0.14"
+"@csstools/postcss-oklab-function@npm:^3.0.16":
+  version: 3.0.16
+  resolution: "@csstools/postcss-oklab-function@npm:3.0.16"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/dfe0b12c2256dded995c64825fac9507be9c747d776cfa09eeefff6dee0efa5eed6a92a1ecba39069a751a7fc3cefa8891c34209a7a3c7ea33d356c95d01a02d
+  checksum: 10c0/9c67ee5f51116df16ab6baffa1b3c6c7aa93d53b836f421125ae8824075bd3cfaa1a93594466de0ac935c89c4fc8171e80974e1a15bafa23ea864e4cf1f1c1f2
   languageName: node
   linkType: hard
 
@@ -1901,18 +1901,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-relative-color-syntax@npm:^2.0.14":
-  version: 2.0.14
-  resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.14"
+"@csstools/postcss-relative-color-syntax@npm:^2.0.16":
+  version: 2.0.16
+  resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.16"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/64cd5f8054e4403f4e25ed11a5b9d157098af639dbc30ac25b94660b3af489c0bacc49fc439cba1ccceefa4caa5831a913e3d1d889a9796cc6fbf3902c7c31c1
+  checksum: 10c0/cdc965706212dcbc03394f55c79a0ad043d1e0174059c4d0d90e4267fe8e6fd9eef7cfed4f5bbc1f8e89c225c1c042ae792e115bba198eb2daae763d65f44679
   languageName: node
   linkType: hard
 
@@ -1927,16 +1927,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-stepped-value-functions@npm:^3.0.6":
-  version: 3.0.6
-  resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.6"
+"@csstools/postcss-stepped-value-functions@npm:^3.0.8":
+  version: 3.0.8
+  resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.8"
   dependencies:
-    "@csstools/css-calc": "npm:^1.2.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-calc": "npm:^1.2.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/a198aedc4fffe88909c92bfaa36031e6803e739a2578ba4a81c01b9f1525e6a6876d6ffacbbe21701298598dcade8b2ac8423d8ab0fc5d9f4ba86ed60f53cbca
+  checksum: 10c0/2be66aa769808245137be8ff14308aa17c3a0d75433f6fd6789114966a78c365dbf173d087e7ff5bc80118c75be2ff740baab83ed39fc0671980f6217779956b
   languageName: node
   linkType: hard
 
@@ -1952,16 +1952,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-trigonometric-functions@npm:^3.0.6":
-  version: 3.0.6
-  resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.6"
+"@csstools/postcss-trigonometric-functions@npm:^3.0.8":
+  version: 3.0.8
+  resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.8"
   dependencies:
-    "@csstools/css-calc": "npm:^1.2.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-calc": "npm:^1.2.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/4b484af853d9eb59a4a4b1c063fcf48e2658bb2d6930dfab1d79e676986534687e6440b8cdcd2731ddcb7726537f4ed484208a2b80ef2c9359053762ba35e5e7
+  checksum: 10c0/aeed8d1026f4a5cb7afafbadd739af84291d5bfcbcdef2f79b77174f003d0cd0c7f9deb3fe0b9377efab37ce9bb17a2499efd4af8211f5ff9eb01b878b0b62b3
   languageName: node
   linkType: hard
 
@@ -13147,18 +13147,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss-color-functional-notation@npm:^6.0.9":
-  version: 6.0.9
-  resolution: "postcss-color-functional-notation@npm:6.0.9"
+"postcss-color-functional-notation@npm:^6.0.11":
+  version: 6.0.11
+  resolution: "postcss-color-functional-notation@npm:6.0.11"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/120f7bc23bf46dd1c008b3aa806fb02dd988ae180f9c0c10dca9f5ea3473bf20d7743aafae1441df5b4a3945a63ebb0dae1d4d55f7c8bcd34540529b627c4e3e
+  checksum: 10c0/7fd75e6881cf62f536f79dfc0ae1b709ea0b8b84833cce1671372711f6019ab4360c6a17089b654b2d376b87e7f9455b94f0d13b45ab0ab767e547b604709b3d
   languageName: node
   linkType: hard
 
@@ -13212,46 +13212,46 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss-custom-media@npm:^10.0.4":
-  version: 10.0.4
-  resolution: "postcss-custom-media@npm:10.0.4"
+"postcss-custom-media@npm:^10.0.6":
+  version: 10.0.6
+  resolution: "postcss-custom-media@npm:10.0.6"
   dependencies:
-    "@csstools/cascade-layer-name-parser": "npm:^1.0.9"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
-    "@csstools/media-query-list-parser": "npm:^2.1.9"
+    "@csstools/cascade-layer-name-parser": "npm:^1.0.11"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
+    "@csstools/media-query-list-parser": "npm:^2.1.11"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/2384a40f0e38abe92fbfc707000b264e4bdfe65bd0086ab18c6aab71049198f9dd1431bc4f9bbf68f7cca86b4ff0da352bac4a6ecd04e3671b7ddf6ed6ec3d04
+  checksum: 10c0/98a524bc46b780a86094bbe8007f1e577137da5490823631a683d4b3df4a13e40c5e1ab52380275a54f7011abfd98bb597c6293d964c14f9f22ec6cf9d75c550
   languageName: node
   linkType: hard
 
-"postcss-custom-properties@npm:^13.3.8":
-  version: 13.3.8
-  resolution: "postcss-custom-properties@npm:13.3.8"
+"postcss-custom-properties@npm:^13.3.10":
+  version: 13.3.10
+  resolution: "postcss-custom-properties@npm:13.3.10"
   dependencies:
-    "@csstools/cascade-layer-name-parser": "npm:^1.0.9"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/cascade-layer-name-parser": "npm:^1.0.11"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/utilities": "npm:^1.0.0"
     postcss-value-parser: "npm:^4.2.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/03dd1918f897005b23d09615ebb2c3faf4a01cac67462069c9cfa87c024b2a878f64948b0cf668971bc0ca00cfc349080879b3864deb3808a32d52ff2b473319
+  checksum: 10c0/52688fd0aaadccfdf4a3d86d3a2ab988163e8108088c5e33fc9145d261f75b92b8321c044a8161345abda10df5715d674330309dcc0c17f2980db5515f6a76d6
   languageName: node
   linkType: hard
 
-"postcss-custom-selectors@npm:^7.1.8":
-  version: 7.1.8
-  resolution: "postcss-custom-selectors@npm:7.1.8"
+"postcss-custom-selectors@npm:^7.1.10":
+  version: 7.1.10
+  resolution: "postcss-custom-selectors@npm:7.1.10"
   dependencies:
-    "@csstools/cascade-layer-name-parser": "npm:^1.0.9"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/cascade-layer-name-parser": "npm:^1.0.11"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     postcss-selector-parser: "npm:^6.0.13"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/6a7d8248342177a222821531ea3b4008764362e4f7e8f7f2d5767e5880c37ffa39ac5adced2c686baeb9c1f4ed4c283fcc8a8d30ef3b4fc5f63d4ef9a691285e
+  checksum: 10c0/11311ae6f306420223c6bf926fb1798738f3aa525a267de204de8e8ee9de467bf63b580d9ad5dbb0fff4bd9266770a3fa7e27a24af08a2e0a4115d0727d1d043
   languageName: node
   linkType: hard
 
@@ -13367,18 +13367,18 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss-lab-function@npm:^6.0.14":
-  version: 6.0.14
-  resolution: "postcss-lab-function@npm:6.0.14"
+"postcss-lab-function@npm:^6.0.16":
+  version: 6.0.16
+  resolution: "postcss-lab-function@npm:6.0.16"
   dependencies:
-    "@csstools/css-color-parser": "npm:^2.0.0"
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
+    "@csstools/css-color-parser": "npm:^2.0.2"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
     "@csstools/utilities": "npm:^1.0.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/0b5d998ddb98ec6243448f1eca216f6e23872431885b152843feef1e844fc5b6b3ebe16ea8940f3d6abea732aa0c51b2ec0e57437e4326e5b2cb2bcb949e6d9f
+  checksum: 10c0/ba8717cd8a197ec17acaac1b61631cd4403f07bd406b0c92f2e430a55e3f786cd6c338b626c3326e9178a0f3e58ff838ebaded19f480f39197a9cb17349ecdcd
   languageName: node
   linkType: hard
 
@@ -13698,37 +13698,37 @@ __metadata:
   linkType: hard
 
 "postcss-preset-env@npm:^9.5.2":
-  version: 9.5.9
-  resolution: "postcss-preset-env@npm:9.5.9"
+  version: 9.5.11
+  resolution: "postcss-preset-env@npm:9.5.11"
   dependencies:
     "@csstools/postcss-cascade-layers": "npm:^4.0.4"
-    "@csstools/postcss-color-function": "npm:^3.0.14"
-    "@csstools/postcss-color-mix-function": "npm:^2.0.14"
-    "@csstools/postcss-exponential-functions": "npm:^1.0.5"
+    "@csstools/postcss-color-function": "npm:^3.0.16"
+    "@csstools/postcss-color-mix-function": "npm:^2.0.16"
+    "@csstools/postcss-exponential-functions": "npm:^1.0.7"
     "@csstools/postcss-font-format-keywords": "npm:^3.0.2"
-    "@csstools/postcss-gamut-mapping": "npm:^1.0.7"
-    "@csstools/postcss-gradients-interpolation-method": "npm:^4.0.15"
-    "@csstools/postcss-hwb-function": "npm:^3.0.13"
+    "@csstools/postcss-gamut-mapping": "npm:^1.0.9"
+    "@csstools/postcss-gradients-interpolation-method": "npm:^4.0.17"
+    "@csstools/postcss-hwb-function": "npm:^3.0.15"
     "@csstools/postcss-ic-unit": "npm:^3.0.6"
     "@csstools/postcss-initial": "npm:^1.0.1"
     "@csstools/postcss-is-pseudo-class": "npm:^4.0.6"
-    "@csstools/postcss-light-dark-function": "npm:^1.0.3"
+    "@csstools/postcss-light-dark-function": "npm:^1.0.5"
     "@csstools/postcss-logical-float-and-clear": "npm:^2.0.1"
     "@csstools/postcss-logical-overflow": "npm:^1.0.1"
     "@csstools/postcss-logical-overscroll-behavior": "npm:^1.0.1"
     "@csstools/postcss-logical-resize": "npm:^2.0.1"
-    "@csstools/postcss-logical-viewport-units": "npm:^2.0.7"
-    "@csstools/postcss-media-minmax": "npm:^1.1.4"
-    "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^2.0.7"
+    "@csstools/postcss-logical-viewport-units": "npm:^2.0.9"
+    "@csstools/postcss-media-minmax": "npm:^1.1.6"
+    "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^2.0.9"
     "@csstools/postcss-nested-calc": "npm:^3.0.2"
     "@csstools/postcss-normalize-display-values": "npm:^3.0.2"
-    "@csstools/postcss-oklab-function": "npm:^3.0.14"
+    "@csstools/postcss-oklab-function": "npm:^3.0.16"
     "@csstools/postcss-progressive-custom-properties": "npm:^3.2.0"
-    "@csstools/postcss-relative-color-syntax": "npm:^2.0.14"
+    "@csstools/postcss-relative-color-syntax": "npm:^2.0.16"
     "@csstools/postcss-scope-pseudo-class": "npm:^3.0.1"
-    "@csstools/postcss-stepped-value-functions": "npm:^3.0.6"
+    "@csstools/postcss-stepped-value-functions": "npm:^3.0.8"
     "@csstools/postcss-text-decoration-shorthand": "npm:^3.0.6"
-    "@csstools/postcss-trigonometric-functions": "npm:^3.0.6"
+    "@csstools/postcss-trigonometric-functions": "npm:^3.0.8"
     "@csstools/postcss-unset-value": "npm:^3.0.1"
     autoprefixer: "npm:^10.4.19"
     browserslist: "npm:^4.22.3"
@@ -13738,12 +13738,12 @@ __metadata:
     cssdb: "npm:^8.0.0"
     postcss-attribute-case-insensitive: "npm:^6.0.3"
     postcss-clamp: "npm:^4.1.0"
-    postcss-color-functional-notation: "npm:^6.0.9"
+    postcss-color-functional-notation: "npm:^6.0.11"
     postcss-color-hex-alpha: "npm:^9.0.4"
     postcss-color-rebeccapurple: "npm:^9.0.3"
-    postcss-custom-media: "npm:^10.0.4"
-    postcss-custom-properties: "npm:^13.3.8"
-    postcss-custom-selectors: "npm:^7.1.8"
+    postcss-custom-media: "npm:^10.0.6"
+    postcss-custom-properties: "npm:^13.3.10"
+    postcss-custom-selectors: "npm:^7.1.10"
     postcss-dir-pseudo-class: "npm:^8.0.1"
     postcss-double-position-gradients: "npm:^5.0.6"
     postcss-focus-visible: "npm:^9.0.1"
@@ -13751,7 +13751,7 @@ __metadata:
     postcss-font-variant: "npm:^5.0.0"
     postcss-gap-properties: "npm:^5.0.1"
     postcss-image-set-function: "npm:^6.0.3"
-    postcss-lab-function: "npm:^6.0.14"
+    postcss-lab-function: "npm:^6.0.16"
     postcss-logical: "npm:^7.0.1"
     postcss-nesting: "npm:^12.1.2"
     postcss-opacity-percentage: "npm:^2.0.0"
@@ -13763,7 +13763,7 @@ __metadata:
     postcss-selector-not: "npm:^7.0.2"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/dbe020e3fc08f0b71a3ee9d3c8a66a93bb6ba62281ac89fa59c82b8632ca58d6a911ddd9c65f15355c36aad63477633fc101cc0f3ce494dbc757193ba42eb61c
+  checksum: 10c0/9460f4ce18cf1af7582d0a1f366151f59b6e9b0c7cbb62e59081dc91da14760a749f59fa52bc190e5e2c8fd531952c647719d19c4740aa1a0ebcb93f075ad931
   languageName: node
   linkType: hard
 

From 9be2c02e52b9c3534fa1bd16ade00a135034d2cb Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 10:36:29 +0200
Subject: [PATCH 056/215] New Crowdin Translations (automated) (#30169)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/ar.json |  39 +-
 app/javascript/mastodon/locales/de.json |   4 +-
 app/javascript/mastodon/locales/ja.json |   9 +
 app/javascript/mastodon/locales/sl.json |  13 +
 app/javascript/mastodon/locales/sq.json |  14 +
 config/locales/ar.yml                   |   1 +
 config/locales/devise.ia.yml            |   3 +
 config/locales/doorkeeper.ia.yml        |   1 +
 config/locales/doorkeeper.sq.yml        |   1 +
 config/locales/ia.yml                   | 584 +++++++++++++++++++++++-
 config/locales/ja.yml                   |   1 +
 config/locales/lt.yml                   |  20 +-
 config/locales/pt-PT.yml                |   1 +
 config/locales/simple_form.ar.yml       |   1 +
 config/locales/simple_form.he.yml       |   3 +
 config/locales/simple_form.ia.yml       | 113 +++++
 config/locales/simple_form.ja.yml       |   4 +
 config/locales/simple_form.pt-PT.yml    |   4 +
 config/locales/simple_form.sq.yml       |   4 +
 config/locales/simple_form.th.yml       |   2 +
 config/locales/sk.yml                   |   1 +
 config/locales/sl.yml                   |   1 +
 config/locales/sq.yml                   |   1 +
 config/locales/th.yml                   |   1 +
 24 files changed, 807 insertions(+), 19 deletions(-)

diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index dd13f10aa..68e32dd2a 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -5,7 +5,7 @@
   "about.domain_blocks.no_reason_available": "السبب غير متوفر",
   "about.domain_blocks.preamble": "يسمح لك ماستدون عموماً بعرض المحتوى من المستخدمين من أي خادم آخر في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادم بالذات.",
   "about.domain_blocks.silenced.explanation": "عموماً، لن ترى ملفات التعريف والمحتوى من هذا الخادم، إلا إذا كنت تبحث عنه بشكل صريح أو تختار أن تتابعه.",
-  "about.domain_blocks.silenced.title": "تم كتمه",
+  "about.domain_blocks.silenced.title": "محدود",
   "about.domain_blocks.suspended.explanation": "لن يتم معالجة أي بيانات من هذا الخادم أو تخزينها أو تبادلها، مما يجعل أي تفاعل أو اتصال مع المستخدمين من هذا الخادم مستحيلا.",
   "about.domain_blocks.suspended.title": "مُعلّق",
   "about.not_available": "لم يتم توفير هذه المعلومات على هذا الخادم.",
@@ -21,7 +21,7 @@
   "account.blocked": "محظور",
   "account.browse_more_on_origin_server": "تصفح المزيد في الملف الشخصي الأصلي",
   "account.cancel_follow_request": "إلغاء طلب المتابعة",
-  "account.copy": "نسخ الرابط إلى الملف الشخصي",
+  "account.copy": "نسخ الرابط إلى الحساب",
   "account.direct": "إشارة خاصة لـ @{name}",
   "account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}",
   "account.domain_blocked": "اسم النِّطاق محظور",
@@ -32,7 +32,7 @@
   "account.featured_tags.last_status_never": "لا توجد رسائل",
   "account.featured_tags.title": "وسوم {name} المميَّزة",
   "account.follow": "متابعة",
-  "account.follow_back": "تابعه بدورك",
+  "account.follow_back": "رد المتابعة",
   "account.followers": "مُتابِعون",
   "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
   "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}",
@@ -89,12 +89,12 @@
   "announcement.announcement": "إعلان",
   "attachments_list.unprocessed": "(غير معالَج)",
   "audio.hide": "إخفاء المقطع الصوتي",
-  "block_modal.remote_users_caveat": "Do t’i kërkojmë shërbyesit {domain} të respektojë vendimin tuaj. Por, pajtimi s’është i garantuar, ngaqë disa shërbyes mund t’i trajtojnë ndryshe bllokimet. Psotimet publike mundet të jenë ende të dukshme për përdorues pa bërë hyrje në llogari.",
-  "block_modal.show_less": "اعرض أقلّ",
+  "block_modal.remote_users_caveat": "سوف نطلب من الخادم {domain} أن يحترم قرارك، لكن الالتزام غير مضمون لأن بعض الخواديم قد تتعامل مع نصوص الكتل بشكل مختلف. قد تظل المنشورات العامة مرئية للمستخدمين غير المسجلين الدخول.",
+  "block_modal.show_less": "أظهر الأقل",
   "block_modal.show_more": "أظهر المزيد",
   "block_modal.they_cant_mention": "لن يستطيع ذِكرك أو متابعتك.",
   "block_modal.they_cant_see_posts": "لن يستطيع رؤية منشوراتك ولن ترى منشوراته.",
-  "block_modal.they_will_know": "يمكنه أن يرى أنه قد تم حجبه.",
+  "block_modal.they_will_know": "يمكنه أن يرى أنه قد تم حظره.",
   "block_modal.title": "أتريد حظر المستخدم؟",
   "block_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيهم إليه.",
   "boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة",
@@ -220,7 +220,7 @@
   "domain_pill.activitypub_lets_connect": "يتيح لك التواصل والتفاعل مع الناس ليس فقط على ماستدون، ولكن عبر تطبيقات اجتماعية مختلفة أيضا.",
   "domain_pill.activitypub_like_language": "إنّ ActivityPub مثل لغة ماستدون التي يتحدث بها مع شبكات اجتماعية أخرى.",
   "domain_pill.server": "الخادِم",
-  "domain_pill.their_handle": "مُعرِّفُه:",
+  "domain_pill.their_handle": "مُعرفه:",
   "domain_pill.their_server": "بيتهم الرقمي، حيث تُستضاف كافة منشوراتهم.",
   "domain_pill.their_username": "مُعرّفُهم الفريد على الخادم. من الممكن العثور على مستخدمين بنفس اسم المستخدم على خوادم مختلفة.",
   "domain_pill.username": "اسم المستخدم",
@@ -308,6 +308,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "هذا الملف الشخصي مشابه للملفات الشخصية التي تابعتها مؤخرا.",
   "follow_suggestions.personalized_suggestion": "توصية مخصصة",
   "follow_suggestions.popular_suggestion": "توصية رائجة",
+  "follow_suggestions.popular_suggestion_longer": "رائج على {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "مشابهة لمواصفات الملفات الشخصية التي تابعتَها حديثًا",
   "follow_suggestions.view_all": "عرض الكل",
   "follow_suggestions.who_to_follow": "حسابات للمُتابَعة",
   "followed_tags": "الوسوم المتابَعة",
@@ -360,8 +362,8 @@
   "interaction_modal.title.reply": "الرد على منشور {name}",
   "intervals.full.days": "{number, plural, one {# يوم} other {# أيام}}",
   "intervals.full.hours": "{number, plural, one {# ساعة} other {# ساعات}}",
-  "intervals.full.minutes": "{number, plural, one {# دقيقة} other {# دقائق}}",
-  "keyboard_shortcuts.back": "للعودة",
+  "intervals.full.minutes": "{number, plural, one {دقيقة واحدة}two {دقيقتان} other {# دقائق}}",
+  "keyboard_shortcuts.back": "للرجوع",
   "keyboard_shortcuts.blocked": "لفتح قائمة المستخدمين المحظورين",
   "keyboard_shortcuts.boost": "لإعادة النشر",
   "keyboard_shortcuts.column": "للتركيز على منشور على أحد الأعمدة",
@@ -421,7 +423,9 @@
   "loading_indicator.label": "جاري التحميل…",
   "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}",
   "moved_to_account_banner.text": "حسابك {disabledAccount} معطل حاليًا لأنك انتقلت إلى {movedToAccount}.",
+  "mute_modal.hide_from_notifications": "إخفاء من قائمة الإشعارات",
   "mute_modal.hide_options": "إخفاء الخيارات",
+  "mute_modal.indefinite": "إلى أن أفسخ كتمها",
   "mute_modal.show_options": "إظهار الخيارات",
   "mute_modal.they_can_mention_and_follow": "سيكون بإمكانه الإشارة إليك ومتابعتك، لكنك لن تره.",
   "mute_modal.they_wont_know": "لن يَعرف أنه قد تم كتمه.",
@@ -460,10 +464,20 @@
   "notification.follow": "يتابعك {name}",
   "notification.follow_request": "لقد طلب {name} متابعتك",
   "notification.mention": "{name} ذكرك",
+  "notification.moderation-warning.learn_more": "اعرف المزيد",
+  "notification.moderation_warning.action_disable": "تم تعطيل حسابك.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "بعض من منشوراتك تم تصنيفها على أنها حساسة.",
+  "notification.moderation_warning.action_none": "لقد تلقى حسابك تحذيرا بالإشراف.",
+  "notification.moderation_warning.action_sensitive": "سيتم وضع علامة على منشوراتك على أنها حساسة من الآن فصاعدا.",
+  "notification.moderation_warning.action_suspend": "لقد تم تعليق حسابك.",
   "notification.own_poll": "انتهى استطلاعك للرأي",
   "notification.poll": "لقد انتهى استطلاع رأي شاركتَ فيه",
   "notification.reblog": "قام {name} بمشاركة منشورك",
+  "notification.relationships_severance_event": "فقدت الاتصالات مع {name}",
+  "notification.relationships_severance_event.account_suspension": "قام مشرف من {from} بتعليق {target}، مما يعني أنك لم يعد بإمكانك تلقي التحديثات منهم أو التفاعل معهم.",
+  "notification.relationships_severance_event.domain_block": "قام مشرف من {from} بحظر {target}، بما في ذلك {followersCount} من متابعينك و {followingCount, plural, one {# حساب} other {# حسابات}} تتابعها.",
   "notification.relationships_severance_event.learn_more": "اعرف المزيد",
+  "notification.relationships_severance_event.user_domain_block": "لقد قمت بحظر {target}، مما أدى إلى إزالة {followersCount} من متابعينك و {followingCount, plural, one {# حساب} other {# حسابات}} تتابعها.",
   "notification.status": "{name} نشر للتو",
   "notification.update": "عدّلَ {name} منشورًا",
   "notification_requests.accept": "موافقة",
@@ -503,10 +517,15 @@
   "notifications.permission_denied": "تنبيهات سطح المكتب غير متوفرة بسبب رفض أذونات المتصفح مسبقاً",
   "notifications.permission_denied_alert": "لا يمكن تفعيل إشعارات سطح المكتب، لأن إذن المتصفح قد تم رفضه سابقاً",
   "notifications.permission_required": "إشعارات سطح المكتب غير متوفرة لأنه لم يتم منح الإذن المطلوب.",
+  "notifications.policy.filter_new_accounts.hint": "تم إنشاؤها منذ {days, plural, zero {}one {يوم واحد} two {يومان} few {# أيام} many {# أيام} other {# أيام}}",
   "notifications.policy.filter_new_accounts_title": "حسابات جديدة",
+  "notifications.policy.filter_not_followers_hint": "بما في ذلك الأشخاص الذين يتابعونك أقل من {days, plural, zero {}one {يوم واحد} two {يومان} few {# أيام} many {# أيام} other {# أيام}}",
   "notifications.policy.filter_not_followers_title": "أشخاص لا يتابعونك",
   "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.title": "تصفية الإشعارات من…",
   "notifications_permission_banner.enable": "تفعيل إشعارات سطح المكتب",
   "notifications_permission_banner.how_to_control": "لتلقي الإشعارات عندما لا يكون ماستدون مفتوح، قم بتفعيل إشعارات سطح المكتب، يمكنك التحكم بدقة في أنواع التفاعلات التي تولد إشعارات سطح المكتب من خلال زر الـ{icon} أعلاه بمجرد تفعيلها.",
   "notifications_permission_banner.title": "لا تفوت شيئاً أبداً",
@@ -687,6 +706,7 @@
   "status.edited_x_times": "عُدّل {count, plural, zero {} one {مرةً واحدة} two {مرّتان} few {{count} مرات} many {{count} مرة} other {{count} مرة}}",
   "status.embed": "إدماج",
   "status.favourite": "فضّل",
+  "status.favourites": "{count, plural, zero {}one {مفضلة واحدة} two {مفضلتان} few {# مفضلات} many {# مفضلات} other {# مفضلات}}",
   "status.filter": "تصفية هذه الرسالة",
   "status.filtered": "مُصفّى",
   "status.hide": "إخفاء المنشور",
@@ -707,6 +727,7 @@
   "status.reblog": "إعادة النشر",
   "status.reblog_private": "إعادة النشر إلى الجمهور الأصلي",
   "status.reblogged_by": "شارَكَه {name}",
+  "status.reblogs": "{count, plural, one {تعزيز واحد} two {تعزيزتان} few {# تعزيزات} many {# تعزيزات} other {# تعزيزات}}",
   "status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
   "status.redraft": "إزالة وإعادة الصياغة",
   "status.remove_bookmark": "احذفه مِن الفواصل المرجعية",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 59d3d0965..577664107 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -331,7 +331,7 @@
   "footer.source_code": "Quellcode anzeigen",
   "footer.status": "Status",
   "generic.saved": "Gespeichert",
-  "getting_started.heading": "Auf geht’s!",
+  "getting_started.heading": "Auf gehts!",
   "hashtag.column_header.tag_mode.all": "und {additional}",
   "hashtag.column_header.tag_mode.any": "oder {additional}",
   "hashtag.column_header.tag_mode.none": "ohne {additional}",
@@ -400,7 +400,7 @@
   "keyboard_shortcuts.requests": "Liste der Follower-Anfragen aufrufen",
   "keyboard_shortcuts.search": "Suchleiste fokussieren",
   "keyboard_shortcuts.spoilers": "Feld für Inhaltswarnung anzeigen/ausblenden",
-  "keyboard_shortcuts.start": "„Auf geht’s!“ öffnen",
+  "keyboard_shortcuts.start": "„Auf gehts!“ öffnen",
   "keyboard_shortcuts.toggle_hidden": "Beitragstext hinter der Inhaltswarnung anzeigen/ausblenden",
   "keyboard_shortcuts.toggle_sensitivity": "Medien anzeigen/ausblenden",
   "keyboard_shortcuts.toot": "Neuen Beitrag erstellen",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index c11e4a2af..6e590678f 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -473,6 +473,15 @@
   "notification.follow": "{name}さんにフォローされました",
   "notification.follow_request": "{name}さんがあなたにフォローリクエストしました",
   "notification.mention": "{name}さんがあなたに返信しました",
+  "notification.moderation-warning.learn_more": "さらに詳しく",
+  "notification.moderation_warning": "あなたは管理者からの警告を受けています。",
+  "notification.moderation_warning.action_delete_statuses": "あなたによるいくつかの投稿が削除されました。",
+  "notification.moderation_warning.action_disable": "あなたのアカウントは無効になりました。",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "あなたの投稿のいくつかは閲覧注意として判定されています。",
+  "notification.moderation_warning.action_none": "あなたのアカウントは管理者からの警告を受けています。",
+  "notification.moderation_warning.action_sensitive": "あなたの投稿はこれから閲覧注意としてマークされます。",
+  "notification.moderation_warning.action_silence": "あなたのアカウントは制限されています。",
+  "notification.moderation_warning.action_suspend": "あなたのアカウントは停止されました。",
   "notification.own_poll": "アンケートが終了しました",
   "notification.poll": "アンケートが終了しました",
   "notification.reblog": "{name}さんがあなたの投稿をブーストしました",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index ed4fa8dfa..7806abc6b 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Čeprav vaš račun ni zaklenjen, zaposleni pri {domain} menijo, da bi morda želeli pregledati zahteve za sledenje teh računov ročno.",
   "follow_suggestions.curated_suggestion": "Izbor osebja",
   "follow_suggestions.dismiss": "Ne pokaži več",
+  "follow_suggestions.featured_longer": "Osebno izbrala ekipa {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Priljubljeno med osebami, ki jim sledite",
   "follow_suggestions.hints.featured": "Ta profil so izbrali skrbniki strežnika {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Ta profil je priljubljen med osebami, ki jim sledite.",
   "follow_suggestions.hints.most_followed": "Ta profil na strežniku {domain} je en izmed najbolj sledenih.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Ta profil je podoben profilom, ki ste jim nedavno začeli slediti.",
   "follow_suggestions.personalized_suggestion": "Osebno prilagojen predlog",
   "follow_suggestions.popular_suggestion": "Priljubljen predlog",
+  "follow_suggestions.popular_suggestion_longer": "Priljubljeno na {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Podobno profilom, ki ste jim pred kratkim sledili",
   "follow_suggestions.view_all": "Pokaži vse",
   "follow_suggestions.who_to_follow": "Komu slediti",
   "followed_tags": "Sledeni ključniki",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} vam sledi",
   "notification.follow_request": "{name} vam želi slediti",
   "notification.mention": "{name} vas je omenil/a",
+  "notification.moderation-warning.learn_more": "Več o tem",
+  "notification.moderation_warning": "Prejeli ste opozorilo moderatorjev",
+  "notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.",
+  "notification.moderation_warning.action_disable": "Vaš račun je bil onemogočen.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nekatere vaše objave so bile označene kot občutljive.",
+  "notification.moderation_warning.action_none": "Vaš račun je prejel opozorilo moderatorjev.",
+  "notification.moderation_warning.action_sensitive": "Vaše objave bodo odslej označene kot občutljive.",
+  "notification.moderation_warning.action_silence": "Vaš račun je bil omejen.",
+  "notification.moderation_warning.action_suspend": "Vaš račun je bil suspendiran.",
   "notification.own_poll": "Vaša anketa je zaključena",
   "notification.poll": "Anketa, v kateri ste sodelovali, je zaključena",
   "notification.reblog": "{name} je izpostavila/a vašo objavo",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index da35b3d43..a25eab9cb 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -297,6 +297,7 @@
   "filter_modal.select_filter.subtitle": "Përdorni një kategori ekzistuese, ose krijoni një të re",
   "filter_modal.select_filter.title": "Filtroje këtë postim",
   "filter_modal.title.status": "Filtroni një postim",
+  "filtered_notifications_banner.mentions": "{count, plural, one {përmendje} other {përmendje}}",
   "filtered_notifications_banner.pending_requests": "Njoftime prej {count, plural, =0 {askujt} one {një personi} other {# vetësh}} që mund të njihni",
   "filtered_notifications_banner.title": "Njoftime të filtruar",
   "firehose.all": "Krejt",
@@ -307,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Edhe pse llogaria juaj s’është e kyçur, ekipi i {domain} mendoi se mund të donit të shqyrtonit dorazi kërkesa ndjekjeje prej këtyre llogarive.",
   "follow_suggestions.curated_suggestion": "Zgjedhur nga ekipi",
   "follow_suggestions.dismiss": "Mos shfaq më",
+  "follow_suggestions.featured_longer": "Zgjedhur enkas nga ekipi {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Popullore mes personash që ndiqni",
   "follow_suggestions.hints.featured": "Ky profil është zgjedhur nga ekipi {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Ky profil është popullor mes personave që ndiqni.",
   "follow_suggestions.hints.most_followed": "Ky profil është një nga më të ndjekur në {domain}.",
@@ -314,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Ky profil është i ngjashëm me profile që keni ndjekur tani afër.",
   "follow_suggestions.personalized_suggestion": "Sugjerim i personalizuar",
   "follow_suggestions.popular_suggestion": "Sugjerim popullor",
+  "follow_suggestions.popular_suggestion_longer": "Popullore në {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "I ngjashëm me profile që keni zënë të ndiqni së fundi",
   "follow_suggestions.view_all": "Shihni krejt",
   "follow_suggestions.who_to_follow": "Cilët të ndiqen",
   "followed_tags": "Hashtag-ë të ndjekur",
@@ -468,6 +473,15 @@
   "notification.follow": "{name} zuri t’ju ndjekë",
   "notification.follow_request": "{name} ka kërkuar t’ju ndjekë",
   "notification.mention": "{name} ju ka përmendur",
+  "notification.moderation-warning.learn_more": "Mësoni më tepër",
+  "notification.moderation_warning": "Keni marrë një sinjalizim moderimi",
+  "notification.moderation_warning.action_delete_statuses": "Disa nga postimet tuaja janë hequr.",
+  "notification.moderation_warning.action_disable": "Llogaria juaj është çaktivizuar.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Disa prej postimeve tuaja u është vënë shenjë si me spec.",
+  "notification.moderation_warning.action_none": "Llogaria juaj ka marrë një sinjalizim moderimi.",
+  "notification.moderation_warning.action_sensitive": "Postimeve tuaja do t’u vihet shenjë si me spec, nga tani e tutje.",
+  "notification.moderation_warning.action_silence": "Llogaria juaj është kufizuar.",
+  "notification.moderation_warning.action_suspend": "Llogaria juaj është pezulluar.",
   "notification.own_poll": "Pyetësori juaj ka përfunduar",
   "notification.poll": "Ka përfunduar një pyetësor ku keni votuar",
   "notification.reblog": "{name} përforcoi mesazhin tuaj",
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 93a0720b8..02ba56d0b 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -804,6 +804,7 @@ ar:
         desc_html: ويعتمد هذا على نصوص برمجية خارجية من hCaptcha، والتي قد تكون مصدر قلق يتعلق بالأمان والخصوصية. بالإضافة إلى ذلك، <strong>قد يؤدي ذلك إلى جعل عملية التسجيل أقل سهولة بالنسبة لبعض الأشخاص (وخاصة المعاقين)</strong>. لهذه الأسباب، يرجى النظر في تدابير بديلة مثل التسجيل على أساس الموافقة أو على أساس الدعوة.
         title: مطالبة المستخدمين الجدد بحل اختبار CAPTCHA لتأكيد حساباتهم
       content_retention:
+        danger_zone: منطقة خطرة
         preamble: التحكم في كيفية تخزين المحتوى الذي ينشئه المستخدم في ماستدون.
         title: الاحتفاظ بالمحتوى
       default_noindex:
diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml
index 6c89f4c6d..568750781 100644
--- a/config/locales/devise.ia.yml
+++ b/config/locales/devise.ia.yml
@@ -23,8 +23,11 @@ ia:
         action_with_app: Confirmar e retornar a %{app}
         title: Verificar adresse de e-mail
       email_changed:
+        explanation: 'Le adresse de e-mail pro tu conto essera cambiate a:'
+        subject: 'Mastodon: E-mail cambiate'
         title: Nove adresse de e-mail
       password_change:
+        explanation: Le contrasigno de tu conto ha essite cambiate.
         subject: 'Mastodon: Contrasigno cambiate'
         title: Contrasigno cambiate
       reconfirmation_instructions:
diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml
index fd7d7a083..86bd1ad98 100644
--- a/config/locales/doorkeeper.ia.yml
+++ b/config/locales/doorkeeper.ia.yml
@@ -17,6 +17,7 @@ ia:
         authorize: Autorisar
         cancel: Cancellar
         edit: Modificar
+        submit: Submitter
       confirmations:
         destroy: Es tu secur?
       edit:
diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml
index 308a5429a..793819c59 100644
--- a/config/locales/doorkeeper.sq.yml
+++ b/config/locales/doorkeeper.sq.yml
@@ -174,6 +174,7 @@ sq:
       read:filters: të shohë filtrat tuaj
       read:follows: të shohë ndjekësit tuaj
       read:lists: të shohë listat tuaja
+      read:me: të shohë vetëm hollësi elementare të llogarisë tuaj
       read:mutes: të shohë ç’keni heshtuar
       read:notifications: të shohë njoftimet tuaja
       read:reports: të shohë raportimet tuaja
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 59dd2dbc0..85d7c0ed8 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -106,6 +106,9 @@ ia:
       pending: Attende revision
       perform_full_suspension: Suspender
       previous_strikes: Previe admonitiones
+      previous_strikes_description_html:
+        one: Iste conto ha <strong>un</strong> admonition.
+        other: Iste conto ha <strong>%{count}</strong> admonitiones.
       promote: Promover
       protocol: Protocollo
       public: Public
@@ -159,10 +162,10 @@ ia:
       undo_suspension: Disfacer le suspension
       unsilenced_msg: Le limite del conto de %{username} ha essite cancellate
       unsubscribe: Desubscriber
-      unsuspended_msg: Annullate suspension del conto %{username} con successo
+      unsuspended_msg: Le suspension del conto %{username} ha essite annullate
       username: Nomine de usator
       view_domain: Vider summario de dominio
-      warn: Avisar
+      warn: Advertir
       web: Web
       whitelisted: Permittite pro federation
     action_logs:
@@ -244,37 +247,102 @@ ia:
         create_user_role_html: "%{name} creava rolo de %{target}"
         demote_user_html: "%{name} degradava usator %{target}"
         destroy_announcement_html: "%{name} deleva annuncio %{target}"
+        destroy_canonical_email_block_html: "%{name} disblocava email con le hash %{target}"
         destroy_custom_emoji_html: "%{name} deleva emoji %{target}"
+        destroy_domain_allow_html: "%{name} impediva le federation con dominio %{target}"
         destroy_domain_block_html: "%{name} disblocava dominio %{target}"
+        destroy_email_domain_block_html: "%{name} disblocava le dominio email %{target}"
+        destroy_instance_html: "%{name} purgava le dominio %{target}"
+        destroy_ip_block_html: "%{name} deleva le regula pro IP %{target}"
+        destroy_status_html: "%{name} removeva le message de %{target}"
+        destroy_unavailable_domain_html: "%{name} resumeva le consignation al dominio %{target}"
         destroy_user_role_html: "%{name} deleva le rolo de %{target}"
+        disable_2fa_user_html: "%{name} disactivava le authentication a duo factores pro le usator %{target}"
+        disable_custom_emoji_html: "%{name} disactivava le emoticone %{target}"
+        disable_sign_in_token_auth_user_html: "%{name} disactivava authentication per testimonio via email pro %{target}"
+        disable_user_html: "%{name} disactivava le accesso pro le usator %{target}"
+        enable_custom_emoji_html: "%{name} activava le emoticone %{target}"
+        enable_sign_in_token_auth_user_html: "%{name} activava le authentication per testimonio via email pro %{target}"
+        enable_user_html: "%{name} activava le accesso pro le usator %{target}"
+        memorialize_account_html: "%{name} mutava le conto de %{target} in un pagina commemorative"
+        promote_user_html: "%{name} promoveva le usator %{target}"
+        reject_appeal_html: "%{name} refusava le appello del decision de moderation de %{target}"
+        reject_user_html: "%{name} refusava le inscription de %{target}"
+        remove_avatar_user_html: "%{name} removeva le avatar de %{target}"
+        reopen_report_html: "%{name} reaperiva le reporto %{target}"
+        resend_user_html: "%{name} reinviava le email de confirmation pro %{target}"
+        reset_password_user_html: "%{name} reinitialisava le contrasigno del usator %{target}"
+        resolve_report_html: "%{name} resolveva le reporto %{target}"
+        sensitive_account_html: "%{name} marcava como sensibile le medios de %{target}"
+        silence_account_html: "%{name} limitava le conto de %{target}"
+        suspend_account_html: "%{name} suspendeva le conto de %{target}"
+        unassigned_report_html: "%{name} de-assignava le reporto %{target}"
+        unblock_email_account_html: "%{name} disblocava le adresse email de %{target}"
+        unsensitive_account_html: "%{name} dismarcava como sensibile le medios de %{target}"
+        unsilence_account_html: "%{name} removeva le limite del conto de %{target}"
+        unsuspend_account_html: "%{name} removeva le suspension del conto de %{target}"
+        update_announcement_html: "%{name} actualisava le annuncio %{target}"
+        update_custom_emoji_html: "%{name} actualisava le emoticone %{target}"
+        update_domain_block_html: "%{name} actualisava le blocada de dominio pro %{target}"
+        update_ip_block_html: "%{name} cambiava le regula pro IP %{target}"
+        update_status_html: "%{name} actualisava le message per %{target}"
+        update_user_role_html: "%{name} cambiava le rolo de %{target}"
       deleted_account: conto delite
+      empty: Nulle registrationes trovate.
+      filter_by_action: Filtrar per action
+      filter_by_user: Filtrar per usator
+      title: Registro de inspection
     announcements:
       destroyed_msg: Annuncio delite con successo!
       edit:
         title: Modificar annuncio
       empty: Necun annuncios trovate.
+      live: Al vivo
       new:
         create: Crear annuncio
         title: Nove annuncio
       publish: Publicar
       published_msg: Annuncio publicate con successo!
+      scheduled_for: Programmate pro %{time}
+      scheduled_msg: Annuncio programmate pro le publication!
       title: Annuncios
+      unpublish: Depublicar
+      unpublished_msg: Le publication del annuncio ha essite disfacite!
+      updated_msg: Annuncio actualisate con successo!
+    critical_update_pending: Actualisation critic pendente
     custom_emojis:
+      assign_category: Assignar categoria
       by_domain: Dominio
       copied_msg: Copia local del emoji create con successo
       copy: Copiar
+      copy_failed_msg: Impossibile crear un copia local de ille emoticone
       create_new_category: Crear nove categoria
       created_msg: Emoji create con successo!
       delete: Deler
+      destroyed_msg: Emoticone destruite con successo destroyed!
       disable: Disactivar
       disabled: Disactivate
       disabled_msg: Emoji disactivate con successo
+      emoji: Emoticone
       enable: Activar
       enabled: Activate
       enabled_msg: Emoji activate con successo
+      image_hint: PNG o GIF usque %{size}
+      list: Listar
+      listed: Listate
       new:
         title: Adder nove emoji personalisate
+      no_emoji_selected: Nulle emoticones ha essite cambiate perque nulle ha essite seligite
+      not_permitted: Tu non es autorisate a exequer iste action
+      overwrite: Superscriber
+      shortcode: Via breve
+      shortcode_hint: Al minus 2 characteres, solo characteres alphanumeric e lineettas basse
       title: Emojis personalisate
+      uncategorized: Sin categoria
+      unlist: Non listar
+      unlisted: Non listate
+      update_failed_msg: Impossibile actualisar ille emoticone
+      updated_msg: Emoticone actualisate con successo!
       upload: Incargar
     dashboard:
       active_users: usatores active
@@ -282,71 +350,180 @@ ia:
       media_storage: Immagazinage de medios
       new_users: nove usatores
       opened_reports: reportos aperte
+      resolved_reports: reportos resolvite
       software: Software
+      sources: Fontes de inscription
+      space: Uso de spatio
+      title: Pannello de controlo
       top_languages: Linguas le plus active
       top_servers: Servitores le plus active
       website: Sito web
+    disputes:
+      appeals:
+        empty: Nulle appellos trovate.
+        title: Appellos
     domain_allows:
       add_new: Permitter federation con dominio
+      created_msg: Le dominio ha essite permittite con successo pro federation
+      destroyed_msg: Le dominio ha essite prohibite pro federation
       export: Exportar
       import: Importar
+      undo: Prohiber federation con dominio
     domain_blocks:
+      add_new: Adder nove blocada de dominio
       confirm_suspension:
         cancel: Cancellar
+        confirm: Suspender
+        permanent_action: Disfacer le suspension non restaurara alcun datos o relation.
+        preamble_html: Tu es sur le puncto de suspender <strong>%{domain}</strong> e su subdominios.
+        remove_all_data: Isto removera de tu servitor tote le contento, multimedia e datos de profilo del contos de iste dominio.
         stop_communication: Tu servitor stoppara le communication con iste servitores.
+        title: Confirmar le blocada del dominio %{domain}
+        undo_relationships: Isto disfacera omne relation de sequimento inter le contos de iste servitores e illos del tue.
+      created_msg: Le blocada del dominio es ora in tractamento
+      destroyed_msg: Le blocada del dominio ha essite disfacite
       domain: Dominio
-      edit: Modificar un bloco de dominio
+      edit: Modificar un blocada de dominio
+      existing_domain_block: Tu ha ja imponite limites plus stricte sur %{name}.
+      existing_domain_block_html: Tu ha ja imponite limites plus stricte sur %{name}; ora es necessari <a href="%{unblock_url}">disblocar lo</a> primo.
       export: Exportar
       import: Importar
       new:
+        create: Crear blocada
+        hint: Le blocada del dominio non impedira le creation de entratas de conto in le base de datos, ma applicara retroactive- e automaticamente le methodos specific de moderation a iste contos.
         severity:
+          desc_html: "<strong>Limitar</strong> rendera le messages del contos de iste dominio invisibile pro tote persona que non los seque. <strong>Suspender</strong> removera de tu servitor tote le contento, multimedia e datos de profilo del contos de iste dominio. Usa <strong>Necun</strong> si tu solmente vole rejectar le files multimedial."
+          noop: Nemo
           silence: Limitar
           suspend: Suspender
+        title: Nove blocada de dominio
+      no_domain_block_selected: Necun blocada de dominio ha essite cambiate perque necun ha essite seligite
+      not_permitted: Tu non es autorisate a exequer iste action
+      obfuscate: Offuscar le nomine de dominio
+      obfuscate_hint: Offuscar partialmente le nomine de dominio in le lista si le diffusion del lista de limitationes del dominio es activate
       private_comment: Commento private
+      private_comment_hint: Commentar iste limitation de dominio pro uso interne per le moderatores.
       public_comment: Commento public
+      public_comment_hint: Commentar iste limitation de dominio pro le publico general, si le diffusion del lista de limitationes del dominio es activate.
+      reject_media: Refusar files multimedial
+      reject_media_hint: Remove le files multimedial immagazinate localmente e refusa de discargar tales in futuro. Irrelevante pro le suspensiones
+      reject_reports: Refusar reportos
+      reject_reports_hint: Ignorar tote le reportos proveniente de iste dominio. Irrelevante pro le suspensiones
+      undo: Disfacer blocada de dominio
+      view: Examinar blocada de dominio
     email_domain_blocks:
       add_new: Adder nove
+      allow_registrations_with_approval: Permitter inscriptiones con approbation
+      attempts_over_week:
+        one: "%{count} tentativa de inscription in le ultime septimana"
+        other: "%{count} tentativas de inscription in le ultime septimana"
+      created_msg: Le dominio de e-mail ha essite blocate
       delete: Deler
+      dns:
+        types:
+          mx: Registro MX
       domain: Dominio
       new:
         create: Adder un dominio
+        resolve: Resolver dominio
         title: Blocar un nove dominio de e-mail
+      no_email_domain_block_selected: Necun blocadas de dominio de e-mail ha essite cambiate perque necun ha essite seligite
+      not_permitted: Non permittite
+      resolved_dns_records_hint_html: Le nomine de dominio se resolve al sequente dominios MX, le quales ha le ultime responsibilitate pro le reception de e-mail. Blocar un dominio MX blocara le inscriptiones de qualcunque adresse de e-mail que usa le mesme dominio MX, mesmo si le nomine de dominio visibile es differente. <strong>Presta attention a evitar de blocar le grande fornitores de e-mail.</strong>
+      resolved_through_html: Resolvite per %{domain}
       title: Dominios de e-mail blocate
     export_domain_allows:
+      new:
+        title: Importar permissiones de dominio
       no_file: Necun file seligite
     export_domain_blocks:
+      import:
+        description_html: Tu es sur le puncto de importar un lista de blocadas de dominio. Per favor revide con grande cura iste lista, particularmente si tu non lo ha scribite tu mesme.
+        existing_relationships_warning: Relationes existente de sequimento
+        private_comment_description_html: 'Pro adjutar te a traciar de ubi proveni le blocadas importate, le blocadas importate essera create con le sequente commento private: <q>%{comment}</q>'
+        private_comment_template: Importate de %{source} le %{date}
+        title: Importar blocadas de dominio
+      invalid_domain_block: 'Un o plus blocadas de dominio ha essite saltate a causa del sequente error(es): %{error}'
+      new:
+        title: Importar blocadas de dominio
       no_file: Necun file seligite
     follow_recommendations:
+      description_html: "<strong>Le recommendationes de sequimento adjuta le nove usatores a trovar rapidemente contento interessante.</strong> Quando un usator non ha un historia sufficiente de interactiones con alteres pro formar recommendationes personalisate de sequimento, iste contos es recommendate. Illos se recalcula cata die a partir de un mixtura de contos con le plus grande numero de ingagiamentos recente e le numero de sequitores local le plus alte pro un lingua date."
       language: Per lingua
       status: Stato
+      suppress: Supprimer recommendation de sequimento
+      suppressed: Supprimite
       title: Sequer le recommendationes
+      unsuppress: Restaurar recommendation de sequimento
     instances:
+      availability:
+        description_html:
+          one: Si le livration al dominio falle <strong>%{count} die</strong> sin succeder, necun tentativa ulterior de livration essera facite, excepte si es recipite un livration <em>ab</em> le dominio.
+          other: Si le livration al dominio falle durante <strong>%{count} dies differente</strong> sin succeder, necun tentativa ulterior de livration essera facite, excepte si es recipite un livration <em>ab</em> le dominio.
+        failure_threshold_reached: Limine de fallimentos attingite le %{date}.
+        failures_recorded:
+          one: Tentativa fallite durante %{count} die.
+          other: Tentativa fallite durante %{count} dies differente.
+        no_failures_recorded: Necun fallimento cognoscite.
+        title: Disponibilitate
+        warning: Le ultime tentativa de connexion a iste servitor non ha succedite
       back_to_all: Toto
       back_to_limited: Limitate
       back_to_warning: Advertimento
       by_domain: Dominio
+      confirm_purge: Es tu secur que tu vole deler permanentemente le datos de iste dominio?
       content_policies:
         comment: Nota interne
+        description_html: Tu pote definir politicas de contento que se applicara a tote le contos de iste dominio e a qualcunque de su subdominios.
+        limited_federation_mode_description_html: Tu pote decider si permitter le federation con iste dominio.
         policies:
+          reject_media: Rejectar multimedia
+          reject_reports: Rejectar reportos
           silence: Limitar
           suspend: Suspender
         policy: Politica
         reason: Ration public
+        title: Politicas de contento
       dashboard:
         instance_accounts_dimension: Contos le plus sequite
+        instance_accounts_measure: contos immagazinate
+        instance_followers_measure: nostre sequitores illac
+        instance_follows_measure: lor sequitores hic
         instance_languages_dimension: Linguas principal
+        instance_media_attachments_measure: annexos multimedial immagazinate
+        instance_reports_measure: signalationes sur illos
+        instance_statuses_measure: messages immagazinate
       delivery:
+        all: Totes
+        clear: Rader errores de livration
+        failing: Fallente
+        restart: Recomenciar livration
+        stop: Cessar livration
         unavailable: Non disponibile
+      delivery_available: Livration es disponibile
+      delivery_error_days: Dies de errores de livration
+      delivery_error_hint: Si le livration non es possibile durante %{count} dies, illo essera automaticamente marcate como non livrabile.
+      destroyed_msg: Le datos de %{domain} es ora in cauda pro deletion imminente.
       empty: Necun dominios trovate.
+      known_accounts:
+        one: "%{count} conto cognoscite"
+        other: "%{count} contos cognoscite"
       moderation:
         all: Toto
         limited: Limitate
         title: Moderation
       private_comment: Commento private
       public_comment: Commento public
+      purge: Purgar
+      purge_description_html: Si tu crede que iste dominio es foras de linea pro sempre, tu pote deler de tu immagazinage tote le registros del conto e le datos associate de iste dominio. Isto pote prender un tempore.
       title: Federation
       total_blocked_by_us: Blocate per nos
+      total_followed_by_them: Sequite per illes
       total_followed_by_us: Sequite per nos
+      total_reported: Signalationes sur illes
+      total_storage: Annexos multimedial
+      totals_time_period_hint_html: Le totales monstrate hic infra include le datos de tote le tempore.
+      unknown_instance: Iste dominio non es actualmente cognoscite sur iste servitor.
     invites:
       deactivate_all: Disactivar toto
       filter:
@@ -357,6 +534,7 @@ ia:
       title: Invitationes
     ip_blocks:
       add_new: Crear regula
+      created_msg: Le nove regula IP ha essite addite
       delete: Deler
       expires_in:
         '1209600': 2 septimanas
@@ -367,8 +545,12 @@ ia:
         '94670856': 3 annos
       new:
         title: Crear un nove regula IP
+      no_ip_block_selected: Necun regula IP ha essite cambiate perque necun ha essite seligite
       title: Regulas IP
+    relationships:
+      title: Relationes de %{acct}
     relays:
+      add_new: Adder nove repetitor
       delete: Deler
       description_html: Un <strong>repetitor de federation</strong> es un servitor intermediari que excambia grande volumines de messages public inter le servitores que se inscribe e publica a illo. <strong>Illo pote adjutar le servitores micre e medie a discoperir le contento del fediverso</strong>, sin requirer que le usatores local seque manualmente altere personas sur servitores distante.
       disable: Disactivar
@@ -376,59 +558,212 @@ ia:
       enable: Activar
       enable_hint: Un vice activate, tu servitor se inscribera a tote le messages public de iste repetitor, e comenciara a inviar le messages public de iste servitor a illo.
       enabled: Activate
+      inbox_url: URL del repetitor
+      pending: Attende le approbation del repetitor
       save_and_enable: Salveguardar e activar
+      setup: Crear un connexion con un repetitor
+      signatures_not_enabled: Le repetitores pote non functionar correctemente durante que le modo secur o le modo de federation limitate es activate
       status: Stato
+      title: Repetitores
+    report_notes:
+      created_msg: Nota de signalation create con successo!
+      destroyed_msg: Nota de signalation delite con successo!
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notas"
+      action_log: Registro de inspection
+      action_taken_by: Action prendite per
+      actions:
+        delete_description_html: Le messages signalate essera delite e un admonition essera registrate pro adjutar te a prender mesuras in caso de futur infractiones proveniente del mesme conto.
+        mark_as_sensitive_description_html: Le files multimedial in le messages reportate essera marcate como sensibile e un admonition essera registrate pro adjutar te a prender mesuras in caso de futur infractiones proveniente del mesme conto.
+        other_description_html: Vider plus optiones pro controlar le comportamento del conto e personalisar le communication al conto signalate.
+        resolve_description_html: Necun action essera prendite contra le conto signalate, necun admonition registrate, e le signalation essera claudite.
+        silence_description_html: Iste conto essera visibile solmente a qui ja lo seque o manualmente lo cerca, limitante gravemente su portata. Pote sempre esser revertite. Claude tote le signalationes contra iste conto.
+        suspend_description_html: Le conto e tote su contento essera inaccessible e finalmente delite, e interager con illo essera impossibile. Reversibile intra 30 dies. Claude tote le signalationes contra iste conto.
+      actions_description_html: Decide qual action prender pro resolver iste signalation. Si tu prende un action punitive contra le conto signalate, le persona recipera un notification in e-mail, excepte si le categoria <strong>Spam</strong> es seligite.
+      actions_description_remote_html: Decide qual action prender pro resolver iste signalation. Isto affectara solmente le maniera in que <strong>tu</strong> servitor communica con iste conto remote e gere su contento.
       add_to_report: Adder plus al reporto
+      already_suspended_badges:
+        local: Ja suspendite sur iste servitor
+        remote: Ja suspendite sur su servitor
       are_you_sure: Es tu secur?
+      assign_to_self: Assignar a me
+      assigned: Moderator assignate
+      by_target_domain: Dominio del conto signalate
       cancel: Cancellar
       category: Categoria
+      category_description_html: Le motivo pro le qual iste conto e/o contento ha essite signalate essera citate in le communication con le conto signalate
+      comment:
+        none: Necun
+      comment_description_html: 'Pro fornir plus information, %{name} ha scribite:'
       confirm: Confirmar
+      confirm_action: Confirmar le action de moderation contra %{acct}
+      created_at: Signalate
       delete_and_resolve: Deler le messages
+      forwarded: Reexpedite
+      forwarded_replies_explanation: Iste signalation proveni de un usator remote e concerne contento remote. Illo te ha essite reexpedite perque le contento signalate es in responsa a un usator tue.
+      forwarded_to: Reexpedite a %{domain}
+      mark_as_resolved: Marcar como resolvite
+      mark_as_sensitive: Marcar como sensibile
+      mark_as_unresolved: Marcar como non resolvite
       no_one_assigned: Nemo
       notes:
         create: Adder un nota
+        create_and_resolve: Resolver con nota
+        create_and_unresolve: Reaperir con nota
         delete: Deler
+        placeholder: Describe le actiones prendite, o insere altere information pertinente...
         title: Notas
+      notes_description_html: Vider e lassar notas pro altere moderatores e pro tu proprie futuro
+      processed_msg: 'Reporto #%{id} elaborate con successo'
+      quick_actions_description_html: 'Face un rapide action o rola a basso pro vider le contento reportate:'
+      remote_user_placeholder: le usator remote ab %{instance}
+      reopen: Reaperir reporto
+      report: 'Reporto #%{id}'
+      reported_account: Conto signalate
+      reported_by: Signalate per
+      resolved: Resolvite
+      resolved_msg: Reporto resolvite con successo!
       skip_to_actions: Saltar al actiones
       status: Stato
+      statuses: Contento signalate
+      statuses_description_html: Le contento offensive sera citate in communication con le conto reportate
+      summary:
+        action_preambles:
+          delete_html: 'Tu va <strong>remover</strong> parte de messages de <strong>@%{acct}</strong>. Isto ira:'
+          mark_as_sensitive_html: 'Tu va <strong>marcar</strong> parte de messages de <strong>@%{acct}</strong> como <strong>sensibile</strong>. Isto ira:'
+          silence_html: 'Tu va <strong>limitar</strong> le conto de <strong>@%{acct}</strong>. Isto ira:'
+          suspend_html: 'Tu va <strong>limitar</strong> le conto de <strong>@%{acct}</strong>. Isto ira:'
+        actions:
+          delete_html: Remover le messages offensive
+          mark_as_sensitive_html: Marcar le medios de messages offensive como sensibile
+          silence_html: Limitar gravemente le portata de <strong>@%{acct}</strong> rendente le profilo e contento visibile solmente a qui ja lo seque o lo cerca manualmente
+          suspend_html: Suspender <strong>@%{acct}</strong>, rendente le profilo e contento inaccessibile e le interaction con illo impossibile
+        close_report: Marcar le signalation №%{id} como resolvite
+        close_reports_html: Marcar <strong>tote</strong> le signalationes contra <strong>@%{acct}</strong> como resolvite
+        delete_data_html: Deler le profilo e contento de <strong>@%{acct}</strong> in 30 dies excepte si le suspension es disfacite intertanto
+        preview_preamble_html: "<strong>@%{acct}</strong> recipera un advertimento con le sequente contento:"
+        record_strike_html: Registrar un admonition contra <strong>@%{acct}</strong> pro adjutar te a imponer sanctiones in caso de futur violationes de iste conto
+        send_email_html: Inviar un e-mail de advertimento a <strong>@%{acct}</strong>
+        warning_placeholder: Motivation supplementari facultative pro le action de moderation.
+      target_origin: Origine del conto signalate
+      title: Reportos
+      unassign: Disassignar
+      unknown_action_msg: 'Action incognite: %{action}'
+      unresolved: Non resolvite
       updated_at: Actualisate
       view_profile: Vider profilo
     roles:
+      add_new: Adder rolo
       assigned_users:
         one: "%{count} usator"
         other: "%{count} usatores"
       categories:
+        administration: Administration
+        devops: DevOps
         invites: Invitationes
         moderation: Moderation
         special: Special
       delete: Deler
+      description_html: Le <strong>rolos de usator</strong> permitte personalisar le functiones e areas de Mastodon al quales le usator pote acceder.
+      edit: Modificar le rolo '%{name}'
       everyone: Permissiones predefinite
+      everyone_full_description_html: Iste es le <strong>rolo de base</strong> que affecta <strong>tote le usatores</strong>, mesmo illes sin rolo assignate. Tote le altere rolos heredita le permissiones de illo.
+      permissions_count:
+        one: "%{count} permission"
+        other: "%{count} permissiones"
       privileges:
+        administrator: Administrator
+        administrator_description: Le usatores con iste permission pote contornar tote permission
         delete_user_data: Deler le datos de usator
+        delete_user_data_description: Permitte que usatores dele immediatemente le datos de altere usatores
+        invite_users: Invitar usatores
+        invite_users_description: Permitte que usatores invita nove personas al servitor
         manage_announcements: Gerer le annuncios
+        manage_announcements_description: Permitte que usatores genere annuncios sur le servitor
+        manage_appeals: Gerer appellos
+        manage_appeals_description: Permitte que usatores revide appellos contra actiones de moderation
+        manage_blocks: Gerer blocadas
+        manage_blocks_description: Permitter que usatores bloca le fornitores de e-mail e le adresses IP
+        manage_custom_emojis: Gerer emojis personalisate
+        manage_custom_emojis_description: Permitte que usatores gere emojis personalisate sur le servitor
+        manage_federation: Gerer federation
+        manage_federation_description: Permitte que le usatores bloca o permitte le federation con altere dominios, e controla le livration
         manage_invites: Gerer le invitationes
+        manage_invites_description: Permitte que usatores examina e deactiva ligamines de invitation
+        manage_reports: Gerer le reportos
+        manage_reports_description: Permitte que usatores revide signalationes e exeque actiones de moderation a base de illos
+        manage_roles: Gerer le rolos
+        manage_roles_description: Permitte que usatores gere e assigna rolos inferior a lor privilegios actual
         manage_rules: Gerer le regulas
+        manage_rules_description: Permitte que usatores cambia le regulas del servitor
         manage_settings: Gerer le parametros
+        manage_settings_description: Permitte que usatores cambia le parametros del sito
+        manage_taxonomies: Gerer taxonomias
+        manage_taxonomies_description: Permitte que usatores revide contento in tendentias e actualisa le parametros de hashtag
+        manage_user_access: Gerer le accessos de usator
+        manage_user_access_description: Permitte que usatores disactiva le authentication bifactorial de altere usatores, cambia lor adresses de e-mail, e reinitialisa lor contrasigno
         manage_users: Gerer usatores
+        manage_users_description: Permitte que usatores vide le detalios de altere usatores e exeque actiones de moderation contra illes
+        manage_webhooks: Gerer Webhooks
+        manage_webhooks_description: Permitte que usatores installa “webhooks” pro eventos administrative
+        view_audit_log: Vider le registro de inspection
+        view_audit_log_description: Permitte que usatores vide un historia de actiones administrative sur le servitor
+        view_dashboard: Vider le tabuliero de instrumentos
+        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
       title: Rolos
     rules:
+      add_new: Adder regula
       delete: Deler
+      description_html: Ben que multes affirma de haber legite e acceptate le conditiones de servicio, generalmente le gente non los lege completemente usque un problema surge. <strong>Facilita le visibilitate del regulas de tu servitor in un colpo de oculo forniente los in un lista a punctos.</strong> Tenta mantener le regulas individual curte e simple, ma sin divider los in multe punctos separate.
+      edit: Modificar regula
+      empty: Necun regula del servitor ha essite definite ancora.
+      title: Regulas del servitor
     settings:
       about:
+        manage_rules: Gerer le regulas del servitor
+        preamble: Fornir information detaliate sur le functionamento, moderation e financiamento del servitor.
+        rules_hint: Il ha un area dedicate al regulas que tu usatores debe acceptar.
         title: A proposito de
       appearance:
         preamble: Personalisar le interfacie web de Mastodon.
         title: Apparentia
+      branding:
+        preamble: Le marca de tu servitor lo differentia de altere servitores in le rete. Iste information pote esser monstrate in diverse ambientes, como le interfacie web de Mastodon, applicationes native, in previsualisationes de ligamines sur altere sitos web, in applicationes de messageria, etc. Pro iste ration, il es melior mantener iste information clar, breve e concise.
+        title: Marca
+      captcha_enabled:
+        desc_html: Iste depende de scripts externe de hCaptcha, que pote esser un problema de securitate e vita private. De plus, <strong>isto pote render le processo de inscription multo minus accessibile a certe personas (particularmente personas con discapacitates)</strong>. Pro iste rationes, considera altere mesuras como le inscription basate sur approbation o invitation.
+        title: Require que nove usatores solve un CAPTCHA pro confirmar lor conto
+      content_retention:
+        danger_zone: Zona periculose
       discovery:
         profile_directory: Directorio de profilos
         public_timelines: Chronologias public
+        title: Discoperi
         trends: Tendentias
+      domain_blocks:
+        all: A omnes
+        disabled: A necuno
+        users: A usators local in session
+      registrations:
+        title: Registrationes
+      registrations_mode:
+        modes:
+          none: Nemo pote inscriber se
+          open: Quicunque pote inscriber se
+      security:
+        authorized_fetch_hint: Requirer authentication de servitores federate permitte un application plus stricte de blocadas a nivello de usator e de servitor. Nonobstante, isto diminue le prestationes del servitor, reduce le portata de tu responsas e pote introducer problemas de compatibilitate con certe servicios federate. In plus, isto non impedira le actores dedicate a recuperar tu messages public e tu contos.
       title: Parametros de servitor
     site_uploads:
       delete: Deler file incargate
+      destroyed_msg: Incarga de sito delite con successo!
     software_updates:
       documentation_link: Pro saper plus
+      release_notes: Notas de version
       title: Actualisationes disponibile
       type: Typo
       types:
@@ -443,31 +778,136 @@ ia:
       deleted: Delite
       favourites: Favoritos
       history: Chronologia del versiones
+      in_reply_to: Replicante a
       language: Lingua
       media:
         title: Medios
       metadata: Metadatos
       open: Aperir message
       original_status: Message original
+      status_changed: Messages cambiate
       title: Messages del conto
       trending: Tendentias
       visibility: Visibilitate
+      with_media: Con medios
     strikes:
       actions:
+        delete_statuses: "%{name} ha delite le messages de %{target}"
+        disable: "%{name} ha gelate le conto de %{target}"
+        mark_statuses_as_sensitive: "%{name} ha marcate le messages de %{target} como sensibile"
         none: "%{name} ha inviate un advertimento a %{target}"
+        sensitive: "%{name} ha marcate le conto de %{target} como sensibile"
+        silence: "%{name} ha limitate le conto de %{target}"
+        suspend: "%{name} ha suspendite le conto de %{target}"
+      appeal_approved: Appello facite
+      appeal_pending: Appello pendente
+      appeal_rejected: Appello rejectate
     system_checks:
+      elasticsearch_preset:
+        action: Vide documentation
+      elasticsearch_preset_single_node:
+        action: Vide documentation
       rules_check:
         action: Gerer le regulas del servitor
       software_version_critical_check:
         action: Vider le actualisationes disponibile
+        message_html: Un actualisation critic de Mastodon es disponibile, actualisa lo le plus rapide possibile.
       software_version_patch_check:
         action: Vider le actualisationes disponibile
       upload_check_privacy_error:
         action: Verifica hic pro plus de information
+      upload_check_privacy_error_object_storage:
+        action: Verifica hic pro plus de information
+    trends:
+      approved: Approbate
+      rejected: Rejectate
+      tags:
+        not_usable: Non pote esser usate
+      title: Tendentias
+    warning_presets:
+      add_new: Adder nove
+      delete: Deler
+    webhooks:
+      delete: Deler
+      disable: Disactivar
+      disabled: Disactivate
+      enable: Activar
+      events: Eventos
+      status: Stato
+  admin_mailer:
+    new_critical_software_updates:
+      subject: Actualisationes critic de Mastodon es disponibile pro %{instance}!
+    new_software_updates:
+      subject: Nove versiones de Mastodon es disponibile pro %{instance}!
+  appearance:
+    advanced_web_interface: Interfacie web avantiate
+    sensitive_content: Contento sensibile
   application_mailer:
+    notification_preferences: Cambiar preferentias de e-mail
+    settings: 'Cambiar preferentias de e-mail: %{link}'
     unsubscribe: Desubscriber
+    view: 'Vider:'
+    view_profile: Vider profilo
+    view_status: Vider message
+  applications:
+    created: Application create con successo
+    destroyed: Application delite con successo
+    logout: Clauder le session
+  auth:
+    confirmations:
+      welcome_title: Benvenite, %{name}!
+    delete_account: Deler le conto
+    logout: Clauder le session
+    progress:
+      details: Tu detalios
+    set_new_password: Definir un nove contrasigno
+    status:
+      account_status: Stato del conto
+      view_strikes: Examinar le admonitiones passate contra tu conto
+  challenge:
+    invalid_password: Contrasigno non valide
+  deletes:
+    proceed: Deler le conto
+    success_msg: Tu conto esseva delite con successo
+    warning:
+      data_removal: Tu messages e altere datos essera removite permanentemente
+      email_change_html: Tu pote <a href="%{path}">cambiar tu adresse de e-mail</a> sin deler tu conto
+  disputes:
+    strikes:
+      action_taken: Action prendite
+      appeal: Facer appello
+      appeal_approved: Iste admonition ha essite annullate in appello e non es plus valide
+      appeal_rejected: Le appello ha essite rejectate
+      appeal_submitted_at: Appello submittite
+      appealed_msg: Tu appello ha essite submittite. Si es approbate, tu recipera notification.
+      appeals:
+        submit: Submitter appello
+      approve_appeal: Approbar apello
+      associated_report: Signalation associate
+      created_at: Del data
+      description_html: Istes es le actiones prendite contra tu conto e le advertimentos que te ha essite inviate per le personal de %{instance}.
+      recipient: Adressate a
+      reject_appeal: Rejectar appello
+      status: Message №%{id}
+      status_removed: Le message ha ja essite removite del systema
+      title: "%{action} del %{date}"
+      title_actions:
+        delete_statuses: Elimination de messages
+        disable: Gelamento del conto
+        mark_statuses_as_sensitive: Marcation de messages como sensibile
+        none: Advertimento
+        sensitive: Marcation del conto como sensibile
+        silence: Limitation del conto
+        suspend: Suspension del conto
+      your_appeal_approved: Tu appello ha essite approbate
+      your_appeal_pending: Tu ha submittite un appello
+      your_appeal_rejected: Tu appello ha essite rejectate
   edit_profile:
+    basic_information: Information basic
     other: Alteres
+  errors:
+    '422':
+      content: Le verification de securitate ha fallite. Bloca tu le cookies?
   existing_username_validator:
     not_found_multiple: non poteva trovar %{usernames}
   exports:
@@ -478,6 +918,7 @@ ia:
     blocks: Tu ha blocate
     bookmarks: Marcapaginas
     csv: CSV
+    domain_blocks: Blocadas de dominio
     mutes: Tu ha silentiate
     storage: Immagazinage de medios
   featured_tags:
@@ -496,6 +937,10 @@ ia:
       title: Modificar filtro
     index:
       delete: Deler
+      title: Filtros
+    new:
+      save: Salveguardar nove filtro
+      title: Adder nove filtro
   generic:
     all: Toto
     cancel: Cancellar
@@ -509,12 +954,37 @@ ia:
   imports:
     errors:
       empty: File CSV vacue
+      invalid_csv_file: 'File CSV non valide. Error: %{error}'
       too_large: Le file es troppo longe
     failures: Fallimentos
+    overwrite_preambles:
+      blocking_html: Tu es sur le puncto de <strong>reimplaciar tu lista de blocadas</strong> per usque a <strong>%{total_items} contos</strong> proveniente de <strong>%{filename}</strong>.
+      domain_blocking_html: Tu es sur le puncto de <strong>reimplaciar tu lista de blocadas de dominio</strong> per usque a <strong>%{total_items} dominios</strong> proveniente de <strong>%{filename}</strong>.
+    preambles:
+      blocking_html: Tu es sur le puncto de <strong>blocar</strong> usque a <strong>%{total_items} contos</strong> a partir de <strong>%{filename}</strong>.
+      domain_blocking_html: Tu es sur le puncto de <strong>blocar</strong> usque a <strong>%{total_items} dominios</strong> a partir de <strong>%{filename}</strong>.
+    preface: Tu pote importar datos que tu ha exportate de un altere servitor, como un lista de personas que tu seque o bloca.
+    recent_imports: Importationes recente
     status: Stato
+    titles:
+      blocking: Importation de contos blocate
+      bookmarks: Importation de marcapaginas
+      domain_blocking: Importation de dominios blocate
+      lists: Importation de listas
+      muting: Importation de contos silentiate
+    type: Typo de importation
+    type_groups:
+      constructive: Sequites e marcapaginas
+      destructive: Blocadas e silentiamentos
     types:
+      blocking: Lista de blocadas
+      bookmarks: Marcapaginas
+      domain_blocking: Lista de dominios blocate
       lists: Listas
+    upload: Incargar
   invites:
+    delete: Disactivar
+    expired: Expirate
     expires_in:
       '1800': 30 minutas
       '21600': 6 horas
@@ -544,9 +1014,90 @@ ia:
   migrations:
     errors:
       not_found: non poterea esser trovate
+  move_handler:
+    carry_blocks_over_text: Iste usator ha cambiate de conto desde %{acct}, que tu habeva blocate.
+  notification_mailer:
+    follow:
+      title: Nove sequitor
+    follow_request:
+      title: Nove requesta de sequimento
+    mention:
+      action: Responder
+    poll:
+      subject: Un inquesta de %{name} ha finite
+  pagination:
+    next: Sequente
   preferences:
+    other: Altere
     public_timelines: Chronologias public
+  privacy_policy:
+    title: Politica de confidentialitate
+  relationships:
+    activity: Activitate del conto
+    most_recent: Plus recente
+    status: Stato del conto
+  sessions:
+    activity: Ultime activitate
+    browser: Navigator
+    browsers:
+      alipay: Alipay
+      blackberry: BlackBerry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Navigator incognite
+      huawei_browser: Huawei Browser
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Navigator de Nokia S40 Ovi
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UC Browser
+      unknown_browser: Navigator Incognite
+      weibo: Weibo
+    current_session: Session actual
+    date: Data
+    description: "%{browser} sur %{platform}"
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: BlackBerry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      kai_os: KaiOS
+      linux: Linux
+      mac: macOS
+      unknown_platform: Platteforma incognite
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+  settings:
+    account: Conto
+    account_settings: Parametros de conto
+    appearance: Apparentia
+    delete: Deletion de conto
+    development: Disveloppamento
+    edit_profile: Modificar profilo
+    import: Importar
+    migrate: Migration de conto
+    notifications: Notificationes de e-mail
+    preferences: Preferentias
+    profile: Profilo public
+    relationships: Sequites e sequitores
+    strikes: Admonitiones de moderation
+  severed_relationships:
+    event_type:
+      domain_block: Suspension del servitor (%{target_name})
+      user_domain_block: Tu ha blocate %{target_name}
+    preamble: Tu pote perder sequites e sequitores quando tu bloca un dominio o quando tu moderatores decide suspender un servitor remote. Quando isto occurre, tu potera discargar listas de relationes rumpite, a inspectar e eventualmente importar in un altere servitor.
+    type: Evento
   statuses:
+    open_in_web: Aperir in le web
     poll:
       vote: Votar
     show_more: Monstrar plus
@@ -563,7 +1114,13 @@ ia:
       '604800': 1 septimana
       '63113904': 2 annos
       '7889238': 3 menses
+  stream_entries:
+    sensitive_content: Contento sensibile
+  strikes:
+    errors:
+      too_late: Es troppo tarde pro facer appello contra iste admonition
   themes:
+    contrast: Mastodon (Alte contrasto)
     default: Mastodon (Obscur)
     mastodon-light: Mastodon (Clar)
     system: Automatic (usar thema del systema)
@@ -574,6 +1131,24 @@ ia:
   user_mailer:
     appeal_approved:
       action: Parametros de conto
+      explanation: Le appello contra le admonition contra tu conto del %{strike_date}, que tu ha submittite le %{appeal_date}, ha essite approbate. Tu conto ha de novo un bon reputation.
+    appeal_rejected:
+      explanation: Le appello contra le admonition contra tu conto del %{strike_date}, que tu ha submittite le %{appeal_date}, ha essite rejectate.
+    warning:
+      appeal: Submitter un appello
+      subject:
+        none: Advertimento pro %{acct}
+        sensitive: Tu messages sur %{acct} essera marcate como sensibile a partir de ora
+        silence: Tu conto %{acct} ha essite limitate
+        suspend: Tu conto %{acct} ha essite suspendite
+      title:
+        delete_statuses: Messages removite
+        disable: Conto gelate
+        mark_statuses_as_sensitive: Messages marcate como sensibile
+        none: Advertimento
+        sensitive: Conto marcate como sensibile
+        silence: Conto limitate
+        suspend: Conto suspendite
     welcome:
       apps_android_action: Obtene lo sur Google Play
       apps_ios_action: Discargar sur le App Store
@@ -582,6 +1157,9 @@ ia:
       edit_profile_action: Personalisar
       edit_profile_title: Personalisar tu profilo
       feature_action: Apprender plus
+      follow_action: Sequer
+      post_title: Face tu prime message
+      share_action: Compartir
       share_title: Compartir tu profilo de Mastodon
       subject: Benvenite in Mastodon
   verification:
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index da9a42141..0712ba380 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -737,6 +737,7 @@ ja:
         desc_html: この機能は hCaptcha による外部スクリプトを使用しますが、hCaptcha にはセキュリティとプライバシーの懸念が考えられます。また、<strong>CAPTCHAにより新規登録のアクセシビリティが大幅に損なわれる可能性があり、身体および精神障害者においては特に顕著です。</strong>以上の理由から、承認制や招待制を基本とするなど、代わりの登録手順を提供することを検討してください。
         title: 新規ユーザーのアカウント確認にCHAPCHAを要求する
       content_retention:
+        danger_zone: 危険な操作
         preamble: ユーザーが生成したコンテンツがどのように Mastodon に保存されるかを管理します。
         title: コンテンツの保持
       default_noindex:
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 82fbde6ce..3449f1d5d 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -410,6 +410,8 @@ lt:
           silence: Riboti
           suspend: Pristabdyti
         title: Naujos domeno blokas
+      public_comment: Viešas komentaras
+      public_comment_hint: Komentaras apie šį domeno apribojimą plačiajai visuomenei, jei įjungtas domenų apribojimų sąrašo reklamavimas.
       reject_media: Atmesti medijos failus
       reject_media_hint: Panaikina lokaliai saugomus medijos failus bei atsisako jų parsisiuntimo ateityje. Neliečia užblokavimu
       reject_reports: Atmesti ataskaitas
@@ -427,11 +429,14 @@ lt:
       title: El pašto juodasis sąrašas
     instances:
       by_domain: Domenas
+      content_policies:
+        reason: Viešoji priežastis
       delivery_available: Pristatymas galimas
       moderation:
         all: Visi
         limited: Limituotas
         title: Moderacija
+      public_comment: Viešas komentaras
       title: Federacija
       total_blocked_by_us: Mes užblokavome
       total_followed_by_them: Jų sekami
@@ -449,11 +454,11 @@ lt:
     relays:
       add_new: Pridėti naują pamainą
       delete: Ištrinti
-      description_html: "<strong>Federacijos perjungėjas</strong> tai tarpinis serveris, kuris apsikeičia didelios apimties informacija tarp kitų serverių. <strong> Tai gali padėti mažesniems serveriams atrasti turinį iš fedi-visatos</strong>, kuris kitaip reikalautų vartotojų lokaliai sekti kitus žmones naudojantis kitus tolimus serverius."
+      description_html: "<strong>Federacijos perdavimas</strong> – tai tarpinis serveris, kuris keičiasi dideliais viešų įrašų kiekiais tarp jį prenumeruojančių ir skelbiančių serverių. <strong>Jis gali padėti mažiems ir vidutiniams serveriams atrasti fediverse esantį turinį</strong>, nes priešingu atveju vietiniams naudotojams reikėtų rankiniu būdu sekti kitus žmones iš nutolusių serverių."
       disable: Išjungti
       disabled: Išjungtas
       enable: Įjungti
-      enable_hint: Kai įjungta, Jūsų serveris prenumeruos visas viešas žinutes iš šio tinklo, ir pradės siųsti šio serverio viešas žinutes į tinklą.
+      enable_hint: Kai bus įjungtas, tavo serveris užsiprenumeruos visus šio perdavimo viešus įrašus ir pradės į jį siųsti šio serverio viešus įrašus.
       enabled: Įjungtas
       inbox_url: Perdavimo URL
       pending: Laukiama perdavimo patvirtinimo
@@ -504,6 +509,8 @@ lt:
         desc_html: Tai priklauso nuo hCaptcha išorinių skriptų, kurie gali kelti susirūpinimą dėl saugumo ir privatumo. Be to, <strong>dėl to registracijos procesas kai kuriems žmonėms (ypač neįgaliesiems) gali būti gerokai sunkiau prieinami</strong>. Dėl šių priežasčių apsvarstyk alternatyvias priemones, pavyzdžiui, patvirtinimu arba kvietimu grindžiamą registraciją.
       content_retention:
         danger_zone: Pavojinga zona
+      discovery:
+        public_timelines: Viešieji laiko skalės
       domain_blocks:
         all: Visiems
       registrations:
@@ -543,7 +550,7 @@ lt:
       body: Mastodon verčia savanoriai.
       guide_link_text: Visi gali prisidėti.
   application_mailer:
-    notification_preferences: Keisti el pašto parinktis
+    notification_preferences: Keisti el. pašto nuostatas
     settings: 'Keisti el. pašto nuostatas: %{link}'
     view: 'Peržiūra:'
     view_profile: Peržiurėti profilį
@@ -635,7 +642,7 @@ lt:
     contexts:
       home: Namų laiko juosta
       notifications: Priminimai
-      public: Viešos laiko juostos
+      public: Viešieji laiko skalės
       thread: Pokalbiai
     edit:
       title: Keisti filtrą
@@ -727,6 +734,8 @@ lt:
     prev: Ankstesnis
   preferences:
     other: Kita
+    posting_defaults: Skelbimo numatytosios nuostatos
+    public_timelines: Viešieji laiko skalės
   privacy:
     hint_html: "<strong>Tikrink, kaip nori, kad tavo profilis ir įrašai būtų randami.</strong> Įjungus įvairias Mastodon funkcijas, jos gali padėti pasiekti platesnę auditoriją. Akimirką peržiūrėk šiuos nustatymus, kad įsitikintum, jog jie atitinka tavo naudojimo būdą."
   redirects:
@@ -769,7 +778,8 @@ lt:
     import: Importuoti
     migrate: Paskyros migracija
     notifications: El. laiško pranešimai
-    preferences: Preferencijos
+    preferences: Nuostatos
+    profile: Viešas profilis
     two_factor_authentication: Dviejų veiksnių autentikacija
   statuses:
     attached:
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 8e30a27b8..0c2e6cfd6 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -751,6 +751,7 @@ pt-PT:
         desc_html: Isto depende de scripts externos da hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, <strong>isto pode tornar o processo de registo menos acessível para algumas pessoas (especialmente as com limitações físicas)</strong>. Por isso, considere medidas alternativas tais como registo mediante aprovação ou sob convite.
         title: Requerer que novos utilizadores resolvam um CAPTCHA para confirmar a sua conta
       content_retention:
+        danger_zone: Zona de perigo
         preamble: Controle como o conteúdo gerado pelos utilizadores é armazenado no Mastodon.
         title: Retenção de conteúdo
       default_noindex:
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index 29e525b2c..a1406b1ad 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -240,6 +240,7 @@ ar:
         backups_retention_period: فترة الاحتفاظ بأرشيف المستخدم
         bootstrap_timeline_accounts: أوصي دائما بهذه الحسابات للمستخدمين الجدد
         closed_registrations_message: رسالة مخصصة عندما يكون التسجيل غير متاح
+        content_cache_retention_period: مدة الاحتفاظ بالمحتوى البعيد
         custom_css: سي أس أس CSS مخصص
         mascot: جالب حظ مخصص (قديم)
         media_cache_retention_period: مدة الاحتفاظ بالتخزين المؤقت للوسائط
diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml
index b07ed8b8b..841745dbc 100644
--- a/config/locales/simple_form.he.yml
+++ b/config/locales/simple_form.he.yml
@@ -77,10 +77,13 @@ he:
           warn: הסתר את התוכן המסונן מאחורי אזהרה עם כותרת המסנן
       form_admin_settings:
         activity_api_enabled: מספר ההודעות שפורסמו מקומית, משתמשים פעילים, והרשמות חדשות בדליים שבועיים
+        backups_retention_period: למשתמשים יש יכולת לבקש ארכיון של הודעותיהם להורדה מאוחר יותר. כאשר נבחר ערך חיובי, הארכיונים הללו ימחקו מאחסון לאחר מספר הימים שצוינו.
         bootstrap_timeline_accounts: חשבונות אלו יוצמדו לראש רשימת המלצות המעקב של משתמשים חדשים.
         closed_registrations_message: להציג כאשר הרשמות חדשות אינן מאופשרות
+        content_cache_retention_period: כל ההודעות משרתים אחרים (לרבות הדהודים ותגובות) ימחקו אחרי מספר ימים, ללא קשר לאינטראקציה של משתמשים מקומיים איתם. בכלל זה הודעות שהמתשתמשים המקומיים סימנו בסימניה או חיבוב. איזכורים פרטיים ("דיאם") בין משתמשים בין שרתים שונים יאבדו גם הם ולא תהיה אפשרות לשחזרם. השימוש באפשרות הזו מיועד לשרתים עם ייעוד מיוחד ושובר את ציפיותיהם של רב המשתמשים כאשר האפשרות מופעלת בשרת לשימוש כללי.
         custom_css: ניתן לבחור ערכות סגנון אישיות בגרסת הדפדפן של מסטודון.
         mascot: בחירת ציור למנשק הווב המתקדם.
+        media_cache_retention_period: קבצי מדיה מהודעות שהגיעו משרתים רחוקים נשמרות על השרת שלך. כאשר יבחר פה מספר חיובי, המדיה תמחק לאחר מספר ימים כמצוין. אם המידע יבוקש שוב לאחר שנמחק, הוא יורד מחדש, אם המידע עדיין זמין בצד הרחוק. עקב מגבלות על תכיפות שליפת כרטיסי קדימון מאתרים מרוחקים, מומלץ לכוון את הערך ל־14 יום לפחות, או שכרטיסי קדימונים לא יעודכנו לפי דרישה לפני חלוף חלון הזמן הזה.
         peers_api_enabled: רשימת השרתים ששרת זה פגש בפדיוורס. לא כולל מידע לגבי קשר ישיר עם שרת נתון, אלא רק שידוע לשרת זה על קיומו. מידע זה משמש שירותים האוספים סטטיסטיקות כלליות על הפדרציה.
         profile_directory: ספריית הפרופילים מציגה ברשימה את כל המשתמשים שביקשו להיות ניתנים לגילוי.
         require_invite_text: כאשר הרשמות דורשות אישור ידני, הפיכת טקסט ה"מדוע את/ה רוצה להצטרף" להכרחי במקום אופציונלי
diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml
index b5ec14e60..c796cb5fa 100644
--- a/config/locales/simple_form.ia.yml
+++ b/config/locales/simple_form.ia.yml
@@ -90,11 +90,54 @@ ia:
         site_contact_email: Como pote contactar te le personas pro questiones legal o de supporto.
         site_contact_username: Como pote contactar te le personas re Mastodon.
         site_extended_description: Qualcunque information additional que pote esser utile al visitatores e a tu usatores. Pote esser structurate con syntaxe de markdown.
+        site_short_description: Un breve description pro adjutar a univocamente identificar tu servitor. Qui ha exequite illo, proque es illo?
+        site_terms: Usa tu proprie politica de confidentialitate o lassa blanc pro usar le predefinite. Pote esser structurate con syntaxe de markdown.
+        site_title: Como le personas pote referer se a tu servitor in addition su nomine de dominio.
+        status_page_url: URL de un pagina ubi le personas pote vider le stato de iste servitor durante un interruption
+        theme: Thema que le visitatores disconnexe e le nove usatores vide.
+        thumbnail: Un imagine approximativemente 2:1 monstrate al latere del informationes de tu servitor.
+        timeline_preview: Le visitatores disconnexe potera navigar per le plus recente messages public disponibile sur le 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:
+        data: File CSV exportate ab un altere servitor de Mastodon
+      invite_request:
+        text: Isto nos adjutara a revider tu application
       ip_block:
+        comment: Optional. Memorar perque tu ha addite iste regula.
+        expires_in: Le adresses IP es un ressource finite, illos es aliquando compartite e sovente cambia manos. Pro iste ration, blocadas de IP indefinite non es recommendate.
+        ip: Inserer un adresse IPv4 o IPv6. Tu pote blocar campos integre per le syntaxe CIDR. Sia attente pro non disconnecter te!
         severities:
           no_access: Blocar accesso a tote le ressources
+          sign_up_block: Nove inscriptiones non sera possibile
+          sign_up_requires_approval: Nove inscriptiones requirera tu approbation
+        severity: Seliger que evenira con requestas ab iste IP
+      rule:
+        hint: Optional. Forni altere detalios re le regula
+        text: Describe un regula o requisito pro usatores sur iste servitor. Tenta de mantener lo breve e simple
+      sessions:
+        otp: 'Insere le codice a duo factores generate per le app de tu telephono o usa un de tu codices de recuperation:'
+        webauthn: Si illo es un clave USB cura de inserer lo e, si necessari, tocca lo.
+      settings:
+        indexable: Tu pagina del profilo pote apparer in resultatos del recerca sur Google, Bing, e alteros.
+        show_application: Tu sempre sera capace totevia de vider que app publicava tu message.
+      tag:
+        name: Tu pote solo cambiar le inveloppe del litteras, per exemplo, pro render lo plus legibile
+      user:
+        chosen_languages: Si marcate, solo le messages in le linguas seligite sera monstrate in chronologias public
+        role: Le rolo controla que permissos ha le usator
+      user_role:
+        color: Color a esser usate pro le rolo in omne parte del UI, como RGB in formato hexadecimal
+        highlighted: Iste rende le rolo publicamente visibile
+        name: Nomine public del rolo, si rolo es definite a esser monstrate como insignia
+        permissions_as_keys: Usatores con iste rolo habera accesso a...
+        position: Rolo superior decide resolution de conflicto in certe situationes. Certe actiones pote solo esser exequite sur rolos con un prioritate inferior
       webhook:
         events: Selige le eventos a inviar
+        template: Compone tu proprie carga utile JSON per interpolation de variabile. Lassar blanc pro JSON predefinite.
         url: Ubi le eventos essera inviate
     labels:
       account:
@@ -105,10 +148,15 @@ ia:
         indexable: Includer messages public in le resultatos de recerca
         show_collections: Monstrar sequites e sequitores in le profilo
         unlocked: Acceptar automaticamente nove sequitores
+      account_alias:
+        acct: Pseudonymo del vetere conto
+      account_migration:
+        acct: Pseudonymo del nove conto
       account_warning_preset:
         text: Texto predefinite
         title: Titulo
       admin_account_action:
+        include_statuses: Includer messages reportate in le email
         send_email_notification: Notificar le usator per e-mail
         text: Advertimento personalisate
         type: Action
@@ -118,12 +166,19 @@ ia:
           sensitive: Sensibile
           silence: Limitar
           suspend: Suspender
+        warning_preset_id: Usar un aviso predefinite
       announcement:
+        all_day: Evento quotidian
+        ends_at: Fin del evento
+        scheduled_at: Planificar publication
         starts_at: Initio del evento
         text: Annuncio
+      appeal:
+        text: Explicar perque iste decision deberea esser revertite
       defaults:
         autofollow: Invitar a sequer tu conto
         avatar: Pictura de profilo
+        bot: Isto es un conto automatisate
         chosen_languages: Filtrar linguas
         confirm_new_password: Confirmar nove contrasigno
         confirm_password: Confirmar contrasigno
@@ -137,6 +192,7 @@ ia:
         header: Imagine titulo
         honeypot: "%{label} (non compilar)"
         inbox_url: URL del cassa de ingresso de repetitor
+        irreversible: Declinar in vice que celar
         locale: Lingua de interfacie
         max_uses: Numero max de usos
         new_password: Nove contrasigno
@@ -145,15 +201,27 @@ ia:
         password: Contrasigno
         phrase: Parola o phrase clave
         setting_advanced_layout: Activar le interfacie web avantiate
+        setting_aggregate_reblogs: Gruppa promotiones in classificationes temporal
         setting_always_send_emails: Sempre inviar notificationes per e-mail
+        setting_auto_play_gif: Auto-reproduce GIFs animate
+        setting_boost_modal: Monstrar dialogo de confirmation ante promover
         setting_default_language: Lingua de publication
+        setting_default_privacy: Confidentialitate del messages
+        setting_default_sensitive: Sempre marcar le medios cmo sensbile
+        setting_delete_modal: Monstrar le dialogo de confirmation ante deler un message
+        setting_disable_swiping: Disactivar le movimentos per glissamento
         setting_display_media: Visualisation de medios
         setting_display_media_default: Predefinite
         setting_display_media_hide_all: Celar toto
         setting_display_media_show_all: Monstrar toto
+        setting_expand_spoilers: Sempre expander messages marcate con avisos de contento
+        setting_hide_network: Cela tu rete social
+        setting_reduce_motion: Reducer movimento in animationes
         setting_system_font_ui: Usar typo de litteras predefinite del systema
         setting_theme: Thema de sito
         setting_trends: Monstrar le tendentias de hodie
+        setting_unfollow_modal: Monstrar dialogo de confirmation ante cessar de sequer alcuno
+        setting_use_blurhash: Monstrar imagines degradate multicolor pro medios celate
         setting_use_pending_items: Modo lente
         severity: Severitate
         sign_in_token_attempt: Codice de securitate
@@ -162,6 +230,8 @@ ia:
         username: Nomine de usator
         username_or_email: Nomine de usator o e-mail
         whole_word: Parola integre
+      email_domain_block:
+        with_dns_records: Includer registrationes MX e IPs del dominio
       featured_tag:
         name: Hashtag
       filters:
@@ -169,55 +239,98 @@ ia:
           hide: Celar completemente
           warn: Celar con un advertimento
       form_admin_settings:
+        activity_api_enabled: Publicar statisticas aggregate re le activitate de usator in le API
+        backups_retention_period: Periodo de retention del archivo de usator
         bootstrap_timeline_accounts: Recommenda sempre iste contos a nove usatores
+        closed_registrations_message: Message personalisate quando le inscriptiones non es disponibile
+        content_cache_retention_period: Periodo de retention del contento remote
         custom_css: CSS personalisate
+        mascot: Personalisar le mascotte (hereditage)
+        media_cache_retention_period: Periodo de retention del cache multimedial
+        peers_api_enabled: Publicar le lista de servitores discoperite in le API
         profile_directory: Activar directorio de profilos
+        registrations_mode: Qui pote inscriber se
+        require_invite_text: Requirer un ration pro junger se
+        show_domain_blocks: Monstrar le blocadas de dominio
+        show_domain_blocks_rationale: Monstrar perque le dominios era blocate
         site_contact_email: Adresse de e-mail de contacto
         site_contact_username: Nomine de usator de contacto
+        site_extended_description: Description extense
         site_short_description: Description de servitor
         site_terms: Politica de confidentialitate
         site_title: Nomine de servitor
         status_page_url: URL del pagina de stato
         theme: Thema predefinite
         thumbnail: Miniatura de servitor
+        timeline_preview: Permitter accesso non authenticate a chronologias public
+        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 non-sequaces
+        must_be_following: Blocar notificationes de gente que tu non sequer
+        must_be_following_dm: Blocar messages directe de gente que tu non seque
       invite:
         comment: Commento
+      invite_request:
+        text: Perque vole tu junger te?
       ip_block:
         comment: Commento
         ip: IP
         severities:
           no_access: Blocar le accesso
+          sign_up_block: Blocar inscriptiones
+          sign_up_requires_approval: Limitar inscriptiones
         severity: Regula
       notification_emails:
+        appeal: Alcuno appella un decision de moderator
         digest: Inviar emails compendio
+        favourite: Alcuno appreciava tu message
+        follow: Alcuno te sequeva
+        follow_request: Alcuno requireva de sequer te
+        mention: Alcuno te mentionava
+        pending_account: Nove conto besonia de revision
+        reblog: Alcuno promoveva tu message
+        report: Un nove reporto es inviate
         software_updates:
           all: Notificar sur tote le actualisationes
           critical: Notificar solmente sur actualisationes critic
           label: Un nove version de Mastodon es disponibile
           none: Nunquam notificar sur actualisationes (non recommendate)
+          patch: Notificar re actualisationes de correction de bug
+        trending_tag: Un nove tendentia require revision
       rule:
         hint: Information additional
         text: Regula
       settings:
         indexable: Includer pagina de profilo in le motores de recerca
+        show_application: Monstrar ab que app tu ha inviate un message
       tag:
         listable: Permitter a iste hashtag apparer in le recercas e suggestiones
         name: Hashtag
+        trendable: Permitter a iste hashtag de sub tendentias
         usable: Permitter al messages usar iste hashtag
       user:
         role: Rolo
         time_zone: Fuso horari
       user_role:
+        color: Color de insignia
+        highlighted: Monstrar le rolo como insignia sur le profilos de usator
         name: Nomine
         permissions_as_keys: Permissiones
         position: Prioritate
       webhook:
         events: Eventos activate
+        template: Modello de carga utile
+        url: URL de extremo
     'no': 'No'
     not_recommended: Non recommendate
+    overridden: Supplantate
     recommended: Recommendate
     required:
       mark: "*"
       text: requirite
+    title:
+      sessions:
+        webauthn: Usa un de tu claves de securitate pro acceder
     'yes': Si
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 5e35bc14c..caf4c5429 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -77,10 +77,13 @@ ja:
           warn: フィルタに一致した投稿を非表示にし、フィルタのタイトルを含む警告を表示します
       form_admin_settings:
         activity_api_enabled: 週単位でローカルで公開された投稿数、アクティブユーザー数、新規登録者数を表示します
+        backups_retention_period: ユーザーには、後でダウンロードするために投稿のアーカイブを生成する機能があります。正の値に設定すると、これらのアーカイブは指定された日数後に自動的にストレージから削除されます。
         bootstrap_timeline_accounts: これらのアカウントは、新しいユーザー向けのおすすめユーザーの一番上にピン留めされます。
         closed_registrations_message: アカウント作成を停止している時に表示されます
+        content_cache_retention_period: 他のサーバーからのすべての投稿(ブーストや返信を含む)は、指定された日数が経過すると、ローカルユーザーとのやりとりに関係なく削除されます。これには、ローカルユーザーがブックマークやお気に入りとして登録した投稿も含まれます。異なるサーバーのユーザー間の非公開な変身も失われ、復元することは不可能です。この設定の使用は特別な目的のインスタンスのためのものであり、一般的な目的のサーバーで使用するした場合、多くのユーザーの期待を裏切ることになります。
         custom_css: ウェブ版のMastodonでカスタムスタイルを適用できます。
         mascot: 上級者向けWebインターフェースのイラストを上書きします。
+        media_cache_retention_period: リモートユーザーが投稿したメディアファイルは、あなたのサーバーにキャッシュされます。正の値を設定すると、メディアは指定した日数後に削除されます。削除後にメディアデータが要求された場合、ソースコンテンツがまだ利用可能であれば、再ダウンロードされます。リンクプレビューカードがサードパーティのサイトを更新する頻度に制限があるため、この値を少なくとも14日に設定することをお勧めします。
         peers_api_enabled: このサーバーが Fediverse で遭遇したドメイン名のリストです。このサーバーが知っているだけで、特定のサーバーと連合しているかのデータは含まれません。これは一般的に Fediverse に関する統計情報を収集するサービスによって使用されます。
         profile_directory: ディレクトリには、掲載する設定をしたすべてのユーザーが一覧表示されます。
         require_invite_text: アカウント登録が承認制の場合、登録の際の申請事由の入力を必須にします
@@ -240,6 +243,7 @@ ja:
         backups_retention_period: ユーザーアーカイブの保持期間
         bootstrap_timeline_accounts: おすすめユーザーに常に表示するアカウント
         closed_registrations_message: アカウント作成を停止している時のカスタムメッセージ
+        content_cache_retention_period: リモートコンテンツの保存期間
         custom_css: カスタムCSS
         mascot: カスタムマスコット(レガシー)
         media_cache_retention_period: メディアキャッシュの保持期間
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index 3292c4828..a26468894 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -77,10 +77,13 @@ pt-PT:
           warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro
       form_admin_settings:
         activity_api_enabled: Contagem, em blocos semanais, de publicações locais, utilizadores ativos e novos registos
+        backups_retention_period: Os utilizadores têm a possibilidade de gerar arquivos das suas mensagens 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 publicações de outros servidores (incluindo boosts 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 publicações em que um utilizador local as tenha marcado como favoritas ou adicionado aos items salvos. 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.
         custom_css: Pode aplicar estilos personalizados na versão web do Mastodon.
         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.
         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.
         require_invite_text: Quando as incrições exigirem aprovação manual, faça o texto "Por que se quer juntar a nós?" da solicitação de convite ser obrigatório, em vez de opcional
@@ -240,6 +243,7 @@ pt-PT:
         backups_retention_period: Período de retenção de arquivos de utilizador
         bootstrap_timeline_accounts: Recomendar sempre estas contas para novos utilizadores
         closed_registrations_message: Mensagem personalizada quando as inscrições não estiverem disponíveis
+        content_cache_retention_period: Período de retenção de conteúdos remotos
         custom_css: CSS personalizado
         mascot: Mascote personalizada (legado)
         media_cache_retention_period: Período de retenção de ficheiros de media em cache
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index a6c930338..d545f2cd3 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -77,10 +77,13 @@ sq:
           warn: Fshihe lëndën e filtruar pas një sinjalizimi që përmend titullin e filtrit
       form_admin_settings:
         activity_api_enabled: Numër postimesh të botuar lokalisht, përdoruesish aktiv dhe regjistrimesh të reja sipas matjesh javore
+        backups_retention_period: Përdorues kanë aftësinë të prodhojnë arkiva të postimeve të tyre për t’i shkarkuar më vonë. Kur i jepet një vlerë pozitive, këto arkiva do të fshihen automatikisht prej depozitës tuaj pas numrit të dhënë të ditëve.
         bootstrap_timeline_accounts: Këto llogari do të fiksohen në krye të rekomandimeve për ndjekje nga përdorues të rinj.
         closed_registrations_message: Shfaqur kur mbyllen dritare regjistrimesh
+        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.
         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.
         peers_api_enabled: Një listë emrash përkatësish që ky shërbyes ka hasur në fedivers. Këtu s’jepen të dhëna nëse jeni i federuar me shërbyesin e dhënë, thjesht tregohet se shërbyesi juaj e njeh. Kjo përdoret nga shërbime që mbledhin statistika mbi federimin në kuptimin e përgjithshëm.
         profile_directory: Drejtoria e profileve paraqet krejt përdoruesit që kanë zgjedhur të jenë të zbulueshëm.
         require_invite_text: Kur regjistrimet lypin miratim dorazi, bëje tekstin “Përse doni të bëheni pjesë?” të detyrueshëm, në vend se opsional
@@ -240,6 +243,7 @@ sq:
         backups_retention_period: Periudhë mbajtjeje arkivash përdoruesish
         bootstrap_timeline_accounts: Rekomandoju përherë këto llogari përdoruesve të rinj
         closed_registrations_message: Mesazh vetjak për pamundësi regjistrimesh të reja
+        content_cache_retention_period: Periudhë mbajtjeje lënde të largët
         custom_css: CSS Vetjake
         mascot: Simbol vetjak (e dikurshme)
         media_cache_retention_period: Periudhë mbajtjeje lënde media
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index bfc2d2e6b..e68642c2f 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -77,8 +77,10 @@ th:
           warn: ซ่อนเนื้อหาที่กรองอยู่หลังคำเตือนที่กล่าวถึงชื่อเรื่องของตัวกรอง
       form_admin_settings:
         activity_api_enabled: จำนวนโพสต์ที่เผยแพร่ในเซิร์ฟเวอร์, ผู้ใช้ที่ใช้งานอยู่ และการลงทะเบียนใหม่ในบักเก็ตรายสัปดาห์
+        backups_retention_period: ผู้ใช้มีความสามารถในการสร้างการเก็บถาวรของโพสต์ของเขาเพื่อดาวน์โหลดในภายหลัง เมื่อตั้งเป็นค่าบวก จะลบการเก็บถาวรเหล่านี้ออกจากที่เก็บข้อมูลของคุณโดยอัตโนมัติหลังจากจำนวนวันที่ระบุ
         bootstrap_timeline_accounts: จะปักหมุดบัญชีเหล่านี้ไว้ด้านบนสุดของคำแนะนำการติดตามของผู้ใช้ใหม่
         closed_registrations_message: แสดงเมื่อมีการปิดการลงทะเบียน
+        content_cache_retention_period: จะลบโพสต์ทั้งหมดจากเซิร์ฟเวอร์อื่น ๆ (รวมถึงการดันและการตอบกลับ) หลังจากจำนวนวันที่ระบุ โดยไม่คำนึงถึงการโต้ตอบใด ๆ ของผู้ใช้ในเซิร์ฟเวอร์กับโพสต์เหล่านั้น สิ่งนี้รวมถึงโพสต์ที่ผู้ใช้ในเซิร์ฟเวอร์ได้ทำเครื่องหมายโพสต์ว่าเป็นที่คั่นหน้าหรือรายการโปรด การกล่าวถึงแบบส่วนตัวระหว่างผู้ใช้จากอินสแตนซ์ที่แตกต่างกันจะหายไปและไม่สามารถคืนค่าได้เช่นกัน การใช้การตั้งค่านี้มีไว้สำหรับอินสแตนซ์ที่มีวัตถุประสงค์พิเศษและทำลายความคาดหวังของผู้ใช้จำนวนมากเมื่อนำไปใช้สำหรับการใช้งานที่มีวัตถุประสงค์ทั่วไป
         custom_css: คุณสามารถนำไปใช้ลักษณะที่กำหนดเองใน Mastodon รุ่นเว็บ
         mascot: เขียนทับภาพประกอบในส่วนติดต่อเว็บขั้นสูง
         peers_api_enabled: รายการชื่อโดเมนที่เซิร์ฟเวอร์นี้พบในจักรวาลสหพันธ์ ไม่มีข้อมูลรวมอยู่ที่นี่เกี่ยวกับว่าคุณติดต่อกับเซิร์ฟเวอร์ที่กำหนดหรือไม่ เพียงแค่ว่าเซิร์ฟเวอร์ของคุณทราบเกี่ยวกับเซิร์ฟเวอร์ที่กำหนด มีการใช้สิ่งนี้โดยบริการที่เก็บรวบรวมสถิติในการติดต่อกับภายนอกในความหมายทั่วไป
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 400059770..78e7bdb25 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -524,6 +524,7 @@ sk:
           many: "%{count} poznámok"
           one: "%{count} poznámka"
           other: "%{count} poznámky"
+      action_log: Denník auditu
       action_taken_by: Zákrok vykonal/a
       actions:
         suspend_description_html: Tento účet a všetok jeho obsah bude nedostupný a nakoniec zmazaný, interaktovať s ním bude nemožné. Zvrátiteľné v rámci 30 dní. Uzatvára všetky hlásenia voči tomuto účtu.
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index ff23e6484..6c26511ad 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -779,6 +779,7 @@ sl:
         desc_html: To se zanaša na zunanje skripte hCaptcha in lahko predstavlja tveganje za varnost in zasebnost. Poleg tega <strong>to lahko nekaterim ljudem (posebno invalidom) občutno oteži dostopnost registracijskega postopka</strong>. Zato svetujemo, da razmislite o drugih ukrepih, kot je na primer registracija na podlagi odobritve ali povabila.
         title: Od novih uporabnikov zahtevaj reševanje CAPTCHA za potrditev računov
       content_retention:
+        danger_zone: Območje nevarnosti
         preamble: Nazdor nad hrambo vsebine uporabnikov v Mastodonu.
         title: Hramba vsebin
       default_noindex:
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index dcacb46bf..8319cfcae 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -748,6 +748,7 @@ sq:
         desc_html: Kjo bazohet në programthe të jashtëm prej hCaptcha, çka mund të përbëjë një shqetësim për sigurinë dhe privatësinë. Veç kësaj, <strong>kjo mund ta bëjë procesin e regjistrimit në shkallë të madhe më pak të përdorshëm për disa persona (veçanërisht ata me paaftësi)</strong>. Për këto arsye, ju lutemi, shihni mundësinë e masave alternative, fjala vjen, bazuar në miratim, ose regjistrim vetëm me ftesa.
         title: Kërko prej përdoruesve të rinj të zgjidhin një CAPTCHA, si ripohim të llogarisë të tyre
       content_retention:
+        danger_zone: Zonë rreziku
         preamble: Kontrolloni se si depozitohen në Mastodon lënda e prodhuar nga përdoruesit.
         title: Mbajtje lënde
       default_noindex:
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 0d7483d79..8a001d875 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -1837,6 +1837,7 @@ th:
       explanation: นี่คือเคล็ดลับบางส่วนที่จะช่วยให้คุณเริ่มต้นใช้งาน
       feature_action: เรียนรู้เพิ่มเติม
       feature_audience: Mastodon มีความพิเศษที่ให้คุณจัดการผู้รับสารของคุณได้โดยไม่มีตัวกลาง นอกจากนี้ การติดตั้ง Mastodon บนโครงสร้างพื้นฐานของคุณจะทำให้คุณสามารถติดตาม (และติดตามโดย) เซิร์ฟเวอร์ Mastodon แห่งไหนก็ได้ที่ทำงานอยู่ โดยไม่มีใครสามารถควบคุมได้นอกจากคุณ
+      feature_audience_title: สร้างผู้ชมของคุณด้วยความมั่นใจ
       follow_action: ติดตาม
       follow_step: การติดตามผู้คนที่น่าสนใจคือสิ่งที่ Mastodon ให้ความสำคัญ
       follow_title: ปรับแต่งฟีดหน้าแรกของคุณ

From 86f17e4b32eb5da3dfcd82c4be72d529d8a72565 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 10:46:17 +0200
Subject: [PATCH 057/215] Update devDependencies (non-major) (#30185)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 53 +++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 39 insertions(+), 14 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index ddc789b5f..26ffbcee1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2212,16 +2212,37 @@ __metadata:
   linkType: hard
 
 "@formatjs/cli@npm:^6.1.1":
-  version: 6.2.9
-  resolution: "@formatjs/cli@npm:6.2.9"
+  version: 6.2.10
+  resolution: "@formatjs/cli@npm:6.2.10"
   peerDependencies:
+    "@glimmer/env": ^0.1.7
+    "@glimmer/reference": ^0.91.1
+    "@glimmer/syntax": ^0.91.1
+    "@glimmer/validator": ^0.91.1
+    "@vue/compiler-core": ^3.4.0
+    content-tag: ^2.0.1
+    ember-template-recast: ^6.1.4
     vue: ^3.4.0
   peerDependenciesMeta:
+    "@glimmer/env":
+      optional: true
+    "@glimmer/reference":
+      optional: true
+    "@glimmer/syntax":
+      optional: true
+    "@glimmer/validator":
+      optional: true
+    "@vue/compiler-core":
+      optional: true
+    content-tag:
+      optional: true
+    ember-template-recast:
+      optional: true
     vue:
       optional: true
   bin:
     formatjs: bin/formatjs
-  checksum: 10c0/498383bcdca7f8f8a748c1151be17392f71eb1861f6a23bc714280533167cba7cdc35a470a380113f6111236e721ff43cbee7b084939dac67b6a5d9b04c0587c
+  checksum: 10c0/34b1b0b3be25d945111c1f57913f50da7308ecd05501a27eaca210a774eb50c616b5706ba796d37ffa223ac4c5cddd5f36fe0ca8d31ad8c8ade79cdd497ccfb9
   languageName: node
   linkType: hard
 
@@ -3334,8 +3355,8 @@ __metadata:
   linkType: hard
 
 "@testing-library/jest-dom@npm:^6.0.0":
-  version: 6.4.2
-  resolution: "@testing-library/jest-dom@npm:6.4.2"
+  version: 6.4.5
+  resolution: "@testing-library/jest-dom@npm:6.4.5"
   dependencies:
     "@adobe/css-tools": "npm:^4.3.2"
     "@babel/runtime": "npm:^7.9.2"
@@ -3343,7 +3364,7 @@ __metadata:
     chalk: "npm:^3.0.0"
     css.escape: "npm:^1.5.1"
     dom-accessibility-api: "npm:^0.6.3"
-    lodash: "npm:^4.17.15"
+    lodash: "npm:^4.17.21"
     redent: "npm:^3.0.0"
   peerDependencies:
     "@jest/globals": ">= 28"
@@ -3362,21 +3383,25 @@ __metadata:
       optional: true
     vitest:
       optional: true
-  checksum: 10c0/e7eba527b34ce30cde94424d2ec685bdfed51daaafb7df9b68b51aec6052e99a50c8bfe654612dacdf857a1eb81d68cf294fc89de558ee3a992bf7a6019fffcc
+  checksum: 10c0/4cfdd44e2abab2b9d399c47cbfe686729bb65160d7df0f9e2329aaaea7702f6e852a9eefb29b468f00c1e5a5274b684f8cac76959d33299dfa909ba007ea191d
   languageName: node
   linkType: hard
 
 "@testing-library/react@npm:^15.0.0":
-  version: 15.0.5
-  resolution: "@testing-library/react@npm:15.0.5"
+  version: 15.0.6
+  resolution: "@testing-library/react@npm:15.0.6"
   dependencies:
     "@babel/runtime": "npm:^7.12.5"
     "@testing-library/dom": "npm:^10.0.0"
     "@types/react-dom": "npm:^18.0.0"
   peerDependencies:
+    "@types/react": ^18.0.0
     react: ^18.0.0
     react-dom: ^18.0.0
-  checksum: 10c0/8759cc8e7e6b4d8964f151d8872ea3c91b6ef6d8fb3b9116fae53350b9a6b29e5ad45b18408c22525924d050263f7ea77cd17ca803918759f22a760f68a42227
+  peerDependenciesMeta:
+    "@types/react":
+      optional: true
+  checksum: 10c0/3705a2272f929f2f848f5d7e6ac9829bf7ecc1725a35733ffae7e7a261d4bdab470b080558e8544edb1f9ba25db9fbc4232527df9b4ec6ab6ae4462a902a7f95
   languageName: node
   linkType: hard
 
@@ -11403,7 +11428,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21":
+"lodash@npm:^4.17.10, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.20, lodash@npm:^4.17.21":
   version: 4.17.21
   resolution: "lodash@npm:4.17.21"
   checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c
@@ -16438,8 +16463,8 @@ __metadata:
   linkType: hard
 
 "stylelint@npm:^16.0.2":
-  version: 16.4.0
-  resolution: "stylelint@npm:16.4.0"
+  version: 16.5.0
+  resolution: "stylelint@npm:16.5.0"
   dependencies:
     "@csstools/css-parser-algorithms": "npm:^2.6.1"
     "@csstools/css-tokenizer": "npm:^2.2.4"
@@ -16482,7 +16507,7 @@ __metadata:
     write-file-atomic: "npm:^5.0.1"
   bin:
     stylelint: bin/stylelint.mjs
-  checksum: 10c0/7e603a0d88732180b60528c9f2edfca7fdf8c966f42c260af16131854c3acb5acfa30403b1f4fd72cd1470eb9ba625ca4de84e8cb379942df54127c55afc1288
+  checksum: 10c0/9281693ff6c1918e07fdcf7a950531f79678a28261a0d5bd36ca2fcf524e53d7305158d20ba890f5dd01c0ff90c09a13453dce2fe6887f4c157d8c2c0acf3666
   languageName: node
   linkType: hard
 

From 00c34070ae3679116f4962b5608b53fa95a61e1b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 10:46:22 +0200
Subject: [PATCH 058/215] Update eslint (non-major) (#30186)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 102 +++++++++++++++++++++++++++---------------------------
 1 file changed, 51 insertions(+), 51 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 26ffbcee1..785df92e5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4107,14 +4107,14 @@ __metadata:
   linkType: hard
 
 "@typescript-eslint/eslint-plugin@npm:^7.0.0":
-  version: 7.7.1
-  resolution: "@typescript-eslint/eslint-plugin@npm:7.7.1"
+  version: 7.8.0
+  resolution: "@typescript-eslint/eslint-plugin@npm:7.8.0"
   dependencies:
     "@eslint-community/regexpp": "npm:^4.10.0"
-    "@typescript-eslint/scope-manager": "npm:7.7.1"
-    "@typescript-eslint/type-utils": "npm:7.7.1"
-    "@typescript-eslint/utils": "npm:7.7.1"
-    "@typescript-eslint/visitor-keys": "npm:7.7.1"
+    "@typescript-eslint/scope-manager": "npm:7.8.0"
+    "@typescript-eslint/type-utils": "npm:7.8.0"
+    "@typescript-eslint/utils": "npm:7.8.0"
+    "@typescript-eslint/visitor-keys": "npm:7.8.0"
     debug: "npm:^4.3.4"
     graphemer: "npm:^1.4.0"
     ignore: "npm:^5.3.1"
@@ -4127,25 +4127,25 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/11a085240e7daf4bdeb011aa53ac7cfeea6263c60d53607823f5c314eb5c9d559b28fce0d6686acb9702ee3d0cb0406534fafae61163e5a903eaf818c48194ad
+  checksum: 10c0/37ca22620d1834ff0baa28fa4b8fd92039a3903cb95748353de32d56bae2a81ce50d1bbaed27487eebc884e0a0f9387fcb0f1647593e4e6df5111ef674afa9f0
   languageName: node
   linkType: hard
 
 "@typescript-eslint/parser@npm:^7.0.0":
-  version: 7.7.1
-  resolution: "@typescript-eslint/parser@npm:7.7.1"
+  version: 7.8.0
+  resolution: "@typescript-eslint/parser@npm:7.8.0"
   dependencies:
-    "@typescript-eslint/scope-manager": "npm:7.7.1"
-    "@typescript-eslint/types": "npm:7.7.1"
-    "@typescript-eslint/typescript-estree": "npm:7.7.1"
-    "@typescript-eslint/visitor-keys": "npm:7.7.1"
+    "@typescript-eslint/scope-manager": "npm:7.8.0"
+    "@typescript-eslint/types": "npm:7.8.0"
+    "@typescript-eslint/typescript-estree": "npm:7.8.0"
+    "@typescript-eslint/visitor-keys": "npm:7.8.0"
     debug: "npm:^4.3.4"
   peerDependencies:
     eslint: ^8.56.0
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/ace43eeb8123bbee61e936650e1d57a2cf70f2030870c6dcad8602fce3f7cdf2cce350121dbbc66cffd60bac36652f426a1c5293c45ed28998b90cd95673b5c9
+  checksum: 10c0/0dd994c1b31b810c25e1b755b8d352debb7bf21a31f9a91acaec34acf4e471320bcceaa67cf64c110c0b8f5fac10a037dbabac6ec423e17adf037e59a7bce9c1
   languageName: node
   linkType: hard
 
@@ -4159,22 +4159,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/scope-manager@npm:7.7.1":
-  version: 7.7.1
-  resolution: "@typescript-eslint/scope-manager@npm:7.7.1"
+"@typescript-eslint/scope-manager@npm:7.8.0":
+  version: 7.8.0
+  resolution: "@typescript-eslint/scope-manager@npm:7.8.0"
   dependencies:
-    "@typescript-eslint/types": "npm:7.7.1"
-    "@typescript-eslint/visitor-keys": "npm:7.7.1"
-  checksum: 10c0/4032da8fce8922044a6b659c8435ba203377778d5b7de6a5572c1172f2e3cf8ddd890a0f9e083c5d5315a9c2dba323707528ee4ad3cc1be2bd334de2527ef5cb
+    "@typescript-eslint/types": "npm:7.8.0"
+    "@typescript-eslint/visitor-keys": "npm:7.8.0"
+  checksum: 10c0/c253b98e96d4bf0375f473ca2c4d081726f1fd926cdfa65ee14c9ee99cca8eddb763b2d238ac365daa7246bef21b0af38180d04e56e9df7443c0e6f8474d097c
   languageName: node
   linkType: hard
 
-"@typescript-eslint/type-utils@npm:7.7.1":
-  version: 7.7.1
-  resolution: "@typescript-eslint/type-utils@npm:7.7.1"
+"@typescript-eslint/type-utils@npm:7.8.0":
+  version: 7.8.0
+  resolution: "@typescript-eslint/type-utils@npm:7.8.0"
   dependencies:
-    "@typescript-eslint/typescript-estree": "npm:7.7.1"
-    "@typescript-eslint/utils": "npm:7.7.1"
+    "@typescript-eslint/typescript-estree": "npm:7.8.0"
+    "@typescript-eslint/utils": "npm:7.8.0"
     debug: "npm:^4.3.4"
     ts-api-utils: "npm:^1.3.0"
   peerDependencies:
@@ -4182,7 +4182,7 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/bd083c4106e207aa8c2a71251eca52d23c7ea905399b8c62004f3bb1e85b9c88d601db9dcecae88beef0f8362d53450bb2721aab353ee731c1665496fea3fbda
+  checksum: 10c0/00f6315626b64f7dbc1f7fba6f365321bb8d34141ed77545b2a07970e59a81dbdf768c1e024225ea00953750d74409ddd8a16782fc4a39261e507c04192dacab
   languageName: node
   linkType: hard
 
@@ -4193,10 +4193,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/types@npm:7.7.1":
-  version: 7.7.1
-  resolution: "@typescript-eslint/types@npm:7.7.1"
-  checksum: 10c0/7d240503d9d0b12d68c8204167690609f02ededb77dcb035c1c8b932da08cf43553829c29a5f7889824a7337463c300343bc5abe532479726d4c83443a7e2704
+"@typescript-eslint/types@npm:7.8.0":
+  version: 7.8.0
+  resolution: "@typescript-eslint/types@npm:7.8.0"
+  checksum: 10c0/b2fdbfc21957bfa46f7d8809b607ad8c8b67c51821d899064d09392edc12f28b2318a044f0cd5d523d782e84e8f0558778877944964cf38e139f88790cf9d466
   languageName: node
   linkType: hard
 
@@ -4219,12 +4219,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/typescript-estree@npm:7.7.1":
-  version: 7.7.1
-  resolution: "@typescript-eslint/typescript-estree@npm:7.7.1"
+"@typescript-eslint/typescript-estree@npm:7.8.0":
+  version: 7.8.0
+  resolution: "@typescript-eslint/typescript-estree@npm:7.8.0"
   dependencies:
-    "@typescript-eslint/types": "npm:7.7.1"
-    "@typescript-eslint/visitor-keys": "npm:7.7.1"
+    "@typescript-eslint/types": "npm:7.8.0"
+    "@typescript-eslint/visitor-keys": "npm:7.8.0"
     debug: "npm:^4.3.4"
     globby: "npm:^11.1.0"
     is-glob: "npm:^4.0.3"
@@ -4234,24 +4234,24 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/c6b32bd96fd13b9da0a30de01935066f7505f6214f5759e3cd019f7d1852f7bf19358765f62e51de72be47647656aa0e8f07ac0ab316c4149a4e6bd1dd12cbb6
+  checksum: 10c0/1690b62679685073dcb0f62499f0b52b445b37ae6e12d02aa4acbafe3fb023cf999b01f714b6282e88f84fd934fe3e2eefb21a64455d19c348d22bbc68ca8e47
   languageName: node
   linkType: hard
 
-"@typescript-eslint/utils@npm:7.7.1":
-  version: 7.7.1
-  resolution: "@typescript-eslint/utils@npm:7.7.1"
+"@typescript-eslint/utils@npm:7.8.0":
+  version: 7.8.0
+  resolution: "@typescript-eslint/utils@npm:7.8.0"
   dependencies:
     "@eslint-community/eslint-utils": "npm:^4.4.0"
     "@types/json-schema": "npm:^7.0.15"
     "@types/semver": "npm:^7.5.8"
-    "@typescript-eslint/scope-manager": "npm:7.7.1"
-    "@typescript-eslint/types": "npm:7.7.1"
-    "@typescript-eslint/typescript-estree": "npm:7.7.1"
+    "@typescript-eslint/scope-manager": "npm:7.8.0"
+    "@typescript-eslint/types": "npm:7.8.0"
+    "@typescript-eslint/typescript-estree": "npm:7.8.0"
     semver: "npm:^7.6.0"
   peerDependencies:
     eslint: ^8.56.0
-  checksum: 10c0/0986b8c297d6bfdbd2ac8cd3bcf447ef9b934e2dae536771d3368a5c284a0b16c0ea041f82aa100c48d05acc33198e1a3d9d721d3319ae80abba0f5e69c21633
+  checksum: 10c0/31fb58388d15b082eb7bd5bce889cc11617aa1131dfc6950471541b3df64c82d1c052e2cccc230ca4ae80456d4f63a3e5dccb79899a8f3211ce36c089b7d7640
   languageName: node
   linkType: hard
 
@@ -4282,13 +4282,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/visitor-keys@npm:7.7.1":
-  version: 7.7.1
-  resolution: "@typescript-eslint/visitor-keys@npm:7.7.1"
+"@typescript-eslint/visitor-keys@npm:7.8.0":
+  version: 7.8.0
+  resolution: "@typescript-eslint/visitor-keys@npm:7.8.0"
   dependencies:
-    "@typescript-eslint/types": "npm:7.7.1"
+    "@typescript-eslint/types": "npm:7.8.0"
     eslint-visitor-keys: "npm:^3.4.3"
-  checksum: 10c0/19cbd14ac9a234d847f457cbd880cbd98b83c331a46d2dc2d8c0e6cb54ce6159552f6dd2f7236035be1a71f13f48df4a2aa09e70ad1f1e2ff3da7c3622927bd3
+  checksum: 10c0/5892fb5d9c58efaf89adb225f7dbbb77f9363961f2ff420b6b130bdd102dddd7aa8a16c46a5a71c19889d27b781e966119a89270555ea2cb5653a04d8994123d
   languageName: node
   linkType: hard
 
@@ -7772,8 +7772,8 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-formatjs@npm:^4.10.1":
-  version: 4.13.0
-  resolution: "eslint-plugin-formatjs@npm:4.13.0"
+  version: 4.13.1
+  resolution: "eslint-plugin-formatjs@npm:4.13.1"
   dependencies:
     "@formatjs/icu-messageformat-parser": "npm:2.7.6"
     "@formatjs/ts-transformer": "npm:3.13.12"
@@ -7788,7 +7788,7 @@ __metadata:
     unicode-emoji-utils: "npm:^1.2.0"
   peerDependencies:
     eslint: 7 || 8
-  checksum: 10c0/3dbe4ffd3e72d4ce5b14afdcf6dd5db889dd09cb15bc875f29bcc5b49295e0ae4a3eb672ed89ed33f22aacbfe655151398ca4307fd0610508e568a6e4db50aa8
+  checksum: 10c0/ce18141dff84e8fe026127085c1a63279acb3a1bc0b70dc1ddce2fc65bb37d68ccf6d097231428745eda2caea42080e1c80a01a1895803155c15123a01bfeee3
   languageName: node
   linkType: hard
 

From 4f0d18168c39a52250b8be07558675716bf292ee Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 10:46:43 +0200
Subject: [PATCH 059/215] Update DefinitelyTyped types (non-major) (#30184)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 785df92e5..acaab739a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3702,9 +3702,9 @@ __metadata:
   linkType: hard
 
 "@types/lodash@npm:^4.14.195":
-  version: 4.17.0
-  resolution: "@types/lodash@npm:4.17.0"
-  checksum: 10c0/4c5b41c9a6c41e2c05d08499e96f7940bcf194dcfa84356235b630da920c2a5e05f193618cea76006719bec61c76617dff02defa9d29934f9f6a76a49291bd8f
+  version: 4.17.1
+  resolution: "@types/lodash@npm:4.17.1"
+  checksum: 10c0/af2ad8a3c8d7deb170a7ec6e18afc5ae8980576e5f7fe798d8a95a1df7222c15bdf967a25a35879f575a3b64743de00145710ee461a0051e055e94e4fe253f45
   languageName: node
   linkType: hard
 
@@ -3760,13 +3760,13 @@ __metadata:
   linkType: hard
 
 "@types/pg@npm:^8.6.6":
-  version: 8.11.5
-  resolution: "@types/pg@npm:8.11.5"
+  version: 8.11.6
+  resolution: "@types/pg@npm:8.11.6"
   dependencies:
     "@types/node": "npm:*"
     pg-protocol: "npm:*"
     pg-types: "npm:^4.0.1"
-  checksum: 10c0/d64d183bee2df96cd0558231190ff629558e8c0fd3203b880f48a7d34b1eaea528d20c09b57b19c0939f369136e6c6941533592eadd71174be78d1ec0ca5e60e
+  checksum: 10c0/e68e057d9500b25cd776f4fcc547b4880c4f3b0c7b6e03c8a0e5e262b6189dd7a00f4edc8937ffc55a9f6a136a78d7e4a9b6bbe6a46122a95c134f7be66f6842
   languageName: node
   linkType: hard
 
@@ -3820,11 +3820,11 @@ __metadata:
   linkType: hard
 
 "@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.4":
-  version: 18.2.25
-  resolution: "@types/react-dom@npm:18.2.25"
+  version: 18.3.0
+  resolution: "@types/react-dom@npm:18.3.0"
   dependencies:
     "@types/react": "npm:*"
-  checksum: 10c0/87604407eca6884c5b4d4657cb511dc5ba28ea1cfa5d0ce1fc2d659a7ad1b64ae85dcda60e3f010641f9a52a6a60dfcaa6be3b0d0de9d624475052a13dae01f4
+  checksum: 10c0/6c90d2ed72c5a0e440d2c75d99287e4b5df3e7b011838cdc03ae5cd518ab52164d86990e73246b9d812eaf02ec351d74e3b4f5bd325bf341e13bf980392fd53b
   languageName: node
   linkType: hard
 
@@ -3896,11 +3896,11 @@ __metadata:
   linkType: hard
 
 "@types/react-test-renderer@npm:^18.0.0":
-  version: 18.0.7
-  resolution: "@types/react-test-renderer@npm:18.0.7"
+  version: 18.3.0
+  resolution: "@types/react-test-renderer@npm:18.3.0"
   dependencies:
     "@types/react": "npm:*"
-  checksum: 10c0/45cbe963354acee2ab090979d856763c84f59ef7b63477d1fef5d0fd52760b69aa67bbd205fbd3bd36264620fce72c8e407735a9f2009c40ca50da59b0058c34
+  checksum: 10c0/3c9748be52e8e659e7adf91dea6939486463264e6f633bf21c4cb116de18af7bef0595568a1e588160420b2f65289473075dda1cb417c2875df8cf7a09f5d913
   languageName: node
   linkType: hard
 
@@ -3923,12 +3923,12 @@ __metadata:
   linkType: hard
 
 "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7":
-  version: 18.2.79
-  resolution: "@types/react@npm:18.2.79"
+  version: 18.3.1
+  resolution: "@types/react@npm:18.3.1"
   dependencies:
     "@types/prop-types": "npm:*"
     csstype: "npm:^3.0.2"
-  checksum: 10c0/c8a8a005d8830a48cc1ef93c3510c4935a2a03e5557dbecaa8f1038450cbfcb18eb206fa7fba7077d54b8da21faeb25577e897a333392770a7797f625b62c78a
+  checksum: 10c0/18d856c12a4ec93f3cda2d58ef3d77a9480818afd3af895f812896fb82cfca1f35a692ab1add4ce826a4eb58a071624c7d1c8c6c4ccfb81c100d2916dc607614
   languageName: node
   linkType: hard
 

From e5062b713588cbdc7249a65311a2e59a08bf9731 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 6 May 2024 11:52:34 +0200
Subject: [PATCH 060/215] Fix post deletion not being deferred when those are
 part of an account warning (#30163)

---
 app/models/status.rb       |  2 +-
 spec/models/status_spec.rb | 42 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/app/models/status.rb b/app/models/status.rb
index 0bb5c0ce2..72a8d6c40 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -266,7 +266,7 @@ class Status < ApplicationRecord
   end
 
   def reported?
-    @reported ||= Report.where(target_account: account).unresolved.exists?(['? = ANY(status_ids)', id])
+    @reported ||= account.targeted_reports.unresolved.exists?(['? = ANY(status_ids)', id]) || account.strikes.exists?(['? = ANY(status_ids)', id.to_s])
   end
 
   def emojis
diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb
index 284576ced..271cf8690 100644
--- a/spec/models/status_spec.rb
+++ b/spec/models/status_spec.rb
@@ -205,6 +205,48 @@ RSpec.describe Status do
     end
   end
 
+  describe '#reported?' do
+    context 'when the status is not reported' do
+      it 'returns false' do
+        expect(subject.reported?).to be false
+      end
+    end
+
+    context 'when the status is part of an open report' do
+      before do
+        Fabricate(:report, target_account: subject.account, status_ids: [subject.id])
+      end
+
+      it 'returns true' do
+        expect(subject.reported?).to be true
+      end
+    end
+
+    context 'when the status is part of a closed report with an account warning mentioning the account' do
+      before do
+        report = Fabricate(:report, target_account: subject.account, status_ids: [subject.id])
+        report.resolve!(Fabricate(:account))
+        Fabricate(:account_warning, target_account: subject.account, status_ids: [subject.id], report: report)
+      end
+
+      it 'returns true' do
+        expect(subject.reported?).to be true
+      end
+    end
+
+    context 'when the status is part of a closed report with an account warning not mentioning the account' do
+      before do
+        report = Fabricate(:report, target_account: subject.account, status_ids: [subject.id])
+        report.resolve!(Fabricate(:account))
+        Fabricate(:account_warning, target_account: subject.account, report: report)
+      end
+
+      it 'returns false' do
+        expect(subject.reported?).to be false
+      end
+    end
+  end
+
   describe '.mutes_map' do
     subject { described_class.mutes_map([status.conversation.id], account) }
 

From dbaa4ed891f5eb97e74600ddd4e38a9be40f9180 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 6 May 2024 07:50:45 -0400
Subject: [PATCH 061/215] Use `chewy` which relaxes ES version reqs (#30157)

---
 Gemfile.lock                                     | 16 ++++++++--------
 .../system_check/elasticsearch_check_spec.rb     |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 27d858ed0..190888ddb 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -167,9 +167,9 @@ GEM
       activesupport
     cbor (0.5.9.8)
     charlock_holmes (0.7.7)
-    chewy (7.5.1)
+    chewy (7.6.0)
       activesupport (>= 5.2)
-      elasticsearch (>= 7.12.0, < 7.14.0)
+      elasticsearch (>= 7.14.0, < 8)
       elasticsearch-dsl
     chunky_png (1.4.0)
     climate_control (1.2.0)
@@ -220,14 +220,14 @@ GEM
     dotenv (3.1.1)
     drb (2.2.1)
     ed25519 (1.3.0)
-    elasticsearch (7.13.3)
-      elasticsearch-api (= 7.13.3)
-      elasticsearch-transport (= 7.13.3)
-    elasticsearch-api (7.13.3)
+    elasticsearch (7.17.10)
+      elasticsearch-api (= 7.17.10)
+      elasticsearch-transport (= 7.17.10)
+    elasticsearch-api (7.17.10)
       multi_json
     elasticsearch-dsl (0.1.10)
-    elasticsearch-transport (7.13.3)
-      faraday (~> 1)
+    elasticsearch-transport (7.17.10)
+      faraday (>= 1, < 3)
       multi_json
     email_spec (2.2.2)
       htmlentities (~> 4.3.3)
diff --git a/spec/lib/admin/system_check/elasticsearch_check_spec.rb b/spec/lib/admin/system_check/elasticsearch_check_spec.rb
index a885640ce..8f210579d 100644
--- a/spec/lib/admin/system_check/elasticsearch_check_spec.rb
+++ b/spec/lib/admin/system_check/elasticsearch_check_spec.rb
@@ -127,7 +127,7 @@ describe Admin::SystemCheck::ElasticsearchCheck do
   end
 
   def stub_elasticsearch_error
-    client = instance_double(Elasticsearch::Transport::Client)
+    client = instance_double(Elasticsearch::Client)
     allow(client).to receive(:info).and_raise(Elasticsearch::Transport::Transport::Error)
     allow(Chewy).to receive(:client).and_return(client)
   end

From 8e4fea77e311399e4bcfff729aa06fed4e82e57c Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 6 May 2024 14:41:14 +0200
Subject: [PATCH 062/215] Fix race condition in `POST
 /api/v1/push/subscription` (#30166)

---
 .../api/v1/push/subscriptions_controller.rb   | 33 ++++++++++++-------
 app/lib/access_token_extension.rb             |  2 ++
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/app/controllers/api/v1/push/subscriptions_controller.rb b/app/controllers/api/v1/push/subscriptions_controller.rb
index 3634acf95..e1ad89ee3 100644
--- a/app/controllers/api/v1/push/subscriptions_controller.rb
+++ b/app/controllers/api/v1/push/subscriptions_controller.rb
@@ -1,9 +1,12 @@
 # frozen_string_literal: true
 
 class Api::V1::Push::SubscriptionsController < Api::BaseController
+  include Redisable
+  include Lockable
+
   before_action -> { doorkeeper_authorize! :push }
   before_action :require_user!
-  before_action :set_push_subscription
+  before_action :set_push_subscription, only: [:show, :update]
   before_action :check_push_subscription, only: [:show, :update]
 
   def show
@@ -11,16 +14,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
   end
 
   def create
-    @push_subscription&.destroy!
+    with_redis_lock("push_subscription:#{current_user.id}") do
+      destroy_web_push_subscriptions!
 
-    @push_subscription = Web::PushSubscription.create!(
-      endpoint: subscription_params[:endpoint],
-      key_p256dh: subscription_params[:keys][:p256dh],
-      key_auth: subscription_params[:keys][:auth],
-      data: data_params,
-      user_id: current_user.id,
-      access_token_id: doorkeeper_token.id
-    )
+      @push_subscription = Web::PushSubscription.create!(
+        endpoint: subscription_params[:endpoint],
+        key_p256dh: subscription_params[:keys][:p256dh],
+        key_auth: subscription_params[:keys][:auth],
+        data: data_params,
+        user_id: current_user.id,
+        access_token_id: doorkeeper_token.id
+      )
+    end
 
     render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer
   end
@@ -31,14 +36,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
   end
 
   def destroy
-    @push_subscription&.destroy!
+    destroy_web_push_subscriptions!
     render_empty
   end
 
   private
 
+  def destroy_web_push_subscriptions!
+    doorkeeper_token.web_push_subscriptions.destroy_all
+  end
+
   def set_push_subscription
-    @push_subscription = Web::PushSubscription.find_by(access_token_id: doorkeeper_token.id)
+    @push_subscription = doorkeeper_token.web_push_subscriptions.first
   end
 
   def check_push_subscription
diff --git a/app/lib/access_token_extension.rb b/app/lib/access_token_extension.rb
index f51bde492..4e9585dd1 100644
--- a/app/lib/access_token_extension.rb
+++ b/app/lib/access_token_extension.rb
@@ -6,6 +6,8 @@ module AccessTokenExtension
   included do
     include Redisable
 
+    has_many :web_push_subscriptions, class_name: 'Web::PushSubscription', inverse_of: :access_token
+
     after_commit :push_to_streaming_api
   end
 

From 30ef9fccf0c603ba917191ddbefdd497523d3d67 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 6 May 2024 14:47:19 +0200
Subject: [PATCH 063/215] Fix hashtag matching pattern matching some link
 anchors (#30190)

---
 app/models/tag.rb       | 2 +-
 spec/models/tag_spec.rb | 4 ++++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/app/models/tag.rb b/app/models/tag.rb
index 35be921e2..3f88cb068 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -37,7 +37,7 @@ class Tag < ApplicationRecord
   HASHTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)'
   HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASHTAG_LAST_SEQUENCE}"
 
-  HASHTAG_RE = %r{(?<![=/)\w])#(#{HASHTAG_NAME_PAT})}i
+  HASHTAG_RE = %r{(?<![=/)\p{Alnum}])#(#{HASHTAG_NAME_PAT})}i
   HASHTAG_NAME_RE = /\A(#{HASHTAG_NAME_PAT})\z/i
   HASHTAG_INVALID_CHARS_RE = /[^[:alnum:]\u0E47-\u0E4E#{HASHTAG_SEPARATORS}]/
 
diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb
index 4c2bdd52f..7799afe44 100644
--- a/spec/models/tag_spec.rb
+++ b/spec/models/tag_spec.rb
@@ -36,6 +36,10 @@ RSpec.describe Tag do
       expect(subject.match('https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111895#c4')).to be_nil
     end
 
+    it 'does not match URLs with hashtag-like anchors after a non-ascii character' do
+      expect(subject.match('https://example.org/testé#foo')).to be_nil
+    end
+
     it 'does not match URLs with hashtag-like anchors after an empty query parameter' do
       expect(subject.match('https://en.wikipedia.org/wiki/Ghostbusters_(song)?foo=#Lawsuit')).to be_nil
     end

From 116f01ec7d1e0793fc6c1749867d660d7c19a5b7 Mon Sep 17 00:00:00 2001
From: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
Date: Mon, 6 May 2024 15:17:56 +0200
Subject: [PATCH 064/215] Implement RFC 8414 for OAuth 2.0 server metadata
 (#29191)

---
 .../well_known/oauth_metadata_controller.rb   | 23 +++++++
 app/presenters/oauth_metadata_presenter.rb    | 67 +++++++++++++++++++
 app/serializers/oauth_metadata_serializer.rb  |  9 +++
 config/routes.rb                              |  1 +
 .../well_known/oauth_metadata_spec.rb         | 37 ++++++++++
 5 files changed, 137 insertions(+)
 create mode 100644 app/controllers/well_known/oauth_metadata_controller.rb
 create mode 100644 app/presenters/oauth_metadata_presenter.rb
 create mode 100644 app/serializers/oauth_metadata_serializer.rb
 create mode 100644 spec/requests/well_known/oauth_metadata_spec.rb

diff --git a/app/controllers/well_known/oauth_metadata_controller.rb b/app/controllers/well_known/oauth_metadata_controller.rb
new file mode 100644
index 000000000..c80be2d65
--- /dev/null
+++ b/app/controllers/well_known/oauth_metadata_controller.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module WellKnown
+  class OauthMetadataController < ActionController::Base # rubocop:disable Rails/ApplicationController
+    include CacheConcern
+
+    # Prevent `active_model_serializer`'s `ActionController::Serialization` from calling `current_user`
+    # and thus re-issuing session cookies
+    serialization_scope nil
+
+    def show
+      # Due to this document potentially changing between Mastodon versions (as
+      # new OAuth scopes are added), we don't use expires_in to cache upstream,
+      # instead just caching in the rails cache:
+      render_with_cache(
+        json: ::OauthMetadataPresenter.new,
+        serializer: ::OauthMetadataSerializer,
+        content_type: 'application/json',
+        expires_in: 15.minutes
+      )
+    end
+  end
+end
diff --git a/app/presenters/oauth_metadata_presenter.rb b/app/presenters/oauth_metadata_presenter.rb
new file mode 100644
index 000000000..546503bfc
--- /dev/null
+++ b/app/presenters/oauth_metadata_presenter.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+class OauthMetadataPresenter < ActiveModelSerializers::Model
+  include RoutingHelper
+
+  attributes :issuer, :authorization_endpoint, :token_endpoint,
+             :revocation_endpoint, :scopes_supported,
+             :response_types_supported, :response_modes_supported,
+             :grant_types_supported, :token_endpoint_auth_methods_supported,
+             :service_documentation, :app_registration_endpoint
+
+  def issuer
+    root_url
+  end
+
+  def service_documentation
+    'https://docs.joinmastodon.org/'
+  end
+
+  def authorization_endpoint
+    oauth_authorization_url
+  end
+
+  def token_endpoint
+    oauth_token_url
+  end
+
+  # As the api_v1_apps route doesn't technically conform to the specification
+  # for OAuth 2.0 Dynamic Client Registration defined in RFC 7591 we use a
+  # non-standard property for now to indicate the mastodon specific registration
+  # endpoint. See: https://datatracker.ietf.org/doc/html/rfc7591
+  def app_registration_endpoint
+    api_v1_apps_url
+  end
+
+  def revocation_endpoint
+    oauth_revoke_url
+  end
+
+  def scopes_supported
+    doorkeeper.scopes
+  end
+
+  def response_types_supported
+    doorkeeper.authorization_response_types
+  end
+
+  def response_modes_supported
+    doorkeeper.authorization_response_flows.flat_map(&:response_mode_matches).uniq
+  end
+
+  def grant_types_supported
+    grant_types_supported = doorkeeper.grant_flows.dup
+    grant_types_supported << 'refresh_token' if doorkeeper.refresh_token_enabled?
+    grant_types_supported
+  end
+
+  def token_endpoint_auth_methods_supported
+    %w(client_secret_basic client_secret_post)
+  end
+
+  private
+
+  def doorkeeper
+    @doorkeeper ||= Doorkeeper.configuration
+  end
+end
diff --git a/app/serializers/oauth_metadata_serializer.rb b/app/serializers/oauth_metadata_serializer.rb
new file mode 100644
index 000000000..5f3dc7b87
--- /dev/null
+++ b/app/serializers/oauth_metadata_serializer.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class OauthMetadataSerializer < ActiveModel::Serializer
+  attributes :issuer, :authorization_endpoint, :token_endpoint,
+             :revocation_endpoint, :scopes_supported,
+             :response_types_supported, :response_modes_supported,
+             :grant_types_supported, :token_endpoint_auth_methods_supported,
+             :service_documentation, :app_registration_endpoint
+end
diff --git a/config/routes.rb b/config/routes.rb
index 3d3c94096..f4662dd5d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -62,6 +62,7 @@ Rails.application.routes.draw do
                 tokens: 'oauth/tokens'
   end
 
+  get '.well-known/oauth-authorization-server', to: 'well_known/oauth_metadata#show', as: :oauth_metadata, defaults: { format: 'json' }
   get '.well-known/host-meta', to: 'well_known/host_meta#show', as: :host_meta, defaults: { format: 'xml' }
   get '.well-known/nodeinfo', to: 'well_known/node_info#index', as: :nodeinfo, defaults: { format: 'json' }
   get '.well-known/webfinger', to: 'well_known/webfinger#show', as: :webfinger
diff --git a/spec/requests/well_known/oauth_metadata_spec.rb b/spec/requests/well_known/oauth_metadata_spec.rb
new file mode 100644
index 000000000..deef189ac
--- /dev/null
+++ b/spec/requests/well_known/oauth_metadata_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe 'The /.well-known/oauth-authorization-server request' do
+  let(:protocol) { ENV.fetch('LOCAL_HTTPS', true) ? :https : :http }
+
+  before do
+    host! ENV.fetch('LOCAL_DOMAIN')
+  end
+
+  it 'returns http success with valid JSON response' do
+    get '/.well-known/oauth-authorization-server'
+
+    expect(response)
+      .to have_http_status(200)
+      .and have_attributes(
+        media_type: 'application/json'
+      )
+
+    grant_types_supported = Doorkeeper.configuration.grant_flows.dup
+    grant_types_supported << 'refresh_token' if Doorkeeper.configuration.refresh_token_enabled?
+
+    expect(body_as_json).to include(
+      issuer: root_url(protocol: protocol),
+      service_documentation: 'https://docs.joinmastodon.org/',
+      authorization_endpoint: oauth_authorization_url(protocol: protocol),
+      token_endpoint: oauth_token_url(protocol: protocol),
+      revocation_endpoint: oauth_revoke_url(protocol: protocol),
+      scopes_supported: Doorkeeper.configuration.scopes.map(&:to_s),
+      response_types_supported: Doorkeeper.configuration.authorization_response_types,
+      grant_types_supported: grant_types_supported,
+      # non-standard extension:
+      app_registration_endpoint: api_v1_apps_url(protocol: protocol)
+    )
+  end
+end

From 05126d106fd972e4baf5a1cec857e44a451b90a9 Mon Sep 17 00:00:00 2001
From: Fawaz Farid <fawwazally@gmail.com>
Date: Mon, 6 May 2024 16:31:39 +0300
Subject: [PATCH 065/215] Redirect back after site upload deletion (#30141)

---
 app/controllers/admin/site_uploads_controller.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/controllers/admin/site_uploads_controller.rb b/app/controllers/admin/site_uploads_controller.rb
index a5d2cf41c..96e61cf6b 100644
--- a/app/controllers/admin/site_uploads_controller.rb
+++ b/app/controllers/admin/site_uploads_controller.rb
@@ -9,7 +9,7 @@ module Admin
 
       @site_upload.destroy!
 
-      redirect_to admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg')
+      redirect_back fallback_location: admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg')
     end
 
     private

From b152f936c1361cc82e21c853335557c3ffa80409 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 6 May 2024 11:05:12 -0400
Subject: [PATCH 066/215] Migrate paperclip `_file_size` columns to bigint
 (#29263)

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
---
 .../instance_media_attachments_measure.rb     |  2 +-
 ...51_convert_file_size_columns_to_big_int.rb | 42 +++++++++++++++++++
 db/schema.rb                                  | 16 +++----
 3 files changed, 51 insertions(+), 9 deletions(-)
 create mode 100644 db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb

diff --git a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
index 1d2dbbe41..65f444624 100644
--- a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
+++ b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
@@ -50,7 +50,7 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics:
           WHERE date_trunc('day', media_attachments.created_at)::date = axis.period
             AND #{account_domain_sql(params[:include_subdomains])}
         )
-        SELECT COALESCE(SUM(size), 0) FROM new_media_attachments
+        SELECT COALESCE(SUM(size), 0)::bigint FROM new_media_attachments
       ) AS value
       FROM (
         SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
diff --git a/db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb b/db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb
new file mode 100644
index 000000000..f8223f9c9
--- /dev/null
+++ b/db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require_relative '../../lib/mastodon/migration_helpers'
+
+class ConvertFileSizeColumnsToBigInt < ActiveRecord::Migration[7.1]
+  include Mastodon::MigrationHelpers
+
+  TABLE_COLUMN_MAPPING = [
+    [:accounts, :avatar_file_size],
+    [:accounts, :header_file_size],
+    [:custom_emojis, :image_file_size],
+    [:imports, :data_file_size],
+    [:media_attachments, :file_file_size],
+    [:media_attachments, :thumbnail_file_size],
+    [:preview_cards, :image_file_size],
+    [:site_uploads, :file_file_size],
+  ].freeze
+
+  disable_ddl_transaction!
+
+  def migrate_columns(to_type)
+    TABLE_COLUMN_MAPPING.each do |column_parts|
+      table, column = column_parts
+
+      # Skip this if we're resuming and already did this one.
+      next if column_for(table, column).sql_type == to_type.to_s
+
+      safety_assured do
+        change_column_type_concurrently table, column, to_type
+        cleanup_concurrent_column_type_change table, column
+      end
+    end
+  end
+
+  def up
+    migrate_columns(:bigint)
+  end
+
+  def down
+    migrate_columns(:integer)
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 11f1a202f..ee41a0c3a 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -166,11 +166,11 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "url"
     t.string "avatar_file_name"
     t.string "avatar_content_type"
-    t.integer "avatar_file_size"
+    t.bigint "avatar_file_size"
     t.datetime "avatar_updated_at", precision: nil
     t.string "header_file_name"
     t.string "header_content_type"
-    t.integer "header_file_size"
+    t.bigint "header_file_size"
     t.datetime "header_updated_at", precision: nil
     t.string "avatar_remote_url"
     t.boolean "locked", default: false, null: false
@@ -368,7 +368,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "domain"
     t.string "image_file_name"
     t.string "image_content_type"
-    t.integer "image_file_size"
+    t.bigint "image_file_size"
     t.datetime "image_updated_at", precision: nil
     t.datetime "created_at", precision: nil, null: false
     t.datetime "updated_at", precision: nil, null: false
@@ -558,7 +558,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.datetime "updated_at", precision: nil, null: false
     t.string "data_file_name"
     t.string "data_content_type"
-    t.integer "data_file_size"
+    t.bigint "data_file_size"
     t.datetime "data_updated_at", precision: nil
     t.bigint "account_id", null: false
     t.boolean "overwrite", default: false, null: false
@@ -635,7 +635,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.bigint "status_id"
     t.string "file_file_name"
     t.string "file_content_type"
-    t.integer "file_file_size"
+    t.bigint "file_file_size"
     t.datetime "file_updated_at", precision: nil
     t.string "remote_url", default: "", null: false
     t.datetime "created_at", precision: nil, null: false
@@ -651,7 +651,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.integer "file_storage_schema_version"
     t.string "thumbnail_file_name"
     t.string "thumbnail_content_type"
-    t.integer "thumbnail_file_size"
+    t.bigint "thumbnail_file_size"
     t.datetime "thumbnail_updated_at", precision: nil
     t.string "thumbnail_remote_url"
     t.index ["account_id", "status_id"], name: "index_media_attachments_on_account_id_and_status_id", order: { status_id: :desc }
@@ -855,7 +855,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "description", default: "", null: false
     t.string "image_file_name"
     t.string "image_content_type"
-    t.integer "image_file_size"
+    t.bigint "image_file_size"
     t.datetime "image_updated_at", precision: nil
     t.integer "type", default: 0, null: false
     t.text "html", default: "", null: false
@@ -993,7 +993,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "var", default: "", null: false
     t.string "file_file_name"
     t.string "file_content_type"
-    t.integer "file_file_size"
+    t.bigint "file_file_size"
     t.datetime "file_updated_at", precision: nil
     t.json "meta"
     t.datetime "created_at", precision: nil, null: false

From bc24c4792d0bef744ff1d39e8eb543b1b6aa98c2 Mon Sep 17 00:00:00 2001
From: Fawaz Farid <fawwazally@gmail.com>
Date: Mon, 6 May 2024 18:06:52 +0300
Subject: [PATCH 067/215] Allow admins to configure instance favicon and logo
 (#30040)

---
 app/helpers/application_helper.rb             |  7 +++++
 app/models/form/admin_settings.rb             |  4 +++
 app/models/site_upload.rb                     |  8 ++++++
 app/serializers/manifest_serializer.rb        | 20 ++++---------
 .../admin/settings/branding/show.html.haml    | 28 +++++++++++++++++++
 app/views/layouts/application.html.haml       | 10 +++----
 config/locales/simple_form.en-GB.yml          |  3 ++
 config/locales/simple_form.en.yml             |  2 ++
 spec/helpers/application_helper_spec.rb       | 24 ++++++++++++++++
 9 files changed, 87 insertions(+), 19 deletions(-)

diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 4cf959f2d..ff351429e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -240,6 +240,13 @@ module ApplicationHelper
     EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s
   end
 
+  def site_icon_path(type, size = '48')
+    icon = SiteUpload.find_by(var: type)
+    return nil unless icon
+
+    icon.file.url(size)
+  end
+
   private
 
   def storage_host_var
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index cb37a5221..85b913cf8 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -37,6 +37,8 @@ class Form::AdminSettings
     status_page_url
     captcha_enabled
     authorized_fetch
+    app_icon
+    favicon
   ).freeze
 
   INTEGER_KEYS = %i(
@@ -63,6 +65,8 @@ class Form::AdminSettings
   UPLOAD_KEYS = %i(
     thumbnail
     mascot
+    app_icon
+    favicon
   ).freeze
 
   OVERRIDEN_SETTINGS = {
diff --git a/app/models/site_upload.rb b/app/models/site_upload.rb
index 03d472cdb..b3926ec7e 100644
--- a/app/models/site_upload.rb
+++ b/app/models/site_upload.rb
@@ -19,7 +19,15 @@
 class SiteUpload < ApplicationRecord
   include Attachmentable
 
+  FAVICON_SIZES = [16, 32, 48].freeze
+  APPLE_ICON_SIZES   = [57, 60, 72, 76, 114, 120, 144, 152, 167, 180, 1024].freeze
+  ANDROID_ICON_SIZES = [36, 48, 72, 96, 144, 192, 256, 384, 512].freeze
+
+  APP_ICON_SIZES = (APPLE_ICON_SIZES + ANDROID_ICON_SIZES).uniq.freeze
+
   STYLES = {
+    app_icon: APP_ICON_SIZES.each_with_object({}) { |size, hash| hash[size.to_s.to_sym] = "#{size}x#{size}#" }.freeze,
+    favicon: FAVICON_SIZES.each_with_object({}) { |size, hash| hash[size.to_s.to_sym] = "#{size}x#{size}#" }.freeze,
     thumbnail: {
       '@1x': {
         format: 'png',
diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index 1c1f7d0ad..759490228 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -1,21 +1,10 @@
 # frozen_string_literal: true
 
 class ManifestSerializer < ActiveModel::Serializer
+  include ApplicationHelper
   include RoutingHelper
   include ActionView::Helpers::TextHelper
 
-  ICON_SIZES = %w(
-    36
-    48
-    72
-    96
-    144
-    192
-    256
-    384
-    512
-  ).freeze
-
   attributes :id, :name, :short_name,
              :icons, :theme_color, :background_color,
              :display, :start_url, :scope,
@@ -37,9 +26,12 @@ class ManifestSerializer < ActiveModel::Serializer
   end
 
   def icons
-    ICON_SIZES.map do |size|
+    SiteUpload::ANDROID_ICON_SIZES.map do |size|
+      src = site_icon_path('app_icon', size.to_i)
+      src = URI.join(root_url, src).to_s if src.present?
+
       {
-        src: frontend_asset_url("icons/android-chrome-#{size}x#{size}.png"),
+        src: src || frontend_asset_url("icons/android-chrome-#{size}x#{size}.png"),
         sizes: "#{size}x#{size}",
         type: 'image/png',
         purpose: 'any maskable',
diff --git a/app/views/admin/settings/branding/show.html.haml b/app/views/admin/settings/branding/show.html.haml
index 769c0dafe..71aac5ead 100644
--- a/app/views/admin/settings/branding/show.html.haml
+++ b/app/views/admin/settings/branding/show.html.haml
@@ -40,5 +40,33 @@
           = fa_icon 'trash fw'
           = t('admin.site_uploads.delete')
 
+  .fields-row
+    .fields-row__column.fields-row__column-6.fields-group
+      = f.input :favicon,
+                as: :file,
+                input_html: { accept: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].join(',') },
+                wrapper: :with_block_label
+
+    .fields-row__column.fields-row__column-6.fields-group
+      - if @admin_settings.favicon.persisted?
+        = image_tag @admin_settings.favicon.file.url('48'), class: 'fields-group__thumbnail'
+        = link_to admin_site_upload_path(@admin_settings.favicon), data: { method: :delete }, class: 'link-button link-button--destructive' do
+          = fa_icon 'trash fw'
+          = t('admin.site_uploads.delete')
+
+  .fields-row
+    .fields-row__column.fields-row__column-6.fields-group
+      = f.input :app_icon,
+                as: :file,
+                input_html: { accept: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].join(',') },
+                wrapper: :with_block_label
+
+    .fields-row__column.fields-row__column-6.fields-group
+      - if @admin_settings.app_icon.persisted?
+        = image_tag @admin_settings.app_icon.file.url('48'), class: 'fields-group__thumbnail'
+        = link_to admin_site_upload_path(@admin_settings.app_icon), data: { method: :delete }, class: 'link-button link-button--destructive' do
+          = fa_icon 'trash fw'
+          = t('admin.site_uploads.delete')
+
   .actions
     = f.button :button, t('generic.save_changes'), type: :submit
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 9d7669d68..56857b2b6 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -11,13 +11,13 @@
     - if storage_host?
       %link{ rel: 'dns-prefetch', href: storage_host }/
 
-    %link{ rel: 'icon', href: '/favicon.ico', type: 'image/x-icon' }/
+    %link{ rel: 'icon', href: site_icon_path('favicon') || '/favicon.ico', type: 'image/x-icon' }/
 
-    - %w(16 32 48).each do |size|
-      %link{ rel: 'icon', sizes: "#{size}x#{size}", href: frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
+    - SiteUpload::FAVICON_SIZES.each do |size|
+      %link{ rel: 'icon', sizes: "#{size}x#{size}", href: site_icon_path('favicon', size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
 
-    - %w(57 60 72 76 114 120 144 152 167 180 1024).each do |size|
-      %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/
+    - SiteUpload::APPLE_ICON_SIZES.each do |size|
+      %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: site_icon_path('app_icon', size.to_i) || frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/
 
     %link{ rel: 'mask-icon', href: frontend_asset_path('images/logo-symbol-icon.svg'), color: '#6364FF' }/
     %link{ rel: 'manifest', href: manifest_path(format: :json) }/
diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml
index f4668ccad..9aedac15f 100644
--- a/config/locales/simple_form.en-GB.yml
+++ b/config/locales/simple_form.en-GB.yml
@@ -77,9 +77,12 @@ en-GB:
           warn: Hide the filtered content behind a warning mentioning the filter's title
       form_admin_settings:
         activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
+        app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon.
+        backups_retention_period: Keep generated user archives for the specified number of days.
         bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
         closed_registrations_message: Displayed when sign-ups are closed
         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.
         mascot: Overrides the illustration in the advanced web interface.
         peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
         profile_directory: The profile directory lists all users who have opted-in to be discoverable.
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 7304bdc22..fdc9f6181 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -77,11 +77,13 @@ en:
           warn: Hide the filtered content behind a warning mentioning the filter's title
       form_admin_settings:
         activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
+        app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon.
         backups_retention_period: Users have the ability to generate archives of their posts to download later. When set to a positive value, these archives will be automatically deleted from your storage after the specified number of days.
         bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
         closed_registrations_message: Displayed when sign-ups are closed
         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.
         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.
         peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 9330eb0da..56501034b 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -285,4 +285,28 @@ describe ApplicationHelper do
       end
     end
   end
+
+  describe '#site_icon_path' do
+    context 'when an icon exists' do
+      let!(:favicon) { Fabricate(:site_upload, var: 'favicon') }
+
+      it 'returns the URL of the icon' do
+        expect(helper.site_icon_path('favicon')).to eq(favicon.file.url('48'))
+      end
+
+      it 'returns the URL of the icon with size parameter' do
+        expect(helper.site_icon_path('favicon', 16)).to eq(favicon.file.url('16'))
+      end
+    end
+
+    context 'when an icon does not exist' do
+      it 'returns nil' do
+        expect(helper.site_icon_path('favicon')).to be_nil
+      end
+
+      it 'returns nil with size parameter' do
+        expect(helper.site_icon_path('favicon', 16)).to be_nil
+      end
+    end
+  end
 end

From 2fe1b8d1695d8faa452a69872fde94ccc4611576 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 6 May 2024 17:19:15 +0200
Subject: [PATCH 068/215] Add API to get multiple accounts and statuses
 (#27871)

Co-authored-by: noellabo <noel.yoshiba@gmail.com>
---
 app/controllers/api/v1/accounts_controller.rb | 30 ++++++++++++++++---
 app/controllers/api/v1/statuses_controller.rb | 29 ++++++++++++++++--
 .../concerns/status/threading_concern.rb      | 27 +++++++++++------
 config/routes/api.rb                          |  4 +--
 spec/requests/api/v1/accounts_spec.rb         | 16 ++++++++++
 spec/requests/api/v1/statuses_spec.rb         | 16 ++++++++++
 6 files changed, 104 insertions(+), 18 deletions(-)

diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 23fc85b47..be7b302d3 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -9,16 +9,22 @@ class Api::V1::AccountsController < Api::BaseController
   before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' }, only: [:block, :unblock]
   before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:create]
 
-  before_action :require_user!, except: [:show, :create]
-  before_action :set_account, except: [:create]
-  before_action :check_account_approval, except: [:create]
-  before_action :check_account_confirmation, except: [:create]
+  before_action :require_user!, except: [:index, :show, :create]
+  before_action :set_account, except: [:index, :create]
+  before_action :set_accounts, only: [:index]
+  before_action :check_account_approval, except: [:index, :create]
+  before_action :check_account_confirmation, except: [:index, :create]
   before_action :check_enabled_registrations, only: [:create]
+  before_action :check_accounts_limit, only: [:index]
 
   skip_before_action :require_authenticated_user!, only: :create
 
   override_rate_limit_headers :follow, family: :follows
 
+  def index
+    render json: @accounts, each_serializer: REST::AccountSerializer
+  end
+
   def show
     cache_if_unauthenticated!
     render json: @account, serializer: REST::AccountSerializer
@@ -79,6 +85,10 @@ class Api::V1::AccountsController < Api::BaseController
     @account = Account.find(params[:id])
   end
 
+  def set_accounts
+    @accounts = Account.where(id: account_ids).without_unapproved
+  end
+
   def check_account_approval
     raise(ActiveRecord::RecordNotFound) if @account.local? && @account.user_pending?
   end
@@ -87,10 +97,22 @@ class Api::V1::AccountsController < Api::BaseController
     raise(ActiveRecord::RecordNotFound) if @account.local? && !@account.user_confirmed?
   end
 
+  def check_accounts_limit
+    raise(Mastodon::ValidationError) if account_ids.size > DEFAULT_ACCOUNTS_LIMIT
+  end
+
   def relationships(**options)
     AccountRelationshipsPresenter.new([@account], current_user.account_id, **options)
   end
 
+  def account_ids
+    Array(accounts_params[:ids]).uniq.map(&:to_i)
+  end
+
+  def accounts_params
+    params.permit(ids: [])
+  end
+
   def account_params
     params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone, :invite_code)
   end
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 01c371876..36a9ec632 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -5,9 +5,11 @@ class Api::V1::StatusesController < Api::BaseController
 
   before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :update, :destroy]
   before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only:   [:create, :update, :destroy]
-  before_action :require_user!, except:  [:show, :context]
-  before_action :set_status, only:       [:show, :context]
-  before_action :set_thread, only:       [:create]
+  before_action :require_user!, except:      [:index, :show, :context]
+  before_action :set_statuses, only:         [:index]
+  before_action :set_status, only:           [:show, :context]
+  before_action :set_thread, only:           [:create]
+  before_action :check_statuses_limit, only: [:index]
 
   override_rate_limit_headers :create, family: :statuses
   override_rate_limit_headers :update, family: :statuses
@@ -23,6 +25,11 @@ class Api::V1::StatusesController < Api::BaseController
   DESCENDANTS_LIMIT       = 60
   DESCENDANTS_DEPTH_LIMIT = 20
 
+  def index
+    @statuses = cache_collection(@statuses, Status)
+    render json: @statuses, each_serializer: REST::StatusSerializer
+  end
+
   def show
     cache_if_unauthenticated!
     @status = cache_collection([@status], Status).first
@@ -111,6 +118,10 @@ class Api::V1::StatusesController < Api::BaseController
 
   private
 
+  def set_statuses
+    @statuses = Status.permitted_statuses_from_ids(status_ids, current_account)
+  end
+
   def set_status
     @status = Status.find(params[:id])
     authorize @status, :show?
@@ -125,6 +136,18 @@ class Api::V1::StatusesController < Api::BaseController
     render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404
   end
 
+  def check_statuses_limit
+    raise(Mastodon::ValidationError) if status_ids.size > DEFAULT_STATUSES_LIMIT
+  end
+
+  def status_ids
+    Array(statuses_params[:ids]).uniq.map(&:to_i)
+  end
+
+  def statuses_params
+    params.permit(ids: [])
+  end
+
   def status_params
     params.permit(
       :status,
diff --git a/app/models/concerns/status/threading_concern.rb b/app/models/concerns/status/threading_concern.rb
index ca8c44814..478a139d6 100644
--- a/app/models/concerns/status/threading_concern.rb
+++ b/app/models/concerns/status/threading_concern.rb
@@ -3,6 +3,23 @@
 module Status::ThreadingConcern
   extend ActiveSupport::Concern
 
+  class_methods do
+    def permitted_statuses_from_ids(ids, account, stable: false)
+      statuses    = Status.with_accounts(ids).to_a
+      account_ids = statuses.map(&:account_id).uniq
+      domains     = statuses.filter_map(&:account_domain).uniq
+      relations   = account&.relations_map(account_ids, domains) || {}
+
+      statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? }
+
+      if stable
+        statuses.sort_by! { |status| ids.index(status.id) }
+      else
+        statuses
+      end
+    end
+  end
+
   def ancestors(limit, account = nil)
     find_statuses_from_tree_path(ancestor_ids(limit), account)
   end
@@ -76,15 +93,7 @@ module Status::ThreadingConcern
   end
 
   def find_statuses_from_tree_path(ids, account, promote: false)
-    statuses    = Status.with_accounts(ids).to_a
-    account_ids = statuses.map(&:account_id).uniq
-    domains     = statuses.filter_map(&:account_domain).uniq
-    relations   = account&.relations_map(account_ids, domains) || {}
-
-    statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? }
-
-    # Order ancestors/descendants by tree path
-    statuses.sort_by! { |status| ids.index(status.id) }
+    statuses = Status.permitted_statuses_from_ids(ids, account, stable: true)
 
     # Bring self-replies to the top
     if promote
diff --git a/config/routes/api.rb b/config/routes/api.rb
index 60fb0394e..bf3cee0c1 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -6,7 +6,7 @@ namespace :api, format: false do
 
   # JSON / REST API
   namespace :v1 do
-    resources :statuses, only: [:create, :show, :update, :destroy] do
+    resources :statuses, only: [:index, :create, :show, :update, :destroy] do
       scope module: :statuses do
         resources :reblogged_by, controller: :reblogged_by_accounts, only: :index
         resources :favourited_by, controller: :favourited_by_accounts, only: :index
@@ -182,7 +182,7 @@ namespace :api, format: false do
       resources :familiar_followers, only: :index
     end
 
-    resources :accounts, only: [:create, :show] do
+    resources :accounts, only: [:index, :create, :show] do
       scope module: :accounts do
         resources :statuses, only: :index
         resources :followers, only: :index, controller: :follower_accounts
diff --git a/spec/requests/api/v1/accounts_spec.rb b/spec/requests/api/v1/accounts_spec.rb
index e543c4136..55f8e1c6f 100644
--- a/spec/requests/api/v1/accounts_spec.rb
+++ b/spec/requests/api/v1/accounts_spec.rb
@@ -8,6 +8,22 @@ describe '/api/v1/accounts' do
   let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
   let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
 
+  describe 'GET /api/v1/accounts?ids[]=:id' do
+    let(:account) { Fabricate(:account) }
+    let(:other_account) { Fabricate(:account) }
+    let(:scopes) { 'read:accounts' }
+
+    it 'returns expected response' do
+      get '/api/v1/accounts', headers: headers, params: { ids: [account.id, other_account.id, 123_123] }
+
+      expect(response).to have_http_status(200)
+      expect(body_as_json).to contain_exactly(
+        hash_including(id: account.id.to_s),
+        hash_including(id: other_account.id.to_s)
+      )
+    end
+  end
+
   describe 'GET /api/v1/accounts/:id' do
     context 'when logged out' do
       let(:account) { Fabricate(:account) }
diff --git a/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb
index a3b84afa2..0b2d1f90c 100644
--- a/spec/requests/api/v1/statuses_spec.rb
+++ b/spec/requests/api/v1/statuses_spec.rb
@@ -9,6 +9,22 @@ describe '/api/v1/statuses' do
     let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: client_app, scopes: scopes) }
     let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
 
+    describe 'GET /api/v1/statuses?ids[]=:id' do
+      let(:status) { Fabricate(:status) }
+      let(:other_status) { Fabricate(:status) }
+      let(:scopes) { 'read:statuses' }
+
+      it 'returns expected response' do
+        get '/api/v1/statuses', headers: headers, params: { ids: [status.id, other_status.id, 123_123] }
+
+        expect(response).to have_http_status(200)
+        expect(body_as_json).to contain_exactly(
+          hash_including(id: status.id.to_s),
+          hash_including(id: other_status.id.to_s)
+        )
+      end
+    end
+
     describe 'GET /api/v1/statuses/:id' do
       subject do
         get "/api/v1/statuses/#{status.id}", headers: headers

From 616789454707be00b334070646491b5e028d3be6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 6 May 2024 19:14:46 +0200
Subject: [PATCH 069/215] Update dependency pino-http to v10 (#30191)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 streaming/package.json |  2 +-
 yarn.lock              | 42 ++++++++++++++----------------------------
 2 files changed, 15 insertions(+), 29 deletions(-)

diff --git a/streaming/package.json b/streaming/package.json
index c4dcccf1f..f08d2a4c2 100644
--- a/streaming/package.json
+++ b/streaming/package.json
@@ -25,7 +25,7 @@
     "pg": "^8.5.0",
     "pg-connection-string": "^2.6.0",
     "pino": "^9.0.0",
-    "pino-http": "^9.0.0",
+    "pino-http": "^10.0.0",
     "prom-client": "^15.0.0",
     "uuid": "^9.0.0",
     "ws": "^8.12.1"
diff --git a/yarn.lock b/yarn.lock
index acaab739a..399dae205 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2927,7 +2927,7 @@ __metadata:
     pg: "npm:^8.5.0"
     pg-connection-string: "npm:^2.6.0"
     pino: "npm:^9.0.0"
-    pino-http: "npm:^9.0.0"
+    pino-http: "npm:^10.0.0"
     pino-pretty: "npm:^11.0.0"
     prom-client: "npm:^15.0.0"
     typescript: "npm:^5.0.4"
@@ -12993,7 +12993,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pino-abstract-transport@npm:^1.0.0, pino-abstract-transport@npm:^1.1.0, pino-abstract-transport@npm:^1.2.0":
+"pino-abstract-transport@npm:^1.0.0, pino-abstract-transport@npm:^1.2.0":
   version: 1.2.0
   resolution: "pino-abstract-transport@npm:1.2.0"
   dependencies:
@@ -13003,15 +13003,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pino-http@npm:^9.0.0":
-  version: 9.0.0
-  resolution: "pino-http@npm:9.0.0"
+"pino-http@npm:^10.0.0":
+  version: 10.0.0
+  resolution: "pino-http@npm:10.0.0"
   dependencies:
     get-caller-file: "npm:^2.0.5"
-    pino: "npm:^8.17.1"
-    pino-std-serializers: "npm:^6.2.2"
+    pino: "npm:^9.0.0"
+    pino-std-serializers: "npm:^7.0.0"
     process-warning: "npm:^3.0.0"
-  checksum: 10c0/05496cb76cc9908658e50c4620fbdf7b0b5d99fb529493d601c3e4635b0bf7ce12b8a8eed7b5b520089f643b099233d61dd71f7cdfad8b66e59b9b81d79b6512
+  checksum: 10c0/40d2dcb2bc0c51f1ce45d3d7144c54f087fe1a122d82d0f497d65656151a1603a64f82f62d7fc6a3c172754c5a5cf6105b3096620eece31cefbc8cf95b26c062
   languageName: node
   linkType: hard
 
@@ -13039,31 +13039,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pino-std-serializers@npm:^6.0.0, pino-std-serializers@npm:^6.2.2":
+"pino-std-serializers@npm:^6.0.0":
   version: 6.2.2
   resolution: "pino-std-serializers@npm:6.2.2"
   checksum: 10c0/8f1c7f0f0d8f91e6c6b5b2a6bfb48f06441abeb85f1c2288319f736f9c6d814fbeebe928d2314efc2ba6018fa7db9357a105eca9fc99fc1f28945a8a8b28d3d5
   languageName: node
   linkType: hard
 
-"pino@npm:^8.17.1":
-  version: 8.20.0
-  resolution: "pino@npm:8.20.0"
-  dependencies:
-    atomic-sleep: "npm:^1.0.0"
-    fast-redact: "npm:^3.1.1"
-    on-exit-leak-free: "npm:^2.1.0"
-    pino-abstract-transport: "npm:^1.1.0"
-    pino-std-serializers: "npm:^6.0.0"
-    process-warning: "npm:^3.0.0"
-    quick-format-unescaped: "npm:^4.0.3"
-    real-require: "npm:^0.2.0"
-    safe-stable-stringify: "npm:^2.3.1"
-    sonic-boom: "npm:^3.7.0"
-    thread-stream: "npm:^2.0.0"
-  bin:
-    pino: bin.js
-  checksum: 10c0/6b973474160e1fa01fa150de0f69b7db9c6c06ae15f992d369669751825c8f2af3bb5600348eaf9be65b4952326bbdfa226f51e425820eb511f0f594fbddbaa7
+"pino-std-serializers@npm:^7.0.0":
+  version: 7.0.0
+  resolution: "pino-std-serializers@npm:7.0.0"
+  checksum: 10c0/73e694d542e8de94445a03a98396cf383306de41fd75ecc07085d57ed7a57896198508a0dec6eefad8d701044af21eb27253ccc352586a03cf0d4a0bd25b4133
   languageName: node
   linkType: hard
 
@@ -16787,7 +16773,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"thread-stream@npm:^2.0.0, thread-stream@npm:^2.6.0":
+"thread-stream@npm:^2.6.0":
   version: 2.6.0
   resolution: "thread-stream@npm:2.6.0"
   dependencies:

From 996292cd55e661f3390792b60b130150b1f4ff40 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Tue, 7 May 2024 10:41:53 +0200
Subject: [PATCH 070/215] Fix `db:encryption:init` requiring ActiveRecord
 encryption variables to be set (#30202)

---
 lib/tasks/db.rake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake
index 07de08776..d6377c9c8 100644
--- a/lib/tasks/db.rake
+++ b/lib/tasks/db.rake
@@ -6,7 +6,7 @@ Rake::Task['db:encryption:init'].clear
 namespace :db do
   namespace :encryption do
     desc 'Generate a set of keys for configuring Active Record encryption in a given environment'
-    task init: :environment do
+    task :init do # rubocop:disable Rails/RakeEnvironment
       puts <<~MSG
         Add these environment variables to your Mastodon environment:#{' '}
 

From 96fb6e491ffa526e800b5c3d1835022a90930c88 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Tue, 7 May 2024 10:46:05 +0200
Subject: [PATCH 071/215] Revert "Migrate paperclip `_file_size` columns to
 bigint (#29263)" (#30203)

---
 .../instance_media_attachments_measure.rb     |  2 +-
 ...51_convert_file_size_columns_to_big_int.rb | 42 -------------------
 db/schema.rb                                  | 16 +++----
 3 files changed, 9 insertions(+), 51 deletions(-)
 delete mode 100644 db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb

diff --git a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
index 65f444624..1d2dbbe41 100644
--- a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
+++ b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb
@@ -50,7 +50,7 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics:
           WHERE date_trunc('day', media_attachments.created_at)::date = axis.period
             AND #{account_domain_sql(params[:include_subdomains])}
         )
-        SELECT COALESCE(SUM(size), 0)::bigint FROM new_media_attachments
+        SELECT COALESCE(SUM(size), 0) FROM new_media_attachments
       ) AS value
       FROM (
         SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
diff --git a/db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb b/db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb
deleted file mode 100644
index f8223f9c9..000000000
--- a/db/migrate/20240217175251_convert_file_size_columns_to_big_int.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../lib/mastodon/migration_helpers'
-
-class ConvertFileSizeColumnsToBigInt < ActiveRecord::Migration[7.1]
-  include Mastodon::MigrationHelpers
-
-  TABLE_COLUMN_MAPPING = [
-    [:accounts, :avatar_file_size],
-    [:accounts, :header_file_size],
-    [:custom_emojis, :image_file_size],
-    [:imports, :data_file_size],
-    [:media_attachments, :file_file_size],
-    [:media_attachments, :thumbnail_file_size],
-    [:preview_cards, :image_file_size],
-    [:site_uploads, :file_file_size],
-  ].freeze
-
-  disable_ddl_transaction!
-
-  def migrate_columns(to_type)
-    TABLE_COLUMN_MAPPING.each do |column_parts|
-      table, column = column_parts
-
-      # Skip this if we're resuming and already did this one.
-      next if column_for(table, column).sql_type == to_type.to_s
-
-      safety_assured do
-        change_column_type_concurrently table, column, to_type
-        cleanup_concurrent_column_type_change table, column
-      end
-    end
-  end
-
-  def up
-    migrate_columns(:bigint)
-  end
-
-  def down
-    migrate_columns(:integer)
-  end
-end
diff --git a/db/schema.rb b/db/schema.rb
index ee41a0c3a..11f1a202f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -166,11 +166,11 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "url"
     t.string "avatar_file_name"
     t.string "avatar_content_type"
-    t.bigint "avatar_file_size"
+    t.integer "avatar_file_size"
     t.datetime "avatar_updated_at", precision: nil
     t.string "header_file_name"
     t.string "header_content_type"
-    t.bigint "header_file_size"
+    t.integer "header_file_size"
     t.datetime "header_updated_at", precision: nil
     t.string "avatar_remote_url"
     t.boolean "locked", default: false, null: false
@@ -368,7 +368,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "domain"
     t.string "image_file_name"
     t.string "image_content_type"
-    t.bigint "image_file_size"
+    t.integer "image_file_size"
     t.datetime "image_updated_at", precision: nil
     t.datetime "created_at", precision: nil, null: false
     t.datetime "updated_at", precision: nil, null: false
@@ -558,7 +558,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.datetime "updated_at", precision: nil, null: false
     t.string "data_file_name"
     t.string "data_content_type"
-    t.bigint "data_file_size"
+    t.integer "data_file_size"
     t.datetime "data_updated_at", precision: nil
     t.bigint "account_id", null: false
     t.boolean "overwrite", default: false, null: false
@@ -635,7 +635,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.bigint "status_id"
     t.string "file_file_name"
     t.string "file_content_type"
-    t.bigint "file_file_size"
+    t.integer "file_file_size"
     t.datetime "file_updated_at", precision: nil
     t.string "remote_url", default: "", null: false
     t.datetime "created_at", precision: nil, null: false
@@ -651,7 +651,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.integer "file_storage_schema_version"
     t.string "thumbnail_file_name"
     t.string "thumbnail_content_type"
-    t.bigint "thumbnail_file_size"
+    t.integer "thumbnail_file_size"
     t.datetime "thumbnail_updated_at", precision: nil
     t.string "thumbnail_remote_url"
     t.index ["account_id", "status_id"], name: "index_media_attachments_on_account_id_and_status_id", order: { status_id: :desc }
@@ -855,7 +855,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "description", default: "", null: false
     t.string "image_file_name"
     t.string "image_content_type"
-    t.bigint "image_file_size"
+    t.integer "image_file_size"
     t.datetime "image_updated_at", precision: nil
     t.integer "type", default: 0, null: false
     t.text "html", default: "", null: false
@@ -993,7 +993,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
     t.string "var", default: "", null: false
     t.string "file_file_name"
     t.string "file_content_type"
-    t.bigint "file_file_size"
+    t.integer "file_file_size"
     t.datetime "file_updated_at", precision: nil
     t.json "meta"
     t.datetime "created_at", precision: nil, null: false

From ed556db3953d7585cc78a92597f1e3dca9cc2b53 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 7 May 2024 11:36:16 +0200
Subject: [PATCH 072/215] New Crowdin Translations (automated) (#30201)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/ca.json |   3 +-
 app/javascript/mastodon/locales/fi.json |   4 +-
 app/javascript/mastodon/locales/lt.json |   3 +-
 app/javascript/mastodon/locales/uk.json |  31 +++++
 config/locales/devise.ia.yml            |   2 +
 config/locales/doorkeeper.lt.yml        |   8 +-
 config/locales/ia.yml                   | 171 ++++++++++++++++++++++++
 config/locales/lt.yml                   |  78 ++++++++---
 config/locales/simple_form.ca.yml       |   2 +
 config/locales/simple_form.da.yml       |   2 +
 config/locales/simple_form.de.yml       |   2 +
 config/locales/simple_form.en-GB.yml    |   3 -
 config/locales/simple_form.es-AR.yml    |   2 +
 config/locales/simple_form.eu.yml       |   2 +
 config/locales/simple_form.fi.yml       |   2 +
 config/locales/simple_form.fo.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.is.yml       |   2 +
 config/locales/simple_form.lt.yml       |  25 +++-
 config/locales/simple_form.nl.yml       |   2 +
 config/locales/simple_form.nn.yml       |   1 +
 config/locales/simple_form.pl.yml       |   2 +
 config/locales/simple_form.pt-PT.yml    |   2 +
 config/locales/simple_form.sr-Latn.yml  |   2 +
 config/locales/simple_form.sr.yml       |   2 +
 config/locales/simple_form.th.yml       |   3 +
 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 +
 32 files changed, 338 insertions(+), 34 deletions(-)

diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 25aeea9b4..ea67d217d 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -318,7 +318,7 @@
   "follow_suggestions.personalized_suggestion": "Suggeriment personalitzat",
   "follow_suggestions.popular_suggestion": "Suggeriment popular",
   "follow_suggestions.popular_suggestion_longer": "Popular a {domain}",
-  "follow_suggestions.similar_to_recently_followed_longer": "Semblant a perfils que seguiu fa poc",
+  "follow_suggestions.similar_to_recently_followed_longer": "Semblant a perfils que seguiu de fa poc",
   "follow_suggestions.view_all": "Mostra-ho tot",
   "follow_suggestions.who_to_follow": "A qui seguir",
   "followed_tags": "Etiquetes seguides",
@@ -473,6 +473,7 @@
   "notification.follow": "{name} et segueix",
   "notification.follow_request": "{name} ha sol·licitat de seguir-te",
   "notification.mention": "{name} t'ha esmentat",
+  "notification.moderation-warning.learn_more": "Per a saber-ne més",
   "notification.moderation_warning": "Heu rebut un avís de moderació",
   "notification.moderation_warning.action_delete_statuses": "S'han eliminat algunes de les vostres publicacions.",
   "notification.moderation_warning.action_disable": "S'ha desactivat el vostre compte.",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 5a5031fd1..bae714b1d 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -298,7 +298,7 @@
   "filter_modal.select_filter.title": "Suodata tämä julkaisu",
   "filter_modal.title.status": "Suodata julkaisu",
   "filtered_notifications_banner.mentions": "{count, plural, one {maininta} other {mainintaa}}",
-  "filtered_notifications_banner.pending_requests": "Sinulle on ilmoituksia mahdollisesti tuntemiltasi henkilöiltä seuraavasti: {count, plural, =0 {Ei keltään} one {Yhdeltä henkilöltä} other {# henkilöltä}}",
+  "filtered_notifications_banner.pending_requests": "Ilmoituksia {count, plural, =0 {ei ole} one {1 henkilöltä} other {# henkilöltä}}, jonka saatat tuntea",
   "filtered_notifications_banner.title": "Suodatetut ilmoitukset",
   "firehose.all": "Kaikki",
   "firehose.local": "Tämä palvelin",
@@ -308,7 +308,7 @@
   "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelimen {domain} ylläpito on arvioinut, että saatat olla halukas tarkistamaan nämä seuraamispyynnöt erikseen.",
   "follow_suggestions.curated_suggestion": "Ehdotus ylläpidolta",
   "follow_suggestions.dismiss": "Älä näytä uudelleen",
-  "follow_suggestions.featured_longer": "Käsin valinnut palvelimen {domain} tiimi",
+  "follow_suggestions.featured_longer": "Valinnut käsin palvelimen {domain} tiimi",
   "follow_suggestions.friends_of_friends_longer": "Suosittu seuraamiesi ihmisten keskuudessa",
   "follow_suggestions.hints.featured": "Tämän profiilin on valinnut palvelimen {domain} tiimi.",
   "follow_suggestions.hints.friends_of_friends": "Seuraamasi käyttäjät suosivat tätä profiilia.",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 546b9b755..083a92201 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -143,7 +143,7 @@
   "compose.published.open": "Atidaryti",
   "compose.saved.body": "Įrašas išsaugotas.",
   "compose_form.direct_message_warning_learn_more": "Sužinoti daugiau",
-  "compose_form.encryption_warning": "Mastodon įrašai nėra šifruojami nuo galo iki galo. Per Mastodon nesidalyk jokia slapta informacija.",
+  "compose_form.encryption_warning": "Mastodon įrašai nėra visapusiškai šifruojami. Per Mastodon nesidalyk jokia slapta informacija.",
   "compose_form.hashtag_warning": "Šis įrašas nebus įtraukta į jokį saitažodį, nes ji nėra vieša. Tik viešų įrašų galima ieškoti pagal saitažodį.",
   "compose_form.lock_disclaimer": "Tavo paskyra nėra {locked}. Bet kas gali sekti tave ir peržiūrėti tik sekėjams skirtus įrašus.",
   "compose_form.lock_disclaimer.lock": "užrakinta",
@@ -415,6 +415,7 @@
   "loading_indicator.label": "Kraunama…",
   "media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}",
   "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta, nes persikėlei į {movedToAccount}.",
+  "mute_modal.show_options": "Rodyti parinktis",
   "navigation_bar.about": "Apie",
   "navigation_bar.advanced_interface": "Atidaryti išplėstinę žiniatinklio sąsają",
   "navigation_bar.blocks": "Užblokuoti naudotojai",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 6ae4e162b..3a7f63206 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -217,8 +217,19 @@
   "domain_block_modal.title": "Заблокувати домен?",
   "domain_block_modal.you_will_lose_followers": "Усіх ваших підписників з цього сервера буде вилучено.",
   "domain_block_modal.you_wont_see_posts": "Ви не бачитимете дописів і сповіщень від користувачів на цьому сервері.",
+  "domain_pill.activitypub_lets_connect": "Це дозволяє вам спілкуватися та взаємодіяти з людьми не лише на Mastodon, але й у різних соціальних додатках.",
+  "domain_pill.activitypub_like_language": "ActivityPub - це як мова, якою Мастодонт розмовляє з іншими соціальними мережами.",
   "domain_pill.server": "Сервер",
+  "domain_pill.their_handle": "Їхня адреса:",
+  "domain_pill.their_server": "Їхній цифровий дім, де живуть усі їхні пости.",
+  "domain_pill.their_username": "Їхній унікальний ідентифікатор на їхньому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
   "domain_pill.username": "Ім'я користувача",
+  "domain_pill.whats_in_a_handle": "Що є в адресі?",
+  "domain_pill.who_they_are": "Оскільки дескриптори вказують, хто це і де він знаходиться, ви можете взаємодіяти з людьми через соціальну мережу платформ на основі <button>ActivityPub</button>.",
+  "domain_pill.who_you_are": "Оскільки ваш нікнейм вказує, хто ви та де ви, люди можуть взаємодіяти з вами через соціальну мережу платформ на основі <button>ActivityPub</button>.",
+  "domain_pill.your_handle": "Ваша адреса:",
+  "domain_pill.your_server": "Ваш цифровий дім, де живуть усі ваші публікації. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.",
+  "domain_pill.your_username": "Ваш унікальний ідентифікатор на цьому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.",
   "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.",
   "embed.preview": "Ось який вигляд це матиме:",
   "emoji_button.activity": "Діяльність",
@@ -286,6 +297,7 @@
   "filter_modal.select_filter.subtitle": "Використати наявну категорію або створити нову",
   "filter_modal.select_filter.title": "Фільтрувати цей допис",
   "filter_modal.title.status": "Фільтрувати допис",
+  "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentions}}",
   "filtered_notifications_banner.pending_requests": "Сповіщення від {count, plural, =0 {жодної особи} one {однієї особи} few {# осіб} many {# осіб} other {# особи}}, котрих ви можете знати",
   "filtered_notifications_banner.title": "Відфільтровані сповіщення",
   "firehose.all": "Всі",
@@ -296,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Хоча ваш обліковий запис не заблоковано, персонал {domain} припускає, що, можливо, ви хотіли б переглянути ці запити на підписку.",
   "follow_suggestions.curated_suggestion": "Відібрано командою",
   "follow_suggestions.dismiss": "Більше не показувати",
+  "follow_suggestions.featured_longer": "Вибрано командою {domain} вручну",
+  "follow_suggestions.friends_of_friends_longer": "Популярні серед людей, за якими ви слідкуєте",
   "follow_suggestions.hints.featured": "Цей профіль був обраний командою {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Цей профіль популярний серед тих людей, на яких ви підписані.",
   "follow_suggestions.hints.most_followed": "За цим профілем один з найпопулярніших на {domain}.",
@@ -303,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Цей профіль схожий на профілі, за якими ви стежили останнім часом.",
   "follow_suggestions.personalized_suggestion": "Персоналізована пропозиція",
   "follow_suggestions.popular_suggestion": "Популярна пропозиція",
+  "follow_suggestions.popular_suggestion_longer": "Популярно на {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Схожі на профілі, за якими ви нещодавно стежили",
   "follow_suggestions.view_all": "Переглянути все",
   "follow_suggestions.who_to_follow": "На кого підписатися",
   "followed_tags": "Відстежувані хештеґи",
@@ -457,12 +473,23 @@
   "notification.follow": "{name} підписалися на вас",
   "notification.follow_request": "{name} відправили запит на підписку",
   "notification.mention": "{name} згадали вас",
+  "notification.moderation-warning.learn_more": "Дізнатися більше",
+  "notification.moderation_warning": "Ви отримали попередження модерації",
+  "notification.moderation_warning.action_delete_statuses": "Деякі з ваших дописів було видалено.",
+  "notification.moderation_warning.action_disable": "Ваш обліковий запис було вимкнено.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Деякі з ваших дописів були позначені як чутливі.",
+  "notification.moderation_warning.action_none": "Ваш обліковий запис отримав попередження модерації.",
+  "notification.moderation_warning.action_sensitive": "Відтепер ваші дописи будуть позначені як чутливі.",
+  "notification.moderation_warning.action_silence": "Ваш обліковий запис було обмежено.",
+  "notification.moderation_warning.action_suspend": "Ваш обліковий запис було заблоковано.",
   "notification.own_poll": "Ваше опитування завершилося",
   "notification.poll": "Опитування, у якому ви голосували, скінчилося",
   "notification.reblog": "{name} поширює ваш допис",
   "notification.relationships_severance_event": "Втрачено з'єднання з {name}",
   "notification.relationships_severance_event.account_suspension": "Адміністратор з {from} призупинив {target}, що означає, що ви більше не можете отримувати оновлення від них або взаємодіяти з ними.",
+  "notification.relationships_severance_event.domain_block": "Адміністратор з {from} заблокував {target}, включаючи {followersCount} ваших підписників і {{followingCount, plural, one {# account} other {# accounts}}, на які ви підписані.",
   "notification.relationships_severance_event.learn_more": "Дізнатися більше",
+  "notification.relationships_severance_event.user_domain_block": "Ви заблокували {target}, видаливши {followersCount} ваших підписників і {followingCount, plural, one {# account} other {# accounts}}, за якими ви стежите.",
   "notification.status": "{name} щойно дописує",
   "notification.update": "{name} змінює допис",
   "notification_requests.accept": "Прийняти",
@@ -504,9 +531,13 @@
   "notifications.permission_required": "Сповіщення на стільниці не доступні, оскільки необхідний дозвіл не надано.",
   "notifications.policy.filter_new_accounts.hint": "Створено впродовж {days, plural, one {одного} few {# днів} many {# днів} other {# дня}}",
   "notifications.policy.filter_new_accounts_title": "Нові облікові записи",
+  "notifications.policy.filter_not_followers_hint": "Включаючи людей, які стежать за вами менше {days, plural, one {one day} other {# days}}",
   "notifications.policy.filter_not_followers_title": "Люди не підписані на вас",
   "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.title": "Відфільтрувати сповіщення від…",
   "notifications_permission_banner.enable": "Увімкнути сповіщення стільниці",
   "notifications_permission_banner.how_to_control": "Щоб отримувати сповіщення, коли Mastodon не відкрито, увімкніть сповіщення стільниці. Ви можете контролювати, які типи взаємодій створюють сповіщення через кнопку {icon} вгорі після їхнього увімкнення.",
   "notifications_permission_banner.title": "Не проґавте нічого",
diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml
index 568750781..b36566821 100644
--- a/config/locales/devise.ia.yml
+++ b/config/locales/devise.ia.yml
@@ -21,6 +21,7 @@ ia:
       confirmation_instructions:
         action: Verificar adresse de e-mail
         action_with_app: Confirmar e retornar a %{app}
+        subject: 'Mastodon: Instructiones de confirmation pro %{instance}'
         title: Verificar adresse de e-mail
       email_changed:
         explanation: 'Le adresse de e-mail pro tu conto essera cambiate a:'
@@ -32,6 +33,7 @@ ia:
         title: Contrasigno cambiate
       reconfirmation_instructions:
         explanation: Confirma le nove adresse pro cambiar tu email.
+        subject: 'Mastodon: Confirmar e-mail pro %{instance}'
         title: Verificar adresse de e-mail
       reset_password_instructions:
         action: Cambiar contrasigno
diff --git a/config/locales/doorkeeper.lt.yml b/config/locales/doorkeeper.lt.yml
index 847f41e81..5be291bf8 100644
--- a/config/locales/doorkeeper.lt.yml
+++ b/config/locales/doorkeeper.lt.yml
@@ -64,7 +64,7 @@ lt:
         review_permissions: Peržiūrėti leidimus
         title: Reikalingas leidimas
       show:
-        title: Nukopijuok šį įgaliojimo kodą ir įklijuok jį į programėlę.
+        title: Nukopijuok šį tapatybės patvirtinimo kodą ir įklijuok jį į programėlę.
     authorized_applications:
       buttons:
         revoke: Naikinti
@@ -126,7 +126,7 @@ lt:
         blocks: Blokavimai
         bookmarks: Žymės
         conversations: Pokalbiai
-        crypto: Galo iki galo užšifravimas
+        crypto: Visapusis šifravimas
         favourites: Mėgstami
         filters: Filtrai
         follow: Sekimai, nutildymai ir blokavimai
@@ -163,8 +163,8 @@ lt:
       admin:write:email_domain_blocks: atlikti prižiūrėjimo veiksmus su el. laiško domenų blokavimais
       admin:write:ip_blocks: atlikti prižiūrėjimo veiksmus su IP blokavimais
       admin:write:reports: atlikti paskyrų prižiūrėjimo veiksmus atsakaitams
-      crypto: naudoti galo iki galo šifravimą
-      follow: modifikuoti paskyros santykius
+      crypto: naudoti visapusį šifravimą
+      follow: modifikuoti paskyros sąryšius
       push: gauti tavo stumiamuosius pranešimus
       read: skaityti tavo visus paskyros duomenis
       read:accounts: matyti paskyrų informaciją
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 85d7c0ed8..193f2b0d5 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -740,9 +740,18 @@ ia:
         title: Require que nove usatores solve un CAPTCHA pro confirmar lor conto
       content_retention:
         danger_zone: Zona periculose
+        preamble: Controlar como contento generate per le usator es immagazinate in Mastodon.
+        title: Retention de contento
+      default_noindex:
+        desc_html: Affice tote le usatores qui non ha cambiate iste parametro per se mesme
+        title: Refusar de ordinario le indexation del usatores per le motores de recerca
       discovery:
+        follow_recommendations: Sequer le recommendationes
+        preamble: Presentar contento interessante es instrumental in introducer nove usatores qui pote non cognoscer alcuno de Mastodon.
         profile_directory: Directorio de profilos
         public_timelines: Chronologias public
+        publish_discovered_servers: Publicar servitores discoperite
+        publish_statistics: Publicar statistica
         title: Discoperi
         trends: Tendentias
       domain_blocks:
@@ -750,18 +759,27 @@ ia:
         disabled: A necuno
         users: A usators local in session
       registrations:
+        moderation_recommandation: Per favor verifica que tu ha un adequate e reactive equipa de moderation ante que tu aperi registrationes a quicunque!
+        preamble: Controla qui pote crear un conto sur tu servitor.
         title: Registrationes
       registrations_mode:
         modes:
+          approved: Approbation necessari pro le inscription
           none: Nemo pote inscriber se
           open: Quicunque pote inscriber se
+        warning_hint: Nos consilia usar “Approbation necessari pro le inscription” si tu non crede que tu equipa de moderation pote tractar spam e registrationes maligne in un modo opportun.
       security:
+        authorized_fetch: Require authentication ab servitores federate
         authorized_fetch_hint: Requirer authentication de servitores federate permitte un application plus stricte de blocadas a nivello de usator e de servitor. Nonobstante, isto diminue le prestationes del servitor, reduce le portata de tu responsas e pote introducer problemas de compatibilitate con certe servicios federate. In plus, isto non impedira le actores dedicate a recuperar tu messages public e tu contos.
+        authorized_fetch_overridden_hint: Tu actualmente non pote cambiar iste parametros perque il es superate per un variabile de ambiente.
+        federation_authentication: Application del authentication de federation
       title: Parametros de servitor
     site_uploads:
       delete: Deler file incargate
       destroyed_msg: Incarga de sito delite con successo!
     software_updates:
+      critical_update: Critic! Actualisa tosto
+      description: Il es recommendate de mantener actualisate tu installation de Mastodon pro beneficiar del ultime reparationes e functiones. In ultra, il es aliquando critic actualisar Mastodon in maniera opportun pro evitar problemas de securitate. Pro iste rationes, Mastodon controla pro actualisationes cata 30 minutas, e te notificara secundo tu preferentias de notificationes per email.
       documentation_link: Pro saper plus
       release_notes: Notas de version
       title: Actualisationes disponibile
@@ -769,11 +787,15 @@ ia:
       types:
         major: Version major
         minor: Version minor
+        patch: 'Version de pecias: remedios de bugs e cambiamentos facile a applicar'
       version: Version
     statuses:
       account: Autor
       application: Application
+      back_to_account: Retro al pagina de conto
+      back_to_report: Retro al pagina de reporto
       batch:
+        remove_from_report: Remover ab reporto
         report: Reporto
       deleted: Delite
       favourites: Favoritos
@@ -783,8 +805,10 @@ ia:
       media:
         title: Medios
       metadata: Metadatos
+      no_status_selected: Nulle messages era cambiate perque necun era seligite
       open: Aperir message
       original_status: Message original
+      reblogs: Promotiones
       status_changed: Messages cambiate
       title: Messages del conto
       trending: Tendentias
@@ -803,35 +827,127 @@ ia:
       appeal_pending: Appello pendente
       appeal_rejected: Appello rejectate
     system_checks:
+      database_schema_check:
+        message_html: Il ha migrationes de base de datos pendente. Per favor exeque los pro assecurar que le application se comporta como expectate
+      elasticsearch_health_red:
+        message_html: Le aggregation Elasticsearch es malsan (stato rubie), le functiones de recerca es indisponibile
+      elasticsearch_health_yellow:
+        message_html: Le aggregation Elasticsearch es malsan (stato jalne), tu poterea voler investigar le ration
+      elasticsearch_index_mismatch:
+        message_html: Le mappas de indice Elasticsearch es obsolete. Per favor exeque <code>tootctl search deploy --only=%{value}</code>
       elasticsearch_preset:
         action: Vide documentation
+        message_html: Tu aggregation Elasticsearch ha plus que un nodo, ma Mastodon non es configurate a usar los.
       elasticsearch_preset_single_node:
         action: Vide documentation
+        message_html: Tu aggregation Elasticsearch ha un sol nodo, <code>ES_PRESET</code> deberea esser predefinite a <code>single_node_cluster</code>.
+      elasticsearch_reset_chewy:
+        message_html: Le indexation de tu systema Elasticsearch es obsolete per un cambio de configuration. Per cfavor exeque <code>tootctl search deploy --reset-chewy</code> pro actualisar lo.
+      elasticsearch_running_check:
+        message_html: Impossibile connecter se a Elasticsearch. Verifica que illo flue, o disactiva le recerca a plen texto
+      elasticsearch_version_check:
+        message_html: 'Version de Elasticsearch incompatibile: %{value}'
+        version_comparison: Elasticsearch %{running_version} es currente dum %{required_version} es necesse
       rules_check:
         action: Gerer le regulas del servitor
+        message_html: Tu non ha definite ulle regulas de servitor.
+      sidekiq_process_check:
+        message_html: Nulle processo Sidekiq currente pro le %{value} cauda(s). Controla tu configuration de Sidekiq
       software_version_critical_check:
         action: Vider le actualisationes disponibile
         message_html: Un actualisation critic de Mastodon es disponibile, actualisa lo le plus rapide possibile.
       software_version_patch_check:
         action: Vider le actualisationes disponibile
+        message_html: Un actualisation de remedio de bug pro Mastodon es disponibile.
       upload_check_privacy_error:
         action: Verifica hic pro plus de information
+        message_html: "<strong>Tu servitor de web es mal-configurate. Le confidentialitate de tu usatores es a risco.</strong>"
       upload_check_privacy_error_object_storage:
         action: Verifica hic pro plus de information
+        message_html: "<strong>Tu immagazinage de objectos es mal-configurate. Le confidentialitate de tu usatores es a risco.</strong>"
+    tags:
+      review: Revide le stato
+      updated_msg: Parametros de hashtag actualisate con successo
+    title: Administration
     trends:
+      allow: Permitter
       approved: Approbate
+      disallow: Impedir
+      links:
+        allow: Permitter ligamine
+        allow_provider: Permitter editor
+        description_html: Istos es ligamines que es actualmente multo compartite per contos de que tu servitor vide messages. Illo pote adjutar tu usatores a discoperir lo que eveni in le mundo. Nulle ligamines es monstrate publicamente usque tu non approba le editor. Tu alsi pote permitter o rejectar ligamines singule.
+        disallow: Impedir ligamine
+        disallow_provider: Impedir editor
+        no_link_selected: Nulle ligamine era cambiate perque nulle era seligite
+        publishers:
+          no_publisher_selected: Nulle editores era cambiate perque nemo era seligite
+        shared_by_over_week:
+          one: Compartite per un persona le septimana passate
+          other: Compartite per %{count} personas le septimana passate
+        title: Ligamines de tendentia
+      not_allowed_to_trend: Non permittite haber tendentia
+      only_allowed: Solo permittite
+      pending_review: Attende revision
+      preview_card_providers:
+        allowed: Ligamines ab iste editor pote haber tendentia
+        description_html: Il ha dominios ab que ligamines es sovente compartite sur tu servitor. Ligamines non habera publicamente tendentia salvo que le dominio del ligamine es approbate. Tu approbation (o rejection) se extende al sub-dominios.
+        rejected: Ligamines ab iste editor non habera tendentia
+        title: Editores
       rejected: Rejectate
+      statuses:
+        allow: Permitter message
+        allow_account: Permitter autor
+        description_html: Istos es messages que tu servitor cognosce perque illos es al momento multo compartite e favorite. Isto pote adjutar tu nove e renovate usatores a trovar altere personas a sequer. Nulle messages es monstrate publicamente usque tu approba le autor, e le autor permitte que su conto es suggerite a alteres. Tu alsi pote permitter o rejectar messages singule.
+        disallow: Impedir message
+        disallow_account: Impedir autor
+        no_status_selected: Nulle messages era cambiate perque nulle era seligite
+        not_discoverable: Le autor non ha optate pro esser detectabile
+        shared_by:
+          one: Compartite e favorite un tempore
+          other: Compartite e favorite %{friendly_count} tempores
+        title: Messages de tendentia
       tags:
+        current_score: Punctuage actual %{score}
+        dashboard:
+          tag_accounts_measure: usos unic
+          tag_languages_dimension: Linguas principal
+          tag_servers_dimension: Servitores principal
+          tag_servers_measure: servitores differente
+          tag_uses_measure: usos total
+        listable: Pote esser suggerite
+        no_tag_selected: Nulle placas era cambiate perque nulle era seligite
+        not_listable: Non sera suggerite
+        not_trendable: Non apparera sub tendentias
         not_usable: Non pote esser usate
+        peaked_on_and_decaying: Habeva un picco %{date}, ora decade
+        title: Hashtags de tendentia
+        trendable: Pote apparer sub tendentias
+        trending_rank: 'De tendentia #%{rank}'
+        usable: Pote esser usate
+        usage_comparison: Usate %{today} vices hodie, al contrario del %{yesterday} de heri
+        used_by_over_week:
+          one: Usate per un persona le ultime septimana
+          other: Usate per %{count} personas le ultime septimana
       title: Tendentias
+      trending: Tendentias
     warning_presets:
       add_new: Adder nove
       delete: Deler
+      edit_preset: Rediger aviso predefinite
+      empty: Tu non ha ancora definite alcun avisos predefinite.
+      title: Gerer avisos predefinite
     webhooks:
+      add_new: Adder terminal
       delete: Deler
       disable: Disactivar
       disabled: Disactivate
+      edit: Rediger terminal
       enable: Activar
+      enabled: Active
+      enabled_events:
+        one: 1 evento activate
+        other: "%{count} eventos activate"
       events: Eventos
       status: Stato
   admin_mailer:
@@ -839,11 +955,19 @@ ia:
       subject: Actualisationes critic de Mastodon es disponibile pro %{instance}!
     new_software_updates:
       subject: Nove versiones de Mastodon es disponibile pro %{instance}!
+  aliases:
+    add_new: Crear alias
   appearance:
     advanced_web_interface: Interfacie web avantiate
+    confirmation_dialogs: Dialogos de confirmation
+    discovery: Discoperta
+    localization:
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Totes pote contribuer.
     sensitive_content: Contento sensibile
   application_mailer:
     notification_preferences: Cambiar preferentias de e-mail
+    salutation: "%{name},"
     settings: 'Cambiar preferentias de e-mail: %{link}'
     unsubscribe: Desubscriber
     view: 'Vider:'
@@ -853,25 +977,65 @@ ia:
     created: Application create con successo
     destroyed: Application delite con successo
     logout: Clauder le session
+    regenerate_token: Regenerar testimonio de accesso
+    token_regenerated: Testimonio de accesso regenerate con successo
+    warning: Sia multo attente con iste datos. Jammais compartir los con quicunque!
+    your_token: Tu testimonio de accesso
   auth:
+    apply_for_account: Peter un conto
+    captcha_confirmation:
+      hint_html: Justo un altere cosa! Nos debe confirmar que tu es un human (isto es assi proque nos pote mantener foras le spam!). Solve le CAPTCHA infra e clicca "Continuar".
+      title: Controlo de securitate
     confirmations:
+      awaiting_review_title: Tu registration es revidite
+      clicking_this_link: cliccante iste ligamine
+      login_link: acceder
+      proceed_to_login_html: Ora tu pote continuar a %{login_link}.
       welcome_title: Benvenite, %{name}!
     delete_account: Deler le conto
+    description:
+      prefix_sign_up: Inscribe te sur Mastodon hodie!
+    didnt_get_confirmation: Non recipeva tu un ligamine de confirmation?
+    dont_have_your_security_key: Non ha tu le clave de securitate?
+    forgot_password: Contrasigno oblidate?
+    invalid_reset_password_token: Pete un nove.
+    link_to_webauth: Usa tu apparato clave de securitate
+    log_in_with: Accede con
+    login: Accede
     logout: Clauder le session
+    migrate_account: Move a un conto differente
+    or_log_in_with: O accede con
     progress:
+      confirm: Confirma le email
       details: Tu detalios
+      review: Nostre revision
+      rules: Accepta le regulas
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Inscribe te
+    resend_confirmation: Reinviar ligamine de confirmation
+    reset_password: Remontar le contrasigno
+    rules:
+      accept: Acceptar
+      back: Retro
+      title: Alcun regulas base.
+    security: Securitate
     set_new_password: Definir un nove contrasigno
     status:
       account_status: Stato del conto
       view_strikes: Examinar le admonitiones passate contra tu conto
   challenge:
     invalid_password: Contrasigno non valide
+    prompt: Confirma le contrasigno pro continuar
   deletes:
+    confirm_password: Insere tu contrasigno actual pro verificar tu identitate
     proceed: Deler le conto
     success_msg: Tu conto esseva delite con successo
     warning:
       data_removal: Tu messages e altere datos essera removite permanentemente
       email_change_html: Tu pote <a href="%{path}">cambiar tu adresse de e-mail</a> sin deler tu conto
+      username_available: Tu nomine de usator essera disponibile novemente
   disputes:
     strikes:
       action_taken: Action prendite
@@ -908,6 +1072,7 @@ ia:
   errors:
     '422':
       content: Le verification de securitate ha fallite. Bloca tu le cookies?
+      title: Falleva le verification de securitate
   existing_username_validator:
     not_found_multiple: non poteva trovar %{usernames}
   exports:
@@ -937,6 +1102,9 @@ ia:
       title: Modificar filtro
     index:
       delete: Deler
+      statuses:
+        one: "%{count} message"
+        other: "%{count} messages"
       title: Filtros
     new:
       save: Salveguardar nove filtro
@@ -970,6 +1138,7 @@ ia:
       blocking: Importation de contos blocate
       bookmarks: Importation de marcapaginas
       domain_blocking: Importation de dominios blocate
+      following: Importation de contos sequite
       lists: Importation de listas
       muting: Importation de contos silentiate
     type: Typo de importation
@@ -993,6 +1162,7 @@ ia:
       '604800': 1 septimana
       '86400': 1 die
     expires_in_prompt: Nunquam
+    title: Invitar personas
   login_activities:
     authentication_methods:
       password: contrasigno
@@ -1137,6 +1307,7 @@ ia:
     warning:
       appeal: Submitter un appello
       subject:
+        disable: Tu conto %{acct} ha essite gelate
         none: Advertimento pro %{acct}
         sensitive: Tu messages sur %{acct} essera marcate como sensibile a partir de ora
         silence: Tu conto %{acct} ha essite limitate
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 3449f1d5d..35111ad39 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -428,9 +428,12 @@ lt:
         title: Naujas el pašto juodojo sąrašo įtraukimas
       title: El pašto juodasis sąrašas
     instances:
+      back_to_all: Visi
       by_domain: Domenas
       content_policies:
         reason: Viešoji priežastis
+      delivery:
+        all: Visi
       delivery_available: Pristatymas galimas
       moderation:
         all: Visi
@@ -537,6 +540,8 @@ lt:
       delete: Ištrinti
       edit_preset: Keisti įspėjimo nustatymus
       title: Valdyti įspėjimo nustatymus
+    webhooks:
+      events: Įvykiai
   admin_mailer:
     auto_close_registrations:
       body: Dėl pastarojo meto peržiūrėtojų aktyvumo trūkumo %{instance} registracija buvo automatiškai pakeista į reikalaujančią rankinės būdo peržiūros, kad %{instance} nebūtų naudojama kaip platforma potencialiems blogiems veikėjams. Bet kuriuo metu gali ją vėl perjungti į atvirą registraciją.
@@ -546,9 +551,15 @@ lt:
       body_remote: Kažkas iš %{domain} parašė skundą apie %{target}
       subject: Naujas skundas %{instance} (#%{id})
   appearance:
+    advanced_web_interface: Išplėstinė žiniatinklio sąsaja
+    advanced_web_interface_hint: 'Jei nori išnaudoti visą ekrano plotį, išplėstinė žiniatinklio sąsaja leidžia sukonfigūruoti daug skirtingų stulpelių, kad vienu metu matytum tiek informacijos, kiek tik nori: Pagrindinis, pranešimai, federacinė laiko skalė, bet kokie sąrašai ir saitažodžiai.'
+    animations_and_accessibility: Animacijos ir pritaikymas neįgaliesiems
+    confirmation_dialogs: Patvirtinimo dialogai
+    discovery: Atradimas
     localization:
       body: Mastodon verčia savanoriai.
       guide_link_text: Visi gali prisidėti.
+    sensitive_content: Jautrus turinys
   application_mailer:
     notification_preferences: Keisti el. pašto nuostatas
     settings: 'Keisti el. pašto nuostatas: %{link}'
@@ -581,6 +592,7 @@ lt:
     security: Apsauga
     set_new_password: Nustatyti naują slaptažodį
     status:
+      account_status: Paskyros būsena
       redirecting_to: Tavo paskyra yra neaktyvi, nes šiuo metu ji nukreipiama į %{acct}.
       self_destruct: Kadangi %{domain} uždaromas, turėsi tik ribotą prieigą prie savo paskyros.
       view_strikes: Peržiūrėti ankstesnius savo paskyros pažeidimus
@@ -611,13 +623,15 @@ lt:
       your_appeal_approved: Tavo apeliacija buvo patvirtinta
       your_appeal_pending: Pateikei apeliaciją
       your_appeal_rejected: Tavo apeliacija buvo atmesta
+  edit_profile:
+    hint_html: "<strong>Tinkink tai, ką žmonės mato tavo viešame profilyje ir šalia įrašų.</strong> Kiti žmonės labiau linkę sekti atgal ir bendrauti su tavimi, jei tavo profilis yra užpildytas ir turi profilio nuotrauką."
   errors:
     '403': Jūs neturie prieigos matyti šiam puslapiui.
     '404': Puslapis nerastas.
     '410': Puslapis neegzistuoja.
     '422':
-      content: Apsaugos patvirtinmas klaidingas. Ar jūs blokuojate sausainius?
-      title: Apsaugos patvirtinimas nepavyko
+      content: Nepavyko saugumo patvirtinimas. Ar blokuoji slapukus?
+      title: Nepavyko saugumo patvirtinimas
     '429': Stabdomas
     '500':
       content: Atsiprašome, tačiau mūsų pusėje įvyko klaida.
@@ -638,6 +652,7 @@ lt:
     storage: Medijos sandėlis
   featured_tags:
     add_new: Pridėti naują
+    hint_html: "<strong>Savo profilyje parodyk svarbiausius saitažodžius.</strong> Tai puikus įrankis kūrybiniams darbams ir ilgalaikiams projektams sekti, todėl svarbiausios saitažodžiai rodomi matomoje vietoje profilyje ir leidžia greitai pasiekti tavo paties įrašus."
   filters:
     contexts:
       home: Namų laiko juosta
@@ -654,8 +669,10 @@ lt:
     new:
       title: Pridėti naują filtrą
   generic:
+    all: Visi
     changes_saved_msg: Pakeitimai sėkmingai išsaugoti!
     copy: Kopijuoti
+    order_by: Tvarkyti pagal
     save_changes: Išsaugoti pakeitimus
   imports:
     modes:
@@ -686,10 +703,10 @@ lt:
     invalid: Šis kvietimas negalioja.
     invited_by: 'Jus pakvietė:'
     max_uses:
-      few: "%{count} panaudojimai"
-      many: "%{count} panaudojimo"
-      one: 1 panaudojimas
-      other: "%{count} panaudojimų"
+      few: "%{count} naudojimai"
+      many: "%{count} naudojimo"
+      one: 1 naudojimas
+      other: "%{count} naudojimų"
     max_uses_prompt: Nėra limito
     prompt: Generuok ir bendrink nuorodas su kitais, kad suteiktum prieigą prie šio serverio
     table:
@@ -727,6 +744,9 @@ lt:
       body: 'Tavo įrašą pakėlė %{name}:'
       subject: "%{name} pakėlė tavo įrašą"
       title: Naujas pakėlimas
+  notifications:
+    email_events: Įvykiai, skirti el. laiško pranešimams
+    email_events_hint: 'Pasirink įvykius, apie kuriuos nori gauti pranešimus:'
   pagination:
     newer: Naujesnis
     next: Kitas
@@ -738,9 +758,30 @@ lt:
     public_timelines: Viešieji laiko skalės
   privacy:
     hint_html: "<strong>Tikrink, kaip nori, kad tavo profilis ir įrašai būtų randami.</strong> Įjungus įvairias Mastodon funkcijas, jos gali padėti pasiekti platesnę auditoriją. Akimirką peržiūrėk šiuos nustatymus, kad įsitikintum, jog jie atitinka tavo naudojimo būdą."
+    privacy: Privatumas
+    privacy_hint_html: Valdyk, kiek informacijos norėtum atskleisti kitų labui. Žmonės atranda įdomių profilių ir šaunių programėlių, naršydami kitų žmonių sekamus profilius ir žiūrėdami, iš kokių programėlių jie skelbia įrašus, bet tu galbūt norėsi tai slėpti.
+    reach: Pasiekiamumas
+    reach_hint_html: Valdyk, ar norėtum, kad tave atrastų ir sektų nauji žmonės. Ar nori, kad įrašai būtų rodomi Naršyti ekrane? Ar nori, kad kiti žmonės tave matytų savo sekimo rekomendacijose? Ar nori automatiškai priimti visus naujus sekėjus, ar detaliai valdyti kiekvieną iš jų?
+    search: Paieška
+    search_hint_html: Valdyk, kaip norėtum būti surastas. Ar nori, kad žmonės tave rastų pagal tai, apie ką viešai paskelbi? Ar nori, kad ne Mastodon žmonės, ieškantys profilio internete, rastų tavo profilį? Atmink, kad visiško pašalinimo iš visų paieškos variklių viešai skelbiamai informacijai užtikrinti negalima.
+    title: Privatumas ir pasiekiamumas
+  privacy_policy:
+    title: Privatumo politika
   redirects:
     prompt: Jei pasitiki šia nuoroda, spustelėk ją, kad tęstum.
     title: Palieki %{instance}
+  relationships:
+    activity: Paskyros aktyvumas
+    dormant: Neaktyvus
+    followers: Sekėjai
+    following: Sekama
+    last_active: Paskutinį kartą aktyvus
+    most_recent: Naujausias
+    moved: Perkelta
+    mutual: Bendri
+    primary: Pirminis
+    relationship: Sąryšis
+    status: Paskyros būsena
   remote_follow:
     missing_resource: Jūsų paskyros nukreipimo URL nerasta
   scheduled_statuses:
@@ -774,13 +815,17 @@ lt:
     development: Plėtojimas
     edit_profile: Keisti profilį
     export: Informacijos eksportas
-    featured_tags: Rodomi saitažodžiai(#)
+    featured_tags: Rodomi saitažodžiai
     import: Importuoti
     migrate: Paskyros migracija
     notifications: El. laiško pranešimai
     preferences: Nuostatos
     profile: Viešas profilis
+    relationships: Sekimai ir sekėjai
+    severed_relationships: Nutrūkę sąryšiai
     two_factor_authentication: Dviejų veiksnių autentikacija
+  severed_relationships:
+    preamble: Užblokavus domeną arba prižiūrėtojams nusprendus pristabdyti nuotolinio serverio veiklą, gali prarasti sekimus ir sekėjus. Kai taip atsitiks, galėsi atsisiųsti nutrauktų sąryšių sąrašus, kad juos patikrinti ir galbūt importuoti į kitą serverį.
   statuses:
     attached:
       description: 'Pridėta: %{attached}'
@@ -795,11 +840,11 @@ lt:
     show_more: Daugiau
     visibilities:
       private: Tik sekėjams
-      private_long: Rodyti tik sekėjams
+      private_long: rodyti tik sekėjams
       public: Viešas
-      public_long: Visi gali matyti
+      public_long: visi gali matyti
       unlisted: Neįtrauktas į sąrašus
-      unlisted_long: Matyti gali visi, tačiau nėra įtraukti į viešąsias laiko skales
+      unlisted_long: matyti gali visi, bet nėra išvardyti į viešąsias laiko skales
   statuses_cleanup:
     enabled_hint: Automatiškai ištrina įrašus, kai jie pasiekia nustatytą amžiaus ribą, nebent jie atitinka vieną iš toliau nurodytų išimčių
     keep_polls_hint: Neištrina jokių tavo apklausų
@@ -808,9 +853,9 @@ lt:
   stream_entries:
     sensitive_content: Jautrus turinys
   themes:
-    contrast: Mastodon (Didelio Kontrasto)
-    default: Mastodon (Tamsus)
-    mastodon-light: Mastodon (Šviesus)
+    contrast: Mastodon (didelis kontrastas)
+    default: Mastodon (tamsi)
+    mastodon-light: Mastodon (šviesi)
     system: Automatinis (naudoti sistemos temą)
   two_factor_authentication:
     disable: Išjungti
@@ -876,7 +921,7 @@ lt:
       follows_title: Ką sekti
       follows_view_more: Peržiūrėti daugiau sekamų žmonių
       hashtags_subtitle: Naršyk, kas tendencinga per pastarąsias 2 dienas.
-      hashtags_title: Tendencijos saitažodžiai
+      hashtags_title: Trendingiausi saitažodžiai
       hashtags_view_more: Peržiūrėti daugiau tendencingų saitažodžių
       post_action: Sukurti
       post_step: Sakyk labas pasauliui tekstu, nuotraukomis, vaizdo įrašais arba apklausomis.
@@ -896,9 +941,10 @@ lt:
     seamless_external_login: Esi prisijungęs (-usi) per išorinę paslaugą, todėl slaptažodžio ir el. pašto nustatymai nepasiekiami.
     signed_in_as: 'Prisijungta kaip:'
   verification:
-    extra_instructions_html: <strong>Patarimas:</strong> nuoroda tavo svetainėje gali būti nematoma. Svarbi dalis – tai, kas <code>rel="me"</code> neleidžia apsimesti interneto svetainėse, kuriose yra naudotojų sukurto turinio. Vietoj to gali naudoti net <code>nuorodą</code> puslapio antraštėje esančią žymę <code>a</code>, tačiau HTML turi būti pasiekiamas nevykdant JavaScript.
+    extra_instructions_html: <strong>Patarimas:</strong> nuoroda tavo svetainėje gali būti nematoma. Svarbi dalis – tai, kad <code>rel="me"</code> neleidžia apsimesti interneto svetainėse, kuriose yra naudotojų sukurto turinio. Vietoj to gali naudoti net <code>nuorodą</code> puslapio antraštėje esančią žymę <code>a</code>, tačiau HTML turi būti pasiekiamas nevykdant JavaScript.
+    here_is_how: Štai kaip
     hint_html: "<strong>Savo tapatybės patvirtinimas Mastodon skirtas visiems.</strong> Remiantis atviraisiais žiniatinklio standartais, dabar ir visam laikui nemokamas. Viskas, ko tau reikia, yra asmeninė svetainė, pagal kurią žmonės tave atpažįsta. Kai iš savo profilio pateiksi nuorodą į šią svetainę, patikrinsime, ar svetainėje yra nuoroda į tavo profilį, ir parodysime vizualinį indikatorių."
-    instructions_html: Nukopijuok ir įklijuok toliau pateiktą kodą į savo svetainės HTML. Tada į vieną iš papildomų profilio laukų skirtuke „Redaguoti profilį“ įrašyk savo svetainės adresą ir išsaugok pakeitimus.
+    instructions_html: Nukopijuok ir įklijuok toliau pateiktą kodą į savo svetainės HTML. Tada į vieną iš papildomų profilio laukų skirtuke Redaguoti profilį įrašyk savo svetainės adresą ir išsaugok pakeitimus.
     verification: Patvirtinimas
     verified_links: Tavo patikrintos nuorodos
   webauthn_credentials:
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index 62c1da55b..d3dc4b13f 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -77,11 +77,13 @@ ca:
           warn: Oculta el contingut filtrat darrere d'un avís mencionant el títol del filtre
       form_admin_settings:
         activity_api_enabled: Contador de tuts publicats localment, usuaris actius i registres nous en períodes setmanals
+        app_icon: WEBP, PNG, GIF o JPG. Canvia la icona per defecte de l'app en dispositius mòbils per una de personalitzada.
         backups_retention_period: Els usuaris poden generar arxius de les seves publicacions per a baixar-los més endavant. Quan tingui un valor positiu, els arxius s'esborraran del vostre emmagatzematge després del nombre donat de dies.
         bootstrap_timeline_accounts: Aquests comptes es fixaran en la part superior de les recomanacions de seguiment dels nous usuaris.
         closed_registrations_message: Es mostra quan el registres estan tancats
         content_cache_retention_period: S'esborraran totes les publicacions d'altres servidors (impulsos i respostes inclosos) passats els dies indicats, sense tenir en consideració les interaccions d'usuaris locals amb aquestes publicacions. Això inclou les publicacions que un usuari local hagi marcat com a favorites. També es perdran, i no es podran recuperar, les mencions privades entre usuaris d'instàncies diferents. Aquest paràmetre està pensat per a instàncies amb un propòsit especial i trencarà les expectatives dels usuaris si s'utilitza en una instància convencional.
         custom_css: Pots aplicar estils personalitzats en la versió web de Mastodon.
+        favicon: WEBP, PNG, GIF o JPG. Canvia la icona per defecte de Mastodon a la pestanya del navegador per una de personalitzada.
         mascot: Anul·la la il·lustració en la interfície web avançada.
         media_cache_retention_period: El vostre servidor conserva una còpia dels fitxers multimèdia de les publicacions dels usuaris remots. Si s'indica un valor positiu, s'esborraran passats els dies indicats. Si el fitxer es torna a demanar un cop esborrat, es tornarà a baixar si el contingut origen segueix disponible. Per causa de les restriccions en la freqüència amb què es poden demanar les targetes de previsualització d'altres servidors, es recomana definir aquest valor com a mínim a 14 dies, o les targetes de previsualització no s'actualizaran a demanda abans d'aquest termini.
         peers_api_enabled: Una llista de noms de domini que aquest servidor ha trobat al fedivers. No inclou cap dada sobre si estàs federat amb un servidor determinat, només si el teu en sap res. La fan servir, en un sentit general, serveis que recol·lecten estadístiques sobre la federació.
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index c9dcd4fa8..0719e2643 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -77,11 +77,13 @@ da:
           warn: Skjul filtreret indhold bag en advarsel, der nævner filterets titel
       form_admin_settings:
         activity_api_enabled: Antal lokalt opslåede indlæg, aktive brugere samt nye tilmeldinger i ugentlige opdelinger
+        app_icon: WEBP, PNG, GIF eller JPG. Tilsidesætter standard app-ikonet på mobilenheder med et tilpasset ikon.
         backups_retention_period: Brugere har mulighed for at generere arkiver af deres indlæg til senere downloade. Når sat til positiv værdi, vil disse arkiver automatisk blive slettet fra lagerpladsen efter det angivne antal dage.
         bootstrap_timeline_accounts: Disse konti fastgøres øverst på nye brugeres følg-anbefalinger.
         closed_registrations_message: Vises, når tilmeldinger er lukket
         content_cache_retention_period: Alle indlæg fra andre servere (herunder boosts 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.
         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.
         peers_api_enabled: En liste med domænenavne, som denne server har stødt på i fediverset. Ingen data inkluderes her om, hvorvidt der fødereres med en given server, blot at din server kender til det. Dette bruges af tjenester, som indsamler generelle føderationsstatistikker.
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 758d02028..c1056260b 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -77,11 +77,13 @@ de:
           warn: Den gefilterten Beitrag hinter einer Warnung, die den Filtertitel beinhaltet, ausblenden
       form_admin_settings:
         activity_api_enabled: Anzahl der wöchentlichen Beiträge, aktiven Profile und Registrierungen auf diesem Server
+        app_icon: WEBP, PNG, GIF oder JPG Überschreibt das Standard-App-Symbol auf mobilen Geräten mit einem benutzerdefinierten Symbol.
         backups_retention_period: Nutzer*innen haben die Möglichkeit, Archive ihrer Beiträge zu erstellen, die sie später herunterladen können. Wenn ein positiver Wert gesetzt ist, werden diese Archive nach der festgelegten Anzahl von Tagen automatisch aus deinem Speicher gelöscht.
         bootstrap_timeline_accounts: Diese Konten werden bei den Follower-Empfehlungen für neu registrierte Nutzer*innen oben angeheftet.
         closed_registrations_message: Wird angezeigt, wenn Registrierungen deaktiviert sind
         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. Das Verwenden dieser Option richtet sich ausschließlich an Server für spezielle Zwecke 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 benutzerdefinierten Icon.
         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.
         peers_api_enabled: Eine Liste von Domains, die diesem Server im Fediverse begegnet sind. Hierbei werden keine Angaben darüber gemacht, ob du mit einem bestimmten Server föderierst, sondern nur, dass dein Server davon weiß. Dies wird von Diensten verwendet, die allgemein Statistiken übers Ferdiverse sammeln.
diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml
index 9aedac15f..f4668ccad 100644
--- a/config/locales/simple_form.en-GB.yml
+++ b/config/locales/simple_form.en-GB.yml
@@ -77,12 +77,9 @@ en-GB:
           warn: Hide the filtered content behind a warning mentioning the filter's title
       form_admin_settings:
         activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
-        app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon.
-        backups_retention_period: Keep generated user archives for the specified number of days.
         bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
         closed_registrations_message: Displayed when sign-ups are closed
         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.
         mascot: Overrides the illustration in the advanced web interface.
         peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
         profile_directory: The profile directory lists all users who have opted-in to be discoverable.
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index cd1b68168..e346a23a0 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -77,11 +77,13 @@ es-AR:
           warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro
       form_admin_settings:
         activity_api_enabled: Conteos de mensajes publicados localmente, cuentas activas y nuevos registros en tandas semanales
+        app_icon: WEBP, PNG, GIF o JPG. Reemplaza el ícono de aplicación predeterminado en dispositivos móviles con uno personalizado.
         backups_retention_period: Los usuarios tienen la capacidad de generar archivos historiales de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente de su almacenamiento después del número especificado de días.
         bootstrap_timeline_accounts: Estas cuentas serán fijadas a la parte superior de las recomendaciones de cuentas a seguir para nuevos usuarios.
         closed_registrations_message: Mostrado cuando los registros están cerrados
         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.
         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.
         peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Acá no se incluye ningún dato sobre si federás con un servidor determinado, sólo que tu servidor lo conoce. Esto es usado por los servicios que recopilan estadísticas sobre la federación en un sentido general.
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index ba4c9ebcf..8c467bc9b 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -77,11 +77,13 @@ eu:
           warn: Ezkutatu iragazitako edukia iragazkiaren izenburua duen abisu batekin
       form_admin_settings:
         activity_api_enabled: Lokalki argitaratutako bidalketak, erabiltzaile aktiboak, eta izen-emateen kopuruak astero zenbatzen ditu
+        app_icon: WEBP, PNG, GIF edo JPG. Aplikazioaren ikono lehenetsia gainidazten du ikono pertsonalizatu batekin gailu mugikorretan.
         backups_retention_period: Erabiltzaileek geroago deskarga dezaketen beren argitalpenen artxiboak sor ditzakete. Balio positibo bat ezartzean, artxibo hauek biltegiratzetik automatikoki ezabatuko dira zehazturiko egunen buruan.
         bootstrap_timeline_accounts: Kontu hauek erabiltzaile berrien jarraitzeko gomendioen goiko aldean ainguratuko dira.
         closed_registrations_message: Izen-ematea itxia dagoenean bistaratua
         content_cache_retention_period: Beste zerbitzarietako argitalpen guztiak (bultzadak eta erantzunak barne) ezabatuko dira zehazturiko egunen buruan, argitalpen horiek izan ditzaketen erabiltzaile lokalaren interakzioa kontuan izanik gabe. Instantzia desberdinetako erabiltzaileen arteko aipamen pribatuak ere galdu egingo dira eta ezin izango dira berreskuratu. Ezarpen honen erabilera xede berezia duten instantziei zuzendua dago eta erabiltzaileen itxaropena hausten da orotariko erabilerarako inplementatzean.
         custom_css: Estilo pertsonalizatuak aplikatu ditzakezu Mastodonen web bertsioan.
+        favicon: WEBP, PNG, GIF or JPG. Mastodon-en favicon-a gainidazten du ikono pertsonalizatu batekin.
         mascot: Web interfaze aurreratuko ilustrazioa gainidazten du.
         media_cache_retention_period: Multimedia-fitxategiak dituzten urruneko erabiltzaileen argitalpenak zure zerbitzarian gordetzen dira cachean. Balio positiboa ezartzean, multimedia zehazturiko egunen buruan ezabatuko da. Multimedia-datuak eskatzen badira ezabatu ostean, berriro deskargatuko dira, iturburuko edukia oraindik erabilgarri badago. Estekaren aurrebistako txartelek hirugarrenen guneei zenbatetan dei diezaieketen mugatzen dieten murrizketak direla eta, balio honi, gutxienez, 14 egunen balioa ezartzea gomendatzen da, bestela, esteken aurrebistako txartelak ez dira eguneratuko eskatu ahala denbora horren aurretik.
         peers_api_enabled: Zerbitzari honek fedibertsoan ikusi dituen zerbitzarien domeinu-izenen zerrenda. Ez da daturik ematen zerbitzari jakin batekin federatzearen ala ez federatzearen inguruan, zerbitzariak haien berri duela soilik. Federazioari buruzko estatistika orokorrak biltzen dituzten zerbitzuek erabiltzen dute hau.
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index 510b880e3..4971e2502 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -77,10 +77,12 @@ fi:
           warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi
       form_admin_settings:
         activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä
+        app_icon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen mobiililaitteiden sovelluskuvakkeen omalla kuvakkeella.
         backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun tämä on asetettu positiiviseksi arvoksi, nämä arkistot poistetaan automaattisesti asetetun päivien määrän jälkeen.
         bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun.
         closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu
         custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa.
+        favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin suosikkikuvakkeen omalla kuvakkeella.
         mascot: Ohittaa kuvituksen edistyneessä selainkäyttöliittymässä.
         peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, oletko liitossa tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla.
         profile_directory: Profiilihakemisto lueteloi kaikki käyttäjät, jotka ovat ilmoittaneet olevansa löydettävissä.
diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml
index c7c003322..7d4da2b51 100644
--- a/config/locales/simple_form.fo.yml
+++ b/config/locales/simple_form.fo.yml
@@ -77,11 +77,13 @@ fo:
           warn: Fjal filtreraða innihaldið aftan fyri eina ávaring, sum nevnir heitið á filtrinum
       form_admin_settings:
         activity_api_enabled: Tal av lokalt útgivnum postum, virknum brúkarum og nýggjum skrásetingum býtt vikuliga
+        app_icon: WEBP, PNG, GIF ella JPG. Býtir vanligu ikonina á fartelefoneindum um við eina ser-ikon.
         backups_retention_period: Brúkarar hava møguleika at gera trygdaravrit av teirra postum, sum tey kunnu taka niður seinni. Tá hetta er sett til eitt virði størri enn 0, so verða hesi trygdaravrit strikaði av sær sjálvum frá tínar goymslu eftir ásetta talið av døgum.
         bootstrap_timeline_accounts: Hesar kontur verða festar ovast á listanum yvir brúkarar, sum tey nýggju verða mælt til at fylgja.
         closed_registrations_message: Víst tá stongt er fyri tilmeldingum
         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.
         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.
         peers_api_enabled: Ein listi við navnaøkjum, sum hesin ambætarin er komin framat í fediversinum. Ongar dátur eru tiknar við her um tú er sameind/ur við ein givnan ambætara, einans at tín ambætari veit um hann. Hetta verður brúkt av tænastum, sum gera hagtøl um sameining yvirhøvur.
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 043349601..0411c45bc 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -77,11 +77,13 @@ gl:
           warn: Agochar o contido filtrado tras un aviso que conteña o nome do filtro
       form_admin_settings:
         activity_api_enabled: Conta do número de publicacións locais, usuarias activas, e novos rexistros en acumulados semanais
+        app_icon: WEBP, PNG, GIF ou JPG. Sobrescribe a icona por defecto da aplicación nos dispositivos móbiles cunha icona personalizada.
         backups_retention_period: As usuarias poden crear arquivos das súas publicacións para descargalos. Cando se establece un valor positivo, estes arquivos serán borrados automáticamente da túa almacenaxe despois do número de días establecido.
         bootstrap_timeline_accounts: Estas contas aparecerán fixas na parte superior das recomendacións para as usuarias.
         closed_registrations_message: Móstrase cando non se admiten novas usuarias
         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.
         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.
         peers_api_enabled: Unha lista dos nomes de dominio que este servidor atopou no fediverso. Non se inclúen aquí datos acerca de se estás a federar con eles ou non, só que o teu servidor os recoñeceu. Ten utilidade para servizos que recollen estatísticas acerca da federación nun amplo senso.
diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml
index 841745dbc..65c6f6110 100644
--- a/config/locales/simple_form.he.yml
+++ b/config/locales/simple_form.he.yml
@@ -77,11 +77,13 @@ he:
           warn: הסתר את התוכן המסונן מאחורי אזהרה עם כותרת המסנן
       form_admin_settings:
         activity_api_enabled: מספר ההודעות שפורסמו מקומית, משתמשים פעילים, והרשמות חדשות בדליים שבועיים
+        app_icon: WEBP, PNG, GIF או JPG. גובר על אייקון ברירת המחדל ביישומון על מכשירים ניידים ומחליף אותו באייקון נבחר.
         backups_retention_period: למשתמשים יש יכולת לבקש ארכיון של הודעותיהם להורדה מאוחר יותר. כאשר נבחר ערך חיובי, הארכיונים הללו ימחקו מאחסון לאחר מספר הימים שצוינו.
         bootstrap_timeline_accounts: חשבונות אלו יוצמדו לראש רשימת המלצות המעקב של משתמשים חדשים.
         closed_registrations_message: להציג כאשר הרשמות חדשות אינן מאופשרות
         content_cache_retention_period: כל ההודעות משרתים אחרים (לרבות הדהודים ותגובות) ימחקו אחרי מספר ימים, ללא קשר לאינטראקציה של משתמשים מקומיים איתם. בכלל זה הודעות שהמתשתמשים המקומיים סימנו בסימניה או חיבוב. איזכורים פרטיים ("דיאם") בין משתמשים בין שרתים שונים יאבדו גם הם ולא תהיה אפשרות לשחזרם. השימוש באפשרות הזו מיועד לשרתים עם ייעוד מיוחד ושובר את ציפיותיהם של רב המשתמשים כאשר האפשרות מופעלת בשרת לשימוש כללי.
         custom_css: ניתן לבחור ערכות סגנון אישיות בגרסת הדפדפן של מסטודון.
+        favicon: WEBP, PNG, GIF או JPG. גובר על "פאבאייקון" ברירת המחדל ומחליף אותו באייקון נבחר בדפדפן.
         mascot: בחירת ציור למנשק הווב המתקדם.
         media_cache_retention_period: קבצי מדיה מהודעות שהגיעו משרתים רחוקים נשמרות על השרת שלך. כאשר יבחר פה מספר חיובי, המדיה תמחק לאחר מספר ימים כמצוין. אם המידע יבוקש שוב לאחר שנמחק, הוא יורד מחדש, אם המידע עדיין זמין בצד הרחוק. עקב מגבלות על תכיפות שליפת כרטיסי קדימון מאתרים מרוחקים, מומלץ לכוון את הערך ל־14 יום לפחות, או שכרטיסי קדימונים לא יעודכנו לפי דרישה לפני חלוף חלון הזמן הזה.
         peers_api_enabled: רשימת השרתים ששרת זה פגש בפדיוורס. לא כולל מידע לגבי קשר ישיר עם שרת נתון, אלא רק שידוע לשרת זה על קיומו. מידע זה משמש שירותים האוספים סטטיסטיקות כלליות על הפדרציה.
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index e2040cafd..8fee5b414 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -77,11 +77,13 @@ hu:
           warn: A szűrt tartalom a szűrő címét említő figyelmeztetés mögé rejtése
       form_admin_settings:
         activity_api_enabled: Helyi bejegyzések, aktív felhasználók és új regisztrációk száma heti bontásban
+        app_icon: WEBP, PNG, GIF vagy JPG. Mobileszközökön az alkalmazás alapértelmezett ikonját felülírja egy egyéni ikonnal.
         backups_retention_period: A felhasználók archívumokat állíthatnak elő a bejegyzéseikből, hogy később letöltsék azokat. Ha pozitív értékre van állítva, akkor a megadott számú nap után automatikusan törölve lesznek a tárhelyedről.
         bootstrap_timeline_accounts: Ezek a fiókok ki lesznek tűzve az új felhasználók követési javaslatainak élére.
         closed_registrations_message: Akkor jelenik meg, amikor a regisztráció le van zárva
         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 favicon felülírása egy egyéni ikonnal.
         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.
         peers_api_enabled: Azon domainek listája, melyekkel ez a kiszolgáló találkozott a fediverzumban. Nem csatolunk adatot arról, hogy föderált kapcsolatban vagy-e az adott kiszolgálóval, csak arról, hogy a kiszolgálód tud a másikról. Ezt olyan szolgáltatások használják, melyek általában a föderációról készítenek statisztikákat.
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
index 6f3072758..044e24deb 100644
--- a/config/locales/simple_form.is.yml
+++ b/config/locales/simple_form.is.yml
@@ -77,11 +77,13 @@ is:
           warn: Fela síað efni á bakvið aðvörun sem tekur fram titil síunnar
       form_admin_settings:
         activity_api_enabled: Fjöldi staðværra stöðufærslna, virkra notenda og nýskráninga í vikulegum skömmtum
+        app_icon: WEBP, PNG, GIF eða JPG. Tekur yfir sjálfgefna táknmynd forrits á snjalltækjum með sérsniðinni táknmynd.
         backups_retention_period: Notendur hafa kost á að útbúa safnskrár með færslunum sínum til að sækja svo síðar. Þegar þetta er stillt á jákvætt gildi, verður þessum safnskrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga.
         bootstrap_timeline_accounts: Þessir notendaaðgangar verða festir efst í meðmælum til nýrra notenda um að fylgjast með þeim.
         closed_registrations_message: Birtist þegar lokað er á nýskráningar
         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.
         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.
         peers_api_enabled: Listi yfir þau lénaheiti sem þessi netþjónn hefur rekist á í skýjasambandinu. Engin gögn eru hér sem gefa til kynna hvort þú sért í sambandi við tiltekinn netþjón, bara að netþjónninn þinn viti um hann. Þetta er notað af þjónustum sem safna tölfræði um skýjasambönd á almennan hátt.
diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml
index f6a3ad937..1be95a9f1 100644
--- a/config/locales/simple_form.lt.yml
+++ b/config/locales/simple_form.lt.yml
@@ -40,7 +40,7 @@ lt:
       defaults:
         autofollow: Žmonės, kurie užsiregistruos per kvietimą, automatiškai seks tave
         avatar: WEBP, PNG, GIF arba JPG. Ne daugiau kaip %{size}. Bus sumažintas iki %{dimensions} tšk.
-        bot: Signalizuoti kitiems, kad paskyroje daugiausia atliekami automatiniai veiksmai ir kad ji gali būti nestebima
+        bot: Signalizuoti kitiems, kad paskyroje daugiausia atliekami automatiniai veiksmai ir kad ji gali būti nestebima.
         context: Vienas arba keli kontekstai, kuriems turėtų būti taikomas filtras
         current_password: Saugumo sumetimais įvesk dabartinės paskyros slaptažodį
         current_username: Kad patvirtintum, įvesk dabartinės paskyros naudotojo vardą
@@ -53,14 +53,14 @@ lt:
         password: Naudok bent 8 simbolius
         phrase: Bus suderinta, neatsižvelgiant į teksto lygį arba įrašo turinio įspėjimą
         scopes: Prie kurių API programai bus leidžiama pasiekti. Pasirinkus aukščiausio lygio sritį, atskirų sričių pasirinkti nereikia.
-        setting_aggregate_reblogs: Nerodyti naujų pakėlimų įrašams, kurie neseniai buvo pakelti (taikoma tik naujai gautiems pakėlimams)
-        setting_always_send_emails: Paprastai pranešimai el. paštu nebus siunčiami, kai aktyviai naudoji Mastodon
-        setting_default_sensitive: Jautrioji medija pagal numatytuosius nustatymus yra paslėpta ir gali būti atskleista paspaudus
+        setting_aggregate_reblogs: Nerodyti naujų pakėlimų įrašams, kurie neseniai buvo pakelti (taikoma tik naujai gautiems pakėlimams).
+        setting_always_send_emails: Paprastai el. laiško pranešimai nebus siunčiami, kai aktyviai naudoji Mastodon.
+        setting_default_sensitive: Jautrioji medija pagal numatytuosius nustatymus yra paslėpta ir gali būti atskleista spustelėjus.
         setting_display_media_default: Slėpti mediją, pažymėtą kaip jautrią
         setting_display_media_hide_all: Visada slėpti mediją
         setting_display_media_show_all: Visada rodyti mediją
-        setting_use_blurhash: Gradientai pagrįsti paslėptų vaizdų spalvomis, tačiau užgožia bet kokias detales
-        setting_use_pending_items: Slėpti laiko skalės naujienas po paspaudimo, vietoj automatinio kanalo slinkimo
+        setting_use_blurhash: Gradientai pagrįsti paslėptų vizualizacijų spalvomis, bet užgožia bet kokias detales.
+        setting_use_pending_items: Slėpti laiko skalės naujienas po paspaudimo, vietoj automatinio srauto slinkimo.
         username: Gali naudoti raides, skaičius ir pabraukimus
         whole_word: Kai raktažodis ar frazė yra tik raidinis ir skaitmeninis, jis bus taikomas tik tada, jei atitiks visą žodį
       email_domain_block:
@@ -76,6 +76,7 @@ lt:
         activity_api_enabled: Vietinių paskelbtų įrašų, aktyvių naudotojų ir naujų registracijų skaičiai kas savaitę
         backups_retention_period: Naudotojai gali generuoti savo įrašų archyvus, kuriuos vėliau galės atsisiųsti. Nustačius teigiamą reikšmę, šie archyvai po nurodyto dienų skaičiaus bus automatiškai ištrinti iš saugyklos.
         content_cache_retention_period: Visi įrašai iš kitų serverių (įskaitant pakėlimus ir atsakymus) bus ištrinti po nurodyto dienų skaičiaus, neatsižvelgiant į bet kokią vietinio naudotojo sąveiką su tais įrašais. Tai taikoma ir tiems įrašams, kuriuos vietinis naudotojas yra pažymėjęs kaip žymes ar mėgstamus. Privačios paminėjimai tarp naudotojų iš skirtingų instancijų taip pat bus prarastos ir jų bus neįmanoma atkurti. Šis nustatymas skirtas naudoti ypatingos paskirties instancijose, o įgyvendinus jį bendram naudojimui, pažeidžiami daugelio naudotojų lūkesčiai.
+        mascot: Pakeičia išplėstinės žiniatinklio sąsajos iliustraciją.
         media_cache_retention_period: Nuotolinių naudotojų įrašytų įrašų medijos failai talpinami tavo serveryje. Nustačius teigiamą reikšmę, medijos bus ištrinamos po nurodyto dienų skaičiaus. Jei medijos duomenų bus paprašyta po to, kai jie bus ištrinti, jie bus atsiųsti iš naujo, jei šaltinio turinys vis dar prieinamas. Dėl apribojimų, susijusių su nuorodų peržiūros kortelių apklausos dažnumu trečiųjų šalių svetainėse, rekomenduojama nustatyti šią reikšmę ne trumpesnę kaip 14 dienų, kitaip nuorodų peržiūros kortelės nebus atnaujinamos pagal pareikalavimą iki to laiko.
         peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme.
         site_contact_email: Kaip žmonės gali su tavimi susisiekti teisiniais ar pagalbos užklausimais.
@@ -91,11 +92,13 @@ lt:
         webauthn: Jei tai USB raktas, būtinai jį įkišk ir, jei reikia, paspausk.
       settings:
         indexable: Tavo profilio puslapis gali būti rodomas paieškos rezultatuose Google, Bing ir kituose.
+        show_application: Neatsižvelgiant į tai, visada galėsi matyti, kuri programėlė paskelbė tavo įrašą.
       user:
-        chosen_languages: Kai pažymėta, viešose laiko skalėse bus rodomi tik įrašai pasirinktomis kalbomis
+        chosen_languages: Kai pažymėta, viešose laiko skalėse bus rodomi tik įrašai pasirinktomis kalbomis.
         role: Vaidmuo valdo, kokius leidimus naudotojas (-a) turi
     labels:
       account:
+        discoverable: Rekomenduoti profilį ir įrašus į atradimo algoritmus
         indexable: Įtraukti viešus įrašus į paieškos rezultatus
         show_collections: Rodyti sekimus ir sekėjus profilyje
         unlocked: Automatiškai priimti naujus sekėjus
@@ -118,19 +121,26 @@ lt:
         note: Biografija
         password: Slaptažodis
         phrase: Raktažodis arba frazė
+        setting_advanced_layout: Įjungti išplėstinę žiniatinklio sąsają
+        setting_aggregate_reblogs: Grupuoti pakėlimus laiko skalėse
+        setting_always_send_emails: Visada siųsti el. laiško pranešimus
         setting_auto_play_gif: Automatiškai leisti animuotų GIF
         setting_boost_modal: Rodyti patvirtinimo dialogą prieš pakėliant įrašą
         setting_default_language: Skelbimo kalba
         setting_default_privacy: Skelbimo privatumas
         setting_default_sensitive: Visada žymėti mediją kaip jautrią
         setting_delete_modal: Rodyti patvirtinimo dialogą prieš ištrinant įrašą
+        setting_disable_swiping: Išjungti perbraukimo judėjimus
         setting_display_media: Medijos rodymas
         setting_display_media_hide_all: Slėpti viską
         setting_display_media_show_all: Rodyti viską
         setting_expand_spoilers: Visada išplėsti įrašus, pažymėtus turinio įspėjimais
         setting_hide_network: Slėpti savo socialinę diagramą
+        setting_reduce_motion: Sumažinti judėjimą animacijose
         setting_system_font_ui: Naudoti numatytąjį sistemos šriftą
         setting_theme: Svetainės tema
+        setting_trends: Rodyti šiandienos trendus
+        setting_use_blurhash: Rodyti spalvingus paslėptos medijos gradientus
         setting_use_pending_items: Lėtas režimas
         title: Pavadinimas
         type: Importo tipas
@@ -175,6 +185,7 @@ lt:
         hint: Papildoma informacija
         text: Taisyklė
       settings:
+        indexable: Įtraukti profilio puslapį į paieškos variklius
         show_application: Rodyti, iš kurios programėles išsiuntei įrašą
       tag:
         listable: Leisti šį saitažodį rodyti paieškose ir pasiūlymuose
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 3b1005319..8bc717fe1 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -77,11 +77,13 @@ nl:
           warn: Verberg de gefilterde inhoud achter een waarschuwing, met de titel van het filter als waarschuwingstekst
       form_admin_settings:
         activity_api_enabled: Aantallen lokaal gepubliceerde berichten, actieve gebruikers en nieuwe registraties per week
+        app_icon: WEBP, PNG, GIF of JPG. Vervangt op mobiele apparaten het standaard app-pictogram met een aangepast pictogram.
         backups_retention_period: Gebruikers hebben de mogelijkheid om archieven van hun berichten te genereren om later te downloaden. Indien ingesteld op een positieve waarde, worden deze archieven automatisch verwijderd uit jouw opslag na het opgegeven aantal dagen.
         bootstrap_timeline_accounts: Deze accounts worden bovenaan de aanbevelingen aan nieuwe gebruikers getoond. Meerdere gebruikersnamen met komma's scheiden.
         closed_registrations_message: Weergegeven wanneer registratie van nieuwe accounts is uitgeschakeld
         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.
         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.
         peers_api_enabled: Een lijst met domeinnamen die deze server heeft aangetroffen in de fediverse. Er zijn hier geen gegevens inbegrepen over de vraag of je verbonden bent met een bepaalde server, alleen dat je server er van weet. Dit wordt gebruikt door diensten die statistieken over de federatie in algemene zin verzamelen.
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index 51dce245d..bdd3db040 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -77,6 +77,7 @@ nn:
           warn: Skjul det filtrerte innhaldet bak ei åtvaring som nemner tittelen på filteret
       form_admin_settings:
         activity_api_enabled: Tal på lokale innlegg, aktive brukarar og nyregistreringar kvar veke
+        app_icon: WEBP, PNG, GIF eller JPG. Overstyrer standard-ikonet på mobile einingar med eit tilpassa ikon.
         backups_retention_period: Brukarar har moglegheit til å generere arkiv av sine innlegg for å laste ned seinare. Når sett til ein positiv verdi, blir desse arkiva automatisk sletta frå lagringa etter eit gitt antal dagar.
         bootstrap_timeline_accounts: Desse kontoane vil bli festa øverst på fylgjaranbefalingane til nye brukarar.
         closed_registrations_message: Vist når det er stengt for registrering
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 5c0c64028..9d82384af 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -77,11 +77,13 @@ pl:
           warn: Ukryj filtrowaną zawartość za ostrzeżeniem wskazującym tytuł filtra
       form_admin_settings:
         activity_api_enabled: Liczby opublikowanych lokalnych postów, aktywnych użytkowników i nowych rejestracji w tygodniowych przedziałach
+        app_icon: WEBP, PNG, GIF, albo JPEG. Nadpisuje domyślną ikonę aplikacji na urządzeniach mobilnych.
         backups_retention_period: Użytkownicy mogą generować archiwa wpisów do późniejszego pobrania. Jeżeli ta wartość jest dodatnia, te archiwa zostaną automatycznie usunięte z twojego serwera po danej liczbie dni.
         bootstrap_timeline_accounts: Te konta zostaną przypięte na górze rekomendacji obserwacji nowych użytkowników.
         closed_registrations_message: Wyświetlane po zamknięciu rejestracji
         content_cache_retention_period: Wszystkie wpisy z innych serwerów (w tym podbicia i odpowiedzi) zostaną usunięte po danej liczbie dni, bez względu na interakcje z nimi twoich użytkowników. Zawierają się w tym wpisy, które twoi użytkownicy dodali do zakładek lub ulubionych. Prywatne wzmianki od innych instancji zostaną utracone i będą nieprzywracalne. To ustawienie jest przeznaczone dla instancji zastosowania specjalnego i jest niezgodne z wieloma oczekiwaniami użytkowników.
         custom_css: Możesz zastosować niestandardowe style w internetowej wersji Mastodon.
+        favicon: WEBP, PNG, GIF, albo JPEG. Nadpisuje domyślną faviconę Mastodona.
         mascot: Nadpisuje ilustrację w zaawansowanym interfejsie internetowym.
         media_cache_retention_period: Media z wpisów od obcych użytkowników są cache'owane na twoim serwerze. Kiedy dana wartość jest dodatnia, media te będą usunięte po tylu dniach. Jeżeli usunięte media zostaną potem zażądane, oryginał zostanie ponownie pobrany (o ile jest dalej dostępny). Z powodu ograniczeń dot. częstotliwości z jaką karty podglądu linków dopytują się o dane od stron trzecich, zalecana wartość to min. 14 dni, bo karty podglądu linków nie będą wcześniej odświeżane na żądane.
         peers_api_enabled: Lista nazw domen, z którymi ten serwer spotkał się w fediverse. Nie są tu zawarte żadne dane o tym, czy użytkownik dokonuje federacji z danym serwerem, a jedynie, że jego serwer o tym wie. Jest to wykorzystywane przez serwisy, które zbierają statystyki dotyczące federacji w ogólnym sensie.
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index a26468894..7fcbb210c 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -77,11 +77,13 @@ pt-PT:
           warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro
       form_admin_settings:
         activity_api_enabled: Contagem, em blocos semanais, de publicações locais, utilizadores ativos e novos registos
+        app_icon: WEBP, PNG, GIF ou JPG. Substitui o ícone padrão do aplicativo em dispositivos móveis por um ícone personalizado.
         backups_retention_period: Os utilizadores têm a possibilidade de gerar arquivos das suas mensagens 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 publicações de outros servidores (incluindo boosts 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 publicações em que um utilizador local as tenha marcado como favoritas ou adicionado aos items salvos. 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.
         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.
         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.
diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml
index 6bee31a42..8dd198656 100644
--- a/config/locales/simple_form.sr-Latn.yml
+++ b/config/locales/simple_form.sr-Latn.yml
@@ -77,11 +77,13 @@ sr-Latn:
           warn: Sakrij filtrirani sadržaj iza upozorenja u kome se navodi naziv filtera
       form_admin_settings:
         activity_api_enabled: Brojevi lokalno postavljenih objava, aktivnih korisnika i novih registracija na nedeljnoj bazi
+        app_icon: WEBP, PNG, GIF ili JPG. Zamenjuje podrazumevanu ikonicu aplikacije na mobilnim uređajima prilagođenom ikonicom.
         backups_retention_period: Korisnici imaju mogućnost da generišu arhive svojih objava za kasnije preuzimanje. Kada se podese na pozitivnu vrednost, ove arhive će se automatski izbrisati iz vašeg skladišta nakon navedenog broja dana.
         bootstrap_timeline_accounts: Ovi nalozi će biti zakačeni na vrh preporuka za praćenje novih korisnika.
         closed_registrations_message: Prikazuje se kada su registracije zatvorene
         content_cache_retention_period: Sve objave sa drugih servera (uključujući podržavanja i odgovore) će biti izbrisane nakon navedenog broja dana, bez obzira na bilo kakvu interakciju lokalnog korisnika sa tim objavama. Ovo uključuje objave u kojima ih je lokalni korisnik označio kao obeleživače ili omiljene. Privatna pominjanja između korisnika sa različitih instanci će takođe biti izgubljena i nemoguće ih je vratiti. Korišćenje ove postavke je namenjeno za slučajeve posebne namene i krši mnoga očekivanja korisnika kada se primeni za upotrebu opšte namene.
         custom_css: Možete da primenite prilagođene stilove na veb verziji Mastodon-a.
+        favicon: WEBP, PNG, GIF ili JPG. Zamenjuje podrazumevani Mastodon favikon prilagođenom ikonicom.
         mascot: Zamenjuje ilustraciju u naprednom veb okruženju.
         media_cache_retention_period: Medijske datoteke iz objava udaljenih korisnika se keširaju na vašem serveru. Kada se podesi na pozitivnu vrednost, mediji će biti izbrisani nakon navedenog broja dana. Ako se medijski podaci zahtevaju nakon brisanja, biće ponovo preuzeti, ako je izvorni sadržaj i dalje dostupan. Zbog ograničenja koliko često kartice za pregled veza anketiraju sajtove trećih strana, preporučuje se da ovu vrednost postavite na najmanje 14 dana, inače kartice za pregled veza neće biti ažurirane na zahtev pre tog vremena.
         peers_api_enabled: Lista domena sa kojima se ovaj server susreo u fediverzumu. Ovde nisu sadržani podaci o tome da li se Vaš server federiše sa drugim serverima, već samo da Vaš server zna za njih. Ove informacije koriste servisi koji prikupljaju podatke i vode statistiku o federaciji u širem smislu.
diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml
index 4ec837407..e88a99df1 100644
--- a/config/locales/simple_form.sr.yml
+++ b/config/locales/simple_form.sr.yml
@@ -77,11 +77,13 @@ sr:
           warn: Сакриј филтрирани садржај иза упозорења у коме се наводи назив филтера
       form_admin_settings:
         activity_api_enabled: Бројеви локално постављених објава, активних корисника и нових регистрација на недељној бази
+        app_icon: WEBP, PNG, GIF или JPG. Замењује подразумевану иконицу апликације на мобилним уређајима прилагођеном иконицом.
         backups_retention_period: Корисници имају могућност да генеришу архиве својих објава за касније преузимање. Када се подесе на позитивну вредност, ове архиве ће се аутоматски избрисати из вашег складишта након наведеног броја дана.
         bootstrap_timeline_accounts: Ови налози ће бити закачени на врх препорука за праћење нових корисника.
         closed_registrations_message: Приказује се када су регистрације затворене
         content_cache_retention_period: Све објаве са других сервера (укључујући подржавања и одговоре) ће бити избрисане након наведеног броја дана, без обзира на било какву интеракцију локалног корисника са тим објавама. Ово укључује објаве у којима их је локални корисник означио као обележиваче или омиљене. Приватна помињања између корисника са различитих инстанци ће такође бити изгубљена и немогуће их је вратити. Коришћење ове поставке је намењено за случајеве посебне намене и крши многа очекивања корисника када се примени за употребу опште намене.
         custom_css: Можете да примените прилагођене стилове на веб верзији Mastodon-а.
+        favicon: WEBP, PNG, GIF или JPG. Замењује подразумевани Mastodon фавикон прилагођеном иконицом.
         mascot: Замењује илустрацију у напредном веб окружењу.
         media_cache_retention_period: Медијске датотеке из објава удаљених корисника се кеширају на вашем серверу. Када се подеси на позитивну вредност, медији ће бити избрисани након наведеног броја дана. Ако се медијски подаци захтевају након брисања, биће поново преузети, ако је изворни садржај и даље доступан. Због ограничења колико често картице за преглед веза анкетирају сајтове трећих страна, препоручује се да ову вредност поставите на најмање 14 дана, иначе картице за преглед веза неће бити ажуриране на захтев пре тог времена.
         peers_api_enabled: Листа домена са којима се овај сервер сусрео у федиверзуму. Овде нису садржани подаци о томе да ли се Ваш сервер федерише са другим серверима, већ само да Ваш сервер зна за њих. Ове информације користе сервиси који прикупљају податке и воде статистику о федерацији у ширем смислу.
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index e68642c2f..0816efcc5 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -77,12 +77,15 @@ th:
           warn: ซ่อนเนื้อหาที่กรองอยู่หลังคำเตือนที่กล่าวถึงชื่อเรื่องของตัวกรอง
       form_admin_settings:
         activity_api_enabled: จำนวนโพสต์ที่เผยแพร่ในเซิร์ฟเวอร์, ผู้ใช้ที่ใช้งานอยู่ และการลงทะเบียนใหม่ในบักเก็ตรายสัปดาห์
+        app_icon: WEBP, PNG, GIF หรือ JPG เขียนทับไอคอนแอปเริ่มต้นในอุปกรณ์มือถือด้วยไอคอนที่กำหนดเอง
         backups_retention_period: ผู้ใช้มีความสามารถในการสร้างการเก็บถาวรของโพสต์ของเขาเพื่อดาวน์โหลดในภายหลัง เมื่อตั้งเป็นค่าบวก จะลบการเก็บถาวรเหล่านี้ออกจากที่เก็บข้อมูลของคุณโดยอัตโนมัติหลังจากจำนวนวันที่ระบุ
         bootstrap_timeline_accounts: จะปักหมุดบัญชีเหล่านี้ไว้ด้านบนสุดของคำแนะนำการติดตามของผู้ใช้ใหม่
         closed_registrations_message: แสดงเมื่อมีการปิดการลงทะเบียน
         content_cache_retention_period: จะลบโพสต์ทั้งหมดจากเซิร์ฟเวอร์อื่น ๆ (รวมถึงการดันและการตอบกลับ) หลังจากจำนวนวันที่ระบุ โดยไม่คำนึงถึงการโต้ตอบใด ๆ ของผู้ใช้ในเซิร์ฟเวอร์กับโพสต์เหล่านั้น สิ่งนี้รวมถึงโพสต์ที่ผู้ใช้ในเซิร์ฟเวอร์ได้ทำเครื่องหมายโพสต์ว่าเป็นที่คั่นหน้าหรือรายการโปรด การกล่าวถึงแบบส่วนตัวระหว่างผู้ใช้จากอินสแตนซ์ที่แตกต่างกันจะหายไปและไม่สามารถคืนค่าได้เช่นกัน การใช้การตั้งค่านี้มีไว้สำหรับอินสแตนซ์ที่มีวัตถุประสงค์พิเศษและทำลายความคาดหวังของผู้ใช้จำนวนมากเมื่อนำไปใช้สำหรับการใช้งานที่มีวัตถุประสงค์ทั่วไป
         custom_css: คุณสามารถนำไปใช้ลักษณะที่กำหนดเองใน Mastodon รุ่นเว็บ
+        favicon: WEBP, PNG, GIF หรือ JPG เขียนทับ Favicon ของ Mastodon เริ่มต้นด้วยไอคอนที่กำหนดเอง
         mascot: เขียนทับภาพประกอบในส่วนติดต่อเว็บขั้นสูง
+        media_cache_retention_period: จะแคชไฟล์สื่อจากโพสต์ที่สร้างโดยผู้ใช้ระยะไกลในเซิร์ฟเวอร์ของคุณ เมื่อตั้งเป็นค่าบวก จะลบสื่อหลังจากจำนวนวันที่ระบุ หากมีการขอข้อมูลสื่อหลังจากมีการลบสื่อ จะดาวน์โหลดสื่อใหม่ หากเนื้อหาต้นฉบับยังคงใช้งานได้ เนื่องจากข้อจำกัดเกี่ยวกับความถี่ที่บัตรตัวอย่างลิงก์สำรวจไซต์จากบุคคลที่สาม ขอแนะนำให้ตั้งค่านี้เป็นอย่างน้อย 14 วัน มิฉะนั้นจะไม่อัปเดตบัตรตัวอย่างลิงก์ตามความต้องการก่อนเวลานั้น
         peers_api_enabled: รายการชื่อโดเมนที่เซิร์ฟเวอร์นี้พบในจักรวาลสหพันธ์ ไม่มีข้อมูลรวมอยู่ที่นี่เกี่ยวกับว่าคุณติดต่อกับเซิร์ฟเวอร์ที่กำหนดหรือไม่ เพียงแค่ว่าเซิร์ฟเวอร์ของคุณทราบเกี่ยวกับเซิร์ฟเวอร์ที่กำหนด มีการใช้สิ่งนี้โดยบริการที่เก็บรวบรวมสถิติในการติดต่อกับภายนอกในความหมายทั่วไป
         profile_directory: ไดเรกทอรีโปรไฟล์แสดงรายการผู้ใช้ทั้งหมดที่ได้เลือกรับให้สามารถค้นพบได้
         require_invite_text: เมื่อการลงทะเบียนต้องการการอนุมัติด้วยตนเอง ทำให้การป้อนข้อความ “ทำไมคุณจึงต้องการเข้าร่วม?” บังคับแทนที่จะไม่จำเป็น
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 4ec35f102..697417a54 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -77,11 +77,13 @@ tr:
           warn: Süzgeçlenmiş içeriği, süzgecinin başlığından söz eden bir uyarının arkasında gizle
       form_admin_settings:
         activity_api_enabled: Yerel olarak yayınlanan gönderi, etkin kullanıcı ve yeni kayıtların haftalık sayıları
+        app_icon: WEBP, PNG, GIF veya JPG. Mobil aygıtlarda varsayılan uygulama simgesini isteğe bağlı bir simgeyle değiştirir.
         backups_retention_period: Kullanıcılar, gönderilerinin arşivlerini daha sonra indirmek üzere oluşturabilirler. Pozitif bir değer verdilğinde bu arşivler verilmiş olan gün sonunda deponuzdan otomatik olarak silinecektir.
         bootstrap_timeline_accounts: Bu hesaplar, yeni kullanıcıların takip önerilerinin tepesinde sabitlenecektir.
         closed_registrations_message: Kayıt olma kapalıyken görüntülenir
         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.
         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.
         peers_api_enabled: Bu sunucunun fediverse'te karşılaştığı alan adlarının bir listesi. İlgili sunucuyla birleştirme mi yapıyorsunuz yoksa sunucunuz sadece onu biliyor mu hakkında bir bilgi burada yok. Bu blgi genel olarak federasyın hakkında istatistik toplamak isteyen hizmetler tarafından kullanılıyor.
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index bc9a181ed..e5063e611 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -77,11 +77,13 @@ vi:
           warn: Ẩn nội dung đã lọc đằng sau một cảnh báo đề cập đến tiêu đề của bộ lọc
       form_admin_settings:
         activity_api_enabled: Số lượng tút được đăng trong máy chủ, người dùng đang hoạt động và đăng ký mới hàng tuần
+        app_icon: WEBP, PNG, GIF hoặc JPG. Dùng biểu tượng tùy chỉnh trên thiết bị di động.
         backups_retention_period: Người dùng có khả năng tạo bản sao lưu các tút của họ để tải xuống sau. Các bản sao lưu này sẽ tự động bị xóa khỏi bộ nhớ của bạn sau số ngày được chỉ định.
         bootstrap_timeline_accounts: Những người này sẽ được ghim vào đầu các gợi ý theo dõi của người mới.
         closed_registrations_message: Được hiển thị khi đóng đăng ký
         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.
         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 đó.
         peers_api_enabled: Danh sách các máy chủ khác mà máy chủ này đã liên hợp. Không có dữ liệu nào được đưa vào đây về việc bạn có liên kết với một máy chủ nhất định hay không, chỉ là máy chủ của bạn biết về nó. Điều này được sử dụng bởi các dịch vụ thu thập số liệu thống kê về liên kết theo nghĩa chung.
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index a06a5ab4e..6058cc00c 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -77,11 +77,13 @@ zh-CN:
           warn: 在警告中提及过滤器标题后,隐藏过滤内容
       form_admin_settings:
         activity_api_enabled: 本站每周的嘟文数、活跃用户数和新注册用户数
+        app_icon: WEBP、PNG、GIF 或 JPG。使用自定义图标覆盖移动设备上的默认应用图标。
         backups_retention_period: 用户可以生成其嘟文存档以供之后下载。当该值被设为正值时,这些存档将在指定的天数后自动从您的存储中删除。
         bootstrap_timeline_accounts: 这些账号将在新用户关注推荐中置顶。
         closed_registrations_message: 在关闭注册时显示
         content_cache_retention_period: 来自其它实例的所有嘟文(包括转嘟与回复)都将在指定天数后被删除,不论本实例用户是否与这些嘟文产生过交互。这包括被本实例用户喜欢和收藏的嘟文。实例间用户的私下提及也将丢失并无法恢复。此设置针对的是特殊用途的实例,用于一般用途时会打破许多用户的期望。
         custom_css: 你可以为网页版 Mastodon 应用自定义样式。
+        favicon: WEBP、PNG、GIF 或 JPG。使用自定义图标覆盖 Mastodon 的默认图标。
         mascot: 覆盖高级网页界面中的绘图形象。
         media_cache_retention_period: 来自外站用户嘟文的媒体文件将被缓存到你的实例上。当该值被设为正值时,缓存的媒体文件将在指定天数后被清除。如果媒体文件在被清除后重新被请求,且源站内容仍然可用,它将被重新下载。由于链接预览卡拉取第三方站点的频率受到限制,建议将此值设置为至少 14 天,如果小于该值,链接预览卡将不会按需更新。
         peers_api_enabled: 此服务器在联邦宇宙中遇到的域名列表。 这里不包含关于您是否与给定服务器联合的数据,只是您的服务器知道它。 这由收集一般意义上的联邦统计信息的服务使用。
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index a9e5921be..b7a67c6a6 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -77,11 +77,13 @@ zh-TW:
           warn: 隱藏過濾內容於過濾器標題之警告後
       form_admin_settings:
         activity_api_enabled: 本站使用者的嘟文數量,以及本站的活躍使用者與一週內新使用者數量
+        app_icon: WEBP、PNG、GIF、或 JPG。於行動裝置上使用自訂圖示替代預設應用程式圖示。
         backups_retention_period: 使用者能產生他們嘟文的備份以便日後下載。當設定為正值時,這些嘟文備份將於指定之天數後自您的儲存空間中自動刪除。
         bootstrap_timeline_accounts: 這些帳號將被釘選於新帳號跟隨推薦之上。
         closed_registrations_message: 於註冊關閉時顯示
         content_cache_retention_period: 所有來自其他伺服器之嘟文(包括轉嘟與回嘟)將於指定之天數後自動刪除,不論這些嘟文與本地使用者間的任何互動。這將包含本地使用者已標記為書籤或最愛之嘟文。不同站點使用者間之私訊亦將遺失且不可回復。此設定應適用於特殊情況,若常規使用將超乎多數使用者預期。
         custom_css: 您於 Mastodon 網頁版本中能套用客製化風格。
+        favicon: WEBP、PNG、GIF、或 JPG。使用自訂圖示替代預設 Mastodon favicon 圖示。
         mascot: 覆寫進階網頁介面中的圖例。
         media_cache_retention_period: 來自遠端伺服器嘟文中之多媒體內容將快取於您的伺服器。當設定為正值時,這些多媒體內容將於指定之天數後自您的儲存空間中自動刪除。若多媒體資料於刪除後被請求,且原始內容仍可存取,它們將被重新下載。由於連結預覽中第三方網站查詢頻率限制,建議將其設定為至少 14 日,否則於此之前連結預覽將不被即時更新。
         peers_api_enabled: 浩瀚聯邦宇宙中與此伺服器曾經擦肩而過的網域列表。不包含關於您是否與此伺服器是否有與之串連,僅僅表示您的伺服器已知此網域。這是供收集聯邦宇宙中一般性統計資料服務使用。

From 8540004f7b473df47e49d8dc5397ff590245553a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 7 May 2024 09:39:04 +0000
Subject: [PATCH 073/215] Update dependency dotenv to v3.1.2 (#30197)

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 190888ddb..23c29cabd 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -217,7 +217,7 @@ GEM
     domain_name (0.6.20240107)
     doorkeeper (5.6.9)
       railties (>= 5)
-    dotenv (3.1.1)
+    dotenv (3.1.2)
     drb (2.2.1)
     ed25519 (1.3.0)
     elasticsearch (7.17.10)

From 5cd13ee4f19c112ea855063c2495e2874746f23a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 7 May 2024 11:39:20 +0200
Subject: [PATCH 074/215] Update dependency aws-sdk-s3 to v1.149.1 (#30196)

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 23c29cabd..435144700 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -101,7 +101,7 @@ GEM
     awrence (1.2.1)
     aws-eventstream (1.3.0)
     aws-partitions (1.922.0)
-    aws-sdk-core (3.194.0)
+    aws-sdk-core (3.194.1)
       aws-eventstream (~> 1, >= 1.3.0)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.8)
@@ -109,7 +109,7 @@ GEM
     aws-sdk-kms (1.80.0)
       aws-sdk-core (~> 3, >= 3.193.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.149.0)
+    aws-sdk-s3 (1.149.1)
       aws-sdk-core (~> 3, >= 3.194.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.8)

From c9ccba7045f1127be0d89bf941b9ba381e2cb722 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 7 May 2024 14:43:11 +0200
Subject: [PATCH 075/215] Update dependency sass to v1.77.0 (#30200)

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 399dae205..95a3923e2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15320,15 +15320,15 @@ __metadata:
   linkType: hard
 
 "sass@npm:^1.62.1":
-  version: 1.76.0
-  resolution: "sass@npm:1.76.0"
+  version: 1.77.0
+  resolution: "sass@npm:1.77.0"
   dependencies:
     chokidar: "npm:>=3.0.0 <4.0.0"
     immutable: "npm:^4.0.0"
     source-map-js: "npm:>=0.6.2 <2.0.0"
   bin:
     sass: sass.js
-  checksum: 10c0/976baf2c378e104f8d4ffca5375c8aa6f3d24f59d5c0a5db8d68a51f89edce45dedc25cfcd304b309fc8568d146de9e2c6cd189395e97bb2840d39feb13932ff
+  checksum: 10c0/bce0e5f5b535491e4e775045a79f19cbe10d800ef53b5f7698958d2992505d7b124c968169b05a0190842d8e0a24c2aa6d75dfbdd7c213820d9d59e227009c19
   languageName: node
   linkType: hard
 

From d8c428472356abd70aaf1f514b99114464ee7f61 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Tue, 7 May 2024 20:15:17 +0200
Subject: [PATCH 076/215] Ensure custom favicon is converted to PNG and ICO
 (#30208)

---
 app/models/site_upload.rb               | 19 +++++++++++++++++--
 app/views/layouts/application.html.haml |  2 +-
 config/imagemagick/policy.xml           |  2 +-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/app/models/site_upload.rb b/app/models/site_upload.rb
index b3926ec7e..6431d1007 100644
--- a/app/models/site_upload.rb
+++ b/app/models/site_upload.rb
@@ -26,8 +26,23 @@ class SiteUpload < ApplicationRecord
   APP_ICON_SIZES = (APPLE_ICON_SIZES + ANDROID_ICON_SIZES).uniq.freeze
 
   STYLES = {
-    app_icon: APP_ICON_SIZES.each_with_object({}) { |size, hash| hash[size.to_s.to_sym] = "#{size}x#{size}#" }.freeze,
-    favicon: FAVICON_SIZES.each_with_object({}) { |size, hash| hash[size.to_s.to_sym] = "#{size}x#{size}#" }.freeze,
+    app_icon:
+      APP_ICON_SIZES.to_h do |size|
+        [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }]
+      end.freeze,
+
+    favicon: {
+      ico: {
+        format: 'ico',
+        geometry: '48x48#',
+        file_geometry_parser: FastGeometryParser,
+      }.freeze,
+    }.merge(
+      FAVICON_SIZES.to_h do |size|
+        [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }]
+      end
+    ).freeze,
+
     thumbnail: {
       '@1x': {
         format: 'png',
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 56857b2b6..e3d05226e 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -11,7 +11,7 @@
     - if storage_host?
       %link{ rel: 'dns-prefetch', href: storage_host }/
 
-    %link{ rel: 'icon', href: site_icon_path('favicon') || '/favicon.ico', type: 'image/x-icon' }/
+    %link{ rel: 'icon', href: site_icon_path('favicon', 'ico') || '/favicon.ico', type: 'image/x-icon' }/
 
     - SiteUpload::FAVICON_SIZES.each do |size|
       %link{ rel: 'icon', sizes: "#{size}x#{size}", href: site_icon_path('favicon', size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
diff --git a/config/imagemagick/policy.xml b/config/imagemagick/policy.xml
index e2aa202f2..2730a9f84 100644
--- a/config/imagemagick/policy.xml
+++ b/config/imagemagick/policy.xml
@@ -23,5 +23,5 @@
   <!-- Disallow any coder by default, and only enable ones required by Mastodon -->
   <policy domain="coder" rights="none" pattern="*" />
   <policy domain="coder" rights="read | write" pattern="{JPEG,PNG,GIF,WEBP,HEIC,AVIF}" />
-  <policy domain="coder" rights="write" pattern="{HISTOGRAM,RGB,INFO}" />
+  <policy domain="coder" rights="write" pattern="{HISTOGRAM,RGB,INFO,ICO}" />
 </policymap>

From 5a3062f723abefe4ec49898256e1d81b01fbf6f4 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Fri, 10 May 2024 10:00:02 +0200
Subject: [PATCH 077/215] Pass the CodeCov token from the secret to the action
 (#30219)

---
 .github/workflows/test-ruby.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml
index b28f5261c..84b907570 100644
--- a/.github/workflows/test-ruby.yml
+++ b/.github/workflows/test-ruby.yml
@@ -145,6 +145,8 @@ jobs:
         uses: codecov/codecov-action@v4
         with:
           files: coverage/lcov/mastodon.lcov
+        env:
+          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
 
   test-e2e:
     name: End to End testing

From 6819bcc4b6772075a8fd45b995b9e1bf92ef7868 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 11:18:52 +0200
Subject: [PATCH 078/215] Update dependency glob to v10.3.14 (#30230)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 95a3923e2..22f81166f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8882,17 +8882,17 @@ __metadata:
   linkType: hard
 
 "glob@npm:^10.2.2, glob@npm:^10.2.6, glob@npm:^10.3.10, glob@npm:^10.3.7":
-  version: 10.3.12
-  resolution: "glob@npm:10.3.12"
+  version: 10.3.14
+  resolution: "glob@npm:10.3.14"
   dependencies:
     foreground-child: "npm:^3.1.0"
     jackspeak: "npm:^2.3.6"
     minimatch: "npm:^9.0.1"
     minipass: "npm:^7.0.4"
-    path-scurry: "npm:^1.10.2"
+    path-scurry: "npm:^1.11.0"
   bin:
     glob: dist/esm/bin.mjs
-  checksum: 10c0/f60cefdc1cf3f958b2bb5823e1b233727f04916d489dc4641d76914f016e6704421e06a83cbb68b0cb1cb9382298b7a88075b844ad2127fc9727ea22b18b0711
+  checksum: 10c0/19126e53b99c94dea9b3509500e22b325e24d2674523fc95b9fe710f1549ad7e091fbb0704c325c53d3a172fc21a8251acce5395c4f3efd872a2e65a376c82a1
   languageName: node
   linkType: hard
 
@@ -12770,13 +12770,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"path-scurry@npm:^1.10.2":
-  version: 1.10.2
-  resolution: "path-scurry@npm:1.10.2"
+"path-scurry@npm:^1.11.0":
+  version: 1.11.0
+  resolution: "path-scurry@npm:1.11.0"
   dependencies:
     lru-cache: "npm:^10.2.0"
     minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0"
-  checksum: 10c0/d723777fbf9627f201e64656680f66ebd940957eebacf780e6cce1c2919c29c116678b2d7dbf8821b3a2caa758d125f4444005ccec886a25c8f324504e48e601
+  checksum: 10c0/a5cd5dfbc6d5bb01d06bc2eb16ccdf303d617865438a21fe15431b8ad334f23351f73259abeb7e4be56f9c68d237b26b4dba51c78b508586035dfc2b55085493
   languageName: node
   linkType: hard
 

From 6ccee2600bf8920131f9b4ad5706cf632262556b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 11:19:06 +0200
Subject: [PATCH 079/215] Update dependency rubocop to v1.63.5 (#30225)

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 435144700..9df960e61 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -640,7 +640,7 @@ GEM
       rspec-mocks (~> 3.0)
       sidekiq (>= 5, < 8)
     rspec-support (3.13.1)
-    rubocop (1.63.4)
+    rubocop (1.63.5)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)

From c36a8786c10c36e5181c9c53d848fa8e7b24b692 Mon Sep 17 00:00:00 2001
From: Chee Aun <cheeaun@gmail.com>
Date: Fri, 10 May 2024 17:19:27 +0800
Subject: [PATCH 080/215] Fix typo (#30224)

---
 .../mastodon/features/notifications/components/notification.jsx | 2 +-
 app/javascript/mastodon/locales/en.json                         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx
index caf7f9bdc..69084c211 100644
--- a/app/javascript/mastodon/features/notifications/components/notification.jsx
+++ b/app/javascript/mastodon/features/notifications/components/notification.jsx
@@ -41,7 +41,7 @@ const messages = defineMessages({
   adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' },
   adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' },
   relationshipsSevered: { id: 'notification.relationships_severance_event', defaultMessage: 'Lost connections with {name}' },
-  moderationWarning: { id: 'notification.moderation_warning', defaultMessage: 'Your have received a moderation warning' },
+  moderationWarning: { id: 'notification.moderation_warning', defaultMessage: 'You have received a moderation warning' },
 });
 
 const notificationForScreenReader = (intl, message, timestamp) => {
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 9d127b6b0..56e4612c1 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -474,7 +474,7 @@
   "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
   "notification.moderation-warning.learn_more": "Learn more",
-  "notification.moderation_warning": "Your have received a moderation warning",
+  "notification.moderation_warning": "You have received a moderation warning",
   "notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.",
   "notification.moderation_warning.action_disable": "Your account has been disabled.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Some of your posts have been marked as sensitive.",

From 0a4a93038fa08e0f64f3b1f267853f38f41cd0cf Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 09:22:47 +0000
Subject: [PATCH 081/215] Update Yarn to v4.2.2 (#30220)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 package.json           | 2 +-
 streaming/package.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 3abc11c34..d88488333 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@mastodon/mastodon",
   "license": "AGPL-3.0-or-later",
-  "packageManager": "yarn@4.2.1",
+  "packageManager": "yarn@4.2.2",
   "engines": {
     "node": ">=18"
   },
diff --git a/streaming/package.json b/streaming/package.json
index f08d2a4c2..cf1fe4ba6 100644
--- a/streaming/package.json
+++ b/streaming/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@mastodon/streaming",
   "license": "AGPL-3.0-or-later",
-  "packageManager": "yarn@4.2.1",
+  "packageManager": "yarn@4.2.2",
   "engines": {
     "node": ">=18"
   },

From 1aa3976f280efed1ae4c72c1ac58e3e4ff9061f1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 11:23:45 +0200
Subject: [PATCH 082/215] Update dependency pino-http to v10.1.0 (#30199)

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 22f81166f..28cf50046 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13004,14 +13004,14 @@ __metadata:
   linkType: hard
 
 "pino-http@npm:^10.0.0":
-  version: 10.0.0
-  resolution: "pino-http@npm:10.0.0"
+  version: 10.1.0
+  resolution: "pino-http@npm:10.1.0"
   dependencies:
     get-caller-file: "npm:^2.0.5"
     pino: "npm:^9.0.0"
     pino-std-serializers: "npm:^7.0.0"
     process-warning: "npm:^3.0.0"
-  checksum: 10c0/40d2dcb2bc0c51f1ce45d3d7144c54f087fe1a122d82d0f497d65656151a1603a64f82f62d7fc6a3c172754c5a5cf6105b3096620eece31cefbc8cf95b26c062
+  checksum: 10c0/d97691f2ee248b0aca0e49169d0c7ca0d4c604ee57b63ae264a6f9914fc7277cace74686d5088a876f8152a8d5b8211af904b2d24a516728a662de0e9cc79e9f
   languageName: node
   linkType: hard
 

From 3a5a1b2e5838d8915bd2d08e5d3ea363d66b611e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 09:25:07 +0000
Subject: [PATCH 083/215] Update dependency node to 20.13 (#30211)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 .nvmrc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.nvmrc b/.nvmrc
index 7795cadb5..973f49d55 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-20.12
+20.13

From c9557bdd3bc7c67f6513295b0ab633cfca8cbfdd Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 11:34:48 +0200
Subject: [PATCH 084/215] New Crowdin Translations (automated) (#30215)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/gl.json |  8 +--
 app/javascript/mastodon/locales/hi.json |  5 ++
 app/javascript/mastodon/locales/ie.json | 29 ++++++++
 app/javascript/mastodon/locales/lt.json | 93 +++++++++++++++----------
 app/javascript/mastodon/locales/lv.json | 35 ++++++++--
 config/locales/devise.ia.yml            | 25 +++++++
 config/locales/doorkeeper.ia.yml        |  4 ++
 config/locales/doorkeeper.ie.yml        |  1 +
 config/locales/doorkeeper.lt.yml        | 50 ++++++-------
 config/locales/gl.yml                   | 10 +--
 config/locales/ia.yml                   | 44 ++++++++++++
 config/locales/ie.yml                   |  2 +
 config/locales/ko.yml                   |  1 +
 config/locales/lt.yml                   |  5 ++
 config/locales/lv.yml                   | 21 ++++++
 config/locales/pt-BR.yml                |  1 +
 config/locales/ro.yml                   |  9 +++
 config/locales/simple_form.ar.yml       |  5 ++
 config/locales/simple_form.bg.yml       |  2 +
 config/locales/simple_form.de.yml       |  4 +-
 config/locales/simple_form.hu.yml       |  2 +-
 config/locales/simple_form.ia.yml       |  2 +
 config/locales/simple_form.it.yml       |  2 +
 config/locales/simple_form.ko.yml       |  3 +
 config/locales/simple_form.lt.yml       |  2 +-
 config/locales/simple_form.nn.yml       |  3 +-
 config/locales/simple_form.pt-BR.yml    |  5 ++
 config/locales/simple_form.ro.yml       |  1 +
 config/locales/simple_form.sq.yml       |  2 +
 config/locales/uk.yml                   |  2 +-
 30 files changed, 296 insertions(+), 82 deletions(-)

diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 49802ac48..88d4f5f60 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -2,7 +2,7 @@
   "about.blocks": "Servidores suxeitos a moderación",
   "about.contact": "Contacto:",
   "about.disclaimer": "Mastodon é software libre, de código aberto, e unha marca comercial de Mastodon gGmbH.",
-  "about.domain_blocks.no_reason_available": "Motivo non indicado. ",
+  "about.domain_blocks.no_reason_available": "Motivo non indicado",
   "about.domain_blocks.preamble": "Mastodon de xeito xeral permíteche ver contidos doutros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estabeleceron neste servidor en particular.",
   "about.domain_blocks.silenced.explanation": "Por defecto non verás perfís e contido desde este servidor, a menos que mires de xeito explícito ou optes por seguir ese contido ou usuaria.",
   "about.domain_blocks.silenced.title": "Limitado",
@@ -115,7 +115,7 @@
   "closed_registrations_modal.find_another_server": "Atopa outro servidor",
   "closed_registrations_modal.preamble": "Mastodon é descentralizado, así que non importa onde crees a conta, poderás seguir e interactuar con calquera conta deste servidor. Incluso podes ter o teu servidor!",
   "closed_registrations_modal.title": "Crear conta en Mastodon",
-  "column.about": "Acerca de",
+  "column.about": "Sobre",
   "column.blocks": "Usuarias bloqueadas",
   "column.bookmarks": "Marcadores",
   "column.community": "Cronoloxía local",
@@ -322,7 +322,7 @@
   "follow_suggestions.view_all": "Ver todas",
   "follow_suggestions.who_to_follow": "A quen seguir",
   "followed_tags": "Cancelos seguidos",
-  "footer.about": "Acerca de",
+  "footer.about": "Sobre",
   "footer.directory": "Directorio de perfís",
   "footer.get_app": "Descarga a app",
   "footer.invite": "Convidar persoas",
@@ -441,7 +441,7 @@
   "mute_modal.title": "Acalar usuaria?",
   "mute_modal.you_wont_see_mentions": "Non verás as publicacións que a mencionen.",
   "mute_modal.you_wont_see_posts": "Seguirá podendo ler as túas publicacións, pero non verás as súas.",
-  "navigation_bar.about": "Acerca de",
+  "navigation_bar.about": "Sobre",
   "navigation_bar.advanced_interface": "Abrir coa interface web avanzada",
   "navigation_bar.blocks": "Usuarias bloqueadas",
   "navigation_bar.bookmarks": "Marcadores",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 372eb09fa..5dc99dd76 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -205,6 +205,10 @@
   "dismissable_banner.dismiss": "डिसमिस",
   "dismissable_banner.explore_links": "इन समाचारों के बारे में लोगों द्वारा इस पर और डेसेंट्रलीसेड नेटवर्क के अन्य सर्वरों पर अभी बात की जा रही है।",
   "dismissable_banner.explore_tags": "ये हैशटैग अभी इस पर और डेसेंट्रलीसेड नेटवर्क के अन्य सर्वरों पर लोगों के बीच कर्षण प्राप्त कर रहे हैं।",
+  "domain_block_modal.block": "सर्वर ब्लॉक करें",
+  "domain_block_modal.title": "डोमेन ब्लॉक करें",
+  "domain_pill.server": "सर्वर",
+  "domain_pill.username": "यूज़रनेम",
   "embed.instructions": "अपने वेबसाइट पर, निचे दिए कोड को कॉपी करके, इस स्टेटस को एम्बेड करें",
   "embed.preview": "यह ऐसा दिखेगा :",
   "emoji_button.activity": "गतिविधि",
@@ -274,6 +278,7 @@
   "follow_request.authorize": "अधिकार दें",
   "follow_request.reject": "अस्वीकार करें",
   "follow_requests.unlocked_explanation": "हालाँकि आपका खाता लॉक नहीं है, फिर भी {domain} डोमेन स्टाफ ने सोचा कि आप इन खातों के मैन्युअल अनुरोधों की समीक्षा करना चाहते हैं।",
+  "follow_suggestions.dismiss": "दोबारा न दिखाएं",
   "followed_tags": "फॉलो किए गए हैशटैग्स",
   "footer.about": "अबाउट",
   "footer.directory": "प्रोफाइल्स डायरेक्टरी",
diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json
index 8d491412c..7bd91ca0f 100644
--- a/app/javascript/mastodon/locales/ie.json
+++ b/app/javascript/mastodon/locales/ie.json
@@ -212,13 +212,20 @@
   "domain_block_modal.block_account_instead": "Altrimen, bloccar @{name}",
   "domain_block_modal.they_can_interact_with_old_posts": "Persones de ti servitor posse interacter con tui old postas.",
   "domain_block_modal.they_cant_follow": "Nequi de ti-ci servitor posse sequer te.",
+  "domain_block_modal.they_wont_know": "Ne va esser conscient pri li bloccada.",
+  "domain_block_modal.title": "Bloccar dominia?",
+  "domain_block_modal.you_will_lose_followers": "Omni tui sequitores de ti-ci servitor va esser efaciat.",
+  "domain_block_modal.you_wont_see_posts": "Tu ne va vider postas ni notificationes de usatores sur ti-ci servitor.",
+  "domain_pill.activitypub_lets_connect": "It possibilisa tui conexiones e interactiones con persones ne solmen sur Mastodon, ma anc tra diferent social aplis.",
   "domain_pill.activitypub_like_language": "ActivityPub es li lingue usat de Mastodon por parlar con altri social retages.",
   "domain_pill.server": "Servitor",
   "domain_pill.their_handle": "Identificator:",
   "domain_pill.their_server": "Su digital hem e omni su postas.",
+  "domain_pill.their_username": "Su unic identificator sur su servitor. It es possibil que altri servitores va haver usatores con li sam nómine.",
   "domain_pill.username": "Usator-nómine",
   "domain_pill.whats_in_a_handle": "Ex quo consiste un identificator?",
   "domain_pill.your_handle": "Tui identificator:",
+  "domain_pill.your_username": "Tui unic identificator sur ti-ci servitor. It es possibil que altri servitores va haver usatores con li sam nómine.",
   "embed.instructions": "Inbedar ti-ci posta per copiar li code in infra.",
   "embed.preview": "Vi qualmen it va aspecter:",
   "emoji_button.activity": "Activitá",
@@ -286,6 +293,7 @@
   "filter_modal.select_filter.subtitle": "Usar un existent categorie o crear nov",
   "filter_modal.select_filter.title": "Filtrar ti-ci posta",
   "filter_modal.title.status": "Filtrar un posta",
+  "filtered_notifications_banner.mentions": "{count, plural, one {mention} other {mentiones}}",
   "filtered_notifications_banner.pending_requests": "Notificationes de {count, plural, =0 {nequi} one {un person} other {# persones}} quel tu possibilmen conosse",
   "filtered_notifications_banner.title": "Filtrat notificationes",
   "firehose.all": "Omno",
@@ -296,6 +304,8 @@
   "follow_requests.unlocked_explanation": "Benque tu conto ne es cludet, li administratores de {domain} pensat que tu fórsan vell voler tractar seque-petitiones de tis-ci contos manualmen.",
   "follow_suggestions.curated_suggestion": "Selection del employates",
   "follow_suggestions.dismiss": "Ne monstrar plu",
+  "follow_suggestions.featured_longer": "Selectet manualmen del equip de {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Populari ínter li persones queles tu seque",
   "follow_suggestions.hints.featured": "Ti-ci profil ha esset selectet directmen del equip de {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Ti-ci profil es populari ínter tis qui tu seque.",
   "follow_suggestions.hints.most_followed": "Ti-ci profil es un del max sequet sur {domain}.",
@@ -303,6 +313,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Ti-ci profil es simil al profiles queles tu ha recentmen sequet.",
   "follow_suggestions.personalized_suggestion": "Personalisat suggestion",
   "follow_suggestions.popular_suggestion": "Populari suggestion",
+  "follow_suggestions.popular_suggestion_longer": "Populari sur {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Simil a profiles queles tu sequet recentmen",
   "follow_suggestions.view_all": "Vider omnicos",
   "follow_suggestions.who_to_follow": "Persones a sequer",
   "followed_tags": "Sequet hashtags",
@@ -423,6 +435,8 @@
   "mute_modal.they_can_mention_and_follow": "Posse mentionar e sequer te, ma va esser ínvisibil a te.",
   "mute_modal.they_wont_know": "Ne va esser conscient pri li silentation.",
   "mute_modal.title": "Silentiar usator?",
+  "mute_modal.you_wont_see_mentions": "Tu ne va vider postas mentionant li usator.",
+  "mute_modal.you_wont_see_posts": "Ne posse vider tui postas e inversi.",
   "navigation_bar.about": "Information",
   "navigation_bar.advanced_interface": "Aperter in li web-interfacie avansat",
   "navigation_bar.blocks": "Bloccat usatores",
@@ -455,10 +469,23 @@
   "notification.follow": "{name} sequet te",
   "notification.follow_request": "{name} ha petit sequer te",
   "notification.mention": "{name} mentionat te",
+  "notification.moderation-warning.learn_more": "Aprender plu",
+  "notification.moderation_warning": "Tu ha recivet un moderatori advertiment",
+  "notification.moderation_warning.action_delete_statuses": "Alcun de tui postas ha esset efaciat.",
+  "notification.moderation_warning.action_disable": "Tui conto ha esset desactivisat.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Alcun de tui postas ha esset marcat quam sensitiv.",
+  "notification.moderation_warning.action_none": "Tui conto ha recivet un moderatori advertiment.",
+  "notification.moderation_warning.action_sensitive": "Desde nu tui postas va esser marcat quam sensitiv.",
+  "notification.moderation_warning.action_silence": "Tui conto ha esset limitat.",
+  "notification.moderation_warning.action_suspend": "Tui conto ha esset suspendet.",
   "notification.own_poll": "Tui balotation ha finit",
   "notification.poll": "Un balotation in quel tu votat ha finit",
   "notification.reblog": "{name} boostat tui posta",
+  "notification.relationships_severance_event": "Perdit conexiones con {name}",
+  "notification.relationships_severance_event.account_suspension": "Un admin de {from} ha suspendet {target}, dunc con ti person tu ne plu posse reciver actualisationes ni far interactiones.",
+  "notification.relationships_severance_event.domain_block": "Un admin de {from} ha bloccat {target}, includente {followersCount} de tui sequitores e {followingCount, plural, one {# conto} other {# contos}} sequet de te.",
   "notification.relationships_severance_event.learn_more": "Aprender plu",
+  "notification.relationships_severance_event.user_domain_block": "Tu ha bloccat {target}, efaciante {followersCount} de tui sequitores e {followingCount, plural, one {# conto} other {# contos}} sequet de te.",
   "notification.status": "{name} just postat",
   "notification.update": "{name} modificat un posta",
   "notification_requests.accept": "Acceptar",
@@ -472,6 +499,7 @@
   "notifications.column_settings.alert": "Notificationes sur li computator",
   "notifications.column_settings.favourite": "Favorites:",
   "notifications.column_settings.filter_bar.advanced": "Monstrar omni categories",
+  "notifications.column_settings.filter_bar.category": "Rapid filtre-barre",
   "notifications.column_settings.follow": "Nov sequitores:",
   "notifications.column_settings.follow_request": "Nov petitiones de sequer:",
   "notifications.column_settings.mention": "Mentiones:",
@@ -707,6 +735,7 @@
   "status.reblog": "Boostar",
   "status.reblog_private": "Boostar con li original visibilitá",
   "status.reblogged_by": "{name} boostat",
+  "status.reblogs": "{count, plural, one {boost} other {boosts}}",
   "status.reblogs.empty": "Ancor nequi ha boostat ti-ci posta. Quande alqui fa it, ilu va aparir ci.",
   "status.redraft": "Deleter & redacter",
   "status.remove_bookmark": "Remover marcator",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 083a92201..798b24569 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -1,7 +1,7 @@
 {
   "about.blocks": "Prižiūrimi serveriai",
   "about.contact": "Kontaktai:",
-  "about.disclaimer": "Mastodon – nemokama atvirojo kodo programa ir Mastodon gGmbH prekės ženklas.",
+  "about.disclaimer": "Mastodon – tai nemokama atvirojo kodo programinė įranga ir Mastodon gGmbH prekės ženklas.",
   "about.domain_blocks.no_reason_available": "Priežastis nepateikta",
   "about.domain_blocks.preamble": "Mastodon paprastai leidžia peržiūrėti turinį ir bendrauti su naudotojais iš bet kurio kito fediverse esančio serverio. Šios yra išimtys, kurios buvo padarytos šiame konkrečiame serveryje.",
   "about.domain_blocks.silenced.explanation": "Paprastai nematysi profilių ir turinio iš šio serverio, nebent jį aiškiai ieškosi arba pasirinksi jį sekdamas (-a).",
@@ -30,7 +30,7 @@
   "account.endorse": "Rodyti profilyje",
   "account.featured_tags.last_status_at": "Paskutinis įrašas {date}",
   "account.featured_tags.last_status_never": "Nėra įrašų",
-  "account.featured_tags.title": "{name} rekomenduojami saitažodžiai",
+  "account.featured_tags.title": "{name} rodomi saitažodžiai",
   "account.follow": "Sekti",
   "account.follow_back": "Sekti atgal",
   "account.followers": "Sekėjai",
@@ -38,13 +38,13 @@
   "account.followers_counter": "{count, plural, one {{counter} sekėjas} few {{counter} sekėjai} many {{counter} sekėjo} other {{counter} sekėjų}}",
   "account.following": "Sekama",
   "account.following_counter": "{count, plural, one {{counter} sekimas} few {{counter} sekimai} many {{counter} sekimo} other {{counter} sekimų}}",
-  "account.follows.empty": "Šis (-i) naudotojas (-a) dar nieko neseka.",
+  "account.follows.empty": "Šis naudotojas dar nieko neseka.",
   "account.go_to_profile": "Eiti į profilį",
   "account.hide_reblogs": "Slėpti pakėlimus iš @{name}",
   "account.in_memoriam": "Atminimui.",
   "account.joined_short": "Prisijungė",
   "account.languages": "Keisti prenumeruojamas kalbas",
-  "account.link_verified_on": "Šios nuorodos nuosavybė buvo patikrinta {date}.",
+  "account.link_verified_on": "Šios nuorodos nuosavybė buvo patikrinta {date}",
   "account.locked_info": "Šios paskyros privatumo būsena nustatyta kaip užrakinta. Savininkas (-ė) rankiniu būdu peržiūri, kas gali sekti.",
   "account.media": "Medija",
   "account.mention": "Paminėti @{name}",
@@ -59,7 +59,7 @@
   "account.posts": "Įrašai",
   "account.posts_with_replies": "Įrašai ir atsakymai",
   "account.report": "Pranešti apie @{name}",
-  "account.requested": "Laukiama patvirtinimo. Spustelėk, jei nori atšaukti sekimo prašymą.",
+  "account.requested": "Laukiama patvirtinimo. Spustelėk, jei nori atšaukti sekimo prašymą",
   "account.requested_follow": "{name} paprašė tave sekti",
   "account.share": "Bendrinti @{name} profilį",
   "account.show_reblogs": "Rodyti pakėlimus iš @{name}",
@@ -82,7 +82,7 @@
   "admin.impact_report.instance_followers": "Sekėjai, kuriuos prarastų mūsų naudotojai",
   "admin.impact_report.instance_follows": "Sekėjai, kuriuos prarastų jų naudotojai",
   "admin.impact_report.title": "Poveikio apibendrinimas",
-  "alert.rate_limited.message": "Pabandyk vėliau po {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Bandyk vėliau po {retry_time, time, medium}.",
   "alert.rate_limited.title": "Sparta ribota.",
   "alert.unexpected.message": "Įvyko netikėta klaida.",
   "alert.unexpected.title": "Ups!",
@@ -92,7 +92,12 @@
   "block_modal.remote_users_caveat": "Paprašysime serverio {domain} gerbti tavo sprendimą. Tačiau atitiktis negarantuojama, nes kai kurie serveriai gali skirtingai tvarkyti blokavimus. Vieši įrašai vis tiek gali būti matomi neprisijungusiems naudotojams.",
   "block_modal.show_less": "Rodyti mažiau",
   "block_modal.show_more": "Rodyti daugiau",
-  "boost_modal.combo": "Galima paspausti {combo}, kad praleisti kitą kartą.",
+  "block_modal.they_cant_mention": "Jie negali tave paminėti ar sekti.",
+  "block_modal.they_cant_see_posts": "Jie negali matyti tavo įrašus, o tu nematysi jų.",
+  "block_modal.they_will_know": "Jie mato, kad yra užblokuoti.",
+  "block_modal.title": "Blokuoti naudotoją?",
+  "block_modal.you_wont_see_mentions": "Nematysi įrašus, kuriuose jie paminimi.",
+  "boost_modal.combo": "Galima paspausti {combo}, kad praleisti tai kitą kartą",
   "bundle_column_error.copy_stacktrace": "Kopijuoti klaidos ataskaitą",
   "bundle_column_error.error.body": "Paprašytos puslapio nepavyko atvaizduoti. Tai gali būti dėl mūsų kodo klaidos arba naršyklės suderinamumo problemos.",
   "bundle_column_error.error.title": "O, ne!",
@@ -117,7 +122,7 @@
   "column.direct": "Privatūs paminėjimai",
   "column.directory": "Naršyti profilius",
   "column.domain_blocks": "Užblokuoti domenai",
-  "column.favourites": "Mėgstamiausi",
+  "column.favourites": "Mėgstami",
   "column.firehose": "Tiesioginiai srautai",
   "column.follow_requests": "Sekimo prašymai",
   "column.home": "Pagrindinis",
@@ -144,7 +149,7 @@
   "compose.saved.body": "Įrašas išsaugotas.",
   "compose_form.direct_message_warning_learn_more": "Sužinoti daugiau",
   "compose_form.encryption_warning": "Mastodon įrašai nėra visapusiškai šifruojami. Per Mastodon nesidalyk jokia slapta informacija.",
-  "compose_form.hashtag_warning": "Šis įrašas nebus įtraukta į jokį saitažodį, nes ji nėra vieša. Tik viešų įrašų galima ieškoti pagal saitažodį.",
+  "compose_form.hashtag_warning": "Šis įrašas nebus įtrauktas į jokį saitažodį, nes ji nėra vieša. Tik viešų įrašų galima ieškoti pagal saitažodį.",
   "compose_form.lock_disclaimer": "Tavo paskyra nėra {locked}. Bet kas gali sekti tave ir peržiūrėti tik sekėjams skirtus įrašus.",
   "compose_form.lock_disclaimer.lock": "užrakinta",
   "compose_form.placeholder": "Kas tavo mintyse?",
@@ -152,7 +157,7 @@
   "compose_form.poll.multiple": "Keli pasirinkimai",
   "compose_form.poll.option_placeholder": "{number} parinktis",
   "compose_form.poll.single": "Pasirinkti vieną",
-  "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus.",
+  "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus",
   "compose_form.poll.switch_to_single": "Keisti apklausą, kad būtų galima pasirinkti vieną pasirinkimą",
   "compose_form.poll.type": "Stilius",
   "compose_form.publish": "Skelbti",
@@ -172,16 +177,17 @@
   "confirmations.delete_list.message": "Ar tikrai nori visam laikui ištrinti šį sąrašą?",
   "confirmations.discard_edit_media.confirm": "Atmesti",
   "confirmations.discard_edit_media.message": "Turi neišsaugotų medijos aprašymo ar peržiūros pakeitimų, vis tiek juos atmesti?",
+  "confirmations.domain_block.confirm": "Blokuoti serverį",
   "confirmations.domain_block.message": "Ar tikrai, tikrai nori užblokuoti visą {domain}? Daugeliu atvejų užtenka kelių tikslinių blokavimų arba nutildymų. Šio domeno turinio nematysi jokiose viešose laiko skalėse ar pranešimuose. Tavo sekėjai iš to domeno bus pašalinti.",
   "confirmations.edit.confirm": "Redaguoti",
   "confirmations.edit.message": "Redaguojant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?",
   "confirmations.logout.confirm": "Atsijungti",
   "confirmations.logout.message": "Ar tikrai nori atsijungti?",
   "confirmations.mute.confirm": "Nutildyti",
-  "confirmations.redraft.confirm": "Ištrinti ir parengti iš naujo",
-  "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parengti jį iš naujo kaip juodraštį? Bus prarastos mėgstamiausios ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.",
+  "confirmations.redraft.confirm": "Ištrinti ir perrašyti",
+  "confirmations.redraft.message": "Ar tikrai nori ištrinti šį įrašą ir parašyti jį iš naujo? Bus prarastos mėgstamai ir pakėlimai, o atsakymai į originalinį įrašą taps liekamojais.",
   "confirmations.reply.confirm": "Atsakyti",
-  "confirmations.reply.message": "Atsakant dabar, bus perrašyta metu kuriama žinutė. Ar tikrai nori tęsti?",
+  "confirmations.reply.message": "Atsakant dabar, bus perrašyta šiuo metu kuriama žinutė. Ar tikrai nori tęsti?",
   "confirmations.unfollow.confirm": "Nebesekti",
   "confirmations.unfollow.message": "Ar tikrai nori nebesekti {name}?",
   "conversation.delete": "Ištrinti pokalbį",
@@ -196,34 +202,42 @@
   "directory.new_arrivals": "Nauji atvykėliai",
   "directory.recently_active": "Neseniai aktyvus (-i)",
   "disabled_account_banner.account_settings": "Paskyros nustatymai",
-  "disabled_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu išjungta.",
-  "dismissable_banner.community_timeline": "Tai – naujausi vieši įrašai, kuriuos paskelbė žmonės, kurių paskyros talpinamos {domain}.",
+  "disabled_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu yra išjungta.",
+  "dismissable_banner.community_timeline": "Tai – naujausi vieši įrašai iš žmonių, kurių paskyros talpinamos {domain}.",
   "dismissable_banner.dismiss": "Atmesti",
   "dismissable_banner.explore_links": "Tai – naujienos, kuriomis šiandien daugiausiai bendrinamasi socialiniame žiniatinklyje. Naujesnės naujienų istorijos, kurias paskelbė daugiau skirtingų žmonių, vertinamos aukščiau.",
   "dismissable_banner.explore_statuses": "Tai – įrašai iš viso socialinio žiniatinklio, kurie šiandien sulaukia daug dėmesio. Naujesni įrašai, turintys daugiau pakėlimų ir mėgstamų, vertinami aukščiau.",
   "dismissable_banner.explore_tags": "Tai – saitažodžiai, kurie šiandien sulaukia daug dėmesio socialiniame žiniatinklyje. Saitažodžiai, kuriuos naudoja daugiau skirtingų žmonių, vertinami aukščiau.",
-  "dismissable_banner.public_timeline": "Tai – naujausi vieši įrašai, kuriuos socialiniame žiniatinklyje paskelbė žmonės, sekantys {domain}.",
-  "domain_pill.activitypub_lets_connect": "Tai leidžia tau bendrauti su žmonėmis ne tik Mastodon, bet ir įvairiose socialinėse programėlėse.",
-  "domain_pill.activitypub_like_language": "ActivityPub – tarsi kalba, kuria Mastodon kalba su kitais socialiniais tinklais.",
+  "dismissable_banner.public_timeline": "Tai – naujausi vieši įrašai iš žmonių socialiniame žiniatinklyje, kuriuos seka {domain} žmonės.",
+  "domain_block_modal.block": "Blokuoti serverį",
+  "domain_block_modal.block_account_instead": "Blokuoti {name} vietoj to",
+  "domain_block_modal.they_can_interact_with_old_posts": "Žmonės iš šio serverio gali sąveikauti su tavo senomis įrašomis.",
+  "domain_block_modal.they_cant_follow": "Niekas iš šio serverio negali tavęs sekti.",
+  "domain_block_modal.they_wont_know": "Jie nežinos, kad buvo užblokuoti.",
+  "domain_block_modal.title": "Blokuoti domeną?",
+  "domain_block_modal.you_will_lose_followers": "Visi tavo sekėjai iš šio serverio bus pašalinti.",
+  "domain_block_modal.you_wont_see_posts": "Nematysi naudotojų įrašų ar pranešimų šiame serveryje.",
+  "domain_pill.activitypub_lets_connect": "Tai leidžia tau sąveikauti su žmonėmis ne tik Mastodon, bet ir įvairiose socialinėse programėlėse.",
+  "domain_pill.activitypub_like_language": "ActivityPub – tai tarsi kalba, kuria Mastodon kalba su kitais socialiniais tinklais.",
   "domain_pill.server": "Serveris",
   "domain_pill.their_handle": "Jų socialinis medijos vardas:",
   "domain_pill.their_server": "Jų skaitmeniniai namai, kuriuose saugomi visi jų įrašai.",
   "domain_pill.their_username": "Jų unikalus identifikatorius jų serveryje. Skirtinguose serveriuose galima rasti naudotojų, turinčių tą patį naudotojo vardą.",
   "domain_pill.username": "Naudotojo vardas",
   "domain_pill.whats_in_a_handle": "Kas yra socialiniame medijos varde?",
-  "domain_pill.who_they_are": "Kadangi socialines medijos vardai nurodo, kas ir kur jie yra, galima bendrauti su žmonėmis visame socialiniame tinkle, kuriame yra <button> ActivityPub valdomos platformos</button>.",
-  "domain_pill.who_you_are": "Kadangi tavo socialinis medijos vardas nurodo, kas esi ir kur esi, žmonės gali bendrauti su tavimi visame socialiniame tinkle, kurį sudaro <button> ActivityPub valdomos platformos</button>.",
+  "domain_pill.who_they_are": "Kadangi socialines medijos vardai nurodo, kas žmogus yra ir kur jie yra, gali sąveikauti su žmonėmis visame socialiniame žiniatinklyje, kurį sudaro <button>ActivityPub veikiančios platformos</button>.",
+  "domain_pill.who_you_are": "Kadangi tavo socialinis medijos vardas nurodo, kas esi ir kur esi, žmonės gali sąveikauti su tavimi visame socialiniame tinkle, kurį sudaro <button>ActivityPub veikiančios platformos</button>.",
   "domain_pill.your_handle": "Tavo socialinis medijos vardas:",
   "domain_pill.your_server": "Tavo skaitmeniniai namai, kuriuose saugomi visi tavo įrašai. Nepatinka šis? Bet kada perkelk serverius ir atsivesk ir savo sekėjus.",
-  "domain_pill.your_username": "Tavo unikalus identifikatorius šiame serveryje. Skirtinguose serveriuose galima rasti naudotojų, turinčių tą patį naudotojo vardą.",
+  "domain_pill.your_username": "Tavo unikalus identifikatorius šiame serveryje. Skirtinguose serveriuose galima rasti naudotojų su tuo pačiu naudotojo vardu.",
   "embed.instructions": "Įterpk šį įrašą į savo svetainę nukopijavus (-usi) toliau pateiktą kodą.",
-  "embed.preview": "Štai, kaip tai atrodys:",
+  "embed.preview": "Štai kaip tai atrodys:",
   "emoji_button.activity": "Veikla",
   "emoji_button.clear": "Išvalyti",
   "emoji_button.custom": "Pasirinktinis",
   "emoji_button.flags": "Vėliavos",
   "emoji_button.food": "Maistas ir gėrimai",
-  "emoji_button.label": "Įterpti veidelius",
+  "emoji_button.label": "Įterpti jaustuką",
   "emoji_button.nature": "Gamta",
   "emoji_button.not_found": "Nerasta jokių tinkamų jaustukų.",
   "emoji_button.objects": "Objektai",
@@ -234,12 +248,12 @@
   "emoji_button.symbols": "Simboliai",
   "emoji_button.travel": "Kelionės ir vietos",
   "empty_column.account_hides_collections": "Šis (-i) naudotojas (-a) pasirinko nepadaryti šią informaciją prieinamą.",
-  "empty_column.account_suspended": "Paskyra sustabdyta.",
-  "empty_column.account_timeline": "Nėra įrašų čia.",
+  "empty_column.account_suspended": "Paskyra pristabdyta.",
+  "empty_column.account_timeline": "Nėra čia įrašų.",
   "empty_column.account_unavailable": "Profilis neprieinamas.",
   "empty_column.blocks": "Dar neužblokavai nė vieno naudotojo.",
-  "empty_column.bookmarked_statuses": "Dar neturi nė vienos įrašo žymės. Kai vieną iš jų pridėsi į žymes, jis bus rodomas čia.",
-  "empty_column.community": "Vietinė laiko skalė tuščia. Parašyk ką nors viešai, kad pradėtum bendrauti!",
+  "empty_column.bookmarked_statuses": "Dar neturi nė vienos įrašo pridėtos žymės. Kai vieną iš jų pridėsi į žymes, jis bus rodomas čia.",
+  "empty_column.community": "Vietinė laiko skalė yra tuščia. Parašyk ką nors viešai, kad pradėtum sąveikauti.",
   "empty_column.direct": "Dar neturi jokių privačių paminėjimų. Kai išsiųsi arba gausi vieną iš jų, jis bus rodomas čia.",
   "empty_column.domain_blocks": "Dar nėra užblokuotų domenų.",
   "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrink vėliau.",
@@ -248,12 +262,13 @@
   "empty_column.follow_requests": "Dar neturi jokių sekimo prašymų. Kai gausi tokį prašymą, jis bus rodomas čia.",
   "empty_column.followed_tags": "Dar neseki jokių saitažodžių. Kai tai padarysi, jie bus rodomi čia.",
   "empty_column.hashtag": "Nėra nieko šiame saitažodyje kol kas.",
-  "empty_column.home": "Tavo pagrindinio laiko skalė tuščia! Sek daugiau žmonių, kad ją užpildytum.",
+  "empty_column.home": "Tavo pagrindinio laiko skalė tuščia. Sek daugiau žmonių, kad ją užpildytum.",
   "empty_column.list": "Nėra nieko šiame sąraše kol kas. Kai šio sąrašo nariai paskelbs naujų įrašų, jie bus rodomi čia.",
   "empty_column.lists": "Dar neturi jokių sąrašų. Kai jį sukursi, jis bus rodomas čia.",
   "empty_column.mutes": "Dar nesi nutildęs (-usi) nė vieno naudotojo.",
-  "empty_column.notifications": "Dar neturi jokių pranešimų. Kai kiti žmonės su tavimi bendraus, matysi tai čia.",
-  "empty_column.public": "Čia nieko nėra! Parašyk ką nors viešai arba rankiniu būdu sek naudotojus iš kitų serverių, kad jį užpildytum.",
+  "empty_column.notification_requests": "Viskas švaru! Čia nieko nėra. Kai gausi naujų pranešimų, jie bus rodomi čia pagal tavo nustatymus.",
+  "empty_column.notifications": "Dar neturi jokių pranešimų. Kai kiti žmonės su tavimi sąveikaus, matysi tai čia.",
+  "empty_column.public": "Čia nieko nėra. Parašyk ką nors viešai arba rankiniu būdu sek naudotojus iš kitų serverių, kad jį užpildytum.",
   "error.unexpected_crash.explanation": "Dėl mūsų kodo riktos arba naršyklės suderinamumo problemos šis puslapis negalėjo būti rodomas teisingai.",
   "error.unexpected_crash.explanation_addons": "Šį puslapį nepavyko parodyti teisingai. Šią klaidą greičiausiai sukėlė naršyklės priedas arba automatinio vertimo įrankiai.",
   "error.unexpected_crash.next_steps": "Pabandyk atnaujinti puslapį. Jei tai nepadeda, galbūt vis dar galėsi naudotis Mastodon per kitą naršyklę arba savąją programėlę.",
@@ -270,9 +285,9 @@
   "filter_modal.added.context_mismatch_title": "Konteksto neatitikimas.",
   "filter_modal.added.expired_explanation": "Ši filtro kategorija nustojo galioti. Kad ji būtų taikoma, turėsi pakeisti galiojimo datą.",
   "filter_modal.added.expired_title": "Baigėsi filtro galiojimas.",
-  "filter_modal.added.review_and_configure": "Norint peržiūrėti ir toliau konfigūruoti šią filtro kategoriją, eik į nuorodą {settings_link}.",
+  "filter_modal.added.review_and_configure": "Norint peržiūrėti ir toliau konfigūruoti šią filtro kategoriją, eik į {settings_link}.",
   "filter_modal.added.review_and_configure_title": "Filtro nustatymai",
-  "filter_modal.added.settings_link": "nustatymų puslapis",
+  "filter_modal.added.settings_link": "nustatymų puslapį",
   "filter_modal.added.short_explanation": "Šis įrašas buvo pridėtas į šią filtro kategoriją: {title}.",
   "filter_modal.added.title": "Pridėtas filtras.",
   "filter_modal.select_filter.context_mismatch": "netaikoma šiame kontekste.",
@@ -283,6 +298,8 @@
   "filter_modal.select_filter.title": "Filtruoti šį įrašą",
   "filter_modal.title.status": "Filtruoti įrašą",
   "filtered_notifications_banner.mentions": "{count, plural, one {paminėjimas} few {paminėjimai} many {paminėjimo} other {paminėjimų}}",
+  "filtered_notifications_banner.pending_requests": "Pranešimai iš {count, plural, =0 {nė vieno} one {vienos žmogaus} few {# žmonių} many {# žmonių} other {# žmonių}}, kuriuos galbūt pažįsti",
+  "filtered_notifications_banner.title": "Filtruojami pranešimai",
   "firehose.all": "Visi",
   "firehose.local": "Šis serveris",
   "firehose.remote": "Kiti serveriai",
@@ -295,8 +312,8 @@
   "follow_suggestions.friends_of_friends_longer": "Populiarus tarp žmonių, kurių seki",
   "follow_suggestions.hints.featured": "Šį profilį atrinko {domain} komanda.",
   "follow_suggestions.hints.friends_of_friends": "Šis profilis yra populiarus tarp žmonių, kuriuos seki.",
-  "follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų {domain}.",
-  "follow_suggestions.hints.most_interactions": "Pastaruoju metu šis profilis sulaukia daug dėmesio šiame {domain}.",
+  "follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų domene {domain}.",
+  "follow_suggestions.hints.most_interactions": "Pastaruoju metu šis profilis sulaukia daug dėmesio domane {domain}.",
   "follow_suggestions.hints.similar_to_recently_followed": "Šis profilis panašus į profilius, kuriuos neseniai sekei.",
   "follow_suggestions.personalized_suggestion": "Suasmenintas pasiūlymas",
   "follow_suggestions.popular_suggestion": "Populiarus pasiūlymas",
@@ -312,8 +329,8 @@
   "footer.keyboard_shortcuts": "Spartieji klavišai",
   "footer.privacy_policy": "Privatumo politika",
   "footer.source_code": "Peržiūrėti šaltinio kodą",
-  "footer.status": "Būsena",
-  "generic.saved": "Išsaugoti",
+  "footer.status": "Statusas",
+  "generic.saved": "Išsaugota",
   "getting_started.heading": "Kaip pradėti",
   "hashtag.column_header.tag_mode.all": "ir {additional}",
   "hashtag.column_header.tag_mode.any": "ar {additional}",
@@ -333,7 +350,7 @@
   "home.column_settings.show_reblogs": "Rodyti pakėlimus",
   "home.column_settings.show_replies": "Rodyti atsakymus",
   "home.hide_announcements": "Slėpti skelbimus",
-  "home.pending_critical_update.body": "Kuo greičiau atnaujink savo Mastodon serverį!",
+  "home.pending_critical_update.body": "Kuo greičiau atnaujink savo Mastodon serverį.",
   "home.pending_critical_update.link": "Žiūrėti naujinimus",
   "home.pending_critical_update.title": "Galimas kritinis saugumo naujinimas.",
   "home.show_announcements": "Rodyti skelbimus",
@@ -480,7 +497,7 @@
   "notifications.column_settings.follow_request": "Nauji sekimo prašymai:",
   "notifications.column_settings.mention": "Paminėjimai:",
   "notifications.column_settings.poll": "Balsavimo rezultatai:",
-  "notifications.column_settings.push": "Stumdomieji pranešimai",
+  "notifications.column_settings.push": "Tiesioginiai pranešimai",
   "notifications.column_settings.reblog": "Pakėlimai:",
   "notifications.column_settings.show": "Rodyti stulpelyje",
   "notifications.column_settings.sound": "Paleisti garsą",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 55ceb564b..32ea6e47c 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -8,7 +8,7 @@
   "about.domain_blocks.silenced.title": "Ierobežotie",
   "about.domain_blocks.suspended.explanation": "Nekādi dati no šī servera netiks apstrādāti, uzglabāti vai apmainīti, padarot neiespējamu mijiedarbību vai saziņu ar lietotājiem no šī servera.",
   "about.domain_blocks.suspended.title": "Apturētie",
-  "about.not_available": "Šī informācija šajā serverī nav bijusi pieejama.",
+  "about.not_available": "Šī informācija nav padarīta pieejama šajā serverī.",
   "about.powered_by": "Decentralizētu sociālo tīklu nodrošina {mastodon}",
   "about.rules": "Servera noteikumi",
   "account.account_note_header": "Piezīme",
@@ -89,6 +89,9 @@
   "announcement.announcement": "Paziņojums",
   "attachments_list.unprocessed": "(neapstrādāti)",
   "audio.hide": "Slēpt audio",
+  "block_modal.remote_users_caveat": "Mēs vaicāsim serverim {domain} ņemt vērā Tavu lēmumu. Tomēr atbilstība nav nodrošināta, jo atsevišķi serveri var apstrādāt bloķēšanu citādi. Publiski ieraksti joprojām var būt redzami lietotājiem, kuri nav pieteikušies.",
+  "block_modal.show_less": "Parādīt vairāk",
+  "block_modal.show_more": "Parādīt mazāk",
   "boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu",
   "bundle_column_error.copy_stacktrace": "Kopēt kļūdu ziņojumu",
   "bundle_column_error.error.body": "Pieprasīto lapu nevarēja atveidot. Tas varētu būt saistīts ar kļūdu mūsu kodā, vai tā ir pārlūkprogrammas saderības problēma.",
@@ -190,7 +193,7 @@
   "directory.federated": "No pazīstamas federācijas",
   "directory.local": "Tikai no {domain}",
   "directory.new_arrivals": "Jaunpienācēji",
-  "directory.recently_active": "Nesen aktīvie",
+  "directory.recently_active": "Nesen aktīvi",
   "disabled_account_banner.account_settings": "Konta iestatījumi",
   "disabled_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots.",
   "dismissable_banner.community_timeline": "Šie ir jaunākie publiskie ieraksti no cilvēkiem, kuru konti ir mitināti {domain}.",
@@ -199,6 +202,9 @@
   "dismissable_banner.explore_statuses": "Šie ir ieraksti, kas šodien gūst arvien lielāku ievērību visā sociālajā tīklā. Augstāk tiek kārtoti jaunāki ieraksti, kuri tiek vairāk pastiprināti un ievietoti izlasēs.",
   "dismissable_banner.explore_tags": "Šie tēmturi šobrīd kļūst arvien populārāki cilvēku vidū šajā un citos decentralizētā tīkla serveros.",
   "dismissable_banner.public_timeline": "Šie ir jaunākie publiskie ieraksti no lietotājiem sociālajā tīmeklī, kuriem {domain} seko cilvēki.",
+  "domain_block_modal.they_cant_follow": "Neviens šajā serverī nevar Tev sekot.",
+  "domain_pill.server": "Serveris",
+  "domain_pill.username": "Lietotājvārds",
   "embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzamo kodu.",
   "embed.preview": "Tas izskatīsies šādi:",
   "emoji_button.activity": "Aktivitāte",
@@ -275,6 +281,7 @@
   "follow_suggestions.curated_suggestion": "Darbinieku izvēle",
   "follow_suggestions.dismiss": "Vairs nerādīt",
   "follow_suggestions.personalized_suggestion": "Pielāgots ieteikums",
+  "follow_suggestions.similar_to_recently_followed_longer": "Līdzīgi profieliem, kuriem nesen sāki sekot",
   "follow_suggestions.view_all": "Skatīt visu",
   "follow_suggestions.who_to_follow": "Kam sekot",
   "followed_tags": "Sekojamie tēmturi",
@@ -388,6 +395,10 @@
   "loading_indicator.label": "Ielādē…",
   "media_gallery.toggle_visible": "{number, plural, one {Slēpt attēlu} other {Slēpt attēlus}}",
   "moved_to_account_banner.text": "Tavs konts {disabledAccount} pašlaik ir atspējots, jo Tu pārcēlies uz kontu {movedToAccount}.",
+  "mute_modal.hide_from_notifications": "Paslēpt paziņojumos",
+  "mute_modal.hide_options": "Paslēpt iespējas",
+  "mute_modal.show_options": "Parādīt iespējas",
+  "mute_modal.title": "Apklusināt lietotāju?",
   "navigation_bar.about": "Par",
   "navigation_bar.advanced_interface": "Atvērt paplašinātā tīmekļa saskarnē",
   "navigation_bar.blocks": "Bloķētie lietotāji",
@@ -420,11 +431,23 @@
   "notification.follow": "{name} uzsāka Tev sekot",
   "notification.follow_request": "{name} nosūtīja Tev sekošanas pieprasījumu",
   "notification.mention": "{name} pieminēja Tevi",
+  "notification.moderation-warning.learn_more": "Uzzināt vairāk",
+  "notification.moderation_warning.action_delete_statuses": "Daži no Taviem ierakstiem tika noņemti.",
+  "notification.moderation_warning.action_disable": "Tavs konts tika atspējots.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Daži no Taviem ierakstiem tika atzīmēti kā jutīgi.",
+  "notification.moderation_warning.action_sensitive": "Tavi ieraksti turpmāk tiks atzīmēti kā jutīgi.",
+  "notification.moderation_warning.action_silence": "Tavs konts tika ierobežots.",
+  "notification.moderation_warning.action_suspend": "Tava konta darbība tika apturēta.",
   "notification.own_poll": "Tava aptauja ir noslēgusies",
   "notification.poll": "Aptauja, kurā tu piedalījies, ir noslēgusies",
   "notification.reblog": "{name} pastiprināja Tavu ierakstu",
+  "notification.relationships_severance_event": "Zaudēti savienojumi ar {name}",
+  "notification.relationships_severance_event.learn_more": "Uzzināt vairāk",
   "notification.status": "{name} tikko publicēja",
   "notification.update": "{name} rediģēja ierakstu",
+  "notification_requests.accept": "Pieņemt",
+  "notification_requests.dismiss": "Noraidīt",
+  "notification_requests.notifications_from": "Paziņojumi no {name}",
   "notifications.clear": "Notīrīt paziņojumus",
   "notifications.clear_confirmation": "Vai tiešām vēlies neatgriezeniski notīrīt visus savus paziņojumus?",
   "notifications.column_settings.admin.report": "Jauni ziņojumi:",
@@ -456,6 +479,9 @@
   "notifications.permission_denied": "Darbvirsmas paziņojumi nav pieejami, jo iepriekš tika noraidīts pārlūka atļauju pieprasījums",
   "notifications.permission_denied_alert": "Darbvirsmas paziņojumus nevar iespējot, jo pārlūkprogrammai atļauja tika iepriekš atteikta",
   "notifications.permission_required": "Darbvirsmas paziņojumi nav pieejami, jo nav piešķirta nepieciešamā atļauja.",
+  "notifications.policy.filter_new_accounts_title": "Jauni konti",
+  "notifications.policy.filter_not_followers_title": "Cilvēki, kuri Tev neseko",
+  "notifications.policy.filter_not_following_title": "Cilvēki, kuriem Tu neseko",
   "notifications_permission_banner.enable": "Iespējot darbvirsmas paziņojumus",
   "notifications_permission_banner.how_to_control": "Lai saņemtu paziņojumus, kad Mastodon nav atvērts, iespējo darbvirsmas paziņojumus. Vari precīzi kontrolēt, kāda veida mijiedarbības rada darbvirsmas paziņojumus, izmantojot augstāk redzamo pogu {icon}, kad tie būs iespējoti.",
   "notifications_permission_banner.title": "Nekad nepalaid neko garām",
@@ -485,7 +511,7 @@
   "onboarding.start.title": "Tev tas izdevās!",
   "onboarding.steps.follow_people.body": "Tu pats veido savu plūsmu. Piepildīsim to ar interesantiem cilvēkiem.",
   "onboarding.steps.follow_people.title": "Pielāgo savu mājas barotni",
-  "onboarding.steps.publish_status.body": "Sveicini pasauli ar tekstu, fotoattēliem, video, vai aptaujām {emoji}",
+  "onboarding.steps.publish_status.body": "Pasveicini pasauli ar tekstu, attēliem, video vai aptaujām {emoji}",
   "onboarding.steps.publish_status.title": "Izveido savu pirmo ziņu",
   "onboarding.steps.setup_profile.body": "Palielini mijiedarbību ar aptverošu profilu!",
   "onboarding.steps.setup_profile.title": "Pielāgo savu profilu",
@@ -603,7 +629,7 @@
   "search_results.statuses": "Ieraksti",
   "search_results.title": "Meklēt {q}",
   "server_banner.about_active_users": "Cilvēki, kas izmantojuši šo serveri pēdējo 30 dienu laikā (aktīvie lietotāji mēnesī)",
-  "server_banner.active_users": "aktīvie lietotāji",
+  "server_banner.active_users": "aktīvi lietotāji",
   "server_banner.administered_by": "Administrē:",
   "server_banner.introduction": "{domain} ir daļa no decentralizētā sociālā tīkla, ko nodrošina {mastodon}.",
   "server_banner.learn_more": "Uzzināt vairāk",
@@ -625,6 +651,7 @@
   "status.direct": "Pieminēt @{name} privāti",
   "status.direct_indicator": "Pieminēts privāti",
   "status.edit": "Labot",
+  "status.edited": "Pēdējoreiz labots {date}",
   "status.edited_x_times": "Labots {count, plural, one {{count} reizi} other {{count} reizes}}",
   "status.embed": "Iegult",
   "status.favourite": "Izlasē",
diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml
index b36566821..d83c70864 100644
--- a/config/locales/devise.ia.yml
+++ b/config/locales/devise.ia.yml
@@ -21,28 +21,47 @@ ia:
       confirmation_instructions:
         action: Verificar adresse de e-mail
         action_with_app: Confirmar e retornar a %{app}
+        explanation: Tu ha create un conto sur %{host} con iste adresse de e-mail. Tu es a un sol clic de activar lo. Si isto non esseva tu, per favor ignora iste e-mail.
+        explanation_when_pending: Tu ha sollicitate un invitation a %{host} con iste adresse de e-mail. Post que tu confirma tu adresse de e-mail, nos va revider tu demanda. Tu pote aperir session pro cambiar tu detalios o eliminar tu conto, ma tu non pote acceder al majoritate del functiones usque tu conto es approbate. Si tu demanda es rejectate, tu datos essera removite e nulle action ulterior essera requirite de te. Si isto non esseva tu, per favor ignora iste message de e-mail.
+        extra_html: Per favor consulta tamben <a href="%{terms_path}">le regulas del servitor</a> e <a href="%{policy_path}">nostre conditiones de servicio</a>.
         subject: 'Mastodon: Instructiones de confirmation pro %{instance}'
         title: Verificar adresse de e-mail
       email_changed:
         explanation: 'Le adresse de e-mail pro tu conto essera cambiate a:'
+        extra: Si tu non ha cambiate de adresse de e-mail, es probabile que alcuno ha ganiate le accesso a tu conto. Per favor cambia immediatemente tu contrasigno o contacta le administrator del servitor si tu non pote acceder a tu conto.
         subject: 'Mastodon: E-mail cambiate'
         title: Nove adresse de e-mail
       password_change:
         explanation: Le contrasigno de tu conto ha essite cambiate.
+        extra: Si tu non ha cambiate tu contrasigno, es probabile que alcuno ha ganiate le accesso a tu conto. Per favor cambia immediatemente tu contrasigno o contacta le administrator del servitor si tu non pote acceder a tu conto.
         subject: 'Mastodon: Contrasigno cambiate'
         title: Contrasigno cambiate
       reconfirmation_instructions:
         explanation: Confirma le nove adresse pro cambiar tu email.
+        extra: Si non es tu qui ha initiate iste cambiamento, per favor ignora iste e-mail. Le adresse de e-mail pro le conto de Mastodon non cambiara usque tu accede al ligamine hic supra.
         subject: 'Mastodon: Confirmar e-mail pro %{instance}'
         title: Verificar adresse de e-mail
       reset_password_instructions:
         action: Cambiar contrasigno
+        explanation: Tu ha requestate un nove contrasigno pro tu conto.
+        extra: Si tu non ha requestate isto, per favor ignora iste e-mail. Tu contrasigno non cambiara usque tu accede al ligamine hic supra e crea un nove.
         subject: 'Mastodon: Instructiones pro reinitialisar le contrasigno'
         title: Reinitialisar contrasigno
       two_factor_disabled:
+        explanation: Ora es possibile aperir session con solmente le adresse de e-mail e contrasigno.
+        subject: 'Mastodon: Authentication bifactorial disactivate'
+        subtitle: Le authentication bifactorial ha essite disactivate pro tu conto.
         title: 2FA disactivate
       two_factor_enabled:
+        explanation: Pro le apertura de session essera necessari un token generate per le application TOTP accopulate.
+        subject: 'Mastodon: Authentication bifactorial activate'
+        subtitle: Le authentication bifactorial ha essite activate pro tu conto.
         title: 2FA activate
+      two_factor_recovery_codes_changed:
+        explanation: Le ancian codices de recuperation ha essite invalidate e nove codices ha essite generate.
+        subject: 'Mastodon: Codices de recuperation regenerate'
+        subtitle: Le ancian codices de recuperation ha essite invalidate e nove codices ha essite generate.
+        title: Codices de recuperation cambiate
       unlock_instructions:
         subject: 'Mastodon: Instructiones pro disblocar'
       webauthn_credential:
@@ -53,9 +72,15 @@ ia:
         deleted:
           explanation: Le sequente clave de securitate esseva delite de tu conto
           subject: 'Mastodon: Clave de securitate delite'
+          title: Un de tu claves de securitate ha essite delite
       webauthn_disabled:
+        explanation: Le authentication con claves de securitate ha essite disactivate pro tu conto.
+        extra: Ora es possibile aperir session usante solmente le token generate per le application TOTP accopulate.
+        subject: 'Mastodon: Le authentication con claves de securitate es disactivate'
         title: Claves de securitate disactivate
       webauthn_enabled:
+        explanation: Le authentication con claves de securitate ha essite activate pro tu conto.
+        extra: Tu clave de securitate pote ora esser usate pro aperir session.
         title: Claves de securitate activate
     registrations:
       destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto.
diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml
index 86bd1ad98..b5bd6cc53 100644
--- a/config/locales/doorkeeper.ia.yml
+++ b/config/locales/doorkeeper.ia.yml
@@ -34,10 +34,12 @@ ia:
         title: Nove application
       show:
         actions: Actiones
+        scopes: Ambitos
         title: 'Application: %{name}'
     authorizations:
       buttons:
         authorize: Autorisar
+        deny: Negar
       error:
         title: Ocurreva un error
     authorized_applications:
@@ -66,7 +68,9 @@ ia:
         conversations: Conversationes
         favourites: Favoritos
         filters: Filtros
+        follows: Sequites
         lists: Listas
+        media: Annexos multimedial
         mutes: Silentiates
         notifications: Notificationes
         push: Notificationes push
diff --git a/config/locales/doorkeeper.ie.yml b/config/locales/doorkeeper.ie.yml
index 0119f3573..fc8132c92 100644
--- a/config/locales/doorkeeper.ie.yml
+++ b/config/locales/doorkeeper.ie.yml
@@ -174,6 +174,7 @@ ie:
       read:filters: vider tui filtres
       read:follows: vider tui sequitores
       read:lists: vider tui listes
+      read:me: leer solmen li basic information de tui conto
       read:mutes: vider tui silentias
       read:notifications: vider tui notificationes
       read:reports: vider tui raportes
diff --git a/config/locales/doorkeeper.lt.yml b/config/locales/doorkeeper.lt.yml
index 5be291bf8..82695d8ba 100644
--- a/config/locales/doorkeeper.lt.yml
+++ b/config/locales/doorkeeper.lt.yml
@@ -31,8 +31,8 @@ lt:
       form:
         error: Ups! Patikrink, ar formoje nėra galimų klaidų.
       help:
-        native_redirect_uri: Naudoti %{native_redirect_uri} vietiniams bandymams
-        redirect_uri: Naudoti po vieną eilutę kiekvienam URI
+        native_redirect_uri: Naudok %{native_redirect_uri} vietiniams bandymams.
+        redirect_uri: Naudok po vieną eilutę kiekvienam URI.
         scopes: Atskirk aprėptis tarpais. Palik tuščią, jei nori naudoti numatytąsias aprėtis.
       index:
         application: Programėlė
@@ -90,7 +90,7 @@ lt:
           request_not_authorized: Užklausą reikia įgalioti. Reikalingo parametro užklausai įgalioti trūksta arba jis netinkamas.
           unknown: Užklausoje trūksta privalomo parametro, turi nepalaikomą parametro reikšmę arba yra kitaip netinkamai suformuota.
         invalid_resource_owner: Pateikti išteklių savininko įgaliojimai yra netinkami arba išteklių savininko negalima surasti.
-        invalid_scope: Užklausos aprėptis yra netinkama, nežinoma arba netinkamai suformuota.
+        invalid_scope: Užklausos aprėptis yra netinkama, nežinoma arba netaisyklingas.
         invalid_token:
           expired: Baigėsi prieigos rakto galiojimas.
           revoked: Prieigos raktas buvo panaikintas.
@@ -133,9 +133,9 @@ lt:
         follows: Sekimai
         lists: Sąrašai
         media: Medijos priedai
-        mutes: Užtildymai
+        mutes: Nutildymai
         notifications: Pranešimai
-        push: Stumdomieji pranešimai
+        push: Tiesioginiai pranešimai
         reports: Ataskaitos
         search: Paieška
         statuses: Įrašai
@@ -147,30 +147,30 @@ lt:
       application:
         title: Reikalingas OAuth leidimas
     scopes:
-      admin:read: skaityti visus serveryje esančius duomenis
-      admin:read:accounts: skaityti neskelbtiną visų paskyrų informaciją
-      admin:read:canonical_email_blocks: skaityti neskelbtiną visų kanoninių el. laiško blokavimų informaciją
-      admin:read:domain_allows: skaityti neskelbtiną visų domeno leidimus informaciją
-      admin:read:domain_blocks: skaityti neskelbtiną visų domeno blokavimų informaciją
-      admin:read:email_domain_blocks: skaityti neskelbtiną visų el. laiško domeno blokavimų informaciją
-      admin:read:ip_blocks: skaityti neskelbtiną visų IP blokavimų informaciją
-      admin:read:reports: skaityti neskelbtiną visų ataskaitų ir praneštų paskyrų informaciją
-      admin:write: modifikuoti visus serveryje esančius duomenis
+      admin:read: skaityti visus duomenis serveryje
+      admin:read:accounts: skaityti slaptą visų paskyrų informaciją
+      admin:read:canonical_email_blocks: skaityti slaptą visų kanoninių el. laiško blokavimų informaciją
+      admin:read:domain_allows: skaityti slaptą visų domeno leidimus informaciją
+      admin:read:domain_blocks: skaityti slaptą visų domeno blokavimų informaciją
+      admin:read:email_domain_blocks: skaityti slaptą visų el. laiško domeno blokavimų informaciją
+      admin:read:ip_blocks: skaityti slaptą visų IP blokavimų informaciją
+      admin:read:reports: skaityti slaptą visų ataskaitų ir praneštų paskyrų informaciją
+      admin:write: modifikuoti visus duomenis serveryje
       admin:write:accounts: atlikti paskyrų prižiūrėjimo veiksmus
       admin:write:canonical_email_blocks: atlikti kanoninių el. laiško blokavimų prižiūrėjimo veiksmus
-      admin:write:domain_allows: atlikti prižiūrėjimo veiksmus su domeno leidimais
-      admin:write:domain_blocks: atlikti prižiūrėjimo veiksmus su domenų blokavimais
-      admin:write:email_domain_blocks: atlikti prižiūrėjimo veiksmus su el. laiško domenų blokavimais
-      admin:write:ip_blocks: atlikti prižiūrėjimo veiksmus su IP blokavimais
-      admin:write:reports: atlikti paskyrų prižiūrėjimo veiksmus atsakaitams
+      admin:write:domain_allows: atlikti domeno leidimų prižiūrėjimo veiksmus
+      admin:write:domain_blocks: atlikti domeno blokavimų prižiūrėjimo veiksmus
+      admin:write:email_domain_blocks: atlikti el. laiško domenų blokavimų prižiūrėjimo veiksmus
+      admin:write:ip_blocks: atlikti IP blokavimų prižiūrėjimo veiksmus
+      admin:write:reports: atlikti ataskaitų prižiūrėjimo veiksmus
       crypto: naudoti visapusį šifravimą
       follow: modifikuoti paskyros sąryšius
-      push: gauti tavo stumiamuosius pranešimus
-      read: skaityti tavo visus paskyros duomenis
+      push: gauti tiesioginius pranešimus
+      read: skaityti visus paskyros duomenis
       read:accounts: matyti paskyrų informaciją
       read:blocks: matyti tavo blokavimus
       read:bookmarks: matyti tavo žymes
-      read:favourites: matyti tavo mėgstamiausius
+      read:favourites: matyti tavo mėgstamus
       read:filters: matyti tavo filtrus
       read:follows: matyti tavo sekimus
       read:lists: matyti tavo sąrašus
@@ -183,14 +183,14 @@ lt:
       write: modifikuoti visus tavo paskyros duomenis
       write:accounts: modifikuoti tavo profilį
       write:blocks: blokuoti paskyras ir domenus
-      write:bookmarks: įrašyti įrašus
+      write:bookmarks: pridėti į žymes įrašus
       write:conversations: nutildyti ir ištrinti pokalbius
-      write:favourites: mėgti įrašai
+      write:favourites: pamėgti įrašus
       write:filters: sukurti filtrus
       write:follows: sekti žmones
       write:lists: sukurti sąrašus
       write:media: įkelti medijos failus
       write:mutes: nutildyti žmones ir pokalbius
       write:notifications: išvalyti tavo pranešimus
-      write:reports: pranešti kitus asmenus
+      write:reports: pranešti apie kitus žmones
       write:statuses: skelbti įrašus
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index bdf6e5a75..57af7c82c 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -5,7 +5,7 @@ gl:
     contact_missing: Non establecido
     contact_unavailable: Non dispoñíbel
     hosted_on: Mastodon aloxado en %{domain}
-    title: Acerca de
+    title: Sobre
   accounts:
     follow: Seguir
     followers:
@@ -503,7 +503,7 @@ gl:
         instance_follows_measure: as súas seguidoras aquí
         instance_languages_dimension: Top de idiomas
         instance_media_attachments_measure: anexos multimedia gardados
-        instance_reports_measure: denuncias acerca deles
+        instance_reports_measure: denuncias sobre eles
         instance_statuses_measure: publicacións gardadas
       delivery:
         all: Todo
@@ -615,7 +615,7 @@ gl:
       created_at: Denunciado
       delete_and_resolve: Eliminar publicacións
       forwarded: Reenviado
-      forwarded_replies_explanation: Esta denuncia procede dunha usuaria remota e acerca de contido remoto. Enviouseche unha copia porque o contido denunciado é unha resposta a unha das túas usuarias.
+      forwarded_replies_explanation: Esta denuncia procede dunha usuaria remota e sobre contido remoto. Enviouseche unha copia porque o contido denunciado é unha resposta a unha das túas usuarias.
       forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resolto
       mark_as_sensitive: Marcar como sensible
@@ -740,7 +740,7 @@ gl:
         manage_rules: Xestionar regras do servidor
         preamble: Proporciona información detallada acerca do xeito en que se xestiona, modera e financia o servidor.
         rules_hint: Hai un espazo dedicado para as normas que é de agardar as usuarias acaten.
-        title: Acerca de
+        title: Sobre
       appearance:
         preamble: Personalizar a interface web de Mastodon.
         title: Aparencia
@@ -1870,7 +1870,7 @@ gl:
       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
-      feature_control: Sabes mellor ca ninguén o que queres ver na cronoloxía. Non hai algoritmos nin publicidade facéndoche perder o tempo. Segue cunha soa conta a outras persoas en servidores Mastodon diferentes ao teu, recibirás as publicacións en orde cronolóxica, e farás deste curruchiño de internet un lugar para ti.
+      feature_control: Sabes mellor ca ninguén o que queres ver na cronoloxía. Non hai algoritmos nin publicidade facéndoche perder o tempo. Sigue cunha soa conta a outras persoas en servidores Mastodon diferentes ao teu, recibirás as publicacións en orde cronolóxica, e farás deste curruchiño de internet un lugar para ti.
       feature_control_title: Tes o control da túa cronoloxía
       feature_creativity: Mastodon ten soporte para audio, vídeo e imaxes nas publicacións, descricións para mellorar a accesibilidade, enquisas, avisos sobre o contido, avatares animados, emojis personalizados, control sobre o recorte de miniaturas, e moito máis, para axudarche a expresarte en internet. Tanto se publicas o teu arte, música ou podcast, Mastodon está aquí para ti.
       feature_creativity_title: Creatividade incomparable
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 193f2b0d5..712328deb 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -886,6 +886,7 @@ ia:
           one: Compartite per un persona le septimana passate
           other: Compartite per %{count} personas le septimana passate
         title: Ligamines de tendentia
+        usage_comparison: Compartite %{today} vices hodie, comparate al %{yesterday} de heri
       not_allowed_to_trend: Non permittite haber tendentia
       only_allowed: Solo permittite
       pending_review: Attende revision
@@ -915,6 +916,7 @@ ia:
           tag_servers_dimension: Servitores principal
           tag_servers_measure: servitores differente
           tag_uses_measure: usos total
+        description_html: Istos es hashtags que actualmente appare in tante messages que tu servitor vide. Illo pote adjutar tu usatores a discoperir re que le personas parla plus al momento. Nulle hashtags es monstrate publicamente usque tu los approba.
         listable: Pote esser suggerite
         no_tag_selected: Nulle placas era cambiate perque nulle era seligite
         not_listable: Non sera suggerite
@@ -940,21 +942,47 @@ ia:
     webhooks:
       add_new: Adder terminal
       delete: Deler
+      description_html: Un <strong>croc web</strong> habilita Mastodon a transmitter <strong>notificationes in tempore real</strong> re eventos seligite pro tu pro activar application, assi tu application pote <strong>automaticamente discatenar reactiones</strong>.
       disable: Disactivar
       disabled: Disactivate
       edit: Rediger terminal
+      empty: Tu ancora non ha configurate alcun punctos final de web croc.
       enable: Activar
       enabled: Active
       enabled_events:
         one: 1 evento activate
         other: "%{count} eventos activate"
       events: Eventos
+      new: Nove croc web
+      rotate_secret: Rotar secrete
+      secret: Firmante secrete
       status: Stato
+      title: Crocs web
+      webhook: Crocs web
   admin_mailer:
+    auto_close_registrations:
+      subject: Le registrationes pro %{instance} ha essite automaticamente mutate a besoniante de approbation
+    new_appeal:
+      actions:
+        delete_statuses: pro deler lor messages
+        disable: pro gelar lor conto
+        mark_statuses_as_sensitive: pro marcar lor messages como sensibile
+        none: pro advertir
+        sensitive: a marcar lor conto como sensibile
+        silence: pro limitar lor conto
+        suspend: pro suspender lor conto
+      body: "%{target} appella un decision de moderation per %{action_taken_by} ab le %{date}, que era %{type}. Ille scribeva:"
     new_critical_software_updates:
       subject: Actualisationes critic de Mastodon es disponibile pro %{instance}!
     new_software_updates:
       subject: Nove versiones de Mastodon es disponibile pro %{instance}!
+    new_trends:
+      new_trending_links:
+        title: Ligamines de tendentia
+      new_trending_statuses:
+        title: Messages de tendentia
+      new_trending_tags:
+        title: Hashtags de tendentia
   aliases:
     add_new: Crear alias
   appearance:
@@ -962,6 +990,7 @@ ia:
     confirmation_dialogs: Dialogos de confirmation
     discovery: Discoperta
     localization:
+      body: Mastodon es traducite per voluntarios.
       guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Totes pote contribuer.
     sensitive_content: Contento sensibile
@@ -1026,8 +1055,16 @@ ia:
       account_status: Stato del conto
       view_strikes: Examinar le admonitiones passate contra tu conto
   challenge:
+    confirm: Continuar
     invalid_password: Contrasigno non valide
     prompt: Confirma le contrasigno pro continuar
+  datetime:
+    distance_in_words:
+      half_a_minute: Justo ora
+      less_than_x_seconds: Justo ora
+      over_x_years: "%{count}a"
+      x_days: "%{count}d"
+      x_minutes: "%{count} m"
   deletes:
     confirm_password: Insere tu contrasigno actual pro verificar tu identitate
     proceed: Deler le conto
@@ -1206,6 +1243,10 @@ ia:
     activity: Activitate del conto
     most_recent: Plus recente
     status: Stato del conto
+  rss:
+    content_warning: 'Advertimento de contento:'
+    descriptions:
+      account: Messages public de @%{acct}
   sessions:
     activity: Ultime activitate
     browser: Navigator
@@ -1253,6 +1294,7 @@ ia:
     delete: Deletion de conto
     development: Disveloppamento
     edit_profile: Modificar profilo
+    featured_tags: Hashtags eminente
     import: Importar
     migrate: Migration de conto
     notifications: Notificationes de e-mail
@@ -1261,7 +1303,9 @@ ia:
     relationships: Sequites e sequitores
     strikes: Admonitiones de moderation
   severed_relationships:
+    download: Discargar (%{count})
     event_type:
+      account_suspension: Suspension del conto (%{target_name})
       domain_block: Suspension del servitor (%{target_name})
       user_domain_block: Tu ha blocate %{target_name}
     preamble: Tu pote perder sequites e sequitores quando tu bloca un dominio o quando tu moderatores decide suspender un servitor remote. Quando isto occurre, tu potera discargar listas de relationes rumpite, a inspectar e eventualmente importar in un altere servitor.
diff --git a/config/locales/ie.yml b/config/locales/ie.yml
index 46e55b9e1..2b819c53d 100644
--- a/config/locales/ie.yml
+++ b/config/locales/ie.yml
@@ -1667,8 +1667,10 @@ ie:
     download: Descargar (%{count})
     event_type:
       account_suspension: Suspension del conto (%{target_name})
+      domain_block: Suspension del servitor (%{target_name})
       user_domain_block: Tu bloccat %{target_name}
     lost_followers: Perdit sequitores
+    lost_follows: Perdit sequetes
     preamble: Tu posse perdir tis queles tu seque e tui sequitores quande tu blocca un domonia o quande tui moderatores decide suspender un lontan servitor. Tande, tu va posser descargar listes de dejuntet relationes, a inspecter e possibilmen importar sur un altri servitor.
     type: Eveniment
   statuses:
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 0e90cc723..f3f3e3a8f 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -739,6 +739,7 @@ ko:
         desc_html: 이것은 hCaptcha의 외부 스크립트에 의존합니다, 이것은 개인정보 보호에 위협을 가할 수도 있습니다. 추가적으로, <strong>이것은 몇몇 사람들(특히나 장애인들)에게 가입 절차의 접근성을 심각하게 떨어트릴 수 있습니다</strong>. 이러한 이유로, 대체제로 승인 전용이나 초대제를 통한 가입을 고려해보세요.
         title: 새로운 사용자가 계정 확인을 위해서는 CAPTCHA를 풀어야 하도록 합니다
       content_retention:
+        danger_zone: 위험한 영역
         preamble: 마스토돈에 저장된 사용자 콘텐츠를 어떻게 다룰지 제어합니다.
         title: 콘텐츠 보존기한
       default_noindex:
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 35111ad39..b815cada5 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -535,12 +535,16 @@ lt:
       elasticsearch_preset_single_node:
         message_html: Tavo Elasticsearch klasteris turi tik vieną mazgą, <code>ES_PRESET</code> turėtų būti nustatyta į <code>single_node_cluster</code>.
     title: Administracija
+    trends:
+      preview_card_providers:
+        title: Leidėjai
     warning_presets:
       add_new: Pridėti naują
       delete: Ištrinti
       edit_preset: Keisti įspėjimo nustatymus
       title: Valdyti įspėjimo nustatymus
     webhooks:
+      description_html: "<strong>Webhook</strong> leidžia Mastodon siųsti <strong>realaus laiko pranešimus</strong> apie pasirinktus įvykius į tavo programą, kad programa galėtų <strong>automatiškai paleisti reakcijas</strong>."
       events: Įvykiai
   admin_mailer:
     auto_close_registrations:
@@ -665,6 +669,7 @@ lt:
       invalid_context: Jokio arba netinkamas pateiktas kontekstas
     index:
       delete: Ištrinti
+      empty: Neturi jokių filtrų.
       title: Filtrai
     new:
       title: Pridėti naują filtrą
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index ee8395400..f4f0aa9db 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -761,6 +761,7 @@ lv:
         desc_html: Tas balstās uz ārējiem skriptiem no hCaptcha, kas var radīt bažas par drošību un privātumu. Turklāt <strong>tas var padarīt reģistrācijas procesu ievērojami mazāk pieejamu dažiem cilvēkiem (īpaši invalīdiem)</strong>. Šo iemeslu dēļ, lūdzu, apsver alternatīvus pasākumus, piemēram, reģistrāciju, kas balstīta uz apstiprinājumu vai uzaicinājumu.
         title: Pieprasīt jaunajiem lietotājiem atrisināt CAPTCHA, lai apstiprinātu savu kontu
       content_retention:
+        danger_zone: Bīstama sadaļa
         preamble: Kontrolē, kā Mastodon tiek glabāts lietotāju ģenerēts saturs.
         title: Satura saglabāšana
       default_noindex:
@@ -1631,6 +1632,7 @@ lv:
       unknown_browser: Nezināms Pārlūks
       weibo: Weibo
     current_session: Pašreizējā sesija
+    date: Datums
     description: "%{browser} uz %{platform}"
     explanation: Šie ir tīmekļa pārlūki, kuros šobrīd esi pieteicies savā Mastodon kontā.
     ip: IP
@@ -1667,6 +1669,7 @@ lv:
     import: Imports
     import_and_export: Imports un eksports
     migrate: Konta migrācija
+    notifications: E-pasta paziņojumi
     preferences: Iestatījumi
     profile: Profils
     relationships: Sekojamie un sekotāji
@@ -1674,6 +1677,9 @@ lv:
     strikes: Moderācijas aizrādījumi
     two_factor_authentication: Divpakāpju autentifikācija
     webauthn_authentication: Drošības atslēgas
+  severed_relationships:
+    download: Lejupielādēt (%{count})
+    type: Notikums
   statuses:
     attached:
       audio:
@@ -1800,6 +1806,7 @@ lv:
     webauthn: Drošības atslēgas
   user_mailer:
     appeal_approved:
+      action: Konta iestatījumi
       explanation: Apelācija par brīdinājumu jūsu kontam %{strike_date}, ko iesniedzāt %{appeal_date}, ir apstiprināta. Jūsu konts atkal ir labā stāvoklī.
       subject: Jūsu %{date} apelācija ir apstiprināta
       title: Apelācija apstiprināta
@@ -1849,15 +1856,28 @@ lv:
         silence: Konts ierobežots
         suspend: Konts apturēts
     welcome:
+      apps_android_action: Iegūt to Google Play
+      apps_title: Mastodon lietotnes
       edit_profile_action: Pielāgot
       edit_profile_title: Pielāgo savu profilu
       explanation: Šeit ir daži padomi, kā sākt darbu
+      feature_action: Uzzināt vairāk
       feature_creativity: Mastodon nodrošina skaņas, video un attēlu ierakstus, pieejamības aprakstus, aptaujas, satura brīdinājumus, animētus profila attēlus, pielāgotas emocijzīmes, sīktēlu apgriešanas vadīklas un vēl, lai palīdzētu Tev sevi izpaust tiešsaistē. Vai Tu izplati savu mākslu, mūziku vai aplādes, Mastodon ir šeit ar Tevi.
+      follow_action: Sekot
       follow_title: Pielāgo savu mājas barotni
+      follows_title: Kam sekot
+      follows_view_more: Rādīt vairāk cilvēku, kuriem sekot
       hashtags_recent_count:
         one: "%{people} cilvēks pēdējās 2 dienās"
         other: "%{people} cilvēki pēdējās 2 dienās"
         zero: "%{people} cilvēku pēdējās divās dienās"
+      post_action: Rakstīt
+      post_step: Pasveicini pasauli ar tekstu, fotoattēliem, video vai aptaujām!
+      post_title: Izveido savu pirmo ierakstu
+      share_action: Kopīgot
+      share_step: Dari saviem draugiem zināmu, kā Tevi atrast Mastodon!
+      share_title: Kopīgo savu Mastodon profilu
+      sign_in_action: Pieteikties
       subject: Laipni lūgts Mastodon
       title: Laipni lūgts uz borta, %{name}!
   users:
@@ -1865,6 +1885,7 @@ lv:
     go_to_sso_account_settings: Dodies uz sava identitātes nodrošinātāja konta iestatījumiem
     invalid_otp_token: Nederīgs divfaktora kods
     otp_lost_help_html: Ja esi zaudējis piekļuvi abiem, tu vari sazināties ar %{email}
+    rate_limited: Pārāk daudz autentifikācijas mēģinājumu, vēlāk jāmēģina vēlreiz.
     seamless_external_login: Tu esi pieteicies, izmantojot ārēju pakalpojumu, tāpēc paroles un e-pasta iestatījumi nav pieejami.
     signed_in_as: 'Pieteicies kā:'
   verification:
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 9cb9cadee..60730d53e 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -751,6 +751,7 @@ pt-BR:
         desc_html: Isso é baseado em scripts externos de hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, <strong>isso pode tornar o processo de registro significativamente menos acessível para algumas pessoas (especialmente deficientes)</strong>. Por estas razões, favor considerar medidas alternativas como o registro baseado em aprovação ou em convite.
         title: Exigir que novos usuários resolvam um CAPTCHA para confirmar sua conta
       content_retention:
+        danger_zone: Zona de perigo
         preamble: Controlar como o conteúdo gerado pelo usuário é armazenado no Mastodon.
         title: Retenção de conteúdo
       default_noindex:
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 1099e3d0d..cd54d5105 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -566,6 +566,7 @@ ro:
       blocking: Lista de blocare
       domain_blocking: Listă de blocare domenii
       following: Lista de urmărire
+      lists: Liste
       muting: Lista de ignorare
     upload: Încarcă
   invites:
@@ -622,6 +623,14 @@ ro:
       body: 'Postarea ta a fost impulsionată de %{name}:'
       subject: "%{name} ți-a impulsionat postarea"
       title: Impuls nou
+  number:
+    human:
+      decimal_units:
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
   polls:
     errors:
       expired: Sondajul s-a încheiat deja
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index a1406b1ad..370667d48 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -77,10 +77,15 @@ ar:
           warn: إخفاء المحتوى الذي تم تصفيته خلف تحذير يذكر عنوان الفلتر
       form_admin_settings:
         activity_api_enabled: عدد المنشورات المحلية و المستخدمين الناشطين و التسجيلات الأسبوعية الجديدة
+        app_icon: WEBP أو PNG أو GIF أو JPG. يتجاوز أيقونة التطبيق الافتراضية على الجوالات مع أيقونة مخصصة.
+        backups_retention_period: للمستخدمين القدرة على إنشاء أرشيفات لمنشوراتهم لتحميلها في وقت لاحق. عند التعيين إلى قيمة موجبة، سيتم حذف هذه الأرشيف تلقائياً من وحدة تخزينك بعد عدد الأيام المحدد.
         bootstrap_timeline_accounts: سيتم تثبيت هذه الحسابات على قمة التوصيات للمستخدمين الجدد.
         closed_registrations_message: ما سيعرض عند إغلاق التسجيلات
+        content_cache_retention_period: سيتم حذف جميع المنشورات من الخوادم الأخرى (بما في ذلك التعزيزات والردود) بعد عدد الأيام المحدد، دون أي تفاعل محلي للمستخدم مع هذه المنشورات. وهذا يشمل المنشورات التي قام المستخدم المحلي بوضع علامة عليها كإشارات مرجعية أو المفضلة. وسوف تختفي أيضا الإشارات الخاصة بين المستخدمين من المثيلات المختلفة ويستحيل استعادتها. والغرض من استخدام هذا الإعداد هو مثيلات الغرض الخاص ويفسد الكثير من توقعات المستخدمين عند تنفيذها للاستخدام لأغراض عامة.
         custom_css: يمكنك تطبيق أساليب مخصصة على نسخة الويب من ماستدون.
+        favicon: WEBP أو PNG أو GIF أو JPG. يتجاوز أيقونة التطبيق المفضلة الافتراضية مع أيقونة مخصصة.
         mascot: تجاوز الرسوم التوضيحية في واجهة الويب المتقدمة.
+        media_cache_retention_period: ملفات الوسائط من المنشورات التي يقوم بها المستخدمون البعيدون يتم تخزينها في خادمك. عند التعيين إلى قيمة موجبة، سيتم حذف الوسائط بعد عدد الأيام المحدد. إذا كانت بيانات الوسائط مطلوبة بعد حذفها، فسيتم إعادة تحميلها إذا كان محتوى المصدر لا يزال متاحًا. بسبب القيود المفروضة على عدد المرات التي يتم فيها ربط بطاقات المعاينة لمواقع الطرف الثالث، يوصى بتعيين هذه القيمة إلى 14 يوماً على الأقل، أو لن يتم تحديث بطاقات معاينة الرابط عند الطلب قبل ذلك الوقت.
         peers_api_enabled: قائمة بأسماء النطاقات التي صادفها هذا الخادم في الفدرالية. لا توجد بيانات هنا حول ما إذا كنت تتحد مع خادم معين، فقط أن خادمك يعرف عنها. ويستخدم هذا الخدمات التي تجمع الإحصاءات المتعلقة بالاتحاد بشكل عام.
         profile_directory: دليل الملف الشخصي يسرد جميع المستخدمين الذين اختاروا الدخول ليكونوا قابلين للاكتشاف.
         require_invite_text: عندما تتطلب التسجيلات الموافقة اليدوية، اجعل إدخال النص "لماذا تريد الانضمام ؟" إلزاميا بدلا من اختياري
diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml
index a4a202713..f14a21b0c 100644
--- a/config/locales/simple_form.bg.yml
+++ b/config/locales/simple_form.bg.yml
@@ -77,11 +77,13 @@ bg:
           warn: Скриване на филтрираното съдържание зад предупреждение, споменавайки заглавието на филтъра
       form_admin_settings:
         activity_api_enabled: Броят на местните публикувани публикации, дейни потребители и нови регистрации в седмични кофи
+        app_icon: WEBP, PNG, GIF или JPG. Заменя подразбиращата се икона на приложението в мобилни устройства с произволна икона.
         backups_retention_period: Потребителите имат способността да пораждат архиви от публикациите си за по-късно изтегляне. Задавайки положителна стойност, тези архиви самодейно ще се изтрият от хранилището ви след определения брой дни.
         bootstrap_timeline_accounts: Тези акаунти ще се закачат в горния край на препоръките за следване на нови потребители.
         closed_registrations_message: Показва се, когато е затворено за регистрации
         content_cache_retention_period: Всички публикации от други сървъри, включително подсилвания и отговори, ще се изтрият след посочения брой дни, без да се взема предвид каквото и да е взаимодействие на местния потребител с тези публикации. Това включва публикации, които местния потребител е означил като отметки или любими. Личните споменавания между потребители от различни инстанции също ще се загубят и невъзможно да се възстановят. Употребата на тази настройка е предназначена за случаи със специално предназначение и разбива очакванията на много потребители, когато се изпълнява за употреба с общо предназначение.
         custom_css: Може да прилагате собствени стилове в уебверсията на Mastodon.
+        favicon: WEBP, PNG, GIF или JPG. Заменя стандартната сайтоикона на Mastodon с произволна икона.
         mascot: Замества илюстрацията в разширения уеб интерфейс.
         media_cache_retention_period: Мултимедийни файлове от публикации, направени от отдалечени потребители, се сринаха в сървъра ви. Задавайки положителна стойност, мултимедията ще се изтрие след посочения брой дни. Ако се искат мултимедийни данни след изтриването, то ще се изтегли пак, ако още е наличен източникът на съдържание. Поради ограниченията за това колко често картите за предварващ преглед на връзките анкетират сайтове на трети страни, се препоръчва да зададете тази стойност на поне 14 дни или картите за предварващ преглед на връзките няма да се обновяват при поискване преди този момент.
         peers_api_enabled: Списък от имена на домейни, с които сървърът се е свързал във федивселената. Тук не се включват данни за това дали федерирате с даден сървър, а само за това дали сървърът ви знае за него. Това се ползва от услуги, събиращи статистика за федерацията в общия смисъл.
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index c1056260b..7d3978669 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -77,13 +77,13 @@ de:
           warn: Den gefilterten Beitrag hinter einer Warnung, die den Filtertitel beinhaltet, ausblenden
       form_admin_settings:
         activity_api_enabled: Anzahl der wöchentlichen Beiträge, aktiven Profile und Registrierungen auf diesem Server
-        app_icon: WEBP, PNG, GIF oder JPG Überschreibt das Standard-App-Symbol auf mobilen Geräten mit einem benutzerdefinierten Symbol.
+        app_icon: WEBP, PNG, GIF oder JPG. Überschreibt das Standard-App-Symbol auf mobilen Geräten mit einem eigenen Symbol.
         backups_retention_period: Nutzer*innen haben die Möglichkeit, Archive ihrer Beiträge zu erstellen, die sie später herunterladen können. Wenn ein positiver Wert gesetzt ist, werden diese Archive nach der festgelegten Anzahl von Tagen automatisch aus deinem Speicher gelöscht.
         bootstrap_timeline_accounts: Diese Konten werden bei den Follower-Empfehlungen für neu registrierte Nutzer*innen oben angeheftet.
         closed_registrations_message: Wird angezeigt, wenn Registrierungen deaktiviert sind
         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. Das Verwenden dieser Option richtet sich ausschließlich an Server für spezielle Zwecke 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 benutzerdefinierten Icon.
+        favicon: WEBP, PNG, GIF oder JPG. Überschreibt das Standard-Mastodon-Favicon mit einem eigenen Symbol.
         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.
         peers_api_enabled: Eine Liste von Domains, die diesem Server im Fediverse begegnet sind. Hierbei werden keine Angaben darüber gemacht, ob du mit einem bestimmten Server föderierst, sondern nur, dass dein Server davon weiß. Dies wird von Diensten verwendet, die allgemein Statistiken übers Ferdiverse sammeln.
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index 8fee5b414..6ccca2bc8 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -83,7 +83,7 @@ hu:
         closed_registrations_message: Akkor jelenik meg, amikor a regisztráció le van zárva
         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 favicon felülírása egy egyéni ikonnal.
+        favicon: WEBP, PNG, GIF vagy JPG. Az alapértelmezett Mastodon favicont felülírja egy egyéni ikonnal.
         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.
         peers_api_enabled: Azon domainek listája, melyekkel ez a kiszolgáló találkozott a fediverzumban. Nem csatolunk adatot arról, hogy föderált kapcsolatban vagy-e az adott kiszolgálóval, csak arról, hogy a kiszolgálód tud a másikról. Ezt olyan szolgáltatások használják, melyek általában a föderációról készítenek statisztikákat.
diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml
index c796cb5fa..51329edd8 100644
--- a/config/locales/simple_form.ia.yml
+++ b/config/locales/simple_form.ia.yml
@@ -77,11 +77,13 @@ ia:
           warn: Celar le contento filtrate detra un aviso citante le titulo del filtro
       form_admin_settings:
         activity_api_enabled: Numeros de messages localmente publicate, usatores active, e nove registrationes in gruppos septimanal
+        app_icon: WEBP, PNG, GIF o JPG. Supplanta le icone predefinite sur apparatos mobile con un icone personalisate.
         backups_retention_period: Le usatores pote generar archivos de lor messages pro discargar los plus tarde. Quando predefinite a un valor positive, iste archivos sera automaticamente delite de tu immagazinage post le specificate numero de dies.
         bootstrap_timeline_accounts: Iste contos sera appunctate al summitate del recommendationes a sequer del nove usatores.
         closed_registrations_message: Monstrate quando le inscriptiones es claudite
         content_cache_retention_period: Tote messages de altere servitores (includite stimulos e responsas) sera delite post le specificate numero de dies, sin considerar alcun interaction de usator local con ille messages. Isto include messages ubi un usator local los ha marcate como marcapaginas o favoritos. Mentiones private inter usatores de differente instantias sera alsi perdite e impossibile a restaurar. Le uso de iste parametros es intendite pro specific instantias e infringe multe expectationes de usator quando 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.
         mascot: Illo substitue le illustration in le interfacie web avantiate.
         media_cache_retention_period: Le files multimedial de messages producite per usatores remote es in cache sur tu servitor. Quando predefinite a un valor positive, le medios sera delite post le numero de dies specificate. Le datos multimedial requirite post que illo es delite, sera re-discargate, si le contento original sera ancora disponibile. Per limitationes sur le frequentia con que le schedas de pre-visualisation de ligamine scruta le sitos de tertie partes, il es recommendate de predefinir iste valor a al minus 14 dies, o le schedas de pre-visualisation de ligamine non sera actualisate sur demanda ante ille tempore.
         peers_api_enabled: Un lista de nomines de dominio que iste servitor ha incontrate in le fediverso. Nulle datos es includite ci re tu federation con un date servitor, justo que tu servitor lo cognosce. Isto es usate per servicios que collige statistica re le federation in senso general.
diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml
index 5c0e6aa4e..f5624344b 100644
--- a/config/locales/simple_form.it.yml
+++ b/config/locales/simple_form.it.yml
@@ -77,11 +77,13 @@ it:
           warn: Nascondi il contenuto filtrato e mostra invece un avviso, citando il titolo del filtro
       form_admin_settings:
         activity_api_enabled: Conteggi di post pubblicati localmente, utenti attivi e nuove registrazioni in gruppi settimanali
+        app_icon: WEBP, PNG, GIF o JPG. Sostituisce l'icona dell'app predefinita sui dispositivi mobili con un'icona personalizzata.
         backups_retention_period: Gli utenti hanno la possibilità di generare archivi dei propri post da scaricare successivamente. Se impostati su un valore positivo, questi archivi verranno automaticamente eliminati dallo spazio di archiviazione dopo il numero di giorni specificato.
         bootstrap_timeline_accounts: Questi account verranno aggiunti in cima ai consigli da seguire dei nuovi utenti.
         closed_registrations_message: Visualizzato alla chiusura delle iscrizioni
         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.
         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.
         peers_api_enabled: Un elenco di nomi di dominio che questo server ha incontrato nel fediverse. Qui non sono inclusi dati sul fatto se si federano con un dato server, solo che il server ne è a conoscenza. Questo viene utilizzato dai servizi che raccolgono statistiche sulla federazione in senso generale.
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index 6ab4e0322..df4755c4f 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -77,9 +77,11 @@ ko:
           warn: 필터 제목을 언급하는 경고 뒤에 걸러진 내용을 숨기기
       form_admin_settings:
         activity_api_enabled: 주별 로컬에 게시된 글, 활성 사용자 및 새로운 가입자 수
+        app_icon: WEBP, PNG, GIF 또는 JPG. 모바일 기기에 쓰이는 기본 아이콘을 대체합니다.
         bootstrap_timeline_accounts: 이 계정들은 팔로우 추천 목록 상단에 고정됩니다.
         closed_registrations_message: 새 가입을 차단했을 때 표시됩니다
         custom_css: 사용자 지정 스타일을 웹 버전의 마스토돈에 지정할 수 있습니다.
+        favicon: WEBP, PNG, GIF 또는 JPG. 기본 파비콘을 대체합니다.
         mascot: 고급 웹 인터페이스의 그림을 대체합니다.
         peers_api_enabled: 이 서버가 연합우주에서 만났던 서버들에 대한 도메인 네임의 목록입니다. 해당 서버와 어떤 연합을 했는지에 대한 정보는 전혀 포함되지 않고, 단순히 그 서버를 알고 있는지에 대한 것입니다. 이것은 일반적으로 연합에 대한 통계를 수집할 때 사용됩니다.
         profile_directory: 프로필 책자는 발견되기를 희망하는 모든 사람들의 목록을 나열합니다.
@@ -240,6 +242,7 @@ ko:
         backups_retention_period: 사용자 아카이브 유지 기한
         bootstrap_timeline_accounts: 새로운 사용자들에게 추천할 계정들
         closed_registrations_message: 가입이 불가능 할 때의 사용자 지정 메시지
+        content_cache_retention_period: 리모트 콘텐츠 보유 기간
         custom_css: 사용자 정의 CSS
         mascot: 사용자 정의 마스코트 (legacy)
         media_cache_retention_period: 미디어 캐시 유지 기한
diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml
index 1be95a9f1..6631b59b1 100644
--- a/config/locales/simple_form.lt.yml
+++ b/config/locales/simple_form.lt.yml
@@ -49,7 +49,7 @@ lt:
         header: WEBP, PNG, GIF arba JPG. Ne daugiau kaip %{size}. Bus sumažintas iki %{dimensions} tšk.
         inbox_url: Nukopijuok URL adresą iš pradinio puslapio perdavėjo, kurį nori naudoti
         irreversible: Filtruoti įrašai išnyks negrįžtamai, net jei vėliau filtras bus pašalintas
-        locale: Naudotojo sąsajos kalba, el. laiškai ir stumiamieji pranešimai
+        locale: Naudotojo sąsajos kalba, el. laiškai ir tiesioginiai pranešimai
         password: Naudok bent 8 simbolius
         phrase: Bus suderinta, neatsižvelgiant į teksto lygį arba įrašo turinio įspėjimą
         scopes: Prie kurių API programai bus leidžiama pasiekti. Pasirinkus aukščiausio lygio sritį, atskirų sričių pasirinkti nereikia.
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index bdd3db040..a93a80322 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -77,12 +77,13 @@ nn:
           warn: Skjul det filtrerte innhaldet bak ei åtvaring som nemner tittelen på filteret
       form_admin_settings:
         activity_api_enabled: Tal på lokale innlegg, aktive brukarar og nyregistreringar kvar veke
-        app_icon: WEBP, PNG, GIF eller JPG. Overstyrer standard-ikonet på mobile einingar med eit tilpassa ikon.
+        app_icon: WEBP, PNG, GIF eller JPG. Overstyrer standard-app-ikonet på mobile einingar med eit eigendefinert ikon.
         backups_retention_period: Brukarar har moglegheit til å generere arkiv av sine innlegg for å laste ned seinare. Når sett til ein positiv verdi, blir desse arkiva automatisk sletta frå lagringa etter eit gitt antal dagar.
         bootstrap_timeline_accounts: Desse kontoane vil bli festa øverst på fylgjaranbefalingane til nye brukarar.
         closed_registrations_message: Vist når det er stengt for registrering
         content_cache_retention_period: Alle innlegg frå andre serverar (inkludert boostar og svar) vil bli sletta etter dei gitte antal dagar, uten hensyn til lokale brukarinteraksjonar med desse innlegga. Dette inkluderer innlegg der ein lokal brukar har merka det som bokmerker eller som favorittar. Òg private nemningar mellom brukarar frå ulike førekomstar vil gå tapt og vere umogleg å gjenskape. Bruk av denne innstillinga er rekna på spesielle førekomstar og bryt mange brukarforventingar når dette blir tatt i generell bruk.
         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.
         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.
         peers_api_enabled: Ei liste over domenenamn denne tenaren har møtt på i allheimen. Det står ingenting om tenaren din samhandlar med ein annan tenar, berre om tenaren din veit om den andre. Dette blir brukt av tenester som samlar statistikk om føderering i det heile.
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index 9044546f2..77a0d8cd6 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -77,10 +77,15 @@ pt-BR:
           warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro
       form_admin_settings:
         activity_api_enabled: Contagem de publicações locais, usuários ativos e novos usuários semanais
+        app_icon: WEBP, PNG, GIF ou JPG. Sobrescrever o ícone padrão do aplicativo em dispositivos móveis com um ícone personalizado.
+        backups_retention_period: Os usuários têm a capacidade de gerar arquivos de suas postagens para baixar mais tarde. Quando definido como um valor positivo, esses arquivos serão automaticamente excluídos do seu armazenamento após o número especificado de dias.
         bootstrap_timeline_accounts: Estas contas serão fixadas no topo das recomendações de novos usuários para seguir.
         closed_registrations_message: Exibido quando as inscrições estiverem fechadas
+        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.
         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.
         peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no "fediverse". Nenhum dado é incluído aqui sobre se você concorda com os padroes operacionais de um determinado servidor, apenas que o seu servidor sabe disso. Esta ferramenta é utilizado por serviços que recolhem estatísticas sob as normas da federação (grupo de empresas que concordam sob paramentros operacionais específicos), em termos gerais.
         profile_directory: O diretório de perfis lista todos os usuários que optaram por permitir que suas contas sejam descobertas.
         require_invite_text: 'Quando o cadastro de novas contas exigir aprovação manual, tornar obrigatório, ao invés de opcional, o texto de solicitação de convite: "Por que você deseja ingressar nessa comunidade?"'
diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml
index 559302270..dfb44c774 100644
--- a/config/locales/simple_form.ro.yml
+++ b/config/locales/simple_form.ro.yml
@@ -163,5 +163,6 @@ ro:
     'no': Nu
     recommended: Recomandat
     required:
+      mark: "*"
       text: obligatoriu
     'yes': Da
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index d545f2cd3..c3c392096 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -77,11 +77,13 @@ sq:
           warn: Fshihe lëndën e filtruar pas një sinjalizimi që përmend titullin e filtrit
       form_admin_settings:
         activity_api_enabled: Numër postimesh të botuar lokalisht, përdoruesish aktiv dhe regjistrimesh të reja sipas matjesh javore
+        app_icon: WEBP, PNG, GIF, ose JPG. Anashkalon ikonë parazgjedhje aplikacioni në pajisje celulare me një ikonë vetjake.
         backups_retention_period: Përdorues kanë aftësinë të prodhojnë arkiva të postimeve të tyre për t’i shkarkuar më vonë. Kur i jepet një vlerë pozitive, këto arkiva do të fshihen automatikisht prej depozitës tuaj pas numrit të dhënë të ditëve.
         bootstrap_timeline_accounts: Këto llogari do të fiksohen në krye të rekomandimeve për ndjekje nga përdorues të rinj.
         closed_registrations_message: Shfaqur kur mbyllen dritare regjistrimesh
         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.
         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.
         peers_api_enabled: Një listë emrash përkatësish që ky shërbyes ka hasur në fedivers. Këtu s’jepen të dhëna nëse jeni i federuar me shërbyesin e dhënë, thjesht tregohet se shërbyesi juaj e njeh. Kjo përdoret nga shërbime që mbledhin statistika mbi federimin në kuptimin e përgjithshëm.
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 5d0ebe2de..71e84a1d5 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -671,7 +671,7 @@ uk:
           delete_html: 'Ви збираєтеся <strong>вилучити</strong> деякі з дописів <strong>@%{acct}</strong>. Це буде:'
           mark_as_sensitive_html: 'Ви збираєтеся <strong>позначити</strong> деякі з дописів <strong>@%{acct}</strong> <strong>делікатними</strong>. Це буде:'
           silence_html: 'Ви збираєтеся <strong>обмежити</strong> обліковий запис <strong>@%{acct}</strong>. Це буде:'
-          suspend_html: 'Ви збираєтесь <strong>призупинити</strong> обліковий запис <strong>@%%{acct}</strong>. Це буде:'
+          suspend_html: 'Ви збираєтесь <strong>призупинити</strong> обліковий запис <strong>@%{acct}</strong>. Це буде:'
         actions:
           delete_html: Вилучити образливі дописи
           mark_as_sensitive_html: Позначити медіа образливих дописів делікатними

From 040aaf3a48022edab19ac42980a6c5a991156ec9 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Fri, 10 May 2024 05:42:01 -0400
Subject: [PATCH 085/215] Use `default: ...` assignment for Devise config,
 fixes `Style/ClassVars` cop (#30214)

---
 .rubocop_todo.yml             |  4 ---
 config/initializers/devise.rb | 51 ++++++++++++-----------------------
 2 files changed, 17 insertions(+), 38 deletions(-)

diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 25b573017..4d20330e0 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -54,10 +54,6 @@ Style/ClassEqualityComparison:
     - 'app/helpers/jsonld_helper.rb'
     - 'app/serializers/activitypub/outbox_serializer.rb'
 
-Style/ClassVars:
-  Exclude:
-    - 'config/initializers/devise.rb'
-
 # This cop supports safe autocorrection (--autocorrect).
 # Configuration parameters: AllowedVars.
 Style/FetchEnvVar:
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index f935090ef..a95c7437f 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -38,42 +38,25 @@ Warden::Manager.before_logout do |_, warden|
 end
 
 module Devise
-  mattr_accessor :pam_authentication
-  @@pam_authentication = false
-  mattr_accessor :pam_controlled_service
-  @@pam_controlled_service = nil
+  mattr_accessor :pam_authentication, default: false
+  mattr_accessor :pam_controlled_service, default: nil
 
-  mattr_accessor :check_at_sign
-  @@check_at_sign = false
+  mattr_accessor :check_at_sign, default: false
 
-  mattr_accessor :ldap_authentication
-  @@ldap_authentication = false
-  mattr_accessor :ldap_host
-  @@ldap_host = nil
-  mattr_accessor :ldap_port
-  @@ldap_port = nil
-  mattr_accessor :ldap_method
-  @@ldap_method = nil
-  mattr_accessor :ldap_base
-  @@ldap_base = nil
-  mattr_accessor :ldap_uid
-  @@ldap_uid = nil
-  mattr_accessor :ldap_mail
-  @@ldap_mail = nil
-  mattr_accessor :ldap_bind_dn
-  @@ldap_bind_dn = nil
-  mattr_accessor :ldap_password
-  @@ldap_password = nil
-  mattr_accessor :ldap_tls_no_verify
-  @@ldap_tls_no_verify = false
-  mattr_accessor :ldap_search_filter
-  @@ldap_search_filter = nil
-  mattr_accessor :ldap_uid_conversion_enabled
-  @@ldap_uid_conversion_enabled = false
-  mattr_accessor :ldap_uid_conversion_search
-  @@ldap_uid_conversion_search = nil
-  mattr_accessor :ldap_uid_conversion_replace
-  @@ldap_uid_conversion_replace = nil
+  mattr_accessor :ldap_authentication, default: false
+  mattr_accessor :ldap_host, default: nil
+  mattr_accessor :ldap_port, default: nil
+  mattr_accessor :ldap_method, default: nil
+  mattr_accessor :ldap_base, default: nil
+  mattr_accessor :ldap_uid, default: nil
+  mattr_accessor :ldap_mail, default: nil
+  mattr_accessor :ldap_bind_dn, default: nil
+  mattr_accessor :ldap_password, default: nil
+  mattr_accessor :ldap_tls_no_verify, default: false
+  mattr_accessor :ldap_search_filter, default: nil
+  mattr_accessor :ldap_uid_conversion_enabled, default: false
+  mattr_accessor :ldap_uid_conversion_search, default: nil
+  mattr_accessor :ldap_uid_conversion_replace, default: nil
 
   module Strategies
     class PamAuthenticatable

From fa43a6c8355ae53c0609999e1891023626ab4217 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Fri, 10 May 2024 05:43:59 -0400
Subject: [PATCH 086/215] Use more accurate `redirect_uri` in oauth spec
 (#30212)

---
 spec/system/oauth_spec.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spec/system/oauth_spec.rb b/spec/system/oauth_spec.rb
index 060978217..3b98ad352 100644
--- a/spec/system/oauth_spec.rb
+++ b/spec/system/oauth_spec.rb
@@ -3,7 +3,7 @@
 require 'rails_helper'
 
 describe 'Using OAuth from an external app' do
-  let(:client_app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: 'http://localhost/health', scopes: 'read') }
+  let(:client_app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: about_url(host: Rails.application.config.x.local_domain), scopes: 'read') }
 
   context 'when the user is already logged in' do
     let!(:user) { Fabricate(:user) }

From f3f63107f263db86021565dad79be497db9e5257 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 11:59:15 +0200
Subject: [PATCH 087/215] Update dependency @reduxjs/toolkit to v2.2.4 (#30223)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 28cf50046..9aa8125d5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3047,13 +3047,13 @@ __metadata:
   linkType: hard
 
 "@reduxjs/toolkit@npm:^2.0.1":
-  version: 2.2.3
-  resolution: "@reduxjs/toolkit@npm:2.2.3"
+  version: 2.2.4
+  resolution: "@reduxjs/toolkit@npm:2.2.4"
   dependencies:
     immer: "npm:^10.0.3"
     redux: "npm:^5.0.1"
     redux-thunk: "npm:^3.1.0"
-    reselect: "npm:^5.0.1"
+    reselect: "npm:^5.1.0"
   peerDependencies:
     react: ^16.9.0 || ^17.0.0 || ^18
     react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0
@@ -3062,7 +3062,7 @@ __metadata:
       optional: true
     react-redux:
       optional: true
-  checksum: 10c0/f10f2c8f4b6c5c7a65d8d60246bdfde86b6cd2f542210ebdda8002223c7f4e99ed32964825e63f37345d9d12532671150fcec2809a40690931ae44afe8aba7f8
+  checksum: 10c0/fdbf510210a5aa4864432397e1a9469367e297cd1d9c09a82e68638df7555672c2f8511fe76f933b00efbbb233c534831591772a44e8c41233e34f3cd0f54569
   languageName: node
   linkType: hard
 
@@ -14987,10 +14987,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"reselect@npm:^5.0.1":
-  version: 5.0.1
-  resolution: "reselect@npm:5.0.1"
-  checksum: 10c0/0724b4555cd6411849de334a75177780f127af849eb71c4b709966d07ade8090d125c0c926dc6cf936866d23ebadda6aad1da93cd8340525323b889f25d56d51
+"reselect@npm:^5.1.0":
+  version: 5.1.0
+  resolution: "reselect@npm:5.1.0"
+  checksum: 10c0/b0ed789f4f6f10dfbd23741823726793384932969aa7ce8f584c882ad87620a02b09b5d1146cd2ea6eaa0953b3fd9f7df22f113893af73f35f28432a8a4294de
   languageName: node
   linkType: hard
 

From e20f2e7300d326bd637bec691607ad4c0e70dc8f Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Fri, 10 May 2024 08:34:20 -0400
Subject: [PATCH 088/215] Update i18n to version 1.14.5 (#30198)

---
 Gemfile      |  2 +-
 Gemfile.lock | 19 +++++--------------
 2 files changed, 6 insertions(+), 15 deletions(-)

diff --git a/Gemfile b/Gemfile
index eb507e9d1..c7e07f964 100644
--- a/Gemfile
+++ b/Gemfile
@@ -57,7 +57,7 @@ gem 'htmlentities', '~> 4.3'
 gem 'http', '~> 5.2.0'
 gem 'http_accept_language', '~> 2.1'
 gem 'httplog', '~> 1.6.2'
-gem 'i18n', '1.14.1' # TODO: Remove version when resolved: https://github.com/glebm/i18n-tasks/issues/552 / https://github.com/ruby-i18n/i18n/pull/688
+gem 'i18n'
 gem 'idn-ruby', require: 'idn'
 gem 'inline_svg'
 gem 'kaminari', '~> 1.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index 9df960e61..b4db2b9a0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -130,14 +130,7 @@ GEM
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
       rouge (>= 1.0.0)
-    better_html (2.1.1)
-      actionview (>= 6.0)
-      activesupport (>= 6.0)
-      ast (~> 2.0)
-      erubi (~> 1.4)
-      parser (>= 2.4)
-      smart_properties
-    bigdecimal (3.1.7)
+    bigdecimal (3.1.8)
     bindata (2.5.0)
     binding_of_caller (1.0.1)
       debug_inspector (>= 1.2.0)
@@ -328,12 +321,11 @@ GEM
     httplog (1.6.3)
       rack (>= 2.0)
       rainbow (>= 2.0.0)
-    i18n (1.14.1)
+    i18n (1.14.5)
       concurrent-ruby (~> 1.0)
-    i18n-tasks (1.0.13)
+    i18n-tasks (1.0.14)
       activesupport (>= 4.0.2)
       ast (>= 2.1.0)
-      better_html (>= 1.0, < 3.0)
       erubi
       highline (>= 2.0.0)
       i18n
@@ -601,7 +593,7 @@ GEM
     redlock (1.3.2)
       redis (>= 3.0.0, < 6.0)
     regexp_parser (2.9.0)
-    reline (0.5.5)
+    reline (0.5.6)
       io-console (~> 0.5)
     request_store (1.6.0)
       rack (>= 1.4)
@@ -723,7 +715,6 @@ GEM
     simplecov-html (0.12.3)
     simplecov-lcov (0.8.0)
     simplecov_json_formatter (0.1.4)
-    smart_properties (1.17.0)
     stackprof (0.2.26)
     statsd-ruby (1.5.0)
     stoplight (4.1.0)
@@ -860,7 +851,7 @@ DEPENDENCIES
   http (~> 5.2.0)
   http_accept_language (~> 2.1)
   httplog (~> 1.6.2)
-  i18n (= 1.14.1)
+  i18n
   i18n-tasks (~> 1.0)
   idn-ruby
   inline_svg

From 164b09bfcc7d2b8c3619411ee06f530256d9fe4b Mon Sep 17 00:00:00 2001
From: Joshua Young <djry1999@gmail.com>
Date: Fri, 10 May 2024 22:34:32 +1000
Subject: [PATCH 089/215] Update README.md setup steps (#30063)

---
 README.md | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 1d0e75dab..0353a4c67 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
 - **PostgreSQL** 12+
 - **Redis** 4+
 - **Ruby** 3.1+
-- **Node.js** 16+
+- **Node.js** 18+
 
 The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
 
@@ -91,10 +91,12 @@ A **Vagrant** configuration is included for development purposes. To use it, com
 To set up **MacOS** for native development, complete the following steps:
 
 - Use a Ruby version manager to install the specified version from `.ruby-version`
+- Run `bundle` to install required gems
 - Run `brew install postgresql@14 redis imagemagick libidn` to install required dependencies
 - Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from `.nvmrc`
+- Run `yarn` to install required packages
 - Run `corepack enable && corepack prepare`
-- Run `bundle exec rails db:setup` (optionally prepend `RAILS_ENV=development` to target the dev environment)
+- Run `RAILS_ENV=development bundle exec rails db:setup`
 - Finally, run `bin/dev` which will launch the local services via `overmind` (if installed) or `foreman`
 
 ### Docker

From 0d397db5dd803fab2b7ddda9ae0dd5c26f4880a6 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Fri, 10 May 2024 08:36:09 -0400
Subject: [PATCH 090/215] Consolidate system specs into single directory, use
 rspec tags for configuration (#30206)

---
 .github/workflows/test-ruby.yml               |  4 ++-
 .rubocop_todo.yml                             |  2 +-
 lib/tasks/spec.rake                           | 13 -------
 spec/rails_helper.rb                          | 36 ++++++++-----------
 spec/requests/content_security_policy_spec.rb |  2 +-
 spec/support/capybara.rb                      |  4 +++
 spec/support/javascript_errors.rb             |  2 +-
 spec/support/streaming_server_manager.rb      |  4 +--
 .../admin/accounts_spec.rb                    |  0
 .../admin/custom_emojis_spec.rb               |  0
 .../admin/domain_blocks_spec.rb               |  0
 .../admin/email_domain_blocks_spec.rb         |  0
 .../admin/ip_blocks_spec.rb                   |  0
 .../admin/software_updates_spec.rb            |  0
 .../admin/statuses_spec.rb                    |  0
 .../links/preview_card_providers_spec.rb      |  0
 .../admin/trends/links_spec.rb                |  0
 .../admin/trends/statuses_spec.rb             |  0
 .../admin/trends/tags_spec.rb                 |  0
 spec/{features => system}/captcha_spec.rb     |  0
 spec/{features => system}/log_in_spec.rb      |  0
 spec/system/new_statuses_spec.rb              |  2 +-
 spec/system/oauth_spec.rb                     |  2 +-
 spec/system/ocr_spec.rb                       |  2 +-
 spec/{features => system}/profile_spec.rb     |  0
 .../{features => system}/redirections_spec.rb |  0
 spec/system/report_interface_spec.rb          |  2 +-
 .../severed_relationships_spec.rb             |  0
 spec/system/share_entrypoint_spec.rb          |  2 +-
 spec/system/unlogged_spec.rb                  |  2 +-
 30 files changed, 32 insertions(+), 47 deletions(-)
 delete mode 100644 lib/tasks/spec.rake
 rename spec/{features => system}/admin/accounts_spec.rb (100%)
 rename spec/{features => system}/admin/custom_emojis_spec.rb (100%)
 rename spec/{features => system}/admin/domain_blocks_spec.rb (100%)
 rename spec/{features => system}/admin/email_domain_blocks_spec.rb (100%)
 rename spec/{features => system}/admin/ip_blocks_spec.rb (100%)
 rename spec/{features => system}/admin/software_updates_spec.rb (100%)
 rename spec/{features => system}/admin/statuses_spec.rb (100%)
 rename spec/{features => system}/admin/trends/links/preview_card_providers_spec.rb (100%)
 rename spec/{features => system}/admin/trends/links_spec.rb (100%)
 rename spec/{features => system}/admin/trends/statuses_spec.rb (100%)
 rename spec/{features => system}/admin/trends/tags_spec.rb (100%)
 rename spec/{features => system}/captcha_spec.rb (100%)
 rename spec/{features => system}/log_in_spec.rb (100%)
 rename spec/{features => system}/profile_spec.rb (100%)
 rename spec/{features => system}/redirections_spec.rb (100%)
 rename spec/{features => system}/severed_relationships_spec.rb (100%)

diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml
index 84b907570..45dc8a0de 100644
--- a/.github/workflows/test-ruby.yml
+++ b/.github/workflows/test-ruby.yml
@@ -186,6 +186,8 @@ jobs:
       DISABLE_SIMPLECOV: true
       RAILS_ENV: test
       BUNDLE_WITH: test
+      LOCAL_DOMAIN: localhost:3000
+      LOCAL_HTTPS: false
 
     strategy:
       fail-fast: false
@@ -215,7 +217,7 @@ jobs:
       - name: Load database schema
         run: './bin/rails db:create db:schema:load db:seed'
 
-      - run: bundle exec rake spec:system
+      - run: bin/rspec spec/system --tag streaming --tag js
 
       - name: Archive logs
         uses: actions/upload-artifact@v4
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 4d20330e0..91e666d7f 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -70,7 +70,7 @@ Style/FetchEnvVar:
     - 'config/initializers/vapid.rb'
     - 'lib/mastodon/redis_config.rb'
     - 'lib/tasks/repo.rake'
-    - 'spec/features/profile_spec.rb'
+    - 'spec/system/profile_spec.rb'
 
 # This cop supports safe autocorrection (--autocorrect).
 # Configuration parameters: EnforcedStyle, MaxUnannotatedPlaceholdersAllowed, AllowedMethods, AllowedPatterns.
diff --git a/lib/tasks/spec.rake b/lib/tasks/spec.rake
deleted file mode 100644
index d505a4719..000000000
--- a/lib/tasks/spec.rake
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-if Rake::Task.task_defined?('spec:system')
-  namespace :spec do
-    task :enable_system_specs do # rubocop:disable Rails/RakeEnvironment
-      ENV['LOCAL_DOMAIN'] = 'localhost:3000'
-      ENV['LOCAL_HTTPS'] = 'false'
-      ENV['RUN_SYSTEM_SPECS'] = 'true'
-    end
-  end
-
-  Rake::Task['spec:system'].enhance ['spec:enable_system_specs']
-end
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index 89fc25bcb..d8eb561d4 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -3,12 +3,8 @@
 ENV['RAILS_ENV'] ||= 'test'
 
 # This needs to be defined before Rails is initialized
-RUN_SYSTEM_SPECS = ENV.fetch('RUN_SYSTEM_SPECS', false)
-
-if RUN_SYSTEM_SPECS
-  STREAMING_PORT = ENV.fetch('TEST_STREAMING_PORT', '4020')
-  ENV['STREAMING_API_BASE_URL'] = "http://localhost:#{STREAMING_PORT}"
-end
+STREAMING_PORT = ENV.fetch('TEST_STREAMING_PORT', '4020')
+ENV['STREAMING_API_BASE_URL'] = "http://localhost:#{STREAMING_PORT}"
 
 require File.expand_path('../config/environment', __dir__)
 
@@ -26,10 +22,12 @@ require 'test_prof/recipes/rspec/before_all'
 Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
 
 ActiveRecord::Migration.maintain_test_schema!
-WebMock.disable_net_connect!(allow: Chewy.settings[:host], allow_localhost: RUN_SYSTEM_SPECS)
+WebMock.disable_net_connect!(
+  allow_localhost: true,
+  allow: Chewy.settings[:host]
+)
 Sidekiq.logger = nil
 
-# System tests config
 DatabaseCleaner.strategy = [:deletion]
 
 Devise::Test::ControllerHelpers.module_eval do
@@ -49,16 +47,14 @@ Devise::Test::ControllerHelpers.module_eval do
 end
 
 RSpec.configure do |config|
-  # This is set before running spec:system, see lib/tasks/tests.rake
-  config.filter_run_excluding type: lambda { |type|
-    case type
-    when :system
-      !RUN_SYSTEM_SPECS
-    end
-  }
+  # By default, skip specs that need full JS browser
+  config.filter_run_excluding :js
 
-  # By default, skip the elastic search integration specs
-  config.filter_run_excluding search: true
+  # By default, skip specs that need elastic search server
+  config.filter_run_excluding :search
+
+  # By default, skip specs that need the streaming server
+  config.filter_run_excluding :streaming
 
   config.fixture_paths = [
     Rails.root.join('spec', 'fixtures'),
@@ -81,7 +77,7 @@ RSpec.configure do |config|
   config.include Devise::Test::ControllerHelpers, type: :controller
   config.include Devise::Test::ControllerHelpers, type: :helper
   config.include Devise::Test::ControllerHelpers, type: :view
-  config.include Devise::Test::IntegrationHelpers, type: :feature
+  config.include Devise::Test::IntegrationHelpers, type: :system
   config.include Devise::Test::IntegrationHelpers, type: :request
   config.include ActionMailer::TestHelper
   config.include Paperclip::Shoulda::Matchers
@@ -111,10 +107,6 @@ RSpec.configure do |config|
     stub_reset_connection_pools
   end
 
-  config.before :each, type: :feature do
-    Capybara.current_driver = :rack_test
-  end
-
   config.before do |example|
     allow(Resolv::DNS).to receive(:open).and_raise('Real DNS queries are disabled, stub Resolv::DNS as needed') unless example.metadata[:type] == :system
   end
diff --git a/spec/requests/content_security_policy_spec.rb b/spec/requests/content_security_policy_spec.rb
index d4447dca4..ba6fe4774 100644
--- a/spec/requests/content_security_policy_spec.rb
+++ b/spec/requests/content_security_policy_spec.rb
@@ -23,7 +23,7 @@ describe 'Content-Security-Policy' do
     <<~CSP.split("\n").map(&:strip)
       base-uri 'none'
       child-src 'self' blob: https://cb6e6126.ngrok.io
-      connect-src 'self' data: blob: https://cb6e6126.ngrok.io ws://cb6e6126.ngrok.io:4000
+      connect-src 'self' data: blob: https://cb6e6126.ngrok.io #{Rails.configuration.x.streaming_api_base_url}
       default-src 'none'
       font-src 'self' https://cb6e6126.ngrok.io
       form-action 'self'
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index d4f27e209..be1378ffa 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -26,6 +26,10 @@ Capybara.javascript_driver = :headless_chrome
 
 RSpec.configure do |config|
   config.before(:each, type: :system) do
+    driven_by :rack_test
+  end
+
+  config.before(:each, :js, type: :system) do
     driven_by Capybara.javascript_driver
   end
 end
diff --git a/spec/support/javascript_errors.rb b/spec/support/javascript_errors.rb
index a36bf6017..28a43b3b8 100644
--- a/spec/support/javascript_errors.rb
+++ b/spec/support/javascript_errors.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 RSpec.configure do |config|
-  config.after(:each, type: :system) do
+  config.after(:each, :js, type: :system) do
     errors = page.driver.browser.logs.get(:browser)
     if errors.present?
       aggregate_failures 'javascript errrors' do
diff --git a/spec/support/streaming_server_manager.rb b/spec/support/streaming_server_manager.rb
index b702fc77c..3facf16b8 100644
--- a/spec/support/streaming_server_manager.rb
+++ b/spec/support/streaming_server_manager.rb
@@ -95,7 +95,7 @@ RSpec.configure do |config|
     end
   end
 
-  config.around :each, type: :system do |example|
+  config.around :each, :streaming, type: :system do |example|
     # Streaming server needs DB access but `use_transactional_tests` rolls back
     # every transaction. Disable this feature for streaming tests, and use
     # DatabaseCleaner to clean the database tables between each test.
@@ -125,6 +125,6 @@ RSpec.configure do |config|
   end
 
   def streaming_examples_present?
-    RUN_SYSTEM_SPECS
+    RSpec.world.filtered_examples.values.flatten.any? { |example| example.metadata[:streaming] == true }
   end
 end
diff --git a/spec/features/admin/accounts_spec.rb b/spec/system/admin/accounts_spec.rb
similarity index 100%
rename from spec/features/admin/accounts_spec.rb
rename to spec/system/admin/accounts_spec.rb
diff --git a/spec/features/admin/custom_emojis_spec.rb b/spec/system/admin/custom_emojis_spec.rb
similarity index 100%
rename from spec/features/admin/custom_emojis_spec.rb
rename to spec/system/admin/custom_emojis_spec.rb
diff --git a/spec/features/admin/domain_blocks_spec.rb b/spec/system/admin/domain_blocks_spec.rb
similarity index 100%
rename from spec/features/admin/domain_blocks_spec.rb
rename to spec/system/admin/domain_blocks_spec.rb
diff --git a/spec/features/admin/email_domain_blocks_spec.rb b/spec/system/admin/email_domain_blocks_spec.rb
similarity index 100%
rename from spec/features/admin/email_domain_blocks_spec.rb
rename to spec/system/admin/email_domain_blocks_spec.rb
diff --git a/spec/features/admin/ip_blocks_spec.rb b/spec/system/admin/ip_blocks_spec.rb
similarity index 100%
rename from spec/features/admin/ip_blocks_spec.rb
rename to spec/system/admin/ip_blocks_spec.rb
diff --git a/spec/features/admin/software_updates_spec.rb b/spec/system/admin/software_updates_spec.rb
similarity index 100%
rename from spec/features/admin/software_updates_spec.rb
rename to spec/system/admin/software_updates_spec.rb
diff --git a/spec/features/admin/statuses_spec.rb b/spec/system/admin/statuses_spec.rb
similarity index 100%
rename from spec/features/admin/statuses_spec.rb
rename to spec/system/admin/statuses_spec.rb
diff --git a/spec/features/admin/trends/links/preview_card_providers_spec.rb b/spec/system/admin/trends/links/preview_card_providers_spec.rb
similarity index 100%
rename from spec/features/admin/trends/links/preview_card_providers_spec.rb
rename to spec/system/admin/trends/links/preview_card_providers_spec.rb
diff --git a/spec/features/admin/trends/links_spec.rb b/spec/system/admin/trends/links_spec.rb
similarity index 100%
rename from spec/features/admin/trends/links_spec.rb
rename to spec/system/admin/trends/links_spec.rb
diff --git a/spec/features/admin/trends/statuses_spec.rb b/spec/system/admin/trends/statuses_spec.rb
similarity index 100%
rename from spec/features/admin/trends/statuses_spec.rb
rename to spec/system/admin/trends/statuses_spec.rb
diff --git a/spec/features/admin/trends/tags_spec.rb b/spec/system/admin/trends/tags_spec.rb
similarity index 100%
rename from spec/features/admin/trends/tags_spec.rb
rename to spec/system/admin/trends/tags_spec.rb
diff --git a/spec/features/captcha_spec.rb b/spec/system/captcha_spec.rb
similarity index 100%
rename from spec/features/captcha_spec.rb
rename to spec/system/captcha_spec.rb
diff --git a/spec/features/log_in_spec.rb b/spec/system/log_in_spec.rb
similarity index 100%
rename from spec/features/log_in_spec.rb
rename to spec/system/log_in_spec.rb
diff --git a/spec/system/new_statuses_spec.rb b/spec/system/new_statuses_spec.rb
index 5a3f1b406..725ea8fe5 100644
--- a/spec/system/new_statuses_spec.rb
+++ b/spec/system/new_statuses_spec.rb
@@ -2,7 +2,7 @@
 
 require 'rails_helper'
 
-describe 'NewStatuses', :sidekiq_inline do
+describe 'NewStatuses', :js, :sidekiq_inline, :streaming do
   include ProfileStories
 
   subject { page }
diff --git a/spec/system/oauth_spec.rb b/spec/system/oauth_spec.rb
index 3b98ad352..1c9aca311 100644
--- a/spec/system/oauth_spec.rb
+++ b/spec/system/oauth_spec.rb
@@ -2,7 +2,7 @@
 
 require 'rails_helper'
 
-describe 'Using OAuth from an external app' do
+describe 'Using OAuth from an external app', :js, :streaming do
   let(:client_app) { Doorkeeper::Application.create!(name: 'test', redirect_uri: about_url(host: Rails.application.config.x.local_domain), scopes: 'read') }
 
   context 'when the user is already logged in' do
diff --git a/spec/system/ocr_spec.rb b/spec/system/ocr_spec.rb
index 254efa713..4f4941adc 100644
--- a/spec/system/ocr_spec.rb
+++ b/spec/system/ocr_spec.rb
@@ -2,7 +2,7 @@
 
 require 'rails_helper'
 
-describe 'OCR', :paperclip_processing, :sidekiq_inline do
+describe 'OCR', :js, :paperclip_processing, :sidekiq_inline, :streaming do
   include ProfileStories
 
   let(:email)               { 'test@example.com' }
diff --git a/spec/features/profile_spec.rb b/spec/system/profile_spec.rb
similarity index 100%
rename from spec/features/profile_spec.rb
rename to spec/system/profile_spec.rb
diff --git a/spec/features/redirections_spec.rb b/spec/system/redirections_spec.rb
similarity index 100%
rename from spec/features/redirections_spec.rb
rename to spec/system/redirections_spec.rb
diff --git a/spec/system/report_interface_spec.rb b/spec/system/report_interface_spec.rb
index 6eba55255..f82604aae 100644
--- a/spec/system/report_interface_spec.rb
+++ b/spec/system/report_interface_spec.rb
@@ -2,7 +2,7 @@
 
 require 'rails_helper'
 
-describe 'report interface', :paperclip_processing do
+describe 'report interface', :js, :paperclip_processing, :streaming do
   include ProfileStories
 
   let(:email)               { 'admin@example.com' }
diff --git a/spec/features/severed_relationships_spec.rb b/spec/system/severed_relationships_spec.rb
similarity index 100%
rename from spec/features/severed_relationships_spec.rb
rename to spec/system/severed_relationships_spec.rb
diff --git a/spec/system/share_entrypoint_spec.rb b/spec/system/share_entrypoint_spec.rb
index 126a816bc..5fdbeacef 100644
--- a/spec/system/share_entrypoint_spec.rb
+++ b/spec/system/share_entrypoint_spec.rb
@@ -2,7 +2,7 @@
 
 require 'rails_helper'
 
-describe 'ShareEntrypoint' do
+describe 'ShareEntrypoint', :js, :streaming do
   include ProfileStories
 
   subject { page }
diff --git a/spec/system/unlogged_spec.rb b/spec/system/unlogged_spec.rb
index c3ebf51d7..417ccdaeb 100644
--- a/spec/system/unlogged_spec.rb
+++ b/spec/system/unlogged_spec.rb
@@ -2,7 +2,7 @@
 
 require 'rails_helper'
 
-describe 'UnloggedBrowsing' do
+describe 'UnloggedBrowsing', :js, :streaming do
   subject { page }
 
   before do

From 68b9fe824d6cc8154efe46829fa0fcd26a5b9a5d Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Fri, 10 May 2024 14:40:20 +0200
Subject: [PATCH 091/215] Add OpenTelemetry instrumentation (#30130)

Co-authored-by: Juliano Costa <juliano.costa@datadoghq.com>
Co-authored-by: Robb Kidd <robbkidd@honeycomb.io>
---
 Gemfile                              |  18 +++++
 Gemfile.lock                         | 108 +++++++++++++++++++++++++++
 config/initializers/opentelemetry.rb |  63 ++++++++++++++++
 3 files changed, 189 insertions(+)
 create mode 100644 config/initializers/opentelemetry.rb

diff --git a/Gemfile b/Gemfile
index c7e07f964..247865aac 100644
--- a/Gemfile
+++ b/Gemfile
@@ -103,6 +103,24 @@ gem 'rdf-normalize', '~> 0.5'
 
 gem 'private_address_check', '~> 0.5'
 
+group :opentelemetry do
+  gem 'opentelemetry-exporter-otlp', '~> 0.26.3', require: false
+  gem 'opentelemetry-instrumentation-active_job', '~> 0.7.1', require: false
+  gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.20.1', require: false
+  gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.21.2', require: false
+  gem 'opentelemetry-instrumentation-excon', '~> 0.22.0', require: false
+  gem 'opentelemetry-instrumentation-faraday', '~> 0.24.1', require: false
+  gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false
+  gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false
+  gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
+  gem 'opentelemetry-instrumentation-pg', '~> 0.27.1', require: false
+  gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false
+  gem 'opentelemetry-instrumentation-rails', '~> 0.30.0', require: false
+  gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false
+  gem 'opentelemetry-instrumentation-sidekiq', '~> 0.25.2', require: false
+  gem 'opentelemetry-sdk', '~> 1.4', require: false
+end
+
 group :test do
   # Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
   gem 'rspec-github', '~> 2.4', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index b4db2b9a0..b96afef2c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -284,6 +284,9 @@ GEM
       ruby-progressbar (~> 1.4)
     globalid (1.2.1)
       activesupport (>= 6.1)
+    google-protobuf (3.25.3)
+    googleapis-common-protos-types (1.14.0)
+      google-protobuf (~> 3.18)
     haml (6.3.0)
       temple (>= 0.8.2)
       thor
@@ -483,6 +486,96 @@ GEM
     openssl (3.2.0)
     openssl-signature_algorithm (1.3.0)
       openssl (> 2.0)
+    opentelemetry-api (1.2.5)
+    opentelemetry-common (0.20.1)
+      opentelemetry-api (~> 1.0)
+    opentelemetry-exporter-otlp (0.26.3)
+      google-protobuf (~> 3.14)
+      googleapis-common-protos-types (~> 1.3)
+      opentelemetry-api (~> 1.1)
+      opentelemetry-common (~> 0.20)
+      opentelemetry-sdk (~> 1.2)
+      opentelemetry-semantic_conventions
+    opentelemetry-helpers-sql-obfuscation (0.1.0)
+      opentelemetry-common (~> 0.20)
+    opentelemetry-instrumentation-action_pack (0.9.0)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+      opentelemetry-instrumentation-rack (~> 0.21)
+    opentelemetry-instrumentation-action_view (0.7.0)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-active_support (~> 0.1)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-active_job (0.7.1)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-active_model_serializers (0.20.1)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-active_record (0.7.1)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-active_support (0.5.1)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-base (0.22.3)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-registry (~> 0.1)
+    opentelemetry-instrumentation-concurrent_ruby (0.21.2)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-excon (0.22.0)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-common (~> 0.20.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-faraday (0.24.1)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-common (~> 0.20.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-http (0.23.2)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-http_client (0.22.3)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-common (~> 0.20.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-net_http (0.22.4)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-common (~> 0.20.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-pg (0.27.1)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-helpers-sql-obfuscation
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-rack (0.24.1)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-common (~> 0.20.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-rails (0.30.0)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-instrumentation-action_pack (~> 0.9.0)
+      opentelemetry-instrumentation-action_view (~> 0.7.0)
+      opentelemetry-instrumentation-active_job (~> 0.7.0)
+      opentelemetry-instrumentation-active_record (~> 0.7.0)
+      opentelemetry-instrumentation-active_support (~> 0.5.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-redis (0.25.3)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-common (~> 0.20.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-instrumentation-sidekiq (0.25.2)
+      opentelemetry-api (~> 1.0)
+      opentelemetry-common (~> 0.20.0)
+      opentelemetry-instrumentation-base (~> 0.22.1)
+    opentelemetry-registry (0.3.1)
+      opentelemetry-api (~> 1.1)
+    opentelemetry-sdk (1.4.1)
+      opentelemetry-api (~> 1.1)
+      opentelemetry-common (~> 0.20)
+      opentelemetry-registry (~> 0.2)
+      opentelemetry-semantic_conventions
+    opentelemetry-semantic_conventions (1.10.0)
+      opentelemetry-api (~> 1.0)
     orm_adapter (0.5.0)
     ox (2.14.18)
     parallel (1.24.0)
@@ -880,6 +973,21 @@ DEPENDENCIES
   omniauth-rails_csrf_protection (~> 1.0)
   omniauth-saml (~> 2.0)
   omniauth_openid_connect (~> 0.6.1)
+  opentelemetry-exporter-otlp (~> 0.26.3)
+  opentelemetry-instrumentation-active_job (~> 0.7.1)
+  opentelemetry-instrumentation-active_model_serializers (~> 0.20.1)
+  opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2)
+  opentelemetry-instrumentation-excon (~> 0.22.0)
+  opentelemetry-instrumentation-faraday (~> 0.24.1)
+  opentelemetry-instrumentation-http (~> 0.23.2)
+  opentelemetry-instrumentation-http_client (~> 0.22.3)
+  opentelemetry-instrumentation-net_http (~> 0.22.4)
+  opentelemetry-instrumentation-pg (~> 0.27.1)
+  opentelemetry-instrumentation-rack (~> 0.24.1)
+  opentelemetry-instrumentation-rails (~> 0.30.0)
+  opentelemetry-instrumentation-redis (~> 0.25.3)
+  opentelemetry-instrumentation-sidekiq (~> 0.25.2)
+  opentelemetry-sdk (~> 1.4)
   ox (~> 2.14)
   parslet
   pg (~> 1.5)
diff --git a/config/initializers/opentelemetry.rb b/config/initializers/opentelemetry.rb
new file mode 100644
index 000000000..e50132d46
--- /dev/null
+++ b/config/initializers/opentelemetry.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+# Set OTEL_* environment variables according to OTel docs:
+# https://opentelemetry.io/docs/concepts/sdk-configuration/
+
+if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) }
+  require 'opentelemetry/sdk'
+  require 'opentelemetry/exporter/otlp'
+
+  require 'opentelemetry/instrumentation/active_job'
+  require 'opentelemetry/instrumentation/active_model_serializers'
+  require 'opentelemetry/instrumentation/concurrent_ruby'
+  require 'opentelemetry/instrumentation/excon'
+  require 'opentelemetry/instrumentation/faraday'
+  require 'opentelemetry/instrumentation/http'
+  require 'opentelemetry/instrumentation/http_client'
+  require 'opentelemetry/instrumentation/net/http'
+  require 'opentelemetry/instrumentation/pg'
+  require 'opentelemetry/instrumentation/rack'
+  require 'opentelemetry/instrumentation/rails'
+  require 'opentelemetry/instrumentation/redis'
+  require 'opentelemetry/instrumentation/sidekiq'
+
+  OpenTelemetry::SDK.configure do |c|
+    # use_all() attempts to load ALL the auto-instrumentations
+    # currently loaded by Ruby requires.
+    #
+    # Load attempts will emit an INFO or WARN to the console
+    # about the success/failure to wire up an auto-instrumentation.
+    # "WARN -- : Instrumentation: <X> failed to install" is most
+    # likely caused by <X> not being a Ruby library loaded by
+    # the application or the instrumentation has been explicitly
+    # disabled.
+    #
+    # To disable an instrumentation, set an environment variable
+    # along this pattern:
+    #
+    # OTEL_RUBY_INSTRUMENTATION_<X>_ENABLED=false
+    #
+    # For example, PostgreSQL and Redis produce a lot of child spans
+    # in the course of this application doing its business. To turn
+    # them off, set the env vars below, but recognize that you will
+    # be missing details about what particular calls to the
+    # datastores are slow.
+    #
+    # OTEL_RUBY_INSTRUMENTATION_PG_ENABLED=false
+    # OTEL_RUBY_INSTRUMENTATION_REDIS_ENABLED=false
+
+    c.use_all({
+      'OpenTelemetry::Instrumentation::Rack' => {
+        use_rack_events: false, # instead of events, use middleware; allows for untraced_endpoints to ignore child spans
+        untraced_endpoints: ['/health'],
+      },
+    })
+
+    c.service_name =  case $PROGRAM_NAME
+                      when /puma/ then 'mastodon/web'
+                      else
+                        "mastodon/#{$PROGRAM_NAME.split('/').last}"
+                      end
+    c.service_version = Mastodon::Version.to_s
+  end
+end

From ded11eca4fe2d89d986663d6f6a8dd5284e4604a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 15:15:54 +0200
Subject: [PATCH 092/215] Update dependency pundit to v2.3.2 (#30222)

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 b96afef2c..114abcb7b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -607,7 +607,7 @@ GEM
     public_suffix (5.0.5)
     puma (6.4.2)
       nio4r (~> 2.0)
-    pundit (2.3.1)
+    pundit (2.3.2)
       activesupport (>= 3.0.0)
     raabro (1.4.0)
     racc (1.7.3)

From d933e6b6aeda9fad6af712e084cdb5c25bdc2cbe Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 15:16:02 +0200
Subject: [PATCH 093/215] Update dependency
 opentelemetry-instrumentation-concurrent_ruby to v0.21.3 (#30235)

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 114abcb7b..3e2af23fe 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -521,7 +521,7 @@ GEM
     opentelemetry-instrumentation-base (0.22.3)
       opentelemetry-api (~> 1.0)
       opentelemetry-registry (~> 0.1)
-    opentelemetry-instrumentation-concurrent_ruby (0.21.2)
+    opentelemetry-instrumentation-concurrent_ruby (0.21.3)
       opentelemetry-api (~> 1.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
     opentelemetry-instrumentation-excon (0.22.0)

From af71f236a2e4565619871bfb72d64ca39411d365 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 15:16:05 +0200
Subject: [PATCH 094/215] Update dependency opentelemetry-instrumentation-excon
 to v0.22.2 (#30236)

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 3e2af23fe..fda00ca46 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -524,7 +524,7 @@ GEM
     opentelemetry-instrumentation-concurrent_ruby (0.21.3)
       opentelemetry-api (~> 1.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-excon (0.22.0)
+    opentelemetry-instrumentation-excon (0.22.1)
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)

From 482d1087c57553f551cf495f62d9b7fccf649271 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 16:19:41 +0200
Subject: [PATCH 095/215] Update dependency
 opentelemetry-instrumentation-faraday to v0.24.3 (#30237)

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 fda00ca46..5669cf96a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -528,7 +528,7 @@ GEM
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-faraday (0.24.1)
+    opentelemetry-instrumentation-faraday (0.24.2)
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)

From d09b02efb653e59488cac530db8ae2757ad0cd02 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Fri, 10 May 2024 18:33:10 +0200
Subject: [PATCH 096/215] Group Ruby OTEL packages in Renovate PRs (#30242)

---
 .github/renovate.json5 | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/.github/renovate.json5 b/.github/renovate.json5
index e92608a43..378d4fc83 100644
--- a/.github/renovate.json5
+++ b/.github/renovate.json5
@@ -141,6 +141,13 @@
       matchUpdateTypes: ['patch', 'minor'],
       groupName: 'RSpec (non-major)',
     },
+    {
+      // Group all opentelemetry-ruby packages in the same PR
+      matchManagers: ['bundler'],
+      matchPackagePrefixes: ['opentelemetry-'],
+      matchUpdateTypes: ['patch', 'minor'],
+      groupName: 'opentelemetry-ruby (non-major)',
+    },
     // Add labels depending on package manager
     { matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] },
     { matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] },

From 9920f41c0fd8ad0030d2818c8271aa3cf24b4391 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 21:18:53 +0200
Subject: [PATCH 097/215] Update opentelemetry-ruby (non-major) (#30249)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile.lock | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 5669cf96a..3f4b1088a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -512,7 +512,7 @@ GEM
     opentelemetry-instrumentation-active_model_serializers (0.20.1)
       opentelemetry-api (~> 1.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-active_record (0.7.1)
+    opentelemetry-instrumentation-active_record (0.7.2)
       opentelemetry-api (~> 1.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
     opentelemetry-instrumentation-active_support (0.5.1)
@@ -532,10 +532,10 @@ GEM
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-http (0.23.2)
+    opentelemetry-instrumentation-http (0.23.3)
       opentelemetry-api (~> 1.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-http_client (0.22.3)
+    opentelemetry-instrumentation-http_client (0.22.4)
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
@@ -543,15 +543,15 @@ GEM
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-pg (0.27.1)
+    opentelemetry-instrumentation-pg (0.27.2)
       opentelemetry-api (~> 1.0)
       opentelemetry-helpers-sql-obfuscation
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-rack (0.24.1)
+    opentelemetry-instrumentation-rack (0.24.3)
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-rails (0.30.0)
+    opentelemetry-instrumentation-rails (0.30.1)
       opentelemetry-api (~> 1.0)
       opentelemetry-instrumentation-action_pack (~> 0.9.0)
       opentelemetry-instrumentation-action_view (~> 0.7.0)
@@ -559,11 +559,11 @@ GEM
       opentelemetry-instrumentation-active_record (~> 0.7.0)
       opentelemetry-instrumentation-active_support (~> 0.5.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-redis (0.25.3)
+    opentelemetry-instrumentation-redis (0.25.4)
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-sidekiq (0.25.2)
+    opentelemetry-instrumentation-sidekiq (0.25.3)
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)

From 346530732cce54c3e690486aca256bc0aae26d17 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 10 May 2024 21:19:47 +0200
Subject: [PATCH 098/215] Update dependency utf-8-validate to v6.0.4 (#30248)

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 9aa8125d5..4f99844d6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -17397,12 +17397,12 @@ __metadata:
   linkType: hard
 
 "utf-8-validate@npm:^6.0.3":
-  version: 6.0.3
-  resolution: "utf-8-validate@npm:6.0.3"
+  version: 6.0.4
+  resolution: "utf-8-validate@npm:6.0.4"
   dependencies:
     node-gyp: "npm:latest"
     node-gyp-build: "npm:^4.3.0"
-  checksum: 10c0/2ca08b07f4070540b33ff15f3f0632fa30baaee8a766fff993be47b4829b4fb30fd36fdf1270336324d03f65e0936c4608ee719d862230d75311751dcfe27a83
+  checksum: 10c0/f7042d94aec6ca02461b64e725bdc7262266610dbb787331e5bbd49374ef6f75fe9900600df3fc63d97906c23614a965c8989b4bf95d70bf35dc617da99215e7
   languageName: node
   linkType: hard
 

From 1959365c2f410aa82874c5c05ab92c4eca4c4055 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Fri, 10 May 2024 22:00:25 +0200
Subject: [PATCH 099/215] Add missing `on_delete: :cascade` on
 `notification_policies` (#30251)

---
 ...3_fix_notification_policies_foreign_key.rb | 28 +++++++++++++++++++
 db/schema.rb                                  |  4 +--
 2 files changed, 30 insertions(+), 2 deletions(-)
 create mode 100644 db/migrate/20240510192043_fix_notification_policies_foreign_key.rb

diff --git a/db/migrate/20240510192043_fix_notification_policies_foreign_key.rb b/db/migrate/20240510192043_fix_notification_policies_foreign_key.rb
new file mode 100644
index 000000000..7bb134ecf
--- /dev/null
+++ b/db/migrate/20240510192043_fix_notification_policies_foreign_key.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class FixNotificationPoliciesForeignKey < ActiveRecord::Migration[7.1]
+  def up
+    safety_assured do
+      execute <<~SQL.squish
+        ALTER TABLE notification_policies
+          DROP CONSTRAINT fk_rails_506d62f0da,
+          ADD CONSTRAINT fk_rails_506d62f0da
+            FOREIGN KEY (account_id)
+            REFERENCES accounts(id)
+            ON DELETE CASCADE
+      SQL
+    end
+  end
+
+  def down
+    safety_assured do
+      execute <<~SQL.squish
+        ALTER TABLE notification_policies
+          DROP CONSTRAINT fk_rails_506d62f0da,
+          ADD CONSTRAINT fk_rails_506d62f0da
+            FOREIGN KEY (account_id)
+            REFERENCES accounts(id)
+      SQL
+    end
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 11f1a202f..ad5860492 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[7.1].define(version: 2024_03_22_161611) do
+ActiveRecord::Schema[7.1].define(version: 2024_05_10_192043) do
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
 
@@ -1335,7 +1335,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_03_22_161611) do
   add_foreign_key "mutes", "accounts", name: "fk_b8d8daf315", on_delete: :cascade
   add_foreign_key "notification_permissions", "accounts"
   add_foreign_key "notification_permissions", "accounts", column: "from_account_id"
-  add_foreign_key "notification_policies", "accounts"
+  add_foreign_key "notification_policies", "accounts", on_delete: :cascade
   add_foreign_key "notification_requests", "accounts", column: "from_account_id", on_delete: :cascade
   add_foreign_key "notification_requests", "accounts", on_delete: :cascade
   add_foreign_key "notification_requests", "statuses", column: "last_status_id", on_delete: :nullify

From 807cf354fcf2706bd24890acb875fa85b097164a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 11:09:39 +0200
Subject: [PATCH 100/215] Update dependency eslint-plugin-jsdoc to v48.2.4
 (#30274)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 4f99844d6..f6166cccf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2132,14 +2132,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@es-joy/jsdoccomment@npm:~0.42.0":
-  version: 0.42.0
-  resolution: "@es-joy/jsdoccomment@npm:0.42.0"
+"@es-joy/jsdoccomment@npm:~0.43.0":
+  version: 0.43.0
+  resolution: "@es-joy/jsdoccomment@npm:0.43.0"
   dependencies:
+    "@types/eslint": "npm:^8.56.5"
+    "@types/estree": "npm:^1.0.5"
+    "@typescript-eslint/types": "npm:^7.2.0"
     comment-parser: "npm:1.4.1"
     esquery: "npm:^1.5.0"
     jsdoc-type-pratt-parser: "npm:~4.0.0"
-  checksum: 10c0/a8122762d2df3c6501a9c459e2822315a23c0078c4aeb0b40fb3c84b99e21a78e85e67f962d6b5dde5eb751792a1c67c6a170b619573db7151098a19950abe35
+  checksum: 10c0/862294ed89772a231f309edd68405ece00f6aaf43103210f28410da894a6b697bc1f281c59e813dd37d5b7294f633ee7b874e07a0aa3d72f49504089fc9cb2c4
   languageName: node
   linkType: hard
 
@@ -3520,17 +3523,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/eslint@npm:7 || 8":
-  version: 8.44.6
-  resolution: "@types/eslint@npm:8.44.6"
+"@types/eslint@npm:7 || 8, @types/eslint@npm:^8.56.5":
+  version: 8.56.10
+  resolution: "@types/eslint@npm:8.56.10"
   dependencies:
     "@types/estree": "npm:*"
     "@types/json-schema": "npm:*"
-  checksum: 10c0/fc449107eb186bdc5d30149bbcb4e673af8530afdeacca3b89f14deefcbfc67463157d6a81b42cd9df92ddeafda5351853d13310ff7ac6ab0d9769ac7cc0cc3a
+  checksum: 10c0/674349d6c342c3864d70f4d5a9965f96fb253801532752c8c500ad6a1c2e8b219e01ccff5dc8791dcb58b5483012c495708bb9f3ff929f5c9322b3da126c15d3
   languageName: node
   linkType: hard
 
-"@types/estree@npm:*, @types/estree@npm:^1.0.0":
+"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5":
   version: 1.0.5
   resolution: "@types/estree@npm:1.0.5"
   checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d
@@ -4193,7 +4196,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/types@npm:7.8.0":
+"@typescript-eslint/types@npm:7.8.0, @typescript-eslint/types@npm:^7.2.0":
   version: 7.8.0
   resolution: "@typescript-eslint/types@npm:7.8.0"
   checksum: 10c0/b2fdbfc21957bfa46f7d8809b607ad8c8b67c51821d899064d09392edc12f28b2318a044f0cd5d523d782e84e8f0558778877944964cf38e139f88790cf9d466
@@ -7820,10 +7823,10 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-jsdoc@npm:^48.0.0":
-  version: 48.2.3
-  resolution: "eslint-plugin-jsdoc@npm:48.2.3"
+  version: 48.2.4
+  resolution: "eslint-plugin-jsdoc@npm:48.2.4"
   dependencies:
-    "@es-joy/jsdoccomment": "npm:~0.42.0"
+    "@es-joy/jsdoccomment": "npm:~0.43.0"
     are-docs-informative: "npm:^0.0.2"
     comment-parser: "npm:1.4.1"
     debug: "npm:^4.3.4"
@@ -7834,7 +7837,7 @@ __metadata:
     spdx-expression-parse: "npm:^4.0.0"
   peerDependencies:
     eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
-  checksum: 10c0/e755923d96118890c6fd28b1c2298e1fe67ccbce08060ffc091b29ced59d0058ad8820323c56eef6f85c2954c783fc4076e78c0e5bc64838ae099b4e62ea702e
+  checksum: 10c0/601c9d6ee41de56102c7813106ceb0b8b8342223670f7add010a8f89753c250cde4cc93e353e3911b7b29677f2634f3f4be45f27abb7a95c6fdbd058adfa3343
   languageName: node
   linkType: hard
 

From ab4efa3bf89358a110f91af87055e1fc5d610d94 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 11:10:09 +0200
Subject: [PATCH 101/215] Update dependency @testing-library/react to v15.0.7
 (#30273)

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 f6166cccf..a7f8c0a61 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3391,8 +3391,8 @@ __metadata:
   linkType: hard
 
 "@testing-library/react@npm:^15.0.0":
-  version: 15.0.6
-  resolution: "@testing-library/react@npm:15.0.6"
+  version: 15.0.7
+  resolution: "@testing-library/react@npm:15.0.7"
   dependencies:
     "@babel/runtime": "npm:^7.12.5"
     "@testing-library/dom": "npm:^10.0.0"
@@ -3404,7 +3404,7 @@ __metadata:
   peerDependenciesMeta:
     "@types/react":
       optional: true
-  checksum: 10c0/3705a2272f929f2f848f5d7e6ac9829bf7ecc1725a35733ffae7e7a261d4bdab470b080558e8544edb1f9ba25db9fbc4232527df9b4ec6ab6ae4462a902a7f95
+  checksum: 10c0/ac8ee8968e81949ecb35f7ee34741c2c043f73dd7fee2247d56f6de6a30de4742af94f25264356863974e54387485b46c9448ecf3f6ca41cf4339011c369f2d4
   languageName: node
   linkType: hard
 

From 471728d6ddb2bbc3579adde36942cbee622a3930 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 11:10:26 +0200
Subject: [PATCH 102/215] Update DefinitelyTyped types (non-major) (#30272)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index a7f8c0a61..269ea79e8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3926,12 +3926,12 @@ __metadata:
   linkType: hard
 
 "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7":
-  version: 18.3.1
-  resolution: "@types/react@npm:18.3.1"
+  version: 18.3.2
+  resolution: "@types/react@npm:18.3.2"
   dependencies:
     "@types/prop-types": "npm:*"
     csstype: "npm:^3.0.2"
-  checksum: 10c0/18d856c12a4ec93f3cda2d58ef3d77a9480818afd3af895f812896fb82cfca1f35a692ab1add4ce826a4eb58a071624c7d1c8c6c4ccfb81c100d2916dc607614
+  checksum: 10c0/9fb2f1fcf7e889ee4ea7c3c5978df595c66e770e5fd3a245dbdd2589b9b911524c11dab25a6275d8af4e336e4cb5fa850d447884b84c335a187a338c89df99ba
   languageName: node
   linkType: hard
 
@@ -4053,9 +4053,9 @@ __metadata:
   linkType: hard
 
 "@types/webpack-env@npm:^1.18.4":
-  version: 1.18.4
-  resolution: "@types/webpack-env@npm:1.18.4"
-  checksum: 10c0/3fa77dbff0ed71685404576b0a1cf74587567fe2ee1cfd11d56d6eefcab7a61e4c9ead0eced264e289d2cf0fc74296dbd55ed6c95774fe0fd6264d156c5a59f0
+  version: 1.18.5
+  resolution: "@types/webpack-env@npm:1.18.5"
+  checksum: 10c0/b9e4876e8c7cae419896249f9ed795db283c008fe1d38efa679cbbf05194fc2eea2a5bfb4ff4393d109e3a9895416dadf5f3ddd5c22931b678062230f860454e
   languageName: node
   linkType: hard
 

From 5e7d88a85d400423bb21986a6a6dbef0d89135c5 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 09:10:53 +0000
Subject: [PATCH 103/215] Update dependency glob to v10.3.15 (#30263)

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 269ea79e8..2ddd1a642 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8885,8 +8885,8 @@ __metadata:
   linkType: hard
 
 "glob@npm:^10.2.2, glob@npm:^10.2.6, glob@npm:^10.3.10, glob@npm:^10.3.7":
-  version: 10.3.14
-  resolution: "glob@npm:10.3.14"
+  version: 10.3.15
+  resolution: "glob@npm:10.3.15"
   dependencies:
     foreground-child: "npm:^3.1.0"
     jackspeak: "npm:^2.3.6"
@@ -8895,7 +8895,7 @@ __metadata:
     path-scurry: "npm:^1.11.0"
   bin:
     glob: dist/esm/bin.mjs
-  checksum: 10c0/19126e53b99c94dea9b3509500e22b325e24d2674523fc95b9fe710f1549ad7e091fbb0704c325c53d3a172fc21a8251acce5395c4f3efd872a2e65a376c82a1
+  checksum: 10c0/cda748ddc181b31b3df9548c0991800406d5cc3b3f8110e37a8751ec1e39f37cdae7d7782d5422d7df92775121cdf00599992dff22f7ff1260344843af227c2b
   languageName: node
   linkType: hard
 

From 123108b1ccf3e516be80f92f816def1ede77ee11 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 11:11:39 +0200
Subject: [PATCH 104/215] Update dependency postcss-preset-env to v9.5.12
 (#30256)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 62 +++++++++++++++++++++++++++----------------------------
 1 file changed, 31 insertions(+), 31 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 2ddd1a642..ed5c4fb33 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1617,15 +1617,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-cascade-layers@npm:^4.0.4":
-  version: 4.0.4
-  resolution: "@csstools/postcss-cascade-layers@npm:4.0.4"
+"@csstools/postcss-cascade-layers@npm:^4.0.5":
+  version: 4.0.5
+  resolution: "@csstools/postcss-cascade-layers@npm:4.0.5"
   dependencies:
-    "@csstools/selector-specificity": "npm:^3.0.3"
+    "@csstools/selector-specificity": "npm:^3.1.0"
     postcss-selector-parser: "npm:^6.0.13"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/87fdd1e3d846e45c2e415f24f66076e04c3c4539e8b802f1114b2a0fef9421d562d9eb61464ba3599d73805555ad8e95c51a8827cb3ddacfda01ec0df4afbfe0
+  checksum: 10c0/2b6dd33b51df349dd89b12ebe3240d65accb0ba03e40288a72e26cf2307a7bdd742c42d9ff7a3f886cab19b2f8813978075f6ee61a985b0b7ceac7e2cbb29e04
   languageName: node
   linkType: hard
 
@@ -1749,15 +1749,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-is-pseudo-class@npm:^4.0.6":
-  version: 4.0.6
-  resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.6"
+"@csstools/postcss-is-pseudo-class@npm:^4.0.7":
+  version: 4.0.7
+  resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.7"
   dependencies:
-    "@csstools/selector-specificity": "npm:^3.0.3"
+    "@csstools/selector-specificity": "npm:^3.1.0"
     postcss-selector-parser: "npm:^6.0.13"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/aa071954e08dc9368fbeddbec6a8da2dea3a771b33bad53f67f3bc5a6b2f0a270909948f3e7b29ec885f4cceee245f16388809aeb0620284a1d66ad1f2026f28
+  checksum: 10c0/43668987df4608f822dbc323d3ac567fa7c192235b55933fd5d1855977ead80184512eb64a3f45a020fdd93711952ba8e9f9a280f4e981625b68a9ff074f9a01
   languageName: node
   linkType: hard
 
@@ -1983,12 +1983,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/selector-specificity@npm:^3.0.3":
-  version: 3.0.3
-  resolution: "@csstools/selector-specificity@npm:3.0.3"
+"@csstools/selector-specificity@npm:^3.0.3, @csstools/selector-specificity@npm:^3.1.0":
+  version: 3.1.0
+  resolution: "@csstools/selector-specificity@npm:3.1.0"
   peerDependencies:
     postcss-selector-parser: ^6.0.13
-  checksum: 10c0/e4f0355165882ddde8bd4a2f0252868150e67b9fae927fd2d94a91cee31e438e7041059f20b9c755a93b0bd8e527a9f78b01168fe67b3539be32091240aa63bf
+  checksum: 10c0/7f77f8377b637dcca7f7a9d6ace3329cf60f02cbd75f14241de30b1f5d00c961ec167572bc93517cdb2f106405a91119f026389a0f96dabae8dd67d1c7710e60
   languageName: node
   linkType: hard
 
@@ -6577,16 +6577,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"css-has-pseudo@npm:^6.0.3":
-  version: 6.0.3
-  resolution: "css-has-pseudo@npm:6.0.3"
+"css-has-pseudo@npm:^6.0.4":
+  version: 6.0.4
+  resolution: "css-has-pseudo@npm:6.0.4"
   dependencies:
-    "@csstools/selector-specificity": "npm:^3.0.3"
+    "@csstools/selector-specificity": "npm:^3.1.0"
     postcss-selector-parser: "npm:^6.0.13"
     postcss-value-parser: "npm:^4.2.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/bbe663eff5256233c7bcce256cd8de7d93d82f2d4f2ca104af8e39e2159170d67746d3a2954385d03ec4ea7ef2728fe9a7d8cb62c52c0a6df1ad3d3bb1e3439d
+  checksum: 10c0/e9d440de483e15092ebaadb483502243f43e0457d4214c8012ebdba7a959e74d40714254bf97247780e65735512f248a55feda0b3975d9a5eaea9c746f7518f0
   languageName: node
   linkType: hard
 
@@ -13548,16 +13548,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss-nesting@npm:^12.1.2":
-  version: 12.1.2
-  resolution: "postcss-nesting@npm:12.1.2"
+"postcss-nesting@npm:^12.1.3":
+  version: 12.1.3
+  resolution: "postcss-nesting@npm:12.1.3"
   dependencies:
     "@csstools/selector-resolve-nested": "npm:^1.1.0"
-    "@csstools/selector-specificity": "npm:^3.0.3"
+    "@csstools/selector-specificity": "npm:^3.1.0"
     postcss-selector-parser: "npm:^6.0.13"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/39d1d100f61863f904393b17169be83cdf82bd50d530efb3e3ae0c7b0f838b254e10e5d12e25119cf31dce9e351a2b770a03f9b2029ff33bef0ec924c0d2f642
+  checksum: 10c0/6b2d3a4823e85592965c6c11f749c5357703256e7334388147d6a3bb72a3abbe47789afaa8535bdd7a9bd6d0099eb12ffec6c154050d8e8b8286b1adbed5b397
   languageName: node
   linkType: hard
 
@@ -13712,10 +13712,10 @@ __metadata:
   linkType: hard
 
 "postcss-preset-env@npm:^9.5.2":
-  version: 9.5.11
-  resolution: "postcss-preset-env@npm:9.5.11"
+  version: 9.5.12
+  resolution: "postcss-preset-env@npm:9.5.12"
   dependencies:
-    "@csstools/postcss-cascade-layers": "npm:^4.0.4"
+    "@csstools/postcss-cascade-layers": "npm:^4.0.5"
     "@csstools/postcss-color-function": "npm:^3.0.16"
     "@csstools/postcss-color-mix-function": "npm:^2.0.16"
     "@csstools/postcss-exponential-functions": "npm:^1.0.7"
@@ -13725,7 +13725,7 @@ __metadata:
     "@csstools/postcss-hwb-function": "npm:^3.0.15"
     "@csstools/postcss-ic-unit": "npm:^3.0.6"
     "@csstools/postcss-initial": "npm:^1.0.1"
-    "@csstools/postcss-is-pseudo-class": "npm:^4.0.6"
+    "@csstools/postcss-is-pseudo-class": "npm:^4.0.7"
     "@csstools/postcss-light-dark-function": "npm:^1.0.5"
     "@csstools/postcss-logical-float-and-clear": "npm:^2.0.1"
     "@csstools/postcss-logical-overflow": "npm:^1.0.1"
@@ -13747,7 +13747,7 @@ __metadata:
     autoprefixer: "npm:^10.4.19"
     browserslist: "npm:^4.22.3"
     css-blank-pseudo: "npm:^6.0.2"
-    css-has-pseudo: "npm:^6.0.3"
+    css-has-pseudo: "npm:^6.0.4"
     css-prefers-color-scheme: "npm:^9.0.1"
     cssdb: "npm:^8.0.0"
     postcss-attribute-case-insensitive: "npm:^6.0.3"
@@ -13767,7 +13767,7 @@ __metadata:
     postcss-image-set-function: "npm:^6.0.3"
     postcss-lab-function: "npm:^6.0.16"
     postcss-logical: "npm:^7.0.1"
-    postcss-nesting: "npm:^12.1.2"
+    postcss-nesting: "npm:^12.1.3"
     postcss-opacity-percentage: "npm:^2.0.0"
     postcss-overflow-shorthand: "npm:^5.0.1"
     postcss-page-break: "npm:^3.0.4"
@@ -13777,7 +13777,7 @@ __metadata:
     postcss-selector-not: "npm:^7.0.2"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/9460f4ce18cf1af7582d0a1f366151f59b6e9b0c7cbb62e59081dc91da14760a749f59fa52bc190e5e2c8fd531952c647719d19c4740aa1a0ebcb93f075ad931
+  checksum: 10c0/3e0276b2061baa396547f9c0090fcb0c6149d3735c7aefa99a8e520701aae0b7265578b59d5e4efa9f5e61659c161e39590a5d63bac49469b99da1c549b63231
   languageName: node
   linkType: hard
 

From f66c9faca02018a3aa6140506a15d685b89dfed2 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 11:11:55 +0200
Subject: [PATCH 105/215] Update dependency sass to v1.77.1 (#30252)

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 ed5c4fb33..f2d290653 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15323,15 +15323,15 @@ __metadata:
   linkType: hard
 
 "sass@npm:^1.62.1":
-  version: 1.77.0
-  resolution: "sass@npm:1.77.0"
+  version: 1.77.1
+  resolution: "sass@npm:1.77.1"
   dependencies:
     chokidar: "npm:>=3.0.0 <4.0.0"
     immutable: "npm:^4.0.0"
     source-map-js: "npm:>=0.6.2 <2.0.0"
   bin:
     sass: sass.js
-  checksum: 10c0/bce0e5f5b535491e4e775045a79f19cbe10d800ef53b5f7698958d2992505d7b124c968169b05a0190842d8e0a24c2aa6d75dfbdd7c213820d9d59e227009c19
+  checksum: 10c0/edcfc7d038234b1198c3ddcac5963fcd1e17a9c1ee0f9bd09784ab5353b60ff50b189b4c9154b34f5da9ca0eaab8b189fd3e83a4b43a494151ad4735f8e5f364
   languageName: node
   linkType: hard
 

From cb93c1edf08865b1ac528a9a4cb747dab3d57e8d Mon Sep 17 00:00:00 2001
From: David Lapshin <ddaudix@gmail.com>
Date: Mon, 13 May 2024 12:19:42 +0300
Subject: [PATCH 106/215] Add active animation to header settings button
 (#30221)

---
 app/javascript/styles/mastodon/components.scss | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 12c987a02..927c57d99 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -4365,12 +4365,20 @@ a.status-card {
     outline: $ui-button-focus-outline;
   }
 
+  .no-reduce-motion .icon {
+    transition: transform 0.15s ease-in-out;
+  }
+
   &.active {
     color: $primary-text-color;
 
     &:hover {
       color: $primary-text-color;
     }
+
+    .icon {
+      transform: rotate(60deg);
+    }
   }
 
   &:disabled {

From c66fdb3dff7f9313ff610a6b6e97ee22e3b3c7e1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 11:39:06 +0200
Subject: [PATCH 107/215] Update dependency immutable to v4.3.6 (#30276)

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 f2d290653..f6dc8f161 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9495,9 +9495,9 @@ __metadata:
   linkType: hard
 
 "immutable@npm:^4.0.0, immutable@npm:^4.0.0-rc.1, immutable@npm:^4.3.0":
-  version: 4.3.5
-  resolution: "immutable@npm:4.3.5"
-  checksum: 10c0/63d2d7908241a955d18c7822fd2215b6e89ff5a1a33cc72cd475b013cbbdef7a705aa5170a51ce9f84a57f62fdddfaa34e7b5a14b33d8a43c65cc6a881d6e894
+  version: 4.3.6
+  resolution: "immutable@npm:4.3.6"
+  checksum: 10c0/7d0952a768b4fadcee47230ed86dc9505a4517095eceaf5a47e65288571c42400c6e4a2ae21eca4eda957cb7bc50720213135b62cf6a181639111f8acae128c3
   languageName: node
   linkType: hard
 

From b429c9b8a7848097a1c86edda465629a11267696 Mon Sep 17 00:00:00 2001
From: Jeen Broekstra <jeen@fastmail.com>
Date: Mon, 13 May 2024 21:40:14 +1200
Subject: [PATCH 108/215] fix(bin/dev): makes conditional for launching
 overmind POSIX-compliant (#30271)

---
 bin/dev | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bin/dev b/bin/dev
index 9b1d3ac6f..0911bae55 100755
--- a/bin/dev
+++ b/bin/dev
@@ -6,7 +6,7 @@ export PORT="${PORT:-3000}"
 # Get around our boot.rb ENV check
 export RAILS_ENV="${RAILS_ENV:-development}"
 
-if command -v overmind &> /dev/null
+if command -v overmind 1> /dev/null 2>&1
 then
   overmind start -f Procfile.dev "$@"
   exit $?

From 6e1b8b33f55de9fdfcd4ce3a8fcc965c1b5c6601 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 11:42:08 +0200
Subject: [PATCH 109/215] Update opentelemetry-ruby (non-major) (#30262)

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 3f4b1088a..efc99eb23 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -543,7 +543,7 @@ GEM
       opentelemetry-api (~> 1.0)
       opentelemetry-common (~> 0.20.0)
       opentelemetry-instrumentation-base (~> 0.22.1)
-    opentelemetry-instrumentation-pg (0.27.2)
+    opentelemetry-instrumentation-pg (0.27.3)
       opentelemetry-api (~> 1.0)
       opentelemetry-helpers-sql-obfuscation
       opentelemetry-instrumentation-base (~> 0.22.1)

From 9ec7c1f89256cf3c658a67c3cf8b956fd4dab265 Mon Sep 17 00:00:00 2001
From: Nick Schonning <nschonni@gmail.com>
Date: Mon, 13 May 2024 05:42:47 -0400
Subject: [PATCH 110/215] Fix i18n:extract flags (#30261)

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index d88488333..79544229d 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
     "fix": "yarn fix:js && yarn fix:css",
     "format": "prettier --write --log-level warn .",
     "format:check": "prettier --check --ignore-unknown .",
-    "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' '--ignore=**/*.d.ts' --out-file app/javascript/mastodon/locales/en.json --format config/formatjs-formatter.js",
+    "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' --ignore '**/*.d.ts' --out-file app/javascript/mastodon/locales/en.json --format config/formatjs-formatter.js",
     "jest": "cross-env NODE_ENV=test jest",
     "lint:js": "eslint . --ext=.js,.jsx,.ts,.tsx --cache --report-unused-disable-directives",
     "lint:css": "stylelint \"**/*.{css,scss}\"",

From 13fb54920b1c1e8dd59798dd9fc3466c5a446898 Mon Sep 17 00:00:00 2001
From: Nick Schonning <nschonni@gmail.com>
Date: Mon, 13 May 2024 05:54:15 -0400
Subject: [PATCH 111/215] Enable Style/IfUnlessModifier RuboCop (#30260)

---
 .rubocop_todo.yml                 | 9 +--------
 config/environments/production.rb | 4 +---
 config/initializers/devise.rb     | 4 +---
 3 files changed, 3 insertions(+), 14 deletions(-)

diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 91e666d7f..b47d682f3 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1,6 +1,6 @@
 # This configuration was generated by
 # `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
-# using RuboCop version 1.62.1.
+# using RuboCop version 1.63.5.
 # The point is for the user to remove these configuration records
 # one by one as the offenses are removed from the code base.
 # Note that changes in the inspected code, or installation of new
@@ -122,13 +122,6 @@ Style/HashTransformValues:
     - 'app/serializers/rest/web_push_subscription_serializer.rb'
     - 'app/services/import_service.rb'
 
-# This cop supports safe autocorrection (--autocorrect).
-Style/IfUnlessModifier:
-  Exclude:
-    - 'config/environments/production.rb'
-    - 'config/initializers/devise.rb'
-    - 'config/initializers/ffmpeg.rb'
-
 # This cop supports unsafe autocorrection (--autocorrect-all).
 Style/MapToHash:
   Exclude:
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 6b1101ea1..a39843e95 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -86,9 +86,7 @@ Rails.application.configure do
   config.lograge.enabled = true
 
   config.lograge.custom_payload do |controller|
-    if controller.respond_to?(:signed_request?) && controller.signed_request?
-      { key: controller.signature_key_id }
-    end
+    { key: controller.signature_key_id } if controller.respond_to?(:signed_request?) && controller.signed_request?
   end
 
   # Use a different logger for distributed setups.
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index a95c7437f..5c88c4cd5 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -79,9 +79,7 @@ module Devise
           return pass
         end
 
-        if validate(resource)
-          success!(resource)
-        end
+        success!(resource) if validate(resource)
       end
 
       private

From 3a7aec2807089a004db90851c66db0a007a18a48 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 13 May 2024 13:30:41 +0200
Subject: [PATCH 112/215] New Crowdin Translations (automated) (#30254)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/cy.json    |   1 -
 app/javascript/mastodon/locales/es-MX.json |   6 +-
 app/javascript/mastodon/locales/es.json    |   6 +-
 app/javascript/mastodon/locales/fo.json    |   4 +-
 app/javascript/mastodon/locales/gl.json    |   1 -
 app/javascript/mastodon/locales/ia.json    |   2 +-
 app/javascript/mastodon/locales/ie.json    |   4 +
 app/javascript/mastodon/locales/ja.json    |   2 +-
 app/javascript/mastodon/locales/lt.json    |   5 +-
 app/javascript/mastodon/locales/pt-BR.json |   1 -
 app/javascript/mastodon/locales/sl.json    |   1 -
 app/javascript/mastodon/locales/sq.json    |   2 +-
 app/javascript/mastodon/locales/sv.json    |   2 +-
 app/javascript/mastodon/locales/vi.json    |   2 +-
 app/javascript/mastodon/locales/zh-HK.json |   1 -
 config/locales/doorkeeper.vi.yml           |   4 +-
 config/locales/fo.yml                      |   4 +-
 config/locales/ia.yml                      | 106 +++++++++++++++++++++
 config/locales/ie.yml                      |   3 +
 config/locales/lt.yml                      |  53 ++++++++++-
 config/locales/simple_form.cs.yml          |   2 +
 config/locales/simple_form.es-MX.yml       |   2 +
 config/locales/simple_form.es.yml          |   2 +
 config/locales/simple_form.ie.yml          |   6 ++
 config/locales/simple_form.ja.yml          |   2 +
 config/locales/simple_form.ko.yml          |   3 +
 config/locales/simple_form.lt.yml          |   5 +
 config/locales/th.yml                      |   3 +
 28 files changed, 208 insertions(+), 27 deletions(-)

diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index fd8fc74be..925b7710e 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -474,7 +474,6 @@
   "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
   "notification.mention": "Crybwyllodd {name} amdanoch chi",
   "notification.moderation-warning.learn_more": "Dysgu mwy",
-  "notification.moderation_warning": "Rydych wedi derbyn rhybudd cymedroli",
   "notification.moderation_warning.action_delete_statuses": "Mae rhai o'ch postiadau wedi'u dileu.",
   "notification.moderation_warning.action_disable": "Mae eich cyfrif wedi'i analluogi.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Mae rhai o'ch postiadau wedi'u marcio'n sensitif.",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index b529f48eb..1a99d1d4b 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -476,12 +476,12 @@
   "notification.moderation-warning.learn_more": "Saber más",
   "notification.moderation_warning": "Has recibido una advertencia de moderación",
   "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",
-  "notification.moderation_warning.action_disable": "Se ha desactivado su cuenta.",
+  "notification.moderation_warning.action_disable": "Tu cuenta ha sido desactivada.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.",
   "notification.moderation_warning.action_none": "Tu cuenta ha recibido un aviso de moderación.",
   "notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.",
-  "notification.moderation_warning.action_silence": "Se ha limitado tu cuenta.",
-  "notification.moderation_warning.action_suspend": "Se ha suspendido tu cuenta.",
+  "notification.moderation_warning.action_silence": "Tu cuenta ha sido limitada.",
+  "notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.",
   "notification.own_poll": "Tu encuesta ha terminado",
   "notification.poll": "Una encuesta en la que has votado ha terminado",
   "notification.reblog": "{name} ha retooteado tu estado",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index ed01a3337..1782a3a1f 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -476,12 +476,12 @@
   "notification.moderation-warning.learn_more": "Saber más",
   "notification.moderation_warning": "Has recibido una advertencia de moderación",
   "notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",
-  "notification.moderation_warning.action_disable": "Se ha desactivado su cuenta.",
+  "notification.moderation_warning.action_disable": "Tu cuenta ha sido desactivada.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Se han marcado como sensibles algunas de tus publicaciones.",
   "notification.moderation_warning.action_none": "Tu cuenta ha recibido un aviso de moderación.",
   "notification.moderation_warning.action_sensitive": "De ahora en adelante, todas tus publicaciones se marcarán como sensibles.",
-  "notification.moderation_warning.action_silence": "Se ha limitado tu cuenta.",
-  "notification.moderation_warning.action_suspend": "Se ha suspendido tu cuenta.",
+  "notification.moderation_warning.action_silence": "Tu cuenta ha sido limitada.",
+  "notification.moderation_warning.action_suspend": "Tu cuenta ha sido suspendida.",
   "notification.own_poll": "Tu encuesta ha terminado",
   "notification.poll": "Una encuesta en la que has votado ha terminado",
   "notification.reblog": "{name} ha impulsado tu publicación",
diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json
index 77257413f..f22a829c0 100644
--- a/app/javascript/mastodon/locales/fo.json
+++ b/app/javascript/mastodon/locales/fo.json
@@ -474,11 +474,11 @@
   "notification.follow_request": "{name} biður um at fylgja tær",
   "notification.mention": "{name} nevndi teg",
   "notification.moderation-warning.learn_more": "Lær meira",
-  "notification.moderation_warning": "Tú hevur móttikið eina umsjónarávarðing",
+  "notification.moderation_warning": "Tú hevur móttikið eina umsjónarávaring",
   "notification.moderation_warning.action_delete_statuses": "Onkrir av tínum postum eru strikaðir.",
   "notification.moderation_warning.action_disable": "Konta tín er gjørd óvirkin.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nakrir av postum tínum eru merktir sum viðkvæmir.",
-  "notification.moderation_warning.action_none": "Konta tín hevur móttikið eina umsjónarávarðing.",
+  "notification.moderation_warning.action_none": "Konta tín hevur móttikið eina umsjónarávaring.",
   "notification.moderation_warning.action_sensitive": "Postar tínir verða merktir sum viðkvæmir frá nú av.",
   "notification.moderation_warning.action_silence": "Konta tín er avmarkað.",
   "notification.moderation_warning.action_suspend": "Konta tín er ógildað.",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 88d4f5f60..b2a50ebb8 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -474,7 +474,6 @@
   "notification.follow_request": "{name} solicitou seguirte",
   "notification.mention": "{name} mencionoute",
   "notification.moderation-warning.learn_more": "Saber máis",
-  "notification.moderation_warning": "Recibiches unha advertencia da moderación",
   "notification.moderation_warning.action_delete_statuses": "Algunha das túas publicacións foron eliminadas.",
   "notification.moderation_warning.action_disable": "A túa conta foi desactivada.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algunha das túas publicacións foron marcadas como sensibles.",
diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index d30038d9c..313563bdf 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -474,7 +474,7 @@
   "notification.follow_request": "{name} ha requestate de sequer te",
   "notification.mention": "{name} te ha mentionate",
   "notification.moderation-warning.learn_more": "Apprender plus",
-  "notification.moderation_warning": "Tu ha recipite un advertimento de moderation",
+  "notification.moderation_warning": "Tu ha recepite un aviso de moderation",
   "notification.moderation_warning.action_delete_statuses": "Alcunes de tu messages ha essite removite.",
   "notification.moderation_warning.action_disable": "Tu conto ha essite disactivate.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Alcunes de tu messages ha essite marcate como sensibile.",
diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json
index 7bd91ca0f..192150947 100644
--- a/app/javascript/mastodon/locales/ie.json
+++ b/app/javascript/mastodon/locales/ie.json
@@ -89,6 +89,7 @@
   "announcement.announcement": "Proclamation",
   "attachments_list.unprocessed": "(íntractat)",
   "audio.hide": "Celar audio",
+  "block_modal.remote_users_caveat": "Noi va petir que li servitor {domain} mey respecter tui decision. Támen, obedientie ne es garantit pro que chascun servitor gere bloccas diferentmen. Possibilmen public postas va restar visibil a usatores de inloggat.",
   "block_modal.show_less": "Monstrar minu",
   "block_modal.show_more": "Monstrar plu",
   "block_modal.they_cant_mention": "Ne posse mentionar ni sequer te.",
@@ -224,7 +225,10 @@
   "domain_pill.their_username": "Su unic identificator sur su servitor. It es possibil que altri servitores va haver usatores con li sam nómine.",
   "domain_pill.username": "Usator-nómine",
   "domain_pill.whats_in_a_handle": "Ex quo consiste un identificator?",
+  "domain_pill.who_they_are": "Pro que identificatores informa qui e u un person is, tu posse interacter con persones tra li rete social de <button>ActivityPub-usant platformes</button>.",
+  "domain_pill.who_you_are": "Pro que tui identificator informa qui e u tu es, persones posse interacter con te tra li rete social de <button>ActivityPub-usant platformes</button>.",
   "domain_pill.your_handle": "Tui identificator:",
+  "domain_pill.your_server": "Tui digital hem, u trova se omni tui postas. Si it ne plese te, tu posse transferer ad un altri servitor quandecunc e tui sequitores con te.",
   "domain_pill.your_username": "Tui unic identificator sur ti-ci servitor. It es possibil que altri servitores va haver usatores con li sam nómine.",
   "embed.instructions": "Inbedar ti-ci posta per copiar li code in infra.",
   "embed.preview": "Vi qualmen it va aspecter:",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 6e590678f..eea06fff5 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -474,7 +474,7 @@
   "notification.follow_request": "{name}さんがあなたにフォローリクエストしました",
   "notification.mention": "{name}さんがあなたに返信しました",
   "notification.moderation-warning.learn_more": "さらに詳しく",
-  "notification.moderation_warning": "あなたは管理者からの警告を受けています。",
+  "notification.moderation_warning": "管理者から警告が来ています",
   "notification.moderation_warning.action_delete_statuses": "あなたによるいくつかの投稿が削除されました。",
   "notification.moderation_warning.action_disable": "あなたのアカウントは無効になりました。",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "あなたの投稿のいくつかは閲覧注意として判定されています。",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 798b24569..0f42e97fc 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -256,7 +256,7 @@
   "empty_column.community": "Vietinė laiko skalė yra tuščia. Parašyk ką nors viešai, kad pradėtum sąveikauti.",
   "empty_column.direct": "Dar neturi jokių privačių paminėjimų. Kai išsiųsi arba gausi vieną iš jų, jis bus rodomas čia.",
   "empty_column.domain_blocks": "Dar nėra užblokuotų domenų.",
-  "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrink vėliau.",
+  "empty_column.explore_statuses": "Šiuo metu niekas nėra tendencinga. Patikrink vėliau!",
   "empty_column.favourited_statuses": "Dar neturi mėgstamų įrašų. Kai vieną iš jų pamėgsi, jis bus rodomas čia.",
   "empty_column.favourites": "Šio įrašo dar niekas nepamėgo. Kai kas nors tai padarys, jie bus rodomi čia.",
   "empty_column.follow_requests": "Dar neturi jokių sekimo prašymų. Kai gausi tokį prašymą, jis bus rodomas čia.",
@@ -466,7 +466,6 @@
   "notification.follow_request": "{name} paprašė tave sekti",
   "notification.mention": "{name} paminėjo tave",
   "notification.moderation-warning.learn_more": "Sužinoti daugiau",
-  "notification.moderation_warning": "Gavai prižiūrėjimo įspėjimą",
   "notification.moderation_warning.action_delete_statuses": "Kai kurie tavo įrašai buvo pašalintos.",
   "notification.moderation_warning.action_disable": "Tavo paskyra buvo išjungta.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Kai kurie tavo įrašai buvo pažymėtos kaip jautrios.",
@@ -536,7 +535,7 @@
   "onboarding.follows.lead": "Tavo pagrindinis srautas – pagrindinis būdas patirti Mastodon. Kuo daugiau žmonių seksi, tuo jis bus aktyvesnis ir įdomesnis. Norint pradėti, pateikiame keletą pasiūlymų:",
   "onboarding.follows.title": "Suasmenink savo pagrindinį srautą",
   "onboarding.profile.discoverable": "Padaryti mano profilį atrandamą",
-  "onboarding.profile.discoverable_hint": "Kai pasirenki Mastodon atrandamumą, tavo įrašai gali būti rodomi paieškos rezultatuose ir tendencijose, o profilis gali būti siūlomas panašių pomėgių turintiems žmonėms.",
+  "onboarding.profile.discoverable_hint": "Kai sutinki su Mastodon atrandamumu, tavo įrašai gali būti rodomi paieškos rezultatuose ir tendencijose, o profilis gali būti siūlomas panašių pomėgių turintiems žmonėms.",
   "onboarding.profile.display_name": "Rodomas vardas",
   "onboarding.profile.display_name_hint": "Tavo pilnas vardas arba linksmas vardas…",
   "onboarding.profile.lead": "Gali visada tai užbaigti vėliau nustatymuose, kur yra dar daugiau pritaikymo parinkčių.",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index b11daeaaa..1a6de0835 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -474,7 +474,6 @@
   "notification.follow_request": "{name} quer te seguir",
   "notification.mention": "{name} te mencionou",
   "notification.moderation-warning.learn_more": "Aprender mais",
-  "notification.moderation_warning": "Você recebeu um aviso de moderação",
   "notification.moderation_warning.action_delete_statuses": "Algumas das suas publicações foram removidas.",
   "notification.moderation_warning.action_disable": "Sua conta foi desativada.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algumas de suas publicações foram marcadas por ter conteúdo sensível.",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 7806abc6b..459d05ce3 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -474,7 +474,6 @@
   "notification.follow_request": "{name} vam želi slediti",
   "notification.mention": "{name} vas je omenil/a",
   "notification.moderation-warning.learn_more": "Več o tem",
-  "notification.moderation_warning": "Prejeli ste opozorilo moderatorjev",
   "notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.",
   "notification.moderation_warning.action_disable": "Vaš račun je bil onemogočen.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nekatere vaše objave so bile označene kot občutljive.",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index a25eab9cb..b496f8e20 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -474,7 +474,7 @@
   "notification.follow_request": "{name} ka kërkuar t’ju ndjekë",
   "notification.mention": "{name} ju ka përmendur",
   "notification.moderation-warning.learn_more": "Mësoni më tepër",
-  "notification.moderation_warning": "Keni marrë një sinjalizim moderimi",
+  "notification.moderation_warning": "Ju është dhënë një sinjalizim moderimi",
   "notification.moderation_warning.action_delete_statuses": "Disa nga postimet tuaja janë hequr.",
   "notification.moderation_warning.action_disable": "Llogaria juaj është çaktivizuar.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Disa prej postimeve tuaja u është vënë shenjë si me spec.",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 5ac4b4648..ba3a6b2f5 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -474,7 +474,7 @@
   "notification.follow_request": "{name} har begärt att följa dig",
   "notification.mention": "{name} nämnde dig",
   "notification.moderation-warning.learn_more": "Läs mer",
-  "notification.moderation_warning": "Du har mottagit en modereringsvarning",
+  "notification.moderation_warning": "Du har fått en moderationsvarning",
   "notification.moderation_warning.action_delete_statuses": "Några av dina inlägg har tagits bort.",
   "notification.moderation_warning.action_disable": "Ditt konto har inaktiverats.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Några av dina inlägg har markerats som känsliga.",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index b188488f0..102f1c3b4 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -474,7 +474,7 @@
   "notification.follow_request": "{name} yêu cầu theo dõi bạn",
   "notification.mention": "{name} nhắc đến bạn",
   "notification.moderation-warning.learn_more": "Tìm hiểu",
-  "notification.moderation_warning": "Bạn đã nhận một cảnh báo kiểm duyệt",
+  "notification.moderation_warning": "Bạn vừa nhận một cảnh báo kiểm duyệt",
   "notification.moderation_warning.action_delete_statuses": "Một vài tút của bạn bị gỡ.",
   "notification.moderation_warning.action_disable": "Tài khoản của bạn đã bị vô hiệu hóa.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Vài tút bạn bị đánh dấu nhạy cảm.",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 6b08e4028..eaa5dabe9 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -474,7 +474,6 @@
   "notification.follow_request": "{name} 要求追蹤你",
   "notification.mention": "{name} 提及你",
   "notification.moderation-warning.learn_more": "了解更多",
-  "notification.moderation_warning": "你收到一則審核警告",
   "notification.moderation_warning.action_delete_statuses": "你的部份帖文已被刪除。",
   "notification.moderation_warning.action_disable": "你的帳號已被停用。",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "你某些帖文已被標記為敏感內容。",
diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml
index 84684d24c..624db9aff 100644
--- a/config/locales/doorkeeper.vi.yml
+++ b/config/locales/doorkeeper.vi.yml
@@ -61,7 +61,7 @@ vi:
         title: Một lỗi đã xảy ra
       new:
         prompt_html: "%{client_name} yêu cầu truy cập tài khoản của bạn. Đây là ứng dụng của bên thứ ba. <strong>Nếu không tin tưởng, đừng cho phép nó.</strong>"
-        review_permissions: Xem lại quyền cho phép
+        review_permissions: Quyền truy cập
         title: Yêu cầu truy cập
       show:
         title: Sao chép mã này và dán nó vào ứng dụng.
@@ -122,7 +122,7 @@ vi:
         admin/accounts: Quản trị tài khoản
         admin/all: Mọi chức năng quản trị
         admin/reports: Quản trị báo cáo
-        all: Toàn quyền truy cập vào tài khoản Mastodon của bạn
+        all: Toàn quyền truy cập tài khoản Mastodon
         blocks: Chặn
         bookmarks: Tút đã lưu
         conversations: Thảo luận
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index 15c9c7dc0..f7303c512 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -235,7 +235,7 @@ fo:
         change_email_user_html: "%{name} broytti teldupost addressuna hjá %{target}"
         change_role_user_html: "%{name} broytti leiklutin hjá %{target}"
         confirm_user_html: "%{name} góðtók teldupost addressuna hjá %{target}"
-        create_account_warning_html: "%{name} sendi eina ávarðing til %{target}"
+        create_account_warning_html: "%{name} sendi eina ávaring til %{target}"
         create_announcement_html: "%{name} stovnaði eina fráboðan %{target}"
         create_canonical_email_block_html: "%{name} forðaði telduposti við hash'inum %{target}"
         create_custom_emoji_html: "%{name} legði upp nýtt kenslutekn %{target}"
@@ -1835,7 +1835,7 @@ fo:
         delete_statuses: Summir av postum tínum eru staðfestir at vera í stríði við eina ella fleiri av leiðreglunum og eru tí strikaðir av umsjónarfólkunum á %{instance}.
         disable: Tú kanst ikki longur brúka tína kontu, men vangi tín og aðrar dátur eru óskalað. Tú kanst biðja um trygdaravrit av tínum dátum, broyta kontustillingar ella strika tína kontu.
         mark_statuses_as_sensitive: Summir av postum tínum eru merktir sum viðkvæmir av umsjónarfólkunum á %{instance}. Hetta merkir, at fólk mugu trýsta á miðilin í postinum, áðrenn ein undanvísing verður víst. Tú kanst sjálv/ur merkja miðlar viðkvæmar, tá tú postar í framtíðini.
-        sensitive: Frá nú av, so verða allar miðlafílur, sum tú leggur upp, merktar sum viðkvæmar og fjaldar aftan fyri eina ávarðing.
+        sensitive: Frá nú av, so verða allar miðlafílur, sum tú leggur upp, merktar sum viðkvæmar og fjaldar aftan fyri eina ávaring.
         silence: Tú kanst framvegis brúka kontu tína, men einans fólk, sum longu fylgja tær, fara at síggja tínar postar á hesum ambætaranum, og tú kanst vera hildin uttanfyri ymiskar leitihentleikar. Tó so, onnur kunnu framvegis fylgja tær beinleiðis.
         suspend: Tú kanst ikki longur brúka kontu tína og vangin og aðrar dátur eru ikki longur atkomulig. Tú kanst enn rita inn fyri at biðja um eitt trygdaravrit av tínum dátum, inntil dáturnar eru heilt burturbeindar um umleið 30 dagar, men vit varðveita nakrar grundleggjandi dátur fyri at forða tær í at støkka undan ógildingini.
       reason: 'Grund:'
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 712328deb..46cdcd3c6 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -350,6 +350,18 @@ ia:
       media_storage: Immagazinage de medios
       new_users: nove usatores
       opened_reports: reportos aperte
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> appello pendente"
+        other: "<strong>%{count}</strong> appellos pendente"
+      pending_reports_html:
+        one: "<strong>%{count}</strong> reporto pendente"
+        other: "<strong>%{count}</strong> reportos pendente"
+      pending_tags_html:
+        one: "<strong>%{count}</strong> hashtag pendente"
+        other: "<strong>%{count}</strong> hashtags pendente"
+      pending_users_html:
+        one: "<strong>%{count}</strong> usator pendente"
+        other: "<strong>%{count}</strong> usatores pendente"
       resolved_reports: reportos resolvite
       software: Software
       sources: Fontes de inscription
@@ -972,21 +984,40 @@ ia:
         silence: pro limitar lor conto
         suspend: pro suspender lor conto
       body: "%{target} appella un decision de moderation per %{action_taken_by} ab le %{date}, que era %{type}. Ille scribeva:"
+      next_steps: Tu pote approbar le appello a disfacer le decision de moderation, o ignorar lo.
+      subject: "%{username} appella un decision de moderation sur %{instance}"
     new_critical_software_updates:
+      body: Nove versiones critic de Mastodon ha essite publicate, tu poterea voler actualisar al plus tosto possibile!
       subject: Actualisationes critic de Mastodon es disponibile pro %{instance}!
+    new_pending_account:
+      body: Le detalios del nove conto es infra.
+      subject: Nove conto preste a revider sur %{instance} (%{username})
+    new_report:
+      body: "%{reporter} ha reportate %{target}"
+      body_remote: Alcuno de %{domain} ha reportate %{target}
+      subject: Nove reporto pro %{instance} (#%{id})
     new_software_updates:
       subject: Nove versiones de Mastodon es disponibile pro %{instance}!
     new_trends:
+      body: 'Le sequente elementos besoniar de un recension ante que illos pote esser monstrate publicamente:'
       new_trending_links:
         title: Ligamines de tendentia
       new_trending_statuses:
         title: Messages de tendentia
       new_trending_tags:
         title: Hashtags de tendentia
+      subject: Nove tendentias pro recenser sur %{instance}
   aliases:
     add_new: Crear alias
+    created_msg: Create con successo un nove alias. Ora tu pote initiar le motion ab le vetere conto.
+    deleted_msg: Removite con successo le alias. Mover de ille conto a isto non sera plus possibile.
+    empty: Tu non ha aliases.
+    hint_html: Si tu desira mover ab un altere conto a isto, ci tu pote crear un alias, que es requirite ante que tu pote continuar con mover sequaces ab le vetere conto a isto. Iste action per se mesme es <strong>innocue e reversibile</strong>. <strong>Le migration de conto es initiate ab le vetere conto</strong>.
+    remove: Disligar alias
   appearance:
     advanced_web_interface: Interfacie web avantiate
+    advanced_web_interface_hint: 'Si tu desira facer uso de tu integre largessa de schermo, le interfacie web avantiate te permitte de configurar plure columnas differente pro vider al mesme tempore tante informationes como tu vole: pagina principal, notificationes, chronogramma federate, ulle numero de listas e hashtags.'
+    animations_and_accessibility: Animationes e accessibilitate
     confirmation_dialogs: Dialogos de confirmation
     discovery: Discoperta
     localization:
@@ -1013,6 +1044,7 @@ ia:
   auth:
     apply_for_account: Peter un conto
     captcha_confirmation:
+      help_html: Si tu ha problemas a solver le CAPTCHA, tu pote contactar nos per %{email} e nos pote assister te.
       hint_html: Justo un altere cosa! Nos debe confirmar que tu es un human (isto es assi proque nos pote mantener foras le spam!). Solve le CAPTCHA infra e clicca "Continuar".
       title: Controlo de securitate
     confirmations:
@@ -1054,6 +1086,7 @@ ia:
     status:
       account_status: Stato del conto
       view_strikes: Examinar le admonitiones passate contra tu conto
+    use_security_key: Usar clave de securitate
   challenge:
     confirm: Continuar
     invalid_password: Contrasigno non valide
@@ -1066,13 +1099,22 @@ ia:
       x_days: "%{count}d"
       x_minutes: "%{count} m"
   deletes:
+    challenge_not_passed: Le informationes que tu ha inserite non era correcte
     confirm_password: Insere tu contrasigno actual pro verificar tu identitate
+    confirm_username: Insere tu actual contrasigno pro verificar tu identitate
     proceed: Deler le conto
     success_msg: Tu conto esseva delite con successo
     warning:
+      before: 'Insere tu nomine de usator pro confirmar le procedura:'
+      caches: Contente que ha essite in cache per altere servitores pote persister
       data_removal: Tu messages e altere datos essera removite permanentemente
       email_change_html: Tu pote <a href="%{path}">cambiar tu adresse de e-mail</a> sin deler tu conto
+      email_contact_html: Si illo ancora non arriva, tu pote inviar email a <a href="mailto:%{email}">%{email}</a> pro peter adjuta
+      email_reconfirmation_html: Si tu non recipe le email de confirmation, tu pote <a href="%{path}>requirer lo ancora</a>
+      irreversible: Tu non potera restaurar o reactivar tu conto
+      more_details_html: Pro altere detalios, vide le <a href="%{terms_path}">politica de confidentialitate</a>.
       username_available: Tu nomine de usator essera disponibile novemente
+      username_unavailable: Tu nomine de usator remanera indisponibile
   disputes:
     strikes:
       action_taken: Action prendite
@@ -1103,24 +1145,41 @@ ia:
       your_appeal_approved: Tu appello ha essite approbate
       your_appeal_pending: Tu ha submittite un appello
       your_appeal_rejected: Tu appello ha essite rejectate
+  domain_validator:
+    invalid_domain: non es un nomine de dominio valide
   edit_profile:
     basic_information: Information basic
     other: Alteres
   errors:
+    '400': Le requesta que tu inviava era non valide o mal formate.
+    '403': Tu non ha le permisso pro acceder a iste pagina.
+    '404': Le pagina que tu cerca non es ci.
+    '406': Iste pagina non es disponibile in le formato requirite.
+    '410': Le pagina que tu cercava non plus existe ci.
     '422':
       content: Le verification de securitate ha fallite. Bloca tu le cookies?
       title: Falleva le verification de securitate
+    '429': Troppe requestas
+    '500':
+      content: Nos lo regretta, ma alco errate eveniva sur nostre extremo.
+      title: Iste pagina non es correcte
+    '503': Le pagina non poteva esser servite per un panna de servitor temporari.
+    noscript_html: A usar le application web Mastodon, activa JavaScript. In alternativa, tenta un del <a href="%{apps_path}">apps native</a> de Mastodon pro tu platteforma.
   existing_username_validator:
+    not_found: impossibile trovar un usator local con ille nomine de usator
     not_found_multiple: non poteva trovar %{usernames}
   exports:
     archive_takeout:
       date: Data
       download: Discargar tu archivo
+      hint_html: Tu pote requirer un archivo de tu <strong>messages e medios cargate</strong>. Le datos exportate sera in le formato ActivityPub, legibile per ulle software conforme.
+      in_progress: Compilante tu archivo...
       size: Dimension
     blocks: Tu ha blocate
     bookmarks: Marcapaginas
     csv: CSV
     domain_blocks: Blocadas de dominio
+    lists: Listas
     mutes: Tu ha silentiate
     storage: Immagazinage de medios
   featured_tags:
@@ -1146,6 +1205,9 @@ ia:
     new:
       save: Salveguardar nove filtro
       title: Adder nove filtro
+    statuses:
+      index:
+        title: Messages filtrate
   generic:
     all: Toto
     cancel: Cancellar
@@ -1153,6 +1215,7 @@ ia:
     confirm: Confirmar
     copy: Copiar
     delete: Deler
+    none: Nemo
     order_by: Ordinar per
     save_changes: Salvar le cambios
     today: hodie
@@ -1162,6 +1225,8 @@ ia:
       invalid_csv_file: 'File CSV non valide. Error: %{error}'
       too_large: Le file es troppo longe
     failures: Fallimentos
+    modes:
+      overwrite_long: Reimplaciar registros actual con le noves
     overwrite_preambles:
       blocking_html: Tu es sur le puncto de <strong>reimplaciar tu lista de blocadas</strong> per usque a <strong>%{total_items} contos</strong> proveniente de <strong>%{filename}</strong>.
       domain_blocking_html: Tu es sur le puncto de <strong>reimplaciar tu lista de blocadas de dominio</strong> per usque a <strong>%{total_items} dominios</strong> proveniente de <strong>%{filename}</strong>.
@@ -1170,7 +1235,14 @@ ia:
       domain_blocking_html: Tu es sur le puncto de <strong>blocar</strong> usque a <strong>%{total_items} dominios</strong> a partir de <strong>%{filename}</strong>.
     preface: Tu pote importar datos que tu ha exportate de un altere servitor, como un lista de personas que tu seque o bloca.
     recent_imports: Importationes recente
+    states:
+      finished: Terminate
+      in_progress: In curso
+      scheduled: Planificate
+      unconfirmed: Non confirmate
     status: Stato
+    success: Tu datos era cargate con successo e sera processate in tempore debite
+    time_started: Initiate le
     titles:
       blocking: Importation de contos blocate
       bookmarks: Importation de marcapaginas
@@ -1186,7 +1258,9 @@ ia:
       blocking: Lista de blocadas
       bookmarks: Marcapaginas
       domain_blocking: Lista de dominios blocate
+      following: Sequente lista
       lists: Listas
+      muting: Lista del silentiates
     upload: Incargar
   invites:
     delete: Disactivar
@@ -1199,10 +1273,16 @@ ia:
       '604800': 1 septimana
       '86400': 1 die
     expires_in_prompt: Nunquam
+    generate: Generar ligamine de invitation
+    invalid: Iste invitation non es valide
+    max_uses:
+      one: un uso
+      other: "%{count} usos"
     title: Invitar personas
   login_activities:
     authentication_methods:
       password: contrasigno
+      webauthn: claves de securitate
   mail_subscriptions:
     unsubscribe:
       action: Si, desubscriber
@@ -1220,10 +1300,16 @@ ia:
       title: Desubcriber
   migrations:
     errors:
+      move_to_self: non pote esser le conto actual
       not_found: non poterea esser trovate
+  moderation:
+    title: Moderation
   move_handler:
     carry_blocks_over_text: Iste usator ha cambiate de conto desde %{acct}, que tu habeva blocate.
   notification_mailer:
+    admin:
+      sign_up:
+        subject: "%{name} se ha inscribite"
     follow:
       title: Nove sequitor
     follow_request:
@@ -1232,16 +1318,25 @@ ia:
       action: Responder
     poll:
       subject: Un inquesta de %{name} ha finite
+  otp_authentication:
+    enable: Activar
   pagination:
     next: Sequente
   preferences:
     other: Altere
     public_timelines: Chronologias public
+  privacy:
+    privacy: Confidentialitate
+    search: Cercar
   privacy_policy:
     title: Politica de confidentialitate
   relationships:
     activity: Activitate del conto
+    invited: Invitate
     most_recent: Plus recente
+    moved: Movite
+    mutual: Mutue
+    primary: Primari
     status: Stato del conto
   rss:
     content_warning: 'Advertimento de contento:'
@@ -1273,6 +1368,7 @@ ia:
     current_session: Session actual
     date: Data
     description: "%{browser} sur %{platform}"
+    ip: IP
     platforms:
       adobe_air: Adobe Air
       android: Android
@@ -1287,6 +1383,7 @@ ia:
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
+    title: Sessiones
   settings:
     account: Conto
     account_settings: Parametros de conto
@@ -1316,6 +1413,7 @@ ia:
       vote: Votar
     show_more: Monstrar plus
     visibilities:
+      direct: Directe
       private_long: Solmente monstrar a sequitores
       public: Public
   statuses_cleanup:
@@ -1342,6 +1440,7 @@ ia:
     add: Adder
     disable: Disactivar 2FA
     edit: Modificar
+    generate_recovery_codes: Generar codices de recuperation
   user_mailer:
     appeal_approved:
       action: Parametros de conto
@@ -1350,8 +1449,11 @@ ia:
       explanation: Le appello contra le admonition contra tu conto del %{strike_date}, que tu ha submittite le %{appeal_date}, ha essite rejectate.
     warning:
       appeal: Submitter un appello
+      categories:
+        spam: Spam
       subject:
         disable: Tu conto %{acct} ha essite gelate
+        mark_statuses_as_sensitive: Tu messages sur %{acct} ha essite marcate como sensibile
         none: Advertimento pro %{acct}
         sensitive: Tu messages sur %{acct} essera marcate como sensibile a partir de ora
         silence: Tu conto %{acct} ha essite limitate
@@ -1370,8 +1472,12 @@ ia:
       apps_step: Discarga nostre applicationes official.
       apps_title: Applicationes de Mastodon
       edit_profile_action: Personalisar
+      edit_profile_step: Impulsa tu interactiones con un profilo comprehensive.
       edit_profile_title: Personalisar tu profilo
+      explanation: Ecce alcun consilios pro initiar
       feature_action: Apprender plus
+      feature_audience_title: Crea tu auditorio in fiducia
+      feature_moderation_title: Moderation como deberea esser
       follow_action: Sequer
       post_title: Face tu prime message
       share_action: Compartir
diff --git a/config/locales/ie.yml b/config/locales/ie.yml
index 2b819c53d..473d7b750 100644
--- a/config/locales/ie.yml
+++ b/config/locales/ie.yml
@@ -751,6 +751,7 @@ ie:
         desc_html: To ci usa extern scrites de hCaptcha, quel posse esser ínquietant pro rasones de securitá e privatie. In plu, <strong>it posse far li processu de registration mult plu desfacil (particularimen por tis con deshabilitás)</strong>. Pro ti rasones, ples considerar alternativ mesuras, tales quam registration per aprobation o invitation.
         title: Exige que nov usatores solue un CAPTCHA por confirmar lor conto
       content_retention:
+        danger_zone: Zone de dangere
         preamble: Decider qualmen usator-generat contenete es inmagasinat in Mastodon.
         title: Retention de contenete
       default_noindex:
@@ -1659,6 +1660,7 @@ ie:
     preferences: Preferenties
     profile: Public profil
     relationships: Sequetes e sequitores
+    severed_relationships: Detranchat relationes
     statuses_cleanup: Automatisat deletion de postas
     strikes: Admonimentes moderatori
     two_factor_authentication: 2-factor autentication
@@ -1672,6 +1674,7 @@ ie:
     lost_followers: Perdit sequitores
     lost_follows: Perdit sequetes
     preamble: Tu posse perdir tis queles tu seque e tui sequitores quande tu blocca un domonia o quande tui moderatores decide suspender un lontan servitor. Tande, tu va posser descargar listes de dejuntet relationes, a inspecter e possibilmen importar sur un altri servitor.
+    purged: Information pri ti-ci servitor ha esset purgat per li administratores de tui servitor.
     type: Eveniment
   statuses:
     attached:
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index b815cada5..552afa830 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -507,6 +507,8 @@ lt:
     roles:
       everyone: Numatytieji leidimai
       everyone_full_description_html: Tai – <strong>bazinis vaidmuo</strong>, turintis įtakos <strong>visiems naudotojams</strong>, net ir tiems, kurie neturi priskirto vaidmens. Visi kiti vaidmenys iš jo paveldi teises.
+      privileges:
+        manage_taxonomies_description: Leidžia naudotojams peržiūrėti tendencingą turinį ir atnaujinti saitažodžių nustatymus
     settings:
       captcha_enabled:
         desc_html: Tai priklauso nuo hCaptcha išorinių skriptų, kurie gali kelti susirūpinimą dėl saugumo ir privatumo. Be to, <strong>dėl to registracijos procesas kai kuriems žmonėms (ypač neįgaliesiems) gali būti gerokai sunkiau prieinami</strong>. Dėl šių priežasčių apsvarstyk alternatyvias priemones, pavyzdžiui, patvirtinimu arba kvietimu grindžiamą registraciją.
@@ -514,6 +516,7 @@ lt:
         danger_zone: Pavojinga zona
       discovery:
         public_timelines: Viešieji laiko skalės
+        trends: Tendencijos
       domain_blocks:
         all: Visiems
       registrations:
@@ -526,6 +529,7 @@ lt:
         title: Medija
       no_status_selected: Jokie statusai nebuvo pakeisti, nes niekas nepasirinkta
       title: Paskyros statusai
+      trending: Tendencinga
       with_media: Su medija
     system_checks:
       elasticsearch_health_yellow:
@@ -536,8 +540,45 @@ lt:
         message_html: Tavo Elasticsearch klasteris turi tik vieną mazgą, <code>ES_PRESET</code> turėtų būti nustatyta į <code>single_node_cluster</code>.
     title: Administracija
     trends:
+      allow: Leisti
+      approved: Patvirtinta
+      disallow: Neleisti
+      links:
+        allow: Leisti nuorodą
+        allow_provider: Leisti leidėją
+        description_html: Tai – nuorodos, kuriomis šiuo metu daug bendrinasi paskyros, iš kurių tavo serveris mato įrašus. Tai gali padėti naudotojams sužinoti, kas vyksta pasaulyje. Jokios nuorodos nerodomos viešai, kol nepatvirtinai leidėjo. Taip pat gali leisti arba atmesti atskiras nuorodas.
+        disallow: Neleisti nuorodą
+        disallow_provider: Neleisti leidėją
+        no_link_selected: Jokios nuorodos nebuvo pakeistos, nes nebuvo pasirinkta nė viena
+        publishers:
+          no_publisher_selected: Jokie leidėjai nebuvo pakeisti, nes nė vienas nebuvo pasirinktas
+        title: Tendencingos nuorodos
+        usage_comparison: Bendrinta %{today} kartų šiandien, palyginti su %{yesterday} vakar
+      not_allowed_to_trend: Neleidžiama tendencinguoti
+      only_allowed: Leidžiama tik
+      pending_review: Laukiama peržiūros
       preview_card_providers:
+        allowed: Nuorodos iš šio leidėjo gali tendencinguoti
+        description_html: Tai – domenai, iš kurių dažnai bendrinamos nuorodos tavo serveryje. Nuorodos netendencinguos, nebent nuorodos domenas yra patvirtintas. Tavo patvirtinimas (arba atmetimas) apima ir subdomenus.
+        rejected: Nuorodos iš šio leidėjo netendencinguos
         title: Leidėjai
+      rejected: Atmesta
+      statuses:
+        allow: Leisti įrašą
+        allow_account: Leisti autorių (-ę)
+        description_html: Tai – įrašai, apie kuriuos žino tavo serveris ir kuriais šiuo metu daug bendrinamasi ir kurie yra mėgstami. Tai gali padėti naujiems ir grįžtantiems naudotojams rasti daugiau žmonių, kuriuos galima sekti. Jokie įrašai nerodomi viešai, kol nepatvirtinai autoriaus (-ės), o autorius (-ė) leidžia savo paskyrą siūlyti kitiems. Taip pat gali leisti arba atmesti atskirus įrašus.
+        disallow: Neleisti įrašą
+        disallow_account: Neleisti autorių (-ę)
+        no_status_selected: Jokie tendencingi įrašai nebuvo pakeisti, nes nė vienas iš jų nebuvo pasirinktas
+        not_discoverable: Autorius (-ė) nesutiko, kad būtų galima juos atrasti
+        title: Tendencingi įrašai
+      tags:
+        not_trendable: Nepasirodys tendencijose
+        title: Tendencingos saitažodžiai
+        trendable: Gali pasirodyti tendencijose
+        trending_rank: 'Tendencinga #%{rank}'
+      title: Tendencijos
+      trending: Tendencinga
     warning_presets:
       add_new: Pridėti naują
       delete: Ištrinti
@@ -554,6 +595,14 @@ lt:
       body: "%{reporter} parašė skundą apie %{target}"
       body_remote: Kažkas iš %{domain} parašė skundą apie %{target}
       subject: Naujas skundas %{instance} (#%{id})
+    new_trends:
+      new_trending_links:
+        title: Tendencingos nuorodos
+      new_trending_statuses:
+        title: Tendencingi įrašai
+      new_trending_tags:
+        title: Tendencingos saitažodžiai
+      subject: Naujos tendencijos peržiūrimos %{instance}
   appearance:
     advanced_web_interface: Išplėstinė žiniatinklio sąsaja
     advanced_web_interface_hint: 'Jei nori išnaudoti visą ekrano plotį, išplėstinė žiniatinklio sąsaja leidžia sukonfigūruoti daug skirtingų stulpelių, kad vienu metu matytum tiek informacijos, kiek tik nori: Pagrindinis, pranešimai, federacinė laiko skalė, bet kokie sąrašai ir saitažodžiai.'
@@ -925,8 +974,8 @@ lt:
       follows_subtitle: Sek gerai žinomas paskyras.
       follows_title: Ką sekti
       follows_view_more: Peržiūrėti daugiau sekamų žmonių
-      hashtags_subtitle: Naršyk, kas tendencinga per pastarąsias 2 dienas.
-      hashtags_title: Trendingiausi saitažodžiai
+      hashtags_subtitle: Naršyk, kas tendencinga per pastarąsias 2 dienas
+      hashtags_title: Tendencingos saitažodžiai
       hashtags_view_more: Peržiūrėti daugiau tendencingų saitažodžių
       post_action: Sukurti
       post_step: Sakyk labas pasauliui tekstu, nuotraukomis, vaizdo įrašais arba apklausomis.
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 54edc4149..0b1a34e1b 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -77,11 +77,13 @@ cs:
           warn: Schovat filtrovaný obsah za varováním zmiňujicím název filtru
       form_admin_settings:
         activity_api_enabled: Počty lokálně zveřejnělých příspěvků, aktivních uživatelů a nových registrací v týdenních intervalech
+        app_icon: WEBP, PNG, GIF nebo JPG. Nahradí výchozí ikonu aplikace v mobilních zařízeních vlastní ikonou.
         backups_retention_period: Uživatelé mají možnost vytvářet archivy svých příspěvků, které si mohou stáhnout později. Pokud je nastaveno na kladnou hodnotu, budou tyto archivy po zadaném počtu dní automaticky odstraněny z úložiště.
         bootstrap_timeline_accounts: Tyto účty budou připnuty na vrchol nových uživatelů podle doporučení.
         closed_registrations_message: Zobrazeno při zavření registrace
         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.
         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.
         peers_api_enabled: Seznam názvů domén se kterými se tento server setkal ve fediversu. Neobsahuje žádná data o tom, zda jste federovali s daným serverem, pouze že o něm váš server ví. Toto je využíváno službami, které sbírají o federování statistiku v obecném smyslu.
diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml
index 90e223dec..b3c8a857e 100644
--- a/config/locales/simple_form.es-MX.yml
+++ b/config/locales/simple_form.es-MX.yml
@@ -77,11 +77,13 @@ es-MX:
           warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro
       form_admin_settings:
         activity_api_enabled: Conteo de publicaciones publicadas localmente, usuarios activos, y nuevos registros en periodos semanales
+        app_icon: WEBP, PNG, GIF o JPG. Reemplaza el icono de aplicación predeterminado en dispositivos móviles con un icono personalizado.
         backups_retention_period: Los usuarios tienen la capacidad de generar archivos de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente del almacenamiento después del número de días especificado.
         bootstrap_timeline_accounts: Estas cuentas aparecerán en la parte superior de las recomendaciones de los nuevos usuarios.
         closed_registrations_message: Mostrado cuando los registros están cerrados
         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.
         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.
         peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el fediverso. Aquí no se incluye ningún dato sobre si usted federa con un servidor determinado, sólo que su servidor lo sabe. Esto es utilizado por los servicios que recopilan estadísticas sobre la federación en un sentido general.
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 1d75bc423..2fb5cab98 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -77,11 +77,13 @@ es:
           warn: Ocultar el contenido filtrado detrás de una advertencia mencionando el título del filtro
       form_admin_settings:
         activity_api_enabled: Conteo de publicaciones publicadas localmente, usuarios activos y registros nuevos cada semana
+        app_icon: WEBP, PNG, GIF o JPG. Reemplaza el icono de aplicación predeterminado en dispositivos móviles con un icono personalizado.
         backups_retention_period: Los usuarios tienen la capacidad de generar archivos de sus mensajes para descargar más adelante. Cuando se establece un valor positivo, estos archivos se eliminarán automáticamente del almacenamiento después del número de días especificado.
         bootstrap_timeline_accounts: Estas cuentas aparecerán en la parte superior de las recomendaciones de los nuevos usuarios.
         closed_registrations_message: Mostrado cuando los registros están cerrados
         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.
         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.
         peers_api_enabled: Una lista de nombres de dominio que este servidor ha encontrado en el Fediverso. Aquí no se incluye ningún dato sobre si federas con un servidor determinado, solo que tu servidor lo conoce. Esto es utilizado por los servicios que recopilan estadísticas sobre la federación en un sentido general.
diff --git a/config/locales/simple_form.ie.yml b/config/locales/simple_form.ie.yml
index e482bd828..2b995e7ef 100644
--- a/config/locales/simple_form.ie.yml
+++ b/config/locales/simple_form.ie.yml
@@ -77,10 +77,15 @@ ie:
           warn: Celar li contenete filtrat detra un avise mentionant li titul del filtre
       form_admin_settings:
         activity_api_enabled: Númeres de postas publicat localmen, activ usatores, e nov adhesiones in periodes semanal
+        app_icon: WEBP, PNG, GIF o JPG. Remplazza li predenifit favicon Mastodon sur mobiles con un icon customisat.
+        backups_retention_period: Usatores posse generar archives de lor postas por adcargar plu tard. Si on specifica un valore positiv, li archives va esser automaticmen deletet de tui magazinage pos li specificat quantitá de dies.
         bootstrap_timeline_accounts: Ti-ci contos va esser pinglat al parte superiori del recomandationes por nov usatores.
         closed_registrations_message: Monstrat quande adhesiones es cludet
+        content_cache_retention_period: Omni postas de altri servitores (includente boosts e responses) va esser deletet pos li specificat quantitá de dies, sin egard a local usator-interactiones con les. To vale anc por postas queles un local usator ha marcat o favoritat it. Anc privat mentiones ínter usatores de diferent instanties va esser perdit e ínrestorabil. Talmen, ti-ci parametre es intentet por scopes special pro que it posse ruptes li expectationes de usatores.
         custom_css: On posse aplicar customisat stiles al web-version de Mastodon.
+        favicon: WEBP, PNG, GIF oo JPG. Remplazza li predenifit favicon Mastodon con in icon customisat.
         mascot: Substitue li ilustration in li avansat interfacie web.
+        media_cache_retention_period: Files de medie de postas creat de lontan usatores es cachat sur tui servitor. Si on specifica un valore positiv, ili va esser automaticmen deletet pos li specificat quantitá de dies. Si on peti li data del medie pos deletion, it va esser re-descargat si li original fonte es disponibil. Restrictiones pri li frequentie de ligament-previsiones posse exister sur altri situs, e pro to it es recomandat que on usa un valore de adminim 14 dies; altrimen, li ligament-previsiones ne va esser actualisat secun demande ante ti témpor.
         peers_api_enabled: Un liste de nómines de dominia queles ti-ci servitor ha incontrat in li fediverse. Ci null data es includet pri ca tu confedera con un cert servitor o ne; it indica solmen que tui servitor conosse it. Usat per servicies colectent general statisticas pri federation.
         profile_directory: Li profilarium monstra omni usatores volent esser decovribil.
         require_invite_text: Quande registrationes besona manual aprobation, fa que li textu "Pro quo tu vole registrar te?" es obligatori vice facultativ
@@ -240,6 +245,7 @@ ie:
         backups_retention_period: Periode de retener archives de usator
         bootstrap_timeline_accounts: Sempre recomandar ti-ci contos a nov usatores
         closed_registrations_message: Customisat missage quande registration ne disponibil
+        content_cache_retention_period: Periode de retention por contenete lontan
         custom_css: Custom CSS
         mascot: Customisat mascot (hereditat)
         media_cache_retention_period: Periode de retention por cachat medie
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index caf4c5429..c0698c3f7 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -77,11 +77,13 @@ ja:
           warn: フィルタに一致した投稿を非表示にし、フィルタのタイトルを含む警告を表示します
       form_admin_settings:
         activity_api_enabled: 週単位でローカルで公開された投稿数、アクティブユーザー数、新規登録者数を表示します
+        app_icon: モバイル端末で表示されるデフォルトのアプリアイコンを独自のアイコンで上書きします。WEBP、PNG、GIF、JPGが利用可能です。
         backups_retention_period: ユーザーには、後でダウンロードするために投稿のアーカイブを生成する機能があります。正の値に設定すると、これらのアーカイブは指定された日数後に自動的にストレージから削除されます。
         bootstrap_timeline_accounts: これらのアカウントは、新しいユーザー向けのおすすめユーザーの一番上にピン留めされます。
         closed_registrations_message: アカウント作成を停止している時に表示されます
         content_cache_retention_period: 他のサーバーからのすべての投稿(ブーストや返信を含む)は、指定された日数が経過すると、ローカルユーザーとのやりとりに関係なく削除されます。これには、ローカルユーザーがブックマークやお気に入りとして登録した投稿も含まれます。異なるサーバーのユーザー間の非公開な変身も失われ、復元することは不可能です。この設定の使用は特別な目的のインスタンスのためのものであり、一般的な目的のサーバーで使用するした場合、多くのユーザーの期待を裏切ることになります。
         custom_css: ウェブ版のMastodonでカスタムスタイルを適用できます。
+        favicon: デフォルトのMastodonのブックマークアイコンを独自のアイコンで上書きします。WEBP、PNG、GIF、JPGが利用可能です。
         mascot: 上級者向けWebインターフェースのイラストを上書きします。
         media_cache_retention_period: リモートユーザーが投稿したメディアファイルは、あなたのサーバーにキャッシュされます。正の値を設定すると、メディアは指定した日数後に削除されます。削除後にメディアデータが要求された場合、ソースコンテンツがまだ利用可能であれば、再ダウンロードされます。リンクプレビューカードがサードパーティのサイトを更新する頻度に制限があるため、この値を少なくとも14日に設定することをお勧めします。
         peers_api_enabled: このサーバーが Fediverse で遭遇したドメイン名のリストです。このサーバーが知っているだけで、特定のサーバーと連合しているかのデータは含まれません。これは一般的に Fediverse に関する統計情報を収集するサービスによって使用されます。
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index df4755c4f..54d36eafe 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -78,11 +78,14 @@ ko:
       form_admin_settings:
         activity_api_enabled: 주별 로컬에 게시된 글, 활성 사용자 및 새로운 가입자 수
         app_icon: WEBP, PNG, GIF 또는 JPG. 모바일 기기에 쓰이는 기본 아이콘을 대체합니다.
+        backups_retention_period: 사용자들은 나중에 다운로드하기 위해 게시물 아카이브를 생성할 수 있습니다. 양수로 설정된 경우 이 아카이브들은 지정된 일수가 지난 후에 저장소에서 자동으로 삭제될 것입니다.
         bootstrap_timeline_accounts: 이 계정들은 팔로우 추천 목록 상단에 고정됩니다.
         closed_registrations_message: 새 가입을 차단했을 때 표시됩니다
+        content_cache_retention_period: 다른 서버의 모든 게시물(부스트 및 답글 포함)은 해당 게시물에 대한 로컬 사용자의 상호 작용과 관계없이 지정된 일수가 지나면 삭제됩니다. 여기에는 로컬 사용자가 북마크 또는 즐겨찾기로 표시한 게시물도 포함됩니다. 다른 인스턴스 사용자와 주고 받은 비공개 멘션도 손실되며 복원할 수 없습니다. 이 설정은 특수 목적의 인스턴스를 위한 것이며 일반적인 용도의 많은 사용자의 예상이 빗나가게 됩니다.
         custom_css: 사용자 지정 스타일을 웹 버전의 마스토돈에 지정할 수 있습니다.
         favicon: WEBP, PNG, GIF 또는 JPG. 기본 파비콘을 대체합니다.
         mascot: 고급 웹 인터페이스의 그림을 대체합니다.
+        media_cache_retention_period: 원격 사용자가 작성한 글의 미디어 파일은 이 서버에 캐시됩니다. 양수로 설정하면 지정된 일수 후에 미디어가 삭제됩니다. 삭제된 후에 미디어 데이터를 요청하면 원본 콘텐츠를 사용할 수 있는 경우 다시 다운로드됩니다. 링크 미리 보기 카드가 타사 사이트를 폴링하는 빈도에 제한이 있으므로 이 값을 최소 14일로 설정하는 것이 좋으며, 그렇지 않으면 그 이전에는 링크 미리 보기 카드가 제때 업데이트되지 않을 것입니다.
         peers_api_enabled: 이 서버가 연합우주에서 만났던 서버들에 대한 도메인 네임의 목록입니다. 해당 서버와 어떤 연합을 했는지에 대한 정보는 전혀 포함되지 않고, 단순히 그 서버를 알고 있는지에 대한 것입니다. 이것은 일반적으로 연합에 대한 통계를 수집할 때 사용됩니다.
         profile_directory: 프로필 책자는 발견되기를 희망하는 모든 사람들의 목록을 나열합니다.
         require_invite_text: 가입이 수동 승인을 필요로 할 때, "왜 가입하려고 하나요?" 항목을 선택사항으로 두는 것보다는 필수로 두는 것이 낫습니다
diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml
index 6631b59b1..1c73ce0a8 100644
--- a/config/locales/simple_form.lt.yml
+++ b/config/locales/simple_form.lt.yml
@@ -85,6 +85,7 @@ lt:
         thumbnail: Maždaug 2:1 dydžio vaizdas, rodomas šalia tavo serverio informacijos.
         timeline_preview: Atsijungę lankytojai galės naršyti naujausius viešus įrašus, esančius serveryje.
         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.
       rule:
         hint: Pasirinktinai. Pateik daugiau informacijos apie taisyklę.
       sessions:
@@ -169,6 +170,9 @@ lt:
         site_title: Serverio pavadinimas
         theme: Numatytoji tema
         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_request:
         text: Kodėl nori prisijungti?
       notification_emails:
@@ -181,6 +185,7 @@ lt:
         software_updates:
           label: Yra nauja Mastodon versija
           patch: Pranešti apie klaidų ištaisymo atnaujinimus
+        trending_tag: Reikia peržiūros naujam tendencijai
       rule:
         hint: Papildoma informacija
         text: Taisyklė
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 8a001d875..56b7bea69 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -1838,6 +1838,9 @@ th:
       feature_action: เรียนรู้เพิ่มเติม
       feature_audience: Mastodon มีความพิเศษที่ให้คุณจัดการผู้รับสารของคุณได้โดยไม่มีตัวกลาง นอกจากนี้ การติดตั้ง Mastodon บนโครงสร้างพื้นฐานของคุณจะทำให้คุณสามารถติดตาม (และติดตามโดย) เซิร์ฟเวอร์ Mastodon แห่งไหนก็ได้ที่ทำงานอยู่ โดยไม่มีใครสามารถควบคุมได้นอกจากคุณ
       feature_audience_title: สร้างผู้ชมของคุณด้วยความมั่นใจ
+      feature_control_title: การควบคุมเส้นเวลาของคุณเอง
+      feature_creativity_title: ความคิดสร้างสรรค์ที่ไม่มีใครเทียบได้
+      feature_moderation_title: การกลั่นกรองในแบบที่ควรจะเป็น
       follow_action: ติดตาม
       follow_step: การติดตามผู้คนที่น่าสนใจคือสิ่งที่ Mastodon ให้ความสำคัญ
       follow_title: ปรับแต่งฟีดหน้าแรกของคุณ

From b5b84fad65f927a1bf55538be4a4763199724a6e Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Tue, 14 May 2024 19:54:28 +0200
Subject: [PATCH 113/215] Fix OpenSearch compatibility issue (#30278)

---
 .github/workflows/test-ruby.yml        | 20 ++++++++++++++++++--
 config/application.rb                  |  1 +
 lib/elasticsearch/client_extensions.rb | 11 +++++++++++
 3 files changed, 30 insertions(+), 2 deletions(-)
 create mode 100644 lib/elasticsearch/client_extensions.rb

diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml
index 45dc8a0de..2bfa59e6b 100644
--- a/.github/workflows/test-ruby.yml
+++ b/.github/workflows/test-ruby.yml
@@ -264,8 +264,8 @@ jobs:
         ports:
           - 6379:6379
 
-      search:
-        image: ${{ matrix.search-image }}
+      elasticsearch:
+        image: ${{ contains(matrix.search-image, 'elasticsearch') && matrix.search-image || '' }}
         env:
           discovery.type: single-node
           xpack.security.enabled: false
@@ -277,6 +277,20 @@ jobs:
         ports:
           - 9200:9200
 
+      opensearch:
+        image: ${{ contains(matrix.search-image, 'opensearch') && matrix.search-image || '' }}
+        env:
+          discovery.type: single-node
+          DISABLE_INSTALL_DEMO_CONFIG: true
+          DISABLE_SECURITY_PLUGIN: true
+        options: >-
+          --health-cmd "curl http://localhost:9200/_cluster/health"
+          --health-interval 10s
+          --health-timeout 5s
+          --health-retries 10
+        ports:
+          - 9200:9200
+
     env:
       DB_HOST: localhost
       DB_USER: postgres
@@ -300,6 +314,8 @@ jobs:
         include:
           - ruby-version: '.ruby-version'
             search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
+          - ruby-version: '.ruby-version'
+            search-image: opensearchproject/opensearch:2
 
     steps:
       - uses: actions/checkout@v4
diff --git a/config/application.rb b/config/application.rb
index 402c7f061..07b50ca03 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -40,6 +40,7 @@ require_relative '../lib/mastodon/rack_middleware'
 require_relative '../lib/public_file_server_middleware'
 require_relative '../lib/devise/strategies/two_factor_ldap_authenticatable'
 require_relative '../lib/devise/strategies/two_factor_pam_authenticatable'
+require_relative '../lib/elasticsearch/client_extensions'
 require_relative '../lib/chewy/settings_extensions'
 require_relative '../lib/chewy/index_extensions'
 require_relative '../lib/chewy/strategy/mastodon'
diff --git a/lib/elasticsearch/client_extensions.rb b/lib/elasticsearch/client_extensions.rb
new file mode 100644
index 000000000..700bfa4a1
--- /dev/null
+++ b/lib/elasticsearch/client_extensions.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Elasticsearch
+  module ClientExtensions
+    def verify_elasticsearch
+      @verified = true
+    end
+  end
+end
+
+Elasticsearch::Client.prepend(Elasticsearch::ClientExtensions)

From 1bf661cddbc614d4076e9d9e855575fc29e976c0 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Tue, 14 May 2024 20:15:42 +0200
Subject: [PATCH 114/215] Fix missing prop warning for `<Account>` (#30291)

---
 app/javascript/mastodon/components/account.jsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/javascript/mastodon/components/account.jsx b/app/javascript/mastodon/components/account.jsx
index 3282696d3..18a31cba2 100644
--- a/app/javascript/mastodon/components/account.jsx
+++ b/app/javascript/mastodon/components/account.jsx
@@ -172,7 +172,6 @@ Account.propTypes = {
   onBlock: PropTypes.func,
   onMute: PropTypes.func,
   onMuteNotifications: PropTypes.func,
-  intl: PropTypes.object.isRequired,
   hidden: PropTypes.bool,
   minimal: PropTypes.bool,
   defaultAction: PropTypes.string,

From 38a330f96328091fe39dd212ec053d5df3e2e36e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 10:25:34 +0200
Subject: [PATCH 115/215] fix(deps): update dependency core-js to v3.37.1
 (#30293)

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 f6dc8f161..90a7791e2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6381,9 +6381,9 @@ __metadata:
   linkType: hard
 
 "core-js@npm:^3.30.2":
-  version: 3.37.0
-  resolution: "core-js@npm:3.37.0"
-  checksum: 10c0/7e00331f346318ca3f595c08ce9e74ddae744715aef137486c1399163afd79792fb94c3161280863adfdc3e30f8026912d56bd3036f93cacfc689d33e185f2ee
+  version: 3.37.1
+  resolution: "core-js@npm:3.37.1"
+  checksum: 10c0/440eb51a7a39128a320225fe349f870a3641b96c9ecd26470227db730ef8c161ea298eaea621db66ec0ff622a85299efb4e23afebf889c0a1748616102307675
   languageName: node
   linkType: hard
 

From 508e93eb649fb490ea98904e2f64b372ec2ff610 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 10:25:50 +0200
Subject: [PATCH 116/215] chore(deps): update dependency fog-openstack to
 v1.1.1 (#30295)

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 efc99eb23..37910be8d 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -272,7 +272,7 @@ GEM
     fog-json (1.2.0)
       fog-core
       multi_json (~> 1.10)
-    fog-openstack (1.1.0)
+    fog-openstack (1.1.1)
       fog-core (~> 2.1)
       fog-json (>= 1.0)
     formatador (1.1.0)
@@ -422,7 +422,7 @@ GEM
     memory_profiler (1.0.1)
     mime-types (3.5.2)
       mime-types-data (~> 3.2015)
-    mime-types-data (3.2024.0305)
+    mime-types-data (3.2024.0507)
     mini_mime (1.1.5)
     mini_portile2 (2.8.6)
     minitest (5.22.3)

From 44e855db7830ab803820a9534f543702b9e9dca9 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 08:26:22 +0000
Subject: [PATCH 117/215] chore(deps): update dependency nokogiri to v1.16.5
 [security] (#30289)

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 37910be8d..95ab6f08f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -445,7 +445,7 @@ GEM
     net-smtp (0.5.0)
       net-protocol
     nio4r (2.7.1)
-    nokogiri (1.16.4)
+    nokogiri (1.16.5)
       mini_portile2 (~> 2.8.2)
       racc (~> 1.4)
     nsa (0.3.0)

From 40639510f88442f9e21f9400931038cce7a0518c Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Wed, 15 May 2024 10:27:34 +0200
Subject: [PATCH 118/215] Retain unconfirmed users longer (1 week) (#30285)

---
 app/workers/scheduler/user_cleanup_scheduler.rb       | 7 +++++--
 spec/workers/scheduler/user_cleanup_scheduler_spec.rb | 2 +-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb
index 2d2efc731..63ea876e5 100644
--- a/app/workers/scheduler/user_cleanup_scheduler.rb
+++ b/app/workers/scheduler/user_cleanup_scheduler.rb
@@ -3,6 +3,9 @@
 class Scheduler::UserCleanupScheduler
   include Sidekiq::Worker
 
+  UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS = 7
+  DISCARDED_STATUSES_MAX_AGE_DAYS = 30
+
   sidekiq_options retry: 0, lock: :until_executed, lock_ttl: 1.day.to_i
 
   def perform
@@ -13,7 +16,7 @@ class Scheduler::UserCleanupScheduler
   private
 
   def clean_unconfirmed_accounts!
-    User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).reorder(nil).find_in_batches do |batch|
+    User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch|
       # We have to do it separately because of missing database constraints
       AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all
       Account.where(id: batch.map(&:account_id)).delete_all
@@ -22,7 +25,7 @@ class Scheduler::UserCleanupScheduler
   end
 
   def clean_discarded_statuses!
-    Status.unscoped.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses|
+    Status.unscoped.discarded.where('deleted_at <= ?', DISCARDED_STATUSES_MAX_AGE_DAYS.days.ago).find_in_batches do |statuses|
       RemovalWorker.push_bulk(statuses) do |status|
         [status.id, { 'immediate' => true, 'skip_streaming' => true }]
       end
diff --git a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb
index 8fda246ba..c3940901d 100644
--- a/spec/workers/scheduler/user_cleanup_scheduler_spec.rb
+++ b/spec/workers/scheduler/user_cleanup_scheduler_spec.rb
@@ -14,7 +14,7 @@ describe Scheduler::UserCleanupScheduler do
     before do
       # Need to update the already-existing users because their initialization overrides confirmation_sent_at
       new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc)
-      old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 1.week.ago)
+      old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 10.days.ago)
       confirmed_user.update!(confirmed_at: 1.day.ago)
     end
 

From 7f7eba875376a44e01d4446902888e6afdd88908 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 10:34:50 +0200
Subject: [PATCH 119/215] chore(deps): update dependency letter_opener_web to
 v3 (#30296)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile      |  2 +-
 Gemfile.lock | 16 ++++++++--------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/Gemfile b/Gemfile
index 247865aac..b9baef703 100644
--- a/Gemfile
+++ b/Gemfile
@@ -178,7 +178,7 @@ group :development do
 
   # Preview mail in the browser
   gem 'letter_opener', '~> 1.8'
-  gem 'letter_opener_web', '~> 2.0'
+  gem 'letter_opener_web', '~> 3.0'
 
   # Security analysis CLI tools
   gem 'brakeman', '~> 6.0', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 95ab6f08f..2854528b7 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -389,10 +389,10 @@ GEM
       addressable (~> 2.8)
     letter_opener (1.10.0)
       launchy (>= 2.2, < 4)
-    letter_opener_web (2.0.0)
-      actionmailer (>= 5.2)
-      letter_opener (~> 1.7)
-      railties (>= 5.2)
+    letter_opener_web (3.0.0)
+      actionmailer (>= 6.1)
+      letter_opener (~> 1.9)
+      railties (>= 6.1)
       rexml
     link_header (0.0.8)
     llhttp-ffi (0.5.0)
@@ -434,7 +434,7 @@ GEM
       uri
     net-http-persistent (4.0.2)
       connection_pool (~> 2.2)
-    net-imap (0.4.10)
+    net-imap (0.4.11)
       date
       net-protocol
     net-ldap (0.19.0)
@@ -686,7 +686,7 @@ GEM
     redlock (1.3.2)
       redis (>= 3.0.0, < 6.0)
     regexp_parser (2.9.0)
-    reline (0.5.6)
+    reline (0.5.7)
       io-console (~> 0.5)
     request_store (1.6.0)
       rack (>= 1.4)
@@ -893,7 +893,7 @@ GEM
     xorcist (1.1.3)
     xpath (3.2.0)
       nokogiri (~> 1.8)
-    zeitwerk (2.6.13)
+    zeitwerk (2.6.14)
 
 PLATFORMS
   ruby
@@ -955,7 +955,7 @@ DEPENDENCIES
   kaminari (~> 1.2)
   kt-paperclip (~> 7.2)
   letter_opener (~> 1.8)
-  letter_opener_web (~> 2.0)
+  letter_opener_web (~> 3.0)
   link_header (~> 0.0)
   lograge (~> 0.12)
   mail (~> 2.8)

From 78a8263f73ed8b07a1528e716f28858e0d817603 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 10:34:58 +0200
Subject: [PATCH 120/215] fix(deps): update dependency postcss-preset-env to
 v9.5.13 (#30286)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 62 +++++++++++++++++++++++++++----------------------------
 1 file changed, 31 insertions(+), 31 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 90a7791e2..3741a5419 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1617,15 +1617,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-cascade-layers@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "@csstools/postcss-cascade-layers@npm:4.0.5"
+"@csstools/postcss-cascade-layers@npm:^4.0.6":
+  version: 4.0.6
+  resolution: "@csstools/postcss-cascade-layers@npm:4.0.6"
   dependencies:
-    "@csstools/selector-specificity": "npm:^3.1.0"
+    "@csstools/selector-specificity": "npm:^3.1.1"
     postcss-selector-parser: "npm:^6.0.13"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/2b6dd33b51df349dd89b12ebe3240d65accb0ba03e40288a72e26cf2307a7bdd742c42d9ff7a3f886cab19b2f8813978075f6ee61a985b0b7ceac7e2cbb29e04
+  checksum: 10c0/134019e9b3f71de39034658e2a284f549883745a309f774d8d272871f9e65680e0981c893766537a8a56ed7f41dba2d0f9fc3cb4fa4057c227bc193976a2ec79
   languageName: node
   linkType: hard
 
@@ -1749,15 +1749,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/postcss-is-pseudo-class@npm:^4.0.7":
-  version: 4.0.7
-  resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.7"
+"@csstools/postcss-is-pseudo-class@npm:^4.0.8":
+  version: 4.0.8
+  resolution: "@csstools/postcss-is-pseudo-class@npm:4.0.8"
   dependencies:
-    "@csstools/selector-specificity": "npm:^3.1.0"
+    "@csstools/selector-specificity": "npm:^3.1.1"
     postcss-selector-parser: "npm:^6.0.13"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/43668987df4608f822dbc323d3ac567fa7c192235b55933fd5d1855977ead80184512eb64a3f45a020fdd93711952ba8e9f9a280f4e981625b68a9ff074f9a01
+  checksum: 10c0/82f191571c3e0973354a54ef15feeb17f9408b4abbefad19fc0f087683b1212fc854cdf09a47324267dd47be4c5cb47d63b8d083695a67c3f8f3e53df3d561f6
   languageName: node
   linkType: hard
 
@@ -1983,12 +1983,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/selector-specificity@npm:^3.0.3, @csstools/selector-specificity@npm:^3.1.0":
-  version: 3.1.0
-  resolution: "@csstools/selector-specificity@npm:3.1.0"
+"@csstools/selector-specificity@npm:^3.0.3, @csstools/selector-specificity@npm:^3.1.1":
+  version: 3.1.1
+  resolution: "@csstools/selector-specificity@npm:3.1.1"
   peerDependencies:
     postcss-selector-parser: ^6.0.13
-  checksum: 10c0/7f77f8377b637dcca7f7a9d6ace3329cf60f02cbd75f14241de30b1f5d00c961ec167572bc93517cdb2f106405a91119f026389a0f96dabae8dd67d1c7710e60
+  checksum: 10c0/1d4a3f8015904d6aeb3203afe0e1f6db09b191d9c1557520e3e960c9204ad852df9db4cbde848643f78a26f6ea09101b4e528dbb9193052db28258dbcc8a6e1d
   languageName: node
   linkType: hard
 
@@ -6577,16 +6577,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"css-has-pseudo@npm:^6.0.4":
-  version: 6.0.4
-  resolution: "css-has-pseudo@npm:6.0.4"
+"css-has-pseudo@npm:^6.0.5":
+  version: 6.0.5
+  resolution: "css-has-pseudo@npm:6.0.5"
   dependencies:
-    "@csstools/selector-specificity": "npm:^3.1.0"
+    "@csstools/selector-specificity": "npm:^3.1.1"
     postcss-selector-parser: "npm:^6.0.13"
     postcss-value-parser: "npm:^4.2.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/e9d440de483e15092ebaadb483502243f43e0457d4214c8012ebdba7a959e74d40714254bf97247780e65735512f248a55feda0b3975d9a5eaea9c746f7518f0
+  checksum: 10c0/946930b7e699d6dbcb8426ebcd593228ee0e2143a148fb2399111ea4c9ed8d6eb3447e944251f1be44ae987d5ab16e450b0b006ca197f318c2a3760ba431fbb9
   languageName: node
   linkType: hard
 
@@ -13548,16 +13548,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss-nesting@npm:^12.1.3":
-  version: 12.1.3
-  resolution: "postcss-nesting@npm:12.1.3"
+"postcss-nesting@npm:^12.1.4":
+  version: 12.1.4
+  resolution: "postcss-nesting@npm:12.1.4"
   dependencies:
     "@csstools/selector-resolve-nested": "npm:^1.1.0"
-    "@csstools/selector-specificity": "npm:^3.1.0"
+    "@csstools/selector-specificity": "npm:^3.1.1"
     postcss-selector-parser: "npm:^6.0.13"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/6b2d3a4823e85592965c6c11f749c5357703256e7334388147d6a3bb72a3abbe47789afaa8535bdd7a9bd6d0099eb12ffec6c154050d8e8b8286b1adbed5b397
+  checksum: 10c0/b3408de4c04b58a88a56fa81aeff59b12615c78d4f5a57e09c1ee47e74cff51f8c9cad1684da0059067303cf65b4b688f85f0c5ca8d54af8c4ab998f727ab9fd
   languageName: node
   linkType: hard
 
@@ -13712,10 +13712,10 @@ __metadata:
   linkType: hard
 
 "postcss-preset-env@npm:^9.5.2":
-  version: 9.5.12
-  resolution: "postcss-preset-env@npm:9.5.12"
+  version: 9.5.13
+  resolution: "postcss-preset-env@npm:9.5.13"
   dependencies:
-    "@csstools/postcss-cascade-layers": "npm:^4.0.5"
+    "@csstools/postcss-cascade-layers": "npm:^4.0.6"
     "@csstools/postcss-color-function": "npm:^3.0.16"
     "@csstools/postcss-color-mix-function": "npm:^2.0.16"
     "@csstools/postcss-exponential-functions": "npm:^1.0.7"
@@ -13725,7 +13725,7 @@ __metadata:
     "@csstools/postcss-hwb-function": "npm:^3.0.15"
     "@csstools/postcss-ic-unit": "npm:^3.0.6"
     "@csstools/postcss-initial": "npm:^1.0.1"
-    "@csstools/postcss-is-pseudo-class": "npm:^4.0.7"
+    "@csstools/postcss-is-pseudo-class": "npm:^4.0.8"
     "@csstools/postcss-light-dark-function": "npm:^1.0.5"
     "@csstools/postcss-logical-float-and-clear": "npm:^2.0.1"
     "@csstools/postcss-logical-overflow": "npm:^1.0.1"
@@ -13747,7 +13747,7 @@ __metadata:
     autoprefixer: "npm:^10.4.19"
     browserslist: "npm:^4.22.3"
     css-blank-pseudo: "npm:^6.0.2"
-    css-has-pseudo: "npm:^6.0.4"
+    css-has-pseudo: "npm:^6.0.5"
     css-prefers-color-scheme: "npm:^9.0.1"
     cssdb: "npm:^8.0.0"
     postcss-attribute-case-insensitive: "npm:^6.0.3"
@@ -13767,7 +13767,7 @@ __metadata:
     postcss-image-set-function: "npm:^6.0.3"
     postcss-lab-function: "npm:^6.0.16"
     postcss-logical: "npm:^7.0.1"
-    postcss-nesting: "npm:^12.1.3"
+    postcss-nesting: "npm:^12.1.4"
     postcss-opacity-percentage: "npm:^2.0.0"
     postcss-overflow-shorthand: "npm:^5.0.1"
     postcss-page-break: "npm:^3.0.4"
@@ -13777,7 +13777,7 @@ __metadata:
     postcss-selector-not: "npm:^7.0.2"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/3e0276b2061baa396547f9c0090fcb0c6149d3735c7aefa99a8e520701aae0b7265578b59d5e4efa9f5e61659c161e39590a5d63bac49469b99da1c549b63231
+  checksum: 10c0/5bbb6e87b1b3acc816ef445836f85df5f50ac96bdc3d571952a83794c80863c652d27ab14c66f6b88f86f5664119d49b357e4184162022cc3436676f3fbe833b
   languageName: node
   linkType: hard
 

From aad5e841b59691f001132a9cf96487db8389c77e Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 10:53:57 +0200
Subject: [PATCH 121/215] New Crowdin Translations (automated) (#30290)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/cy.json    |   1 +
 app/javascript/mastodon/locales/en-GB.json |  13 ++
 app/javascript/mastodon/locales/gl.json    |   1 +
 app/javascript/mastodon/locales/sk.json    |   4 +
 config/locales/devise.ia.yml               |   4 +
 config/locales/doorkeeper.en-GB.yml        |   1 +
 config/locales/doorkeeper.ia.yml           |  21 +++
 config/locales/en-GB.yml                   |   1 +
 config/locales/ia.yml                      | 141 +++++++++++++++++++++
 config/locales/simple_form.cy.yml          |   2 +
 config/locales/simple_form.en-GB.yml       |   6 +
 11 files changed, 195 insertions(+)

diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 925b7710e..2c5976995 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -474,6 +474,7 @@
   "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
   "notification.mention": "Crybwyllodd {name} amdanoch chi",
   "notification.moderation-warning.learn_more": "Dysgu mwy",
+  "notification.moderation_warning": "Rydych wedi derbyn rhybudd gan gymedrolwr",
   "notification.moderation_warning.action_delete_statuses": "Mae rhai o'ch postiadau wedi'u dileu.",
   "notification.moderation_warning.action_disable": "Mae eich cyfrif wedi'i analluogi.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Mae rhai o'ch postiadau wedi'u marcio'n sensitif.",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index 6c24d5a26..e70348e0b 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -308,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
   "follow_suggestions.curated_suggestion": "Staff pick",
   "follow_suggestions.dismiss": "Don't show again",
+  "follow_suggestions.featured_longer": "Hand-picked by the {domain} team",
+  "follow_suggestions.friends_of_friends_longer": "Popular among people you follow",
   "follow_suggestions.hints.featured": "This profile has been hand-picked by the {domain} team.",
   "follow_suggestions.hints.friends_of_friends": "This profile is popular among the people you follow.",
   "follow_suggestions.hints.most_followed": "This profile is one of the most followed on {domain}.",
@@ -315,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "This profile is similar to the profiles you have most recently followed.",
   "follow_suggestions.personalized_suggestion": "Personalised suggestion",
   "follow_suggestions.popular_suggestion": "Popular suggestion",
+  "follow_suggestions.popular_suggestion_longer": "Popular on {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Similar to profiles you recently followed",
   "follow_suggestions.view_all": "View all",
   "follow_suggestions.who_to_follow": "Who to follow",
   "followed_tags": "Followed hashtags",
@@ -469,6 +473,15 @@
   "notification.follow": "{name} followed you",
   "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.moderation-warning.learn_more": "Learn more",
+  "notification.moderation_warning": "You have received a moderation warning",
+  "notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.",
+  "notification.moderation_warning.action_disable": "Your account has been disabled.",
+  "notification.moderation_warning.action_mark_statuses_as_sensitive": "Some of your posts have been marked as sensitive.",
+  "notification.moderation_warning.action_none": "Your account has received a moderation warning.",
+  "notification.moderation_warning.action_sensitive": "Your posts will be marked as sensitive from now on.",
+  "notification.moderation_warning.action_silence": "Your account has been limited.",
+  "notification.moderation_warning.action_suspend": "Your account has been suspended.",
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index b2a50ebb8..88d4f5f60 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -474,6 +474,7 @@
   "notification.follow_request": "{name} solicitou seguirte",
   "notification.mention": "{name} mencionoute",
   "notification.moderation-warning.learn_more": "Saber máis",
+  "notification.moderation_warning": "Recibiches unha advertencia da moderación",
   "notification.moderation_warning.action_delete_statuses": "Algunha das túas publicacións foron eliminadas.",
   "notification.moderation_warning.action_disable": "A túa conta foi desactivada.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algunha das túas publicacións foron marcadas como sensibles.",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 286344241..0c7646741 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -295,6 +295,7 @@
   "follow_suggestions.personalized_suggestion": "Prispôsobený návrh",
   "follow_suggestions.popular_suggestion": "Obľúbený návrh",
   "follow_suggestions.popular_suggestion_longer": "Populárne na {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Podobné profilom ktoré si nedávno nasledoval/a",
   "follow_suggestions.view_all": "Zobraziť všetky",
   "follow_suggestions.who_to_follow": "Koho sledovať",
   "followed_tags": "Sledované hashtagy",
@@ -445,10 +446,13 @@
   "notification.follow_request": "{name} vás žiada sledovať",
   "notification.mention": "{name} vás spomína",
   "notification.moderation-warning.learn_more": "Zisti viac",
+  "notification.moderation_warning.action_silence": "Tvoj účet bol obmedzený.",
+  "notification.moderation_warning.action_suspend": "Tvoj účet bol pozastavený.",
   "notification.own_poll": "Vaša anketa sa skončila",
   "notification.poll": "Anketa, v ktorej ste hlasovali, sa skončila",
   "notification.reblog": "{name} zdieľa váš príspevok",
   "notification.relationships_severance_event": "Stratené prepojenia s {name}",
+  "notification.relationships_severance_event.account_suspension": "Správca z {from} pozastavil/a {target}, čo znamená, že od nich viac nemôžeš dostávať aktualizácie, alebo s nimi interaktovať.",
   "notification.relationships_severance_event.learn_more": "Zisti viac",
   "notification.status": "{name} uverejňuje niečo nové",
   "notification.update": "{name} upravuje príspevok",
diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml
index d83c70864..c68efddd0 100644
--- a/config/locales/devise.ia.yml
+++ b/config/locales/devise.ia.yml
@@ -86,9 +86,13 @@ ia:
       destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto.
       signed_up_but_pending: Un message con un ligamine de confirmation esseva inviate a tu conto de email. Post que tu clicca le ligamine, nos revidera tu application. Tu essera notificate si illo es approbate.
       updated: Tu conto ha essite actualisate con successo.
+    sessions:
+      signed_in: Connexe con successo.
+      signed_out: Disconnexe con successo.
     unlocks:
       unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar.
   errors:
     messages:
       already_confirmed: jam esseva confirmate, tenta initiar session
       not_found: non trovate
+      not_locked: non era blocate
diff --git a/config/locales/doorkeeper.en-GB.yml b/config/locales/doorkeeper.en-GB.yml
index b3ceffb13..2e537c530 100644
--- a/config/locales/doorkeeper.en-GB.yml
+++ b/config/locales/doorkeeper.en-GB.yml
@@ -174,6 +174,7 @@ en-GB:
       read:filters: see your filters
       read:follows: see your follows
       read:lists: see your lists
+      read:me: read only your account's basic information
       read:mutes: see your mutes
       read:notifications: see your notifications
       read:reports: see your reports
diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml
index b5bd6cc53..dc9659968 100644
--- a/config/locales/doorkeeper.ia.yml
+++ b/config/locales/doorkeeper.ia.yml
@@ -4,6 +4,7 @@ ia:
     attributes:
       doorkeeper/application:
         name: Nomine de application
+        scopes: Ambitos
         website: Sito web de application
     errors:
       models:
@@ -28,12 +29,14 @@ ia:
         empty: Tu non ha applicationes.
         name: Nomine
         new: Nove application
+        scopes: Ambitos
         show: Monstrar
         title: Tu applicationes
       new:
         title: Nove application
       show:
         actions: Actiones
+        application_id: Clave del cliente
         scopes: Ambitos
         title: 'Application: %{name}'
     authorizations:
@@ -42,13 +45,20 @@ ia:
         deny: Negar
       error:
         title: Ocurreva un error
+      new:
+        review_permissions: Revisionar le permissos
+        title: Autorisation necessari
     authorized_applications:
+      buttons:
+        revoke: Revocar
       confirmations:
         revoke: Es tu secur?
       index:
+        authorized_at: Autorisate le %{date}
         last_used_at: Ultime uso in %{date}
         never_used: Nunquam usate
         scopes: Permissiones
+        superapp: Interne
         title: Tu applicationes autorisate
     flash:
       applications:
@@ -58,12 +68,21 @@ ia:
           notice: Application delite.
         update:
           notice: Application actualisate.
+      authorized_applications:
+        destroy:
+          notice: Application revocate.
     grouped_scopes:
+      access:
+        read: Accesso de sol lectura
+        read/write: Accesso de lectura e scriptura
+        write: Accesso de sol scriptura
       title:
         accounts: Contos
         admin/accounts: Gestion de contos
+        admin/all: Tote le functiones administrative
         admin/reports: Gestion de reportos
         all: Accesso plen a tu conto de Mastodon
+        blocks: Blocadas
         bookmarks: Marcapaginas
         conversations: Conversationes
         favourites: Favoritos
@@ -84,7 +103,9 @@ ia:
           oauth2_provider: Fornitor OAuth2
     scopes:
       admin:read: leger tote le datos in le servitor
+      admin:read:accounts: leger information sensibile de tote le contos
       admin:write: modificar tote le datos in le servitor
+      follow: modificar relationes del contos
       read: leger tote le datos de tu conto
       read:accounts: vider informationes de conto
       read:bookmarks: vider tu marcapaginas
diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
index df956902a..7e31080df 100644
--- a/config/locales/en-GB.yml
+++ b/config/locales/en-GB.yml
@@ -751,6 +751,7 @@ en-GB:
         desc_html: This relies on external scripts from hCaptcha, which may be a security and privacy concern. In addition, <strong>this can make the registration process significantly less accessible to some (especially disabled) people</strong>. For these reasons, please consider alternative measures such as approval-based or invite-based registration.
         title: Require new users to solve a CAPTCHA to confirm their account
       content_retention:
+        danger_zone: Danger zone
         preamble: Control how user-generated content is stored in Mastodon.
         title: Content retention
       default_noindex:
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 46cdcd3c6..68676a09f 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -997,6 +997,7 @@ ia:
       body_remote: Alcuno de %{domain} ha reportate %{target}
       subject: Nove reporto pro %{instance} (#%{id})
     new_software_updates:
+      body: Nove versiones de Mastodon ha essite publicate, tu poterea voler actualisar!
       subject: Nove versiones de Mastodon es disponibile pro %{instance}!
     new_trends:
       body: 'Le sequente elementos besoniar de un recension ante que illos pote esser monstrate publicamente:'
@@ -1048,6 +1049,7 @@ ia:
       hint_html: Justo un altere cosa! Nos debe confirmar que tu es un human (isto es assi proque nos pote mantener foras le spam!). Solve le CAPTCHA infra e clicca "Continuar".
       title: Controlo de securitate
     confirmations:
+      awaiting_review: Tu adresse email es confirmate! Le personal de %{domain} ora revide tu registration. Tu recipera un email si illes approba tu conto!
       awaiting_review_title: Tu registration es revidite
       clicking_this_link: cliccante iste ligamine
       login_link: acceder
@@ -1066,6 +1068,7 @@ ia:
     logout: Clauder le session
     migrate_account: Move a un conto differente
     or_log_in_with: O accede con
+    privacy_policy_agreement_html: Io ha legite e acceptar le <a href="<a href="%{privacy_policy_path}" target="_blank">politica de confidentialitate</a>
     progress:
       confirm: Confirma le email
       details: Tu detalios
@@ -1075,29 +1078,69 @@ ia:
       cas: CAS
       saml: SAML
     register: Inscribe te
+    registration_closed: "%{instance} non accepta nove membros"
     resend_confirmation: Reinviar ligamine de confirmation
     reset_password: Remontar le contrasigno
     rules:
       accept: Acceptar
       back: Retro
+      invited_by: 'Tu pote junger te a %{domain} gratias al invitation que tu ha recipite de:'
+      preamble: Illos es predefinite e fortiarte per le moderatores de %{domain}.
+      preamble_invited: Ante que tu continua, considera le regulas base definite per le moderatores de %{domain}.
       title: Alcun regulas base.
+      title_invited: Tu ha essite invitate.
     security: Securitate
     set_new_password: Definir un nove contrasigno
+    setup:
+      email_below_hint_html: Verifica tu plica de spam, o pete un altero. Tu pote corriger tu adresse email si illo es errate.
+      email_settings_hint_html: Clicca le ligamine que nos te inviava pro verificar %{email}.
+      link_not_received: Non obteneva tu un ligamine?
+      new_confirmation_instructions_sent: Tu recipera un nove email con le ligamine de confirmation in alcun minutas!
+      title: Verifica tu cassa de ingresso
+    sign_in:
+      preamble_html: Accede con tu <strong>%{domain}</strong> credentiales. Si tu conto es hospite sur un differente servitor, tu non potera authenticar te ci.
+      title: Acceder a %{domain}
+    sign_up:
+      manual_review: Le inscriptiones sur %{domain} passa per revision manual de nostre moderatores. Pro adjutar nos a processar tu registration, scribe un poco re te mesme e perque tu vole un conto sur %{domain}.
+      preamble: Con un conto sur iste servitor de Mastodon, tu potera sequer ulle altere persona in rete, sin reguardo de ubi lor conto es hospite.
+      title: Lassa que nos te configura sur %{domain}.
     status:
       account_status: Stato del conto
+      confirming: Attendente esser completate email de confirmation.
+      functional: Tu conto es plenmente operative.
+      pending: Tu application es pendente de revision per nostre personal. Isto pote prender alcun tempore. Tu recipera un email si tu application es approbate.
+      redirecting_to: Tu conto es inactive perque illo es actualmente re-adressa a %{acct}.
+      self_destruct: Dum %{domain} va clauder, tu solo habera accesso limitate a tu conto.
       view_strikes: Examinar le admonitiones passate contra tu conto
+    too_fast: Formulario inviate troppo velocemente, retenta.
     use_security_key: Usar clave de securitate
   challenge:
     confirm: Continuar
+    hint_html: "<strong>Consilio:</strong> Nos non te demandara tu contrasigno ancora pro le proxime hora."
     invalid_password: Contrasigno non valide
     prompt: Confirma le contrasigno pro continuar
+  crypto:
+    errors:
+      invalid_key: non es un clave Ed25519 o Curve25519 valide
+      invalid_signature: non es un valide firma Ed25519
+  date:
+    formats:
+      default: "%b %d, %Y"
+      with_month_name: "%B %d, %Y"
   datetime:
     distance_in_words:
+      about_x_hours: "%{count}h"
+      about_x_months: "%{count}me"
+      about_x_years: "%{count}a"
+      almost_x_years: "%{count}a"
       half_a_minute: Justo ora
+      less_than_x_minutes: "%{count} m"
       less_than_x_seconds: Justo ora
       over_x_years: "%{count}a"
       x_days: "%{count}d"
       x_minutes: "%{count} m"
+      x_months: "%{count}me"
+      x_seconds: "%{count}s"
   deletes:
     challenge_not_passed: Le informationes que tu ha inserite non era correcte
     confirm_password: Insere tu contrasigno actual pro verificar tu identitate
@@ -1174,6 +1217,7 @@ ia:
       download: Discargar tu archivo
       hint_html: Tu pote requirer un archivo de tu <strong>messages e medios cargate</strong>. Le datos exportate sera in le formato ActivityPub, legibile per ulle software conforme.
       in_progress: Compilante tu archivo...
+      request: Pete tu archivo
       size: Dimension
     blocks: Tu ha blocate
     bookmarks: Marcapaginas
@@ -1184,6 +1228,8 @@ ia:
     storage: Immagazinage de medios
   featured_tags:
     add_new: Adder nove
+    errors:
+      limit: Tu ha jam consiliate le maxime numero de hashtags
   filters:
     contexts:
       account: Profilos
@@ -1196,17 +1242,33 @@ ia:
       keywords: Parolas clave
       statuses: Messages individual
       title: Modificar filtro
+    errors:
+      invalid_context: Nulle o non valide contexto supplite
     index:
+      contexts: Filtros in %{contexts}
       delete: Deler
+      empty: Tu non ha filtros.
+      expires_in: Expira in %{distance}
+      expires_on: Expira le %{date}
+      keywords:
+        one: "%{count} parola clave"
+        other: "%{count} parolas clave"
       statuses:
         one: "%{count} message"
         other: "%{count} messages"
+      statuses_long:
+        one: "%{count} singule message celate"
+        other: "%{count} singule messages celate"
       title: Filtros
     new:
       save: Salveguardar nove filtro
       title: Adder nove filtro
     statuses:
+      back_to_filter: Retro al filtro
+      batch:
+        remove: Remover ab filtro
       index:
+        hint: Iste filtro se applica pro seliger messages singule sin reguardo de altere criterios. Tu pote adder altere messages a iste filtro ab le interfacie web.
         title: Messages filtrate
   generic:
     all: Toto
@@ -1215,16 +1277,27 @@ ia:
     confirm: Confirmar
     copy: Copiar
     delete: Deler
+    deselect: Deseliger toto
     none: Nemo
     order_by: Ordinar per
     save_changes: Salvar le cambios
+    select_all_matching_items:
+      one: Selige %{count} elemento concordante tu recerca.
+      other: Selige %{count} elementos concordante tu recerca.
     today: hodie
+    validation_errors:
+      one: Alco non es multo bon ancora! Controla le error infra
+      other: Alco non es multo bon ancora! Controla %{count} errores infra
   imports:
     errors:
       empty: File CSV vacue
+      incompatible_type: Incompatibile con le typo de importation seligite
       invalid_csv_file: 'File CSV non valide. Error: %{error}'
+      over_rows_processing_limit: contine plus que %{count} rangos
       too_large: Le file es troppo longe
     failures: Fallimentos
+    imported: Importate
+    mismatched_types_warning: Il appare que tu pote haber seligite le typo errate pro iste importation, controla duo vices.
     modes:
       overwrite_long: Reimplaciar registros actual con le noves
     overwrite_preambles:
@@ -1278,6 +1351,8 @@ ia:
     max_uses:
       one: un uso
       other: "%{count} usos"
+    table:
+      expires_at: Expira
     title: Invitar personas
   login_activities:
     authentication_methods:
@@ -1316,32 +1391,84 @@ ia:
       title: Nove requesta de sequimento
     mention:
       action: Responder
+      title: Nove mention
     poll:
       subject: Un inquesta de %{name} ha finite
   otp_authentication:
     enable: Activar
+    setup: Configurar
   pagination:
     next: Sequente
+    prev: Previe
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: Tu jam ha votate in iste sondage
+      duplicate_options: contine elementos duplicate
+      duration_too_long: il es troppo lontan in le futuro
+      duration_too_short: il es troppo tosto
+      expired: Le sondage ha jam finite
+      invalid_choice: Le option de voto eligite non existe
+      over_character_limit: non pote esser plus longe que %{max} characteres cata un
+      self_vote: Tu non pote vota in tu proprie sondages
+      too_few_options: debe haber plus que un elemento
+      too_many_options: non pote continer plus que %{max} elementos
   preferences:
     other: Altere
+    posting_defaults: Publicationes predefinite
     public_timelines: Chronologias public
   privacy:
     privacy: Confidentialitate
+    reach: Portata
     search: Cercar
+    title: Confidentialitate e portata
   privacy_policy:
     title: Politica de confidentialitate
+  reactions:
+    errors:
+      limit_reached: Limite de reactiones differente attingite
+      unrecognized_emoji: non es un emoticone recognoscite
+  redirects:
+    prompt: Si tu te fide de iste ligamine, clicca lo pro continuar.
+    title: Tu va lassar %{instance}.
   relationships:
     activity: Activitate del conto
+    confirm_follow_selected_followers: Desira tu vermente remover le sequaces seligite?
+    confirm_remove_selected_followers: Desira tu vermente remover le sequaces seligite?
+    confirm_remove_selected_follows: Desira tu vermente remover le sequaces seligite?
+    dormant: Dormiente
+    follow_failure: Impossibile sequer alcun del contos seligite.
+    follow_selected_followers: Sequer le sequaces seligite
+    followers: Sequaces
+    following: Sequente
     invited: Invitate
+    last_active: Ultimo active
     most_recent: Plus recente
     moved: Movite
     mutual: Mutue
     primary: Primari
+    relationship: Relation
+    remove_selected_domains: Remover tote le sequaces ab le dominios seligite
+    remove_selected_followers: Remover le sequaces seligite
+    remove_selected_follows: Non plus sequer le usatores seligite
     status: Stato del conto
+  remote_follow:
+    missing_resource: Impossibile trovar le requirite re-adresse URL pro tu conto
+  reports:
+    errors:
+      invalid_rules: non referentia regulas valide
   rss:
     content_warning: 'Advertimento de contento:'
     descriptions:
       account: Messages public de @%{acct}
+      tag: 'Messages public plachettate #%{hashtag}'
+  scheduled_statuses:
+    over_daily_limit: Tu ha excedite le limite de %{limit} messages programmate pro hodie
+    over_total_limit: Tu ha excedite le limite de %{limit} messages programmate
+    too_soon: Le data programmate debe esser in le futuro
+  self_destruct:
+    lead_html: Infortunatemente, <strong>%{domain}</strong> va clauder permanentemente. Si tu habeva un conto illac, tu non potera continuar a usar lo, ma tu pote ancora peter un salveguarda de tu datos.
+    title: Iste servitor va clauder
   sessions:
     activity: Ultime activitate
     browser: Navigator
@@ -1368,6 +1495,7 @@ ia:
     current_session: Session actual
     date: Data
     description: "%{browser} sur %{platform}"
+    explanation: Il ha navigatores del web actualmente connexe a tu conto Mastodon.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -1383,11 +1511,16 @@ ia:
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
+    revoke: Revocar
+    revoke_success: Session revocate con successo
     title: Sessiones
+    view_authentication_history: Vider chronologia de authentication de tu conto
   settings:
     account: Conto
     account_settings: Parametros de conto
+    aliases: Aliases de conto
     appearance: Apparentia
+    authorized_apps: Apps autorisate
     delete: Deletion de conto
     development: Disveloppamento
     edit_profile: Modificar profilo
@@ -1417,6 +1550,13 @@ ia:
       private_long: Solmente monstrar a sequitores
       public: Public
   statuses_cleanup:
+    keep_pinned_hint: Non dele alcuno de tu messages appunctate
+    keep_polls: Mantener sondages
+    keep_polls_hint: Non dele ulle de tu sondages
+    keep_self_bookmark: Mantener messages que tu marcava con marcapaginas
+    keep_self_bookmark_hint: Non dele tu proprie messages si tu los ha marcate con marcapaginas
+    keep_self_fav: Mantene messages que tu favoriva
+    keep_self_fav_hint: Non dele tu proprie messages si tu los ha favorite
     min_age:
       '1209600': 2 septimanas
       '15778476': 6 menses
@@ -1426,6 +1566,7 @@ ia:
       '604800': 1 septimana
       '63113904': 2 annos
       '7889238': 3 menses
+    min_age_label: Limine de etate
   stream_entries:
     sensitive_content: Contento sensibile
   strikes:
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index 51a3aac27..5e8fd8529 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -77,11 +77,13 @@ cy:
           warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd
       form_admin_settings:
         activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol
+        app_icon: WEBP, PNG, GIF neu JPG. Yn diystyru'r eicon ap rhagosodedig ar ddyfeisiau symudol gydag eicon cyfaddas.
         backups_retention_period: Mae gan ddefnyddwyr y gallu i gynhyrchu archifau o'u postiadau i'w llwytho i lawr yn ddiweddarach. Pan gânt eu gosod i werth positif, bydd yr archifau hyn yn cael eu dileu'n awtomatig o'ch storfa ar ôl y nifer penodedig o ddyddiau.
         bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd.
         closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau
         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.
         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.
         peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol.
diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml
index f4668ccad..eaf0501a2 100644
--- a/config/locales/simple_form.en-GB.yml
+++ b/config/locales/simple_form.en-GB.yml
@@ -77,10 +77,15 @@ en-GB:
           warn: Hide the filtered content behind a warning mentioning the filter's title
       form_admin_settings:
         activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
+        app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon.
+        backups_retention_period: Users have the ability to generate archives of their posts to download later. When set to a positive value, these archives will be automatically deleted from your storage after the specified number of days.
         bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
         closed_registrations_message: Displayed when sign-ups are closed
+        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.
         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.
         peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
         profile_directory: The profile directory lists all users who have opted-in to be discoverable.
         require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
@@ -240,6 +245,7 @@ en-GB:
         backups_retention_period: User archive retention period
         bootstrap_timeline_accounts: Always recommend these accounts to new users
         closed_registrations_message: Custom message when sign-ups are not available
+        content_cache_retention_period: Remote content retention period
         custom_css: Custom CSS
         mascot: Custom mascot (legacy)
         media_cache_retention_period: Media cache retention period

From 6beead38678d6a25adc94ee82ed07974e3e20147 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Wed, 15 May 2024 05:33:36 -0400
Subject: [PATCH 122/215] Move `simplecov` config into `rails_helper` (#30302)

---
 .simplecov                                    | 22 ----------------
 config/initializers/simple_cov_source_file.rb | 19 ++++++++++++++
 spec/rails_helper.rb                          | 25 +++++++++++++++++++
 spec/spec_helper.rb                           |  4 ---
 4 files changed, 44 insertions(+), 26 deletions(-)
 delete mode 100644 .simplecov
 create mode 100644 config/initializers/simple_cov_source_file.rb

diff --git a/.simplecov b/.simplecov
deleted file mode 100644
index fbd0207be..000000000
--- a/.simplecov
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-if ENV['CI']
-  require 'simplecov-lcov'
-  SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
-  SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
-else
-  SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
-end
-
-SimpleCov.start 'rails' do
-  enable_coverage :branch
-
-  add_filter 'lib/linter'
-
-  add_group 'Libraries', 'lib'
-  add_group 'Policies', 'app/policies'
-  add_group 'Presenters', 'app/presenters'
-  add_group 'Serializers', 'app/serializers'
-  add_group 'Services', 'app/services'
-  add_group 'Validators', 'app/validators'
-end
diff --git a/config/initializers/simple_cov_source_file.rb b/config/initializers/simple_cov_source_file.rb
new file mode 100644
index 000000000..c6b3586c8
--- /dev/null
+++ b/config/initializers/simple_cov_source_file.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+# TODO: https://github.com/simplecov-ruby/simplecov/pull/1084
+# Patches this missing condition, monitor for upstream fix
+
+module SimpleCov
+  module SourceFileExtensions
+    def build_branches
+      coverage_branch_data = coverage_data.fetch('branches', {}) || {} # Add the final empty hash in case where 'branches' is present, but returns nil
+      branches = coverage_branch_data.flat_map do |condition, coverage_branches|
+        build_branches_from(condition, coverage_branches)
+      end
+
+      process_skipped_branches(branches)
+    end
+  end
+end
+
+SimpleCov::SourceFile.prepend(SimpleCov::SourceFileExtensions) if defined?(SimpleCov::SourceFile)
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index d8eb561d4..38aa71108 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -2,6 +2,31 @@
 
 ENV['RAILS_ENV'] ||= 'test'
 
+unless ENV['DISABLE_SIMPLECOV'] == 'true'
+  require 'simplecov'
+
+  SimpleCov.start 'rails' do
+    if ENV['CI']
+      require 'simplecov-lcov'
+      formatter SimpleCov::Formatter::LcovFormatter
+      formatter.config.report_with_single_file = true
+    else
+      formatter SimpleCov::Formatter::HTMLFormatter
+    end
+
+    enable_coverage :branch
+
+    add_filter 'lib/linter'
+
+    add_group 'Libraries', 'lib'
+    add_group 'Policies', 'app/policies'
+    add_group 'Presenters', 'app/presenters'
+    add_group 'Serializers', 'app/serializers'
+    add_group 'Services', 'app/services'
+    add_group 'Validators', 'app/validators'
+  end
+end
+
 # This needs to be defined before Rails is initialized
 STREAMING_PORT = ENV.fetch('TEST_STREAMING_PORT', '4020')
 ENV['STREAMING_API_BASE_URL'] = "http://localhost:#{STREAMING_PORT}"
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 8a01792a1..1f9cc40f1 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,9 +1,5 @@
 # frozen_string_literal: true
 
-unless ENV['DISABLE_SIMPLECOV'] == 'true'
-  require 'simplecov' # Configuration details loaded from .simplecov
-end
-
 RSpec.configure do |config|
   config.example_status_persistence_file_path = 'tmp/rspec/examples.txt'
   config.expect_with :rspec do |expectations|

From 85c625d31974e411666812468ddfd7760ab67d4a Mon Sep 17 00:00:00 2001
From: Jason Punyon <jason.punyon@gmail.com>
Date: Wed, 15 May 2024 05:38:16 -0400
Subject: [PATCH 123/215] Fix repetitive database queries from #30040 (#30259)

---
 app/helpers/application_helper.rb       | 13 +++++++++----
 app/presenters/instance_presenter.rb    | 12 ++++++++++++
 app/serializers/manifest_serializer.rb  |  2 +-
 app/views/layouts/application.html.haml |  6 +++---
 spec/helpers/application_helper_spec.rb | 15 ++++++++++-----
 5 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index ff351429e..eb03f1e4b 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -240,11 +240,16 @@ module ApplicationHelper
     EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s
   end
 
-  def site_icon_path(type, size = '48')
-    icon = SiteUpload.find_by(var: type)
-    return nil unless icon
+  def instance_presenter
+    @instance_presenter ||= InstancePresenter.new
+  end
 
-    icon.file.url(size)
+  def favicon_path(size = '48')
+    instance_presenter.favicon&.file&.url(size)
+  end
+
+  def app_icon_path(size = '48')
+    instance_presenter.app_icon&.file&.url(size)
   end
 
   private
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index 25df4d85a..92415a690 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -81,4 +81,16 @@ class InstancePresenter < ActiveModelSerializers::Model
   def mascot
     @mascot ||= Rails.cache.fetch('site_uploads/mascot') { SiteUpload.find_by(var: 'mascot') }
   end
+
+  def favicon
+    return @favicon if defined?(@favicon)
+
+    @favicon ||= Rails.cache.fetch('site_uploads/favicon') { SiteUpload.find_by(var: 'favicon') }
+  end
+
+  def app_icon
+    return @app_icon if defined?(@app_icon)
+
+    @app_icon ||= Rails.cache.fetch('site_uploads/app_icon') { SiteUpload.find_by(var: 'app_icon') }
+  end
 end
diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index 759490228..a39fb5ef5 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -27,7 +27,7 @@ class ManifestSerializer < ActiveModel::Serializer
 
   def icons
     SiteUpload::ANDROID_ICON_SIZES.map do |size|
-      src = site_icon_path('app_icon', size.to_i)
+      src = app_icon_path(size.to_i)
       src = URI.join(root_url, src).to_s if src.present?
 
       {
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index e3d05226e..5957d1dbf 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -11,13 +11,13 @@
     - if storage_host?
       %link{ rel: 'dns-prefetch', href: storage_host }/
 
-    %link{ rel: 'icon', href: site_icon_path('favicon', 'ico') || '/favicon.ico', type: 'image/x-icon' }/
+    %link{ rel: 'icon', href: favicon_path('ico') || '/favicon.ico', type: 'image/x-icon' }/
 
     - SiteUpload::FAVICON_SIZES.each do |size|
-      %link{ rel: 'icon', sizes: "#{size}x#{size}", href: site_icon_path('favicon', size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
+      %link{ rel: 'icon', sizes: "#{size}x#{size}", href: favicon_path(size.to_i) || frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
 
     - SiteUpload::APPLE_ICON_SIZES.each do |size|
-      %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: site_icon_path('app_icon', size.to_i) || frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/
+      %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: app_icon_path(size.to_i) || frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/
 
     %link{ rel: 'mask-icon', href: frontend_asset_path('images/logo-symbol-icon.svg'), color: '#6364FF' }/
     %link{ rel: 'manifest', href: manifest_path(format: :json) }/
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 56501034b..56974513b 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -286,26 +286,31 @@ describe ApplicationHelper do
     end
   end
 
-  describe '#site_icon_path' do
+  describe 'favicon' do
     context 'when an icon exists' do
       let!(:favicon) { Fabricate(:site_upload, var: 'favicon') }
+      let!(:app_icon) { Fabricate(:site_upload, var: 'app_icon') }
 
       it 'returns the URL of the icon' do
-        expect(helper.site_icon_path('favicon')).to eq(favicon.file.url('48'))
+        expect(helper.favicon_path).to eq(favicon.file.url('48'))
+        expect(helper.app_icon_path).to eq(app_icon.file.url('48'))
       end
 
       it 'returns the URL of the icon with size parameter' do
-        expect(helper.site_icon_path('favicon', 16)).to eq(favicon.file.url('16'))
+        expect(helper.favicon_path(16)).to eq(favicon.file.url('16'))
+        expect(helper.app_icon_path(16)).to eq(app_icon.file.url('16'))
       end
     end
 
     context 'when an icon does not exist' do
       it 'returns nil' do
-        expect(helper.site_icon_path('favicon')).to be_nil
+        expect(helper.favicon_path).to be_nil
+        expect(helper.app_icon_path).to be_nil
       end
 
       it 'returns nil with size parameter' do
-        expect(helper.site_icon_path('favicon', 16)).to be_nil
+        expect(helper.favicon_path(16)).to be_nil
+        expect(helper.app_icon_path(16)).to be_nil
       end
     end
   end

From 4e085dff52f88a4bb81f4f6cbe4c7a37ebfb2390 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 15:05:05 +0200
Subject: [PATCH 124/215] chore(deps): update dependency aws-sdk-s3 to v1.151.0
 (#30287)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile.lock | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 2854528b7..d34d634f5 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -100,16 +100,16 @@ GEM
     attr_required (1.0.2)
     awrence (1.2.1)
     aws-eventstream (1.3.0)
-    aws-partitions (1.922.0)
-    aws-sdk-core (3.194.1)
+    aws-partitions (1.929.0)
+    aws-sdk-core (3.196.1)
       aws-eventstream (~> 1, >= 1.3.0)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.8)
       jmespath (~> 1, >= 1.6.1)
-    aws-sdk-kms (1.80.0)
+    aws-sdk-kms (1.81.0)
       aws-sdk-core (~> 3, >= 3.193.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.149.1)
+    aws-sdk-s3 (1.151.0)
       aws-sdk-core (~> 3, >= 3.194.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.8)

From c2ca3d152f1dda0f4f5d2455ae9c550779a2c10e Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Wed, 15 May 2024 15:11:13 +0200
Subject: [PATCH 125/215] Fix off-by-one in `tootctl media` commands (#30306)

---
 lib/mastodon/cli/media.rb | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/mastodon/cli/media.rb b/lib/mastodon/cli/media.rb
index e26b4f24a..509d11a81 100644
--- a/lib/mastodon/cli/media.rb
+++ b/lib/mastodon/cli/media.rb
@@ -128,7 +128,7 @@ module Mastodon::CLI
 
             model_name      = path_segments.first.classify
             attachment_name = path_segments[1].singularize
-            record_id       = path_segments[2..-2].join.to_i
+            record_id       = path_segments[2...-2].join.to_i
             file_name       = path_segments.last
             record          = record_map.dig(model_name, record_id)
             attachment      = record&.public_send(attachment_name)
@@ -172,7 +172,7 @@ module Mastodon::CLI
           end
 
           model_name      = path_segments.first.classify
-          record_id       = path_segments[2..-2].join.to_i
+          record_id       = path_segments[2...-2].join.to_i
           attachment_name = path_segments[1].singularize
           file_name       = path_segments.last
 
@@ -297,7 +297,7 @@ module Mastodon::CLI
       fail_with_message 'Not a media URL' unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size)
 
       model_name = path_segments.first.classify
-      record_id  = path_segments[2..-2].join.to_i
+      record_id  = path_segments[2...-2].join.to_i
 
       fail_with_message "Cannot find corresponding model: #{model_name}" unless PRELOAD_MODEL_WHITELIST.include?(model_name)
 
@@ -353,7 +353,7 @@ module Mastodon::CLI
         next unless VALID_PATH_SEGMENTS_SIZE.include?(segments.size)
 
         model_name = segments.first.classify
-        record_id  = segments[2..-2].join.to_i
+        record_id  = segments[2...-2].join.to_i
 
         next unless PRELOAD_MODEL_WHITELIST.include?(model_name)
 

From 5fd56512de244263b4b0df998b8a83c303c3d1c5 Mon Sep 17 00:00:00 2001
From: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
Date: Wed, 15 May 2024 15:38:36 +0200
Subject: [PATCH 126/215] Improve Report Notes and Account Moderation Notes
 (#30288)

---
 app/models/account_moderation_note.rb         |  2 +-
 app/models/report_note.rb                     |  2 +-
 app/views/admin/accounts/show.html.haml       | 10 ++++----
 app/views/admin/reports/show.html.haml        | 14 ++++++-----
 config/navigation.rb                          |  4 ++--
 ...ccount_moderation_notes_controller_spec.rb | 13 ++++++++--
 .../admin/report_notes_controller_spec.rb     | 24 ++++++++++++++-----
 7 files changed, 47 insertions(+), 22 deletions(-)

diff --git a/app/models/account_moderation_note.rb b/app/models/account_moderation_note.rb
index ad49b2422..79b8b4d25 100644
--- a/app/models/account_moderation_note.rb
+++ b/app/models/account_moderation_note.rb
@@ -13,7 +13,7 @@
 #
 
 class AccountModerationNote < ApplicationRecord
-  CONTENT_SIZE_LIMIT = 500
+  CONTENT_SIZE_LIMIT = 2_000
 
   belongs_to :account
   belongs_to :target_account, class_name: 'Account'
diff --git a/app/models/report_note.rb b/app/models/report_note.rb
index b5c40a18b..7361c97e6 100644
--- a/app/models/report_note.rb
+++ b/app/models/report_note.rb
@@ -13,7 +13,7 @@
 #
 
 class ReportNote < ApplicationRecord
-  CONTENT_SIZE_LIMIT = 500
+  CONTENT_SIZE_LIMIT = 2_000
 
   belongs_to :account
   belongs_to :report, inverse_of: :notes, touch: true
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index 41fcafa29..bcf7c0731 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -62,14 +62,16 @@
   .report-notes
     = render partial: 'admin/report_notes/report_note', collection: @moderation_notes
 
-  = simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |f|
-    = f.hidden_field :target_account_id
+  = simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |form|
+    = form.hidden_field :target_account_id
+
+    = render 'shared/error_messages', object: @account_moderation_note
 
     .field-group
-      = f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6
+      = form.input :content, input_html: { placeholder: t('admin.reports.notes.placeholder'), maxlength: AccountModerationNote::CONTENT_SIZE_LIMIT, rows: 6, autofocus: @account_moderation_note.errors.any? }
 
     .actions
-      = f.button :button, t('admin.account_moderation_notes.create'), type: :submit
+      = form.button :button, t('admin.account_moderation_notes.create'), type: :submit
 
   %hr.spacer/
 
diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml
index c880021cf..842aa5159 100644
--- a/app/views/admin/reports/show.html.haml
+++ b/app/views/admin/reports/show.html.haml
@@ -83,15 +83,17 @@
 .report-notes
   = render @report_notes
 
-= simple_form_for @report_note, url: admin_report_notes_path do |f|
-  = f.input :report_id, as: :hidden
+= simple_form_for @report_note, url: admin_report_notes_path do |form|
+  = form.input :report_id, as: :hidden
+
+  = render 'shared/error_messages', object: @report_note
 
   .field-group
-    = f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6
+    = form.input :content, input_html: { placeholder: t('admin.reports.notes.placeholder'), maxlength: ReportNote::CONTENT_SIZE_LIMIT, rows: 6, autofocus: @report_note.errors.any? }
 
   .actions
     - if @report.unresolved?
-      = f.button :button, t('admin.reports.notes.create_and_resolve'), name: :create_and_resolve, type: :submit
+      = form.button :button, t('admin.reports.notes.create_and_resolve'), name: :create_and_resolve, type: :submit
     - else
-      = f.button :button, t('admin.reports.notes.create_and_unresolve'), name: :create_and_unresolve, type: :submit
-    = f.button :button, t('admin.reports.notes.create'), type: :submit
+      = form.button :button, t('admin.reports.notes.create_and_unresolve'), name: :create_and_unresolve, type: :submit
+    = form.button :button, t('admin.reports.notes.create'), type: :submit
diff --git a/config/navigation.rb b/config/navigation.rb
index 791025d52..b6e3f4950 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -45,8 +45,8 @@ SimpleNavigation::Configuration.run do |navigation|
     end
 
     n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), nil, if: -> { current_user.can?(:manage_reports, :view_audit_log, :manage_users, :manage_invites, :manage_taxonomies, :manage_federation, :manage_blocks) && !self_destruct } do |s|
-      s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports}, if: -> { current_user.can?(:manage_reports) }
-      s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) }
+      s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_path, highlights_on: %r{/admin/reports|admin/report_notes}, if: -> { current_user.can?(:manage_reports) }
+      s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_path(origin: 'local'), highlights_on: %r{/admin/accounts|admin/account_moderation_notes|/admin/pending_accounts|/admin/disputes|/admin/users}, if: -> { current_user.can?(:manage_users) }
       s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path, if: -> { current_user.can?(:manage_invites) }
       s.item :follow_recommendations, safe_join([fa_icon('user-plus fw'), t('admin.follow_recommendations.title')]), admin_follow_recommendations_path, highlights_on: %r{/admin/follow_recommendations}, if: -> { current_user.can?(:manage_taxonomies) }
       s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_path(limited: limited_federation_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.can?(:manage_federation) }
diff --git a/spec/controllers/admin/account_moderation_notes_controller_spec.rb b/spec/controllers/admin/account_moderation_notes_controller_spec.rb
index 8d24a7af3..5ea546f41 100644
--- a/spec/controllers/admin/account_moderation_notes_controller_spec.rb
+++ b/spec/controllers/admin/account_moderation_notes_controller_spec.rb
@@ -24,10 +24,19 @@ RSpec.describe Admin::AccountModerationNotesController do
       end
     end
 
-    context 'when parameters are invalid' do
+    context 'when the content is too short' do
       let(:params) { { account_moderation_note: { target_account_id: target_account.id, content: '' } } }
 
-      it 'falls to create a note' do
+      it 'fails to create a note' do
+        expect { subject }.to_not change(AccountModerationNote, :count)
+        expect(response).to render_template 'admin/accounts/show'
+      end
+    end
+
+    context 'when the content is too long' do
+      let(:params) { { account_moderation_note: { target_account_id: target_account.id, content: 'test' * AccountModerationNote::CONTENT_SIZE_LIMIT } } }
+
+      it 'fails to create a note' do
         expect { subject }.to_not change(AccountModerationNote, :count)
         expect(response).to render_template 'admin/accounts/show'
       end
diff --git a/spec/controllers/admin/report_notes_controller_spec.rb b/spec/controllers/admin/report_notes_controller_spec.rb
index 4ddf4a4e2..8d5b5c7ae 100644
--- a/spec/controllers/admin/report_notes_controller_spec.rb
+++ b/spec/controllers/admin/report_notes_controller_spec.rb
@@ -22,7 +22,7 @@ describe Admin::ReportNotesController do
         let(:account_id) { nil }
 
         context 'when create_and_resolve flag is on' do
-          let(:params) { { report_note: { content: 'test content', report_id: report.id }, create_and_resolve: nil } }
+          let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_resolve: nil } }
 
           it 'creates a report note and resolves report' do
             expect { subject }.to change(ReportNote, :count).by(1)
@@ -32,7 +32,7 @@ describe Admin::ReportNotesController do
         end
 
         context 'when create_and_resolve flag is false' do
-          let(:params) { { report_note: { content: 'test content', report_id: report.id } } }
+          let(:params) { { report_note: { report_id: report.id, content: 'test content' } } }
 
           it 'creates a report note and does not resolve report' do
             expect { subject }.to change(ReportNote, :count).by(1)
@@ -47,7 +47,7 @@ describe Admin::ReportNotesController do
         let(:account_id) { user.account.id }
 
         context 'when create_and_unresolve flag is on' do
-          let(:params) { { report_note: { content: 'test content', report_id: report.id }, create_and_unresolve: nil } }
+          let(:params) { { report_note: { report_id: report.id, content: 'test content' }, create_and_unresolve: nil } }
 
           it 'creates a report note and unresolves report' do
             expect { subject }.to change(ReportNote, :count).by(1)
@@ -57,7 +57,7 @@ describe Admin::ReportNotesController do
         end
 
         context 'when create_and_unresolve flag is false' do
-          let(:params) { { report_note: { content: 'test content', report_id: report.id } } }
+          let(:params) { { report_note: { report_id: report.id, content: 'test content' } } }
 
           it 'creates a report note and does not unresolve report' do
             expect { subject }.to change(ReportNote, :count).by(1)
@@ -68,12 +68,24 @@ describe Admin::ReportNotesController do
       end
     end
 
-    context 'when parameter is invalid' do
-      let(:params) { { report_note: { content: '', report_id: report.id } } }
+    context 'when content is too short' do
+      let(:params) { { report_note: { report_id: report.id, content: '' } } }
       let(:action_taken) { nil }
       let(:account_id) { nil }
 
       it 'renders admin/reports/show' do
+        expect { subject }.to_not change(ReportNote, :count)
+        expect(subject).to render_template 'admin/reports/show'
+      end
+    end
+
+    context 'when content is too long' do
+      let(:params) { { report_note: { report_id: report.id, content: 'test' * ReportNote::CONTENT_SIZE_LIMIT } } }
+      let(:action_taken) { nil }
+      let(:account_id) { nil }
+
+      it 'renders admin/reports/show' do
+        expect { subject }.to_not change(ReportNote, :count)
         expect(subject).to render_template 'admin/reports/show'
       end
     end

From d5d3a0fc57ff712061a3bd18736d68851f04f86c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 15 May 2024 15:38:51 +0200
Subject: [PATCH 127/215] fix(deps): update dependency pino to v9.1.0 (#30283)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 3741a5419..3d85014d4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13042,13 +13042,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pino-std-serializers@npm:^6.0.0":
-  version: 6.2.2
-  resolution: "pino-std-serializers@npm:6.2.2"
-  checksum: 10c0/8f1c7f0f0d8f91e6c6b5b2a6bfb48f06441abeb85f1c2288319f736f9c6d814fbeebe928d2314efc2ba6018fa7db9357a105eca9fc99fc1f28945a8a8b28d3d5
-  languageName: node
-  linkType: hard
-
 "pino-std-serializers@npm:^7.0.0":
   version: 7.0.0
   resolution: "pino-std-serializers@npm:7.0.0"
@@ -13057,23 +13050,23 @@ __metadata:
   linkType: hard
 
 "pino@npm:^9.0.0":
-  version: 9.0.0
-  resolution: "pino@npm:9.0.0"
+  version: 9.1.0
+  resolution: "pino@npm:9.1.0"
   dependencies:
     atomic-sleep: "npm:^1.0.0"
     fast-redact: "npm:^3.1.1"
     on-exit-leak-free: "npm:^2.1.0"
     pino-abstract-transport: "npm:^1.2.0"
-    pino-std-serializers: "npm:^6.0.0"
+    pino-std-serializers: "npm:^7.0.0"
     process-warning: "npm:^3.0.0"
     quick-format-unescaped: "npm:^4.0.3"
     real-require: "npm:^0.2.0"
     safe-stable-stringify: "npm:^2.3.1"
-    sonic-boom: "npm:^3.7.0"
-    thread-stream: "npm:^2.6.0"
+    sonic-boom: "npm:^4.0.1"
+    thread-stream: "npm:^3.0.0"
   bin:
     pino: bin.js
-  checksum: 10c0/10ef10aee0cf80af8ed83468cff2e29d642b6794b53cf641e1abcaf9e9958d8bcbc6e09d62757054aef3b4415c45d66a5018da11d43b81a23ba299ef5dc4e8b1
+  checksum: 10c0/d060530ae2e4e8f21d04bb0f44f009f94d207d7f4337f508f618416514214ddaf1b29f8c5c265153a19ce3b6480b451461f40020f916ace9d53a5aa07624b79c
   languageName: node
   linkType: hard
 
@@ -15822,7 +15815,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"sonic-boom@npm:^3.0.0, sonic-boom@npm:^3.7.0":
+"sonic-boom@npm:^3.0.0":
   version: 3.7.0
   resolution: "sonic-boom@npm:3.7.0"
   dependencies:
@@ -15831,6 +15824,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"sonic-boom@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "sonic-boom@npm:4.0.1"
+  dependencies:
+    atomic-sleep: "npm:^1.0.0"
+  checksum: 10c0/7b467f2bc8af7ff60bf210382f21c59728cc4b769af9b62c31dd88723f5cc472752d2320736cc366acc7c765ddd5bec3072c033b0faf249923f576a7453ba9d3
+  languageName: node
+  linkType: hard
+
 "source-list-map@npm:^2.0.0":
   version: 2.0.1
   resolution: "source-list-map@npm:2.0.1"
@@ -16776,12 +16778,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"thread-stream@npm:^2.6.0":
-  version: 2.6.0
-  resolution: "thread-stream@npm:2.6.0"
+"thread-stream@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "thread-stream@npm:3.0.0"
   dependencies:
     real-require: "npm:^0.2.0"
-  checksum: 10c0/276e2545b33273232eb2c22c53fc11844951c1322f8a78c522477af716ebcfe0d106ccf1fbc455f6e48d928e93231fed6377ce91fdcb3885086e8ffa1f011c88
+  checksum: 10c0/1f4da5a8c93b170cdc7c1ad774af49bb2af43f73cfd9a7f8fb02b766255b483eb6d0b734502c880397baa95c0ce3490088b9a487cff32d4e481aab6fe76560f5
   languageName: node
   linkType: hard
 

From ca560c10958d3ad96736c974c778380c2adacef2 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Wed, 15 May 2024 09:57:13 -0400
Subject: [PATCH 128/215] Disable `Style/RedundantFetchBlock` cop (#30207)

---
 .rubocop.yml      |  5 +++++
 .rubocop_todo.yml | 10 ----------
 2 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/.rubocop.yml b/.rubocop.yml
index 542e90b5e..cbc0afd28 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -211,6 +211,11 @@ Style/PercentLiteralDelimiters:
 Style/RedundantBegin:
   Enabled: false
 
+# Reason: Prevailing style choice
+# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantfetchblock
+Style/RedundantFetchBlock:
+  Enabled: false
+
 # Reason: Overridden to reduce implicit StandardError rescues
 # https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
 Style/RescueStandardError:
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index b47d682f3..064f62208 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -169,16 +169,6 @@ Style/RedundantConstantBase:
     - 'config/environments/production.rb'
     - 'config/initializers/sidekiq.rb'
 
-# This cop supports unsafe autocorrection (--autocorrect-all).
-# Configuration parameters: SafeForConstants.
-Style/RedundantFetchBlock:
-  Exclude:
-    - 'config/initializers/1_hosts.rb'
-    - 'config/initializers/chewy.rb'
-    - 'config/initializers/devise.rb'
-    - 'config/initializers/paperclip.rb'
-    - 'config/puma.rb'
-
 # This cop supports unsafe autocorrection (--autocorrect-all).
 # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
 # AllowedMethods: present?, blank?, presence, try, try!

From 94493cff925ee9b9cb4ebc7cc20081ab20521b85 Mon Sep 17 00:00:00 2001
From: David Lapshin <ddaudix@gmail.com>
Date: Thu, 16 May 2024 10:33:29 +0300
Subject: [PATCH 129/215] Fix incorrect element selector from #30221 (#30307)

---
 app/javascript/styles/mastodon/components.scss | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 927c57d99..f377eed95 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -4365,10 +4365,6 @@ a.status-card {
     outline: $ui-button-focus-outline;
   }
 
-  .no-reduce-motion .icon {
-    transition: transform 0.15s ease-in-out;
-  }
-
   &.active {
     color: $primary-text-color;
 
@@ -4387,6 +4383,10 @@ a.status-card {
   }
 }
 
+.no-reduce-motion .column-header__button .icon {
+  transition: transform 150ms ease-in-out;
+}
+
 .column-header__collapsible {
   max-height: 70vh;
   overflow: hidden;

From 60b423b3f72feea31e0d22b02b948848819ad601 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 16 May 2024 09:43:31 +0200
Subject: [PATCH 130/215] chore(deps): update dependency rspec-sidekiq to v5
 (#30314)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Gemfile b/Gemfile
index b9baef703..240dcce95 100644
--- a/Gemfile
+++ b/Gemfile
@@ -132,7 +132,7 @@ group :test do
   gem 'email_spec'
 
   # Extra RSpec extension methods and helpers for sidekiq
-  gem 'rspec-sidekiq', '~> 4.0'
+  gem 'rspec-sidekiq', '~> 5.0'
 
   # Browser integration testing
   gem 'capybara', '~> 3.39'
diff --git a/Gemfile.lock b/Gemfile.lock
index d34d634f5..a20ac79ae 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -708,7 +708,7 @@ GEM
       rspec-support (~> 3.13.0)
     rspec-github (2.4.0)
       rspec-core (~> 3.0)
-    rspec-mocks (3.13.0)
+    rspec-mocks (3.13.1)
       diff-lcs (>= 1.2.0, < 2.0)
       rspec-support (~> 3.13.0)
     rspec-rails (6.1.2)
@@ -719,7 +719,7 @@ GEM
       rspec-expectations (~> 3.13)
       rspec-mocks (~> 3.13)
       rspec-support (~> 3.13)
-    rspec-sidekiq (4.2.0)
+    rspec-sidekiq (5.0.0)
       rspec-core (~> 3.0)
       rspec-expectations (~> 3.0)
       rspec-mocks (~> 3.0)
@@ -1012,7 +1012,7 @@ DEPENDENCIES
   rqrcode (~> 2.2)
   rspec-github (~> 2.4)
   rspec-rails (~> 6.0)
-  rspec-sidekiq (~> 4.0)
+  rspec-sidekiq (~> 5.0)
   rubocop
   rubocop-capybara
   rubocop-performance

From c9ee1437c0a12bea5fbafb7efbb8e87e4eb6fe0e Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Thu, 16 May 2024 03:43:35 -0400
Subject: [PATCH 131/215] Use ruby language constants to build version string
 in software version dimension (#30309)

---
 .../admin/metrics/dimension/software_versions_dimension.rb | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
index ccf556eae..97cdaf589 100644
--- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb
+++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
@@ -25,14 +25,11 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim
   end
 
   def ruby_version
-    yjit = defined?(RubyVM::YJIT) && RubyVM::YJIT.enabled?
-    value = "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}#{yjit ? ' +YJIT' : ''}"
-
     {
       key: 'ruby',
       human_key: 'Ruby',
-      value: value,
-      human_value: value,
+      value: "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}",
+      human_value: RUBY_DESCRIPTION,
     }
   end
 

From cdb042ae860c79d47920f30a3ba8b7625e7de56d Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 16 May 2024 09:50:19 +0200
Subject: [PATCH 132/215] New Crowdin Translations (automated) (#30319)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/gl.json |  2 +-
 app/javascript/mastodon/locales/sk.json |  3 ++-
 app/javascript/mastodon/locales/tr.json |  2 +-
 config/locales/sk.yml                   | 15 +++++++++++++++
 4 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 88d4f5f60..98cc31394 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -92,7 +92,7 @@
   "block_modal.remote_users_caveat": "Ímoslle pedir ao servidor {domain} que respecte a túa decisión. Emporiso, non hai garantía de que atenda a petición xa que os servidores xestionan os bloqueos de formas diferentes. As publicacións públicas poderían aínda ser visibles para usuarias que non iniciaron sesión.",
   "block_modal.show_less": "Mostrar menos",
   "block_modal.show_more": "Mostrar máis",
-  "block_modal.they_cant_mention": "Non te pode seguir nin mencionar.",
+  "block_modal.they_cant_mention": "Non te poden seguir nin mencionar.",
   "block_modal.they_cant_see_posts": "Non pode ver as túas publicacións nin ti as de ela.",
   "block_modal.they_will_know": "Pode ver que a bloqueaches.",
   "block_modal.title": "Bloquear usuaria?",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 0c7646741..c583b5822 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -295,7 +295,7 @@
   "follow_suggestions.personalized_suggestion": "Prispôsobený návrh",
   "follow_suggestions.popular_suggestion": "Obľúbený návrh",
   "follow_suggestions.popular_suggestion_longer": "Populárne na {domain}",
-  "follow_suggestions.similar_to_recently_followed_longer": "Podobné profilom ktoré si nedávno nasledoval/a",
+  "follow_suggestions.similar_to_recently_followed_longer": "Podobné profilom, ktoré si nedávno nasledoval/a",
   "follow_suggestions.view_all": "Zobraziť všetky",
   "follow_suggestions.who_to_follow": "Koho sledovať",
   "followed_tags": "Sledované hashtagy",
@@ -446,6 +446,7 @@
   "notification.follow_request": "{name} vás žiada sledovať",
   "notification.mention": "{name} vás spomína",
   "notification.moderation-warning.learn_more": "Zisti viac",
+  "notification.moderation_warning.action_disable": "Tvoj účet bol vypnutý.",
   "notification.moderation_warning.action_silence": "Tvoj účet bol obmedzený.",
   "notification.moderation_warning.action_suspend": "Tvoj účet bol pozastavený.",
   "notification.own_poll": "Vaša anketa sa skončila",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index c46080cfb..6c0110659 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -474,7 +474,7 @@
   "notification.follow_request": "{name} size takip isteği gönderdi",
   "notification.mention": "{name} senden bahsetti",
   "notification.moderation-warning.learn_more": "Daha fazlası",
-  "notification.moderation_warning": "Bir denetim uyarısı aldınız",
+  "notification.moderation_warning": "Hesabınız bir denetim uyarısı aldı",
   "notification.moderation_warning.action_delete_statuses": "Bazı gönderileriniz kaldırıldı.",
   "notification.moderation_warning.action_disable": "Hesabınız devre dışı bırakıldı.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Bazı gönderileriniz hassas olarak işaretlendi.",
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 78e7bdb25..f05887dc3 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -254,9 +254,12 @@ sk:
         destroy_status_html: "%{name} zmazal/a príspevok od %{target}"
         destroy_unavailable_domain_html: "%{name} znova spustil/a doručovanie pre doménu %{target}"
         destroy_user_role_html: "%{name} vymazal/a rolu pre %{target}"
+        enable_custom_emoji_html: "%{name} povolil/a emotikonu %{target}"
         enable_user_html: "%{name} povolil/a prihlásenie pre používateľa %{target}"
         memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku"
+        promote_user_html: "%{name} povýšil/a užívateľa %{target}"
         reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}"
+        reject_user_html: "%{name} odmietol/la registráciu od %{target}"
         remove_avatar_user_html: "%{name} vymazal/a %{target}/ov/in avatar"
         reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}"
         resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}"
@@ -266,7 +269,9 @@ sk:
         silence_account_html: "%{name} obmedzil/a účet %{target}"
         suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}"
         unassigned_report_html: "%{name} odobral/a report od %{target}"
+        unblock_email_account_html: "%{name} odblokoval/a %{target}ovu/inu emailovú adresu"
         unsensitive_account_html: "%{name} odznačil/a médium od %{target} ako chúlostivé"
+        unsilence_account_html: "%{name} zrušil/a obmedzenie %{target}ovho/inho účtu"
         unsuspend_account_html: "%{name} spojazdnil/a účet %{target}"
         update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}"
         update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}"
@@ -529,6 +534,9 @@ sk:
       actions:
         suspend_description_html: Tento účet a všetok jeho obsah bude nedostupný a nakoniec zmazaný, interaktovať s ním bude nemožné. Zvrátiteľné v rámci 30 dní. Uzatvára všetky hlásenia voči tomuto účtu.
       add_to_report: Pridaj viac do hlásenia
+      already_suspended_badges:
+        local: Na tomto serveri už vylúčený/á
+        remote: Už vylúčený/á na ich serveri
       are_you_sure: Si si istý/á?
       assign_to_self: Priraď sebe
       assigned: Priradený moderátor
@@ -538,6 +546,7 @@ sk:
       comment:
         none: Žiadne
       confirm: Potvrď
+      confirm_action: Potvrď moderovací úkon proti @%{acct}
       created_at: Nahlásené
       delete_and_resolve: Vymaž príspevky
       forwarded: Preposlané
@@ -592,8 +601,14 @@ sk:
       delete: Vymaž
       edit: Uprav postavenie %{name}
       everyone: Východzie oprávnenia
+      permissions_count:
+        few: "%{count} povolení"
+        many: "%{count} povolení"
+        one: "%{count} povolenie"
+        other: "%{count} povolenia"
       privileges:
         administrator: Správca
+        administrator_description: Užívatelia s týmto povolením, obídu všetky povolenia
         delete_user_data: Vymaž užívateľské dáta
         invite_users: Pozvi užívateľov
         manage_announcements: Spravuj oboznámenia

From 356bbbaa7f903b7849af1bb78a7954c250c00d46 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 16 May 2024 09:57:19 +0200
Subject: [PATCH 133/215] fix(deps): update dependency @reduxjs/toolkit to
 v2.2.5 (#30320)

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 3d85014d4..07c89a529 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3050,8 +3050,8 @@ __metadata:
   linkType: hard
 
 "@reduxjs/toolkit@npm:^2.0.1":
-  version: 2.2.4
-  resolution: "@reduxjs/toolkit@npm:2.2.4"
+  version: 2.2.5
+  resolution: "@reduxjs/toolkit@npm:2.2.5"
   dependencies:
     immer: "npm:^10.0.3"
     redux: "npm:^5.0.1"
@@ -3065,7 +3065,7 @@ __metadata:
       optional: true
     react-redux:
       optional: true
-  checksum: 10c0/fdbf510210a5aa4864432397e1a9469367e297cd1d9c09a82e68638df7555672c2f8511fe76f933b00efbbb233c534831591772a44e8c41233e34f3cd0f54569
+  checksum: 10c0/be0593bf26852482fb8716b9248531466c6e8782a3114b823ae680fce90267d8c5512a3231cfecc30b17eff81a4604112772b49ad7ca6a3366ddd4f2a838e53c
   languageName: node
   linkType: hard
 

From f0d6dc4519cc0311583f139834fbbbcd64e82d7a Mon Sep 17 00:00:00 2001
From: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
Date: Thu, 16 May 2024 09:59:46 +0200
Subject: [PATCH 134/215] Fix: Mark redirect uris field in Development >
 Application form as required (#30311)

---
 app/controllers/settings/applications_controller.rb | 2 +-
 app/views/settings/applications/_fields.html.haml   | 1 +
 config/navigation.rb                                | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/app/controllers/settings/applications_controller.rb b/app/controllers/settings/applications_controller.rb
index d4b720568..6849979b1 100644
--- a/app/controllers/settings/applications_controller.rb
+++ b/app/controllers/settings/applications_controller.rb
@@ -13,7 +13,7 @@ class Settings::ApplicationsController < Settings::BaseController
   def new
     @application = Doorkeeper::Application.new(
       redirect_uri: Doorkeeper.configuration.native_redirect_uri,
-      scopes: 'read write follow'
+      scopes: 'read:me'
     )
   end
 
diff --git a/app/views/settings/applications/_fields.html.haml b/app/views/settings/applications/_fields.html.haml
index ed97e880f..d53984895 100644
--- a/app/views/settings/applications/_fields.html.haml
+++ b/app/views/settings/applications/_fields.html.haml
@@ -11,6 +11,7 @@
 .fields-group
   = f.input :redirect_uri,
             label: t('activerecord.attributes.doorkeeper/application.redirect_uri'), hint: t('doorkeeper.applications.help.redirect_uri'),
+            required: true,
             wrapper: :with_block_label
 
   %p.hint= t('doorkeeper.applications.help.native_redirect_uri', native_redirect_uri: content_tag(:code, Doorkeeper.configuration.native_redirect_uri)).html_safe
diff --git a/config/navigation.rb b/config/navigation.rb
index b6e3f4950..efac96d46 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -36,7 +36,7 @@ SimpleNavigation::Configuration.run do |navigation|
     end
 
     n.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: -> { current_user.can?(:invite_users) && current_user.functional? && !self_destruct }
-    n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_path, if: -> { current_user.functional? && !self_destruct }
+    n.item :development, safe_join([fa_icon('code fw'), t('settings.development')]), settings_applications_path, highlights_on: %r{/settings/applications}, if: -> { current_user.functional? && !self_destruct }
 
     n.item :trends, safe_join([fa_icon('fire fw'), t('admin.trends.title')]), admin_trends_statuses_path, if: -> { current_user.can?(:manage_taxonomies) && !self_destruct } do |s|
       s.item :statuses, safe_join([fa_icon('comments-o fw'), t('admin.trends.statuses.title')]), admin_trends_statuses_path, highlights_on: %r{/admin/trends/statuses}

From 65e82211cdaffa3132832dc42756913d668985c3 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Thu, 16 May 2024 04:03:46 -0400
Subject: [PATCH 135/215] Rename `cache_*` methods to `preload_*` in controller
 concern (#30209)

---
 app/controllers/accounts_controller.rb          |  2 +-
 .../activitypub/collections_controller.rb       |  2 +-
 .../activitypub/outboxes_controller.rb          |  2 +-
 .../api/v1/accounts/statuses_controller.rb      |  6 +++---
 app/controllers/api/v1/bookmarks_controller.rb  |  6 +++---
 app/controllers/api/v1/favourites_controller.rb |  6 +++---
 .../api/v1/notifications/requests_controller.rb |  2 +-
 .../api/v1/notifications_controller.rb          |  2 +-
 app/controllers/api/v1/statuses_controller.rb   |  8 ++++----
 .../api/v1/timelines/home_controller.rb         |  6 +++---
 .../api/v1/timelines/list_controller.rb         |  6 +++---
 .../api/v1/timelines/public_controller.rb       |  6 +++---
 .../api/v1/timelines/tag_controller.rb          |  6 +++---
 .../api/v1/trends/statuses_controller.rb        |  2 +-
 app/controllers/application_controller.rb       |  1 +
 app/controllers/concerns/cache_concern.rb       | 16 ----------------
 app/controllers/concerns/preloading_concern.rb  | 17 +++++++++++++++++
 app/controllers/tags_controller.rb              |  2 +-
 ...ncern_spec.rb => preloading_concern_spec.rb} | 12 ++++++------
 19 files changed, 56 insertions(+), 54 deletions(-)
 create mode 100644 app/controllers/concerns/preloading_concern.rb
 rename spec/controllers/concerns/{cache_concern_spec.rb => preloading_concern_spec.rb} (79%)

diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 32549e151..c3131edce 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -25,7 +25,7 @@ class AccountsController < ApplicationController
 
         limit     = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
         @statuses = filtered_statuses.without_reblogs.limit(limit)
-        @statuses = cache_collection(@statuses, Status)
+        @statuses = preload_collection(@statuses, Status)
       end
 
       format.json do
diff --git a/app/controllers/activitypub/collections_controller.rb b/app/controllers/activitypub/collections_controller.rb
index d5632902f..c25362c9b 100644
--- a/app/controllers/activitypub/collections_controller.rb
+++ b/app/controllers/activitypub/collections_controller.rb
@@ -18,7 +18,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
   def set_items
     case params[:id]
     when 'featured'
-      @items = for_signed_account { cache_collection(@account.pinned_statuses, Status) }
+      @items = for_signed_account { preload_collection(@account.pinned_statuses, Status) }
       @items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) }
     when 'tags'
       @items = for_signed_account { @account.featured_tags }
diff --git a/app/controllers/activitypub/outboxes_controller.rb b/app/controllers/activitypub/outboxes_controller.rb
index 8079e011d..b8baf64e1 100644
--- a/app/controllers/activitypub/outboxes_controller.rb
+++ b/app/controllers/activitypub/outboxes_controller.rb
@@ -60,7 +60,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
   def set_statuses
     return unless page_requested?
 
-    @statuses = cache_collection_paginated_by_id(
+    @statuses = preload_collection_paginated_by_id(
       AccountStatusesFilter.new(@account, signed_request_account).results,
       Status,
       LIMIT,
diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb
index 35ea9c8ec..c42f27776 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -19,11 +19,11 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
   end
 
   def load_statuses
-    @account.unavailable? ? [] : cached_account_statuses
+    @account.unavailable? ? [] : preloaded_account_statuses
   end
 
-  def cached_account_statuses
-    cache_collection_paginated_by_id(
+  def preloaded_account_statuses
+    preload_collection_paginated_by_id(
       AccountStatusesFilter.new(@account, current_account, params).results,
       Status,
       limit_param(DEFAULT_STATUSES_LIMIT),
diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb
index b6bb987b6..f7671a903 100644
--- a/app/controllers/api/v1/bookmarks_controller.rb
+++ b/app/controllers/api/v1/bookmarks_controller.rb
@@ -13,11 +13,11 @@ class Api::V1::BookmarksController < Api::BaseController
   private
 
   def load_statuses
-    cached_bookmarks
+    preloaded_bookmarks
   end
 
-  def cached_bookmarks
-    cache_collection(results.map(&:status), Status)
+  def preloaded_bookmarks
+    preload_collection(results.map(&:status), Status)
   end
 
   def results
diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb
index 73da538f5..18ca9ab86 100644
--- a/app/controllers/api/v1/favourites_controller.rb
+++ b/app/controllers/api/v1/favourites_controller.rb
@@ -13,11 +13,11 @@ class Api::V1::FavouritesController < Api::BaseController
   private
 
   def load_statuses
-    cached_favourites
+    preloaded_favourites
   end
 
-  def cached_favourites
-    cache_collection(results.map(&:status), Status)
+  def preloaded_favourites
+    preload_collection(results.map(&:status), Status)
   end
 
   def results
diff --git a/app/controllers/api/v1/notifications/requests_controller.rb b/app/controllers/api/v1/notifications/requests_controller.rb
index 6a26cc0e8..0e58379a3 100644
--- a/app/controllers/api/v1/notifications/requests_controller.rb
+++ b/app/controllers/api/v1/notifications/requests_controller.rb
@@ -41,7 +41,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
     )
 
     NotificationRequest.preload_cache_collection(requests) do |statuses|
-      cache_collection(statuses, Status)
+      preload_collection(statuses, Status)
     end
   end
 
diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb
index c41a0bb05..1d0aa10d2 100644
--- a/app/controllers/api/v1/notifications_controller.rb
+++ b/app/controllers/api/v1/notifications_controller.rb
@@ -41,7 +41,7 @@ class Api::V1::NotificationsController < Api::BaseController
     )
 
     Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses|
-      cache_collection(target_statuses, Status)
+      preload_collection(target_statuses, Status)
     end
   end
 
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 36a9ec632..5f7e66617 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -26,13 +26,13 @@ class Api::V1::StatusesController < Api::BaseController
   DESCENDANTS_DEPTH_LIMIT = 20
 
   def index
-    @statuses = cache_collection(@statuses, Status)
+    @statuses = preload_collection(@statuses, Status)
     render json: @statuses, each_serializer: REST::StatusSerializer
   end
 
   def show
     cache_if_unauthenticated!
-    @status = cache_collection([@status], Status).first
+    @status = preload_collection([@status], Status).first
     render json: @status, serializer: REST::StatusSerializer
   end
 
@@ -51,8 +51,8 @@ class Api::V1::StatusesController < Api::BaseController
 
     ancestors_results   = @status.in_reply_to_id.nil? ? [] : @status.ancestors(ancestors_limit, current_account)
     descendants_results = @status.descendants(descendants_limit, current_account, descendants_depth_limit)
-    loaded_ancestors    = cache_collection(ancestors_results, Status)
-    loaded_descendants  = cache_collection(descendants_results, Status)
+    loaded_ancestors    = preload_collection(ancestors_results, Status)
+    loaded_descendants  = preload_collection(descendants_results, Status)
 
     @context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
     statuses = [@status] + @context.ancestors + @context.descendants
diff --git a/app/controllers/api/v1/timelines/home_controller.rb b/app/controllers/api/v1/timelines/home_controller.rb
index 36fdbea64..d5d182866 100644
--- a/app/controllers/api/v1/timelines/home_controller.rb
+++ b/app/controllers/api/v1/timelines/home_controller.rb
@@ -21,11 +21,11 @@ class Api::V1::Timelines::HomeController < Api::V1::Timelines::BaseController
   private
 
   def load_statuses
-    cached_home_statuses
+    preloaded_home_statuses
   end
 
-  def cached_home_statuses
-    cache_collection home_statuses, Status
+  def preloaded_home_statuses
+    preload_collection home_statuses, Status
   end
 
   def home_statuses
diff --git a/app/controllers/api/v1/timelines/list_controller.rb b/app/controllers/api/v1/timelines/list_controller.rb
index 14b884ecd..d8cdbdb74 100644
--- a/app/controllers/api/v1/timelines/list_controller.rb
+++ b/app/controllers/api/v1/timelines/list_controller.rb
@@ -21,11 +21,11 @@ class Api::V1::Timelines::ListController < Api::V1::Timelines::BaseController
   end
 
   def set_statuses
-    @statuses = cached_list_statuses
+    @statuses = preloaded_list_statuses
   end
 
-  def cached_list_statuses
-    cache_collection list_statuses, Status
+  def preloaded_list_statuses
+    preload_collection list_statuses, Status
   end
 
   def list_statuses
diff --git a/app/controllers/api/v1/timelines/public_controller.rb b/app/controllers/api/v1/timelines/public_controller.rb
index 35af8dc4b..d164854d6 100644
--- a/app/controllers/api/v1/timelines/public_controller.rb
+++ b/app/controllers/api/v1/timelines/public_controller.rb
@@ -18,11 +18,11 @@ class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController
   end
 
   def load_statuses
-    cached_public_statuses_page
+    preloaded_public_statuses_page
   end
 
-  def cached_public_statuses_page
-    cache_collection(public_statuses, Status)
+  def preloaded_public_statuses_page
+    preload_collection(public_statuses, Status)
   end
 
   def public_statuses
diff --git a/app/controllers/api/v1/timelines/tag_controller.rb b/app/controllers/api/v1/timelines/tag_controller.rb
index 4ba439dbb..3bf8f374e 100644
--- a/app/controllers/api/v1/timelines/tag_controller.rb
+++ b/app/controllers/api/v1/timelines/tag_controller.rb
@@ -23,11 +23,11 @@ class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController
   end
 
   def load_statuses
-    cached_tagged_statuses
+    preloaded_tagged_statuses
   end
 
-  def cached_tagged_statuses
-    @tag.nil? ? [] : cache_collection(tag_timeline_statuses, Status)
+  def preloaded_tagged_statuses
+    @tag.nil? ? [] : preload_collection(tag_timeline_statuses, Status)
   end
 
   def tag_timeline_statuses
diff --git a/app/controllers/api/v1/trends/statuses_controller.rb b/app/controllers/api/v1/trends/statuses_controller.rb
index 48bfe1199..c6fbbce16 100644
--- a/app/controllers/api/v1/trends/statuses_controller.rb
+++ b/app/controllers/api/v1/trends/statuses_controller.rb
@@ -20,7 +20,7 @@ class Api::V1::Trends::StatusesController < Api::BaseController
 
   def set_statuses
     @statuses = if enabled?
-                  cache_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
+                  preload_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
                 else
                   []
                 end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 8ba10d64c..66e0f7e30 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base
   include UserTrackingConcern
   include SessionTrackingConcern
   include CacheConcern
+  include PreloadingConcern
   include DomainControlHelper
   include DatabaseHelper
   include AuthorizedFetchHelper
diff --git a/app/controllers/concerns/cache_concern.rb b/app/controllers/concerns/cache_concern.rb
index 4656539f8..1823b5b8e 100644
--- a/app/controllers/concerns/cache_concern.rb
+++ b/app/controllers/concerns/cache_concern.rb
@@ -45,20 +45,4 @@ module CacheConcern
       Rails.cache.write(key, response.body, expires_in: expires_in, raw: true)
     end
   end
-
-  # TODO: Rename this method, as it does not perform any caching anymore.
-  def cache_collection(raw, klass)
-    return raw unless klass.respond_to?(:preload_cacheable_associations)
-
-    records = raw.to_a
-
-    klass.preload_cacheable_associations(records)
-
-    records
-  end
-
-  # TODO: Rename this method, as it does not perform any caching anymore.
-  def cache_collection_paginated_by_id(raw, klass, limit, options)
-    cache_collection raw.to_a_paginated_by_id(limit, options), klass
-  end
 end
diff --git a/app/controllers/concerns/preloading_concern.rb b/app/controllers/concerns/preloading_concern.rb
new file mode 100644
index 000000000..61e221364
--- /dev/null
+++ b/app/controllers/concerns/preloading_concern.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module PreloadingConcern
+  extend ActiveSupport::Concern
+
+  def preload_collection(scope, klass)
+    return scope unless klass.respond_to?(:preload_cacheable_associations)
+
+    scope.to_a.tap do |records|
+      klass.preload_cacheable_associations(records)
+    end
+  end
+
+  def preload_collection_paginated_by_id(scope, klass, limit, options)
+    preload_collection scope.to_a_paginated_by_id(limit, options), klass
+  end
+end
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index b0bdbde95..d6c0d872c 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -45,7 +45,7 @@ class TagsController < ApplicationController
   end
 
   def set_statuses
-    @statuses = cache_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
+    @statuses = preload_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
   end
 
   def limit_param
diff --git a/spec/controllers/concerns/cache_concern_spec.rb b/spec/controllers/concerns/preloading_concern_spec.rb
similarity index 79%
rename from spec/controllers/concerns/cache_concern_spec.rb
rename to spec/controllers/concerns/preloading_concern_spec.rb
index fffd2b266..795afbc45 100644
--- a/spec/controllers/concerns/cache_concern_spec.rb
+++ b/spec/controllers/concerns/preloading_concern_spec.rb
@@ -2,20 +2,20 @@
 
 require 'rails_helper'
 
-RSpec.describe CacheConcern do
+RSpec.describe PreloadingConcern do
   controller(ApplicationController) do
-    include CacheConcern
+    include PreloadingConcern
 
     def empty_array
-      render plain: cache_collection([], Status).size
+      render plain: preload_collection([], Status).size
     end
 
     def empty_relation
-      render plain: cache_collection(Status.none, Status).size
+      render plain: preload_collection(Status.none, Status).size
     end
 
     def account_statuses_favourites
-      render plain: cache_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count)
+      render plain: preload_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count)
     end
   end
 
@@ -27,7 +27,7 @@ RSpec.describe CacheConcern do
     end
   end
 
-  describe '#cache_collection' do
+  describe '#preload_collection' do
     context 'when given an empty array' do
       it 'returns an empty array' do
         get :empty_array

From 283a891e9290fc9fdbfd082f3bde48863f1c6f45 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Thu, 16 May 2024 11:28:10 +0200
Subject: [PATCH 136/215] Allow to customise the OTEL service name prefix
 (#30322)

---
 config/initializers/opentelemetry.rb | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/config/initializers/opentelemetry.rb b/config/initializers/opentelemetry.rb
index e50132d46..9af0ab89c 100644
--- a/config/initializers/opentelemetry.rb
+++ b/config/initializers/opentelemetry.rb
@@ -53,10 +53,12 @@ if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) }
       },
     })
 
+    prefix = ENV.fetch('OTEL_SERVICE_NAME_PREFIX', 'mastodon')
+
     c.service_name =  case $PROGRAM_NAME
-                      when /puma/ then 'mastodon/web'
+                      when /puma/ then "#{prefix}/web"
                       else
-                        "mastodon/#{$PROGRAM_NAME.split('/').last}"
+                        "#{prefix}/#{$PROGRAM_NAME.split('/').last}"
                       end
     c.service_version = Mastodon::Version.to_s
   end

From 1b6eb2c7f0425a20f9bd823419138bf8adfa18f4 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Thu, 16 May 2024 05:56:48 -0400
Subject: [PATCH 137/215] Enable YJIT when available (#30310)

---
 config/initializers/enable_yjit.rb | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 config/initializers/enable_yjit.rb

diff --git a/config/initializers/enable_yjit.rb b/config/initializers/enable_yjit.rb
new file mode 100644
index 000000000..7b1053ec1
--- /dev/null
+++ b/config/initializers/enable_yjit.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+# Automatically enable YJIT as of Ruby 3.3, as it brings very
+# sizeable performance improvements.
+
+# If you are deploying to a memory constrained environment
+# you may want to delete this file, but otherwise it's free
+# performance.
+if defined?(RubyVM::YJIT.enable)
+  Rails.application.config.after_initialize do
+    RubyVM::YJIT.enable
+  end
+end

From 66906a1bc1fb3934dc101e1d8d7ec4a9ce54a12e Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 16 May 2024 15:01:01 +0200
Subject: [PATCH 138/215] Fix Web UI trying to save user settings when logged
 out (#30324)

---
 app/javascript/mastodon/actions/settings.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/actions/settings.js b/app/javascript/mastodon/actions/settings.js
index 3685b0684..fbd89f9d4 100644
--- a/app/javascript/mastodon/actions/settings.js
+++ b/app/javascript/mastodon/actions/settings.js
@@ -20,7 +20,7 @@ export function changeSetting(path, value) {
 }
 
 const debouncedSave = debounce((dispatch, getState) => {
-  if (getState().getIn(['settings', 'saved'])) {
+  if (getState().getIn(['settings', 'saved']) || !getState().getIn(['meta', 'me'])) {
     return;
   }
 

From b2388be71eb0031ef9e47c492b1c038231cd8bc0 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 16 May 2024 15:45:17 +0200
Subject: [PATCH 139/215] chore(deps): update dependency selenium-webdriver to
 v4.21.0 (#30325)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile.lock | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index a20ac79ae..6001c73db 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -693,7 +693,8 @@ GEM
     responders (3.1.1)
       actionpack (>= 5.2)
       railties (>= 5.2)
-    rexml (3.2.6)
+    rexml (3.2.8)
+      strscan (>= 3.0.9)
     rotp (6.3.0)
     rouge (4.2.1)
     rpam2 (4.0.2)
@@ -774,7 +775,7 @@ GEM
     scenic (1.8.0)
       activerecord (>= 4.0.0)
       railties (>= 4.0.0)
-    selenium-webdriver (4.20.1)
+    selenium-webdriver (4.21.0)
       base64 (~> 0.2)
       rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2, < 3.0)
@@ -815,6 +816,7 @@ GEM
     stringio (3.1.0)
     strong_migrations (1.8.0)
       activerecord (>= 5.2)
+    strscan (3.1.0)
     swd (1.3.0)
       activesupport (>= 3)
       attr_required (>= 0.0.5)

From 226d7a7badf0d03f2c2a57fd4da72889a3563d28 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 17 May 2024 10:27:03 +0200
Subject: [PATCH 140/215] fix(deps): update dependency sass to v1.77.2 (#30338)

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 07c89a529..db706f04a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15316,15 +15316,15 @@ __metadata:
   linkType: hard
 
 "sass@npm:^1.62.1":
-  version: 1.77.1
-  resolution: "sass@npm:1.77.1"
+  version: 1.77.2
+  resolution: "sass@npm:1.77.2"
   dependencies:
     chokidar: "npm:>=3.0.0 <4.0.0"
     immutable: "npm:^4.0.0"
     source-map-js: "npm:>=0.6.2 <2.0.0"
   bin:
     sass: sass.js
-  checksum: 10c0/edcfc7d038234b1198c3ddcac5963fcd1e17a9c1ee0f9bd09784ab5353b60ff50b189b4c9154b34f5da9ca0eaab8b189fd3e83a4b43a494151ad4735f8e5f364
+  checksum: 10c0/0d292339064de3c902e209d41de9c4eb2038cff326476aeebbb5be3eee1d23400d975face2b8e124ae617b10af3e93bec01580f61912f34e4c517fe137a118b6
   languageName: node
   linkType: hard
 

From f7f5b9dadd9e2cee98bf8a7d41193844a37c662b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 17 May 2024 08:27:45 +0000
Subject: [PATCH 141/215] fix(deps): update dependency @rails/ujs to v7.1.3-3
 (#30337)

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 79544229d..773f19c50 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,7 @@
     "@formatjs/intl-pluralrules": "^5.2.2",
     "@gamestdio/websocket": "^0.3.2",
     "@github/webauthn-json": "^2.1.1",
-    "@rails/ujs": "7.1.3-2",
+    "@rails/ujs": "7.1.3-3",
     "@reduxjs/toolkit": "^2.0.1",
     "@svgr/webpack": "^5.5.0",
     "arrow-key-navigation": "^1.2.0",
diff --git a/yarn.lock b/yarn.lock
index db706f04a..efe8cc026 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2758,7 +2758,7 @@ __metadata:
     "@formatjs/intl-pluralrules": "npm:^5.2.2"
     "@gamestdio/websocket": "npm:^0.3.2"
     "@github/webauthn-json": "npm:^2.1.1"
-    "@rails/ujs": "npm:7.1.3-2"
+    "@rails/ujs": "npm:7.1.3-3"
     "@reduxjs/toolkit": "npm:^2.0.1"
     "@svgr/webpack": "npm:^5.5.0"
     "@testing-library/jest-dom": "npm:^6.0.0"
@@ -3042,10 +3042,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@rails/ujs@npm:7.1.3-2":
-  version: 7.1.3-2
-  resolution: "@rails/ujs@npm:7.1.3-2"
-  checksum: 10c0/8bd5b3a409c62f53790ed7e914f1f48235f461a472da7b4ce1d9ad57356fcdeaa7891c946298f7f620ff0ff7c6d5b995bf44057929c4fce796867a8cf4f27c99
+"@rails/ujs@npm:7.1.3-3":
+  version: 7.1.3-3
+  resolution: "@rails/ujs@npm:7.1.3-3"
+  checksum: 10c0/9eee95372b72d8f704b67f14a3bf9f2681ab5b11c7b79919bfde3341f2970771876af5b40de5b3e4fca6a97c76a41046eff71d96490617c1fc80ef3ad8bbac47
   languageName: node
   linkType: hard
 

From 3286ad5226ca220a40f12353df2237c4f822af1d Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 17 May 2024 10:28:01 +0200
Subject: [PATCH 142/215] chore(deps): update dependency selenium-webdriver to
 v4.21.1 (#30335)

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 6001c73db..2f4665554 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -775,7 +775,7 @@ GEM
     scenic (1.8.0)
       activerecord (>= 4.0.0)
       railties (>= 4.0.0)
-    selenium-webdriver (4.21.0)
+    selenium-webdriver (4.21.1)
       base64 (~> 0.2)
       rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2, < 3.0)

From fc166d07f0b5472866e1e13a0c12d78a0c7bbcfb Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 17 May 2024 10:28:22 +0200
Subject: [PATCH 143/215] chore(deps): update dependency rails to v7.1.3.3
 (#30334)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile.lock | 108 +++++++++++++++++++++++++--------------------------
 1 file changed, 54 insertions(+), 54 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 2f4665554..eade99acf 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -10,35 +10,35 @@ GIT
 GEM
   remote: https://rubygems.org/
   specs:
-    actioncable (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actioncable (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
       zeitwerk (~> 2.6)
-    actionmailbox (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailbox (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activestorage (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       mail (>= 2.7.1)
       net-imap
       net-pop
       net-smtp
-    actionmailer (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailer (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      actionview (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       mail (~> 2.5, >= 2.5.4)
       net-imap
       net-pop
       net-smtp
       rails-dom-testing (~> 2.2)
-    actionpack (7.1.3.2)
-      actionview (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionpack (7.1.3.3)
+      actionview (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       nokogiri (>= 1.8.5)
       racc
       rack (>= 2.2.4)
@@ -46,15 +46,15 @@ GEM
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.2)
       rails-html-sanitizer (~> 1.6)
-    actiontext (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actiontext (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activestorage (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionview (7.1.3.3)
+      activesupport (= 7.1.3.3)
       builder (~> 3.1)
       erubi (~> 1.11)
       rails-dom-testing (~> 2.2)
@@ -64,22 +64,22 @@ GEM
       activemodel (>= 4.1)
       case_transform (>= 0.2)
       jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
-    activejob (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activejob (7.1.3.3)
+      activesupport (= 7.1.3.3)
       globalid (>= 0.3.6)
-    activemodel (7.1.3.2)
-      activesupport (= 7.1.3.2)
-    activerecord (7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activemodel (7.1.3.3)
+      activesupport (= 7.1.3.3)
+    activerecord (7.1.3.3)
+      activemodel (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       timeout (>= 0.4.0)
-    activestorage (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activestorage (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       marcel (~> 1.0)
-    activesupport (7.1.3.2)
+    activesupport (7.1.3.3)
       base64
       bigdecimal
       concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -444,7 +444,7 @@ GEM
       timeout
     net-smtp (0.5.0)
       net-protocol
-    nio4r (2.7.1)
+    nio4r (2.7.3)
     nokogiri (1.16.5)
       mini_portile2 (~> 2.8.2)
       racc (~> 1.4)
@@ -634,20 +634,20 @@ GEM
     rackup (1.0.0)
       rack (< 3)
       webrick
-    rails (7.1.3.2)
-      actioncable (= 7.1.3.2)
-      actionmailbox (= 7.1.3.2)
-      actionmailer (= 7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actiontext (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    rails (7.1.3.3)
+      actioncable (= 7.1.3.3)
+      actionmailbox (= 7.1.3.3)
+      actionmailer (= 7.1.3.3)
+      actionpack (= 7.1.3.3)
+      actiontext (= 7.1.3.3)
+      actionview (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activemodel (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activestorage (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       bundler (>= 1.15.0)
-      railties (= 7.1.3.2)
+      railties (= 7.1.3.3)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -662,9 +662,9 @@ GEM
     rails-i18n (7.0.9)
       i18n (>= 0.7, < 2)
       railties (>= 6.0.0, < 8)
-    railties (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    railties (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       irb
       rackup (>= 1.0.0)
       rake (>= 12.2)

From a6d12299f22e0318f0bea8b4a0192e6c07398b70 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Fri, 17 May 2024 04:29:13 -0400
Subject: [PATCH 144/215] Remove duplicate method def
 `ApplicationHelper#instance_presenter` (#30331)

---
 app/helpers/application_helper.rb |  4 ++++
 app/helpers/mascot_helper.rb      | 11 -----------
 app/mailers/user_mailer.rb        |  1 -
 3 files changed, 4 insertions(+), 12 deletions(-)
 delete mode 100644 app/helpers/mascot_helper.rb

diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index eb03f1e4b..7563ae610 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -240,6 +240,10 @@ module ApplicationHelper
     EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s
   end
 
+  def mascot_url
+    full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg'))
+  end
+
   def instance_presenter
     @instance_presenter ||= InstancePresenter.new
   end
diff --git a/app/helpers/mascot_helper.rb b/app/helpers/mascot_helper.rb
deleted file mode 100644
index 34b656411..000000000
--- a/app/helpers/mascot_helper.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module MascotHelper
-  def mascot_url
-    full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg'))
-  end
-
-  def instance_presenter
-    @instance_presenter ||= InstancePresenter.new
-  end
-end
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index f8c1c9a8d..81a2c0c6d 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -5,7 +5,6 @@ class UserMailer < Devise::Mailer
 
   helper :accounts
   helper :application
-  helper :mascot
   helper :formatting
   helper :instance
   helper :routing

From bff7769f5f9a4f3995038ad759c1b48a636d303b Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 17 May 2024 10:41:35 +0200
Subject: [PATCH 145/215] New Crowdin Translations (automated) (#30336)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 config/locales/simple_form.fi.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index 4971e2502..2f7010bac 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -81,9 +81,11 @@ fi:
         backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun tämä on asetettu positiiviseksi arvoksi, nämä arkistot poistetaan automaattisesti asetetun päivien määrän jälkeen.
         bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun.
         closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu
+        content_cache_retention_period: Kaikki muiden palvelimien viestit (mukaan lukien tehostukset ja vastaukset) poistetaan määritetyn päivien lukumäärän jälkeen, ottamatta huomioon paikallisen käyttäjän vuorovaikutusta kyseisten viestien kanssa. Sisältää viestit, jossa paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikeiksi. Myös yksityiset maininnat eri käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämän asetuksen käyttö on tarkoitettu erityisiin tapauksiin ja se rikkoo monia käyttäjien odotuksia, kun se toteutetaan yleistarkoituksiin.
         custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa.
         favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin suosikkikuvakkeen omalla kuvakkeella.
         mascot: Ohittaa kuvituksen edistyneessä selainkäyttöliittymässä.
+        media_cache_retention_period: Mediatiedostot käyttäjien tekemistä viesteistä ovat välimuistissa palvelimellasi. Kun arvo on positiivinen, media poistetaan määritetyn ajan jälkeen. Jos mediaa pyydetään sen poistamisen jälkeen, ne ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien katselun 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ä aikaa.
         peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, oletko liitossa tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla.
         profile_directory: Profiilihakemisto lueteloi kaikki käyttäjät, jotka ovat ilmoittaneet olevansa löydettävissä.
         require_invite_text: Kun rekisteröityminen vaatii manuaalisen hyväksynnän, tee ”Miksi haluat liittyä?” -tekstikentästä pakollinen vapaaehtoisen sijaan

From a627219b25f1787cbee0174e37e36e440489eb66 Mon Sep 17 00:00:00 2001
From: Jeong Arm <kjwonmail@gmail.com>
Date: Fri, 17 May 2024 18:18:54 +0900
Subject: [PATCH 146/215] Fix moderation action logs (#30342)

---
 app/models/admin/action_log_filter.rb | 1 +
 config/locales/en.yml                 | 1 +
 2 files changed, 2 insertions(+)

diff --git a/app/models/admin/action_log_filter.rb b/app/models/admin/action_log_filter.rb
index f581af74e..fc984b244 100644
--- a/app/models/admin/action_log_filter.rb
+++ b/app/models/admin/action_log_filter.rb
@@ -59,6 +59,7 @@ class Admin::ActionLogFilter
     unsuspend_account: { target_type: 'Account', action: 'unsuspend' }.freeze,
     update_announcement: { target_type: 'Announcement', action: 'update' }.freeze,
     update_custom_emoji: { target_type: 'CustomEmoji', action: 'update' }.freeze,
+    update_report: { target_type: 'Report', action: 'update' }.freeze,
     update_status: { target_type: 'Status', action: 'update' }.freeze,
     update_user_role: { target_type: 'UserRole', action: 'update' }.freeze,
     update_ip_block: { target_type: 'IpBlock', action: 'update' }.freeze,
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 446d06f0d..d3704bbbc 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -285,6 +285,7 @@ en:
         update_custom_emoji_html: "%{name} updated emoji %{target}"
         update_domain_block_html: "%{name} updated domain block for %{target}"
         update_ip_block_html: "%{name} changed rule for IP %{target}"
+        update_report_html: "%{name} updated report %{target}"
         update_status_html: "%{name} updated post by %{target}"
         update_user_role_html: "%{name} changed %{target} role"
       deleted_account: deleted account

From 12472e7f407c42bcff6ee204b9f1887b5824734f Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Fri, 17 May 2024 11:28:40 +0200
Subject: [PATCH 147/215] Add emphasis on ActiveRecord Encryption configuration
 values being secret (#30340)

---
 .env.test                                       |  9 +++++----
 config/initializers/active_record_encryption.rb | 13 +++++++++++--
 lib/tasks/db.rake                               |  2 +-
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/.env.test b/.env.test
index 9e6abea5c..d2763e582 100644
--- a/.env.test
+++ b/.env.test
@@ -4,7 +4,8 @@ NODE_ENV=production
 LOCAL_DOMAIN=cb6e6126.ngrok.io
 LOCAL_HTTPS=true
 
-# Required by ActiveRecord encryption feature
-ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR
-ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E
-ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr
+# Secret values required by ActiveRecord encryption feature
+# Use `bin/rails db:encryption:init` to generate fresh secrets
+ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=test_determinist_key_DO_NOT_USE_IN_PRODUCTION
+ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=test_salt_DO_NOT_USE_IN_PRODUCTION
+ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=test_primary_key_DO_NOT_USE_IN_PRODUCTION
diff --git a/config/initializers/active_record_encryption.rb b/config/initializers/active_record_encryption.rb
index 7cda8c621..777bafc27 100644
--- a/config/initializers/active_record_encryption.rb
+++ b/config/initializers/active_record_encryption.rb
@@ -5,7 +5,7 @@
   ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT
   ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY
 ).each do |key|
-  ENV.fetch(key) do
+  value = ENV.fetch(key) do
     abort <<~MESSAGE
 
       Mastodon now requires that these variables are set:
@@ -14,9 +14,18 @@
         - ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT
         - ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY
 
-      Run `bin/rails db:encryption:init` to generate values and then assign the environment variables.
+      Run `bin/rails db:encryption:init` to generate new secrets and then assign the environment variables.
     MESSAGE
   end
+
+  next unless Rails.env.production? && value.end_with?('DO_NOT_USE_IN_PRODUCTION')
+
+  abort <<~MESSAGE
+
+    It looks like you are trying to run Mastodon in production with a #{key} value from the test environment.
+
+    Please generate fresh secrets using `bin/rails db:encryption:init` and use them instead.
+  MESSAGE
 end
 
 Rails.application.configure do
diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake
index d6377c9c8..d8bc927bc 100644
--- a/lib/tasks/db.rake
+++ b/lib/tasks/db.rake
@@ -8,7 +8,7 @@ namespace :db do
     desc 'Generate a set of keys for configuring Active Record encryption in a given environment'
     task :init do # rubocop:disable Rails/RakeEnvironment
       puts <<~MSG
-        Add these environment variables to your Mastodon environment:#{' '}
+        Add these secret environment variables to your Mastodon environment (e.g. .env.production):#{' '}
 
         ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=#{SecureRandom.alphanumeric(32)}
         ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=#{SecureRandom.alphanumeric(32)}

From 2da2a1dae984f4083d1cc2f55642811c696955e6 Mon Sep 17 00:00:00 2001
From: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
Date: Fri, 17 May 2024 15:46:12 +0200
Subject: [PATCH 148/215] Support multiple redirect_uris when creating OAuth
 2.0 Applications (#29192)

---
 .../api/v1/apps/credentials_controller.rb     |   2 +-
 app/controllers/api/v1/apps_controller.rb     |   4 +-
 app/lib/application_extension.rb              |   6 +
 .../rest/application_serializer.rb            |  14 +-
 .../rest/credential_application_serializer.rb |  13 ++
 spec/requests/api/v1/apps/credentials_spec.rb |  23 ++-
 spec/requests/api/v1/apps_spec.rb             | 164 +++++++++++++++++-
 7 files changed, 201 insertions(+), 25 deletions(-)
 create mode 100644 app/serializers/rest/credential_application_serializer.rb

diff --git a/app/controllers/api/v1/apps/credentials_controller.rb b/app/controllers/api/v1/apps/credentials_controller.rb
index 6256bed64..29ab92038 100644
--- a/app/controllers/api/v1/apps/credentials_controller.rb
+++ b/app/controllers/api/v1/apps/credentials_controller.rb
@@ -4,6 +4,6 @@ class Api::V1::Apps::CredentialsController < Api::BaseController
   def show
     return doorkeeper_render_error unless valid_doorkeeper_token?
 
-    render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key client_id scopes)
+    render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer
   end
 end
diff --git a/app/controllers/api/v1/apps_controller.rb b/app/controllers/api/v1/apps_controller.rb
index 97177547a..50feaf185 100644
--- a/app/controllers/api/v1/apps_controller.rb
+++ b/app/controllers/api/v1/apps_controller.rb
@@ -5,7 +5,7 @@ class Api::V1::AppsController < Api::BaseController
 
   def create
     @app = Doorkeeper::Application.create!(application_options)
-    render json: @app, serializer: REST::ApplicationSerializer
+    render json: @app, serializer: REST::CredentialApplicationSerializer
   end
 
   private
@@ -24,6 +24,6 @@ class Api::V1::AppsController < Api::BaseController
   end
 
   def app_params
-    params.permit(:client_name, :redirect_uris, :scopes, :website)
+    params.permit(:client_name, :scopes, :website, :redirect_uris, redirect_uris: [])
   end
 end
diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb
index 400c51a02..2fea1057c 100644
--- a/app/lib/application_extension.rb
+++ b/app/lib/application_extension.rb
@@ -23,6 +23,12 @@ module ApplicationExtension
     redirect_uri.lines.first.strip
   end
 
+  def redirect_uris
+    # Doorkeeper stores the redirect_uri value as a newline delimeted list in
+    # the database:
+    redirect_uri.split
+  end
+
   def push_to_streaming_api
     # TODO: #28793 Combine into a single topic
     payload = Oj.dump(event: :kill)
diff --git a/app/serializers/rest/application_serializer.rb b/app/serializers/rest/application_serializer.rb
index 635508a17..1a7b9265f 100644
--- a/app/serializers/rest/application_serializer.rb
+++ b/app/serializers/rest/application_serializer.rb
@@ -1,24 +1,18 @@
 # frozen_string_literal: true
 
 class REST::ApplicationSerializer < ActiveModel::Serializer
-  attributes :id, :name, :website, :scopes, :redirect_uri,
-             :client_id, :client_secret
+  attributes :id, :name, :website, :scopes, :redirect_uris
 
   # NOTE: Deprecated in 4.3.0, needs to be removed in 5.0.0
   attribute :vapid_key
 
+  # We should consider this property deprecated for 4.3.0
+  attribute :redirect_uri
+
   def id
     object.id.to_s
   end
 
-  def client_id
-    object.uid
-  end
-
-  def client_secret
-    object.secret
-  end
-
   def website
     object.website.presence
   end
diff --git a/app/serializers/rest/credential_application_serializer.rb b/app/serializers/rest/credential_application_serializer.rb
new file mode 100644
index 000000000..bfec7d03e
--- /dev/null
+++ b/app/serializers/rest/credential_application_serializer.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class REST::CredentialApplicationSerializer < REST::ApplicationSerializer
+  attributes :client_id, :client_secret
+
+  def client_id
+    object.uid
+  end
+
+  def client_secret
+    object.secret
+  end
+end
diff --git a/spec/requests/api/v1/apps/credentials_spec.rb b/spec/requests/api/v1/apps/credentials_spec.rb
index e1455fe79..6e6970ce5 100644
--- a/spec/requests/api/v1/apps/credentials_spec.rb
+++ b/spec/requests/api/v1/apps/credentials_spec.rb
@@ -20,14 +20,26 @@ describe 'Credentials' do
 
         expect(body_as_json).to match(
           a_hash_including(
+            id: token.application.id.to_s,
             name: token.application.name,
             website: token.application.website,
-            vapid_key: Rails.configuration.x.vapid_public_key,
             scopes: token.application.scopes.map(&:to_s),
-            client_id: token.application.uid
+            redirect_uris: token.application.redirect_uris,
+            # Deprecated properties as of 4.3:
+            redirect_uri: token.application.redirect_uri.split.first,
+            vapid_key: Rails.configuration.x.vapid_public_key
           )
         )
       end
+
+      it 'does not expose the client_id or client_secret' do
+        subject
+
+        expect(response).to have_http_status(200)
+
+        expect(body_as_json[:client_id]).to_not be_present
+        expect(body_as_json[:client_secret]).to_not be_present
+      end
     end
 
     context 'with a non-read scoped oauth token' do
@@ -46,11 +58,14 @@ describe 'Credentials' do
 
         expect(body_as_json).to match(
           a_hash_including(
+            id: token.application.id.to_s,
             name: token.application.name,
             website: token.application.website,
-            vapid_key: Rails.configuration.x.vapid_public_key,
             scopes: token.application.scopes.map(&:to_s),
-            client_id: token.application.uid
+            redirect_uris: token.application.redirect_uris,
+            # Deprecated properties as of 4.3:
+            redirect_uri: token.application.redirect_uri.split.first,
+            vapid_key: Rails.configuration.x.vapid_public_key
           )
         )
       end
diff --git a/spec/requests/api/v1/apps_spec.rb b/spec/requests/api/v1/apps_spec.rb
index acabbc93f..1f01bddf3 100644
--- a/spec/requests/api/v1/apps_spec.rb
+++ b/spec/requests/api/v1/apps_spec.rb
@@ -9,8 +9,9 @@ RSpec.describe 'Apps' do
     end
 
     let(:client_name)   { 'Test app' }
-    let(:scopes)        { nil }
-    let(:redirect_uris) { 'urn:ietf:wg:oauth:2.0:oob' }
+    let(:scopes)        { 'read write' }
+    let(:redirect_uri)  { 'urn:ietf:wg:oauth:2.0:oob' }
+    let(:redirect_uris) { [redirect_uri] }
     let(:website)       { nil }
 
     let(:params) do
@@ -26,13 +27,63 @@ RSpec.describe 'Apps' do
       it 'creates an OAuth app', :aggregate_failures do
         subject
 
+        expect(response).to have_http_status(200)
+
+        app = Doorkeeper::Application.find_by(name: client_name)
+
+        expect(app).to be_present
+        expect(app.scopes.to_s).to eq scopes
+        expect(app.redirect_uris).to eq redirect_uris
+
+        expect(body_as_json).to match(
+          a_hash_including(
+            id: app.id.to_s,
+            client_id: app.uid,
+            client_secret: app.secret,
+            name: client_name,
+            website: website,
+            scopes: ['read', 'write'],
+            redirect_uris: redirect_uris,
+            # Deprecated properties as of 4.3:
+            redirect_uri: redirect_uri,
+            vapid_key: Rails.configuration.x.vapid_public_key
+          )
+        )
+      end
+    end
+
+    context 'without scopes being supplied' do
+      let(:scopes) { nil }
+
+      it 'creates an OAuth App with the default scope' do
+        subject
+
         expect(response).to have_http_status(200)
         expect(Doorkeeper::Application.find_by(name: client_name)).to be_present
 
         body = body_as_json
 
-        expect(body[:client_id]).to be_present
-        expect(body[:client_secret]).to be_present
+        expect(body[:scopes]).to eq Doorkeeper.config.default_scopes.to_a
+      end
+    end
+
+    # FIXME: This is a bug: https://github.com/mastodon/mastodon/issues/30152
+    context 'with scopes as an array' do
+      let(:scopes) { %w(read write follow) }
+
+      it 'creates an OAuth App with the default scope' do
+        subject
+
+        expect(response).to have_http_status(200)
+
+        app = Doorkeeper::Application.find_by(name: client_name)
+
+        expect(app).to be_present
+        expect(app.scopes.to_s).to eq 'read'
+
+        body = body_as_json
+
+        expect(body[:scopes]).to eq ['read']
       end
     end
 
@@ -77,8 +128,8 @@ RSpec.describe 'Apps' do
       end
     end
 
-    context 'with a too-long redirect_uris' do
-      let(:redirect_uris) { "https://foo.bar/#{'hoge' * 2_000}" }
+    context 'with a too-long redirect_uri' do
+      let(:redirect_uris) { "https://app.example/#{'hoge' * 2_000}" }
 
       it 'returns http unprocessable entity' do
         subject
@@ -87,8 +138,80 @@ RSpec.describe 'Apps' do
       end
     end
 
-    context 'without required params' do
-      let(:client_name)   { '' }
+    # NOTE: This spec currently tests the same as the "with a too-long redirect_uri test case"
+    context 'with too many redirect_uris' do
+      let(:redirect_uris) { (0...500).map { |i| "https://app.example/#{i}/callback" } }
+
+      it 'returns http unprocessable entity' do
+        subject
+
+        expect(response).to have_http_status(422)
+      end
+    end
+
+    context 'with multiple redirect_uris as a string' do
+      let(:redirect_uris) { "https://redirect1.example/\napp://redirect2.example/" }
+
+      it 'creates an OAuth application with multiple redirect URIs' do
+        subject
+
+        expect(response).to have_http_status(200)
+
+        app = Doorkeeper::Application.find_by(name: client_name)
+
+        expect(app).to be_present
+        expect(app.redirect_uri).to eq redirect_uris
+        expect(app.redirect_uris).to eq redirect_uris.split
+
+        body = body_as_json
+
+        expect(body[:redirect_uri]).to eq redirect_uris
+        expect(body[:redirect_uris]).to eq redirect_uris.split
+      end
+    end
+
+    context 'with multiple redirect_uris as an array' do
+      let(:redirect_uris) { ['https://redirect1.example/', 'app://redirect2.example/'] }
+
+      it 'creates an OAuth application with multiple redirect URIs' do
+        subject
+
+        expect(response).to have_http_status(200)
+
+        app = Doorkeeper::Application.find_by(name: client_name)
+
+        expect(app).to be_present
+        expect(app.redirect_uri).to eq redirect_uris.join "\n"
+        expect(app.redirect_uris).to eq redirect_uris
+
+        body = body_as_json
+
+        expect(body[:redirect_uri]).to eq redirect_uris.join "\n"
+        expect(body[:redirect_uris]).to eq redirect_uris
+      end
+    end
+
+    context 'with an empty redirect_uris array' do
+      let(:redirect_uris) { [] }
+
+      it 'returns http unprocessable entity' do
+        subject
+
+        expect(response).to have_http_status(422)
+      end
+    end
+
+    context 'with just a newline as the redirect_uris string' do
+      let(:redirect_uris) { "\n" }
+
+      it 'returns http unprocessable entity' do
+        subject
+
+        expect(response).to have_http_status(422)
+      end
+    end
+
+    context 'with an empty redirect_uris string' do
       let(:redirect_uris) { '' }
 
       it 'returns http unprocessable entity' do
@@ -97,5 +220,30 @@ RSpec.describe 'Apps' do
         expect(response).to have_http_status(422)
       end
     end
+
+    context 'without a required param' do
+      let(:client_name) { '' }
+
+      it 'returns http unprocessable entity' do
+        subject
+
+        expect(response).to have_http_status(422)
+      end
+    end
+
+    context 'with a website' do
+      let(:website) { 'https://app.example/' }
+
+      it 'creates an OAuth application with the website specified' do
+        subject
+
+        expect(response).to have_http_status(200)
+
+        app = Doorkeeper::Application.find_by(name: client_name)
+
+        expect(app).to be_present
+        expect(app.website).to eq website
+      end
+    end
   end
 end

From 6282b6da7753b0feaafd9d15e12bbc8dd6958c8f Mon Sep 17 00:00:00 2001
From: Joshua Byrd <phocks@gmail.com>
Date: Mon, 20 May 2024 02:30:05 +1000
Subject: [PATCH 149/215] Fix og:image requests when html in a web page is over
 1.megabyte (#30362)

---
 app/services/fetch_link_card_service.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index c6b600dd7..36e866b6c 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -56,7 +56,7 @@ class FetchLinkCardService < BaseService
 
       @html_charset = res.charset
 
-      res.body_with_limit
+      res.truncated_body
     end
   end
 

From a178ba7cd5fa10b018ecaf3c8e3dd5f298a08818 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Sun, 19 May 2024 19:07:32 +0200
Subject: [PATCH 150/215] Use a modern React context for identity in the app
 (#30098)

---
 .../mastodon/components/column_header.jsx     | 12 ++-
 app/javascript/mastodon/components/poll.jsx   | 11 +--
 .../mastodon/components/status_action_bar.jsx | 17 ++---
 .../mastodon/components/status_content.jsx    | 12 ++-
 .../mastodon/containers/mastodon.jsx          | 52 ++++---------
 .../features/account/components/header.jsx    | 10 +--
 .../features/community_timeline/index.jsx     | 13 ++--
 .../features/compose/components/search.jsx    | 13 ++--
 .../mastodon/features/explore/index.jsx       | 11 +--
 .../mastodon/features/firehose/index.jsx      | 12 +--
 .../features/getting_started/index.jsx        | 13 ++--
 .../features/hashtag_timeline/index.jsx       | 15 ++--
 .../mastodon/features/home_timeline/index.jsx | 11 +--
 .../components/column_settings.jsx            | 15 ++--
 .../mastodon/features/notifications/index.jsx | 11 +--
 .../picture_in_picture/components/footer.jsx  | 15 ++--
 .../features/public_timeline/index.jsx        | 13 ++--
 .../features/status/components/action_bar.jsx | 11 +--
 .../mastodon/features/status/index.jsx        | 15 ++--
 .../features/ui/components/compose_panel.jsx  | 11 +--
 .../features/ui/components/header.jsx         | 11 +--
 .../features/ui/components/link_footer.jsx    | 11 +--
 .../ui/components/navigation_panel.jsx        | 11 +--
 app/javascript/mastodon/features/ui/index.jsx | 25 +++----
 app/javascript/mastodon/identity_context.tsx  | 74 +++++++++++++++++++
 app/javascript/mastodon/initial_state.js      | 10 +++
 26 files changed, 212 insertions(+), 223 deletions(-)
 create mode 100644 app/javascript/mastodon/identity_context.tsx

diff --git a/app/javascript/mastodon/components/column_header.jsx b/app/javascript/mastodon/components/column_header.jsx
index a7d07ffdb..42183f336 100644
--- a/app/javascript/mastodon/components/column_header.jsx
+++ b/app/javascript/mastodon/components/column_header.jsx
@@ -14,8 +14,10 @@ import CloseIcon from '@/material-icons/400-24px/close.svg?react';
 import SettingsIcon from '@/material-icons/400-24px/settings.svg?react';
 import { Icon }  from 'mastodon/components/icon';
 import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
 
+
 import { useAppHistory } from './router';
 
 const messages = defineMessages({
@@ -51,12 +53,8 @@ BackButton.propTypes = {
 };
 
 class ColumnHeader extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     intl: PropTypes.object.isRequired,
     title: PropTypes.node,
     icon: PropTypes.string,
@@ -171,7 +169,7 @@ class ColumnHeader extends PureComponent {
       );
     }
 
-    if (this.context.identity.signedIn && (children || (multiColumn && this.props.onPin))) {
+    if (this.props.identity.signedIn && (children || (multiColumn && this.props.onPin))) {
       collapseButton = (
         <button
           className={collapsibleButtonClassName}
@@ -232,4 +230,4 @@ class ColumnHeader extends PureComponent {
 
 }
 
-export default injectIntl(withRouter(ColumnHeader));
+export default injectIntl(withIdentity(withRouter(ColumnHeader)));
diff --git a/app/javascript/mastodon/components/poll.jsx b/app/javascript/mastodon/components/poll.jsx
index c7036d111..7b836f00b 100644
--- a/app/javascript/mastodon/components/poll.jsx
+++ b/app/javascript/mastodon/components/poll.jsx
@@ -14,6 +14,7 @@ import CheckIcon from '@/material-icons/400-24px/check.svg?react';
 import { Icon }  from 'mastodon/components/icon';
 import emojify from 'mastodon/features/emoji/emoji';
 import Motion from 'mastodon/features/ui/util/optional_motion';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 
 import { RelativeTimestamp } from './relative_timestamp';
 
@@ -38,12 +39,8 @@ const makeEmojiMap = record => record.get('emojis').reduce((obj, emoji) => {
 }, {});
 
 class Poll extends ImmutablePureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     poll: ImmutablePropTypes.map,
     lang: PropTypes.string,
     intl: PropTypes.object.isRequired,
@@ -235,7 +232,7 @@ class Poll extends ImmutablePureComponent {
         </ul>
 
         <div className='poll__footer'>
-          {!showResults && <button className='button button-secondary' disabled={disabled || !this.context.identity.signedIn} onClick={this.handleVote}><FormattedMessage id='poll.vote' defaultMessage='Vote' /></button>}
+          {!showResults && <button className='button button-secondary' disabled={disabled || !this.props.identity.signedIn} onClick={this.handleVote}><FormattedMessage id='poll.vote' defaultMessage='Vote' /></button>}
           {!showResults && <><button className='poll__link' onClick={this.handleReveal}><FormattedMessage id='poll.reveal' defaultMessage='See results' /></button> · </>}
           {showResults && !this.props.disabled && <><button className='poll__link' onClick={this.handleRefresh}><FormattedMessage id='poll.refresh' defaultMessage='Refresh' /></button> · </>}
           {votesCount}
@@ -247,4 +244,4 @@ class Poll extends ImmutablePureComponent {
 
 }
 
-export default injectIntl(Poll);
+export default injectIntl(withIdentity(Poll));
diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx
index 6def49fdb..c79eae846 100644
--- a/app/javascript/mastodon/components/status_action_bar.jsx
+++ b/app/javascript/mastodon/components/status_action_bar.jsx
@@ -22,6 +22,7 @@ import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
 import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
 import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
 import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
 
@@ -74,12 +75,8 @@ const mapStateToProps = (state, { status }) => ({
 });
 
 class StatusActionBar extends ImmutablePureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     status: ImmutablePropTypes.map.isRequired,
     relationship: ImmutablePropTypes.record,
     onReply: PropTypes.func,
@@ -118,7 +115,7 @@ class StatusActionBar extends ImmutablePureComponent {
   ];
 
   handleReplyClick = () => {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       this.props.onReply(this.props.status, this.props.history);
@@ -136,7 +133,7 @@ class StatusActionBar extends ImmutablePureComponent {
   };
 
   handleFavouriteClick = () => {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       this.props.onFavourite(this.props.status);
@@ -146,7 +143,7 @@ class StatusActionBar extends ImmutablePureComponent {
   };
 
   handleReblogClick = e => {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       this.props.onReblog(this.props.status, e);
@@ -250,7 +247,7 @@ class StatusActionBar extends ImmutablePureComponent {
 
   render () {
     const { status, relationship, intl, withDismiss, withCounters, scrollKey } = this.props;
-    const { signedIn, permissions } = this.context.identity;
+    const { signedIn, permissions } = this.props.identity;
 
     const publicStatus       = ['public', 'unlisted'].includes(status.get('visibility'));
     const pinnableStatus     = ['public', 'unlisted', 'private'].includes(status.get('visibility'));
@@ -410,4 +407,4 @@ class StatusActionBar extends ImmutablePureComponent {
 
 }
 
-export default withRouter(connect(mapStateToProps)(injectIntl(StatusActionBar)));
+export default withRouter(withIdentity(connect(mapStateToProps)(injectIntl(StatusActionBar))));
diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx
index 4a7ba941e..24483cf51 100644
--- a/app/javascript/mastodon/components/status_content.jsx
+++ b/app/javascript/mastodon/components/status_content.jsx
@@ -12,8 +12,10 @@ import { connect } from 'react-redux';
 import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
 import { Icon }  from 'mastodon/components/icon';
 import PollContainer from 'mastodon/containers/poll_container';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { autoPlayGif, languages as preloadedLanguages } from 'mastodon/initial_state';
 
+
 const MAX_HEIGHT = 706; // 22px * 32 (+ 2px padding at the top)
 
 /**
@@ -67,12 +69,8 @@ const mapStateToProps = state => ({
 });
 
 class StatusContent extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     status: ImmutablePropTypes.map.isRequired,
     statusContent: PropTypes.string,
     expanded: PropTypes.bool,
@@ -245,7 +243,7 @@ class StatusContent extends PureComponent {
     const renderReadMore = this.props.onClick && status.get('collapsed');
     const contentLocale = intl.locale.replace(/[_-].*/, '');
     const targetLanguages = this.props.languages?.get(status.get('language') || 'und');
-    const renderTranslate = this.props.onTranslate && this.context.identity.signedIn && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('search_index').trim().length > 0 && targetLanguages?.includes(contentLocale);
+    const renderTranslate = this.props.onTranslate && this.props.identity.signedIn && ['public', 'unlisted'].includes(status.get('visibility')) && status.get('search_index').trim().length > 0 && targetLanguages?.includes(contentLocale);
 
     const content = { __html: statusContent ?? getStatusContent(status) };
     const spoilerContent = { __html: status.getIn(['translation', 'spoilerHtml']) || status.get('spoilerHtml') };
@@ -328,4 +326,4 @@ class StatusContent extends PureComponent {
 
 }
 
-export default withRouter(connect(mapStateToProps)(injectIntl(StatusContent)));
+export default withRouter(withIdentity(connect(mapStateToProps)(injectIntl(StatusContent))));
diff --git a/app/javascript/mastodon/containers/mastodon.jsx b/app/javascript/mastodon/containers/mastodon.jsx
index 87708da19..0b1255c33 100644
--- a/app/javascript/mastodon/containers/mastodon.jsx
+++ b/app/javascript/mastodon/containers/mastodon.jsx
@@ -1,4 +1,3 @@
-import PropTypes from 'prop-types';
 import { PureComponent } from 'react';
 
 import { Helmet } from 'react-helmet';
@@ -14,6 +13,7 @@ import { connectUserStream } from 'mastodon/actions/streaming';
 import ErrorBoundary from 'mastodon/components/error_boundary';
 import { Router } from 'mastodon/components/router';
 import UI from 'mastodon/features/ui';
+import { IdentityContext, createIdentityContext } from 'mastodon/identity_context';
 import initialState, { title as siteTitle } from 'mastodon/initial_state';
 import { IntlProvider } from 'mastodon/locales';
 import { store } from 'mastodon/store';
@@ -28,33 +28,9 @@ if (initialState.meta.me) {
   store.dispatch(fetchCustomEmojis());
 }
 
-const createIdentityContext = state => ({
-  signedIn: !!state.meta.me,
-  accountId: state.meta.me,
-  disabledAccountId: state.meta.disabled_account_id,
-  accessToken: state.meta.access_token,
-  permissions: state.role ? state.role.permissions : 0,
-});
-
 export default class Mastodon extends PureComponent {
-
-  static childContextTypes = {
-    identity: PropTypes.shape({
-      signedIn: PropTypes.bool.isRequired,
-      accountId: PropTypes.string,
-      disabledAccountId: PropTypes.string,
-      accessToken: PropTypes.string,
-    }).isRequired,
-  };
-
   identity = createIdentityContext(initialState);
 
-  getChildContext() {
-    return {
-      identity: this.identity,
-    };
-  }
-
   componentDidMount() {
     if (this.identity.signedIn) {
       this.disconnect = store.dispatch(connectUserStream());
@@ -74,19 +50,21 @@ export default class Mastodon extends PureComponent {
 
   render () {
     return (
-      <IntlProvider>
-        <ReduxProvider store={store}>
-          <ErrorBoundary>
-            <Router>
-              <ScrollContext shouldUpdateScroll={this.shouldUpdateScroll}>
-                <Route path='/' component={UI} />
-              </ScrollContext>
-            </Router>
+      <IdentityContext.Provider value={this.identity}>
+        <IntlProvider>
+          <ReduxProvider store={store}>
+            <ErrorBoundary>
+              <Router>
+                <ScrollContext shouldUpdateScroll={this.shouldUpdateScroll}>
+                  <Route path='/' component={UI} />
+                </ScrollContext>
+              </Router>
 
-            <Helmet defaultTitle={title} titleTemplate={`%s - ${title}`} />
-          </ErrorBoundary>
-        </ReduxProvider>
-      </IntlProvider>
+              <Helmet defaultTitle={title} titleTemplate={`%s - ${title}`} />
+            </ErrorBoundary>
+          </ReduxProvider>
+        </IntlProvider>
+      </IdentityContext.Provider>
     );
   }
 
diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx
index e9d6071a2..b10ef6ef7 100644
--- a/app/javascript/mastodon/features/account/components/header.jsx
+++ b/app/javascript/mastodon/features/account/components/header.jsx
@@ -25,6 +25,7 @@ import { IconButton } from 'mastodon/components/icon_button';
 import { LoadingIndicator } from 'mastodon/components/loading_indicator';
 import { ShortNumber } from 'mastodon/components/short_number';
 import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { autoPlayGif, me, domain as localDomain } from 'mastodon/initial_state';
 import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
@@ -111,6 +112,7 @@ const dateFormatOptions = {
 class Header extends ImmutablePureComponent {
 
   static propTypes = {
+    identity: identityContextPropShape,
     account: ImmutablePropTypes.record,
     identity_props: ImmutablePropTypes.list,
     onFollow: PropTypes.func.isRequired,
@@ -136,10 +138,6 @@ class Header extends ImmutablePureComponent {
     ...WithRouterPropTypes,
   };
 
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   setRef = c => {
     this.node = c;
   };
@@ -255,7 +253,7 @@ class Header extends ImmutablePureComponent {
 
   render () {
     const { account, hidden, intl } = this.props;
-    const { signedIn, permissions } = this.context.identity;
+    const { signedIn, permissions } = this.props.identity;
 
     if (!account) {
       return null;
@@ -516,4 +514,4 @@ class Header extends ImmutablePureComponent {
 
 }
 
-export default withRouter(injectIntl(Header));
+export default withRouter(withIdentity(injectIntl(Header)));
diff --git a/app/javascript/mastodon/features/community_timeline/index.jsx b/app/javascript/mastodon/features/community_timeline/index.jsx
index 0aa1f9aa2..5652ea532 100644
--- a/app/javascript/mastodon/features/community_timeline/index.jsx
+++ b/app/javascript/mastodon/features/community_timeline/index.jsx
@@ -9,6 +9,7 @@ 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 { addColumn, removeColumn, moveColumn } from '../../actions/columns';
@@ -38,16 +39,12 @@ const mapStateToProps = (state, { columnId }) => {
 };
 
 class CommunityTimeline extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static defaultProps = {
     onlyMedia: false,
   };
 
   static propTypes = {
+    identity: identityContextPropShape,
     dispatch: PropTypes.func.isRequired,
     columnId: PropTypes.string,
     intl: PropTypes.object.isRequired,
@@ -77,7 +74,7 @@ class CommunityTimeline extends PureComponent {
 
   componentDidMount () {
     const { dispatch, onlyMedia } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     dispatch(expandCommunityTimeline({ onlyMedia }));
 
@@ -87,7 +84,7 @@ class CommunityTimeline extends PureComponent {
   }
 
   componentDidUpdate (prevProps) {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (prevProps.onlyMedia !== this.props.onlyMedia) {
       const { dispatch, onlyMedia } = this.props;
@@ -161,4 +158,4 @@ class CommunityTimeline extends PureComponent {
 
 }
 
-export default connect(mapStateToProps)(injectIntl(CommunityTimeline));
+export default withIdentity(connect(mapStateToProps)(injectIntl(CommunityTimeline)));
diff --git a/app/javascript/mastodon/features/compose/components/search.jsx b/app/javascript/mastodon/features/compose/components/search.jsx
index ca02c23fc..7fa7ad248 100644
--- a/app/javascript/mastodon/features/compose/components/search.jsx
+++ b/app/javascript/mastodon/features/compose/components/search.jsx
@@ -12,6 +12,7 @@ import CancelIcon from '@/material-icons/400-24px/cancel-fill.svg?react';
 import CloseIcon from '@/material-icons/400-24px/close.svg?react';
 import SearchIcon from '@/material-icons/400-24px/search.svg?react';
 import { Icon }  from 'mastodon/components/icon';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { domain, searchEnabled } from 'mastodon/initial_state';
 import { HASHTAG_REGEX } from 'mastodon/utils/hashtags';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
@@ -33,12 +34,8 @@ const labelForRecentSearch = search => {
 };
 
 class Search extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object.isRequired,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     value: PropTypes.string.isRequired,
     recent: ImmutablePropTypes.orderedSet,
     submitted: PropTypes.bool,
@@ -276,7 +273,7 @@ class Search extends PureComponent {
   }
 
   _calculateOptions (value) {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
     const trimmedValue = value.trim();
     const options = [];
 
@@ -318,7 +315,7 @@ class Search extends PureComponent {
   render () {
     const { intl, value, submitted, recent } = this.props;
     const { expanded, options, selectedOption } = this.state;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     const hasValue = value.length > 0 || submitted;
 
@@ -402,4 +399,4 @@ class Search extends PureComponent {
 
 }
 
-export default withRouter(injectIntl(Search));
+export default withRouter(withIdentity(injectIntl(Search)));
diff --git a/app/javascript/mastodon/features/explore/index.jsx b/app/javascript/mastodon/features/explore/index.jsx
index d77aec701..83e5df22f 100644
--- a/app/javascript/mastodon/features/explore/index.jsx
+++ b/app/javascript/mastodon/features/explore/index.jsx
@@ -13,6 +13,7 @@ import SearchIcon from '@/material-icons/400-24px/search.svg?react';
 import Column from 'mastodon/components/column';
 import ColumnHeader from 'mastodon/components/column_header';
 import Search from 'mastodon/features/compose/containers/search_container';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { trendsEnabled } from 'mastodon/initial_state';
 
 import Links from './links';
@@ -32,12 +33,8 @@ const mapStateToProps = state => ({
 });
 
 class Explore extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     intl: PropTypes.object.isRequired,
     multiColumn: PropTypes.bool,
     isSearching: PropTypes.bool,
@@ -53,7 +50,7 @@ class Explore extends PureComponent {
 
   render() {
     const { intl, multiColumn, isSearching } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     return (
       <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
@@ -114,4 +111,4 @@ class Explore extends PureComponent {
 
 }
 
-export default connect(mapStateToProps)(injectIntl(Explore));
+export default withIdentity(connect(mapStateToProps)(injectIntl(Explore)));
diff --git a/app/javascript/mastodon/features/firehose/index.jsx b/app/javascript/mastodon/features/firehose/index.jsx
index c65fe48ea..f65bee45e 100644
--- a/app/javascript/mastodon/features/firehose/index.jsx
+++ b/app/javascript/mastodon/features/firehose/index.jsx
@@ -6,13 +6,14 @@ import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
 import { Helmet } from 'react-helmet';
 import { NavLink } from 'react-router-dom';
 
+import { useIdentity } from '@/mastodon/identity_context';
 import PublicIcon from '@/material-icons/400-24px/public.svg?react';
 import { addColumn } from 'mastodon/actions/columns';
 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 initialState, { domain } from 'mastodon/initial_state';
+import { domain } from 'mastodon/initial_state';
 import { useAppDispatch, useAppSelector } from 'mastodon/store';
 
 import Column from '../../components/column';
@@ -24,15 +25,6 @@ const messages = defineMessages({
   title: { id: 'column.firehose', defaultMessage: 'Live feeds' },
 });
 
-// TODO: use a proper React context later on
-const useIdentity = () => ({
-  signedIn: !!initialState.meta.me,
-  accountId: initialState.meta.me,
-  disabledAccountId: initialState.meta.disabled_account_id,
-  accessToken: initialState.meta.access_token,
-  permissions: initialState.role ? initialState.role.permissions : 0,
-});
-
 const ColumnSettings = () => {
   const dispatch = useAppDispatch();
   const settings = useAppSelector((state) => state.getIn(['settings', 'firehose']));
diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx
index db6e0f6ec..628bbe62b 100644
--- a/app/javascript/mastodon/features/getting_started/index.jsx
+++ b/app/javascript/mastodon/features/getting_started/index.jsx
@@ -24,6 +24,7 @@ import { fetchFollowRequests } from 'mastodon/actions/accounts';
 import Column from 'mastodon/components/column';
 import ColumnHeader from 'mastodon/components/column_header';
 import LinkFooter from 'mastodon/features/ui/components/link_footer';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 
 import { me, showTrends } from '../../initial_state';
 import { NavigationBar } from '../compose/components/navigation_bar';
@@ -75,12 +76,8 @@ const badgeDisplay = (number, limit) => {
 };
 
 class GettingStarted extends ImmutablePureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     intl: PropTypes.object.isRequired,
     myAccount: ImmutablePropTypes.record,
     multiColumn: PropTypes.bool,
@@ -91,7 +88,7 @@ class GettingStarted extends ImmutablePureComponent {
 
   componentDidMount () {
     const { fetchFollowRequests } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (!signedIn) {
       return;
@@ -102,7 +99,7 @@ class GettingStarted extends ImmutablePureComponent {
 
   render () {
     const { intl, myAccount, multiColumn, unreadFollowRequests } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     const navItems = [];
 
@@ -167,4 +164,4 @@ class GettingStarted extends ImmutablePureComponent {
 
 }
 
-export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(GettingStarted));
+export default withIdentity(connect(mapStateToProps, mapDispatchToProps)(injectIntl(GettingStarted)));
diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.jsx b/app/javascript/mastodon/features/hashtag_timeline/index.jsx
index f431a7e9b..42a668859 100644
--- a/app/javascript/mastodon/features/hashtag_timeline/index.jsx
+++ b/app/javascript/mastodon/features/hashtag_timeline/index.jsx
@@ -17,6 +17,7 @@ import { fetchHashtag, followHashtag, unfollowHashtag } from 'mastodon/actions/t
 import { expandHashtagTimeline, clearTimeline } from 'mastodon/actions/timelines';
 import Column from 'mastodon/components/column';
 import ColumnHeader from 'mastodon/components/column_header';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 
 import StatusListContainer from '../ui/containers/status_list_container';
 
@@ -29,14 +30,10 @@ const mapStateToProps = (state, props) => ({
 });
 
 class HashtagTimeline extends PureComponent {
-
   disconnects = [];
 
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     params: PropTypes.object.isRequired,
     columnId: PropTypes.string,
     dispatch: PropTypes.func.isRequired,
@@ -94,7 +91,7 @@ class HashtagTimeline extends PureComponent {
   };
 
   _subscribe (dispatch, id, tags = {}, local) {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (!signedIn) {
       return;
@@ -168,7 +165,7 @@ class HashtagTimeline extends PureComponent {
   handleFollow = () => {
     const { dispatch, params, tag } = this.props;
     const { id } = params;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (!signedIn) {
       return;
@@ -185,7 +182,7 @@ class HashtagTimeline extends PureComponent {
     const { hasUnread, columnId, multiColumn, tag } = this.props;
     const { id, local } = this.props.params;
     const pinned = !!columnId;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     return (
       <Column bindToDocument={!multiColumn} ref={this.setRef} label={`#${id}`}>
@@ -225,4 +222,4 @@ class HashtagTimeline extends PureComponent {
 
 }
 
-export default connect(mapStateToProps)(HashtagTimeline);
+export default connect(mapStateToProps)(withIdentity(HashtagTimeline));
diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx
index 6e7dc2b6c..00b5835a1 100644
--- a/app/javascript/mastodon/features/home_timeline/index.jsx
+++ b/app/javascript/mastodon/features/home_timeline/index.jsx
@@ -14,6 +14,7 @@ import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/an
 import { IconWithBadge } from 'mastodon/components/icon_with_badge';
 import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator';
 import AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { criticalUpdatesPending } from 'mastodon/initial_state';
 
 import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
@@ -40,12 +41,8 @@ const mapStateToProps = state => ({
 });
 
 class HomeTimeline extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     dispatch: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
     hasUnread: PropTypes.bool,
@@ -126,7 +123,7 @@ class HomeTimeline extends PureComponent {
   render () {
     const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props;
     const pinned = !!columnId;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
     const banners = [];
 
     let announcementsButton;
@@ -190,4 +187,4 @@ class HomeTimeline extends PureComponent {
 
 }
 
-export default connect(mapStateToProps)(injectIntl(HomeTimeline));
+export default connect(mapStateToProps)(withIdentity(injectIntl(HomeTimeline)));
diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.jsx b/app/javascript/mastodon/features/notifications/components/column_settings.jsx
index fc737c0fe..e375b856c 100644
--- a/app/javascript/mastodon/features/notifications/components/column_settings.jsx
+++ b/app/javascript/mastodon/features/notifications/components/column_settings.jsx
@@ -5,6 +5,7 @@ import { FormattedMessage } from 'react-intl';
 
 import ImmutablePropTypes from 'react-immutable-proptypes';
 
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'mastodon/permissions';
 
 import { CheckboxWithLabel } from './checkbox_with_label';
@@ -12,13 +13,9 @@ import ClearColumnButton from './clear_column_button';
 import GrantPermissionButton from './grant_permission_button';
 import SettingToggle from './setting_toggle';
 
-export default class ColumnSettings extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
+class ColumnSettings extends PureComponent {
   static propTypes = {
+    identity: identityContextPropShape,
     settings: ImmutablePropTypes.map.isRequired,
     pushSettings: ImmutablePropTypes.map.isRequired,
     onChange: PropTypes.func.isRequired,
@@ -215,7 +212,7 @@ export default class ColumnSettings extends PureComponent {
           </div>
         </section>
 
-        {((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) && (
+        {((this.props.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) && (
           <section role='group' aria-labelledby='notifications-admin-sign-up'>
             <h3 id='notifications-status'><FormattedMessage id='notifications.column_settings.admin.sign_up' defaultMessage='New sign-ups:' /></h3>
 
@@ -228,7 +225,7 @@ export default class ColumnSettings extends PureComponent {
           </section>
         )}
 
-        {((this.context.identity.permissions & PERMISSION_MANAGE_REPORTS) === PERMISSION_MANAGE_REPORTS) && (
+        {((this.props.identity.permissions & PERMISSION_MANAGE_REPORTS) === PERMISSION_MANAGE_REPORTS) && (
           <section role='group' aria-labelledby='notifications-admin-report'>
             <h3 id='notifications-status'><FormattedMessage id='notifications.column_settings.admin.report' defaultMessage='New reports:' /></h3>
 
@@ -245,3 +242,5 @@ export default class ColumnSettings extends PureComponent {
   }
 
 }
+
+export default withIdentity(ColumnSettings);
diff --git a/app/javascript/mastodon/features/notifications/index.jsx b/app/javascript/mastodon/features/notifications/index.jsx
index e062957ff..d45f51715 100644
--- a/app/javascript/mastodon/features/notifications/index.jsx
+++ b/app/javascript/mastodon/features/notifications/index.jsx
@@ -17,6 +17,7 @@ import NotificationsIcon from '@/material-icons/400-24px/notifications-fill.svg?
 import { compareId } from 'mastodon/compare_id';
 import { Icon }  from 'mastodon/components/icon';
 import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 
 import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
 import { submitMarkers } from '../../actions/markers';
@@ -77,12 +78,8 @@ const mapStateToProps = state => ({
 });
 
 class Notifications extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     columnId: PropTypes.string,
     notifications: ImmutablePropTypes.list.isRequired,
     dispatch: PropTypes.func.isRequired,
@@ -190,7 +187,7 @@ class Notifications extends PureComponent {
     const { intl, notifications, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, lastReadId, canMarkAsRead, needsNotificationPermission } = this.props;
     const pinned = !!columnId;
     const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage="You don't have any notifications yet. When other people interact with you, you will see it here." />;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     let scrollableContent = null;
 
@@ -299,4 +296,4 @@ class Notifications extends PureComponent {
 
 }
 
-export default connect(mapStateToProps)(injectIntl(Notifications));
+export default connect(mapStateToProps)(withIdentity(injectIntl(Notifications)));
diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
index 7a163a882..d6b1b5fa8 100644
--- a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
+++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
@@ -18,6 +18,7 @@ import { replyCompose } from 'mastodon/actions/compose';
 import { reblog, favourite, unreblog, unfavourite } from 'mastodon/actions/interactions';
 import { openModal } from 'mastodon/actions/modal';
 import { IconButton } from 'mastodon/components/icon_button';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { me, boostModal } from 'mastodon/initial_state';
 import { makeGetStatus } from 'mastodon/selectors';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
@@ -47,12 +48,8 @@ const makeMapStateToProps = () => {
 };
 
 class Footer extends ImmutablePureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     statusId: PropTypes.string.isRequired,
     status: ImmutablePropTypes.map.isRequired,
     intl: PropTypes.object.isRequired,
@@ -75,7 +72,7 @@ class Footer extends ImmutablePureComponent {
 
   handleReplyClick = () => {
     const { dispatch, askReplyConfirmation, status, intl } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       if (askReplyConfirmation) {
@@ -104,7 +101,7 @@ class Footer extends ImmutablePureComponent {
 
   handleFavouriteClick = () => {
     const { dispatch, status } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       if (status.get('favourited')) {
@@ -131,7 +128,7 @@ class Footer extends ImmutablePureComponent {
 
   handleReblogClick = e => {
     const { dispatch, status } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       if (status.get('reblogged')) {
@@ -209,4 +206,4 @@ class Footer extends ImmutablePureComponent {
 
 }
 
-export default  connect(makeMapStateToProps)(withRouter(injectIntl(Footer)));
+export default  connect(makeMapStateToProps)(withIdentity(withRouter(injectIntl(Footer))));
diff --git a/app/javascript/mastodon/features/public_timeline/index.jsx b/app/javascript/mastodon/features/public_timeline/index.jsx
index 3601dfeae..91351901f 100644
--- a/app/javascript/mastodon/features/public_timeline/index.jsx
+++ b/app/javascript/mastodon/features/public_timeline/index.jsx
@@ -9,6 +9,7 @@ import { connect } from 'react-redux';
 
 import PublicIcon from '@/material-icons/400-24px/public.svg?react';
 import { DismissableBanner } from 'mastodon/components/dismissable_banner';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { domain } from 'mastodon/initial_state';
 
 import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
@@ -40,16 +41,12 @@ const mapStateToProps = (state, { columnId }) => {
 };
 
 class PublicTimeline extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static defaultProps = {
     onlyMedia: false,
   };
 
   static propTypes = {
+    identity: identityContextPropShape,
     dispatch: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
     columnId: PropTypes.string,
@@ -80,7 +77,7 @@ class PublicTimeline extends PureComponent {
 
   componentDidMount () {
     const { dispatch, onlyMedia, onlyRemote } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     dispatch(expandPublicTimeline({ onlyMedia, onlyRemote }));
 
@@ -90,7 +87,7 @@ class PublicTimeline extends PureComponent {
   }
 
   componentDidUpdate (prevProps) {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (prevProps.onlyMedia !== this.props.onlyMedia || prevProps.onlyRemote !== this.props.onlyRemote) {
       const { dispatch, onlyMedia, onlyRemote } = this.props;
@@ -164,4 +161,4 @@ class PublicTimeline extends PureComponent {
 
 }
 
-export default connect(mapStateToProps)(injectIntl(PublicTimeline));
+export default connect(mapStateToProps)(withIdentity(injectIntl(PublicTimeline)));
diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx
index 69209e8bd..d61053998 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.jsx
+++ b/app/javascript/mastodon/features/status/components/action_bar.jsx
@@ -21,6 +21,7 @@ import RepeatActiveIcon from '@/svg-icons/repeat_active.svg?react';
 import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react';
 import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react';
 import RepeatPrivateActiveIcon from '@/svg-icons/repeat_private_active.svg?react';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
 
@@ -67,12 +68,8 @@ const mapStateToProps = (state, { status }) => ({
 });
 
 class ActionBar extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     status: ImmutablePropTypes.map.isRequired,
     relationship: ImmutablePropTypes.record,
     onReply: PropTypes.func.isRequired,
@@ -198,7 +195,7 @@ class ActionBar extends PureComponent {
 
   render () {
     const { status, relationship, intl } = this.props;
-    const { signedIn, permissions } = this.context.identity;
+    const { signedIn, permissions } = this.props.identity;
 
     const publicStatus       = ['public', 'unlisted'].includes(status.get('visibility'));
     const pinnableStatus     = ['public', 'unlisted', 'private'].includes(status.get('visibility'));
@@ -326,4 +323,4 @@ class ActionBar extends PureComponent {
 
 }
 
-export default withRouter(connect(mapStateToProps)(injectIntl(ActionBar)));
+export default withRouter(connect(mapStateToProps)(withIdentity(injectIntl(ActionBar))));
diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx
index 391475972..3a9bf524f 100644
--- a/app/javascript/mastodon/features/status/index.jsx
+++ b/app/javascript/mastodon/features/status/index.jsx
@@ -20,6 +20,7 @@ import { Icon }  from 'mastodon/components/icon';
 import { LoadingIndicator } from 'mastodon/components/loading_indicator';
 import ScrollContainer from 'mastodon/containers/scroll_container';
 import BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
 
 import {
@@ -189,12 +190,8 @@ const titleFromStatus = (intl, status) => {
 };
 
 class Status extends ImmutablePureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     params: PropTypes.object.isRequired,
     dispatch: PropTypes.func.isRequired,
     status: ImmutablePropTypes.map,
@@ -244,7 +241,7 @@ class Status extends ImmutablePureComponent {
 
   handleFavouriteClick = (status) => {
     const { dispatch } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       if (status.get('favourited')) {
@@ -274,7 +271,7 @@ class Status extends ImmutablePureComponent {
 
   handleReplyClick = (status) => {
     const { askReplyConfirmation, dispatch, intl } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       if (askReplyConfirmation) {
@@ -307,7 +304,7 @@ class Status extends ImmutablePureComponent {
 
   handleReblogClick = (status, e) => {
     const { dispatch } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     if (signedIn) {
       if (status.get('reblogged')) {
@@ -745,4 +742,4 @@ class Status extends ImmutablePureComponent {
 
 }
 
-export default withRouter(injectIntl(connect(makeMapStateToProps)(Status)));
+export default withRouter(injectIntl(connect(makeMapStateToProps)(withIdentity(Status))));
diff --git a/app/javascript/mastodon/features/ui/components/compose_panel.jsx b/app/javascript/mastodon/features/ui/components/compose_panel.jsx
index e6ac79bdd..18321cbe6 100644
--- a/app/javascript/mastodon/features/ui/components/compose_panel.jsx
+++ b/app/javascript/mastodon/features/ui/components/compose_panel.jsx
@@ -7,16 +7,13 @@ import { changeComposing, mountCompose, unmountCompose } from 'mastodon/actions/
 import ServerBanner from 'mastodon/components/server_banner';
 import ComposeFormContainer from 'mastodon/features/compose/containers/compose_form_container';
 import SearchContainer from 'mastodon/features/compose/containers/search_container';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 
 import LinkFooter from './link_footer';
 
 class ComposePanel extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object.isRequired,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     dispatch: PropTypes.func.isRequired,
   };
 
@@ -41,7 +38,7 @@ class ComposePanel extends PureComponent {
   }
 
   render() {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     return (
       <div className='compose-panel' onFocus={this.onFocus}>
@@ -65,4 +62,4 @@ class ComposePanel extends PureComponent {
 
 }
 
-export default connect()(ComposePanel);
+export default connect()(withIdentity(ComposePanel));
diff --git a/app/javascript/mastodon/features/ui/components/header.jsx b/app/javascript/mastodon/features/ui/components/header.jsx
index 2f8636b12..19c76c722 100644
--- a/app/javascript/mastodon/features/ui/components/header.jsx
+++ b/app/javascript/mastodon/features/ui/components/header.jsx
@@ -13,6 +13,7 @@ import { fetchServer } from 'mastodon/actions/server';
 import { Avatar } from 'mastodon/components/avatar';
 import { Icon } from 'mastodon/components/icon';
 import { WordmarkLogo, SymbolLogo } from 'mastodon/components/logo';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { registrationsOpen, me, sso_redirect } from 'mastodon/initial_state';
 
 const Account = connect(state => ({
@@ -41,12 +42,8 @@ const mapDispatchToProps = (dispatch) => ({
 });
 
 class Header extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     openClosedRegistrationsModal: PropTypes.func,
     location: PropTypes.object,
     signupUrl: PropTypes.string.isRequired,
@@ -60,7 +57,7 @@ class Header extends PureComponent {
   }
 
   render () {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
     const { location, openClosedRegistrationsModal, signupUrl, intl } = this.props;
 
     let content;
@@ -121,4 +118,4 @@ class Header extends PureComponent {
 
 }
 
-export default injectIntl(withRouter(connect(mapStateToProps, mapDispatchToProps)(Header)));
+export default injectIntl(withRouter(withIdentity(connect(mapStateToProps, mapDispatchToProps)(Header))));
diff --git a/app/javascript/mastodon/features/ui/components/link_footer.jsx b/app/javascript/mastodon/features/ui/components/link_footer.jsx
index 6b1555243..08af6fa44 100644
--- a/app/javascript/mastodon/features/ui/components/link_footer.jsx
+++ b/app/javascript/mastodon/features/ui/components/link_footer.jsx
@@ -8,6 +8,7 @@ import { Link } from 'react-router-dom';
 import { connect } from 'react-redux';
 
 import { openModal } from 'mastodon/actions/modal';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { domain, version, source_url, statusPageUrl, profile_directory as profileDirectory } from 'mastodon/initial_state';
 import { PERMISSION_INVITE_USERS } from 'mastodon/permissions';
 import { logOut } from 'mastodon/utils/log_out';
@@ -32,12 +33,8 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
 });
 
 class LinkFooter extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     multiColumn: PropTypes.bool,
     onLogout: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
@@ -53,7 +50,7 @@ class LinkFooter extends PureComponent {
   };
 
   render () {
-    const { signedIn, permissions } = this.context.identity;
+    const { signedIn, permissions } = this.props.identity;
     const { multiColumn } = this.props;
 
     const canInvite = signedIn && ((permissions & PERMISSION_INVITE_USERS) === PERMISSION_INVITE_USERS);
@@ -108,4 +105,4 @@ class LinkFooter extends PureComponent {
 
 }
 
-export default injectIntl(connect(null, mapDispatchToProps)(LinkFooter));
+export default injectIntl(withIdentity(connect(null, mapDispatchToProps)(LinkFooter)));
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
index 14a193343..ff90eef35 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx
@@ -31,6 +31,7 @@ import { fetchFollowRequests } from 'mastodon/actions/accounts';
 import { IconWithBadge } from 'mastodon/components/icon_with_badge';
 import { WordmarkLogo } from 'mastodon/components/logo';
 import { NavigationPortal } from 'mastodon/components/navigation_portal';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { timelinePreview, trendsEnabled } from 'mastodon/initial_state';
 import { transientSingleColumn } from 'mastodon/is_mobile';
 
@@ -97,12 +98,8 @@ const FollowRequestsLink = () => {
 };
 
 class NavigationPanel extends Component {
-
-  static contextTypes = {
-    identity: PropTypes.object.isRequired,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     intl: PropTypes.object.isRequired,
   };
 
@@ -112,7 +109,7 @@ class NavigationPanel extends Component {
 
   render () {
     const { intl } = this.props;
-    const { signedIn, disabledAccountId } = this.context.identity;
+    const { signedIn, disabledAccountId } = this.props.identity;
 
     let banner = undefined;
 
@@ -189,4 +186,4 @@ class NavigationPanel extends Component {
 
 }
 
-export default injectIntl(NavigationPanel);
+export default injectIntl(withIdentity(NavigationPanel));
diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx
index c84a2c51a..7742f6486 100644
--- a/app/javascript/mastodon/features/ui/index.jsx
+++ b/app/javascript/mastodon/features/ui/index.jsx
@@ -15,6 +15,7 @@ import { focusApp, unfocusApp, changeLayout } from 'mastodon/actions/app';
 import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'mastodon/actions/markers';
 import { INTRODUCTION_VERSION } from 'mastodon/actions/onboarding';
 import { PictureInPicture } from 'mastodon/features/picture_in_picture';
+import { identityContextPropShape, withIdentity } from 'mastodon/identity_context';
 import { layoutFromWindow } from 'mastodon/is_mobile';
 import { WithRouterPropTypes } from 'mastodon/utils/react_router';
 
@@ -120,12 +121,8 @@ const keyMap = {
 };
 
 class SwitchingColumnsArea extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     children: PropTypes.node,
     location: PropTypes.object,
     singleColumn: PropTypes.bool,
@@ -160,7 +157,7 @@ class SwitchingColumnsArea extends PureComponent {
 
   render () {
     const { children, singleColumn } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
     const pathName = this.props.location.pathname;
 
     let redirect;
@@ -252,12 +249,8 @@ class SwitchingColumnsArea extends PureComponent {
 }
 
 class UI extends PureComponent {
-
-  static contextTypes = {
-    identity: PropTypes.object.isRequired,
-  };
-
   static propTypes = {
+    identity: identityContextPropShape,
     dispatch: PropTypes.func.isRequired,
     children: PropTypes.node,
     isComposing: PropTypes.bool,
@@ -309,7 +302,7 @@ class UI extends PureComponent {
       this.dragTargets.push(e.target);
     }
 
-    if (e.dataTransfer && Array.from(e.dataTransfer.types).includes('Files') && this.props.canUploadMore && this.context.identity.signedIn) {
+    if (e.dataTransfer && Array.from(e.dataTransfer.types).includes('Files') && this.props.canUploadMore && this.props.identity.signedIn) {
       this.setState({ draggingOver: true });
     }
   };
@@ -337,7 +330,7 @@ class UI extends PureComponent {
     this.setState({ draggingOver: false });
     this.dragTargets = [];
 
-    if (e.dataTransfer && e.dataTransfer.files.length >= 1 && this.props.canUploadMore && this.context.identity.signedIn) {
+    if (e.dataTransfer && e.dataTransfer.files.length >= 1 && this.props.canUploadMore && this.props.identity.signedIn) {
       this.props.dispatch(uploadCompose(e.dataTransfer.files));
     }
   };
@@ -389,7 +382,7 @@ class UI extends PureComponent {
   };
 
   componentDidMount () {
-    const { signedIn } = this.context.identity;
+    const { signedIn } = this.props.identity;
 
     window.addEventListener('focus', this.handleWindowFocus, false);
     window.addEventListener('blur', this.handleWindowBlur, false);
@@ -586,7 +579,7 @@ class UI extends PureComponent {
         <div className={classNames('ui', { 'is-composing': isComposing })} ref={this.setRef}>
           <Header />
 
-          <SwitchingColumnsArea location={location} singleColumn={layout === 'mobile' || layout === 'single-column'}>
+          <SwitchingColumnsArea identity={this.props.identity} location={location} singleColumn={layout === 'mobile' || layout === 'single-column'}>
             {children}
           </SwitchingColumnsArea>
 
@@ -602,4 +595,4 @@ class UI extends PureComponent {
 
 }
 
-export default connect(mapStateToProps)(injectIntl(withRouter(UI)));
+export default connect(mapStateToProps)(injectIntl(withRouter(withIdentity(UI))));
diff --git a/app/javascript/mastodon/identity_context.tsx b/app/javascript/mastodon/identity_context.tsx
new file mode 100644
index 000000000..564b7895c
--- /dev/null
+++ b/app/javascript/mastodon/identity_context.tsx
@@ -0,0 +1,74 @@
+import PropTypes from 'prop-types';
+import { createContext, useContext } from 'react';
+
+import hoistStatics from 'hoist-non-react-statics';
+
+import type { InitialState } from 'mastodon/initial_state';
+
+export interface IdentityContextType {
+  signedIn: boolean;
+  accountId: string | undefined;
+  disabledAccountId: string | undefined;
+  accessToken: string | undefined;
+  permissions: number;
+}
+
+export const identityContextPropShape = PropTypes.shape({
+  signedIn: PropTypes.bool.isRequired,
+  accountId: PropTypes.string,
+  disabledAccountId: PropTypes.string,
+  accessToken: PropTypes.string,
+}).isRequired;
+
+export const createIdentityContext = (state: InitialState) => ({
+  signedIn: !!state.meta.me,
+  accountId: state.meta.me,
+  disabledAccountId: state.meta.disabled_account_id,
+  accessToken: state.meta.access_token,
+  permissions: state.role?.permissions ?? 0,
+});
+
+export const IdentityContext = createContext<IdentityContextType>({
+  signedIn: false,
+  permissions: 0,
+  accountId: undefined,
+  disabledAccountId: undefined,
+  accessToken: undefined,
+});
+
+export const useIdentity = () => useContext(IdentityContext);
+
+export interface IdentityProps {
+  ref?: unknown;
+  wrappedComponentRef?: unknown;
+}
+
+/* Injects an `identity` props into the wrapped component to be able to use the new context in class components */
+export function withIdentity<
+  ComponentType extends React.ComponentType<IdentityProps>,
+>(Component: ComponentType) {
+  const displayName = `withIdentity(${Component.displayName ?? Component.name})`;
+  const C = (props: React.ComponentProps<ComponentType>) => {
+    const { wrappedComponentRef, ...remainingProps } = props;
+
+    return (
+      <IdentityContext.Consumer>
+        {(context) => {
+          return (
+            // @ts-expect-error - Dynamic covariant generic components are tough to type.
+            <Component
+              {...remainingProps}
+              identity={context}
+              ref={wrappedComponentRef}
+            />
+          );
+        }}
+      </IdentityContext.Consumer>
+    );
+  };
+
+  C.displayName = displayName;
+  C.WrappedComponent = Component;
+
+  return hoistStatics(C, Component);
+}
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index d8c57a2a0..5d60565e1 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -44,12 +44,22 @@
  * @property {string} sso_redirect
  */
 
+/**
+ * @typedef Role
+ * @property {string} id
+ * @property {string} name
+ * @property {string} permissions
+ * @property {string} color
+ * @property {boolean} highlighted
+ */
+
 /**
  * @typedef InitialState
  * @property {Record<string, import("./api_types/accounts").ApiAccountJSON>} accounts
  * @property {InitialStateLanguage[]} languages
  * @property {boolean=} critical_updates_pending
  * @property {InitialStateMeta} meta
+ * @property {Role?} role
  */
 
 const element = document.getElementById('initial-state');

From 0a343b9a91bc11fd61090fea027431d1e6b94479 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 19 May 2024 19:15:06 +0200
Subject: [PATCH 151/215] fix(deps): update react monorepo to v18.3.1 (#30074)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index efe8cc026..0fd8ead3a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -14269,14 +14269,14 @@ __metadata:
   linkType: hard
 
 "react-dom@npm:^18.2.0":
-  version: 18.2.0
-  resolution: "react-dom@npm:18.2.0"
+  version: 18.3.1
+  resolution: "react-dom@npm:18.3.1"
   dependencies:
     loose-envify: "npm:^1.1.0"
-    scheduler: "npm:^0.23.0"
+    scheduler: "npm:^0.23.2"
   peerDependencies:
-    react: ^18.2.0
-  checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a
+    react: ^18.3.1
+  checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85
   languageName: node
   linkType: hard
 
@@ -14679,11 +14679,11 @@ __metadata:
   linkType: hard
 
 "react@npm:^18.2.0":
-  version: 18.2.0
-  resolution: "react@npm:18.2.0"
+  version: 18.3.1
+  resolution: "react@npm:18.3.1"
   dependencies:
     loose-envify: "npm:^1.1.0"
-  checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8
+  checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3
   languageName: node
   linkType: hard
 

From 0f07e1cd4cf04049eda34d4dfd98c12fafc5e344 Mon Sep 17 00:00:00 2001
From: Nick Schonning <nschonni@gmail.com>
Date: Sun, 19 May 2024 15:37:49 -0400
Subject: [PATCH 152/215] Fix yarn.lock diff (#30366)

---
 yarn.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/yarn.lock b/yarn.lock
index 0fd8ead3a..4d6fe4d1f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -15344,7 +15344,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"scheduler@npm:^0.23.0, scheduler@npm:^0.23.2":
+"scheduler@npm:^0.23.2":
   version: 0.23.2
   resolution: "scheduler@npm:0.23.2"
   dependencies:

From 990a0c19a9205fdd8b3e6c0082cc8b80725de144 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Mon, 20 May 2024 09:29:27 +0200
Subject: [PATCH 153/215] Fix a warning when running JS Tests because of
 FakeIdentityContext using deprecated context API (#30368)

---
 app/javascript/mastodon/test_helpers.tsx | 43 ++++++------------------
 1 file changed, 11 insertions(+), 32 deletions(-)

diff --git a/app/javascript/mastodon/test_helpers.tsx b/app/javascript/mastodon/test_helpers.tsx
index 69d57b95a..bfea3f6bf 100644
--- a/app/javascript/mastodon/test_helpers.tsx
+++ b/app/javascript/mastodon/test_helpers.tsx
@@ -1,7 +1,3 @@
-import PropTypes from 'prop-types';
-import type { PropsWithChildren } from 'react';
-import { Component } from 'react';
-
 import { IntlProvider } from 'react-intl';
 
 import { MemoryRouter } from 'react-router';
@@ -9,44 +5,27 @@ import { MemoryRouter } from 'react-router';
 // eslint-disable-next-line import/no-extraneous-dependencies
 import { render as rtlRender } from '@testing-library/react';
 
-class FakeIdentityWrapper extends Component<
-  PropsWithChildren<{ signedIn: boolean }>
-> {
-  static childContextTypes = {
-    identity: PropTypes.shape({
-      signedIn: PropTypes.bool.isRequired,
-      accountId: PropTypes.string,
-      disabledAccountId: PropTypes.string,
-      accessToken: PropTypes.string,
-    }).isRequired,
-  };
-
-  getChildContext() {
-    return {
-      identity: {
-        signedIn: this.props.signedIn,
-        accountId: '123',
-        accessToken: 'test-access-token',
-      },
-    };
-  }
-
-  render() {
-    return this.props.children;
-  }
-}
+import { IdentityContext } from './identity_context';
 
 function render(
   ui: React.ReactElement,
   { locale = 'en', signedIn = true, ...renderOptions } = {},
 ) {
+  const fakeIdentity = {
+    signedIn: signedIn,
+    accountId: '123',
+    accessToken: 'test-access-token',
+    disabledAccountId: undefined,
+    permissions: 0,
+  };
+
   const Wrapper = (props: { children: React.ReactNode }) => {
     return (
       <MemoryRouter>
         <IntlProvider locale={locale}>
-          <FakeIdentityWrapper signedIn={signedIn}>
+          <IdentityContext.Provider value={fakeIdentity}>
             {props.children}
-          </FakeIdentityWrapper>
+          </IdentityContext.Provider>
         </IntlProvider>
       </MemoryRouter>
     );

From 778bd96a52a6c608f78b07f80764046a2eac61b3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 20 May 2024 09:40:20 +0200
Subject: [PATCH 154/215] chore(deps): update dependency @types/lodash to
 v4.17.4 (#30371)

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 4d6fe4d1f..98b2da311 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3705,9 +3705,9 @@ __metadata:
   linkType: hard
 
 "@types/lodash@npm:^4.14.195":
-  version: 4.17.1
-  resolution: "@types/lodash@npm:4.17.1"
-  checksum: 10c0/af2ad8a3c8d7deb170a7ec6e18afc5ae8980576e5f7fe798d8a95a1df7222c15bdf967a25a35879f575a3b64743de00145710ee461a0051e055e94e4fe253f45
+  version: 4.17.4
+  resolution: "@types/lodash@npm:4.17.4"
+  checksum: 10c0/0124c64cb9fe7a0f78b6777955abd05ef0d97844d49118652eae45f8fa57bfb7f5a7a9bccc0b5a84c0a6dc09631042e4590cb665acb9d58dfd5e6543c75341ec
   languageName: node
   linkType: hard
 

From 814d00cf4b8942b87db17b2bc2877f25d7e83f96 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 20 May 2024 09:40:37 +0200
Subject: [PATCH 155/215] chore(deps): update dependency @formatjs/cli to
 v6.2.12 (#30370)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 98b2da311..6b1dd8d22 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2215,13 +2215,13 @@ __metadata:
   linkType: hard
 
 "@formatjs/cli@npm:^6.1.1":
-  version: 6.2.10
-  resolution: "@formatjs/cli@npm:6.2.10"
+  version: 6.2.12
+  resolution: "@formatjs/cli@npm:6.2.12"
   peerDependencies:
     "@glimmer/env": ^0.1.7
-    "@glimmer/reference": ^0.91.1
-    "@glimmer/syntax": ^0.91.1
-    "@glimmer/validator": ^0.91.1
+    "@glimmer/reference": ^0.91.1 || ^0.92.0
+    "@glimmer/syntax": ^0.92.0
+    "@glimmer/validator": ^0.92.0
     "@vue/compiler-core": ^3.4.0
     content-tag: ^2.0.1
     ember-template-recast: ^6.1.4
@@ -2245,7 +2245,7 @@ __metadata:
       optional: true
   bin:
     formatjs: bin/formatjs
-  checksum: 10c0/34b1b0b3be25d945111c1f57913f50da7308ecd05501a27eaca210a774eb50c616b5706ba796d37ffa223ac4c5cddd5f36fe0ca8d31ad8c8ade79cdd497ccfb9
+  checksum: 10c0/3bd05a9fad6c837e22988e6638f426c128efa46ab80ff88cf2ad81fb3bc10cf4f228907577fc01e24c2d7d505cfabfaa69f0496d2ec8f0ab2d6b5eaccb5e475c
   languageName: node
   linkType: hard
 

From 8b75d18371edb1830de72b83737f94d9024b32b4 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 20 May 2024 09:41:38 +0200
Subject: [PATCH 156/215] New Crowdin Translations (automated) (#30358)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/ia.json |  30 +--
 app/javascript/mastodon/locales/ru.json |   1 +
 app/javascript/mastodon/locales/sl.json |   1 +
 app/javascript/mastodon/locales/th.json |   2 +-
 config/locales/bg.yml                   |   1 +
 config/locales/ca.yml                   |   1 +
 config/locales/da.yml                   |   1 +
 config/locales/de.yml                   |   1 +
 config/locales/devise.ia.yml            |  53 +++--
 config/locales/doorkeeper.ia.yml        |  77 +++++-
 config/locales/es-AR.yml                |   1 +
 config/locales/es-MX.yml                |   1 +
 config/locales/es.yml                   |   1 +
 config/locales/fi.yml                   |   1 +
 config/locales/fo.yml                   |   1 +
 config/locales/gl.yml                   |   1 +
 config/locales/he.yml                   |   1 +
 config/locales/hu.yml                   |   1 +
 config/locales/ia.yml                   | 301 ++++++++++++++++++++++++
 config/locales/it.yml                   |   1 +
 config/locales/ko.yml                   |   1 +
 config/locales/lad.yml                  |   1 +
 config/locales/nl.yml                   |   1 +
 config/locales/pl.yml                   |   1 +
 config/locales/pt-PT.yml                |   1 +
 config/locales/simple_form.fi.yml       |   6 +-
 config/locales/simple_form.sl.yml       |   6 +
 config/locales/sl.yml                   |   1 +
 config/locales/sr-Latn.yml              |   1 +
 config/locales/sr.yml                   |   1 +
 config/locales/sv.yml                   |   1 +
 config/locales/th.yml                   |   2 +
 config/locales/tr.yml                   |   1 +
 config/locales/vi.yml                   |   1 +
 config/locales/zh-CN.yml                |   1 +
 config/locales/zh-TW.yml                |   1 +
 36 files changed, 464 insertions(+), 41 deletions(-)

diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index 313563bdf..47c64e3f0 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -19,7 +19,7 @@
   "account.block_domain": "Blocar dominio {domain}",
   "account.block_short": "Blocar",
   "account.blocked": "Blocate",
-  "account.browse_more_on_origin_server": "Navigar plus sur le profilo original",
+  "account.browse_more_on_origin_server": "Percurrer plus sur le profilo original",
   "account.cancel_follow_request": "Cancellar sequimento",
   "account.copy": "Copiar ligamine a profilo",
   "account.direct": "Mentionar privatemente @{name}",
@@ -122,7 +122,7 @@
   "column.direct": "Mentiones private",
   "column.directory": "Navigar profilos",
   "column.domain_blocks": "Dominios blocate",
-  "column.favourites": "Favoritos",
+  "column.favourites": "Favorites",
   "column.firehose": "Fluxos in directo",
   "column.follow_requests": "Requestas de sequimento",
   "column.home": "Initio",
@@ -204,7 +204,7 @@
   "disabled_account_banner.account_settings": "Parametros de conto",
   "disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.",
   "dismissable_banner.community_timeline": "Ecce le messages public le plus recente del personas con contos sur {domain}.",
-  "dismissable_banner.dismiss": "Dimitter",
+  "dismissable_banner.dismiss": "Clauder",
   "dismissable_banner.explore_links": "Istes es le articulos de novas que se condivide le plus sur le rete social hodie. Le articulos de novas le plus recente, publicate per plus personas differente, se classifica plus in alto.",
   "dismissable_banner.explore_statuses": "Ecce le messages de tote le rete social que gania popularitate hodie. Le messages plus nove con plus impulsos e favorites se classifica plus in alto.",
   "dismissable_banner.explore_tags": "Ecce le hashtags que gania popularitate sur le rete social hodie. Le hashtags usate per plus personas differente se classifica plus in alto.",
@@ -212,8 +212,8 @@
   "domain_block_modal.block": "Blocar le servitor",
   "domain_block_modal.block_account_instead": "Blocar @{name} in su loco",
   "domain_block_modal.they_can_interact_with_old_posts": "Le personas de iste servitor pote interager con tu messages ancian.",
-  "domain_block_modal.they_cant_follow": "Nulle persona ab iste servitor pote sequer te.",
-  "domain_block_modal.they_wont_know": "Illes non sapera que illes ha essite blocate.",
+  "domain_block_modal.they_cant_follow": "Necuno de iste servitor pote sequer te.",
+  "domain_block_modal.they_wont_know": "Ille non sapera que ille ha essite blocate.",
   "domain_block_modal.title": "Blocar dominio?",
   "domain_block_modal.you_will_lose_followers": "Omne sequitores ab iste servitor essera removite.",
   "domain_block_modal.you_wont_see_posts": "Tu non videra messages e notificationes ab usatores sur iste servitor.",
@@ -307,7 +307,7 @@
   "follow_request.reject": "Rejectar",
   "follow_requests.unlocked_explanation": "Benque tu conto non es serrate, le personal de {domain} pensa que es un bon idea que tu revide manualmente le sequente requestas de iste contos.",
   "follow_suggestions.curated_suggestion": "Selection del equipa",
-  "follow_suggestions.dismiss": "Non monstrar novemente",
+  "follow_suggestions.dismiss": "Non monstrar de novo",
   "follow_suggestions.featured_longer": "Seligite con cura per le equipa de {domain}",
   "follow_suggestions.friends_of_friends_longer": "Popular inter le gente que tu seque",
   "follow_suggestions.hints.featured": "Iste profilo ha essite seligite manualmente per le equipa de {domain}.",
@@ -412,7 +412,7 @@
   "lightbox.next": "Sequente",
   "lightbox.previous": "Precedente",
   "limited_account_hint.action": "Monstrar profilo in omne caso",
-  "limited_account_hint.title": "Iste profilo esseva celate per le moderatores de {domain}.",
+  "limited_account_hint.title": "Iste profilo ha essite celate per le moderatores de {domain}.",
   "link_preview.author": "Per {name}",
   "lists.account.add": "Adder al lista",
   "lists.account.remove": "Remover del lista",
@@ -432,12 +432,12 @@
   "loading_indicator.label": "Cargante…",
   "media_gallery.toggle_visible": "{number, plural, one {Celar imagine} other {Celar imagines}}",
   "moved_to_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate perque tu ha cambiate de conto a {movedToAccount}.",
-  "mute_modal.hide_from_notifications": "Celar ab notificationes",
+  "mute_modal.hide_from_notifications": "Celar in notificationes",
   "mute_modal.hide_options": "Celar optiones",
   "mute_modal.indefinite": "Usque io dissilentia iste persona",
   "mute_modal.show_options": "Monstrar optiones",
-  "mute_modal.they_can_mention_and_follow": "Illes pote mentionar te e sequer te, ma tu non potera vider los.",
-  "mute_modal.they_wont_know": "Illes non sapera que illes ha essite silentiate.",
+  "mute_modal.they_can_mention_and_follow": "Ille pote mentionar te e sequer te, ma tu non potera vider le.",
+  "mute_modal.they_wont_know": "Ille non sapera que ille ha essite silentiate.",
   "mute_modal.title": "Silentiar le usator?",
   "mute_modal.you_wont_see_mentions": "Tu non videra le messages que mentiona iste persona.",
   "mute_modal.you_wont_see_posts": "Iste persona pote totevia vider tu messages, ma tu non videra le sues.",
@@ -451,13 +451,13 @@
   "navigation_bar.discover": "Discoperir",
   "navigation_bar.domain_blocks": "Dominios blocate",
   "navigation_bar.explore": "Explorar",
-  "navigation_bar.favourites": "Favoritos",
+  "navigation_bar.favourites": "Favorites",
   "navigation_bar.filters": "Parolas silentiate",
   "navigation_bar.follow_requests": "Requestas de sequimento",
   "navigation_bar.followed_tags": "Hashtags sequite",
   "navigation_bar.follows_and_followers": "Sequites e sequitores",
   "navigation_bar.lists": "Listas",
-  "navigation_bar.logout": "Clauder le session",
+  "navigation_bar.logout": "Clauder session",
   "navigation_bar.mutes": "Usatores silentiate",
   "navigation_bar.opened_in_classic_interface": "Messages, contos e altere paginas specific es aperite per predefinition in le interfacie web classic.",
   "navigation_bar.personal": "Personal",
@@ -501,7 +501,7 @@
   "notifications.column_settings.admin.report": "Nove signalationes:",
   "notifications.column_settings.admin.sign_up": "Nove inscriptiones:",
   "notifications.column_settings.alert": "Notificationes de scriptorio",
-  "notifications.column_settings.favourite": "Favoritos:",
+  "notifications.column_settings.favourite": "Favorites:",
   "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias",
   "notifications.column_settings.filter_bar.category": "Barra de filtro rapide",
   "notifications.column_settings.follow": "Nove sequitores:",
@@ -518,7 +518,7 @@
   "notifications.column_settings.update": "Modificationes:",
   "notifications.filter.all": "Toto",
   "notifications.filter.boosts": "Impulsos",
-  "notifications.filter.favourites": "Favoritos",
+  "notifications.filter.favourites": "Favorites",
   "notifications.filter.follows": "Sequites",
   "notifications.filter.mentions": "Mentiones",
   "notifications.filter.polls": "Resultatos del sondage",
@@ -717,7 +717,7 @@
   "status.edited": "Ultime modification le {date}",
   "status.edited_x_times": "Modificate {count, plural, one {{count} vice} other {{count} vices}}",
   "status.embed": "Incastrar",
-  "status.favourite": "Adder al favoritos",
+  "status.favourite": "Adder al favorites",
   "status.favourites": "{count, plural, one {favorite} other {favorites}}",
   "status.filter": "Filtrar iste message",
   "status.filtered": "Filtrate",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index cd09a505b..07a41385a 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -468,6 +468,7 @@
   "notification.follow": "{name} подписался (-лась) на вас",
   "notification.follow_request": "{name} отправил запрос на подписку",
   "notification.mention": "{name} упомянул(а) вас",
+  "notification.moderation_warning.action_delete_statuses": "Некоторые из ваших публикаций были удалены.",
   "notification.own_poll": "Ваш опрос закончился",
   "notification.poll": "Опрос, в котором вы приняли участие, завершился",
   "notification.reblog": "{name} продвинул(а) ваш пост",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 459d05ce3..7806abc6b 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -474,6 +474,7 @@
   "notification.follow_request": "{name} vam želi slediti",
   "notification.mention": "{name} vas je omenil/a",
   "notification.moderation-warning.learn_more": "Več o tem",
+  "notification.moderation_warning": "Prejeli ste opozorilo moderatorjev",
   "notification.moderation_warning.action_delete_statuses": "Nekatere vaše objave so odstranjene.",
   "notification.moderation_warning.action_disable": "Vaš račun je bil onemogočen.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Nekatere vaše objave so bile označene kot občutljive.",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 7c6b2ade4..b1b9407ba 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -158,7 +158,7 @@
   "compose_form.poll.option_placeholder": "ตัวเลือก {number}",
   "compose_form.poll.single": "เลือกอย่างใดอย่างหนึ่ง",
   "compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายตัวเลือก",
-  "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว",
+  "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดียว",
   "compose_form.poll.type": "ลักษณะ",
   "compose_form.publish": "โพสต์",
   "compose_form.publish_form": "โพสต์ใหม่",
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index f242039ed..51180bc66 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -285,6 +285,7 @@ bg:
         update_custom_emoji_html: "%{name} обнови емоджито %{target}"
         update_domain_block_html: "%{name} обнови блокирането на домейна за %{target}"
         update_ip_block_html: "%{name} промени правило за IP на %{target}"
+        update_report_html: "%{name} осъвремени доклад %{target}"
         update_status_html: "%{name} обнови публикация от %{target}"
         update_user_role_html: "%{name} промени ролята %{target}"
       deleted_account: изтрит акаунт
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 08fef7364..34fd90085 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -285,6 +285,7 @@ ca:
         update_custom_emoji_html: "%{name} ha actualitzat l'emoji %{target}"
         update_domain_block_html: "%{name} ha actualitzat el bloqueig de domini per a %{target}"
         update_ip_block_html: "%{name} ha canviat la norma per la IP %{target}"
+        update_report_html: "%{name} ha actualitzat l'informe %{target}"
         update_status_html: "%{name} ha actualitzat l'estat de %{target}"
         update_user_role_html: "%{name} ha canviat el rol %{target}"
       deleted_account: compte eliminat
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 252d0e2b5..17d3037a7 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -285,6 +285,7 @@ da:
         update_custom_emoji_html: "%{name} opdaterede emoji %{target}"
         update_domain_block_html: "%{name} opdaterede domæneblokeringen for %{target}"
         update_ip_block_html: "%{name} ændrede reglen for IP'en %{target}"
+        update_report_html: "%{name} opdaterede rapporten %{target}"
         update_status_html: "%{name} opdaterede indlægget fra %{target}"
         update_user_role_html: "%{name} ændrede %{target}-rolle"
       deleted_account: slettet konto
diff --git a/config/locales/de.yml b/config/locales/de.yml
index b19315e39..dd2129584 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -285,6 +285,7 @@ de:
         update_custom_emoji_html: "%{name} bearbeitete das Emoji %{target}"
         update_domain_block_html: "%{name} aktualisierte die Domain-Sperre für %{target}"
         update_ip_block_html: "%{name} änderte die Regel für die IP-Adresse %{target}"
+        update_report_html: "%{name} überarbeitete die Meldung %{target}"
         update_status_html: "%{name} überarbeitete einen Beitrag von %{target}"
         update_user_role_html: "%{name} änderte die Rolle von %{target}"
       deleted_account: gelöschtes Konto
diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml
index c68efddd0..e6ae6d4af 100644
--- a/config/locales/devise.ia.yml
+++ b/config/locales/devise.ia.yml
@@ -6,11 +6,11 @@ ia:
       send_instructions: Tu recipera un e-mail con instructiones pro confirmar tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe.
       send_paranoid_instructions: Si tu adresse de e-mail existe in nostre base de datos, tu recipera un e-mail con instructiones pro confirmar tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe.
     failure:
-      already_authenticated: Tu jam initiava le session.
-      inactive: Tu conto ancora non es activate.
+      already_authenticated: Tu ha jam aperite session.
+      inactive: Tu conto non es ancora activate.
       invalid: "%{authentication_keys} o contrasigno non valide."
       last_attempt: Tu ha solmente un altere tentativa ante que tu conto es serrate.
-      locked: Tu conto es blocate.
+      locked: Tu conto es serrate.
       not_found_in_database: "%{authentication_keys} o contrasigno non valide."
       omniauth_user_creation_failure: Error creante un conto pro iste identitate.
       pending: Tu conto es ancora sub revision.
@@ -51,12 +51,12 @@ ia:
         explanation: Ora es possibile aperir session con solmente le adresse de e-mail e contrasigno.
         subject: 'Mastodon: Authentication bifactorial disactivate'
         subtitle: Le authentication bifactorial ha essite disactivate pro tu conto.
-        title: 2FA disactivate
+        title: A2F disactivate
       two_factor_enabled:
         explanation: Pro le apertura de session essera necessari un token generate per le application TOTP accopulate.
         subject: 'Mastodon: Authentication bifactorial activate'
         subtitle: Le authentication bifactorial ha essite activate pro tu conto.
-        title: 2FA activate
+        title: A2F activate
       two_factor_recovery_codes_changed:
         explanation: Le ancian codices de recuperation ha essite invalidate e nove codices ha essite generate.
         subject: 'Mastodon: Codices de recuperation regenerate'
@@ -66,11 +66,11 @@ ia:
         subject: 'Mastodon: Instructiones pro disblocar'
       webauthn_credential:
         added:
-          explanation: Le sequente clave de securitate esseva addite a tu conto
+          explanation: Le sequente clave de securitate ha essite addite a tu conto
           subject: 'Mastodon: Nove clave de securitate'
-          title: Un nove clave de securitate esseva addite
+          title: Un nove clave de securitate ha essite addite
         deleted:
-          explanation: Le sequente clave de securitate esseva delite de tu conto
+          explanation: Le sequente clave de securitate ha essite delite de tu conto
           subject: 'Mastodon: Clave de securitate delite'
           title: Un de tu claves de securitate ha essite delite
       webauthn_disabled:
@@ -81,18 +81,41 @@ ia:
       webauthn_enabled:
         explanation: Le authentication con claves de securitate ha essite activate pro tu conto.
         extra: Tu clave de securitate pote ora esser usate pro aperir session.
+        subject: 'Mastodon: authentication de clave de securitate activate'
         title: Claves de securitate activate
+    omniauth_callbacks:
+      failure: Impossibile authenticar te ab %{kind} perque “%{reason}”.
+      success: Authenticate con successo ab conto %{kind}.
+    passwords:
+      no_token: Tu non pote acceder iste pagina sin venir ab un email de redefinition de contrasigno. Si tu veni ab un email de redefinition de contrasigno, verifica que tu usava le integre URL fornite.
+      send_instructions: Si tu adresse de e-mail existe in nostre base de datos, tu recipera un ligamine de recuperation de contrasigno in tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe.
+      send_paranoid_instructions: Si tu adresse de e-mail existe in nostre base de datos, tu recipera un ligamine de recuperation de contrasigno in tu adresse de e-mail in poc minutas. Per favor verifica tu dossier de spam si tu non lo recipe.
+      updated: Tu contrasigno ha essite cambiate. Tu ha ora aperite session.
+      updated_not_active: Tu contrasigno ha essite cambiate.
     registrations:
-      destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto.
-      signed_up_but_pending: Un message con un ligamine de confirmation esseva inviate a tu conto de email. Post que tu clicca le ligamine, nos revidera tu application. Tu essera notificate si illo es approbate.
+      destroyed: A revider! Tu conto ha essite cancellate. Nos spera vider te de novo tosto.
+      signed_up: Benvenite! Tu te ha inscribite con successo.
+      signed_up_but_inactive: Tu te ha inscribite con successo. Nonobstante, nos non poteva aperir tu session perque tu conto non es ancora activate.
+      signed_up_but_locked: Tu te ha inscribite con successo. Nonobstante, nos non poteva aperir tu session perque tu conto es serrate.
+      signed_up_but_pending: Un message con un ligamine de confirmation ha essite inviate a tu adresse de email. Post que tu clicca sur le ligamine, nos revidera tu demanda. Tu essera notificate si illo es approbate.
+      signed_up_but_unconfirmed: Un message con un ligamine de confirmation ha essite inviate a tu adresse de e-mail. Per favor seque le ligamine pro activar tu conto. Verifica tu dossier de spam si tu non recipe iste e-mail.
+      update_needs_confirmation: Tu ha actualisate tu conto con successo, ma nos debe verificar tu nove adresse de e-mail. Accede a tu e-mail e seque le ligamine de confirmation pro confirmar tu nove adresse de e-mail. Verifica tu dossier de spam si tu non recipe iste e-mail.
       updated: Tu conto ha essite actualisate con successo.
     sessions:
-      signed_in: Connexe con successo.
-      signed_out: Disconnexe con successo.
+      already_signed_out: Session claudite con successo.
+      signed_in: Session aperite con successo.
+      signed_out: Session claudite con successo.
     unlocks:
-      unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar.
+      send_instructions: Tu recipera un e-mail con instructiones explicante como disserrar tu conto in alcun minutas. Verifica tu dossier de spam si tu non recipe iste e-mail.
+      send_paranoid_instructions: Si tu conto existe, tu recipera un email con instructiones explicante como disserrar lo in alcun minutas. Verifica tu dossier de spam si tu non recipe iste e-mail.
+      unlocked: Tu conto ha essite disserrate con successo. Aperi session pro continuar.
   errors:
     messages:
-      already_confirmed: jam esseva confirmate, tenta initiar session
+      already_confirmed: jam esseva confirmate, tenta aperir session
+      confirmation_period_expired: debe esser confirmate in %{period}, per favor requesta un nove
+      expired: ha expirate, per favor requesta un nove
       not_found: non trovate
-      not_locked: non era blocate
+      not_locked: non esseva serrate
+      not_saved:
+        one: '1 error ha impedite a iste %{resource} de esser salvate:'
+        other: "%{count} errores ha impedite a iste %{resource} de esser salvate:"
diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml
index dc9659968..9c493e3d7 100644
--- a/config/locales/doorkeeper.ia.yml
+++ b/config/locales/doorkeeper.ia.yml
@@ -3,28 +3,40 @@ ia:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: Nomine de application
+        name: Nomine del application
+        redirect_uri: URI de redirection
         scopes: Ambitos
-        website: Sito web de application
+        website: Sito web del application
     errors:
       models:
         doorkeeper/application:
           attributes:
             redirect_uri:
+              fragment_present: non pote continer un fragmento.
               invalid_uri: debe esser un URI valide.
+              relative_uri: debe esser un URI absolute.
+              secured_uri: debe esser un URI HTTPS/SSL.
   doorkeeper:
     applications:
       buttons:
         authorize: Autorisar
         cancel: Cancellar
+        destroy: Destruer
         edit: Modificar
         submit: Submitter
       confirmations:
         destroy: Es tu secur?
       edit:
         title: Modificar application
+      form:
+        error: Oops! Verifica tu formulario pro possibile errores
+      help:
+        native_redirect_uri: Usar %{native_redirect_uri} pro tests local
+        redirect_uri: Usar un linea per URI
+        scopes: Separa ambitos con spatios. Lassa vacue pro usar le ambitos predefinite.
       index:
         application: Application
+        callback_url: URL de retorno
         delete: Deler
         empty: Tu non ha applicationes.
         name: Nomine
@@ -37,17 +49,22 @@ ia:
       show:
         actions: Actiones
         application_id: Clave del cliente
+        callback_urls: URLs de retorno
         scopes: Ambitos
+        secret: Secreto del application
         title: 'Application: %{name}'
     authorizations:
       buttons:
         authorize: Autorisar
         deny: Negar
       error:
-        title: Ocurreva un error
+        title: Un error ha occurrite
       new:
+        prompt_html: "%{client_name} vole haber le permission de acceder a tu conto. Illo es un application tertie. <strong>Si tu non confide in illo, alora tu non deberea autorisar lo.</strong>"
         review_permissions: Revisionar le permissos
         title: Autorisation necessari
+      show:
+        title: Copia iste codice de autorisation e colla lo in le application.
     authorized_applications:
       buttons:
         revoke: Revocar
@@ -55,11 +72,35 @@ ia:
         revoke: Es tu secur?
       index:
         authorized_at: Autorisate le %{date}
+        description_html: Ecce applicationes que pote acceder tu conto per le API. Si il ha applicationes que tu non recognosce ci, o un application que se comporta mal, tu pote revocar su accesso.
         last_used_at: Ultime uso in %{date}
         never_used: Nunquam usate
         scopes: Permissiones
         superapp: Interne
         title: Tu applicationes autorisate
+    errors:
+      messages:
+        access_denied: Le proprietario del ressource o servitor de autorisation ha refusate le requesta.
+        credential_flow_not_configured: Le processo de credentiales de contrasigno del proprietario del ressource ha fallite perque Doorkeeper.configure.resource_owner_from_credentials non es configurate.
+        invalid_client: Le authentication del cliente ha fallite perque le cliente es incognite, necun authentication de cliente es includite, o le methodo de authentication non es supportate.
+        invalid_grant: Le concession de autorisation fornite es invalide, expirate, revocate, non corresponde al URI de redirection usate in le requesta de autorisation, o ha essite emittite a un altere cliente.
+        invalid_redirect_uri: Le URI de redirection includite non es valide.
+        invalid_request:
+          missing_param: 'Parametro requirite mancante: %{value}.'
+          request_not_authorized: Le requesta debe esser autorisate. Un parametro requirite pro autorisar le requesta manca o non es valide.
+          unknown: Le requesta non include un parametro requirite, include un valor de parametro non supportate, o es alteremente mal formate.
+        invalid_resource_owner: Le credentiales del proprietario del ressource fornite non es valide, o le proprietario del ressource non pote esser trovate
+        invalid_scope: Le ambito requirite es invalide, incognite, o mal formate.
+        invalid_token:
+          expired: Le token de accesso ha expirate
+          revoked: Le token de accesso ha essite revocate
+          unknown: Le token de accesso non es valide
+        resource_owner_authenticator_not_configured: Impossibile trovar le proprietario del ressource perque Doorkeeper.configure.resource_owner_authenticator non es configurate.
+        server_error: Le servitor de autorisation ha incontrate un condition impreviste que lo ha impedite de complir le requesta.
+        temporarily_unavailable: Le servitor de autorisation actualmente non pote gerer le requesta a causa de un supercarga temporari o de mantenentia del servitor.
+        unauthorized_client: Le application non es autorisate a exequer iste requesta usante iste methodo.
+        unsupported_grant_type: Le typo de concession de autorisation non es supportate per le servitor de autorisation.
+        unsupported_response_type: Le servitor de autorisation non supporta iste typo de responsa.
     flash:
       applications:
         create:
@@ -73,20 +114,22 @@ ia:
           notice: Application revocate.
     grouped_scopes:
       access:
-        read: Accesso de sol lectura
+        read: Accesso de lectura sol
         read/write: Accesso de lectura e scriptura
-        write: Accesso de sol scriptura
+        write: Accesso de scriptura sol
       title:
         accounts: Contos
         admin/accounts: Gestion de contos
         admin/all: Tote le functiones administrative
         admin/reports: Gestion de reportos
-        all: Accesso plen a tu conto de Mastodon
+        all: Accesso complete a tu conto de Mastodon
         blocks: Blocadas
         bookmarks: Marcapaginas
         conversations: Conversationes
-        favourites: Favoritos
+        crypto: Cryptation de puncta a puncta
+        favourites: Favorites
         filters: Filtros
+        follow: Sequites, silentiates e blocates
         follows: Sequites
         lists: Listas
         media: Annexos multimedial
@@ -101,21 +144,41 @@ ia:
         nav:
           applications: Applicationes
           oauth2_provider: Fornitor OAuth2
+      application:
+        title: Autorisation OAuth necessari
     scopes:
       admin:read: leger tote le datos in le servitor
       admin:read:accounts: leger information sensibile de tote le contos
+      admin:read:canonical_email_blocks: leger datos sensibile de tote le blocadas de email canonic
+      admin:read:domain_allows: leger informationes sensibile de tote le dominios permittite
+      admin:read:domain_blocks: leger informationes sensibile de tote le blocadas de dominio
+      admin:read:email_domain_blocks: leger informationes sensibile de tote le blocadas de dominio email
+      admin:read:ip_blocks: leger informationes sensibile de tote le blocadas de IP
+      admin:read:reports: leger information sensibile de tote le reportos e contos signalate
       admin:write: modificar tote le datos in le servitor
+      admin:write:accounts: exequer action de moderation sur contos
+      admin:write:canonical_email_blocks: exequer actiones de moderation sur blocadas de email canonic
+      admin:write:domain_allows: exequer actiones de moderation sur dominios permittite
+      admin:write:domain_blocks: exequer actiones de moderation sur blocadas de dominio
+      admin:write:email_domain_blocks: exequer actiones de moderation sur blocadas de dominio email
+      admin:write:ip_blocks: exequer actiones de moderation sur blocadas de IP
+      admin:write:reports: exequer action de moderation sur reportos
+      crypto: usar cryptation de extremo-a-extremo
       follow: modificar relationes del contos
+      push: reciper tu notificationes push
       read: leger tote le datos de tu conto
       read:accounts: vider informationes de conto
+      read:blocks: vider tu blocadas
       read:bookmarks: vider tu marcapaginas
       read:favourites: vider tu favoritos
       read:filters: vider tu filtros
       read:follows: vider tu sequites
       read:lists: vider tu listas
       read:me: leger solmente le information basic de tu conto
+      read:mutes: vider tu silentiates
       read:notifications: vider tu notificationes
       read:reports: vider tu reportos
+      read:search: cercar in tu nomine
       read:statuses: vider tote le messages
       write: modificar tote le datos de tu conto
       write:accounts: modificar tu profilo
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index aa3668d92..302be4411 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -285,6 +285,7 @@ es-AR:
         update_custom_emoji_html: "%{name} actualizó el emoji %{target}"
         update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}"
         update_ip_block_html: "%{name} cambió la regla para la dirección IP %{target}"
+        update_report_html: "%{name} actualizó la denuncia %{target}"
         update_status_html: "%{name} actualizó el mensaje de %{target}"
         update_user_role_html: "%{name} cambió el rol %{target}"
       deleted_account: cuenta eliminada
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 6a306b07b..10806c6b6 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -285,6 +285,7 @@ es-MX:
         update_custom_emoji_html: "%{name} actualizó el emoji %{target}"
         update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}"
         update_ip_block_html: "%{name} cambió la regla para la IP %{target}"
+        update_report_html: "%{name} actualizó el informe %{target}"
         update_status_html: "%{name} actualizó el estado de %{target}"
         update_user_role_html: "%{name} cambió el rol %{target}"
       deleted_account: cuenta eliminada
diff --git a/config/locales/es.yml b/config/locales/es.yml
index e7db7c8b0..840bc2ce9 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -285,6 +285,7 @@ es:
         update_custom_emoji_html: "%{name} actualizó el emoji %{target}"
         update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}"
         update_ip_block_html: "%{name} cambió la regla para la IP %{target}"
+        update_report_html: "%{name} actualizó el informe %{target}"
         update_status_html: "%{name} actualizó la publicación de %{target}"
         update_user_role_html: "%{name} cambió el rol %{target}"
       deleted_account: cuenta eliminada
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 5f96f611b..53db0232a 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -285,6 +285,7 @@ fi:
         update_custom_emoji_html: "%{name} päivitti emojin %{target}"
         update_domain_block_html: "%{name} päivitti verkkotunnuksen %{target} eston"
         update_ip_block_html: "%{name} muutti sääntöä IP-osoitteelle %{target}"
+        update_report_html: "%{name} päivitti raportin %{target}"
         update_status_html: "%{name} päivitti käyttäjän %{target} julkaisun"
         update_user_role_html: "%{name} muutti roolia %{target}"
       deleted_account: poisti tilin
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index f7303c512..57caff4d7 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -285,6 +285,7 @@ fo:
         update_custom_emoji_html: "%{name} dagførdi kensluteknið %{target}"
         update_domain_block_html: "%{name} dagførdi navnaøkisblokeringina hjá %{target}"
         update_ip_block_html: "%{name} broytti IP-reglurnar %{target}"
+        update_report_html: "%{name} dagførdi meldingina %{target}"
         update_status_html: "%{name} dagførdi postin hjá %{target}"
         update_user_role_html: "%{name} broyttir %{target} leiklutir"
       deleted_account: strikað konta
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 57af7c82c..2c85dc89a 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -285,6 +285,7 @@ gl:
         update_custom_emoji_html: "%{name} actualizou o emoji %{target}"
         update_domain_block_html: "%{name} actualizou o bloqueo do dominio para %{target}"
         update_ip_block_html: "%{name} cambiou a regra para IP %{target}"
+        update_report_html: "%{name} actualizou a denuncia %{target}"
         update_status_html: "%{name} actualizou a publicación de %{target}"
         update_user_role_html: "%{name} cambiou o rol %{target}"
       deleted_account: conta eliminada
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 14da27ec7..3613a9f0b 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -291,6 +291,7 @@ he:
         update_custom_emoji_html: "%{name} עדכן/ה אמוג'י %{target}"
         update_domain_block_html: "%{name} עדכן/ה חסימת דומיין עבור %{target}"
         update_ip_block_html: "%{name} שינה כלל עבור IP %{target}"
+        update_report_html: '%{name} עדכן/ה דו"ח %{target}'
         update_status_html: "%{name} עדכן/ה הודעה של %{target}"
         update_user_role_html: "%{name} שינה את התפקיד של %{target}"
       deleted_account: חשבון מחוק
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index c48d527ca..dd5783051 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -285,6 +285,7 @@ hu:
         update_custom_emoji_html: "%{name} frissítette az emodzsit: %{target}"
         update_domain_block_html: "%{name} frissítette a %{target} domain tiltását"
         update_ip_block_html: "%{name} módosította a(z) %{target} IP-címre vonatkozó szabályt"
+        update_report_html: "%{name} frissítette a %{target} bejelentést"
         update_status_html: "%{name} frissítette %{target} felhasználó bejegyzését"
         update_user_role_html: "%{name} módosította a(z) %{target} szerepkört"
       deleted_account: törölt fiók
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 68676a09f..8af676454 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -285,6 +285,7 @@ ia:
         update_custom_emoji_html: "%{name} actualisava le emoticone %{target}"
         update_domain_block_html: "%{name} actualisava le blocada de dominio pro %{target}"
         update_ip_block_html: "%{name} cambiava le regula pro IP %{target}"
+        update_report_html: "%{name} actualisava le reporto %{target}"
         update_status_html: "%{name} actualisava le message per %{target}"
         update_user_role_html: "%{name} cambiava le rolo de %{target}"
       deleted_account: conto delite
@@ -973,6 +974,7 @@ ia:
       webhook: Crocs web
   admin_mailer:
     auto_close_registrations:
+      body: Per un carentia recente de activate de moderator, le registrationes sur %{instance} ha essite automaticamente mutate a besoniante revision manual, pro impedir %{instance} de esser usate como un platteforma pro potential mal actores. Tu pote mutar lo retro pro sempre aperir le registrationes.
       subject: Le registrationes pro %{instance} ha essite automaticamente mutate a besoniante de approbation
     new_appeal:
       actions:
@@ -1054,19 +1056,27 @@ ia:
       clicking_this_link: cliccante iste ligamine
       login_link: acceder
       proceed_to_login_html: Ora tu pote continuar a %{login_link}.
+      redirect_to_app_html: Tu deberea haber essite re-dirigite al app <strong>%{app_name}</strong>. Si isto non eveni, tenta %{clicking_this_link} o manualmente retorna al app.
+      registration_complete: Tu registration sur %{domain} es ora complete!
       welcome_title: Benvenite, %{name}!
+      wrong_email_hint: Si ille adresse email non es correcte, tu pote cambiar lo in parametros de conto.
     delete_account: Deler le conto
+    delete_account_html: Si tu vole a dele tu conto, tu pote <a href="%{path}">continuar ci</a>. Te sera demandate confirmation.
     description:
+      prefix_invited_by_user: "@%{name} te invita a junger te a iste servitor de Mastodon!"
       prefix_sign_up: Inscribe te sur Mastodon hodie!
+      suffix: Con un conto, tu potera sequer personas, messages de actualisation e excambios de messages con usatores de ulle servitor de Mastodon e plus!
     didnt_get_confirmation: Non recipeva tu un ligamine de confirmation?
     dont_have_your_security_key: Non ha tu le clave de securitate?
     forgot_password: Contrasigno oblidate?
     invalid_reset_password_token: Pete un nove.
+    link_to_otp: Insere un codice a duo factores o un codice de recuperation ab tu telephono
     link_to_webauth: Usa tu apparato clave de securitate
     log_in_with: Accede con
     login: Accede
     logout: Clauder le session
     migrate_account: Move a un conto differente
+    migrate_account_html: Si tu vole re-adressar iste conto a un altere, tu pote <a href="%{path}">configurar lo ci</a>.
     or_log_in_with: O accede con
     privacy_policy_agreement_html: Io ha legite e acceptar le <a href="<a href="%{privacy_policy_path}" target="_blank">politica de confidentialitate</a>
     progress:
@@ -1192,6 +1202,7 @@ ia:
     invalid_domain: non es un nomine de dominio valide
   edit_profile:
     basic_information: Information basic
+    hint_html: "<strong>Personalisa lo que le personas vide sur tu profilo public e presso tu messages.</strong> Il es plus probabile que altere personas te seque e interage con te quando tu ha un profilo compilate e un photo de profilo."
     other: Alteres
   errors:
     '400': Le requesta que tu inviava era non valide o mal formate.
@@ -1230,6 +1241,7 @@ ia:
     add_new: Adder nove
     errors:
       limit: Tu ha jam consiliate le maxime numero de hashtags
+    hint_html: "<strong>Consilia tu plus importante hashtags sur tu profilo.</strong> Un grande instrumento pro tener tracia de tu labores creative e projectos de longe-tempore, le hashtags consiliate es monstrate prominentemente sur tu profilo e permitte accesso rapide a tu proprie messages."
   filters:
     contexts:
       account: Profilos
@@ -1241,8 +1253,10 @@ ia:
       add_keyword: Adder parola clave
       keywords: Parolas clave
       statuses: Messages individual
+      statuses_hint_html: Iste filtro se applica a seliger messages singule sin reguardo si illes concorda le parolas clave infra. <a href="%{path}">Revide o remove le messages ab le filtro</a>.
       title: Modificar filtro
     errors:
+      deprecated_api_multiple_keywords: Iste parametros non pote esser cambiate ab iste application perque illos se applica a plus que un sol parola clave del filtro. Usa un application plus recente o le interfacie web.
       invalid_context: Nulle o non valide contexto supplite
     index:
       contexts: Filtros in %{contexts}
@@ -1272,6 +1286,12 @@ ia:
         title: Messages filtrate
   generic:
     all: Toto
+    all_items_on_page_selected_html:
+      one: "<strong>%{count}</strong> elemento sur iste pagina es seligite."
+      other: Tote le <strong>%{count}</strong> elementos sur iste pagina es seligite.
+    all_matching_items_selected_html:
+      one: "<strong>%{count}</strong> elemento concordante que tu cerca es seligite."
+      other: Tote le <strong>%{count}</strong> elementos concordante que tu cerca es seligite.
     cancel: Cancellar
     changes_saved_msg: Cambios salveguardate con successo!
     confirm: Confirmar
@@ -1299,13 +1319,24 @@ ia:
     imported: Importate
     mismatched_types_warning: Il appare que tu pote haber seligite le typo errate pro iste importation, controla duo vices.
     modes:
+      merge: Funder
+      merge_long: Mantene le registrationes existente e adde illos nove
+      overwrite: Superscriber
       overwrite_long: Reimplaciar registros actual con le noves
     overwrite_preambles:
       blocking_html: Tu es sur le puncto de <strong>reimplaciar tu lista de blocadas</strong> per usque a <strong>%{total_items} contos</strong> proveniente de <strong>%{filename}</strong>.
+      bookmarks_html: Tu va <strong>reimplaciar tu lista de blocadas</strong> per usque a <strong>%{total_items} contos</strong> proveniente de <strong>%{filename}</strong>.
       domain_blocking_html: Tu es sur le puncto de <strong>reimplaciar tu lista de blocadas de dominio</strong> per usque a <strong>%{total_items} dominios</strong> proveniente de <strong>%{filename}</strong>.
+      following_html: Tu va <strong>sequer</strong> usque <strong>%{total_items} contos</strong> de <strong>%{filename}</strong> e <strong>cessar de sequer ulle altere</strong>.
+      lists_html: Tu va <strong>reimplaciar tu lista</strong> con contentos de <strong>%{filename}</strong>. Usque <strong>%{total_items} contos</strong> sera addite a nove listas.
+      muting_html: Tu va <strong>reimplaciar tu lista de contos silentiate</strong> con usque <strong>%{total_items} contos</strong> ab <strong>%{filename}</strong>.
     preambles:
       blocking_html: Tu es sur le puncto de <strong>blocar</strong> usque a <strong>%{total_items} contos</strong> a partir de <strong>%{filename}</strong>.
+      bookmarks_html: Tu va adder usque <strong>%{total_items} messages</strong> de <strong>%{filename}</strong> a tu <strong>marcapaginas</strong>.
       domain_blocking_html: Tu es sur le puncto de <strong>blocar</strong> usque a <strong>%{total_items} dominios</strong> a partir de <strong>%{filename}</strong>.
+      following_html: Tu va <strong>blocar</strong> usque a <strong>%{total_items} dominios</strong> ab <strong>%{filename}</strong>.
+      lists_html: Tu va adder usque <strong>%{total_items} contos</strong> ab <strong>%{filename}</strong> a tu <strong>lista</strong>. Nove listas sera create si il non ha lista a adder.
+      muting_html: Tu va <strong>silentiar</strong> usque <strong>%{total_items} contos</strong> ab <strong>%{filename}</strong>.
     preface: Tu pote importar datos que tu ha exportate de un altere servitor, como un lista de personas que tu seque o bloca.
     recent_imports: Importationes recente
     states:
@@ -1348,16 +1379,30 @@ ia:
     expires_in_prompt: Nunquam
     generate: Generar ligamine de invitation
     invalid: Iste invitation non es valide
+    invited_by: 'Tu ha essite invitate per:'
     max_uses:
       one: un uso
       other: "%{count} usos"
+    max_uses_prompt: Nulle limite
+    prompt: Genera e comparti ligamines con alteres pro conceder accesso a iste servitor
     table:
       expires_at: Expira
+      uses: Usos
     title: Invitar personas
+  lists:
+    errors:
+      limit: Tu ha attingite le maxime numero de listas
   login_activities:
     authentication_methods:
+      otp: app pro authentication a duo factores
       password: contrasigno
+      sign_in_token: codice de securitate de e-mail
       webauthn: claves de securitate
+    description_html: Si tu vide activitate que tu non recognosce, considera de cambiar tu contrasigno e activar le authentication a duo factores.
+    empty: Nulle chronologia de authentication disponibile
+    failed_sign_in_html: Tentativa de authentication fallite con %{method} ab %{ip} (%{browser})
+    successful_sign_in_html: Apertura de session con successo con %{method} ab %{ip} (%{browser})
+    title: Chronologia de authentication
   mail_subscriptions:
     unsubscribe:
       action: Si, desubscriber
@@ -1373,32 +1418,110 @@ ia:
       resubscribe_html: Si tu ha cancellate le subscription in error, tu pote resubscriber te a partir del <a href="%{settings_path}">parametros de notification in e-mail</a>.
       success_html: Tu non recipera plus %{type} pro Mastodon sur %{domain} a tu adresse de e-mail %{email}.
       title: Desubcriber
+  media_attachments:
+    validations:
+      images_and_video: Impossibile annexar un video a un message que jam contine imagines
+      not_ready: Impossibile annexar un video a un message que jam contine imagines. Retenta post un momento!
+      too_many: Impossibile annexar plus que 4 files
   migrations:
+    acct: Movite a
+    cancel: Cancellar redirection
+    cancel_explanation: Cancellar le redirection reactivara tu conto actual, ma non reportara sequaces que ha essite movite in ille conto.
+    cancelled_msg: Redirection cancellate con successo.
     errors:
+      already_moved: is the same account you have already moved to
+      missing_also_known_as: non es un alias de iste conto
       move_to_self: non pote esser le conto actual
       not_found: non poterea esser trovate
+      on_cooldown: Tu es in pausa
+    followers_count: Sequaces a tempore de mover
+    incoming_migrations: Movente ab un conto differente
+    incoming_migrations_html: Pro mover ab un altere conto a isto, primo tu debe <a href="%{path}">crear un alias de conto</a>.
+    moved_msg: Tu conto ora es redirigite a %{acct} e tu sequaces es movite super.
+    not_redirecting: Tu conto actualmente non es redirigite a ulle altere conto.
+    on_cooldown: Tu recentemente ha migrate tu conto. Iste function de novo sera disponibile in %{count} dies.
+    past_migrations: Migrationes passate
+    proceed_with_move: Mover sequaces
+    redirected_msg: Tu conto es ora redirigite a %{acct}.
+    redirecting_to: Tu conto es redirigite a %{acct}.
+    set_redirect: Predefinir redirection
+    warning:
+      backreference_required: Le nove conto debe primo esser configurate pro referer se a isto
+      before: 'Ante de continuar, lege iste notas accuratemente:'
+      cooldown: Post le movimento il ha un periodo de pausa durante le qual tu non potera mover te ancora
+      disabled_account: Tu conto actual non sera plenmente usabile postea. Comocunque, tu habera accesso a exportation de datos e re-activation.
+      followers: Iste action movera tote le sequaces ab le conto actual al nove conto
+      only_redirect_html: In alternativa, tu pote <a href="%{path}">solo superponer un redirection sur tu profilo</a>.
+      other_data: Nulle altere datos sera movite automaticamente
+      redirect: Le profilo de tu conto actual sera actualisate con un aviso de redirection e sera excludite de recercas
   moderation:
     title: Moderation
   move_handler:
     carry_blocks_over_text: Iste usator ha cambiate de conto desde %{acct}, que tu habeva blocate.
+    carry_mutes_over_text: Iste usator moveva ab %{acct}, que tu habeva silentiate.
+    copy_account_note_text: 'Iste usator moveva ab %{acct}, ci era tu previe notas re ille:'
+  navigation:
+    toggle_menu: Mutar menu
   notification_mailer:
     admin:
+      report:
+        subject: "%{name} inviava un reporto"
       sign_up:
         subject: "%{name} se ha inscribite"
+    favourite:
+      body: 'Tu message era favorite per %{name}:'
+      subject: "%{name} favoriva tu message"
+      title: Nove preferito
     follow:
+      body: "%{name} ora te seque!"
+      subject: "%{name} ora te seque"
       title: Nove sequitor
     follow_request:
+      action: Gere requestas de sequer
+      body: "%{name} ha demandate de sequer te"
+      subject: 'Sequace pendente: %{name}'
       title: Nove requesta de sequimento
     mention:
       action: Responder
+      body: 'Tu era mentionate per %{name} in:'
+      subject: Tu ha essite mentionate per %{name}
       title: Nove mention
     poll:
       subject: Un inquesta de %{name} ha finite
+    reblog:
+      body: 'Tu message ha essite impulsate per %{name}:'
+      subject: "%{name} ha impulsate tu message"
+      title: Nove impulso
+    status:
+      subject: "%{name} justo ha publicate"
+    update:
+      subject: "%{name} ha modificate un message"
+  notifications:
+    administration_emails: Avisos de email per administrator
+    email_events: Eventos pro avisos de email
+    email_events_hint: 'Selige eventos pro que tu vole reciper avisos:'
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
   otp_authentication:
+    code_hint: Insere le codice generate per tu app de authentication pro confirmar
+    description_html: Si tu activa <strong>le authentication a duo factores</strong> per un app de authentication, le authentication requirera que tu es in possession de tu telephono, que generara testimonios pro facer te entrar.
     enable: Activar
+    instructions_html: "<strong>Scande iste codice QR in Google Authenticator o un simile app TOTP sur tu telephono</strong>. Desde ora in avante, ille app generara testimonios que tu debera inserer quando tu te authenticara."
+    manual_instructions: 'Si tu non pote scander le codice QR e besonia de inserer lo manualmente, ecce le texto-simple secrete:'
     setup: Configurar
+    wrong_code: Le codice inserite non era valide! Es tempore de servitor e tempore de apparato correcte?
   pagination:
+    newer: Plus recente
     next: Sequente
+    older: Plus vetere
     prev: Previe
     truncate: "&hellip;"
   polls:
@@ -1418,9 +1541,13 @@ ia:
     posting_defaults: Publicationes predefinite
     public_timelines: Chronologias public
   privacy:
+    hint_html: "<strong>Personalisa como tu vole que tu profilo e tu messages a es trovate.</strong> Un varietate de functiones in Mastodon pote adjutar te attinger un plus large auditorio si activate. Prende un momento pro revider iste parametros pro assecurar te que illos se adapta a tu caso de uso."
     privacy: Confidentialitate
+    privacy_hint_html: Controla quanto tu vole divulgar pro le beneficio de alteres. Le gente discoperi profilos e applicationes interessante percurrente le profilos sequite per altere personas e vidente a partir de qual applicationes illos publica lor messages, ma tu pote preferer de mantener tal information private.
     reach: Portata
+    reach_hint_html: Controla si tu vole esser discoperite e sequite per nove personas. Vole tu que tu messages appare sur le schermo Explorar? Vole tu que altere personas te vide in lor recommendationes de sequimento? Vole tu acceptar automaticamente tote le nove sequitores o prefere tu haber le controlo granular super cata un?
     search: Cercar
+    search_hint_html: Controla como tu vole esser trovate. Vole tu que le gente te trova per medio del contento de tu messages public? Vole tu que personas foras de Mastodon trova tu profilo quando illes cerca in le web? Nota ben que non es possibile garantir le exclusion total de tu information public del motores de recerca.
     title: Confidentialitate e portata
   privacy_policy:
     title: Politica de confidentialitate
@@ -1521,35 +1648,96 @@ ia:
     aliases: Aliases de conto
     appearance: Apparentia
     authorized_apps: Apps autorisate
+    back: Tornar a Mastodon
     delete: Deletion de conto
     development: Disveloppamento
     edit_profile: Modificar profilo
+    export: Exportation de datos
     featured_tags: Hashtags eminente
     import: Importar
+    import_and_export: Importar e exportar
     migrate: Migration de conto
     notifications: Notificationes de e-mail
     preferences: Preferentias
     profile: Profilo public
     relationships: Sequites e sequitores
+    severed_relationships: Relationes rupte
+    statuses_cleanup: Deletion de message automatic
     strikes: Admonitiones de moderation
+    two_factor_authentication: Authentication a duo factores
+    webauthn_authentication: Claves de securitate
   severed_relationships:
     download: Discargar (%{count})
     event_type:
       account_suspension: Suspension del conto (%{target_name})
       domain_block: Suspension del servitor (%{target_name})
       user_domain_block: Tu ha blocate %{target_name}
+    lost_followers: Sequitores perdite
+    lost_follows: Sequites perdite
     preamble: Tu pote perder sequites e sequitores quando tu bloca un dominio o quando tu moderatores decide suspender un servitor remote. Quando isto occurre, tu potera discargar listas de relationes rumpite, a inspectar e eventualmente importar in un altere servitor.
+    purged: Le information re iste servitor ha essite purgate per le administratores de tu servitor.
     type: Evento
   statuses:
+    attached:
+      audio:
+        one: "%{count} audio"
+        other: "%{count} audio"
+      description: 'Attachate: %{attached}'
+      image:
+        one: "%{count} imagine"
+        other: "%{count} imagines"
+      video:
+        one: "%{count} video"
+        other: "%{count} videos"
+    boosted_from_html: Impulsate desde %{acct_link}
+    content_warning: 'Advertimento de contento: %{warning}'
+    default_language: Mesme como lingua de interfacie
+    disallowed_hashtags:
+      one: 'contineva un hashtag non autorisate: %{tags}'
+      other: 'contineva le hashtags non autorisate: %{tags}'
+    edited_at_html: Modificate le %{date}
+    errors:
+      in_reply_not_found: Le message a que tu tenta responder non pare exister.
     open_in_web: Aperir in le web
+    over_character_limit: limite de characteres de %{max} excedite
+    pin_errors:
+      direct: Messages que es solo visibile a usatores mentionate non pote esser appunctate
+      limit: Tu ha jam appunctate le maxime numero de messages
+      ownership: Le message de alcuno altere non pote esser appunctate
+      reblog: Un impulso non pote esser affixate
     poll:
+      total_people:
+        one: "%{count} persona"
+        other: "%{count} personas"
+      total_votes:
+        one: "%{count} voto"
+        other: "%{count} votos"
       vote: Votar
     show_more: Monstrar plus
+    show_thread: Monstrar argumento
+    title: '%{name}: "%{quote}"'
     visibilities:
       direct: Directe
+      private: Solo-sequaces
       private_long: Solmente monstrar a sequitores
       public: Public
+      public_long: Omnes pote vider
+      unlisted: Non listate
+      unlisted_long: Omnes pote vider, ma non es listate in le chronologias public
   statuses_cleanup:
+    enabled: Deler automaticamente le messages ancian
+    enabled_hint: Dele automaticamente tu messages un vice que illos attinge un limine de etate specificate, salvo que illes concorda un del exceptiones infra
+    exceptions: Exceptiones
+    explanation: Pois que deler messages es un operation costose, isto es facite lentemente in le tempore quando le servitor non es alteremente occupate. Pro iste ration, tu messages pote esser delite un poco post que illos attinge le limine de etate.
+    ignore_favs: Ignorar favoritos
+    ignore_reblogs: Ignorar impulsos
+    interaction_exceptions: Exceptiones basate super interactiones
+    interaction_exceptions_explanation: Nota que il non ha garantia que le messages essera delite si illos va sub le limine de favorites o impulsos post haber lo superate un vice.
+    keep_direct: Mantener le messages directe
+    keep_direct_hint: Non dele alcuno de tu messages directe
+    keep_media: Mantener messages con annexos de medios
+    keep_media_hint: Non dele alcuno de tu messages que ha annexos de medios
+    keep_pinned: Mantener messages appunctate
     keep_pinned_hint: Non dele alcuno de tu messages appunctate
     keep_polls: Mantener sondages
     keep_polls_hint: Non dele ulle de tu sondages
@@ -1567,32 +1755,94 @@ ia:
       '63113904': 2 annos
       '7889238': 3 menses
     min_age_label: Limine de etate
+    min_favs: Mantener messages favorite al minus
+    min_favs_hint: Non deler alcuno de tu messages que ha recipite al minus iste numero de favoritos. Lassar blanc pro deler messages sin reguardo de lor numero de favoritos
+    min_reblogs: Mantener messages impulsate al minus
+    min_reblogs_hint: Non dele alcun de tu messages que ha essite impulsate al minus iste numero de vices. Lassar vacue pro deler messages independentemente de lor numero de impulsos
   stream_entries:
     sensitive_content: Contento sensibile
   strikes:
     errors:
       too_late: Es troppo tarde pro facer appello contra iste admonition
+  tags:
+    does_not_match_previous_name: non concorda le nomine previe
   themes:
     contrast: Mastodon (Alte contrasto)
     default: Mastodon (Obscur)
     mastodon-light: Mastodon (Clar)
     system: Automatic (usar thema del systema)
+  time:
+    formats:
+      default: "%d %b %Y, %H:%M"
+      month: "%b %Y"
+      time: "%H:%M"
+      with_time_zone: "%b %d, %Y, %H:%M %Z"
+  translation:
+    errors:
+      quota_exceeded: Le quota de utilisation del servitor pro le servicio de traduction ha essite excedite.
+      too_many_requests: Il ha habite troppe requestas al servicio de traduction recentemente.
   two_factor_authentication:
     add: Adder
     disable: Disactivar 2FA
+    disabled_success: Authentication a duo factores disactivate con successo
     edit: Modificar
+    enabled: Le authentication a duo factores es activate
+    enabled_success: Authentication a duo factores activate con successo
     generate_recovery_codes: Generar codices de recuperation
+    lost_recovery_codes: Le codices de recuperation te permitte de reganiar accesso a tu conto si tu perde tu telephono. Si tu ha perdite tu codices de recuperation, tu pote regenerar los ci. Tu vetere codices de recuperation sera invalidate.
+    methods: Methodos a duo factores
+    otp: App de authenticator
+    recovery_codes: Salveguardar codices de recuperation
+    recovery_codes_regenerated: Codices de recuperation regenerate con successo
+    recovery_instructions_html: Si tu perde le accesso a tu telephono, tu pote usar un del codices de recuperation hic infra pro reganiar le accesso a tu conto. <strong>Mantene le codices de recuperation secur.</strong> Per exemplo, tu pote imprimer los e guardar los con altere documentos importante.
+    webauthn: Claves de securitate
   user_mailer:
     appeal_approved:
       action: Parametros de conto
       explanation: Le appello contra le admonition contra tu conto del %{strike_date}, que tu ha submittite le %{appeal_date}, ha essite approbate. Tu conto ha de novo un bon reputation.
+      subject: Tu appello ab %{date} ha essite approbate
+      subtitle: Tu conto es ancora un vice in regula.
+      title: Appello approbate
     appeal_rejected:
       explanation: Le appello contra le admonition contra tu conto del %{strike_date}, que tu ha submittite le %{appeal_date}, ha essite rejectate.
+      subject: Tu appello ab %{date} ha essite rejectate
+      subtitle: Tu appello ha essite rejectate.
+      title: Appello rejectate
+    backup_ready:
+      explanation: Tu ha requestate un copia de securitate complete de tu conto de Mastodon.
+      extra: Isto es preste pro discargar!
+      subject: Tu archivo es preste pro discargar
+      title: Discargar archivo
+    failed_2fa:
+      details: 'Hic es le detalios del tentativa de initio de session:'
+      explanation: Alcuno ha tentate aperir session a tu conto ma ha fornite un secunde factor de authentication non valide.
+      further_actions_html: Si non se tractava de te, nos recommenda %{action} immediatemente perque illo pote esser compromittite.
+      subject: Fallimento del authentication de duo factores
+      title: Falleva le authentication de duo factores
+    suspicious_sign_in:
+      change_password: cambiar tu contrasigno
+      details: 'Hic es le detalios del initio de session:'
+      explanation: Nos ha detegite un initio de session a tu conto ab un nove adresse IP.
+      further_actions_html: Si non se tractava de te, nos recommenda %{action} immediatemente e activar le authentication bifactorial pro mantener tu conto secur.
+      subject: Alcuno ha accedite a tu conto desde un nove adresse IP
+      title: Un nove initio de session
     warning:
       appeal: Submitter un appello
+      appeal_description: Si tu crede que se tracta de un error, tu pote presentar un appello al personal de %{instance}.
       categories:
         spam: Spam
+        violation: Le contento viola le sequente regulas del communitate
+      explanation:
+        delete_statuses: Alcunes de tu messages ha essite judicate contrari a un o plus directivas communitari e ha dunque essite removite per le moderatores de %{instance}.
+        disable: Tu non pote plus usar tu conto, ma tu profilo e altere datos remane intacte. Tu pote requestar un copia de reserva de tu datos, cambiar le parametros del conto o deler le conto.
+        mark_statuses_as_sensitive: Alcunes de tu messages ha essite marcate como sensibile per le moderatores de %{instance}. Isto vole dicer que le gente debe toccar le objectos multimedial in le messages ante que un previsualisation appare. Tu pote marcar objectos multimedial como sensibile tu mesme quando tu publica messages in futuro.
+        sensitive: A partir de iste momento, tote le files multimedial que tu incarga essera marcate como sensibile e le gente debera cliccar sur un advertimento ante de poter vider los.
+        silence: Tu pote ancora usar tu conto ma solmente le personas qui ja te seque videra tu messages sur iste servitor, e tu pote esser excludite de varie functiones de discoperta. Nonobstante, altere personas pote ancora sequer te manualmente.
+        suspend: Tu non pote plus usar tu conto, e tu profilo e altere datos non es plus accessibile. Tu pote ancora aperir session pro requestar un copia de reserva de tu datos usque lor elimination in circa 30 dies. Nos retenera certe datos de base pro impedir que tu evade le suspension.
+      reason: 'Ration:'
+      statuses: 'Message citate:'
       subject:
+        delete_statuses: Tu messages sur %{acct} esseva removite
         disable: Tu conto %{acct} ha essite gelate
         mark_statuses_as_sensitive: Tu messages sur %{acct} ha essite marcate como sensibile
         none: Advertimento pro %{acct}
@@ -1612,20 +1862,71 @@ ia:
       apps_ios_action: Discargar sur le App Store
       apps_step: Discarga nostre applicationes official.
       apps_title: Applicationes de Mastodon
+      checklist_subtitle: 'Comencia tu aventura sur le web social:'
+      checklist_title: Prime passos
       edit_profile_action: Personalisar
       edit_profile_step: Impulsa tu interactiones con un profilo comprehensive.
       edit_profile_title: Personalisar tu profilo
       explanation: Ecce alcun consilios pro initiar
       feature_action: Apprender plus
+      feature_audience: Mastodon te presenta le possibilitate unic de gerer tu audientia sin intermediarios. Mastodon, installate sur tu proprie infrastructura, te permitte sequer, e esser sequite per, personas sur qualcunque altere servitor Mastodon in linea, e necuno lo controla salvo tu.
       feature_audience_title: Crea tu auditorio in fiducia
+      feature_control: Tu sape melio lo que tu vole vider sur tu fluxo de initio. Nulle algorithmos o annuncios dissipa tu tempore. Seque quicinque sur qualcunque servitor Mastodon desde un sol conto, recipe lor messages in ordine chronologic, e face te un angulo del internet ubi tu te senti a casa.
+      feature_control_title: Mantene le controlo de tu proprie chronologia
+      feature_creativity: Mastodon supporta messages con audio, video e imagines, descriptiones de accessibilitate, sondages, advertimentos de contento, avatares con animation, emojis personalisate, controlo de retalio de miniaturas, e plus, pro adjutar te a exprimer te in linea. Que tu publica tu arte, tu musica o tu podcast, Mastodon existe pro te.
+      feature_creativity_title: Creativitate sin parallel
+      feature_moderation: Mastodon remitte le controlo in tu manos. Cata servitor crea su proprie regulas e directivas, applicate localmente e non de maniera vertical como le medios social corporative, rendente lo flexibile in responder al necessitates de differente gruppos de personas. Adhere a un servitor con regulas que te place, o alberga le tue.
       feature_moderation_title: Moderation como deberea esser
       follow_action: Sequer
+      follow_step: Sequer personas interessante es le ration de esser de Mastodon.
+      follow_title: Personalisa tu fluxo de initio
+      follows_subtitle: Seque contos popular
+      follows_title: Qui sequer
+      follows_view_more: Vider plus de personas a sequer
+      hashtags_recent_count:
+        one: "%{people} persona in le passate duo dies"
+        other: "%{people} personas in le passate duo diea"
+      hashtags_subtitle: Explora le tendentias del passate 2 dies
+      hashtags_title: Hashtags in tendentia
+      hashtags_view_more: Vider plus de hashtags in tendentia
+      post_action: Scriber
+      post_step: Saluta le mundo con texto, photos, videos o sondages.
       post_title: Face tu prime message
       share_action: Compartir
+      share_step: Face saper a tu amicos como trovar te sur Mastodon.
       share_title: Compartir tu profilo de Mastodon
+      sign_in_action: Initiar session
       subject: Benvenite in Mastodon
+      title: Benvenite a bordo, %{name}!
+  users:
+    follow_limit_reached: Tu non pote sequer plus de %{limit} personas
+    go_to_sso_account_settings: Vader al parametros de conto de tu fornitor de identitate
+    invalid_otp_token: Codice de duo factores non valide
+    otp_lost_help_html: Si tu ha perdite le accesso a ambes, tu pote contactar %{email}
+    rate_limited: Troppo de tentativas de authentication. Per favor reessaya plus tarde.
+    seamless_external_login: Tu ha aperite session per medio de un servicio externe. Le parametros de contrasigno e de e-mail es dunque indisponibile.
+    signed_in_as: 'Session aperite como:'
   verification:
+    extra_instructions_html: <strong>Consilio:</strong> Le ligamine sur tu sito web pote esser invisibile. Le parte importante es <code>rel="me"</code> que impedi le usurpation de identitate sur sitos web con contento generate per usatores. Tu pote mesmo usar un etiquetta <code>link</code> in le capite del pagina in vice de <code>a</code>, ma le codice HTML debe esser accessibile sin executar JavaScript.
+    here_is_how: Ecce como
+    hint_html: "<strong>Omnes pote verificar lor identitate sur Mastodon.</strong> Isto es basate sur standards web aperte e es gratuite, ora e pro sempre. Tote lo que es necessari es un sito web personal que le gente recognosce como le tue. Quando tu liga a iste sito web desde tu profilo, le systema verificara que le sito web liga retro a tu profilo e monstrara un indicator visual de iste facto."
+    instructions_html: Copia e colla le codice hic infra in le HTML de tu sito web. Alora adde le adresse de tu sito web in un del campos supplementari sur tu profilo desde le scheda “Modificar profilo” e salva le cambiamentos.
+    verification: Verification
     verified_links: Tu ligamines verificate
   webauthn_credentials:
     add: Adder un nove clave de securitate
+    create:
+      error: Il habeva un problema in adder tu clave de securitate. Tenta novemente.
+      success: Tu clave de securitate ha essite addite con successo.
     delete: Deler
+    delete_confirmation: Es tu secur que tu vole deler iste clave de securitate?
+    description_html: Si tu activa le <strong>authentication per clave de securitate</strong>, le apertura de session requirera que tu usa un de tu claves de securitate.
+    destroy:
+      error: Il habeva un problema in deler tu clave de securitate. Tenta novemente.
+      success: Tu clave de securitate ha essite delite con successo.
+    invalid_credential: Clave de securitate non valide
+    nickname_hint: Insere le pseudonymo de tu nove clave de securitate
+    not_enabled: Tu ancora non ha activate WebAuthn
+    not_supported: Iste navigator non supporta claves de securitate
+    otp_required: Pro usar le claves de securitate activa prime le authentication de duo factores.
+    registered_on: Registrate le %{date}
diff --git a/config/locales/it.yml b/config/locales/it.yml
index bda681ac0..5b75e7af7 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -285,6 +285,7 @@ it:
         update_custom_emoji_html: "%{name} ha aggiornato emoji %{target}"
         update_domain_block_html: "%{name} ha aggiornato il blocco dominio per %{target}"
         update_ip_block_html: "%{name} ha cambiato la regola per l'IP %{target}"
+        update_report_html: "%{name} ha aggiornato la segnalazione %{target}"
         update_status_html: "%{name} ha aggiornato lo status di %{target}"
         update_user_role_html: "%{name} ha modificato il ruolo %{target}"
       deleted_account: account eliminato
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index f3f3e3a8f..b104e31fc 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -282,6 +282,7 @@ ko:
         update_custom_emoji_html: "%{name} 님이 에모지 %{target}를 업데이트 했습니다"
         update_domain_block_html: "%{name} 님이 %{target}에 대한 도메인 차단을 갱신했습니다"
         update_ip_block_html: "%{name} 님이 IP 규칙 %{target}을 수정했습니다"
+        update_report_html: "%{name} 님이 신고 %{target}를 업데이트 했습니다"
         update_status_html: "%{name} 님이 %{target}의 게시물을 업데이트했습니다"
         update_user_role_html: "%{name} 님이 %{target} 역할을 수정했습니다"
       deleted_account: 계정을 삭제했습니다
diff --git a/config/locales/lad.yml b/config/locales/lad.yml
index e9f18d4be..9c165472c 100644
--- a/config/locales/lad.yml
+++ b/config/locales/lad.yml
@@ -285,6 +285,7 @@ lad:
         update_custom_emoji_html: "%{name} aktualizo el emoji %{target}"
         update_domain_block_html: "%{name} aktualizo el bloko de domeno para %{target}"
         update_ip_block_html: "\"%{name} troko la regla de IP %{target}"
+        update_report_html: "%{name} aktualizo el raporto %{target}"
         update_status_html: "%{name} aktualizo la publikasyon de %{target}"
         update_user_role_html: "%{name} troko el rolo %{target}"
       deleted_account: kuento supremido
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 74dea29b0..3452f8099 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -285,6 +285,7 @@ nl:
         update_custom_emoji_html: Emoji %{target} is door %{name} bijgewerkt
         update_domain_block_html: "%{name} heeft de domeinblokkade bijgewerkt voor %{target}"
         update_ip_block_html: "%{name} wijzigde de IP-regel voor %{target}"
+        update_report_html: Rapportage %{target} is door %{name} bijgewerkt
         update_status_html: "%{name} heeft de berichten van %{target} bijgewerkt"
         update_user_role_html: "%{name} wijzigde de rol %{target}"
       deleted_account: verwijderd account
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 7c037d7d0..1c3fda8d0 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -291,6 +291,7 @@ pl:
         update_custom_emoji_html: Zaktualizowane emoji %{target} przez %{name}
         update_domain_block_html: Zaktualizowano blokadę domeny dla %{target} przez %{name}
         update_ip_block_html: "%{name} stworzył(a) regułę dla IP %{target}"
+        update_report_html: "%{target} zaktualizowany przez %{name}"
         update_status_html: "%{name} zaktualizował(a) wpis użytkownika %{target}"
         update_user_role_html: "%{name} zmienił rolę %{target}"
       deleted_account: usunięte konto
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 0c2e6cfd6..b4669e24d 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -285,6 +285,7 @@ pt-PT:
         update_custom_emoji_html: "%{name} atualizou o emoji %{target}"
         update_domain_block_html: "%{name} atualizou o bloqueio de domínio para %{target}"
         update_ip_block_html: "%{name} alterou regra para IP %{target}"
+        update_report_html: "%{name} atualizou a denúncia %{target}"
         update_status_html: "%{name} atualizou o estado de %{target}"
         update_user_role_html: "%{name} alterou a função %{target}"
       deleted_account: conta apagada
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index 2f7010bac..9ac36447d 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -78,14 +78,14 @@ fi:
       form_admin_settings:
         activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä
         app_icon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen mobiililaitteiden sovelluskuvakkeen omalla kuvakkeella.
-        backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun tämä on asetettu positiiviseksi arvoksi, nämä arkistot poistetaan automaattisesti asetetun päivien määrän jälkeen.
+        backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun arvo on positiivinen, nämä arkistot poistuvat automaattisesti, kun määritetty määrä päiviä on kulunut.
         bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun.
         closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu
-        content_cache_retention_period: Kaikki muiden palvelimien viestit (mukaan lukien tehostukset ja vastaukset) poistetaan määritetyn päivien lukumäärän jälkeen, ottamatta huomioon paikallisen käyttäjän vuorovaikutusta kyseisten viestien kanssa. Sisältää viestit, jossa paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikeiksi. Myös yksityiset maininnat eri käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämän asetuksen käyttö on tarkoitettu erityisiin tapauksiin ja se rikkoo monia käyttäjien odotuksia, kun se toteutetaan yleistarkoituksiin.
+        content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, ottamatta huomioon paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityiset maininnat 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ä käytetään yleistarkoituksiin.
         custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa.
         favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin suosikkikuvakkeen omalla kuvakkeella.
         mascot: Ohittaa kuvituksen edistyneessä selainkäyttöliittymässä.
-        media_cache_retention_period: Mediatiedostot käyttäjien tekemistä viesteistä ovat välimuistissa palvelimellasi. Kun arvo on positiivinen, media poistetaan määritetyn ajan jälkeen. Jos mediaa pyydetään sen poistamisen jälkeen, ne ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien katselun 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ä aikaa.
+        media_cache_retention_period: Käyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun 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.
         peers_api_enabled: Luettelo verkkotunnuksista, jotka tämä palvelin on kohdannut fediversumissa. Se ei kerro, oletko liitossa tietyn palvelimen kanssa, vaan että palvelimesi on ylipäätään tietoinen siitä. Tätä tietoa käytetään palveluissa, jotka keräävät tilastoja federoinnista yleisellä tasolla.
         profile_directory: Profiilihakemisto lueteloi kaikki käyttäjät, jotka ovat ilmoittaneet olevansa löydettävissä.
         require_invite_text: Kun rekisteröityminen vaatii manuaalisen hyväksynnän, tee ”Miksi haluat liittyä?” -tekstikentästä pakollinen vapaaehtoisen sijaan
diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml
index a4abb737c..96b36307a 100644
--- a/config/locales/simple_form.sl.yml
+++ b/config/locales/simple_form.sl.yml
@@ -77,10 +77,15 @@ sl:
           warn: Skrij filtrirano vsebino za opozorilom, ki pomenja naslov filtra
       form_admin_settings:
         activity_api_enabled: Številke krajevno objavljenih objav, dejavnih uporabnikov in novih registracij na tedenskih seznamih
+        app_icon: WEBP, PNG, GIF ali JPG. Zamenja privzeto ikono programa na mobilnih napravah z ikono po meri.
+        backups_retention_period: Uporabniki lahko ustvarijo arhive svojih objav za kasnejši prenos k sebi. Ko je nastavljeno na pozitivno vrednost, bodo ti arhivi po nastavljenem številu dni samodejno izbrisani.
         bootstrap_timeline_accounts: Ti računi bodo pripeti na vrh priporočenih sledenj za nove uporabnike.
         closed_registrations_message: Prikazano, ko so registracije zaprte
+        content_cache_retention_period: Vse objave z drugih strežnikov (vključno z izpostavitvami in odgovori) bodo izbrisani po nastavljenem številu dni, ne glede na krajevne interakcije s temi objavami. To vključuje objave, ki jih je krajevni uporabnik dodal med zaznamke ali priljubljene. Zasebne omembe med uporabniki na različnih strežnikih bodo prav tako izgubljene in jih ne bo moč obnoviti. Uporaba te nastavitve je namenjena strežnikom s posebnim namenom in nasprotuje mnogim pričakovanjem uporabnikov na strežnikih za splošni namen.
         custom_css: Spletni različici Mastodona lahko uveljavite sloge po meri.
+        favicon: WEBP, PNG, GIF ali JPG. Zamenja privzeto ikono spletne strani Mastodon z ikono po meri.
         mascot: Preglasi ilustracijo v naprednem spletnem vmesniku.
+        media_cache_retention_period: Predstavnostne datoteke iz objav uporabnikov na ostalih strežnikih se začasno hranijo na tem strežniku. Ko je nastavljeno na pozitivno vrednost, bodo predstavnostne datoteke izbrisane po nastavljenem številu dni. Če bo predstavnostna datoteka zahtevana po izbrisu, bo ponovno prenešena, če bo vir še vedno na voljo. Zaradi omejitev pogostosti prejemanja predogledov povezav z drugih strani je priporočljivo to vrednost nastaviti na vsaj 14 dni. V nasprotnem predogledi povezav pred tem časom ne bodo osveženi na zahtevo.
         peers_api_enabled: Seznam imen domen, na katere je ta strežnik naletel v fediverzumu. Sem niso vključeni podatki o tem, ali ste v federaciji z danim strežnikom, zgolj to, ali vaš strežnik ve zanj. To uporabljajo storitve, ki zbirajo statistične podatke o federaciji v splošnem smislu.
         profile_directory: Imenik profilov izpiše vse uporabnike, ki so dovolili, da so v njem navedeni.
         require_invite_text: Če registracije zahtevajo ročno potrditev, nastavite vnos besedila pod »Zakaj se želite pridružiti?« za obveznega.
@@ -240,6 +245,7 @@ sl:
         backups_retention_period: Obdobje hrambe arhivov uporabnikov
         bootstrap_timeline_accounts: Vedno priporočaj te račune novim uporabnikom
         closed_registrations_message: Sporočilo po meri, ko registracije niso na voljo
+        content_cache_retention_period: Obdobje hranjenja vsebine z ostalih strežnikov
         custom_css: CSS po meri
         mascot: Maskota po meri (opuščeno)
         media_cache_retention_period: Obdobje hrambe predpomnilnika predstavnosti
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 6c26511ad..329ce5a29 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -291,6 +291,7 @@ sl:
         update_custom_emoji_html: "%{name} je posodobil/a emotikone %{target}"
         update_domain_block_html: "%{name} je posodobil/a domenski blok za %{target}"
         update_ip_block_html: "%{name} je spremenil/a pravilo za IP %{target}"
+        update_report_html: "%{name} je posodobil poročilo %{target}"
         update_status_html: "%{name} je posodobil/a objavo uporabnika %{target}"
         update_user_role_html: "%{name} je spremenil/a vlogo %{target}"
       deleted_account: izbrisan račun
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index b4976f898..808a10e72 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -288,6 +288,7 @@ sr-Latn:
         update_custom_emoji_html: "%{name} je ažurirao/-la emodži %{target}"
         update_domain_block_html: "%{name} je ažurirao/-la blok domena %{target}"
         update_ip_block_html: "%{name} je promenio/-la IP uslov za %{target}"
+        update_report_html: "%{name} je ažurirao izveštaj %{target}"
         update_status_html: "%{name} je ažurirao/-la objavu korisnika %{target}"
         update_user_role_html: "%{name} je promenio/-la poziciju %{target}"
       deleted_account: obrisan nalog
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index aec6d399d..f03c6e878 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -288,6 +288,7 @@ sr:
         update_custom_emoji_html: "%{name} је ажурирао/-ла емоџи %{target}"
         update_domain_block_html: "%{name} је ажурирао/-ла блок домена %{target}"
         update_ip_block_html: "%{name} је променио/-ла IP услов за %{target}"
+        update_report_html: "%{name} је ажурирао извештај %{target}"
         update_status_html: "%{name} је ажурирао/-ла објаву корисника %{target}"
         update_user_role_html: "%{name} је променио/-ла позицију %{target}"
       deleted_account: обрисан налог
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 11e1fce3f..9f0de4a72 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -285,6 +285,7 @@ sv:
         update_custom_emoji_html: "%{name} uppdaterade emoji %{target}"
         update_domain_block_html: "%{name} uppdaterade domän-block för %{target}"
         update_ip_block_html: "%{name} ändrade regel för IP %{target}"
+        update_report_html: "%{name} uppdaterade rapporten %{target}"
         update_status_html: "%{name} uppdaterade inlägget av %{target}"
         update_user_role_html: "%{name} ändrade rollen %{target}"
       deleted_account: raderat konto
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 56b7bea69..5711f68ff 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -282,6 +282,7 @@ th:
         update_custom_emoji_html: "%{name} ได้อัปเดตอีโมจิ %{target}"
         update_domain_block_html: "%{name} ได้อัปเดตการปิดกั้นโดเมนสำหรับ %{target}"
         update_ip_block_html: "%{name} ได้เปลี่ยนกฎสำหรับ IP %{target}"
+        update_report_html: "%{name} ได้อัปเดตรายงาน %{target}"
         update_status_html: "%{name} ได้อัปเดตโพสต์โดย %{target}"
         update_user_role_html: "%{name} ได้เปลี่ยนบทบาท %{target}"
       deleted_account: บัญชีที่ลบแล้ว
@@ -1838,6 +1839,7 @@ th:
       feature_action: เรียนรู้เพิ่มเติม
       feature_audience: Mastodon มีความพิเศษที่ให้คุณจัดการผู้รับสารของคุณได้โดยไม่มีตัวกลาง นอกจากนี้ การติดตั้ง Mastodon บนโครงสร้างพื้นฐานของคุณจะทำให้คุณสามารถติดตาม (และติดตามโดย) เซิร์ฟเวอร์ Mastodon แห่งไหนก็ได้ที่ทำงานอยู่ โดยไม่มีใครสามารถควบคุมได้นอกจากคุณ
       feature_audience_title: สร้างผู้ชมของคุณด้วยความมั่นใจ
+      feature_control: คุณทราบดีที่สุดถึงสิ่งที่คุณต้องการเห็นในฟีดหน้าแรกของคุณ ไม่มีอัลกอริทึมหรือโฆษณาให้เสียเวลาของคุณ ติดตามใครก็ตามทั่วทั้งเซิร์ฟเวอร์ Mastodon ใด ๆ จากบัญชีเดียวและรับโพสต์ของเขาตามลำดับเวลา และทำให้มุมอินเทอร์เน็ตของคุณเป็นเหมือนคุณมากขึ้นอีกนิด
       feature_control_title: การควบคุมเส้นเวลาของคุณเอง
       feature_creativity_title: ความคิดสร้างสรรค์ที่ไม่มีใครเทียบได้
       feature_moderation_title: การกลั่นกรองในแบบที่ควรจะเป็น
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 7b9cf50aa..469f2c5ad 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -285,6 +285,7 @@ tr:
         update_custom_emoji_html: "%{name}, %{target} emojisini güncelledi"
         update_domain_block_html: "%{name}, %{target} alan adının engelini güncelledi"
         update_ip_block_html: "%{name}, %{target} IP adresi için kuralı güncelledi"
+        update_report_html: "%{name}, %{target} raporunu güncelledi"
         update_status_html: "%{name}, %{target} kullanıcısının gönderisini güncelledi"
         update_user_role_html: "%{name}, %{target} rolünü değiştirdi"
       deleted_account: hesap silindi
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 5d9e881ea..05f3157ec 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -282,6 +282,7 @@ vi:
         update_custom_emoji_html: "%{name} đã cập nhật emoji %{target}"
         update_domain_block_html: "%{name} cập nhật chặn máy chủ %{target}"
         update_ip_block_html: "%{name} cập nhật chặn IP %{target}"
+        update_report_html: "%{name} cập nhật báo cáo %{target}"
         update_status_html: "%{name} cập nhật tút của %{target}"
         update_user_role_html: "%{name} đã thay đổi vai trò %{target}"
       deleted_account: tài khoản đã xóa
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 3140ebdd3..12b619793 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -282,6 +282,7 @@ zh-CN:
         update_custom_emoji_html: "%{name} 更新了自定义表情 %{target}"
         update_domain_block_html: "%{name} 更新了对 %{target} 的域名屏蔽"
         update_ip_block_html: "%{name} 修改了对 IP %{target} 的规则"
+        update_report_html: "%{name} 更新了举报 %{target}"
         update_status_html: "%{name} 刷新了 %{target} 的嘟文"
         update_user_role_html: "%{name} 更改了 %{target} 角色"
       deleted_account: 账号已注销
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index cdedd759e..ac633a201 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -282,6 +282,7 @@ zh-TW:
         update_custom_emoji_html: "%{name} 已更新自訂 emoji 表情符號 %{target}"
         update_domain_block_html: "%{name} 已更新 %{target} 之網域封鎖"
         update_ip_block_html: "%{name} 已變更 IP %{target} 之規則"
+        update_report_html: "%{name} 已更新 %{target} 的檢舉"
         update_status_html: "%{name} 已更新 %{target} 的嘟文"
         update_user_role_html: "%{name} 已變更 %{target} 角色"
       deleted_account: 已刪除帳號

From 0ce22859a5f989593b04cc7701521655a2f85480 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 20 May 2024 09:56:28 +0200
Subject: [PATCH 157/215] fix(deps): update dependency @rails/ujs to v7.1.3
 (#30356)

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 773f19c50..f38076d4c 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,7 @@
     "@formatjs/intl-pluralrules": "^5.2.2",
     "@gamestdio/websocket": "^0.3.2",
     "@github/webauthn-json": "^2.1.1",
-    "@rails/ujs": "7.1.3-3",
+    "@rails/ujs": "7.1.3",
     "@reduxjs/toolkit": "^2.0.1",
     "@svgr/webpack": "^5.5.0",
     "arrow-key-navigation": "^1.2.0",
diff --git a/yarn.lock b/yarn.lock
index 6b1dd8d22..698824cab 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2758,7 +2758,7 @@ __metadata:
     "@formatjs/intl-pluralrules": "npm:^5.2.2"
     "@gamestdio/websocket": "npm:^0.3.2"
     "@github/webauthn-json": "npm:^2.1.1"
-    "@rails/ujs": "npm:7.1.3-3"
+    "@rails/ujs": "npm:7.1.3"
     "@reduxjs/toolkit": "npm:^2.0.1"
     "@svgr/webpack": "npm:^5.5.0"
     "@testing-library/jest-dom": "npm:^6.0.0"
@@ -3042,10 +3042,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@rails/ujs@npm:7.1.3-3":
-  version: 7.1.3-3
-  resolution: "@rails/ujs@npm:7.1.3-3"
-  checksum: 10c0/9eee95372b72d8f704b67f14a3bf9f2681ab5b11c7b79919bfde3341f2970771876af5b40de5b3e4fca6a97c76a41046eff71d96490617c1fc80ef3ad8bbac47
+"@rails/ujs@npm:7.1.3":
+  version: 7.1.3
+  resolution: "@rails/ujs@npm:7.1.3"
+  checksum: 10c0/68112d9add9dbc59b40c2ec1bc095a67445c57d20d0ab7d817ce3de0cd90374e2690af8ad54ce6ecc2d1c748b34c0c44d0fbd2f515ce2c443d7c5d23d00b9ce5
   languageName: node
   linkType: hard
 

From 9658d3e5804ab1e2180a70b6b19386592731fd78 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Mon, 20 May 2024 10:01:04 +0200
Subject: [PATCH 158/215] Use the job class as span name for Sidekiq root spans
 (#30353)

---
 config/initializers/opentelemetry.rb | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/config/initializers/opentelemetry.rb b/config/initializers/opentelemetry.rb
index 9af0ab89c..cf9f0b96f 100644
--- a/config/initializers/opentelemetry.rb
+++ b/config/initializers/opentelemetry.rb
@@ -51,6 +51,9 @@ if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) }
         use_rack_events: false, # instead of events, use middleware; allows for untraced_endpoints to ignore child spans
         untraced_endpoints: ['/health'],
       },
+      'OpenTelemetry::Instrumentation::Sidekiq' => {
+        span_naming: :job_class, # Use the job class as the span name, otherwise this is the queue name and not very helpful
+      },
     })
 
     prefix = ENV.fetch('OTEL_SERVICE_NAME_PREFIX', 'mastodon')

From 70608f824e4bdd197d179c70efc82effcefc0c6b Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 20 May 2024 04:03:39 -0400
Subject: [PATCH 159/215] Add coverage for
 `AdminMailer#auto_close_registrations` (#30349)

---
 spec/mailers/admin_mailer_spec.rb             | 18 ++++++++++++++++++
 spec/mailers/previews/admin_mailer_preview.rb |  5 +++++
 2 files changed, 23 insertions(+)

diff --git a/spec/mailers/admin_mailer_spec.rb b/spec/mailers/admin_mailer_spec.rb
index 88ad7aa02..cd1ab3311 100644
--- a/spec/mailers/admin_mailer_spec.rb
+++ b/spec/mailers/admin_mailer_spec.rb
@@ -125,4 +125,22 @@ RSpec.describe AdminMailer do
         .and(have_header('X-Priority', '1'))
     end
   end
+
+  describe '.auto_close_registrations' do
+    let(:recipient) { Fabricate(:account, username: 'Bob') }
+    let(:mail) { described_class.with(recipient: recipient).auto_close_registrations }
+
+    before do
+      recipient.user.update(locale: :en)
+    end
+
+    it 'renders the email' do
+      expect(mail)
+        .to be_present
+        .and(deliver_to(recipient.user_email))
+        .and(deliver_from('notifications@localhost'))
+        .and(have_subject('Registrations for cb6e6126.ngrok.io have been automatically switched to requiring approval'))
+        .and(have_body_text('have been automatically switched'))
+    end
+  end
 end
diff --git a/spec/mailers/previews/admin_mailer_preview.rb b/spec/mailers/previews/admin_mailer_preview.rb
index 942d40d56..b8fb387ac 100644
--- a/spec/mailers/previews/admin_mailer_preview.rb
+++ b/spec/mailers/previews/admin_mailer_preview.rb
@@ -32,4 +32,9 @@ class AdminMailerPreview < ActionMailer::Preview
   def new_critical_software_updates
     AdminMailer.with(recipient: Account.first).new_critical_software_updates
   end
+
+  # Preview this email at http://localhost:3000/rails/mailers/admin_mailer/auto_close_registrations
+  def auto_close_registrations
+    AdminMailer.with(recipient: Account.first).auto_close_registrations
+  end
 end

From def6b686ff3ea8e4e77075a812bd463a3bf325c3 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 20 May 2024 05:37:36 -0400
Subject: [PATCH 160/215] Fix `Rails/WhereRange` cop (#30343)

---
 app/lib/vacuum/imports_vacuum.rb                       |  4 ++--
 app/lib/vacuum/statuses_vacuum.rb                      |  2 +-
 app/models/concerns/expireable.rb                      |  2 +-
 app/models/invite.rb                                   |  2 +-
 app/policies/backup_policy.rb                          |  2 +-
 app/workers/scheduler/ip_cleanup_scheduler.rb          | 10 +++++-----
 app/workers/scheduler/scheduled_statuses_scheduler.rb  |  2 +-
 app/workers/scheduler/user_cleanup_scheduler.rb        |  2 +-
 lib/mastodon/cli/preview_cards.rb                      |  2 +-
 .../accounts_statuses_cleanup_scheduler_spec.rb        |  2 +-
 10 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/app/lib/vacuum/imports_vacuum.rb b/app/lib/vacuum/imports_vacuum.rb
index 8c8bb783a..700bd8184 100644
--- a/app/lib/vacuum/imports_vacuum.rb
+++ b/app/lib/vacuum/imports_vacuum.rb
@@ -9,10 +9,10 @@ class Vacuum::ImportsVacuum
   private
 
   def clean_unconfirmed_imports!
-    BulkImport.state_unconfirmed.where('created_at <= ?', 10.minutes.ago).reorder(nil).in_batches.delete_all
+    BulkImport.state_unconfirmed.where(created_at: ..10.minutes.ago).reorder(nil).in_batches.delete_all
   end
 
   def clean_old_imports!
-    BulkImport.where('created_at <= ?', 1.week.ago).reorder(nil).in_batches.delete_all
+    BulkImport.where(created_at: ..1.week.ago).reorder(nil).in_batches.delete_all
   end
 end
diff --git a/app/lib/vacuum/statuses_vacuum.rb b/app/lib/vacuum/statuses_vacuum.rb
index ad1de0738..92d3ccf4f 100644
--- a/app/lib/vacuum/statuses_vacuum.rb
+++ b/app/lib/vacuum/statuses_vacuum.rb
@@ -34,7 +34,7 @@ class Vacuum::StatusesVacuum
   def statuses_scope
     Status.unscoped.kept
           .joins(:account).merge(Account.remote)
-          .where('statuses.id < ?', retention_period_as_id)
+          .where(statuses: { id: ...retention_period_as_id })
   end
 
   def retention_period_as_id
diff --git a/app/models/concerns/expireable.rb b/app/models/concerns/expireable.rb
index c64fc7d80..26740e821 100644
--- a/app/models/concerns/expireable.rb
+++ b/app/models/concerns/expireable.rb
@@ -4,7 +4,7 @@ module Expireable
   extend ActiveSupport::Concern
 
   included do
-    scope :expired, -> { where.not(expires_at: nil).where('expires_at < ?', Time.now.utc) }
+    scope :expired, -> { where.not(expires_at: nil).where(expires_at: ...Time.now.utc) }
 
     def expires_in
       return @expires_in if defined?(@expires_in)
diff --git a/app/models/invite.rb b/app/models/invite.rb
index 2fe9f22fb..ea095a3ac 100644
--- a/app/models/invite.rb
+++ b/app/models/invite.rb
@@ -24,7 +24,7 @@ class Invite < ApplicationRecord
   belongs_to :user, inverse_of: :invites
   has_many :users, inverse_of: :invite, dependent: nil
 
-  scope :available, -> { where(expires_at: nil).or(where('expires_at >= ?', Time.now.utc)) }
+  scope :available, -> { where(expires_at: nil).or(where(expires_at: Time.now.utc..)) }
 
   validates :comment, length: { maximum: COMMENT_SIZE_LIMIT }
 
diff --git a/app/policies/backup_policy.rb b/app/policies/backup_policy.rb
index 86b8efbe9..7a4c5b434 100644
--- a/app/policies/backup_policy.rb
+++ b/app/policies/backup_policy.rb
@@ -4,6 +4,6 @@ class BackupPolicy < ApplicationPolicy
   MIN_AGE = 6.days
 
   def create?
-    user_signed_in? && current_user.backups.where('created_at >= ?', MIN_AGE.ago).count.zero?
+    user_signed_in? && current_user.backups.where(created_at: MIN_AGE.ago..).count.zero?
   end
 end
diff --git a/app/workers/scheduler/ip_cleanup_scheduler.rb b/app/workers/scheduler/ip_cleanup_scheduler.rb
index f78c0584d..04fb0aaa3 100644
--- a/app/workers/scheduler/ip_cleanup_scheduler.rb
+++ b/app/workers/scheduler/ip_cleanup_scheduler.rb
@@ -16,11 +16,11 @@ class Scheduler::IpCleanupScheduler
   private
 
   def clean_ip_columns!
-    SessionActivation.where('updated_at < ?', SESSION_RETENTION_PERIOD.ago).in_batches.destroy_all
-    SessionActivation.where('updated_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(ip: nil)
-    User.where('current_sign_in_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(sign_up_ip: nil)
-    LoginActivity.where('created_at < ?', IP_RETENTION_PERIOD.ago).in_batches.destroy_all
-    Doorkeeper::AccessToken.where('last_used_at < ?', IP_RETENTION_PERIOD.ago).in_batches.update_all(last_used_ip: nil)
+    SessionActivation.where(updated_at: ...SESSION_RETENTION_PERIOD.ago).in_batches.destroy_all
+    SessionActivation.where(updated_at: ...IP_RETENTION_PERIOD.ago).in_batches.update_all(ip: nil)
+    User.where(current_sign_in_at: ...IP_RETENTION_PERIOD.ago).in_batches.update_all(sign_up_ip: nil)
+    LoginActivity.where(created_at: ...IP_RETENTION_PERIOD.ago).in_batches.destroy_all
+    Doorkeeper::AccessToken.where(last_used_at: ...IP_RETENTION_PERIOD.ago).in_batches.update_all(last_used_ip: nil)
   end
 
   def clean_expired_ip_blocks!
diff --git a/app/workers/scheduler/scheduled_statuses_scheduler.rb b/app/workers/scheduler/scheduled_statuses_scheduler.rb
index fe60d5524..4e251780d 100644
--- a/app/workers/scheduler/scheduled_statuses_scheduler.rb
+++ b/app/workers/scheduler/scheduled_statuses_scheduler.rb
@@ -20,7 +20,7 @@ class Scheduler::ScheduledStatusesScheduler
   end
 
   def due_statuses
-    ScheduledStatus.where('scheduled_at <= ?', Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET)
+    ScheduledStatus.where(scheduled_at: ..Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET)
   end
 
   def publish_scheduled_announcements!
diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb
index 63ea876e5..74abc2370 100644
--- a/app/workers/scheduler/user_cleanup_scheduler.rb
+++ b/app/workers/scheduler/user_cleanup_scheduler.rb
@@ -25,7 +25,7 @@ class Scheduler::UserCleanupScheduler
   end
 
   def clean_discarded_statuses!
-    Status.unscoped.discarded.where('deleted_at <= ?', DISCARDED_STATUSES_MAX_AGE_DAYS.days.ago).find_in_batches do |statuses|
+    Status.unscoped.discarded.where(deleted_at: ..DISCARDED_STATUSES_MAX_AGE_DAYS.days.ago).find_in_batches do |statuses|
       RemovalWorker.push_bulk(statuses) do |status|
         [status.id, { 'immediate' => true, 'skip_streaming' => true }]
       end
diff --git a/lib/mastodon/cli/preview_cards.rb b/lib/mastodon/cli/preview_cards.rb
index 9b20a0cbb..c0e207ad5 100644
--- a/lib/mastodon/cli/preview_cards.rb
+++ b/lib/mastodon/cli/preview_cards.rb
@@ -29,7 +29,7 @@ module Mastodon::CLI
       link     = options[:link] ? 'link-type ' : ''
       scope    = PreviewCard.cached
       scope    = scope.where(type: :link) if options[:link]
-      scope    = scope.where('updated_at < ?', time_ago)
+      scope    = scope.where(updated_at: ...time_ago)
 
       processed, aggregate = parallelize_with_progress(scope) do |preview_card|
         next if preview_card.image.blank?
diff --git a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb
index 4d9185093..08ebf8278 100644
--- a/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb
+++ b/spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb
@@ -163,7 +163,7 @@ describe Scheduler::AccountsStatusesCleanupScheduler do
       def cleanable_statuses_count
         Status
           .where(account_id: [account_alice, account_chris, account_erin]) # Accounts with enabled policies
-          .where('created_at < ?', 2.weeks.ago) # Policy defaults is 2.weeks
+          .where(created_at: ...2.weeks.ago) # Policy defaults is 2.weeks
           .count
       end
     end

From de4815afda0809bf999519aabda1cd14c67278da Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 20 May 2024 12:06:51 +0200
Subject: [PATCH 161/215] Add more tests for self-destruct mode (#30374)

---
 spec/helpers/self_destruct_helper_spec.rb | 70 +++++++++++++++++
 spec/requests/self_destruct_spec.rb       | 92 +++++++++++++++++++++++
 2 files changed, 162 insertions(+)
 create mode 100644 spec/helpers/self_destruct_helper_spec.rb
 create mode 100644 spec/requests/self_destruct_spec.rb

diff --git a/spec/helpers/self_destruct_helper_spec.rb b/spec/helpers/self_destruct_helper_spec.rb
new file mode 100644
index 000000000..09d7347ee
--- /dev/null
+++ b/spec/helpers/self_destruct_helper_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe SelfDestructHelper do
+  describe 'self_destruct?' do
+    context 'when SELF_DESTRUCT is unset' do
+      it 'returns false' do
+        expect(helper.self_destruct?).to be false
+      end
+    end
+
+    context 'when SELF_DESTRUCT is set to an invalid value' do
+      around do |example|
+        ClimateControl.modify SELF_DESTRUCT: 'true' do
+          example.run
+        end
+      end
+
+      it 'returns false' do
+        expect(helper.self_destruct?).to be false
+      end
+    end
+
+    context 'when SELF_DESTRUCT is set to value signed for the wrong purpose' do
+      around do |example|
+        ClimateControl.modify(
+          SELF_DESTRUCT: Rails.application.message_verifier('foo').generate('example.com'),
+          LOCAL_DOMAIN: 'example.com'
+        ) do
+          example.run
+        end
+      end
+
+      it 'returns false' do
+        expect(helper.self_destruct?).to be false
+      end
+    end
+
+    context 'when SELF_DESTRUCT is set to value signed for the wrong domain' do
+      around do |example|
+        ClimateControl.modify(
+          SELF_DESTRUCT: Rails.application.message_verifier('self-destruct').generate('foo.com'),
+          LOCAL_DOMAIN: 'example.com'
+        ) do
+          example.run
+        end
+      end
+
+      it 'returns false' do
+        expect(helper.self_destruct?).to be false
+      end
+    end
+
+    context 'when SELF_DESTRUCT is set to a correctly-signed value' do
+      around do |example|
+        ClimateControl.modify(
+          SELF_DESTRUCT: Rails.application.message_verifier('self-destruct').generate('example.com'),
+          LOCAL_DOMAIN: 'example.com'
+        ) do
+          example.run
+        end
+      end
+
+      it 'returns true' do
+        expect(helper.self_destruct?).to be true
+      end
+    end
+  end
+end
diff --git a/spec/requests/self_destruct_spec.rb b/spec/requests/self_destruct_spec.rb
new file mode 100644
index 000000000..f71a2325e
--- /dev/null
+++ b/spec/requests/self_destruct_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe 'Self-destruct mode' do
+  before do
+    allow(SelfDestructHelper).to receive(:self_destruct?).and_return(true)
+  end
+
+  shared_examples 'generic logged out request' do |path|
+    it 'returns 410 gone and mentions self-destruct' do
+      get path, headers: { 'Accept' => 'text/html' }
+
+      expect(response).to have_http_status(410)
+      expect(response.body).to include(I18n.t('self_destruct.title'))
+    end
+  end
+
+  shared_examples 'accessible logged-in endpoint' do |path|
+    it 'returns 200 ok' do
+      get path
+
+      expect(response).to have_http_status(200)
+    end
+  end
+
+  shared_examples 'ActivityPub request' do |path|
+    context 'without signature' do
+      it 'returns 410 gone' do
+        get path, headers: {
+          'Accept' => 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
+        }
+
+        expect(response).to have_http_status(410)
+      end
+    end
+
+    context 'with invalid signature' do
+      it 'returns 410 gone' do
+        get path, headers: {
+          'Accept' => 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
+          'Signature' => 'keyId="https://remote.domain/users/bob#main-key",algorithm="rsa-sha256",headers="date host (request-target)",signature="bar"',
+        }
+
+        expect(response).to have_http_status(410)
+      end
+    end
+  end
+
+  context 'when requesting various unavailable endpoints' do
+    it_behaves_like 'generic logged out request', '/'
+    it_behaves_like 'generic logged out request', '/about'
+    it_behaves_like 'generic logged out request', '/public'
+  end
+
+  context 'when requesting a suspended account' do
+    let(:suspended) { Fabricate(:account, username: 'suspended') }
+
+    before do
+      suspended.suspend!
+    end
+
+    it_behaves_like 'generic logged out request', '/@suspended'
+    it_behaves_like 'ActivityPub request', '/users/suspended'
+    it_behaves_like 'ActivityPub request', '/users/suspended/followers'
+    it_behaves_like 'ActivityPub request', '/users/suspended/outbox'
+  end
+
+  context 'when requesting a non-suspended account' do
+    before do
+      Fabricate(:account, username: 'bob')
+    end
+
+    it_behaves_like 'generic logged out request', '/@bob'
+    it_behaves_like 'ActivityPub request', '/users/bob'
+    it_behaves_like 'ActivityPub request', '/users/bob/followers'
+    it_behaves_like 'ActivityPub request', '/users/bob/outbox'
+  end
+
+  context 'when accessing still-enabled endpoints when logged in' do
+    let(:user) { Fabricate(:user) }
+
+    before do
+      sign_in(user)
+    end
+
+    it_behaves_like 'accessible logged-in endpoint', '/auth/edit'
+    it_behaves_like 'accessible logged-in endpoint', '/settings/export'
+    it_behaves_like 'accessible logged-in endpoint', '/settings/login_activities'
+    it_behaves_like 'accessible logged-in endpoint', '/settings/exports/follows.csv'
+  end
+end

From 2bcbeed95143448625eccbbf3a3245a1eec26dce Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 20 May 2024 16:59:23 +0200
Subject: [PATCH 162/215] Add some error handling to OTP secret migration
 (#30344)

---
 ...80905_migrate_devise_two_factor_secrets.rb | 26 ++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb b/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb
index 360e4806d..6194cf9ee 100644
--- a/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb
+++ b/db/post_migrate/20240307180905_migrate_devise_two_factor_secrets.rb
@@ -18,7 +18,13 @@ class MigrateDeviseTwoFactorSecrets < ActiveRecord::Migration[7.1]
     users_with_otp_enabled.find_each do |user|
       # Gets the new value on already-updated users
       # Falls back to legacy value on not-yet-migrated users
-      otp_secret = user.otp_secret
+      otp_secret = begin
+        user.otp_secret
+      rescue OpenSSL::OpenSSLError
+        next if ENV['MIGRATION_IGNORE_INVALID_OTP_SECRET'] == 'true'
+
+        abort_with_decryption_error(user)
+      end
 
       Rails.logger.debug { "Processing #{user.email}" }
 
@@ -36,4 +42,22 @@ class MigrateDeviseTwoFactorSecrets < ActiveRecord::Migration[7.1]
   def users_with_otp_enabled
     MigrationUser.where(otp_required_for_login: true, otp_secret: nil)
   end
+
+  def abort_with_decryption_error(user)
+    abort <<~MESSAGE
+
+      ERROR: Unable to decrypt OTP secret for user #{user.id}.
+
+      This is most likely because you have changed the value of `OTP_SECRET` at some point in
+      time after the user configured 2FA.
+
+      In this case, their OTP secret had already been lost with the change to `OTP_SECRET`, and
+      proceeding with this migration will not make the situation worse.
+
+      Please double-check that you have not accidentally changed `OTP_SECRET` just for this
+      migration, and re-run the migration with `MIGRATION_IGNORE_INVALID_OTP_SECRET=true`.
+
+      Migration aborted.
+    MESSAGE
+  end
 end

From 00cf8d37480b053b179e1caa12c5e9fc04813a4b Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 20 May 2024 16:59:27 +0200
Subject: [PATCH 163/215] Change older Paperclip database migrations for
 consistency (#30204)

---
 .../20160227230233_add_attachment_avatar_to_accounts.rb   | 6 +++++-
 .../20160312193225_add_attachment_header_to_accounts.rb   | 6 +++++-
 db/migrate/20160905150353_create_media_attachments.rb     | 8 +++++++-
 .../20170330164118_add_attachment_data_to_imports.rb      | 6 +++++-
 db/migrate/20170901141119_truncate_preview_cards.rb       | 8 +++++++-
 db/migrate/20170913000752_create_site_uploads.rb          | 8 +++++++-
 db/migrate/20170917153509_create_custom_emojis.rb         | 7 ++++++-
 ...27125810_add_thumbnail_columns_to_media_attachments.rb | 7 ++++++-
 8 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb b/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb
index 3666abf1c..534df25ee 100644
--- a/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb
+++ b/db/migrate/20160227230233_add_attachment_avatar_to_accounts.rb
@@ -3,7 +3,11 @@
 class AddAttachmentAvatarToAccounts < ActiveRecord::Migration[4.2]
   def self.up
     change_table :accounts do |t|
-      t.attachment :avatar
+      # The following corresponds to `t.attachment :avatar` in an older version of Paperclip
+      t.string :avatar_file_name
+      t.string :avatar_content_type
+      t.integer :avatar_file_size
+      t.datetime :avatar_updated_at
     end
   end
 
diff --git a/db/migrate/20160312193225_add_attachment_header_to_accounts.rb b/db/migrate/20160312193225_add_attachment_header_to_accounts.rb
index 37108fc18..b481fc529 100644
--- a/db/migrate/20160312193225_add_attachment_header_to_accounts.rb
+++ b/db/migrate/20160312193225_add_attachment_header_to_accounts.rb
@@ -3,7 +3,11 @@
 class AddAttachmentHeaderToAccounts < ActiveRecord::Migration[4.2]
   def self.up
     change_table :accounts do |t|
-      t.attachment :header
+      # The following corresponds to `t.attachment :header` in an older version of Paperclip
+      t.string :header_file_name
+      t.string :header_content_type
+      t.integer :header_file_size
+      t.datetime :header_updated_at
     end
   end
 
diff --git a/db/migrate/20160905150353_create_media_attachments.rb b/db/migrate/20160905150353_create_media_attachments.rb
index 3903a7b9a..92680db9f 100644
--- a/db/migrate/20160905150353_create_media_attachments.rb
+++ b/db/migrate/20160905150353_create_media_attachments.rb
@@ -4,7 +4,13 @@ class CreateMediaAttachments < ActiveRecord::Migration[5.0]
   def change
     create_table :media_attachments do |t|
       t.integer :status_id, null: true, default: nil
-      t.attachment :file
+
+      # The following corresponds to `t.attachment :file` in an older version of Paperclip
+      t.string :file_file_name
+      t.string :file_content_type
+      t.integer :file_file_size
+      t.datetime :file_updated_at
+
       t.string :remote_url, null: false, default: ''
       t.integer :account_id
 
diff --git a/db/migrate/20170330164118_add_attachment_data_to_imports.rb b/db/migrate/20170330164118_add_attachment_data_to_imports.rb
index 908d4da96..0daaa9d02 100644
--- a/db/migrate/20170330164118_add_attachment_data_to_imports.rb
+++ b/db/migrate/20170330164118_add_attachment_data_to_imports.rb
@@ -3,7 +3,11 @@
 class AddAttachmentDataToImports < ActiveRecord::Migration[4.2]
   def self.up
     change_table :imports do |t|
-      t.attachment :data
+      # The following corresponds to `t.attachment :data` in an older version of Paperclip
+      t.string :data_file_name
+      t.string :data_content_type
+      t.integer :data_file_size
+      t.datetime :data_updated_at
     end
   end
 
diff --git a/db/migrate/20170901141119_truncate_preview_cards.rb b/db/migrate/20170901141119_truncate_preview_cards.rb
index b4ba8c45e..f251841f2 100644
--- a/db/migrate/20170901141119_truncate_preview_cards.rb
+++ b/db/migrate/20170901141119_truncate_preview_cards.rb
@@ -8,7 +8,13 @@ class TruncatePreviewCards < ActiveRecord::Migration[5.1]
       t.string     :url, default: '', null: false, index: { unique: true }
       t.string     :title, default: '', null: false
       t.string     :description, default: '', null: false
-      t.attachment :image
+
+      # The following corresponds to `t.attachment :image` in an older version of Paperclip
+      t.string :image_file_name
+      t.string :image_content_type
+      t.integer :image_file_size
+      t.datetime :image_updated_at
+
       t.integer    :type, default: 0, null: false
       t.text       :html, default: '', null: false
       t.string     :author_name, default: '', null: false
diff --git a/db/migrate/20170913000752_create_site_uploads.rb b/db/migrate/20170913000752_create_site_uploads.rb
index 43a793806..16a95ea01 100644
--- a/db/migrate/20170913000752_create_site_uploads.rb
+++ b/db/migrate/20170913000752_create_site_uploads.rb
@@ -4,7 +4,13 @@ class CreateSiteUploads < ActiveRecord::Migration[5.1]
   def change
     create_table :site_uploads do |t|
       t.string :var, default: '', null: false, index: { unique: true }
-      t.attachment :file
+
+      # The following corresponds to `t.attachment :file` in an older version of Paperclip
+      t.string :file_file_name
+      t.string :file_content_type
+      t.integer :file_file_size
+      t.datetime :file_updated_at
+
       t.json :meta
       t.timestamps
     end
diff --git a/db/migrate/20170917153509_create_custom_emojis.rb b/db/migrate/20170917153509_create_custom_emojis.rb
index 984fcd218..dedc8cde8 100644
--- a/db/migrate/20170917153509_create_custom_emojis.rb
+++ b/db/migrate/20170917153509_create_custom_emojis.rb
@@ -5,7 +5,12 @@ class CreateCustomEmojis < ActiveRecord::Migration[5.1]
     create_table :custom_emojis do |t|
       t.string :shortcode, null: false, default: ''
       t.string :domain
-      t.attachment :image
+
+      # The following corresponds to `t.attachment :image` in an older version of Paperclip
+      t.string :image_file_name
+      t.string :image_content_type
+      t.integer :image_file_size
+      t.datetime :image_updated_at
 
       t.timestamps
     end
diff --git a/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb b/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb
index a3c6b55fd..c11a24e8b 100644
--- a/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb
+++ b/db/migrate/20200627125810_add_thumbnail_columns_to_media_attachments.rb
@@ -2,7 +2,12 @@
 
 class AddThumbnailColumnsToMediaAttachments < ActiveRecord::Migration[5.2]
   def up
-    add_attachment :media_attachments, :thumbnail
+    # The following corresponds to `add_attachment :media_attachments, :thumbnail` in an older version of Paperclip
+    add_column :media_attachments, :thumbnail_file_name, :string
+    add_column :media_attachments, :thumbnail_content_type, :string
+    add_column :media_attachments, :thumbnail_file_size, :integer
+    add_column :media_attachments, :thumbnail_updated_at, :datetime
+
     add_column :media_attachments, :thumbnail_remote_url, :string
   end
 

From 0a2110b9af52005798251dc9d245a66dd5dd20fa Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 20 May 2024 11:00:09 -0400
Subject: [PATCH 164/215] Add coverage for custom filters (#30347)

---
 spec/system/filters_spec.rb | 72 +++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)
 create mode 100644 spec/system/filters_spec.rb

diff --git a/spec/system/filters_spec.rb b/spec/system/filters_spec.rb
new file mode 100644
index 000000000..9d18e9046
--- /dev/null
+++ b/spec/system/filters_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe 'Filters' do
+  let(:user) { Fabricate(:user) }
+  let(:filter_title) { 'Filter of fun and games' }
+
+  before { sign_in(user) }
+
+  describe 'Creating a filter' do
+    it 'Populates a new filter from form' do
+      navigate_to_filters
+
+      click_on I18n.t('filters.new.title')
+      fill_in_filter_form
+      expect(page).to have_content(filter_title)
+    end
+  end
+
+  describe 'Editing an existing filter' do
+    let(:new_title) { 'Change title value' }
+
+    before { Fabricate :custom_filter, account: user.account, title: filter_title }
+
+    it 'Updates the saved filter' do
+      navigate_to_filters
+
+      click_on filter_title
+
+      fill_in filter_title_field, with: new_title
+      click_on I18n.t('generic.save_changes')
+
+      expect(page).to have_content(new_title)
+    end
+  end
+
+  describe 'Destroying an existing filter' do
+    before { Fabricate :custom_filter, account: user.account, title: filter_title }
+
+    it 'Deletes the filter' do
+      navigate_to_filters
+
+      expect(page).to have_content filter_title
+      expect do
+        click_on I18n.t('filters.index.delete')
+      end.to change(CustomFilter, :count).by(-1)
+
+      expect(page).to_not have_content(filter_title)
+    end
+  end
+
+  def navigate_to_filters
+    visit settings_path
+
+    click_on I18n.t('filters.index.title')
+    expect(page).to have_content I18n.t('filters.index.title')
+  end
+
+  def fill_in_filter_form
+    fill_in filter_title_field, with: filter_title
+    check I18n.t('filters.contexts.home')
+    within('.custom_filter_keywords_keyword') do
+      fill_in with: 'Keyword'
+    end
+    click_on I18n.t('filters.new.save')
+  end
+
+  def filter_title_field
+    I18n.t('simple_form.labels.defaults.title')
+  end
+end

From 8c925dec793476b0f516aab901c7802d8e04f844 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 20 May 2024 19:04:21 +0200
Subject: [PATCH 165/215] chore(deps): update dependency rubocop-rails to
 v2.25.0 (#30341)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 Gemfile.lock | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index eade99acf..f1a1d2a93 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -425,7 +425,7 @@ GEM
     mime-types-data (3.2024.0507)
     mini_mime (1.1.5)
     mini_portile2 (2.8.6)
-    minitest (5.22.3)
+    minitest (5.23.0)
     msgpack (1.7.2)
     multi_json (1.15.0)
     multipart-post (2.4.0)
@@ -610,7 +610,7 @@ GEM
     pundit (2.3.2)
       activesupport (>= 3.0.0)
     raabro (1.4.0)
-    racc (1.7.3)
+    racc (1.8.0)
     rack (2.2.9)
     rack-attack (6.7.0)
       rack (>= 1.0, < 4)
@@ -685,7 +685,7 @@ GEM
       redis (>= 4)
     redlock (1.3.2)
       redis (>= 3.0.0, < 6.0)
-    regexp_parser (2.9.0)
+    regexp_parser (2.9.2)
     reline (0.5.7)
       io-console (~> 0.5)
     request_store (1.6.0)
@@ -746,7 +746,7 @@ GEM
     rubocop-performance (1.21.0)
       rubocop (>= 1.48.1, < 2.0)
       rubocop-ast (>= 1.31.1, < 2.0)
-    rubocop-rails (2.24.1)
+    rubocop-rails (2.25.0)
       activesupport (>= 4.2.0)
       rack (>= 1.1)
       rubocop (>= 1.33.0, < 2.0)

From 0663c7d78d7de406ed199f61fd0cdb55b14b8f1f Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 20 May 2024 19:14:10 +0200
Subject: [PATCH 166/215] fix(deps): update formatjs monorepo (#30359)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 139 +++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 95 insertions(+), 44 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 698824cab..2d27d1302 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2259,6 +2259,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@formatjs/ecma402-abstract@npm:2.0.0":
+  version: 2.0.0
+  resolution: "@formatjs/ecma402-abstract@npm:2.0.0"
+  dependencies:
+    "@formatjs/intl-localematcher": "npm:0.5.4"
+    tslib: "npm:^2.4.0"
+  checksum: 10c0/94cba291aeadffa3ca416087c2c2352c8a741bb4dcb7f47f15c247b1f043ffcef1af5b20a1b7578fbba9e704fc5f1c079923f3537a273d50162be62f8037625c
+  languageName: node
+  linkType: hard
+
 "@formatjs/fast-memoize@npm:2.2.0":
   version: 2.2.0
   resolution: "@formatjs/fast-memoize@npm:2.2.0"
@@ -2279,6 +2289,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@formatjs/icu-messageformat-parser@npm:2.7.8":
+  version: 2.7.8
+  resolution: "@formatjs/icu-messageformat-parser@npm:2.7.8"
+  dependencies:
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
+    "@formatjs/icu-skeleton-parser": "npm:1.8.2"
+    tslib: "npm:^2.4.0"
+  checksum: 10c0/a3b759a825fb22ffd7b906f6a07b1a079bbc34f72c745de2c2514e439c4bb75bc1a9442eba1bac7ff3ea3010e12076374cd755ad12116b1d066cc90da5fbcbc9
+  languageName: node
+  linkType: hard
+
 "@formatjs/icu-skeleton-parser@npm:1.8.0":
   version: 1.8.0
   resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0"
@@ -2289,25 +2310,35 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@formatjs/intl-displaynames@npm:6.6.6":
-  version: 6.6.6
-  resolution: "@formatjs/intl-displaynames@npm:6.6.6"
+"@formatjs/icu-skeleton-parser@npm:1.8.2":
+  version: 1.8.2
+  resolution: "@formatjs/icu-skeleton-parser@npm:1.8.2"
   dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
-    "@formatjs/intl-localematcher": "npm:0.5.4"
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
     tslib: "npm:^2.4.0"
-  checksum: 10c0/4ba40057cfafaabf04485137bc96705d5ed7ac48f17ed7dfe8dbd7f71119667b6c0b7fa75469e32b70c9bada2c5d03af37a5261d655a37b81c63ba907edbb2e8
+  checksum: 10c0/9b15013acc47b8d560b52942e3dab2abaaa9c5a4410bbd1d490a4b22bf5ca36fdd88b71f241d05479bddf856d0d1d57b7ecc9e79738497ac518616aa6d4d0015
   languageName: node
   linkType: hard
 
-"@formatjs/intl-listformat@npm:7.5.5":
-  version: 7.5.5
-  resolution: "@formatjs/intl-listformat@npm:7.5.5"
+"@formatjs/intl-displaynames@npm:6.6.8":
+  version: 6.6.8
+  resolution: "@formatjs/intl-displaynames@npm:6.6.8"
   dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
     "@formatjs/intl-localematcher": "npm:0.5.4"
     tslib: "npm:^2.4.0"
-  checksum: 10c0/bc9d8cbe42bd9513db0b2b221c0b1a752892005a90fa629b4cf7df1cbd3b96997cddbf420e562ebdfdc691a28d9b759ccae9633d5987aa0bceed5aef77a07ca4
+  checksum: 10c0/1a03e7644022741c1bcf10fcd07da88c434416a13603ace693a038114010463307b4130d3a3f53ad5665bd27fca9a6b19ac8e5bf58e17598b1ea84db173fdfbb
+  languageName: node
+  linkType: hard
+
+"@formatjs/intl-listformat@npm:7.5.7":
+  version: 7.5.7
+  resolution: "@formatjs/intl-listformat@npm:7.5.7"
+  dependencies:
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
+    "@formatjs/intl-localematcher": "npm:0.5.4"
+    tslib: "npm:^2.4.0"
+  checksum: 10c0/5d0478752d669d87c82aa80880df464d64a1c8974fcb6136bc854567f570a1696e5468005ffa266cfcb623adb7c7299b839c06ea33897f55d35dab6a7575cc84
   languageName: node
   linkType: hard
 
@@ -2321,33 +2352,33 @@ __metadata:
   linkType: hard
 
 "@formatjs/intl-pluralrules@npm:^5.2.2":
-  version: 5.2.12
-  resolution: "@formatjs/intl-pluralrules@npm:5.2.12"
+  version: 5.2.14
+  resolution: "@formatjs/intl-pluralrules@npm:5.2.14"
   dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
     "@formatjs/intl-localematcher": "npm:0.5.4"
     tslib: "npm:^2.4.0"
-  checksum: 10c0/0f4d9f4f272dd962b2f742519045ad43a1b6358755787d3394efcc5884b02184cc8d76fb13d98b1f30c41a813b81f82dd2342e1fb0fbd7b7efa69f5d0d59c4d0
+  checksum: 10c0/3c00109c8d4c8b221c2b9af38a38d31cd6293a0a412a1f2cdae2b8ef81bd71626c9ff4a647389682cb27ae5c223bd6f64ef54d03e3f6f19c372e0c6194b76b38
   languageName: node
   linkType: hard
 
-"@formatjs/intl@npm:2.10.2":
-  version: 2.10.2
-  resolution: "@formatjs/intl@npm:2.10.2"
+"@formatjs/intl@npm:2.10.4":
+  version: 2.10.4
+  resolution: "@formatjs/intl@npm:2.10.4"
   dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
     "@formatjs/fast-memoize": "npm:2.2.0"
-    "@formatjs/icu-messageformat-parser": "npm:2.7.6"
-    "@formatjs/intl-displaynames": "npm:6.6.6"
-    "@formatjs/intl-listformat": "npm:7.5.5"
-    intl-messageformat: "npm:10.5.12"
+    "@formatjs/icu-messageformat-parser": "npm:2.7.8"
+    "@formatjs/intl-displaynames": "npm:6.6.8"
+    "@formatjs/intl-listformat": "npm:7.5.7"
+    intl-messageformat: "npm:10.5.14"
     tslib: "npm:^2.4.0"
   peerDependencies:
     typescript: ^4.7 || 5
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/20df407e141055e8c7b2605c06e952b643be7ea01d992862e13fc623ca2db034069744eae2be16655bf7888b3add1bfc2653fd0a08bcfdb67fb9b72a306f7718
+  checksum: 10c0/ca7877e962f73f1fe0e358f12d73bdc3ec4006c14ee801e06d9f7aef06bcdcc12355a8f53f32b0e890f829949ded35e825c914ca5f4709eb1e08c2a18c1368c2
   languageName: node
   linkType: hard
 
@@ -2371,6 +2402,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@formatjs/ts-transformer@npm:3.13.14":
+  version: 3.13.14
+  resolution: "@formatjs/ts-transformer@npm:3.13.14"
+  dependencies:
+    "@formatjs/icu-messageformat-parser": "npm:2.7.8"
+    "@types/json-stable-stringify": "npm:^1.0.32"
+    "@types/node": "npm:14 || 16 || 17"
+    chalk: "npm:^4.0.0"
+    json-stable-stringify: "npm:^1.0.1"
+    tslib: "npm:^2.4.0"
+    typescript: "npm:5"
+  peerDependencies:
+    ts-jest: ">=27"
+  peerDependenciesMeta:
+    ts-jest:
+      optional: true
+  checksum: 10c0/38450cfce3ec5132f3548c1e9ab098909ca8d2db2b8b6b4b5bb87aa59a4ca1a19bbf6d339ace39bcc931fa80d9946b4c7cf039c9574069b317ae015cd6963bd3
+  languageName: node
+  linkType: hard
+
 "@gamestdio/websocket@npm:^0.3.2":
   version: 0.3.2
   resolution: "@gamestdio/websocket@npm:0.3.2"
@@ -5197,21 +5248,21 @@ __metadata:
   linkType: hard
 
 "babel-plugin-formatjs@npm:^10.5.1":
-  version: 10.5.14
-  resolution: "babel-plugin-formatjs@npm:10.5.14"
+  version: 10.5.16
+  resolution: "babel-plugin-formatjs@npm:10.5.16"
   dependencies:
     "@babel/core": "npm:^7.10.4"
     "@babel/helper-plugin-utils": "npm:^7.10.4"
     "@babel/plugin-syntax-jsx": "npm:7"
     "@babel/traverse": "npm:7"
     "@babel/types": "npm:^7.12.11"
-    "@formatjs/icu-messageformat-parser": "npm:2.7.6"
-    "@formatjs/ts-transformer": "npm:3.13.12"
+    "@formatjs/icu-messageformat-parser": "npm:2.7.8"
+    "@formatjs/ts-transformer": "npm:3.13.14"
     "@types/babel__core": "npm:^7.1.7"
     "@types/babel__helper-plugin-utils": "npm:^7.10.0"
     "@types/babel__traverse": "npm:^7.1.7"
     tslib: "npm:^2.4.0"
-  checksum: 10c0/78d33f0304c7b6e36334b2f32bacd144cbbe08cb22318ff994e7adc7705b7f8208354c9af9f87b4390d11aee1ea81cfee9f224a57fe5265173b92ee7de921359
+  checksum: 10c0/03d9d2b0b9cdc05c011bfb417a43e5c0f557868ed84d83acbc3cb9072b7fa98f5219473d0bd61f02741c151d6f2162da363bd337522c80af14721ae37f6da86b
   languageName: node
   linkType: hard
 
@@ -9643,15 +9694,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"intl-messageformat@npm:10.5.12, intl-messageformat@npm:^10.3.5":
-  version: 10.5.12
-  resolution: "intl-messageformat@npm:10.5.12"
+"intl-messageformat@npm:10.5.14, intl-messageformat@npm:^10.3.5":
+  version: 10.5.14
+  resolution: "intl-messageformat@npm:10.5.14"
   dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
     "@formatjs/fast-memoize": "npm:2.2.0"
-    "@formatjs/icu-messageformat-parser": "npm:2.7.6"
+    "@formatjs/icu-messageformat-parser": "npm:2.7.8"
     tslib: "npm:^2.4.0"
-  checksum: 10c0/f95734e98a05ef7f51de0c27904d3a994528e3a174963bd1b3a6db9416b5fd84bbd8f7d26d84fc547d51af69ccf46dd3f73a3f4f20a2ccef5c9cd90e946ad82c
+  checksum: 10c0/8ec0a60539f67039356e211bcc8d81cf1bd9d62190a72ab0e94504da92f0242fe2f94ffb512b97cc6f63782b7891874d4038536ce04631e59d762c3441c60b4b
   languageName: node
   linkType: hard
 
@@ -14353,18 +14404,18 @@ __metadata:
   linkType: hard
 
 "react-intl@npm:^6.4.2":
-  version: 6.6.6
-  resolution: "react-intl@npm:6.6.6"
+  version: 6.6.8
+  resolution: "react-intl@npm:6.6.8"
   dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
-    "@formatjs/icu-messageformat-parser": "npm:2.7.6"
-    "@formatjs/intl": "npm:2.10.2"
-    "@formatjs/intl-displaynames": "npm:6.6.6"
-    "@formatjs/intl-listformat": "npm:7.5.5"
+    "@formatjs/ecma402-abstract": "npm:2.0.0"
+    "@formatjs/icu-messageformat-parser": "npm:2.7.8"
+    "@formatjs/intl": "npm:2.10.4"
+    "@formatjs/intl-displaynames": "npm:6.6.8"
+    "@formatjs/intl-listformat": "npm:7.5.7"
     "@types/hoist-non-react-statics": "npm:^3.3.1"
     "@types/react": "npm:16 || 17 || 18"
     hoist-non-react-statics: "npm:^3.3.2"
-    intl-messageformat: "npm:10.5.12"
+    intl-messageformat: "npm:10.5.14"
     tslib: "npm:^2.4.0"
   peerDependencies:
     react: ^16.6.0 || 17 || 18
@@ -14372,7 +14423,7 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/04c1d1ca783f2a5e605544290c93e57629500be6811d7c2c3342903bf9f9a720d2e4c9cf3924133bf84e510ee879bf3d870a3ff269f5b197f894a49047bd089d
+  checksum: 10c0/7673507eb73ad4edd1593da7173cec68f316cf77037e0959900babd32d5984a39ba7fa10aaa0a23bcddb7b98daf7dd007cb73ddfc39127ede87c18ec780a519c
   languageName: node
   linkType: hard
 

From eda2bdfc7abeb3f67d982ac009856489089ed7d7 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 21 May 2024 10:48:36 +0200
Subject: [PATCH 167/215] New Crowdin Translations (automated) (#30383)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/fil.json | 14 ++++++++++++++
 config/locales/is.yml                    |  1 +
 config/locales/lt.yml                    |  6 +++---
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json
index 894d73c8c..387727604 100644
--- a/app/javascript/mastodon/locales/fil.json
+++ b/app/javascript/mastodon/locales/fil.json
@@ -50,6 +50,8 @@
   "admin.dashboard.retention.cohort_size": "Mga bagong tagagamit",
   "alert.rate_limited.message": "Mangyaring subukan muli pagkatapos ng {retry_time, time, medium}.",
   "audio.hide": "Itago ang tunog",
+  "block_modal.show_less": "Magpakita ng mas kaunti",
+  "block_modal.show_more": "Magpakita ng higit pa",
   "block_modal.title": "Harangan ang tagagamit?",
   "bundle_column_error.error.title": "Naku!",
   "bundle_column_error.network.body": "Nagkaroon ng kamalian habang sinusubukang i-karga ang pahinang ito. Maaaring dahil ito sa pansamantalang problema ng iyong koneksyon sa internet o ang server na ito.",
@@ -102,6 +104,7 @@
   "compose_form.encryption_warning": "Ang mga post sa Mastodon ay hindi naka-encrypt nang dulo-dulo. Huwag magbahagi ng anumang sensitibong impormasyon sa Mastodon.",
   "compose_form.hashtag_warning": "Hindi maililista ang post na ito sa anumang hashtag dahil hindi ito nakapubliko. Mga nakapublikong post lamang ang mahahanap ayon sa hashtag.",
   "compose_form.placeholder": "Anong nangyari?",
+  "compose_form.poll.duration": "Tagal ng botohan",
   "compose_form.poll.multiple": "Maraming pagpipilian",
   "compose_form.poll.single": "Piliin ang isa",
   "compose_form.reply": "Tumugon",
@@ -173,6 +176,7 @@
   "empty_column.list": "Wala pang laman ang listahang ito. Kapag naglathala ng mga bagong post ang mga miyembro ng listahang ito, makikita iyon dito.",
   "empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito.",
   "explore.search_results": "Mga resulta ng paghahanap",
+  "explore.suggested_follows": "Mga tao",
   "explore.title": "Tuklasin",
   "explore.trending_links": "Mga balita",
   "filter_modal.select_filter.search": "Hanapin o gumawa",
@@ -186,9 +190,13 @@
   "follow_suggestions.who_to_follow": "Sinong maaaring sundan",
   "footer.about": "Tungkol dito",
   "footer.get_app": "Kunin ang app",
+  "footer.status": "Katayuan",
   "generic.saved": "Nakaimbak",
   "hashtag.column_header.tag_mode.all": "at {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
+  "hashtag.column_settings.tag_mode.all": "Lahat ng nandito",
+  "hashtag.column_settings.tag_mode.any": "Ilan sa nandito",
+  "hashtag.column_settings.tag_mode.none": "Wala dito",
   "home.column_settings.show_replies": "Ipakita ang mga tugon",
   "home.pending_critical_update.body": "Mangyaring i-update ang iyong serbiro ng Mastodon sa lalong madaling panahon!",
   "interaction_modal.login.action": "Iuwi mo ako",
@@ -199,6 +207,7 @@
   "intervals.full.days": "{number, plural, one {# araw} other {# na araw}}",
   "intervals.full.hours": "{number, plural, one {# oras} other {# na oras}}",
   "intervals.full.minutes": "{number, plural, one {# minuto} other {# na minuto}}",
+  "keyboard_shortcuts.blocked": "Buksan ang talaan ng mga nakaharang na mga tagagamit",
   "keyboard_shortcuts.description": "Paglalarawan",
   "keyboard_shortcuts.down": "Ilipat pababa sa talaan",
   "keyboard_shortcuts.mention": "Banggitin ang may-akda",
@@ -218,7 +227,10 @@
   "navigation_bar.about": "Tungkol dito",
   "navigation_bar.blocks": "Nakaharang na mga tagagamit",
   "navigation_bar.direct": "Mga palihim na banggit",
+  "navigation_bar.discover": "Tuklasin",
+  "navigation_bar.explore": "Tuklasin",
   "navigation_bar.favourites": "Mga paborito",
+  "navigation_bar.follow_requests": "Mga hiling sa pagsunod",
   "navigation_bar.follows_and_followers": "Mga sinusundan at tagasunod",
   "navigation_bar.lists": "Mga listahan",
   "navigation_bar.search": "Maghanap",
@@ -226,6 +238,7 @@
   "notification.follow": "Sinundan ka ni {name}",
   "notification.follow_request": "Hinihiling ni {name} na sundan ka",
   "notification.mention": "Binanggit ka ni {name}",
+  "notification.moderation_warning": "Mayroong kang natanggap na babala sa pagtitimpi",
   "notification.relationships_severance_event.learn_more": "Matuto nang higit pa",
   "notification_requests.accept": "Tanggapin",
   "notification_requests.notifications_from": "Mga abiso mula kay/sa {name}",
@@ -246,6 +259,7 @@
   "onboarding.profile.note_hint": "Maaari mong @bangitin ang ibang mga tao o mga #hashtag…",
   "onboarding.profile.save_and_continue": "Iimbak at magpatuloy",
   "onboarding.share.next_steps": "Mga posibleng susunod na hakbang:",
+  "picture_in_picture.restore": "Ilagay ito pabalik",
   "poll.closed": "Sarado",
   "poll.reveal": "Ipakita ang mga resulta",
   "poll.voted": "Binoto mo para sa sagot na ito",
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 2eeba976b..997775296 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -285,6 +285,7 @@ is:
         update_custom_emoji_html: "%{name} uppfærði tjáningartáknið %{target}"
         update_domain_block_html: "%{name} uppfærði útilokun lénsins %{target}"
         update_ip_block_html: "%{name} breytti reglu fyrir IP-vistfangið %{target}"
+        update_report_html: "%{name} uppfærði kæru %{target}"
         update_status_html: "%{name} uppfærði færslu frá %{target}"
         update_user_role_html: "%{name} breytti hlutverki %{target}"
       deleted_account: eyddur notandaaðgangur
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 552afa830..3e514a547 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -618,7 +618,7 @@ lt:
     settings: 'Keisti el. pašto nuostatas: %{link}'
     view: 'Peržiūra:'
     view_profile: Peržiurėti profilį
-    view_status: Peržiūrėti statusą
+    view_status: Peržiūrėti įrašą
   applications:
     created: Aplikacija sėkmingai sukurta
     destroyed: Aplikacija sėkmingai ištrinta
@@ -777,8 +777,8 @@ lt:
     title: Moderacija
   notification_mailer:
     favourite:
-      body: 'Jūsų statusą pamėgo %{name}:'
-      subject: "%{name} pamėgo Jūsų statusą"
+      body: 'Tavo įrašą pamėgo %{name}:'
+      subject: "%{name} pamėgo tavo įrašą"
       title: Naujas mėgstamas
     follow:
       body: "%{name} pradėjo jus sekti!"

From 89f89d738f5840c80ff938f8bf6734cdafe0fa83 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Tue, 21 May 2024 10:56:08 +0200
Subject: [PATCH 168/215] Revert "Allow unblocking email addresses from any
 matching account (#29305)" (#30385)

---
 app/controllers/admin/accounts_controller.rb         | 2 +-
 app/models/canonical_email_block.rb                  | 1 -
 app/views/admin/accounts/show.html.haml              | 2 +-
 spec/fabricators/canonical_email_block_fabricator.rb | 2 +-
 4 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb
index d3be7817f..9beb8fde6 100644
--- a/app/controllers/admin/accounts_controller.rb
+++ b/app/controllers/admin/accounts_controller.rb
@@ -128,7 +128,7 @@ module Admin
     def unblock_email
       authorize @account, :unblock_email?
 
-      CanonicalEmailBlock.matching_account(@account).delete_all
+      CanonicalEmailBlock.where(reference_account: @account).delete_all
 
       log_action :unblock_email, @account
 
diff --git a/app/models/canonical_email_block.rb b/app/models/canonical_email_block.rb
index c05eb9801..d09df6f5e 100644
--- a/app/models/canonical_email_block.rb
+++ b/app/models/canonical_email_block.rb
@@ -20,7 +20,6 @@ class CanonicalEmailBlock < ApplicationRecord
   validates :canonical_email_hash, presence: true, uniqueness: true
 
   scope :matching_email, ->(email) { where(canonical_email_hash: email_to_canonical_email_hash(email)) }
-  scope :matching_account, ->(account) { matching_email(account&.user_email).or(where(reference_account: account)) }
 
   def to_log_human_identifier
     canonical_email_hash
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index bcf7c0731..f148b9a08 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -30,7 +30,7 @@
 = render 'admin/accounts/counters', account: @account
 
 - if @account.local? && @account.user.nil?
-  = link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.matching_account(@account).exists?
+  = link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.exists?(reference_account_id: @account.id)
 - else
   .table-wrapper
     %table.table.inline-table
diff --git a/spec/fabricators/canonical_email_block_fabricator.rb b/spec/fabricators/canonical_email_block_fabricator.rb
index 2f979df79..1ef53ff4a 100644
--- a/spec/fabricators/canonical_email_block_fabricator.rb
+++ b/spec/fabricators/canonical_email_block_fabricator.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
 Fabricator(:canonical_email_block) do
-  email { |attrs| attrs[:reference_account] ? attrs[:reference_account].user_email : sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } }
+  email { sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } }
   reference_account { Fabricate.build(:account) }
 end

From 32223863a51472d929c57d22dbffc5d9c9fafa79 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Tue, 21 May 2024 15:17:34 +0200
Subject: [PATCH 169/215] Add coverage to `/admin/accounts/:id` (#30386)

---
 .../admin/accounts_controller_spec.rb         | 29 ++++++++++++++++---
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb
index b90bb414b..f241d261b 100644
--- a/spec/controllers/admin/accounts_controller_spec.rb
+++ b/spec/controllers/admin/accounts_controller_spec.rb
@@ -53,11 +53,32 @@ RSpec.describe Admin::AccountsController do
 
   describe 'GET #show' do
     let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
-    let(:account) { Fabricate(:account) }
 
-    it 'returns http success' do
-      get :show, params: { id: account.id }
-      expect(response).to have_http_status(200)
+    context 'with a remote account' do
+      let(:account) { Fabricate(:account, domain: 'example.com') }
+
+      it 'returns http success' do
+        get :show, params: { id: account.id }
+        expect(response).to have_http_status(200)
+      end
+    end
+
+    context 'with a local account' do
+      let(:account) { Fabricate(:account, domain: nil) }
+
+      it 'returns http success' do
+        get :show, params: { id: account.id }
+        expect(response).to have_http_status(200)
+      end
+    end
+
+    context 'with a local deleted account' do
+      let(:account) { Fabricate(:account, domain: nil, user: nil) }
+
+      it 'returns http success' do
+        get :show, params: { id: account.id }
+        expect(response).to have_http_status(200)
+      end
     end
   end
 

From cd0c5479362260082dbe1cbc42e364017853bbfc Mon Sep 17 00:00:00 2001
From: David Lapshin <ddaudix@gmail.com>
Date: Tue, 21 May 2024 18:24:51 +0300
Subject: [PATCH 170/215] Fix announcements icon rotating like settings one
 (#30388)

---
 app/javascript/styles/mastodon/components.scss | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index f377eed95..859c6e326 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -4372,7 +4372,7 @@ a.status-card {
       color: $primary-text-color;
     }
 
-    .icon {
+    .icon-sliders {
       transform: rotate(60deg);
     }
   }
@@ -4383,7 +4383,7 @@ a.status-card {
   }
 }
 
-.no-reduce-motion .column-header__button .icon {
+.no-reduce-motion .column-header__button .icon-sliders {
   transition: transform 150ms ease-in-out;
 }
 

From 6e67ca73f3b32bbac226b77f78acce52c525307b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 22 May 2024 09:35:27 +0200
Subject: [PATCH 171/215] fix(deps): update dependency axios to v1.7.2 (#30372)

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 2d27d1302..9d97b2f15 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5196,13 +5196,13 @@ __metadata:
   linkType: hard
 
 "axios@npm:^1.4.0":
-  version: 1.6.8
-  resolution: "axios@npm:1.6.8"
+  version: 1.7.2
+  resolution: "axios@npm:1.7.2"
   dependencies:
     follow-redirects: "npm:^1.15.6"
     form-data: "npm:^4.0.0"
     proxy-from-env: "npm:^1.1.0"
-  checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9
+  checksum: 10c0/cbd47ce380fe045313364e740bb03b936420b8b5558c7ea36a4563db1258c658f05e40feb5ddd41f6633fdd96d37ac2a76f884dad599c5b0224b4c451b3fa7ae
   languageName: node
   linkType: hard
 

From d9d4ba1b6f2756e819344b384d731c7722a931b5 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 22 May 2024 09:47:49 +0200
Subject: [PATCH 172/215] fix(deps): update dependency glob to v10.3.16
 (#30392)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 9d97b2f15..9f953bb78 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8936,17 +8936,17 @@ __metadata:
   linkType: hard
 
 "glob@npm:^10.2.2, glob@npm:^10.2.6, glob@npm:^10.3.10, glob@npm:^10.3.7":
-  version: 10.3.15
-  resolution: "glob@npm:10.3.15"
+  version: 10.3.16
+  resolution: "glob@npm:10.3.16"
   dependencies:
     foreground-child: "npm:^3.1.0"
-    jackspeak: "npm:^2.3.6"
+    jackspeak: "npm:^3.1.2"
     minimatch: "npm:^9.0.1"
     minipass: "npm:^7.0.4"
     path-scurry: "npm:^1.11.0"
   bin:
     glob: dist/esm/bin.mjs
-  checksum: 10c0/cda748ddc181b31b3df9548c0991800406d5cc3b3f8110e37a8751ec1e39f37cdae7d7782d5422d7df92775121cdf00599992dff22f7ff1260344843af227c2b
+  checksum: 10c0/f7eb4c3e66f221f0be3967c02527047167967549bdf8ed1bd5f6277d43a35191af4e2bb8c89f07a79664958bae088fd06659e69a0f1de462972f1eab52a715e8
   languageName: node
   linkType: hard
 
@@ -10407,16 +10407,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"jackspeak@npm:^2.3.6":
-  version: 2.3.6
-  resolution: "jackspeak@npm:2.3.6"
+"jackspeak@npm:^3.1.2":
+  version: 3.1.2
+  resolution: "jackspeak@npm:3.1.2"
   dependencies:
     "@isaacs/cliui": "npm:^8.0.2"
     "@pkgjs/parseargs": "npm:^0.11.0"
   dependenciesMeta:
     "@pkgjs/parseargs":
       optional: true
-  checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111
+  checksum: 10c0/5f1922a1ca0f19869e23f0dc4374c60d36e922f7926c76fecf8080cc6f7f798d6a9caac1b9428327d14c67731fd551bb3454cb270a5e13a0718f3b3660ec3d5d
   languageName: node
   linkType: hard
 

From a2b4c29c8fc8b7db163afffe1987fc4a41b574cb Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 22 May 2024 09:57:51 +0200
Subject: [PATCH 173/215] New Crowdin Translations (automated) (#30394)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/fil.json | 10 +++++++++-
 app/javascript/mastodon/locales/lv.json  |  4 ++--
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json
index 387727604..1f9b0496b 100644
--- a/app/javascript/mastodon/locales/fil.json
+++ b/app/javascript/mastodon/locales/fil.json
@@ -195,8 +195,9 @@
   "hashtag.column_header.tag_mode.all": "at {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
   "hashtag.column_settings.tag_mode.all": "Lahat ng nandito",
-  "hashtag.column_settings.tag_mode.any": "Ilan sa nandito",
+  "hashtag.column_settings.tag_mode.any": "Ilan dito",
   "hashtag.column_settings.tag_mode.none": "Wala dito",
+  "hashtags.and_other": "…at {count, plural, one {# iba pa} other {# na iba pa}}",
   "home.column_settings.show_replies": "Ipakita ang mga tugon",
   "home.pending_critical_update.body": "Mangyaring i-update ang iyong serbiro ng Mastodon sa lalong madaling panahon!",
   "interaction_modal.login.action": "Iuwi mo ako",
@@ -224,6 +225,7 @@
   "lists.replies_policy.title": "Ipakita ang mga tugon sa:",
   "lists.subheading": "Iyong mga talaan",
   "loading_indicator.label": "Kumakarga…",
+  "mute_modal.hide_from_notifications": "Itago mula sa mga abiso",
   "navigation_bar.about": "Tungkol dito",
   "navigation_bar.blocks": "Nakaharang na mga tagagamit",
   "navigation_bar.direct": "Mga palihim na banggit",
@@ -233,6 +235,7 @@
   "navigation_bar.follow_requests": "Mga hiling sa pagsunod",
   "navigation_bar.follows_and_followers": "Mga sinusundan at tagasunod",
   "navigation_bar.lists": "Mga listahan",
+  "navigation_bar.public_timeline": "Pinagsamang timeline",
   "navigation_bar.search": "Maghanap",
   "notification.admin.report": "Iniulat ni {name} si {target}",
   "notification.follow": "Sinundan ka ni {name}",
@@ -247,10 +250,12 @@
   "notifications.column_settings.alert": "Mga abiso sa Desktop",
   "notifications.column_settings.favourite": "Mga paborito:",
   "notifications.column_settings.follow": "Mga bagong tagasunod:",
+  "notifications.column_settings.poll": "Resulta ng botohan:",
   "notifications.column_settings.unread_notifications.category": "Hindi Nabasang mga Abiso",
   "notifications.column_settings.update": "Mga pagbago:",
   "notifications.filter.all": "Lahat",
   "notifications.filter.favourites": "Mga paborito",
+  "notifications.filter.polls": "Resulta ng botohan",
   "notifications.mark_as_read": "Markahan lahat ng abiso bilang nabasa na",
   "notifications.policy.filter_not_followers_title": "Mga taong hindi ka susundan",
   "notifications.policy.filter_not_following_title": "Mga taong hindi mo sinusundan",
@@ -294,10 +299,13 @@
   "report.thanks.title": "Ayaw mo bang makita ito?",
   "report.thanks.title_actionable": "Salamat sa pag-uulat, titingnan namin ito.",
   "report_notification.categories.other": "Iba pa",
+  "report_notification.categories.violation": "Paglabag sa patakaran",
+  "report_notification.open": "Buksan ang ulat",
   "search.quick_action.open_url": "Buksan ang URL sa Mastodon",
   "search.search_or_paste": "Maghanap o ilagay ang URL",
   "search_popout.full_text_search_disabled_message": "Hindi magagamit sa {domain}.",
   "search_popout.full_text_search_logged_out_message": "Magagamit lamang kapag naka-log in.",
+  "search_popout.recent": "Kamakailang mga paghahanap",
   "search_results.all": "Lahat",
   "search_results.see_all": "Ipakita lahat",
   "server_banner.learn_more": "Matuto nang higit pa",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 32ea6e47c..e7ab11490 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -90,7 +90,7 @@
   "attachments_list.unprocessed": "(neapstrādāti)",
   "audio.hide": "Slēpt audio",
   "block_modal.remote_users_caveat": "Mēs vaicāsim serverim {domain} ņemt vērā Tavu lēmumu. Tomēr atbilstība nav nodrošināta, jo atsevišķi serveri var apstrādāt bloķēšanu citādi. Publiski ieraksti joprojām var būt redzami lietotājiem, kuri nav pieteikušies.",
-  "block_modal.show_less": "Parādīt vairāk",
+  "block_modal.show_less": "Rādīt mazāk",
   "block_modal.show_more": "Parādīt mazāk",
   "boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu",
   "bundle_column_error.copy_stacktrace": "Kopēt kļūdu ziņojumu",
@@ -309,7 +309,7 @@
   "hashtag.counter_by_uses_today": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}} šodien",
   "hashtag.follow": "Sekot tēmturim",
   "hashtag.unfollow": "Pārstāt sekot tēmturim",
-  "hashtags.and_other": "..un {count, plural, other {# vairāk}}",
+  "hashtags.and_other": "… un {count, plural, other {vēl #}}",
   "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
   "home.column_settings.show_replies": "Rādīt atbildes",
   "home.hide_announcements": "Slēpt paziņojumus",

From 2c75cf85991bd0c22eaabe4ccd3bfb658ec59d32 Mon Sep 17 00:00:00 2001
From: Michael Stanclift <mx@vmstan.com>
Date: Wed, 22 May 2024 04:05:33 -0500
Subject: [PATCH 174/215] Add "Warning preset" link to admin navigation
 (#26199)

---
 config/locales/en-GB.yml | 2 +-
 config/locales/en.yml    | 2 +-
 config/navigation.rb     | 1 +
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
index 7e31080df..7cd888b37 100644
--- a/config/locales/en-GB.yml
+++ b/config/locales/en-GB.yml
@@ -950,7 +950,7 @@ en-GB:
       delete: Delete
       edit_preset: Edit warning preset
       empty: You haven't defined any warning presets yet.
-      title: Manage warning presets
+      title: Warning presets
     webhooks:
       add_new: Add endpoint
       delete: Delete
diff --git a/config/locales/en.yml b/config/locales/en.yml
index d3704bbbc..43aa8481c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -951,7 +951,7 @@ en:
       delete: Delete
       edit_preset: Edit warning preset
       empty: You haven't defined any warning presets yet.
-      title: Manage warning presets
+      title: Warning presets
     webhooks:
       add_new: Add endpoint
       delete: Delete
diff --git a/config/navigation.rb b/config/navigation.rb
index efac96d46..c1dd81501 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -59,6 +59,7 @@ SimpleNavigation::Configuration.run do |navigation|
       s.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_path, if: -> { current_user.can?(:view_dashboard) }
       s.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), admin_settings_path, if: -> { current_user.can?(:manage_settings) }, highlights_on: %r{/admin/settings}
       s.item :rules, safe_join([fa_icon('gavel fw'), t('admin.rules.title')]), admin_rules_path, highlights_on: %r{/admin/rules}, if: -> { current_user.can?(:manage_rules) }
+      s.item :warning_presets, safe_join([fa_icon('warning fw'), t('admin.warning_presets.title')]), admin_warning_presets_path, highlights_on: %r{/admin/warning_presets}, if: -> { current_user.can?(:manage_settings) }
       s.item :roles, safe_join([fa_icon('vcard fw'), t('admin.roles.title')]), admin_roles_path, highlights_on: %r{/admin/roles}, if: -> { current_user.can?(:manage_roles) }
       s.item :announcements, safe_join([fa_icon('bullhorn fw'), t('admin.announcements.title')]), admin_announcements_path, highlights_on: %r{/admin/announcements}, if: -> { current_user.can?(:manage_announcements) }
       s.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_path, highlights_on: %r{/admin/custom_emojis}, if: -> { current_user.can?(:manage_custom_emojis) }

From 2c5ab8f647841ea8075ece50ccc9e12c21af8720 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Wed, 22 May 2024 16:45:18 +0200
Subject: [PATCH 175/215] Remove the access token from Redux & context (#30275)

---
 .../mastodon/actions/account_notes.ts         |  4 +-
 app/javascript/mastodon/actions/accounts.js   | 64 +++++++++----------
 .../mastodon/actions/announcements.js         | 14 ++--
 app/javascript/mastodon/actions/blocks.js     |  6 +-
 app/javascript/mastodon/actions/bookmarks.js  |  4 +-
 app/javascript/mastodon/actions/compose.js    | 16 ++---
 .../mastodon/actions/conversations.js         | 10 +--
 .../mastodon/actions/custom_emojis.js         |  4 +-
 app/javascript/mastodon/actions/directory.js  |  6 +-
 .../mastodon/actions/domain_blocks.js         | 10 +--
 app/javascript/mastodon/actions/favourites.js |  4 +-
 .../mastodon/actions/featured_tags.js         |  2 +-
 app/javascript/mastodon/actions/filters.js    | 12 ++--
 app/javascript/mastodon/actions/history.js    |  2 +-
 .../mastodon/actions/interactions.js          | 44 ++++++-------
 app/javascript/mastodon/actions/lists.js      | 39 ++++++-----
 app/javascript/mastodon/actions/markers.ts    | 34 +++++-----
 app/javascript/mastodon/actions/mutes.js      |  6 +-
 .../mastodon/actions/notifications.js         | 32 +++++-----
 .../mastodon/actions/pin_statuses.js          |  4 +-
 app/javascript/mastodon/actions/polls.js      |  8 +--
 app/javascript/mastodon/actions/reports.js    |  4 +-
 app/javascript/mastodon/actions/search.js     |  6 +-
 app/javascript/mastodon/actions/server.js     | 10 +--
 app/javascript/mastodon/actions/statuses.js   | 22 +++----
 .../mastodon/actions/suggestions.js           |  8 +--
 app/javascript/mastodon/actions/tags.js       | 18 +++---
 app/javascript/mastodon/actions/timelines.js  |  2 +-
 app/javascript/mastodon/actions/trends.js     | 12 ++--
 app/javascript/mastodon/api.ts                | 22 ++-----
 app/javascript/mastodon/identity_context.tsx  |  4 --
 app/javascript/mastodon/initial_state.js      |  7 ++
 app/javascript/mastodon/reducers/meta.js      |  4 +-
 app/javascript/mastodon/stream.js             |  6 +-
 app/javascript/mastodon/test_helpers.tsx      |  1 -
 35 files changed, 225 insertions(+), 226 deletions(-)

diff --git a/app/javascript/mastodon/actions/account_notes.ts b/app/javascript/mastodon/actions/account_notes.ts
index e524e5235..acd9ecf41 100644
--- a/app/javascript/mastodon/actions/account_notes.ts
+++ b/app/javascript/mastodon/actions/account_notes.ts
@@ -5,8 +5,8 @@ import api from '../api';
 
 export const submitAccountNote = createAppAsyncThunk(
   'account_note/submit',
-  async (args: { id: string; value: string }, { getState }) => {
-    const response = await api(getState).post<ApiRelationshipJSON>(
+  async (args: { id: string; value: string }) => {
+    const response = await api().post<ApiRelationshipJSON>(
       `/api/v1/accounts/${args.id}/note`,
       {
         comment: args.value,
diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js
index 9f3bbba03..cea915e5f 100644
--- a/app/javascript/mastodon/actions/accounts.js
+++ b/app/javascript/mastodon/actions/accounts.js
@@ -76,11 +76,11 @@ export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL';
 export * from './accounts_typed';
 
 export function fetchAccount(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchRelationships([id]));
     dispatch(fetchAccountRequest(id));
 
-    api(getState).get(`/api/v1/accounts/${id}`).then(response => {
+    api().get(`/api/v1/accounts/${id}`).then(response => {
       dispatch(importFetchedAccount(response.data));
       dispatch(fetchAccountSuccess());
     }).catch(error => {
@@ -89,10 +89,10 @@ export function fetchAccount(id) {
   };
 }
 
-export const lookupAccount = acct => (dispatch, getState) => {
+export const lookupAccount = acct => (dispatch) => {
   dispatch(lookupAccountRequest(acct));
 
-  api(getState).get('/api/v1/accounts/lookup', { params: { acct } }).then(response => {
+  api().get('/api/v1/accounts/lookup', { params: { acct } }).then(response => {
     dispatch(fetchRelationships([response.data.id]));
     dispatch(importFetchedAccount(response.data));
     dispatch(lookupAccountSuccess());
@@ -146,7 +146,7 @@ export function followAccount(id, options = { reblogs: true }) {
 
     dispatch(followAccountRequest({ id, locked }));
 
-    api(getState).post(`/api/v1/accounts/${id}/follow`, options).then(response => {
+    api().post(`/api/v1/accounts/${id}/follow`, options).then(response => {
       dispatch(followAccountSuccess({relationship: response.data, alreadyFollowing}));
     }).catch(error => {
       dispatch(followAccountFail({ id, error, locked }));
@@ -158,7 +158,7 @@ export function unfollowAccount(id) {
   return (dispatch, getState) => {
     dispatch(unfollowAccountRequest(id));
 
-    api(getState).post(`/api/v1/accounts/${id}/unfollow`).then(response => {
+    api().post(`/api/v1/accounts/${id}/unfollow`).then(response => {
       dispatch(unfollowAccountSuccess({relationship: response.data, statuses: getState().get('statuses')}));
     }).catch(error => {
       dispatch(unfollowAccountFail({ id, error }));
@@ -170,7 +170,7 @@ export function blockAccount(id) {
   return (dispatch, getState) => {
     dispatch(blockAccountRequest(id));
 
-    api(getState).post(`/api/v1/accounts/${id}/block`).then(response => {
+    api().post(`/api/v1/accounts/${id}/block`).then(response => {
       // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers
       dispatch(blockAccountSuccess({ relationship: response.data, statuses: getState().get('statuses') }));
     }).catch(error => {
@@ -180,10 +180,10 @@ export function blockAccount(id) {
 }
 
 export function unblockAccount(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unblockAccountRequest(id));
 
-    api(getState).post(`/api/v1/accounts/${id}/unblock`).then(response => {
+    api().post(`/api/v1/accounts/${id}/unblock`).then(response => {
       dispatch(unblockAccountSuccess({ relationship: response.data }));
     }).catch(error => {
       dispatch(unblockAccountFail({ id, error }));
@@ -223,7 +223,7 @@ export function muteAccount(id, notifications, duration=0) {
   return (dispatch, getState) => {
     dispatch(muteAccountRequest(id));
 
-    api(getState).post(`/api/v1/accounts/${id}/mute`, { notifications, duration }).then(response => {
+    api().post(`/api/v1/accounts/${id}/mute`, { notifications, duration }).then(response => {
       // Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers
       dispatch(muteAccountSuccess({ relationship: response.data, statuses: getState().get('statuses') }));
     }).catch(error => {
@@ -233,10 +233,10 @@ export function muteAccount(id, notifications, duration=0) {
 }
 
 export function unmuteAccount(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unmuteAccountRequest(id));
 
-    api(getState).post(`/api/v1/accounts/${id}/unmute`).then(response => {
+    api().post(`/api/v1/accounts/${id}/unmute`).then(response => {
       dispatch(unmuteAccountSuccess({ relationship: response.data }));
     }).catch(error => {
       dispatch(unmuteAccountFail({ id, error }));
@@ -274,10 +274,10 @@ export function unmuteAccountFail(error) {
 
 
 export function fetchFollowers(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchFollowersRequest(id));
 
-    api(getState).get(`/api/v1/accounts/${id}/followers`).then(response => {
+    api().get(`/api/v1/accounts/${id}/followers`).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data));
@@ -324,7 +324,7 @@ export function expandFollowers(id) {
 
     dispatch(expandFollowersRequest(id));
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data));
@@ -361,10 +361,10 @@ export function expandFollowersFail(id, error) {
 }
 
 export function fetchFollowing(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchFollowingRequest(id));
 
-    api(getState).get(`/api/v1/accounts/${id}/following`).then(response => {
+    api().get(`/api/v1/accounts/${id}/following`).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data));
@@ -411,7 +411,7 @@ export function expandFollowing(id) {
 
     dispatch(expandFollowingRequest(id));
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data));
@@ -460,7 +460,7 @@ export function fetchRelationships(accountIds) {
 
     dispatch(fetchRelationshipsRequest(newAccountIds));
 
-    api(getState).get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
+    api().get(`/api/v1/accounts/relationships?with_suspended=true&${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
       dispatch(fetchRelationshipsSuccess({ relationships: response.data }));
     }).catch(error => {
       dispatch(fetchRelationshipsFail(error));
@@ -486,10 +486,10 @@ export function fetchRelationshipsFail(error) {
 }
 
 export function fetchFollowRequests() {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchFollowRequestsRequest());
 
-    api(getState).get('/api/v1/follow_requests').then(response => {
+    api().get('/api/v1/follow_requests').then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null));
@@ -528,7 +528,7 @@ export function expandFollowRequests() {
 
     dispatch(expandFollowRequestsRequest());
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null));
@@ -558,10 +558,10 @@ export function expandFollowRequestsFail(error) {
 }
 
 export function authorizeFollowRequest(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(authorizeFollowRequestRequest(id));
 
-    api(getState)
+    api()
       .post(`/api/v1/follow_requests/${id}/authorize`)
       .then(() => dispatch(authorizeFollowRequestSuccess({ id })))
       .catch(error => dispatch(authorizeFollowRequestFail(id, error)));
@@ -585,10 +585,10 @@ export function authorizeFollowRequestFail(id, error) {
 
 
 export function rejectFollowRequest(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(rejectFollowRequestRequest(id));
 
-    api(getState)
+    api()
       .post(`/api/v1/follow_requests/${id}/reject`)
       .then(() => dispatch(rejectFollowRequestSuccess({ id })))
       .catch(error => dispatch(rejectFollowRequestFail(id, error)));
@@ -611,10 +611,10 @@ export function rejectFollowRequestFail(id, error) {
 }
 
 export function pinAccount(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(pinAccountRequest(id));
 
-    api(getState).post(`/api/v1/accounts/${id}/pin`).then(response => {
+    api().post(`/api/v1/accounts/${id}/pin`).then(response => {
       dispatch(pinAccountSuccess({ relationship: response.data }));
     }).catch(error => {
       dispatch(pinAccountFail(error));
@@ -623,10 +623,10 @@ export function pinAccount(id) {
 }
 
 export function unpinAccount(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unpinAccountRequest(id));
 
-    api(getState).post(`/api/v1/accounts/${id}/unpin`).then(response => {
+    api().post(`/api/v1/accounts/${id}/unpin`).then(response => {
       dispatch(unpinAccountSuccess({ relationship: response.data }));
     }).catch(error => {
       dispatch(unpinAccountFail(error));
@@ -662,7 +662,7 @@ export function unpinAccountFail(error) {
   };
 }
 
-export const updateAccount = ({ displayName, note, avatar, header, discoverable, indexable }) => (dispatch, getState) => {
+export const updateAccount = ({ displayName, note, avatar, header, discoverable, indexable }) => (dispatch) => {
   const data = new FormData();
 
   data.append('display_name', displayName);
@@ -672,7 +672,7 @@ export const updateAccount = ({ displayName, note, avatar, header, discoverable,
   data.append('discoverable', discoverable);
   data.append('indexable', indexable);
 
-  return api(getState).patch('/api/v1/accounts/update_credentials', data).then(response => {
+  return api().patch('/api/v1/accounts/update_credentials', data).then(response => {
     dispatch(importFetchedAccount(response.data));
   });
 };
diff --git a/app/javascript/mastodon/actions/announcements.js b/app/javascript/mastodon/actions/announcements.js
index 339c5f3ad..7657b05dc 100644
--- a/app/javascript/mastodon/actions/announcements.js
+++ b/app/javascript/mastodon/actions/announcements.js
@@ -26,10 +26,10 @@ export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW';
 
 const noOp = () => {};
 
-export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => {
+export const fetchAnnouncements = (done = noOp) => (dispatch) => {
   dispatch(fetchAnnouncementsRequest());
 
-  api(getState).get('/api/v1/announcements').then(response => {
+  api().get('/api/v1/announcements').then(response => {
     dispatch(fetchAnnouncementsSuccess(response.data.map(x => normalizeAnnouncement(x))));
   }).catch(error => {
     dispatch(fetchAnnouncementsFail(error));
@@ -61,10 +61,10 @@ export const updateAnnouncements = announcement => ({
   announcement: normalizeAnnouncement(announcement),
 });
 
-export const dismissAnnouncement = announcementId => (dispatch, getState) => {
+export const dismissAnnouncement = announcementId => (dispatch) => {
   dispatch(dismissAnnouncementRequest(announcementId));
 
-  api(getState).post(`/api/v1/announcements/${announcementId}/dismiss`).then(() => {
+  api().post(`/api/v1/announcements/${announcementId}/dismiss`).then(() => {
     dispatch(dismissAnnouncementSuccess(announcementId));
   }).catch(error => {
     dispatch(dismissAnnouncementFail(announcementId, error));
@@ -103,7 +103,7 @@ export const addReaction = (announcementId, name) => (dispatch, getState) => {
     dispatch(addReactionRequest(announcementId, name, alreadyAdded));
   }
 
-  api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
+  api().put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
     dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
   }).catch(err => {
     if (!alreadyAdded) {
@@ -134,10 +134,10 @@ export const addReactionFail = (announcementId, name, error) => ({
   skipLoading: true,
 });
 
-export const removeReaction = (announcementId, name) => (dispatch, getState) => {
+export const removeReaction = (announcementId, name) => (dispatch) => {
   dispatch(removeReactionRequest(announcementId, name));
 
-  api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
+  api().delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
     dispatch(removeReactionSuccess(announcementId, name));
   }).catch(err => {
     dispatch(removeReactionFail(announcementId, name, err));
diff --git a/app/javascript/mastodon/actions/blocks.js b/app/javascript/mastodon/actions/blocks.js
index 54296d090..5c66e27be 100644
--- a/app/javascript/mastodon/actions/blocks.js
+++ b/app/javascript/mastodon/actions/blocks.js
@@ -13,10 +13,10 @@ export const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS';
 export const BLOCKS_EXPAND_FAIL    = 'BLOCKS_EXPAND_FAIL';
 
 export function fetchBlocks() {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchBlocksRequest());
 
-    api(getState).get('/api/v1/blocks').then(response => {
+    api().get('/api/v1/blocks').then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(fetchBlocksSuccess(response.data, next ? next.uri : null));
@@ -56,7 +56,7 @@ export function expandBlocks() {
 
     dispatch(expandBlocksRequest());
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(expandBlocksSuccess(response.data, next ? next.uri : null));
diff --git a/app/javascript/mastodon/actions/bookmarks.js b/app/javascript/mastodon/actions/bookmarks.js
index 0b16f61e6..89716b224 100644
--- a/app/javascript/mastodon/actions/bookmarks.js
+++ b/app/javascript/mastodon/actions/bookmarks.js
@@ -18,7 +18,7 @@ export function fetchBookmarkedStatuses() {
 
     dispatch(fetchBookmarkedStatusesRequest());
 
-    api(getState).get('/api/v1/bookmarks').then(response => {
+    api().get('/api/v1/bookmarks').then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedStatuses(response.data));
       dispatch(fetchBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
@@ -59,7 +59,7 @@ export function expandBookmarkedStatuses() {
 
     dispatch(expandBookmarkedStatusesRequest());
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedStatuses(response.data));
       dispatch(expandBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 7477e45e5..b07dff182 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -196,7 +196,7 @@ export function submitCompose(routerHistory) {
       });
     }
 
-    api(getState).request({
+    api().request({
       url: statusId === null ? '/api/v1/statuses' : `/api/v1/statuses/${statusId}`,
       method: statusId === null ? 'post' : 'put',
       data: {
@@ -304,7 +304,7 @@ export function uploadCompose(files) {
       const data = new FormData();
       data.append('file', file);
 
-      api(getState).post('/api/v2/media', data, {
+      api().post('/api/v2/media', data, {
         onUploadProgress: function({ loaded }){
           progress[i] = loaded;
           dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
@@ -321,7 +321,7 @@ export function uploadCompose(files) {
           let tryCount = 1;
 
           const poll = () => {
-            api(getState).get(`/api/v1/media/${data.id}`).then(response => {
+            api().get(`/api/v1/media/${data.id}`).then(response => {
               if (response.status === 200) {
                 dispatch(uploadComposeSuccess(response.data, file));
               } else if (response.status === 206) {
@@ -343,7 +343,7 @@ export const uploadComposeProcessing = () => ({
   type: COMPOSE_UPLOAD_PROCESSING,
 });
 
-export const uploadThumbnail = (id, file) => (dispatch, getState) => {
+export const uploadThumbnail = (id, file) => (dispatch) => {
   dispatch(uploadThumbnailRequest());
 
   const total = file.size;
@@ -351,7 +351,7 @@ export const uploadThumbnail = (id, file) => (dispatch, getState) => {
 
   data.append('thumbnail', file);
 
-  api(getState).put(`/api/v1/media/${id}`, data, {
+  api().put(`/api/v1/media/${id}`, data, {
     onUploadProgress: ({ loaded }) => {
       dispatch(uploadThumbnailProgress(loaded, total));
     },
@@ -434,7 +434,7 @@ export function changeUploadCompose(id, params) {
 
       dispatch(changeUploadComposeSuccess(data, true));
     } else {
-      api(getState).put(`/api/v1/media/${id}`, params).then(response => {
+      api().put(`/api/v1/media/${id}`, params).then(response => {
         dispatch(changeUploadComposeSuccess(response.data, false));
       }).catch(error => {
         dispatch(changeUploadComposeFail(id, error));
@@ -522,7 +522,7 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) =>
 
   fetchComposeSuggestionsAccountsController = new AbortController();
 
-  api(getState).get('/api/v1/accounts/search', {
+  api().get('/api/v1/accounts/search', {
     signal: fetchComposeSuggestionsAccountsController.signal,
 
     params: {
@@ -556,7 +556,7 @@ const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => {
 
   fetchComposeSuggestionsTagsController = new AbortController();
 
-  api(getState).get('/api/v2/search', {
+  api().get('/api/v2/search', {
     signal: fetchComposeSuggestionsTagsController.signal,
 
     params: {
diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js
index 8c4c4529f..03174c485 100644
--- a/app/javascript/mastodon/actions/conversations.js
+++ b/app/javascript/mastodon/actions/conversations.js
@@ -28,13 +28,13 @@ export const unmountConversations = () => ({
   type: CONVERSATIONS_UNMOUNT,
 });
 
-export const markConversationRead = conversationId => (dispatch, getState) => {
+export const markConversationRead = conversationId => (dispatch) => {
   dispatch({
     type: CONVERSATIONS_READ,
     id: conversationId,
   });
 
-  api(getState).post(`/api/v1/conversations/${conversationId}/read`);
+  api().post(`/api/v1/conversations/${conversationId}/read`);
 };
 
 export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => {
@@ -48,7 +48,7 @@ export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => {
 
   const isLoadingRecent = !!params.since_id;
 
-  api(getState).get('/api/v1/conversations', { params })
+  api().get('/api/v1/conversations', { params })
     .then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
@@ -88,10 +88,10 @@ export const updateConversations = conversation => dispatch => {
   });
 };
 
-export const deleteConversation = conversationId => (dispatch, getState) => {
+export const deleteConversation = conversationId => (dispatch) => {
   dispatch(deleteConversationRequest(conversationId));
 
-  api(getState).delete(`/api/v1/conversations/${conversationId}`)
+  api().delete(`/api/v1/conversations/${conversationId}`)
     .then(() => dispatch(deleteConversationSuccess(conversationId)))
     .catch(error => dispatch(deleteConversationFail(conversationId, error)));
 };
diff --git a/app/javascript/mastodon/actions/custom_emojis.js b/app/javascript/mastodon/actions/custom_emojis.js
index 9ec8156b1..fb65f072d 100644
--- a/app/javascript/mastodon/actions/custom_emojis.js
+++ b/app/javascript/mastodon/actions/custom_emojis.js
@@ -5,10 +5,10 @@ export const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS';
 export const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL';
 
 export function fetchCustomEmojis() {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchCustomEmojisRequest());
 
-    api(getState).get('/api/v1/custom_emojis').then(response => {
+    api().get('/api/v1/custom_emojis').then(response => {
       dispatch(fetchCustomEmojisSuccess(response.data));
     }).catch(error => {
       dispatch(fetchCustomEmojisFail(error));
diff --git a/app/javascript/mastodon/actions/directory.js b/app/javascript/mastodon/actions/directory.js
index cda63f2b5..7a0748029 100644
--- a/app/javascript/mastodon/actions/directory.js
+++ b/app/javascript/mastodon/actions/directory.js
@@ -11,10 +11,10 @@ export const DIRECTORY_EXPAND_REQUEST = 'DIRECTORY_EXPAND_REQUEST';
 export const DIRECTORY_EXPAND_SUCCESS = 'DIRECTORY_EXPAND_SUCCESS';
 export const DIRECTORY_EXPAND_FAIL    = 'DIRECTORY_EXPAND_FAIL';
 
-export const fetchDirectory = params => (dispatch, getState) => {
+export const fetchDirectory = params => (dispatch) => {
   dispatch(fetchDirectoryRequest());
 
-  api(getState).get('/api/v1/directory', { params: { ...params, limit: 20 } }).then(({ data }) => {
+  api().get('/api/v1/directory', { params: { ...params, limit: 20 } }).then(({ data }) => {
     dispatch(importFetchedAccounts(data));
     dispatch(fetchDirectorySuccess(data));
     dispatch(fetchRelationships(data.map(x => x.id)));
@@ -40,7 +40,7 @@ export const expandDirectory = params => (dispatch, getState) => {
 
   const loadedItems = getState().getIn(['user_lists', 'directory', 'items']).size;
 
-  api(getState).get('/api/v1/directory', { params: { ...params, offset: loadedItems, limit: 20 } }).then(({ data }) => {
+  api().get('/api/v1/directory', { params: { ...params, offset: loadedItems, limit: 20 } }).then(({ data }) => {
     dispatch(importFetchedAccounts(data));
     dispatch(expandDirectorySuccess(data));
     dispatch(fetchRelationships(data.map(x => x.id)));
diff --git a/app/javascript/mastodon/actions/domain_blocks.js b/app/javascript/mastodon/actions/domain_blocks.js
index 55c0a6ce9..727f800af 100644
--- a/app/javascript/mastodon/actions/domain_blocks.js
+++ b/app/javascript/mastodon/actions/domain_blocks.js
@@ -24,7 +24,7 @@ export function blockDomain(domain) {
   return (dispatch, getState) => {
     dispatch(blockDomainRequest(domain));
 
-    api(getState).post('/api/v1/domain_blocks', { domain }).then(() => {
+    api().post('/api/v1/domain_blocks', { domain }).then(() => {
       const at_domain = '@' + domain;
       const accounts = getState().get('accounts').filter(item => item.get('acct').endsWith(at_domain)).valueSeq().map(item => item.get('id'));
 
@@ -54,7 +54,7 @@ export function unblockDomain(domain) {
   return (dispatch, getState) => {
     dispatch(unblockDomainRequest(domain));
 
-    api(getState).delete('/api/v1/domain_blocks', { params: { domain } }).then(() => {
+    api().delete('/api/v1/domain_blocks', { params: { domain } }).then(() => {
       const at_domain = '@' + domain;
       const accounts = getState().get('accounts').filter(item => item.get('acct').endsWith(at_domain)).valueSeq().map(item => item.get('id'));
       dispatch(unblockDomainSuccess({ domain, accounts }));
@@ -80,10 +80,10 @@ export function unblockDomainFail(domain, error) {
 }
 
 export function fetchDomainBlocks() {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchDomainBlocksRequest());
 
-    api(getState).get('/api/v1/domain_blocks').then(response => {
+    api().get('/api/v1/domain_blocks').then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(fetchDomainBlocksSuccess(response.data, next ? next.uri : null));
     }).catch(err => {
@@ -123,7 +123,7 @@ export function expandDomainBlocks() {
 
     dispatch(expandDomainBlocksRequest());
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(expandDomainBlocksSuccess(response.data, next ? next.uri : null));
     }).catch(err => {
diff --git a/app/javascript/mastodon/actions/favourites.js b/app/javascript/mastodon/actions/favourites.js
index 2d4d4e620..ff475c82b 100644
--- a/app/javascript/mastodon/actions/favourites.js
+++ b/app/javascript/mastodon/actions/favourites.js
@@ -18,7 +18,7 @@ export function fetchFavouritedStatuses() {
 
     dispatch(fetchFavouritedStatusesRequest());
 
-    api(getState).get('/api/v1/favourites').then(response => {
+    api().get('/api/v1/favourites').then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedStatuses(response.data));
       dispatch(fetchFavouritedStatusesSuccess(response.data, next ? next.uri : null));
@@ -62,7 +62,7 @@ export function expandFavouritedStatuses() {
 
     dispatch(expandFavouritedStatusesRequest());
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedStatuses(response.data));
       dispatch(expandFavouritedStatusesSuccess(response.data, next ? next.uri : null));
diff --git a/app/javascript/mastodon/actions/featured_tags.js b/app/javascript/mastodon/actions/featured_tags.js
index 18bb61539..6ee4dee2b 100644
--- a/app/javascript/mastodon/actions/featured_tags.js
+++ b/app/javascript/mastodon/actions/featured_tags.js
@@ -11,7 +11,7 @@ export const fetchFeaturedTags = (id) => (dispatch, getState) => {
 
   dispatch(fetchFeaturedTagsRequest(id));
 
-  api(getState).get(`/api/v1/accounts/${id}/featured_tags`)
+  api().get(`/api/v1/accounts/${id}/featured_tags`)
     .then(({ data }) => dispatch(fetchFeaturedTagsSuccess(id, data)))
     .catch(err => dispatch(fetchFeaturedTagsFail(id, err)));
 };
diff --git a/app/javascript/mastodon/actions/filters.js b/app/javascript/mastodon/actions/filters.js
index a11956ac5..588e390f0 100644
--- a/app/javascript/mastodon/actions/filters.js
+++ b/app/javascript/mastodon/actions/filters.js
@@ -23,13 +23,13 @@ export const initAddFilter = (status, { contextType }) => dispatch =>
     },
   }));
 
-export const fetchFilters = () => (dispatch, getState) => {
+export const fetchFilters = () => (dispatch) => {
   dispatch({
     type: FILTERS_FETCH_REQUEST,
     skipLoading: true,
   });
 
-  api(getState)
+  api()
     .get('/api/v2/filters')
     .then(({ data }) => dispatch({
       type: FILTERS_FETCH_SUCCESS,
@@ -44,10 +44,10 @@ export const fetchFilters = () => (dispatch, getState) => {
     }));
 };
 
-export const createFilterStatus = (params, onSuccess, onFail) => (dispatch, getState) => {
+export const createFilterStatus = (params, onSuccess, onFail) => (dispatch) => {
   dispatch(createFilterStatusRequest());
 
-  api(getState).post(`/api/v2/filters/${params.filter_id}/statuses`, params).then(response => {
+  api().post(`/api/v2/filters/${params.filter_id}/statuses`, params).then(response => {
     dispatch(createFilterStatusSuccess(response.data));
     if (onSuccess) onSuccess();
   }).catch(error => {
@@ -70,10 +70,10 @@ export const createFilterStatusFail = error => ({
   error,
 });
 
-export const createFilter = (params, onSuccess, onFail) => (dispatch, getState) => {
+export const createFilter = (params, onSuccess, onFail) => (dispatch) => {
   dispatch(createFilterRequest());
 
-  api(getState).post('/api/v2/filters', params).then(response => {
+  api().post('/api/v2/filters', params).then(response => {
     dispatch(createFilterSuccess(response.data));
     if (onSuccess) onSuccess(response.data);
   }).catch(error => {
diff --git a/app/javascript/mastodon/actions/history.js b/app/javascript/mastodon/actions/history.js
index 52401b7dc..07732ea18 100644
--- a/app/javascript/mastodon/actions/history.js
+++ b/app/javascript/mastodon/actions/history.js
@@ -15,7 +15,7 @@ export const fetchHistory = statusId => (dispatch, getState) => {
 
   dispatch(fetchHistoryRequest(statusId));
 
-  api(getState).get(`/api/v1/statuses/${statusId}/history`).then(({ data }) => {
+  api().get(`/api/v1/statuses/${statusId}/history`).then(({ data }) => {
     dispatch(importFetchedAccounts(data.map(x => x.account)));
     dispatch(fetchHistorySuccess(statusId, data));
   }).catch(error => dispatch(fetchHistoryFail(error)));
diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js
index 7d0144438..fe7c911b6 100644
--- a/app/javascript/mastodon/actions/interactions.js
+++ b/app/javascript/mastodon/actions/interactions.js
@@ -52,10 +52,10 @@ export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS';
 export const UNBOOKMARK_FAIL    = 'UNBOOKMARKED_FAIL';
 
 export function reblog(status, visibility) {
-  return function (dispatch, getState) {
+  return function (dispatch) {
     dispatch(reblogRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`, { visibility }).then(function (response) {
+    api().post(`/api/v1/statuses/${status.get('id')}/reblog`, { visibility }).then(function (response) {
       // The reblog API method returns a new status wrapped around the original. In this case we are only
       // interested in how the original is modified, hence passing it skipping the wrapper
       dispatch(importFetchedStatus(response.data.reblog));
@@ -67,10 +67,10 @@ export function reblog(status, visibility) {
 }
 
 export function unreblog(status) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unreblogRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => {
+    api().post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => {
       dispatch(importFetchedStatus(response.data));
       dispatch(unreblogSuccess(status));
     }).catch(error => {
@@ -130,10 +130,10 @@ export function unreblogFail(status, error) {
 }
 
 export function favourite(status) {
-  return function (dispatch, getState) {
+  return function (dispatch) {
     dispatch(favouriteRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) {
+    api().post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) {
       dispatch(importFetchedStatus(response.data));
       dispatch(favouriteSuccess(status));
     }).catch(function (error) {
@@ -143,10 +143,10 @@ export function favourite(status) {
 }
 
 export function unfavourite(status) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unfavouriteRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => {
+    api().post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => {
       dispatch(importFetchedStatus(response.data));
       dispatch(unfavouriteSuccess(status));
     }).catch(error => {
@@ -206,10 +206,10 @@ export function unfavouriteFail(status, error) {
 }
 
 export function bookmark(status) {
-  return function (dispatch, getState) {
+  return function (dispatch) {
     dispatch(bookmarkRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function (response) {
+    api().post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function (response) {
       dispatch(importFetchedStatus(response.data));
       dispatch(bookmarkSuccess(status, response.data));
     }).catch(function (error) {
@@ -219,10 +219,10 @@ export function bookmark(status) {
 }
 
 export function unbookmark(status) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unbookmarkRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => {
+    api().post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => {
       dispatch(importFetchedStatus(response.data));
       dispatch(unbookmarkSuccess(status, response.data));
     }).catch(error => {
@@ -278,10 +278,10 @@ export function unbookmarkFail(status, error) {
 }
 
 export function fetchReblogs(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchReblogsRequest(id));
 
-    api(getState).get(`/api/v1/statuses/${id}/reblogged_by`).then(response => {
+    api().get(`/api/v1/statuses/${id}/reblogged_by`).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(fetchReblogsSuccess(id, response.data, next ? next.uri : null));
@@ -325,7 +325,7 @@ export function expandReblogs(id) {
 
     dispatch(expandReblogsRequest(id));
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data));
@@ -360,10 +360,10 @@ export function expandReblogsFail(id, error) {
 }
 
 export function fetchFavourites(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchFavouritesRequest(id));
 
-    api(getState).get(`/api/v1/statuses/${id}/favourited_by`).then(response => {
+    api().get(`/api/v1/statuses/${id}/favourited_by`).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(fetchFavouritesSuccess(id, response.data, next ? next.uri : null));
@@ -407,7 +407,7 @@ export function expandFavourites(id) {
 
     dispatch(expandFavouritesRequest(id));
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data));
@@ -442,10 +442,10 @@ export function expandFavouritesFail(id, error) {
 }
 
 export function pin(status) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(pinRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/pin`).then(response => {
+    api().post(`/api/v1/statuses/${status.get('id')}/pin`).then(response => {
       dispatch(importFetchedStatus(response.data));
       dispatch(pinSuccess(status));
     }).catch(error => {
@@ -480,10 +480,10 @@ export function pinFail(status, error) {
 }
 
 export function unpin (status) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unpinRequest(status));
 
-    api(getState).post(`/api/v1/statuses/${status.get('id')}/unpin`).then(response => {
+    api().post(`/api/v1/statuses/${status.get('id')}/unpin`).then(response => {
       dispatch(importFetchedStatus(response.data));
       dispatch(unpinSuccess(status));
     }).catch(error => {
diff --git a/app/javascript/mastodon/actions/lists.js b/app/javascript/mastodon/actions/lists.js
index b0789cd42..995605938 100644
--- a/app/javascript/mastodon/actions/lists.js
+++ b/app/javascript/mastodon/actions/lists.js
@@ -57,7 +57,7 @@ export const fetchList = id => (dispatch, getState) => {
 
   dispatch(fetchListRequest(id));
 
-  api(getState).get(`/api/v1/lists/${id}`)
+  api().get(`/api/v1/lists/${id}`)
     .then(({ data }) => dispatch(fetchListSuccess(data)))
     .catch(err => dispatch(fetchListFail(id, err)));
 };
@@ -78,10 +78,10 @@ export const fetchListFail = (id, error) => ({
   error,
 });
 
-export const fetchLists = () => (dispatch, getState) => {
+export const fetchLists = () => (dispatch) => {
   dispatch(fetchListsRequest());
 
-  api(getState).get('/api/v1/lists')
+  api().get('/api/v1/lists')
     .then(({ data }) => dispatch(fetchListsSuccess(data)))
     .catch(err => dispatch(fetchListsFail(err)));
 };
@@ -125,10 +125,10 @@ export const changeListEditorTitle = value => ({
   value,
 });
 
-export const createList = (title, shouldReset) => (dispatch, getState) => {
+export const createList = (title, shouldReset) => (dispatch) => {
   dispatch(createListRequest());
 
-  api(getState).post('/api/v1/lists', { title }).then(({ data }) => {
+  api().post('/api/v1/lists', { title }).then(({ data }) => {
     dispatch(createListSuccess(data));
 
     if (shouldReset) {
@@ -151,10 +151,10 @@ export const createListFail = error => ({
   error,
 });
 
-export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch, getState) => {
+export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch) => {
   dispatch(updateListRequest(id));
 
-  api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => {
+  api().put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => {
     dispatch(updateListSuccess(data));
 
     if (shouldReset) {
@@ -183,10 +183,10 @@ export const resetListEditor = () => ({
   type: LIST_EDITOR_RESET,
 });
 
-export const deleteList = id => (dispatch, getState) => {
+export const deleteList = id => (dispatch) => {
   dispatch(deleteListRequest(id));
 
-  api(getState).delete(`/api/v1/lists/${id}`)
+  api().delete(`/api/v1/lists/${id}`)
     .then(() => dispatch(deleteListSuccess(id)))
     .catch(err => dispatch(deleteListFail(id, err)));
 };
@@ -207,10 +207,10 @@ export const deleteListFail = (id, error) => ({
   error,
 });
 
-export const fetchListAccounts = listId => (dispatch, getState) => {
+export const fetchListAccounts = listId => (dispatch) => {
   dispatch(fetchListAccountsRequest(listId));
 
-  api(getState).get(`/api/v1/lists/${listId}/accounts`, { params: { limit: 0 } }).then(({ data }) => {
+  api().get(`/api/v1/lists/${listId}/accounts`, { params: { limit: 0 } }).then(({ data }) => {
     dispatch(importFetchedAccounts(data));
     dispatch(fetchListAccountsSuccess(listId, data));
   }).catch(err => dispatch(fetchListAccountsFail(listId, err)));
@@ -234,7 +234,7 @@ export const fetchListAccountsFail = (id, error) => ({
   error,
 });
 
-export const fetchListSuggestions = q => (dispatch, getState) => {
+export const fetchListSuggestions = q => (dispatch) => {
   const params = {
     q,
     resolve: false,
@@ -242,7 +242,7 @@ export const fetchListSuggestions = q => (dispatch, getState) => {
     following: true,
   };
 
-  api(getState).get('/api/v1/accounts/search', { params }).then(({ data }) => {
+  api().get('/api/v1/accounts/search', { params }).then(({ data }) => {
     dispatch(importFetchedAccounts(data));
     dispatch(fetchListSuggestionsReady(q, data));
   }).catch(error => dispatch(showAlertForError(error)));
@@ -267,10 +267,10 @@ export const addToListEditor = accountId => (dispatch, getState) => {
   dispatch(addToList(getState().getIn(['listEditor', 'listId']), accountId));
 };
 
-export const addToList = (listId, accountId) => (dispatch, getState) => {
+export const addToList = (listId, accountId) => (dispatch) => {
   dispatch(addToListRequest(listId, accountId));
 
-  api(getState).post(`/api/v1/lists/${listId}/accounts`, { account_ids: [accountId] })
+  api().post(`/api/v1/lists/${listId}/accounts`, { account_ids: [accountId] })
     .then(() => dispatch(addToListSuccess(listId, accountId)))
     .catch(err => dispatch(addToListFail(listId, accountId, err)));
 };
@@ -298,10 +298,10 @@ export const removeFromListEditor = accountId => (dispatch, getState) => {
   dispatch(removeFromList(getState().getIn(['listEditor', 'listId']), accountId));
 };
 
-export const removeFromList = (listId, accountId) => (dispatch, getState) => {
+export const removeFromList = (listId, accountId) => (dispatch) => {
   dispatch(removeFromListRequest(listId, accountId));
 
-  api(getState).delete(`/api/v1/lists/${listId}/accounts`, { params: { account_ids: [accountId] } })
+  api().delete(`/api/v1/lists/${listId}/accounts`, { params: { account_ids: [accountId] } })
     .then(() => dispatch(removeFromListSuccess(listId, accountId)))
     .catch(err => dispatch(removeFromListFail(listId, accountId, err)));
 };
@@ -338,10 +338,10 @@ export const setupListAdder = accountId => (dispatch, getState) => {
   dispatch(fetchAccountLists(accountId));
 };
 
-export const fetchAccountLists = accountId => (dispatch, getState) => {
+export const fetchAccountLists = accountId => (dispatch) => {
   dispatch(fetchAccountListsRequest(accountId));
 
-  api(getState).get(`/api/v1/accounts/${accountId}/lists`)
+  api().get(`/api/v1/accounts/${accountId}/lists`)
     .then(({ data }) => dispatch(fetchAccountListsSuccess(accountId, data)))
     .catch(err => dispatch(fetchAccountListsFail(accountId, err)));
 };
@@ -370,4 +370,3 @@ export const addToListAdder = listId => (dispatch, getState) => {
 export const removeFromListAdder = listId => (dispatch, getState) => {
   dispatch(removeFromList(listId, getState().getIn(['listAdder', 'accountId'])));
 };
-
diff --git a/app/javascript/mastodon/actions/markers.ts b/app/javascript/mastodon/actions/markers.ts
index 91f78ee28..03f577c54 100644
--- a/app/javascript/mastodon/actions/markers.ts
+++ b/app/javascript/mastodon/actions/markers.ts
@@ -1,19 +1,24 @@
 import { debounce } from 'lodash';
 
 import type { MarkerJSON } from 'mastodon/api_types/markers';
+import { getAccessToken } from 'mastodon/initial_state';
 import type { AppDispatch, RootState } from 'mastodon/store';
 import { createAppAsyncThunk } from 'mastodon/store/typed_functions';
 
-import api, { authorizationTokenFromState } from '../api';
+import api from '../api';
 import { compareId } from '../compare_id';
 
 export const synchronouslySubmitMarkers = createAppAsyncThunk(
   'markers/submit',
   async (_args, { getState }) => {
-    const accessToken = authorizationTokenFromState(getState);
+    const accessToken = getAccessToken();
     const params = buildPostMarkersParams(getState());
 
-    if (Object.keys(params).length === 0 || !accessToken) {
+    if (
+      Object.keys(params).length === 0 ||
+      !accessToken ||
+      accessToken === ''
+    ) {
       return;
     }
 
@@ -96,14 +101,14 @@ export const submitMarkersAction = createAppAsyncThunk<{
   home: string | undefined;
   notifications: string | undefined;
 }>('markers/submitAction', async (_args, { getState }) => {
-  const accessToken = authorizationTokenFromState(getState);
+  const accessToken = getAccessToken();
   const params = buildPostMarkersParams(getState());
 
-  if (Object.keys(params).length === 0 || accessToken === '') {
+  if (Object.keys(params).length === 0 || !accessToken || accessToken === '') {
     return { home: undefined, notifications: undefined };
   }
 
-  await api(getState).post<MarkerJSON>('/api/v1/markers', params);
+  await api().post<MarkerJSON>('/api/v1/markers', params);
 
   return {
     home: params.home?.last_read_id,
@@ -133,14 +138,11 @@ export const submitMarkers = createAppAsyncThunk(
   },
 );
 
-export const fetchMarkers = createAppAsyncThunk(
-  'markers/fetch',
-  async (_args, { getState }) => {
-    const response = await api(getState).get<Record<string, MarkerJSON>>(
-      `/api/v1/markers`,
-      { params: { timeline: ['notifications'] } },
-    );
+export const fetchMarkers = createAppAsyncThunk('markers/fetch', async () => {
+  const response = await api().get<Record<string, MarkerJSON>>(
+    `/api/v1/markers`,
+    { params: { timeline: ['notifications'] } },
+  );
 
-    return { markers: response.data };
-  },
-);
+  return { markers: response.data };
+});
diff --git a/app/javascript/mastodon/actions/mutes.js b/app/javascript/mastodon/actions/mutes.js
index 99c113f41..3676748cf 100644
--- a/app/javascript/mastodon/actions/mutes.js
+++ b/app/javascript/mastodon/actions/mutes.js
@@ -13,10 +13,10 @@ export const MUTES_EXPAND_SUCCESS = 'MUTES_EXPAND_SUCCESS';
 export const MUTES_EXPAND_FAIL    = 'MUTES_EXPAND_FAIL';
 
 export function fetchMutes() {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchMutesRequest());
 
-    api(getState).get('/api/v1/mutes').then(response => {
+    api().get('/api/v1/mutes').then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(fetchMutesSuccess(response.data, next ? next.uri : null));
@@ -56,7 +56,7 @@ export function expandMutes() {
 
     dispatch(expandMutesRequest());
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedAccounts(response.data));
       dispatch(expandMutesSuccess(response.data, next ? next.uri : null));
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index b54cbe27b..fe728aa26 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -216,7 +216,7 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) {
 
     dispatch(expandNotificationsRequest(isLoadingMore));
 
-    api(getState).get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }).then(response => {
+    api().get('/api/v1/notifications', { params, signal: expandNotificationsController.signal }).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data.map(item => item.account)));
@@ -262,12 +262,12 @@ export function expandNotificationsFail(error, isLoadingMore) {
 }
 
 export function clearNotifications() {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch({
       type: NOTIFICATIONS_CLEAR,
     });
 
-    api(getState).post('/api/v1/notifications/clear');
+    api().post('/api/v1/notifications/clear');
   };
 }
 
@@ -346,10 +346,10 @@ export function setBrowserPermission (value) {
   };
 }
 
-export const fetchNotificationPolicy = () => (dispatch, getState) => {
+export const fetchNotificationPolicy = () => (dispatch) => {
   dispatch(fetchNotificationPolicyRequest());
 
-  api(getState).get('/api/v1/notifications/policy').then(({ data }) => {
+  api().get('/api/v1/notifications/policy').then(({ data }) => {
     dispatch(fetchNotificationPolicySuccess(data));
   }).catch(err => {
     dispatch(fetchNotificationPolicyFail(err));
@@ -370,10 +370,10 @@ export const fetchNotificationPolicyFail = error => ({
   error,
 });
 
-export const updateNotificationsPolicy = params => (dispatch, getState) => {
+export const updateNotificationsPolicy = params => (dispatch) => {
   dispatch(fetchNotificationPolicyRequest());
 
-  api(getState).put('/api/v1/notifications/policy', params).then(({ data }) => {
+  api().put('/api/v1/notifications/policy', params).then(({ data }) => {
     dispatch(fetchNotificationPolicySuccess(data));
   }).catch(err => {
     dispatch(fetchNotificationPolicyFail(err));
@@ -393,7 +393,7 @@ export const fetchNotificationRequests = () => (dispatch, getState) => {
 
   dispatch(fetchNotificationRequestsRequest());
 
-  api(getState).get('/api/v1/notifications/requests', { params }).then(response => {
+  api().get('/api/v1/notifications/requests', { params }).then(response => {
     const next = getLinks(response).refs.find(link => link.rel === 'next');
     dispatch(importFetchedAccounts(response.data.map(x => x.account)));
     dispatch(fetchNotificationRequestsSuccess(response.data, next ? next.uri : null));
@@ -426,7 +426,7 @@ export const expandNotificationRequests = () => (dispatch, getState) => {
 
   dispatch(expandNotificationRequestsRequest());
 
-  api(getState).get(url).then(response => {
+  api().get(url).then(response => {
     const next = getLinks(response).refs.find(link => link.rel === 'next');
     dispatch(importFetchedAccounts(response.data.map(x => x.account)));
     dispatch(expandNotificationRequestsSuccess(response.data, next?.uri));
@@ -459,7 +459,7 @@ export const fetchNotificationRequest = id => (dispatch, getState) => {
 
   dispatch(fetchNotificationRequestRequest(id));
 
-  api(getState).get(`/api/v1/notifications/requests/${id}`).then(({ data }) => {
+  api().get(`/api/v1/notifications/requests/${id}`).then(({ data }) => {
     dispatch(fetchNotificationRequestSuccess(data));
   }).catch(err => {
     dispatch(fetchNotificationRequestFail(id, err));
@@ -482,10 +482,10 @@ export const fetchNotificationRequestFail = (id, error) => ({
   error,
 });
 
-export const acceptNotificationRequest = id => (dispatch, getState) => {
+export const acceptNotificationRequest = id => (dispatch) => {
   dispatch(acceptNotificationRequestRequest(id));
 
-  api(getState).post(`/api/v1/notifications/requests/${id}/accept`).then(() => {
+  api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => {
     dispatch(acceptNotificationRequestSuccess(id));
   }).catch(err => {
     dispatch(acceptNotificationRequestFail(id, err));
@@ -508,10 +508,10 @@ export const acceptNotificationRequestFail = (id, error) => ({
   error,
 });
 
-export const dismissNotificationRequest = id => (dispatch, getState) => {
+export const dismissNotificationRequest = id => (dispatch) => {
   dispatch(dismissNotificationRequestRequest(id));
 
-  api(getState).post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{
+  api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{
     dispatch(dismissNotificationRequestSuccess(id));
   }).catch(err => {
     dispatch(dismissNotificationRequestFail(id, err));
@@ -550,7 +550,7 @@ export const fetchNotificationsForRequest = accountId => (dispatch, getState) =>
 
   dispatch(fetchNotificationsForRequestRequest());
 
-  api(getState).get('/api/v1/notifications', { params }).then(response => {
+  api().get('/api/v1/notifications', { params }).then(response => {
     const next = getLinks(response).refs.find(link => link.rel === 'next');
     dispatch(importFetchedAccounts(response.data.map(item => item.account)));
     dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status)));
@@ -586,7 +586,7 @@ export const expandNotificationsForRequest = () => (dispatch, getState) => {
 
   dispatch(expandNotificationsForRequestRequest());
 
-  api(getState).get(url).then(response => {
+  api().get(url).then(response => {
     const next = getLinks(response).refs.find(link => link.rel === 'next');
     dispatch(importFetchedAccounts(response.data.map(item => item.account)));
     dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status)));
diff --git a/app/javascript/mastodon/actions/pin_statuses.js b/app/javascript/mastodon/actions/pin_statuses.js
index baa10d156..d583eab57 100644
--- a/app/javascript/mastodon/actions/pin_statuses.js
+++ b/app/javascript/mastodon/actions/pin_statuses.js
@@ -8,10 +8,10 @@ export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS';
 export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL';
 
 export function fetchPinnedStatuses() {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchPinnedStatusesRequest());
 
-    api(getState).get(`/api/v1/accounts/${me}/statuses`, { params: { pinned: true } }).then(response => {
+    api().get(`/api/v1/accounts/${me}/statuses`, { params: { pinned: true } }).then(response => {
       dispatch(importFetchedStatuses(response.data));
       dispatch(fetchPinnedStatusesSuccess(response.data, null));
     }).catch(error => {
diff --git a/app/javascript/mastodon/actions/polls.js b/app/javascript/mastodon/actions/polls.js
index a37410dc9..aa4934144 100644
--- a/app/javascript/mastodon/actions/polls.js
+++ b/app/javascript/mastodon/actions/polls.js
@@ -10,10 +10,10 @@ export const POLL_FETCH_REQUEST = 'POLL_FETCH_REQUEST';
 export const POLL_FETCH_SUCCESS = 'POLL_FETCH_SUCCESS';
 export const POLL_FETCH_FAIL    = 'POLL_FETCH_FAIL';
 
-export const vote = (pollId, choices) => (dispatch, getState) => {
+export const vote = (pollId, choices) => (dispatch) => {
   dispatch(voteRequest());
 
-  api(getState).post(`/api/v1/polls/${pollId}/votes`, { choices })
+  api().post(`/api/v1/polls/${pollId}/votes`, { choices })
     .then(({ data }) => {
       dispatch(importFetchedPoll(data));
       dispatch(voteSuccess(data));
@@ -21,10 +21,10 @@ export const vote = (pollId, choices) => (dispatch, getState) => {
     .catch(err => dispatch(voteFail(err)));
 };
 
-export const fetchPoll = pollId => (dispatch, getState) => {
+export const fetchPoll = pollId => (dispatch) => {
   dispatch(fetchPollRequest());
 
-  api(getState).get(`/api/v1/polls/${pollId}`)
+  api().get(`/api/v1/polls/${pollId}`)
     .then(({ data }) => {
       dispatch(importFetchedPoll(data));
       dispatch(fetchPollSuccess(data));
diff --git a/app/javascript/mastodon/actions/reports.js b/app/javascript/mastodon/actions/reports.js
index 756b8cd05..49b89b0d1 100644
--- a/app/javascript/mastodon/actions/reports.js
+++ b/app/javascript/mastodon/actions/reports.js
@@ -15,10 +15,10 @@ export const initReport = (account, status) => dispatch =>
     },
   }));
 
-export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => {
+export const submitReport = (params, onSuccess, onFail) => (dispatch) => {
   dispatch(submitReportRequest());
 
-  api(getState).post('/api/v1/reports', params).then(response => {
+  api().post('/api/v1/reports', params).then(response => {
     dispatch(submitReportSuccess(response.data));
     if (onSuccess) onSuccess();
   }).catch(error => {
diff --git a/app/javascript/mastodon/actions/search.js b/app/javascript/mastodon/actions/search.js
index a34a490e7..bde17ae0d 100644
--- a/app/javascript/mastodon/actions/search.js
+++ b/app/javascript/mastodon/actions/search.js
@@ -46,7 +46,7 @@ export function submitSearch(type) {
 
     dispatch(fetchSearchRequest(type));
 
-    api(getState).get('/api/v2/search', {
+    api().get('/api/v2/search', {
       params: {
         q: value,
         resolve: signedIn,
@@ -99,7 +99,7 @@ export const expandSearch = type => (dispatch, getState) => {
 
   dispatch(expandSearchRequest(type));
 
-  api(getState).get('/api/v2/search', {
+  api().get('/api/v2/search', {
     params: {
       q: value,
       type,
@@ -156,7 +156,7 @@ export const openURL = (value, history, onFailure) => (dispatch, getState) => {
 
   dispatch(fetchSearchRequest());
 
-  api(getState).get('/api/v2/search', { params: { q: value, resolve: true } }).then(response => {
+  api().get('/api/v2/search', { params: { q: value, resolve: true } }).then(response => {
     if (response.data.accounts?.length > 0) {
       dispatch(importFetchedAccounts(response.data.accounts));
       history.push(`/@${response.data.accounts[0].acct}`);
diff --git a/app/javascript/mastodon/actions/server.js b/app/javascript/mastodon/actions/server.js
index 65f3efc3a..32ee093af 100644
--- a/app/javascript/mastodon/actions/server.js
+++ b/app/javascript/mastodon/actions/server.js
@@ -25,7 +25,7 @@ export const fetchServer = () => (dispatch, getState) => {
 
   dispatch(fetchServerRequest());
 
-  api(getState)
+  api()
     .get('/api/v2/instance').then(({ data }) => {
       if (data.contact.account) dispatch(importFetchedAccount(data.contact.account));
       dispatch(fetchServerSuccess(data));
@@ -46,10 +46,10 @@ const fetchServerFail = error => ({
   error,
 });
 
-export const fetchServerTranslationLanguages = () => (dispatch, getState) => {
+export const fetchServerTranslationLanguages = () => (dispatch) => {
   dispatch(fetchServerTranslationLanguagesRequest());
 
-  api(getState)
+  api()
     .get('/api/v1/instance/translation_languages').then(({ data }) => {
       dispatch(fetchServerTranslationLanguagesSuccess(data));
     }).catch(err => dispatch(fetchServerTranslationLanguagesFail(err)));
@@ -76,7 +76,7 @@ export const fetchExtendedDescription = () => (dispatch, getState) => {
 
   dispatch(fetchExtendedDescriptionRequest());
 
-  api(getState)
+  api()
     .get('/api/v1/instance/extended_description')
     .then(({ data }) => dispatch(fetchExtendedDescriptionSuccess(data)))
     .catch(err => dispatch(fetchExtendedDescriptionFail(err)));
@@ -103,7 +103,7 @@ export const fetchDomainBlocks = () => (dispatch, getState) => {
 
   dispatch(fetchDomainBlocksRequest());
 
-  api(getState)
+  api()
     .get('/api/v1/instance/domain_blocks')
     .then(({ data }) => dispatch(fetchDomainBlocksSuccess(true, data)))
     .catch(err => {
diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js
index 3aed80735..a60b80dc2 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -59,7 +59,7 @@ export function fetchStatus(id, forceFetch = false) {
 
     dispatch(fetchStatusRequest(id, skipLoading));
 
-    api(getState).get(`/api/v1/statuses/${id}`).then(response => {
+    api().get(`/api/v1/statuses/${id}`).then(response => {
       dispatch(importFetchedStatus(response.data));
       dispatch(fetchStatusSuccess(skipLoading));
     }).catch(error => {
@@ -102,7 +102,7 @@ export const editStatus = (id, routerHistory) => (dispatch, getState) => {
 
   dispatch(fetchStatusSourceRequest());
 
-  api(getState).get(`/api/v1/statuses/${id}/source`).then(response => {
+  api().get(`/api/v1/statuses/${id}/source`).then(response => {
     dispatch(fetchStatusSourceSuccess());
     ensureComposeIsVisible(getState, routerHistory);
     dispatch(setComposeToStatus(status, response.data.text, response.data.spoiler_text));
@@ -134,7 +134,7 @@ export function deleteStatus(id, routerHistory, withRedraft = false) {
 
     dispatch(deleteStatusRequest(id));
 
-    api(getState).delete(`/api/v1/statuses/${id}`).then(response => {
+    api().delete(`/api/v1/statuses/${id}`).then(response => {
       dispatch(deleteStatusSuccess(id));
       dispatch(deleteFromTimelines(id));
       dispatch(importFetchedAccount(response.data.account));
@@ -175,10 +175,10 @@ export const updateStatus = status => dispatch =>
   dispatch(importFetchedStatus(status));
 
 export function fetchContext(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchContextRequest(id));
 
-    api(getState).get(`/api/v1/statuses/${id}/context`).then(response => {
+    api().get(`/api/v1/statuses/${id}/context`).then(response => {
       dispatch(importFetchedStatuses(response.data.ancestors.concat(response.data.descendants)));
       dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants));
 
@@ -219,10 +219,10 @@ export function fetchContextFail(id, error) {
 }
 
 export function muteStatus(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(muteStatusRequest(id));
 
-    api(getState).post(`/api/v1/statuses/${id}/mute`).then(() => {
+    api().post(`/api/v1/statuses/${id}/mute`).then(() => {
       dispatch(muteStatusSuccess(id));
     }).catch(error => {
       dispatch(muteStatusFail(id, error));
@@ -253,10 +253,10 @@ export function muteStatusFail(id, error) {
 }
 
 export function unmuteStatus(id) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(unmuteStatusRequest(id));
 
-    api(getState).post(`/api/v1/statuses/${id}/unmute`).then(() => {
+    api().post(`/api/v1/statuses/${id}/unmute`).then(() => {
       dispatch(unmuteStatusSuccess(id));
     }).catch(error => {
       dispatch(unmuteStatusFail(id, error));
@@ -316,10 +316,10 @@ export function toggleStatusCollapse(id, isCollapsed) {
   };
 }
 
-export const translateStatus = id => (dispatch, getState) => {
+export const translateStatus = id => (dispatch) => {
   dispatch(translateStatusRequest(id));
 
-  api(getState).post(`/api/v1/statuses/${id}/translate`).then(response => {
+  api().post(`/api/v1/statuses/${id}/translate`).then(response => {
     dispatch(translateStatusSuccess(id, response.data));
   }).catch(error => {
     dispatch(translateStatusFail(id, error));
diff --git a/app/javascript/mastodon/actions/suggestions.js b/app/javascript/mastodon/actions/suggestions.js
index 8eafe38b2..258ffa901 100644
--- a/app/javascript/mastodon/actions/suggestions.js
+++ b/app/javascript/mastodon/actions/suggestions.js
@@ -10,10 +10,10 @@ export const SUGGESTIONS_FETCH_FAIL    = 'SUGGESTIONS_FETCH_FAIL';
 export const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS';
 
 export function fetchSuggestions(withRelationships = false) {
-  return (dispatch, getState) => {
+  return (dispatch) => {
     dispatch(fetchSuggestionsRequest());
 
-    api(getState).get('/api/v2/suggestions', { params: { limit: 20 } }).then(response => {
+    api().get('/api/v2/suggestions', { params: { limit: 20 } }).then(response => {
       dispatch(importFetchedAccounts(response.data.map(x => x.account)));
       dispatch(fetchSuggestionsSuccess(response.data));
 
@@ -48,11 +48,11 @@ export function fetchSuggestionsFail(error) {
   };
 }
 
-export const dismissSuggestion = accountId => (dispatch, getState) => {
+export const dismissSuggestion = accountId => (dispatch) => {
   dispatch({
     type: SUGGESTIONS_DISMISS,
     id: accountId,
   });
 
-  api(getState).delete(`/api/v1/suggestions/${accountId}`).catch(() => {});
+  api().delete(`/api/v1/suggestions/${accountId}`).catch(() => {});
 };
diff --git a/app/javascript/mastodon/actions/tags.js b/app/javascript/mastodon/actions/tags.js
index dda8c924b..d18d7e514 100644
--- a/app/javascript/mastodon/actions/tags.js
+++ b/app/javascript/mastodon/actions/tags.js
@@ -20,10 +20,10 @@ export const HASHTAG_UNFOLLOW_REQUEST = 'HASHTAG_UNFOLLOW_REQUEST';
 export const HASHTAG_UNFOLLOW_SUCCESS = 'HASHTAG_UNFOLLOW_SUCCESS';
 export const HASHTAG_UNFOLLOW_FAIL    = 'HASHTAG_UNFOLLOW_FAIL';
 
-export const fetchHashtag = name => (dispatch, getState) => {
+export const fetchHashtag = name => (dispatch) => {
   dispatch(fetchHashtagRequest());
 
-  api(getState).get(`/api/v1/tags/${name}`).then(({ data }) => {
+  api().get(`/api/v1/tags/${name}`).then(({ data }) => {
     dispatch(fetchHashtagSuccess(name, data));
   }).catch(err => {
     dispatch(fetchHashtagFail(err));
@@ -45,10 +45,10 @@ export const fetchHashtagFail = error => ({
   error,
 });
 
-export const fetchFollowedHashtags = () => (dispatch, getState) => {
+export const fetchFollowedHashtags = () => (dispatch) => {
   dispatch(fetchFollowedHashtagsRequest());
 
-  api(getState).get('/api/v1/followed_tags').then(response => {
+  api().get('/api/v1/followed_tags').then(response => {
     const next = getLinks(response).refs.find(link => link.rel === 'next');
     dispatch(fetchFollowedHashtagsSuccess(response.data, next ? next.uri : null));
   }).catch(err => {
@@ -87,7 +87,7 @@ export function expandFollowedHashtags() {
 
     dispatch(expandFollowedHashtagsRequest());
 
-    api(getState).get(url).then(response => {
+    api().get(url).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(expandFollowedHashtagsSuccess(response.data, next ? next.uri : null));
     }).catch(error => {
@@ -117,10 +117,10 @@ export function expandFollowedHashtagsFail(error) {
   };
 }
 
-export const followHashtag = name => (dispatch, getState) => {
+export const followHashtag = name => (dispatch) => {
   dispatch(followHashtagRequest(name));
 
-  api(getState).post(`/api/v1/tags/${name}/follow`).then(({ data }) => {
+  api().post(`/api/v1/tags/${name}/follow`).then(({ data }) => {
     dispatch(followHashtagSuccess(name, data));
   }).catch(err => {
     dispatch(followHashtagFail(name, err));
@@ -144,10 +144,10 @@ export const followHashtagFail = (name, error) => ({
   error,
 });
 
-export const unfollowHashtag = name => (dispatch, getState) => {
+export const unfollowHashtag = name => (dispatch) => {
   dispatch(unfollowHashtagRequest(name));
 
-  api(getState).post(`/api/v1/tags/${name}/unfollow`).then(({ data }) => {
+  api().post(`/api/v1/tags/${name}/unfollow`).then(({ data }) => {
     dispatch(unfollowHashtagSuccess(name, data));
   }).catch(err => {
     dispatch(unfollowHashtagFail(name, err));
diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js
index 4ce7c3cf8..dc37cdf1f 100644
--- a/app/javascript/mastodon/actions/timelines.js
+++ b/app/javascript/mastodon/actions/timelines.js
@@ -114,7 +114,7 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
 
     dispatch(expandTimelineRequest(timelineId, isLoadingMore));
 
-    api(getState).get(path, { params }).then(response => {
+    api().get(path, { params }).then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedStatuses(response.data));
diff --git a/app/javascript/mastodon/actions/trends.js b/app/javascript/mastodon/actions/trends.js
index d31442388..0b840b41c 100644
--- a/app/javascript/mastodon/actions/trends.js
+++ b/app/javascript/mastodon/actions/trends.js
@@ -18,10 +18,10 @@ export const TRENDS_STATUSES_EXPAND_REQUEST = 'TRENDS_STATUSES_EXPAND_REQUEST';
 export const TRENDS_STATUSES_EXPAND_SUCCESS = 'TRENDS_STATUSES_EXPAND_SUCCESS';
 export const TRENDS_STATUSES_EXPAND_FAIL    = 'TRENDS_STATUSES_EXPAND_FAIL';
 
-export const fetchTrendingHashtags = () => (dispatch, getState) => {
+export const fetchTrendingHashtags = () => (dispatch) => {
   dispatch(fetchTrendingHashtagsRequest());
 
-  api(getState)
+  api()
     .get('/api/v1/trends/tags')
     .then(({ data }) => dispatch(fetchTrendingHashtagsSuccess(data)))
     .catch(err => dispatch(fetchTrendingHashtagsFail(err)));
@@ -45,10 +45,10 @@ export const fetchTrendingHashtagsFail = error => ({
   skipAlert: true,
 });
 
-export const fetchTrendingLinks = () => (dispatch, getState) => {
+export const fetchTrendingLinks = () => (dispatch) => {
   dispatch(fetchTrendingLinksRequest());
 
-  api(getState)
+  api()
     .get('/api/v1/trends/links')
     .then(({ data }) => dispatch(fetchTrendingLinksSuccess(data)))
     .catch(err => dispatch(fetchTrendingLinksFail(err)));
@@ -79,7 +79,7 @@ export const fetchTrendingStatuses = () => (dispatch, getState) => {
 
   dispatch(fetchTrendingStatusesRequest());
 
-  api(getState).get('/api/v1/trends/statuses').then(response => {
+  api().get('/api/v1/trends/statuses').then(response => {
     const next = getLinks(response).refs.find(link => link.rel === 'next');
     dispatch(importFetchedStatuses(response.data));
     dispatch(fetchTrendingStatusesSuccess(response.data, next ? next.uri : null));
@@ -115,7 +115,7 @@ export const expandTrendingStatuses = () => (dispatch, getState) => {
 
   dispatch(expandTrendingStatusesRequest());
 
-  api(getState).get(url).then(response => {
+  api().get(url).then(response => {
     const next = getLinks(response).refs.find(link => link.rel === 'next');
     dispatch(importFetchedStatuses(response.data));
     dispatch(expandTrendingStatusesSuccess(response.data, next ? next.uri : null));
diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts
index de597a3e3..ccff68c37 100644
--- a/app/javascript/mastodon/api.ts
+++ b/app/javascript/mastodon/api.ts
@@ -2,8 +2,8 @@ import type { AxiosResponse, RawAxiosRequestHeaders } from 'axios';
 import axios from 'axios';
 import LinkHeader from 'http-link-header';
 
+import { getAccessToken } from './initial_state';
 import ready from './ready';
-import type { GetState } from './store';
 
 export const getLinks = (response: AxiosResponse) => {
   const value = response.headers.link as string | undefined;
@@ -29,30 +29,22 @@ const setCSRFHeader = () => {
 
 void ready(setCSRFHeader);
 
-export const authorizationTokenFromState = (getState?: GetState) => {
-  return (
-    getState && (getState().meta.get('access_token', '') as string | false)
-  );
-};
+const authorizationTokenFromInitialState = (): RawAxiosRequestHeaders => {
+  const accessToken = getAccessToken();
 
-const authorizationHeaderFromState = (getState?: GetState) => {
-  const accessToken = authorizationTokenFromState(getState);
-
-  if (!accessToken) {
-    return {};
-  }
+  if (!accessToken) return {};
 
   return {
     Authorization: `Bearer ${accessToken}`,
-  } as RawAxiosRequestHeaders;
+  };
 };
 
 // eslint-disable-next-line import/no-default-export
-export default function api(getState: GetState) {
+export default function api() {
   return axios.create({
     headers: {
       ...csrfHeader,
-      ...authorizationHeaderFromState(getState),
+      ...authorizationTokenFromInitialState(),
     },
 
     transformResponse: [
diff --git a/app/javascript/mastodon/identity_context.tsx b/app/javascript/mastodon/identity_context.tsx
index 564b7895c..7f28ab77a 100644
--- a/app/javascript/mastodon/identity_context.tsx
+++ b/app/javascript/mastodon/identity_context.tsx
@@ -9,7 +9,6 @@ export interface IdentityContextType {
   signedIn: boolean;
   accountId: string | undefined;
   disabledAccountId: string | undefined;
-  accessToken: string | undefined;
   permissions: number;
 }
 
@@ -17,14 +16,12 @@ export const identityContextPropShape = PropTypes.shape({
   signedIn: PropTypes.bool.isRequired,
   accountId: PropTypes.string,
   disabledAccountId: PropTypes.string,
-  accessToken: PropTypes.string,
 }).isRequired;
 
 export const createIdentityContext = (state: InitialState) => ({
   signedIn: !!state.meta.me,
   accountId: state.meta.me,
   disabledAccountId: state.meta.disabled_account_id,
-  accessToken: state.meta.access_token,
   permissions: state.role?.permissions ?? 0,
 });
 
@@ -33,7 +30,6 @@ export const IdentityContext = createContext<IdentityContextType>({
   permissions: 0,
   accountId: undefined,
   disabledAccountId: undefined,
-  accessToken: undefined,
 });
 
 export const useIdentity = () => useContext(IdentityContext);
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index 5d60565e1..9ec3df0df 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -117,4 +117,11 @@ export const criticalUpdatesPending = initialState?.critical_updates_pending;
 export const statusPageUrl = getMeta('status_page_url');
 export const sso_redirect = getMeta('sso_redirect');
 
+/**
+ * @returns {string | undefined}
+ */
+export function getAccessToken() {
+  return getMeta('access_token');
+}
+
 export default initialState;
diff --git a/app/javascript/mastodon/reducers/meta.js b/app/javascript/mastodon/reducers/meta.js
index 96baf2f11..ddb788459 100644
--- a/app/javascript/mastodon/reducers/meta.js
+++ b/app/javascript/mastodon/reducers/meta.js
@@ -6,7 +6,6 @@ import { layoutFromWindow } from 'mastodon/is_mobile';
 
 const initialState = ImmutableMap({
   streaming_api_base_url: null,
-  access_token: null,
   layout: layoutFromWindow(),
   permissions: '0',
 });
@@ -14,7 +13,8 @@ const initialState = ImmutableMap({
 export default function meta(state = initialState, action) {
   switch(action.type) {
   case STORE_HYDRATE:
-    return state.merge(action.state.get('meta')).set('permissions', action.state.getIn(['role', 'permissions']));
+    // we do not want `access_token` to be stored in the state
+    return state.merge(action.state.get('meta')).delete('access_token').set('permissions', action.state.getIn(['role', 'permissions']));
   case changeLayout.type:
     return state.set('layout', action.payload.layout);
   default:
diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js
index ff3af5fd8..40d69136a 100644
--- a/app/javascript/mastodon/stream.js
+++ b/app/javascript/mastodon/stream.js
@@ -2,6 +2,8 @@
 
 import WebSocketClient from '@gamestdio/websocket';
 
+import { getAccessToken } from './initial_state';
+
 /**
  * @type {WebSocketClient | undefined}
  */
@@ -145,9 +147,11 @@ const channelNameWithInlineParams = (channelName, params) => {
 // @ts-expect-error
 export const connectStream = (channelName, params, callbacks) => (dispatch, getState) => {
   const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']);
-  const accessToken = getState().getIn(['meta', 'access_token']);
+  const accessToken = getAccessToken();
   const { onConnect, onReceive, onDisconnect } = callbacks(dispatch, getState);
 
+  if(!accessToken) throw new Error("Trying to connect to the streaming server but no access token is available.");
+
   // If we cannot use a websockets connection, we must fall back
   // to using individual connections for each channel
   if (!streamingAPIBaseURL.startsWith('ws')) {
diff --git a/app/javascript/mastodon/test_helpers.tsx b/app/javascript/mastodon/test_helpers.tsx
index bfea3f6bf..93b5a8453 100644
--- a/app/javascript/mastodon/test_helpers.tsx
+++ b/app/javascript/mastodon/test_helpers.tsx
@@ -14,7 +14,6 @@ function render(
   const fakeIdentity = {
     signedIn: signedIn,
     accountId: '123',
-    accessToken: 'test-access-token',
     disabledAccountId: undefined,
     permissions: 0,
   };

From 15d307075479cf93ea199be0f25820003ddbe27c Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Thu, 23 May 2024 09:30:48 +0200
Subject: [PATCH 176/215] Fix some API calls that should not use an API token
 (#30401)

---
 app/javascript/mastodon/api.ts                                | 4 ++--
 app/javascript/mastodon/components/admin/Counter.jsx          | 2 +-
 app/javascript/mastodon/components/admin/Dimension.jsx        | 2 +-
 app/javascript/mastodon/components/admin/ImpactReport.jsx     | 2 +-
 .../mastodon/components/admin/ReportReasonSelector.jsx        | 4 ++--
 app/javascript/mastodon/components/admin/Retention.jsx        | 2 +-
 app/javascript/mastodon/components/admin/Trends.jsx           | 2 +-
 7 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts
index ccff68c37..2ccf178f0 100644
--- a/app/javascript/mastodon/api.ts
+++ b/app/javascript/mastodon/api.ts
@@ -40,11 +40,11 @@ const authorizationTokenFromInitialState = (): RawAxiosRequestHeaders => {
 };
 
 // eslint-disable-next-line import/no-default-export
-export default function api() {
+export default function api(withAuthorization = true) {
   return axios.create({
     headers: {
       ...csrfHeader,
-      ...authorizationTokenFromInitialState(),
+      ...(withAuthorization ? authorizationTokenFromInitialState() : {}),
     },
 
     transformResponse: [
diff --git a/app/javascript/mastodon/components/admin/Counter.jsx b/app/javascript/mastodon/components/admin/Counter.jsx
index 6ce23c9f0..e4d21da62 100644
--- a/app/javascript/mastodon/components/admin/Counter.jsx
+++ b/app/javascript/mastodon/components/admin/Counter.jsx
@@ -48,7 +48,7 @@ export default class Counter extends PureComponent {
   componentDidMount () {
     const { measure, start_at, end_at, params } = this.props;
 
-    api().post('/api/v1/admin/measures', { keys: [measure], start_at, end_at, [measure]: params }).then(res => {
+    api(false).post('/api/v1/admin/measures', { keys: [measure], start_at, end_at, [measure]: params }).then(res => {
       this.setState({
         loading: false,
         data: res.data,
diff --git a/app/javascript/mastodon/components/admin/Dimension.jsx b/app/javascript/mastodon/components/admin/Dimension.jsx
index bfda6c93d..56557ad8e 100644
--- a/app/javascript/mastodon/components/admin/Dimension.jsx
+++ b/app/javascript/mastodon/components/admin/Dimension.jsx
@@ -26,7 +26,7 @@ export default class Dimension extends PureComponent {
   componentDidMount () {
     const { start_at, end_at, dimension, limit, params } = this.props;
 
-    api().post('/api/v1/admin/dimensions', { keys: [dimension], start_at, end_at, limit, [dimension]: params }).then(res => {
+    api(false).post('/api/v1/admin/dimensions', { keys: [dimension], start_at, end_at, limit, [dimension]: params }).then(res => {
       this.setState({
         loading: false,
         data: res.data,
diff --git a/app/javascript/mastodon/components/admin/ImpactReport.jsx b/app/javascript/mastodon/components/admin/ImpactReport.jsx
index c27ee0ab0..add54134b 100644
--- a/app/javascript/mastodon/components/admin/ImpactReport.jsx
+++ b/app/javascript/mastodon/components/admin/ImpactReport.jsx
@@ -27,7 +27,7 @@ export default class ImpactReport extends PureComponent {
       include_subdomains: true,
     };
 
-    api().post('/api/v1/admin/measures', {
+    api(false).post('/api/v1/admin/measures', {
       keys: ['instance_accounts', 'instance_follows', 'instance_followers'],
       start_at: null,
       end_at: null,
diff --git a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx
index 90f4334a6..cc05e5c16 100644
--- a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx
+++ b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx
@@ -105,7 +105,7 @@ class ReportReasonSelector extends PureComponent {
   };
 
   componentDidMount() {
-    api().get('/api/v1/instance').then(res => {
+    api(false).get('/api/v1/instance').then(res => {
       this.setState({
         rules: res.data.rules,
       });
@@ -122,7 +122,7 @@ class ReportReasonSelector extends PureComponent {
       return;
     }
 
-    api().put(`/api/v1/admin/reports/${id}`, {
+    api(false).put(`/api/v1/admin/reports/${id}`, {
       category,
       rule_ids: category === 'violation' ? rule_ids : [],
     }).catch(err => {
diff --git a/app/javascript/mastodon/components/admin/Retention.jsx b/app/javascript/mastodon/components/admin/Retention.jsx
index 1e8ef48b7..87746e9f4 100644
--- a/app/javascript/mastodon/components/admin/Retention.jsx
+++ b/app/javascript/mastodon/components/admin/Retention.jsx
@@ -34,7 +34,7 @@ export default class Retention extends PureComponent {
   componentDidMount () {
     const { start_at, end_at, frequency } = this.props;
 
-    api().post('/api/v1/admin/retention', { start_at, end_at, frequency }).then(res => {
+    api(false).post('/api/v1/admin/retention', { start_at, end_at, frequency }).then(res => {
       this.setState({
         loading: false,
         data: res.data,
diff --git a/app/javascript/mastodon/components/admin/Trends.jsx b/app/javascript/mastodon/components/admin/Trends.jsx
index c69b4a8cb..fd6db106d 100644
--- a/app/javascript/mastodon/components/admin/Trends.jsx
+++ b/app/javascript/mastodon/components/admin/Trends.jsx
@@ -22,7 +22,7 @@ export default class Trends extends PureComponent {
   componentDidMount () {
     const { limit } = this.props;
 
-    api().get('/api/v1/admin/trends/tags', { params: { limit } }).then(res => {
+    api(false).get('/api/v1/admin/trends/tags', { params: { limit } }).then(res => {
       this.setState({
         loading: false,
         data: res.data,

From 5b5a35cf96de51b5ef44f69dcde1e3dc2acb9dd6 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 23 May 2024 10:26:29 +0200
Subject: [PATCH 177/215] New Crowdin Translations (automated) (#30402)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/be.json |   1 +
 app/javascript/mastodon/locales/lv.json |   2 +-
 config/locales/an.yml                   |   1 -
 config/locales/ar.yml                   |   1 -
 config/locales/ast.yml                  |   2 -
 config/locales/be.yml                   |   1 -
 config/locales/bg.yml                   |   2 +-
 config/locales/ca.yml                   |   2 +-
 config/locales/ckb.yml                  |   1 -
 config/locales/co.yml                   |   1 -
 config/locales/cs.yml                   |   1 -
 config/locales/cy.yml                   |   3 +-
 config/locales/da.yml                   |   2 +-
 config/locales/de.yml                   |   2 +-
 config/locales/devise.lt.yml            |   2 +-
 config/locales/el.yml                   |   1 -
 config/locales/en-GB.yml                |   1 -
 config/locales/eo.yml                   |   1 -
 config/locales/es-AR.yml                |   2 +-
 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/fo.yml                   |   2 +-
 config/locales/fr-CA.yml                |   1 -
 config/locales/fr.yml                   |   1 -
 config/locales/fy.yml                   |   1 -
 config/locales/gd.yml                   |   1 -
 config/locales/gl.yml                   |   2 +-
 config/locales/he.yml                   |   2 +-
 config/locales/hu.yml                   |   2 +-
 config/locales/ia.yml                   |   2 +-
 config/locales/id.yml                   |   1 -
 config/locales/ie.yml                   |   1 -
 config/locales/io.yml                   |   1 -
 config/locales/is.yml                   |   2 +-
 config/locales/it.yml                   |   2 +-
 config/locales/ja.yml                   |   1 -
 config/locales/kk.yml                   |   1 -
 config/locales/ko.yml                   |   2 +-
 config/locales/ku.yml                   |   1 -
 config/locales/lad.yml                  |   1 -
 config/locales/lt.yml                   | 148 ++++++++++++++++++++----
 config/locales/lv.yml                   |   1 -
 config/locales/ms.yml                   |   1 -
 config/locales/my.yml                   |   1 -
 config/locales/nl.yml                   |   2 +-
 config/locales/nn.yml                   |   1 -
 config/locales/no.yml                   |   1 -
 config/locales/oc.yml                   |   1 -
 config/locales/pl.yml                   |   2 +-
 config/locales/pt-BR.yml                |   1 -
 config/locales/pt-PT.yml                |   2 +-
 config/locales/ru.yml                   |   1 -
 config/locales/sc.yml                   |   1 -
 config/locales/sco.yml                  |   1 -
 config/locales/si.yml                   |   1 -
 config/locales/simple_form.lt.yml       |   7 ++
 config/locales/simple_form.nl.yml       |   4 +-
 config/locales/simple_form.sr-Latn.yml  |  10 +-
 config/locales/simple_form.sr.yml       |  12 +-
 config/locales/sk.yml                   |   1 -
 config/locales/sl.yml                   |   2 +-
 config/locales/sq.yml                   |   3 +-
 config/locales/sr-Latn.yml              |   8 +-
 config/locales/sr.yml                   |   8 +-
 config/locales/sv.yml                   |   1 -
 config/locales/th.yml                   |   1 -
 config/locales/tr.yml                   |   2 +-
 config/locales/uk.yml                   |   1 -
 config/locales/vi.yml                   |   1 -
 config/locales/zh-CN.yml                |   2 +-
 config/locales/zh-HK.yml                |   1 -
 config/locales/zh-TW.yml                |   2 +-
 76 files changed, 182 insertions(+), 113 deletions(-)

diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json
index 2b7673312..61e96e4b5 100644
--- a/app/javascript/mastodon/locales/be.json
+++ b/app/javascript/mastodon/locales/be.json
@@ -469,6 +469,7 @@
   "notification.follow": "{name} падпісаўся на вас",
   "notification.follow_request": "{name} адправіў запыт на падпіску",
   "notification.mention": "{name} згадаў вас",
+  "notification.moderation-warning.learn_more": "Даведацца больш",
   "notification.own_poll": "Ваша апытанне скончылася",
   "notification.poll": "Апытанне, дзе вы прынялі ўдзел, скончылася",
   "notification.reblog": "{name} пашырыў ваш допіс",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index e7ab11490..b61a2c0c3 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -491,7 +491,7 @@
   "onboarding.actions.go_to_home": "Dodieties uz manu mājas plūsmu",
   "onboarding.compose.template": "Sveiki, #Mastodon!",
   "onboarding.follows.empty": "Diemžēl pašlaik nevar parādīt rezultātus. Vari mēģināt izmantot meklēšanu vai pārlūkot izpētes lapu, lai atrastu cilvēkus, kuriem sekot, vai vēlāk mēģināt vēlreiz.",
-  "onboarding.follows.lead": "Tava mājas plūsma ir galvenais veids, kā izbaudīt Mastodon. Jo vairāk cilvēku sekosi, jo aktīvāk un interesantāk tas būs. Lai sāktu, šeit ir daži ieteikumi:",
+  "onboarding.follows.lead": "Tava mājas plūsma ir galvenais veids, kā pieredzēt Mastodon. Jo vairāk cilvēkiem sekosi, jo dzīvīgāka un aizraujošāka tā būs. Lai sāktu, šeit ir daži ieteikumi:",
   "onboarding.follows.title": "Pielāgo savu mājas barotni",
   "onboarding.profile.discoverable": "Padarīt manu profilu atklājamu",
   "onboarding.profile.display_name": "Attēlojamais vārds",
diff --git a/config/locales/an.yml b/config/locales/an.yml
index 068a20187..637aa8c8b 100644
--- a/config/locales/an.yml
+++ b/config/locales/an.yml
@@ -852,7 +852,6 @@ an:
       delete: Borrar
       edit_preset: Editar aviso predeterminau
       empty: Encara no has definiu garra preajuste d'alvertencia.
-      title: Editar configuración predeterminada d'avisos
     webhooks:
       add_new: Anyadir endpoint
       delete: Eliminar
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 02ba56d0b..2ca7538c3 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -1013,7 +1013,6 @@ ar:
       delete: حذف
       edit_preset: تعديل نموذج التحذير
       empty: لم تحدد أي إعدادات تحذير مسبقة بعد.
-      title: إدارة نماذج التحذير
     webhooks:
       add_new: إضافة نقطة نهاية
       delete: حذف
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index 816858d4a..9e6ec6d23 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -400,8 +400,6 @@ ast:
         usable: Pue usase
       title: Tendencies
       trending: En tendencia
-    warning_presets:
-      title: Xestión d'alvertencies preconfiguraes
     webhooks:
       add_new: Amestar un estremu
       delete: Desaniciar
diff --git a/config/locales/be.yml b/config/locales/be.yml
index 13daa9897..6f1f18952 100644
--- a/config/locales/be.yml
+++ b/config/locales/be.yml
@@ -983,7 +983,6 @@ be:
       delete: Выдаліць
       edit_preset: Рэдагаваць шаблон папярэджання
       empty: Вы яшчэ не вызначылі ніякіх шаблонаў папярэджанняў.
-      title: Кіраванне шаблонамі папярэджанняў
     webhooks:
       add_new: Дадаць канцавую кропку
       delete: Выдаліць
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 51180bc66..5aca8ad0f 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -951,7 +951,7 @@ bg:
       delete: Изтриване
       edit_preset: Редакция на предварителните настройки
       empty: Все още няма предварителни настройки за предупрежденията.
-      title: Управление на предварителните настройки
+      title: Предупредителни образци
     webhooks:
       add_new: Добавяне на крайна точка
       delete: Изтриване
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 34fd90085..ec32f771e 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -951,7 +951,7 @@ ca:
       delete: Elimina
       edit_preset: Edita l'avís predeterminat
       empty: Encara no has definit cap preavís.
-      title: Gestiona les configuracions predefinides dels avisos
+      title: Predefinicions d'avís
     webhooks:
       add_new: Afegir extrem
       delete: Elimina
diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml
index dfa035eca..93eea8273 100644
--- a/config/locales/ckb.yml
+++ b/config/locales/ckb.yml
@@ -548,7 +548,6 @@ ckb:
       add_new: زیادکردنی نوێ
       delete: سڕینەوە
       edit_preset: دەستکاریکردنی ئاگاداری پێشگریمان
-      title: بەڕێوەبردنی ئاگادارکردنەوە پێش‌سازدان
   admin_mailer:
     new_pending_account:
       body: وردەکاریهەژمارە نوێیەکە لە خوارەوەیە. دەتوانیت ئەم نەرمەکالا پەسەند بکەیت یان ڕەت بکەیتەوە.
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 7d8abcd11..6edbbc95f 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -510,7 +510,6 @@ co:
       add_new: Aghjunghje
       delete: Sguassà
       edit_preset: Cambià a preselezzione d'avertimentu
-      title: Amministrà e preselezzione d'avertimentu
   admin_mailer:
     new_pending_account:
       body: I ditagli di u novu contu sò quì sottu. Pudete appruvà o righjittà a dumanda.
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 569307731..17c743f1d 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -984,7 +984,6 @@ cs:
       delete: Smazat
       edit_preset: Upravit předlohu pro varování
       empty: Zatím jste nedefinovali žádné předlohy varování.
-      title: Spravovat předlohy pro varování
     webhooks:
       add_new: Přidat koncový bod
       delete: Smazat
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index f96068f21..35ed5ade8 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -297,6 +297,7 @@ cy:
         update_custom_emoji_html: Mae %{name} wedi diweddaru emoji %{target}
         update_domain_block_html: Mae %{name} wedi diweddaru bloc parth %{target}
         update_ip_block_html: Mae %{name} wedi newid rheol IP %{target}
+        update_report_html: Mae %{name} wedi diweddaru adroddiad %{target}
         update_status_html: Mae %{name} wedi diweddaru postiad gan %{target}
         update_user_role_html: Mae %{name} wedi newid rôl %{target}
       deleted_account: cyfrif wedi'i ddileu
@@ -1018,7 +1019,7 @@ cy:
       delete: Dileu
       edit_preset: Golygu rhagosodiad rhybudd
       empty: Nid ydych wedi diffinio unrhyw ragosodiadau rhybudd eto.
-      title: Rheoli rhagosodiadau rhybudd
+      title: Rhagosodiadau rhybuddion
     webhooks:
       add_new: Ychwanegu diweddbwynt
       delete: Dileu
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 17d3037a7..f37086264 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -951,7 +951,7 @@ da:
       delete: Slet
       edit_preset: Redigér advarselsforvalg
       empty: Ingen advarselsforvalg defineret endnu.
-      title: Håndtérr advarselsforvalg
+      title: Præindstillinger for advarsel
     webhooks:
       add_new: Tilføj endepunkt
       delete: Slet
diff --git a/config/locales/de.yml b/config/locales/de.yml
index dd2129584..11460c3b4 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -951,7 +951,7 @@ de:
       delete: Löschen
       edit_preset: Warnvorlage bearbeiten
       empty: Du hast noch keine Warnvorlagen hinzugefügt.
-      title: Warnvorlagen verwalten
+      title: Warnvorlagen
     webhooks:
       add_new: Endpunkt hinzufügen
       delete: Löschen
diff --git a/config/locales/devise.lt.yml b/config/locales/devise.lt.yml
index ec5b85272..e36e60a75 100644
--- a/config/locales/devise.lt.yml
+++ b/config/locales/devise.lt.yml
@@ -22,7 +22,7 @@ lt:
         action: Patvirtinti el. pašto adresą
         action_with_app: Patvirtinti ir grįžti į %{app}
         explanation: Šiuo el. pašto adresu sukūrei paskyrą %{host}. Iki jos aktyvavimo liko vienas paspaudimas. Jei tai buvo ne tu, ignoruok šį el. laišką.
-        explanation_when_pending: Šiuo el. pašto adresu pateikei paraišką pakvietimui į %{host}. Kai patvirtinsi savo el. pašto adresą, mes peržiūrėsime tavo paraišką. Gali prisijungti ir pakeisti savo duomenis arba ištrinti paskyrą, tačiau negalėsi naudotis daugeliu funkcijų, kol tavo paskyra nebus patvirtinta. Jei tavo paraiška bus atmesta, duomenys bus pašalinti, todėl jokių papildomų veiksmų iš tavęs nereikės. Jei tai buvo ne tu, ignoruok šį el. laišką.
+        explanation_when_pending: Šiuo el. pašto adresu pateikei paraišką pakvietimui į %{host}. Kai patvirtinsi savo el. pašto adresą, mes peržiūrėsime tavo paraišką. Gali prisijungti ir pakeisti savo duomenis arba ištrinti paskyrą, bet negalėsi naudotis daugeliu funkcijų, kol tavo paskyra nebus patvirtinta. Jei tavo paraiška bus atmesta, duomenys bus pašalinti, todėl jokių papildomų veiksmų iš tavęs nereikės. Jei tai buvo ne tu, ignoruok šį el. laišką.
         extra_html: Taip pat peržiūrėk <a href="%{terms_path}">serverio taisykles</a> ir <a href="%{policy_path}">mūsų paslaugų teikimo sąlygas</a>.
         subject: 'Mastodon: patvirtinimo instrukcijos %{instance}'
         title: Patvirtinti el. pašto adresą
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 2e7ac8746..47b2250f0 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -903,7 +903,6 @@ el:
       delete: Διαγραφή
       edit_preset: Ενημέρωση προκαθορισμένης προειδοποίησης
       empty: Δεν έχετε ακόμη ορίσει κάποια προκαθορισμένη προειδοποίηση.
-      title: Διαχείριση προκαθορισμένων προειδοποιήσεων
     webhooks:
       add_new: Προσθήκη σημείου τερματισμού
       delete: Διαγραφή
diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
index 7cd888b37..07eb84ebb 100644
--- a/config/locales/en-GB.yml
+++ b/config/locales/en-GB.yml
@@ -950,7 +950,6 @@ en-GB:
       delete: Delete
       edit_preset: Edit warning preset
       empty: You haven't defined any warning presets yet.
-      title: Warning presets
     webhooks:
       add_new: Add endpoint
       delete: Delete
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 749f80687..95e3dd5a8 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -919,7 +919,6 @@ eo:
       delete: Forigi
       edit_preset: Redakti avertan antaŭagordon
       empty: Vi ankoraŭ ne difinis iun ajn antaŭagordon de averto.
-      title: Administri avertajn antaŭagordojn
     webhooks:
       add_new: Aldoni finpunkton
       delete: Forigi
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 302be4411..d6bfb60a1 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -951,7 +951,7 @@ es-AR:
       delete: Eliminar
       edit_preset: Editar preajuste de advertencia
       empty: Aún no ha definido ningún preajuste de advertencia.
-      title: Administrar preajustes de advertencia
+      title: Preajustes de advertencia
     webhooks:
       add_new: Agregar punto final
       delete: Eliminar
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 10806c6b6..8f4aa183d 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -951,7 +951,7 @@ es-MX:
       delete: Borrar
       edit_preset: Editar aviso predeterminado
       empty: Aún no has definido ningún preajuste de advertencia.
-      title: Editar configuración predeterminada de avisos
+      title: Preajustes de advertencia
     webhooks:
       add_new: Añadir endpoint
       delete: Eliminar
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 840bc2ce9..343f6f5a6 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -951,7 +951,7 @@ es:
       delete: Borrar
       edit_preset: Editar aviso predeterminado
       empty: Aún no has definido ningún preajuste de advertencia.
-      title: Editar configuración predeterminada de avisos
+      title: Preajustes de advertencia
     webhooks:
       add_new: Añadir endpoint
       delete: Eliminar
diff --git a/config/locales/et.yml b/config/locales/et.yml
index a544d8063..172aad25b 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -949,7 +949,6 @@ et:
       delete: Kustuta
       edit_preset: Hoiatuse eelseadistuse muutmine
       empty: Hoiatuste eelseadeid pole defineeritud.
-      title: Halda hoiatuste eelseadistusi
     webhooks:
       add_new: Lisa lõpp-punkt
       delete: Kustuta
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 22ca8135d..67da357e1 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -952,7 +952,6 @@ eu:
       delete: Ezabatu
       edit_preset: Editatu abisu aurre-ezarpena
       empty: Ez duzu abisu aurrezarpenik definitu oraindik.
-      title: Kudeatu abisu aurre-ezarpenak
     webhooks:
       add_new: Gehitu amaiera-puntua
       delete: Ezabatu
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index d93d2e7d5..509d69fcb 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -808,7 +808,6 @@ fa:
       delete: زدودن
       edit_preset: ویرایش هشدار پیش‌فرض
       empty: هنز هیچ پیش‌تنظیم هشداری را تعریف نکرده‌اید.
-      title: مدیریت هشدارهای پیش‌فرض
     webhooks:
       add_new: افزودن نقطهٔ پایانی
       delete: حذف
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 53db0232a..3a75066d5 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -951,7 +951,6 @@ fi:
       delete: Poista
       edit_preset: Muokkaa varoituksen esiasetusta
       empty: Et ole vielä määrittänyt yhtäkään varoitusten esiasetusta.
-      title: Hallitse varoitusten esiasetuksia
     webhooks:
       add_new: Lisää päätepiste
       delete: Poista
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index 57caff4d7..0372d3dca 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -951,7 +951,7 @@ fo:
       delete: Strika
       edit_preset: Rætta ávaringar-undanstilling
       empty: Tú hevur ikki ásett nakrar ávaringar-undanstillingar enn.
-      title: Stýr ávaringar-undanstillingar
+      title: Undanstillingar fyri ávaring
     webhooks:
       add_new: Legg endapunkt afturat
       delete: Strika
diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml
index 05d6b8864..f297e8bfd 100644
--- a/config/locales/fr-CA.yml
+++ b/config/locales/fr-CA.yml
@@ -949,7 +949,6 @@ fr-CA:
       delete: Supprimer
       edit_preset: Éditer les avertissements prédéfinis
       empty: Vous n'avez pas encore créé de paramètres prédéfinis pour les avertissements.
-      title: Gérer les avertissements prédéfinis
     webhooks:
       add_new: Ajouter un point de terminaison
       delete: Supprimer
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 6ab420880..33cdcd44c 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -949,7 +949,6 @@ fr:
       delete: Supprimer
       edit_preset: Éditer les avertissements prédéfinis
       empty: Vous n'avez pas encore créé de paramètres prédéfinis pour les avertissements.
-      title: Gérer les avertissements prédéfinis
     webhooks:
       add_new: Ajouter un point de terminaison
       delete: Supprimer
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
index 1f1a27fec..c8e287732 100644
--- a/config/locales/fy.yml
+++ b/config/locales/fy.yml
@@ -949,7 +949,6 @@ fy:
       delete: Fuortsmite
       edit_preset: Foarynstelling foar warskôging bewurkje
       empty: Jo hawwe noch gjin foarynstellingen foar warskôgingen tafoege.
-      title: Foarynstellingen foar warskôgingen beheare
     webhooks:
       add_new: Einpunt tafoegje
       delete: Fuortsmite
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index 70bace05c..52b25e285 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -983,7 +983,6 @@ gd:
       delete: Sguab às
       edit_preset: Deasaich rabhadh ro-shuidhichte
       empty: Cha do mhìnich thu ro-sheataichean rabhaidhean fhathast.
-      title: Stiùirich na rabhaidhean ro-shuidhichte
     webhooks:
       add_new: Cuir puing-dheiridh ris
       delete: Sguab às
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 2c85dc89a..a8489e425 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -951,7 +951,7 @@ gl:
       delete: Eliminar
       edit_preset: Editar aviso preestablecido
       empty: Non definiches os avisos prestablecidos.
-      title: Xestionar avisos preestablecidos
+      title: Preestablecidos de advertencia
     webhooks:
       add_new: Engadir punto de extremo
       delete: Eliminar
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 3613a9f0b..9088f4821 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -985,7 +985,7 @@ he:
       delete: למחוק
       edit_preset: ערוך/י טקסט מוכן מראש לאזהרה
       empty: לא הגדרת עדיין שום טקסט מוכן מראש לאזהרה.
-      title: ניהול טקסטים מוכנים מראש לאזהרות
+      title: תצורת אזהרות
     webhooks:
       add_new: הוספת נקודת קצה
       delete: מחיקה
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index dd5783051..d79bca7ff 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -951,7 +951,7 @@ hu:
       delete: Törlés
       edit_preset: Figyelmeztetés szerkesztése
       empty: Nem definiáltál még egyetlen figyelmeztetést sem.
-      title: Figyelmeztetések
+      title: Figyelmeztető szövegek
     webhooks:
       add_new: Végpont hozzáadása
       delete: Törlés
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 8af676454..f8834136b 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -951,7 +951,7 @@ ia:
       delete: Deler
       edit_preset: Rediger aviso predefinite
       empty: Tu non ha ancora definite alcun avisos predefinite.
-      title: Gerer avisos predefinite
+      title: Predefinitiones de avisos
     webhooks:
       add_new: Adder terminal
       delete: Deler
diff --git a/config/locales/id.yml b/config/locales/id.yml
index bee282fa8..aae790f48 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -831,7 +831,6 @@ id:
       delete: Hapus
       edit_preset: Sunting preset peringatan
       empty: Anda belum mendefinisikan peringatan apapun.
-      title: Kelola preset peringatan
     webhooks:
       add_new: Tambah titik akhir
       delete: Hapus
diff --git a/config/locales/ie.yml b/config/locales/ie.yml
index 473d7b750..432e7d031 100644
--- a/config/locales/ie.yml
+++ b/config/locales/ie.yml
@@ -950,7 +950,6 @@ ie:
       delete: Deleter
       edit_preset: Modificar prefiguration de avise
       empty: Vu ancor ha definit null prefigurationes de avise.
-      title: Modificar prefigurationes de avise
     webhooks:
       add_new: Adjunter punctu terminal
       delete: Deleter
diff --git a/config/locales/io.yml b/config/locales/io.yml
index ed0d0d634..bccdcb3cc 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -928,7 +928,6 @@ io:
       delete: Efacez
       edit_preset: Modifikez avertfixito
       empty: Vu ne fixis irga avertfixito til nun.
-      title: Jerez avertfixiti
     webhooks:
       add_new: Insertez finpunto
       delete: Efacez
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 997775296..75950e572 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -953,7 +953,7 @@ is:
       delete: Eyða
       edit_preset: Breyta forstilltri aðvörun
       empty: Þú hefur ekki enn skilgreint neinar aðvaranaforstillingar.
-      title: Sýsla með forstilltar aðvaranir
+      title: Forstilltar aðvaranir
     webhooks:
       add_new: Bæta við endapunkti
       delete: Eyða
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 5b75e7af7..c3389f59c 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -951,7 +951,7 @@ it:
       delete: Cancella
       edit_preset: Modifica avviso predefinito
       empty: Non hai ancora definito alcun avviso preimpostato.
-      title: Gestisci avvisi predefiniti
+      title: Preimpostazioni di avviso
     webhooks:
       add_new: Aggiungi endpoint
       delete: Elimina
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 0712ba380..6c0fba259 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -933,7 +933,6 @@ ja:
       delete: 削除
       edit_preset: プリセット警告文を編集
       empty: まだプリセット警告文が作成されていません。
-      title: プリセット警告文を管理
     webhooks:
       add_new: エンドポイントを追加
       delete: 削除
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index f08d8ead1..2695127f0 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -299,7 +299,6 @@ kk:
       add_new: Add nеw
       delete: Deletе
       edit_preset: Edit warning prеset
-      title: Manage warning presеts
   admin_mailer:
     new_pending_account:
       body: Жаңа есептік жазба туралы мәліметтер төменде берілген. Бұл қолданбаны мақұлдауыңызға немесе қабылдамауыңызға болады.
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index b104e31fc..9de2f6ca5 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -936,7 +936,7 @@ ko:
       delete: 삭제
       edit_preset: 경고 프리셋 편집
       empty: 아직 어떤 경고 틀도 정의되지 않았습니다.
-      title: 경고 틀 관리
+      title: 경고 프리셋
     webhooks:
       add_new: 엔드포인트 추가
       delete: 삭제
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index 74dcd6f8f..c24337dd7 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -849,7 +849,6 @@ ku:
       delete: Jê bibe
       edit_preset: Hişyariyên pêşsazkirî serrast bike
       empty: Te hin tu hişyariyên pêşsazkirî destnîşan nekirine.
-      title: Hişyariyên pêşsazkirî bi rêve bibe
     webhooks:
       add_new: Xala dawîbûnê tevlî bike
       delete: Jê bibe
diff --git a/config/locales/lad.yml b/config/locales/lad.yml
index 9c165472c..d0657e73f 100644
--- a/config/locales/lad.yml
+++ b/config/locales/lad.yml
@@ -950,7 +950,6 @@ lad:
       delete: Efasa
       edit_preset: Edita avizo predeterminado
       empty: Ainda no tienes definido ningun avizo predeterminado.
-      title: Edita konfigurasyon predeterminada de avizos
     webhooks:
       add_new: Adjusta endpoint
       delete: Efasa
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 3e514a547..8e32ed07b 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -451,7 +451,7 @@ lt:
       filter:
         all: Visi
         available: Pasiekiamas
-        expired: Pasibaigęs
+        expired: Nebegaliojantis
         title: Filtras
       title: Kvietimai
     relays:
@@ -505,9 +505,15 @@ lt:
       unresolved: Neišspręsti
       updated_at: Atnaujinti
     roles:
+      categories:
+        invites: Kvietimai
       everyone: Numatytieji leidimai
       everyone_full_description_html: Tai – <strong>bazinis vaidmuo</strong>, turintis įtakos <strong>visiems naudotojams</strong>, net ir tiems, kurie neturi priskirto vaidmens. Visi kiti vaidmenys iš jo paveldi teises.
       privileges:
+        invite_users: Kviesti naudotojus
+        invite_users_description: Leidžia naudotojams pakviesti naujus žmones į serverį.
+        manage_invites: Tvarkyti kvietimus
+        manage_invites_description: Leidžia naudotojams naršyti ir deaktyvuoti kvietimų nuorodas.
         manage_taxonomies_description: Leidžia naudotojams peržiūrėti tendencingą turinį ir atnaujinti saitažodžių nustatymus
     settings:
       captcha_enabled:
@@ -522,12 +528,34 @@ lt:
       registrations:
         moderation_recommandation: Prieš atidarant registraciją visiems, įsitikink, kad turi tinkamą ir reaguojančią prižiūrėjimo komandą!
     software_updates:
-      description: Rekomenduojama nuolat atnaujinti Mastodon diegyklę, kad galėtum naudotis naujausiais pataisymais ir funkcijomis. Be to, kartais labai svarbu laiku naujinti Mastodon, kad būtų išvengta saugumo problemų. Dėl šių priežasčių Mastodon kas 30 minučių tikrina, ar yra atnaujinimų, ir praneša tau apie tai pagal tavo el. pašto pranešimų parinktis.
+      description: Rekomenduojama nuolat atnaujinti Mastodon diegyklę, kad galėtum naudotis naujausiais pataisymais ir funkcijomis. Be to, kartais labai svarbu laiku atnaujinti Mastodon, kad būtų išvengta saugumo problemų. Dėl šių priežasčių Mastodon kas 30 minučių tikrina, ar yra naujinimų, ir praneša tau apie tai pagal tavo el. pašto pranešimų parinktis.
+      documentation_link: Sužinoti daugiau
+      release_notes: Leidimo informacija
+      title: Galimi naujinimai
+      type: Tipas
+      types:
+        major: Pagrindinis leidimas
+        minor: Nedidelis leidimas
+        patch: Pataiso leidimas – riktų taisymai ir lengvai pritaikomi pakeitimai
+      version: Versija
     statuses:
+      account: Autorius (-ė)
+      application: Programa
       back_to_account: Grįžti į paskyros puslapį
+      back_to_report: Grįžti į ataskaitos puslapį
+      batch:
+        remove_from_report: Pašalinti iš ataskaitos
+      deleted: Ištrinta
+      favourites: Mėgstami
+      history: Versijų istorija
+      in_reply_to: Atsakydant į
+      language: Kalba
       media:
         title: Medija
-      no_status_selected: Jokie statusai nebuvo pakeisti, nes niekas nepasirinkta
+      metadata: Metaduomenys
+      no_status_selected: Jokie įrašai nebuvo pakeisti, nes nė vienas buvo pasirinktas
+      open: Atidaryti įrašą
+      original_status: Originalus įrašas
       title: Paskyros statusai
       trending: Tendencinga
       with_media: Su medija
@@ -537,6 +565,7 @@ lt:
       elasticsearch_preset:
         message_html: Tavo Elasticsearch klasteris turi daugiau nei vieną mazgą, bet Mastodon nėra sukonfigūruotas juos naudoti.
       elasticsearch_preset_single_node:
+        action: Žiūrėti dokumentaciją
         message_html: Tavo Elasticsearch klasteris turi tik vieną mazgą, <code>ES_PRESET</code> turėtų būti nustatyta į <code>single_node_cluster</code>.
     title: Administracija
     trends:
@@ -571,8 +600,20 @@ lt:
         disallow_account: Neleisti autorių (-ę)
         no_status_selected: Jokie tendencingi įrašai nebuvo pakeisti, nes nė vienas iš jų nebuvo pasirinktas
         not_discoverable: Autorius (-ė) nesutiko, kad būtų galima juos atrasti
+        shared_by:
+          few: Bendrinta arba pamėgta %{friendly_count} kartus
+          many: Bendrinta arba pamėgta %{friendly_count} karto
+          one: Bendrinta arba pamėgta vieną kartą
+          other: Bendrinta arba pamėgta %{friendly_count} kartų
         title: Tendencingi įrašai
       tags:
+        dashboard:
+          tag_accounts_measure: unikalūs naudojimai
+          tag_languages_dimension: Populiariausios kalbos
+          tag_servers_dimension: Populiariausi serveriai
+          tag_servers_measure: skirtingi serveriai
+          tag_uses_measure: bendri naudojimai
+        listable: Gali būti siūloma
         not_trendable: Nepasirodys tendencijose
         title: Tendencingos saitažodžiai
         trendable: Gali pasirodyti tendencijose
@@ -583,7 +624,6 @@ lt:
       add_new: Pridėti naują
       delete: Ištrinti
       edit_preset: Keisti įspėjimo nustatymus
-      title: Valdyti įspėjimo nustatymus
     webhooks:
       description_html: "<strong>Webhook</strong> leidžia Mastodon siųsti <strong>realaus laiko pranešimus</strong> apie pasirinktus įvykius į tavo programą, kad programa galėtų <strong>automatiškai paleisti reakcijas</strong>."
       events: Įvykiai
@@ -627,21 +667,32 @@ lt:
     warning: Būkite atsargūs su šia informacija. Niekada jos nesidalinkite!
     your_token: Tavo prieigos raktas
   auth:
+    confirmations:
+      welcome_title: Sveiki, %{name}!
     delete_account: Ištrinti paskyrą
     delete_account_html: Jeigu norite ištrinti savo paskyrą, galite eiti <a href="%{path}">čia</a>. Jūsų prašys patvirtinti pasirinkimą.
+    description:
+      prefix_invited_by_user: "@%{name} kviečia prisijungti prie šio Mastodon serverio!"
+      prefix_sign_up: Užsiregistruok Mastodon šiandien!
+    didnt_get_confirmation: Negavai patvirtinimo nuorodos?
     dont_have_your_security_key: Neturi saugumo rakto?
-    forgot_password: Pamiršote slaptažodį?
-    invalid_reset_password_token: Slaptažodžio atkūrimo žetonas netinkamas arba jo galiojimo laikas pasibaigęs. Prašykite naujo žetono.
+    forgot_password: Pamiršai slaptažodį?
+    invalid_reset_password_token: Slaptažodžio atkūrimo raktas yra netinkamas arba nebegaliojantis. Paprašyk naujo.
+    log_in_with: Prisijungti su
     login: Prisijungti
     logout: Atsijungti
     migrate_account: Prisijungti prie kitos paskyros
     migrate_account_html: Jeigu norite nukreipti šią paskyrą į kita, galite tai <a href="%{path}">konfiguruoti čia</a>.
     or_log_in_with: Arba prisijungti su
+    providers:
+      cas: CAS
+      saml: SAML
     register: Užsiregistruoti
     reset_password: Atstatyti slaptažodį
     rules:
       invited_by: 'Gali prisijungti prie %{domain} pagal kvietimą, kurį gavai iš:'
       preamble_invited: Prieš tęsiant, atsižvelk į pagrindines taisykles, kurias nustatė %{domain} prižiūrėtojai.
+      title_invited: Esi pakviestas.
     security: Apsauga
     set_new_password: Nustatyti naują slaptažodį
     status:
@@ -673,6 +724,9 @@ lt:
     success_msg: Tavo paskyra buvo sėkmingai ištrinta
   disputes:
     strikes:
+      created_at: Data
+      title_actions:
+        none: Įspėjimas
       your_appeal_approved: Tavo apeliacija buvo patvirtinta
       your_appeal_pending: Pateikei apeliaciją
       your_appeal_rejected: Tavo apeliacija buvo atmesta
@@ -699,6 +753,8 @@ lt:
       request: Prašyti savo archyvo
       size: Dydis
     blocks: Jūs blokuojate
+    bookmarks: Žymės
+    csv: CSV
     domain_blocks: Domeno blokai
     lists: Sąrašai
     mutes: Jūs tildote
@@ -708,11 +764,14 @@ lt:
     hint_html: "<strong>Savo profilyje parodyk svarbiausius saitažodžius.</strong> Tai puikus įrankis kūrybiniams darbams ir ilgalaikiams projektams sekti, todėl svarbiausios saitažodžiai rodomi matomoje vietoje profilyje ir leidžia greitai pasiekti tavo paties įrašus."
   filters:
     contexts:
-      home: Namų laiko juosta
-      notifications: Priminimai
+      account: Profiliai
+      home: Pagrindinis ir sąrašai
+      notifications: Pranešimai
       public: Viešieji laiko skalės
       thread: Pokalbiai
     edit:
+      add_keyword: Pridėti raktažodį
+      keywords: Raktažodžiai
       title: Keisti filtrą
     errors:
       invalid_context: Jokio arba netinkamas pateiktas kontekstas
@@ -726,9 +785,14 @@ lt:
     all: Visi
     changes_saved_msg: Pakeitimai sėkmingai išsaugoti!
     copy: Kopijuoti
+    delete: Ištrinti
+    deselect: Panaikinti visus žymėjimus
     order_by: Tvarkyti pagal
     save_changes: Išsaugoti pakeitimus
+    today: šiandien
   imports:
+    errors:
+      too_large: Failas per didelis.
     modes:
       merge: Sulieti
       merge_long: Išsaugoti esančius įrašus ir pridėti naujus
@@ -744,7 +808,7 @@ lt:
     upload: Įkelti
   invites:
     delete: Deaktyvuoti
-    expired: Pasibaigė
+    expired: Nebegaliojantis
     expires_in:
       '1800': 30 minučių
       '21600': 6 valandų
@@ -753,28 +817,29 @@ lt:
       '604800': 1 savaitės
       '86400': 1 dienos
     expires_in_prompt: Niekada
-    generate: Generuoti
+    generate: Generuoti kvietimo nuorodą
     invalid: Šis kvietimas negalioja.
-    invited_by: 'Jus pakvietė:'
+    invited_by: 'Tave pakvietė:'
     max_uses:
       few: "%{count} naudojimai"
       many: "%{count} naudojimo"
       one: 1 naudojimas
       other: "%{count} naudojimų"
-    max_uses_prompt: Nėra limito
+    max_uses_prompt: Nėra ribojimo
     prompt: Generuok ir bendrink nuorodas su kitais, kad suteiktum prieigą prie šio serverio
     table:
       expires_at: Baigsis
       uses: Naudojimai
-    title: Pakviesti žmones
+    title: Kviesti žmones
   media_attachments:
     validations:
       images_and_video: Negalima pridėti video prie statuso, kuris jau turi nuotrauką
       too_many: Negalima pridėti daugiau nei 4 failų
   migrations:
-    acct: slapyvardis@domenas naujam vartotojui
+    acct: Perkelta į
+    cancel: Atšaukti nukreipimą
   moderation:
-    title: Moderacija
+    title: Prižiūrėjimas
   notification_mailer:
     favourite:
       body: 'Tavo įrašą pamėgo %{name}:'
@@ -801,11 +866,19 @@ lt:
   notifications:
     email_events: Įvykiai, skirti el. laiško pranešimams
     email_events_hint: 'Pasirink įvykius, apie kuriuos nori gauti pranešimus:'
+  number:
+    human:
+      decimal_units:
+        units:
+          billion: mlrd.
+          million: mln.
+          thousand: tūkst.
   pagination:
     newer: Naujesnis
     next: Kitas
     older: Senesnis
     prev: Ankstesnis
+    truncate: "&hellip;"
   preferences:
     other: Kita
     posting_defaults: Skelbimo numatytosios nuostatos
@@ -829,6 +902,7 @@ lt:
     dormant: Neaktyvus
     followers: Sekėjai
     following: Sekama
+    invited: Pakviestas
     last_active: Paskutinį kartą aktyvus
     most_recent: Naujausias
     moved: Perkelta
@@ -851,24 +925,35 @@ lt:
     date: Data
     description: "%{browser} ant %{platform}"
     explanation: Čia rodomos web naršyklės prijungtos prie Jūsų Mastodon paskyros.
+    ip: IP
     platforms:
+      adobe_air: Adobe Air
       android: Android
+      blackberry: BlackBerry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
       ios: iOS
       kai_os: KaiOS
+      linux: Linux
       mac: macOS
+      unknown_platform: Nežinoma platforma
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
-    revoke: Atšaukti
+    revoke: Naikinti
     revoke_success: Seansas sėkmingai panaikintas.
     title: Seansai
   settings:
-    authorized_apps: Autorizuotos aplikacijos
+    account: Paskyra
+    account_settings: Paskyros nustatymai
+    aliases: Paskyros pseudonimai
+    appearance: Išvaizda
+    authorized_apps: Leidžiamos programėlės
     back: Grįžti į Mastodon
     delete: Paskyros trynimas
-    development: Plėtojimas
-    edit_profile: Keisti profilį
-    export: Informacijos eksportas
+    development: Kūrimas
+    edit_profile: Redaguoti profilį
+    export: Duomenų eksportas
     featured_tags: Rodomi saitažodžiai
     import: Importuoti
     migrate: Paskyros migracija
@@ -879,10 +964,22 @@ lt:
     severed_relationships: Nutrūkę sąryšiai
     two_factor_authentication: Dviejų veiksnių autentikacija
   severed_relationships:
+    download: Atsisiųsti (%{count})
     preamble: Užblokavus domeną arba prižiūrėtojams nusprendus pristabdyti nuotolinio serverio veiklą, gali prarasti sekimus ir sekėjus. Kai taip atsitiks, galėsi atsisiųsti nutrauktų sąryšių sąrašus, kad juos patikrinti ir galbūt importuoti į kitą serverį.
+    type: Įvykis
   statuses:
     attached:
+      audio:
+        few: "%{count} garso įrašai"
+        many: "%{count} garso įrašo"
+        one: "%{count} garso įrašas"
+        other: "%{count} garso įrašų"
       description: 'Pridėta: %{attached}'
+      image:
+        few: "%{count} vaizdai"
+        many: "%{count} vaizdo"
+        one: "%{count} vaizdas"
+        other: "%{count} vaizdų"
     boosted_from_html: Pakelta iš %{acct_link}
     content_warning: 'Turinio įspėjimas: %{warning}'
     open_in_web: Atidaryti naudojan Web
@@ -891,11 +988,14 @@ lt:
       limit: Jūs jau prisegėte maksimalų toot'ų skaičų
       ownership: Kitų vartotojų toot'ai negali būti prisegti
       reblog: Pakeltos žinutės negali būti prisegtos
-    show_more: Daugiau
+    poll:
+      vote: Balsuoti
+    show_more: Rodyti daugiau
+    show_thread: Rodyti giją
     visibilities:
       private: Tik sekėjams
       private_long: rodyti tik sekėjams
-      public: Viešas
+      public: Vieša
       public_long: visi gali matyti
       unlisted: Neįtrauktas į sąrašus
       unlisted_long: matyti gali visi, bet nėra išvardyti į viešąsias laiko skales
@@ -904,6 +1004,7 @@ lt:
     keep_polls_hint: Neištrina jokių tavo apklausų
     keep_self_bookmark: Laikyti įrašus, kuriuos pažymėjai
     keep_self_bookmark_hint: Neištrina tavo pačių įrašų, jei esi juos pažymėjęs (-usi)
+    keep_self_fav_hint: Neištrina tavo pačių įrašų, jei esi juos pamėgęs (-usi)
   stream_entries:
     sensitive_content: Jautrus turinys
   themes:
@@ -912,7 +1013,8 @@ lt:
     mastodon-light: Mastodon (šviesi)
     system: Automatinis (naudoti sistemos temą)
   two_factor_authentication:
-    disable: Išjungti
+    add: Pridėti
+    disable: Išjungti 2FA
     enabled: Dviejų veiksnių autentikacija įjungta
     enabled_success: Dviejų veiksnių autentikacija sėkmingai įjungta
     generate_recovery_codes: Sugeneruoti atkūrimo kodus
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index f4f0aa9db..5a071eba8 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -961,7 +961,6 @@ lv:
       delete: Dzēst
       edit_preset: Labot iepriekš iestatītus brīdinājumus
       empty: Tu vēl neesi definējis iepriekš iestatītos brīdinājumus.
-      title: Pārvaldīt brīdinājuma iestatījumus
     webhooks:
       add_new: Pievienot galapunktu
       delete: Dzēst
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index f39c26a5c..a778d0c28 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -924,7 +924,6 @@ ms:
       delete: Padam
       edit_preset: Edit pratetap amaran
       empty: Anda belum menentukan sebarang pratetap amaran lagi.
-      title: Urus pratetap amaran
     webhooks:
       add_new: Tambah titik akhir
       delete: Padam
diff --git a/config/locales/my.yml b/config/locales/my.yml
index 4ac9ecdd4..f28458360 100644
--- a/config/locales/my.yml
+++ b/config/locales/my.yml
@@ -909,7 +909,6 @@ my:
       delete: ဖျက်ပါ
       edit_preset: ကြိုသတိပေးချက်ကို ပြင်ဆင်ပါ
       empty: ကြိုသတိပေးချက်များကို မသတ်မှတ်ရသေးပါ။
-      title: ကြိုသတိပေးချက်များကို စီမံပါ
     webhooks:
       add_new: ဆုံးမှတ် ထည့်ပါ
       delete: ဖျက်ပါ
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 3452f8099..a527fdb5a 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -951,7 +951,7 @@ nl:
       delete: Verwijderen
       edit_preset: Preset voor waarschuwing bewerken
       empty: Je hebt nog geen presets voor waarschuwingen toegevoegd.
-      title: Presets voor waarschuwingen beheren
+      title: Presets voor waarschuwingen
     webhooks:
       add_new: Eindpunt toevoegen
       delete: Verwijderen
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index 013674ca5..9291ba2c2 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -950,7 +950,6 @@ nn:
       delete: Slett
       edit_preset: Endr åtvaringsoppsett
       empty: Du har ikke definert noen forhåndsinnstillinger for advarsler enda.
-      title: Handsam åtvaringsoppsett
     webhooks:
       add_new: Legg til endepunkt
       delete: Slett
diff --git a/config/locales/no.yml b/config/locales/no.yml
index c71dffc63..537552ea9 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -944,7 +944,6 @@
       delete: Slett
       edit_preset: Rediger advarsel forhåndsinnstilling
       empty: Du har ikke definert noen forhåndsinnstillinger for varsler enda.
-      title: Endre forhåndsinnstillinger for advarsler
     webhooks:
       add_new: Legg til endepunkt
       delete: Slett
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 0a653ea46..d2bea55bd 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -430,7 +430,6 @@ oc:
       add_new: N’ajustar un nòu
       delete: Escafar
       edit_preset: Modificar lo tèxt predefinit d’avertiment
-      title: Gerir los tèxtes predefinits
     webhooks:
       delete: Suprimir
       disable: Desactivar
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 1c3fda8d0..4c7af82b9 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -985,7 +985,7 @@ pl:
       delete: Usuń
       edit_preset: Edytuj szablon ostrzeżenia
       empty: Nie zdefiniowano jeszcze żadnych szablonów ostrzegawczych.
-      title: Zarządzaj szablonami ostrzeżeń
+      title: Zapisane ostrzeżenia
     webhooks:
       add_new: Dodaj punkt końcowy
       delete: Usuń
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 60730d53e..6b80edb24 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -950,7 +950,6 @@ pt-BR:
       delete: Excluir
       edit_preset: Editar o aviso pré-definido
       empty: Você ainda não definiu nenhuma predefinição de alerta.
-      title: Gerenciar os avisos pré-definidos
     webhooks:
       add_new: Adicionar endpoint
       delete: Excluir
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index b4669e24d..49522b741 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -951,7 +951,7 @@ pt-PT:
       delete: Eliminar
       edit_preset: Editar o aviso predefinido
       empty: Ainda não definiu nenhum aviso predefinido.
-      title: Gerir os avisos predefinidos
+      title: Predefinições de aviso
     webhooks:
       add_new: Adicionar endpoint
       delete: Eliminar
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 85d8a7a54..d6b8726ba 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -978,7 +978,6 @@ ru:
       delete: Удалить
       edit_preset: Удалить шаблон предупреждения
       empty: Вы еще не определили пресеты предупреждений.
-      title: Управление шаблонами предупреждений
     webhooks:
       add_new: Добавить конечную точку
       delete: Удалить
diff --git a/config/locales/sc.yml b/config/locales/sc.yml
index 01c355794..449d8d9c7 100644
--- a/config/locales/sc.yml
+++ b/config/locales/sc.yml
@@ -535,7 +535,6 @@ sc:
       delete: Cantzella
       edit_preset: Modìfica s'avisu predefinidu
       empty: No as cunfiguradu ancora perunu avisu predefinidu.
-      title: Gesti is cunfiguratziones predefinidas de is avisos
     webhooks:
       delete: Cantzella
       disable: Disativa
diff --git a/config/locales/sco.yml b/config/locales/sco.yml
index 2a7b1e3e7..7c733b71b 100644
--- a/config/locales/sco.yml
+++ b/config/locales/sco.yml
@@ -842,7 +842,6 @@ sco:
       delete: Delete
       edit_preset: Edit warnin preset
       empty: Ye huvnae definit onie warnin presets yit.
-      title: Manage warnin presets
     webhooks:
       add_new: Add enpynt
       delete: Delete
diff --git a/config/locales/si.yml b/config/locales/si.yml
index f5e65fda8..0f714ee14 100644
--- a/config/locales/si.yml
+++ b/config/locales/si.yml
@@ -726,7 +726,6 @@ si:
       delete: මකන්න
       edit_preset: අනතුරු ඇඟවීමේ පෙර සැකසුම සංස්කරණය කරන්න
       empty: ඔබ තවම කිසිදු අනතුරු ඇඟවීමේ පෙරසිටුවක් නිර්වචනය කර නැත.
-      title: අනතුරු ඇඟවීමේ පෙරසිටුවීම් කළමනාකරණය කරන්න
     webhooks:
       add_new: අන්ත ලක්ෂ්‍යය එක් කරන්න
       delete: මකන්න
diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml
index 1c73ce0a8..789121be4 100644
--- a/config/locales/simple_form.lt.yml
+++ b/config/locales/simple_form.lt.yml
@@ -79,6 +79,7 @@ lt:
         mascot: Pakeičia išplėstinės žiniatinklio sąsajos iliustraciją.
         media_cache_retention_period: Nuotolinių naudotojų įrašytų įrašų medijos failai talpinami tavo serveryje. Nustačius teigiamą reikšmę, medijos bus ištrinamos po nurodyto dienų skaičiaus. Jei medijos duomenų bus paprašyta po to, kai jie bus ištrinti, jie bus atsiųsti iš naujo, jei šaltinio turinys vis dar prieinamas. Dėl apribojimų, susijusių su nuorodų peržiūros kortelių apklausos dažnumu trečiųjų šalių svetainėse, rekomenduojama nustatyti šią reikšmę ne trumpesnę kaip 14 dienų, kitaip nuorodų peržiūros kortelės nebus atnaujinamos pagal pareikalavimą iki to laiko.
         peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme.
+        require_invite_text: Kai registraciją reikia patvirtinti rankiniu būdu, teksto įvesties laukelį „Kodėl nori prisijungti?“ padaryk privalomą, o ne pasirenkamą
         site_contact_email: Kaip žmonės gali su tavimi susisiekti teisiniais ar pagalbos užklausimais.
         site_contact_username: Kaip žmonės gali tave pasiekti Mastodon.
         site_extended_description: Bet kokia papildoma informacija, kuri gali būti naudinga lankytojams ir naudotojams. Gali būti struktūrizuota naudojant Markdown sintaksę.
@@ -86,6 +87,8 @@ lt:
         timeline_preview: Atsijungę lankytojai galės naršyti naujausius viešus įrašus, esančius serveryje.
         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.
+      invite_request:
+        text: Tai padės mums peržiūrėti tavo paraišką
       rule:
         hint: Pasirinktinai. Pateik daugiau informacijos apie taisyklę.
       sessions:
@@ -108,6 +111,7 @@ lt:
       admin_account_action:
         include_statuses: Įtraukti praneštus įrašus į el. laišką
       defaults:
+        autofollow: Kviesti sekti tavo paskyrą
         avatar: Profilio nuotrauka
         bot: Tai automatinė paskyra
         chosen_languages: Filtruoti kalbas
@@ -163,6 +167,7 @@ lt:
         custom_css: Pasirinktinis CSS
         mascot: Pasirinktinis talismanas (pasenęs)
         registrations_mode: Kas gali užsiregistruoti
+        require_invite_text: Reikalauti priežasties prisijungti
         show_domain_blocks_rationale: Rodyti, kodėl domenai buvo užblokuoti
         site_extended_description: Išplėstas aprašymas
         site_short_description: Serverio aprašymas
@@ -173,6 +178,8 @@ lt:
         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:
         text: Kodėl nori prisijungti?
       notification_emails:
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 8bc717fe1..2271d7037 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -28,7 +28,7 @@ nl:
           sensitive: Forceer dat alle mediabijlagen van deze gebruiker als gevoelig worden gemarkeerd.
           silence: Voorkom dat de gebruiker berichten kan plaatsen met openbare zichtbaarheid, verberg diens berichten en meldingen van mensen die de gebruiker niet volgen. Sluit alle rapportages tegen dit account af.
           suspend: Voorkom interactie van of naar dit account en verwijder de inhoud. Dit is omkeerbaar binnen 30 dagen. Dit sluit alle rapporten tegen dit account af.
-        warning_preset_id: Optioneel. Je kunt nog steeds handmatig tekst toevoegen aan het eind van de voorinstelling
+        warning_preset_id: Optioneel. Je kunt nog steeds handmatig tekst toevoegen aan het eind van de preset
       announcement:
         all_day: Wanneer dit is aangevinkt worden alleen de datums binnen het tijdvak getoond
         ends_at: Optioneel. De publicatie van de mededeling wordt op dit tijdstip automatisch beëindigd
@@ -168,7 +168,7 @@ nl:
           sensitive: Gevoelig
           silence: Beperken
           suspend: Opschorten en onomkeerbaar accountgegevens verwijderen
-        warning_preset_id: Gebruik een voorinstelling van een waarschuwing
+        warning_preset_id: Een preset voor een waarschuwing gebruiken
       announcement:
         all_day: Gedurende de hele dag
         ends_at: Eindigt
diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml
index 8dd198656..710f81e84 100644
--- a/config/locales/simple_form.sr-Latn.yml
+++ b/config/locales/simple_form.sr-Latn.yml
@@ -20,7 +20,7 @@ sr-Latn:
       admin_account_action:
         include_statuses: Korisnik će videti koje su objave prouzrokovale moderacijsku radnju ili upozorenje
         send_email_notification: Korisnik će dobiti objašnjenje toga šta mu se desilo sa nalogom
-        text_html: Opcionalno. Možete koristiti sintaksu objava. Možete <a href="%{path}">dodati unapred određene postavke upozorenja</a> za uštedu vremena
+        text_html: Opciono. Možete koristiti sintaksu objava. Možete <a href="%{path}">dodati predefinisana upozorenja</a> za uštedu vremena
         type_html: Izaberite šta da radite sa <strong>%{acct}</strong>
         types:
           disable: Sprečava korisnika da koristi svoj nalog, ali ne briše niti sakriva njegove sadržaje.
@@ -28,7 +28,7 @@ sr-Latn:
           sensitive: Učini da svi medijski prilozi ovog korisnika prisilno budu označeni kao osetljivi.
           silence: Sprečava korisnika da pravi javne objave, sakriva njegove objave i obaveštenja od ljudi koji ga ne prate. Zatvara sve prijave podnete protiv ovog naloga.
           suspend: Sprečava svu interakciju od ovog naloga i ka ovom nalogu i briše njegov sadržaj. Opozivo u roku od 30 dana. Zatvara sve prijave podnete protiv ovog naloga.
-        warning_preset_id: Opcionalno. Možete i dalje dodati prilagođeni tekst na kraj preseta
+        warning_preset_id: Opciono. Možete i dalje dodati prilagođeni tekst na kraj predefinisane vrednosti
       announcement:
         all_day: Kada je ova opcija označena, samo datumi iz vremenskog opsega će biti prikazani
         ends_at: Opciono. Objava će biti automatski opozvana u ovom trenutku
@@ -118,7 +118,7 @@ sr-Latn:
           sign_up_requires_approval: Nove registracije će zahtevati Vaše odobrenje
         severity: Izaberite šta će se desiti sa zahtevima sa ove IP adrese
       rule:
-        hint: Opcionalno. Pružite više detalja o pravilu
+        hint: Opciono. Pružite više detalja o pravilu
         text: Opišite pravilo ili uslov za korisnike na ovom serveru. Potrudite se da opis bude kratak i jednostavan
       sessions:
         otp: 'Unesite dvofaktorski kod sa Vašeg telefona ili koristite jedan od kodova za oporavak:'
@@ -155,7 +155,7 @@ sr-Latn:
       account_migration:
         acct: Ručica (@) novog naloga
       account_warning_preset:
-        text: Tekst preseta
+        text: Tekst predefinisane vrednosti
         title: Naslov
       admin_account_action:
         include_statuses: Uključi prijavljene objave u e-poštu
@@ -168,7 +168,7 @@ sr-Latn:
           sensitive: Osetljivo
           silence: Utišaj
           suspend: Obustavite i nepovratno izbrišite podatke o nalogu
-        warning_preset_id: Koristi upozoravajući preset
+        warning_preset_id: Koristi predefinisano upozorenje
       announcement:
         all_day: Celodnevni događaj
         ends_at: Kraj događaja
diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml
index e88a99df1..c5fbc9185 100644
--- a/config/locales/simple_form.sr.yml
+++ b/config/locales/simple_form.sr.yml
@@ -20,7 +20,7 @@ sr:
       admin_account_action:
         include_statuses: Корисник ће видети које су објаве проузроковале модерацијску радњу или упозорење
         send_email_notification: Корисник ће добити објашњење тога шта му се десило са налогом
-        text_html: Опционално. Можете користити синтаксу објава. Можете <a href="%{path}">додати унапред одређене поставке упозорења</a> за уштеду времена
+        text_html: Опционо. Можете користити синтаксу објава. Можете <a href="%{path}">додати предефинисана упозорења</a> за уштеду времена
         type_html: Изаберите шта да радите са <strong>%{acct}</strong>
         types:
           disable: Спречава корисника да користи свој налог, али не брише нити сакрива његове садржаје.
@@ -28,7 +28,7 @@ sr:
           sensitive: Учини да сви медијски прилози овог корисника присилно буду означени као осетљиви.
           silence: Спречава корисника да прави јавне објаве, сакрива његове објаве и обавештења од људи који га не прате. Затвара све пријаве поднете против овог налога.
           suspend: Спречава сву интеракцију од овог налога и ка овом налогу и брише његов садржај. Опозиво у року од 30 дана. Затвара све пријаве поднете против овог налога.
-        warning_preset_id: Опционално. Можете и даље додати прилагођени текст на крај пресета
+        warning_preset_id: Опционо. Можете и даље додати прилагођени текст на крај предефинисане вредности
       announcement:
         all_day: Када је ова опција означена, само датуми из временског опсега ће бити приказани
         ends_at: Опционо. Објава ће бити аутоматски опозвана у овом тренутку
@@ -88,7 +88,7 @@ sr:
         media_cache_retention_period: Медијске датотеке из објава удаљених корисника се кеширају на вашем серверу. Када се подеси на позитивну вредност, медији ће бити избрисани након наведеног броја дана. Ако се медијски подаци захтевају након брисања, биће поново преузети, ако је изворни садржај и даље доступан. Због ограничења колико често картице за преглед веза анкетирају сајтове трећих страна, препоручује се да ову вредност поставите на најмање 14 дана, иначе картице за преглед веза неће бити ажуриране на захтев пре тог времена.
         peers_api_enabled: Листа домена са којима се овај сервер сусрео у федиверзуму. Овде нису садржани подаци о томе да ли се Ваш сервер федерише са другим серверима, већ само да Ваш сервер зна за њих. Ове информације користе сервиси који прикупљају податке и воде статистику о федерацији у ширем смислу.
         profile_directory: Директоријум профила наводи све кориснике који су се определили да буду видљиви.
-        require_invite_text: Када регистрације захтевају ручно одобрење, поставите да одговор на „Зашто желите да се придружите?“ буде обавезан, а не опционалан
+        require_invite_text: Када регистрације захтевају ручно одобрење, постави да унос текста „Зашто желиш да се придружиш?“ буде обавезан, а не опциони
         site_contact_email: Како корисници могу да контактирају са Вама за правна питања или питања у вези подршке.
         site_contact_username: Како корисници могу да контактирају са вама на Mastodon-у.
         site_extended_description: Било какве додатне информације које могу бити корисне посетиоцима и Вашим корисницима. Могу се структурирати помоћу Markdown синтаксе.
@@ -118,7 +118,7 @@ sr:
           sign_up_requires_approval: Нове регистрације ће захтевати Ваше одобрење
         severity: Изаберите шта ће се десити са захтевима са ове IP адресе
       rule:
-        hint: Опционално. Пружите више детаља о правилу
+        hint: Опционо. Пружите више детаља о правилу
         text: Опишите правило или услов за кориснике на овом серверу. Потрудите се да опис буде кратак и једноставан
       sessions:
         otp: 'Унесите двофакторски код са Вашег телефона или користите један од кодова за опоравак:'
@@ -155,7 +155,7 @@ sr:
       account_migration:
         acct: Ручица (@) новог налога
       account_warning_preset:
-        text: Текст пресета
+        text: Текст предефинисане вредности
         title: Наслов
       admin_account_action:
         include_statuses: Укључи пријављене објаве у е-пошту
@@ -168,7 +168,7 @@ sr:
           sensitive: Осетљиво
           silence: Утишај
           suspend: Обуставите и неповратно избришите податке о налогу
-        warning_preset_id: Користи упозоравајући пресет
+        warning_preset_id: Користи предефинисано упозорење
       announcement:
         all_day: Целодневни догађај
         ends_at: Крај догађаја
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index f05887dc3..f10815129 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -763,7 +763,6 @@ sk:
       add_new: Pridaj nové
       delete: Vymaž
       edit_preset: Uprav varovnú predlohu
-      title: Spravuj varovné predlohy
     webhooks:
       delete: Vymaž
       disable: Vypni
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 329ce5a29..1e4e254cf 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -985,7 +985,7 @@ sl:
       delete: Izbriši
       edit_preset: Uredi prednastavitev opozoril
       empty: Zaenkrat še niste določili nobenih opozorilnih prednastavitev.
-      title: Upravljaj prednastavitev opozoril
+      title: Pred-nastavitve opozoril
     webhooks:
       add_new: Dodaj končno točko
       delete: Izbriši
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 8319cfcae..5439f08a0 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -285,6 +285,7 @@ sq:
         update_custom_emoji_html: "%{name} përditësoi emoxhin %{target}"
         update_domain_block_html: "%{name} përditësoi bllokim përkatësish për %{target}"
         update_ip_block_html: "%{name} ndryshoi rregull për IP-në %{target}"
+        update_report_html: "%{name} përditësoi raportimin %{target}"
         update_status_html: "%{name} përditësoi gjendjen me %{target}"
         update_user_role_html: "%{name} ndryshoi rolin për %{target}"
       deleted_account: fshiu llogarinë
@@ -946,7 +947,7 @@ sq:
       delete: Fshije
       edit_preset: Përpunoni sinjalizim të paracaktuar
       empty: S’keni përcaktuar ende sinjalizime të gatshme.
-      title: Administroni sinjalizime të paracaktuara
+      title: Paracaktime sinjalizimesh
     webhooks:
       add_new: Shtoni pikëmbarim
       delete: Fshije
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 808a10e72..718d1c0f8 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -869,7 +869,7 @@ sr-Latn:
         action: Pogledaj dokumentaciju
         message_html: Vaš Elasticsearch klaster ima samo jedan čvor, <code>ES_PRESET</code>treba postaviti na<code>single_node_cluster</code>.
       elasticsearch_reset_chewy:
-        message_html: Vaš Elasticsearch klaster ima samo jedan čvor, <code>ES_PRESET</code>treba postaviti na<code>single_node_cluster</code>.
+        message_html: Indeks Elasticsearch sistema je zastareo zbog promene podešavanja. Pokrenite <code>tootctl search deploy --reset-chewy</code>da biste ga ažurirali.
       elasticsearch_running_check:
         message_html: Povezivanje na Elasticsearch nije bilo moguće. Molimo Vas proverite da li je pokrenut, ili onemogućite pretragu celog teksta
       elasticsearch_version_check:
@@ -966,9 +966,9 @@ sr-Latn:
     warning_presets:
       add_new: Dodaj novi
       delete: Izbriši
-      edit_preset: Uredi preset upozorenja
-      empty: Još uvek niste definisali nijedan šablon upozorenja.
-      title: Upravljaj presetima upozorenja
+      edit_preset: Uredi predefinisana upozorenja
+      empty: Još uvek niste definisali nijedno upozorenje.
+      title: Predefinisana upozorenja
     webhooks:
       add_new: Dodaj krajnju tačku
       delete: Izbriši
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index f03c6e878..c9a67b193 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -869,7 +869,7 @@ sr:
         action: Погледај документацију
         message_html: Ваш Elasticsearch кластер има само један чвор, <code>ES_PRESET</code>треба поставити на<code>single_node_cluster</code>.
       elasticsearch_reset_chewy:
-        message_html: Ваш Elasticsearch кластер има само један чвор, <code>ES_PRESET</code>треба поставити на<code>single_node_cluster</code>.
+        message_html: Индекс Elasticsearch система је застарео због промене подешавања. Покрените <code>tootctl search deploy --reset-chewy</code>да бисте га ажурирали.
       elasticsearch_running_check:
         message_html: Повезивање на Elasticsearch није било могуће. Молимо Вас проверите да ли је покренут, или онемогућите претрагу целог текста
       elasticsearch_version_check:
@@ -966,9 +966,9 @@ sr:
     warning_presets:
       add_new: Додај нови
       delete: Избриши
-      edit_preset: Уреди пресет упозорења
-      empty: Још увек нисте дефинисали ниједан шаблон упозорења.
-      title: Управљај пресетима упозорења
+      edit_preset: Уреди предефинисана упозорења
+      empty: Још увек нисте дефинисали ниједно упозорење.
+      title: Предефинисна упозорења
     webhooks:
       add_new: Додај крајњу тачку
       delete: Избриши
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 9f0de4a72..cf68cdd56 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -951,7 +951,6 @@ sv:
       delete: Radera
       edit_preset: Redigera varningsförval
       empty: Du har inte definierat några varningsförval ännu.
-      title: Hantera varningsförval
     webhooks:
       add_new: Lägg till slutpunkt
       delete: Ta bort
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 5711f68ff..3ca4f0973 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -934,7 +934,6 @@ th:
       delete: ลบ
       edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า
       empty: คุณยังไม่ได้กำหนดคำเตือนที่ตั้งไว้ล่วงหน้าใด ๆ
-      title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า
     webhooks:
       add_new: เพิ่มปลายทาง
       delete: ลบ
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 469f2c5ad..3ce12fec8 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -951,7 +951,7 @@ tr:
       delete: Sil
       edit_preset: Uyarı ön-ayarını düzenle
       empty: Henüz önceden ayarlanmış bir uyarı tanımlanmadı.
-      title: Uyarı ön-ayarlarını yönet
+      title: Uyarı Önayarları
     webhooks:
       add_new: Uç nokta ekle
       delete: Sil
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 71e84a1d5..5baaa9387 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -984,7 +984,6 @@ uk:
       delete: Видалити
       edit_preset: Редагувати шаблон попередження
       empty: Ви ще не визначили жодних попереджень.
-      title: Керування шаблонами попереджень
     webhooks:
       add_new: Додати кінцеву точку
       delete: Видалити
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 05f3157ec..4265c1a33 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -934,7 +934,6 @@ vi:
       delete: Xóa bỏ
       edit_preset: Sửa mẫu có sẵn
       empty: Bạn chưa thêm mẫu cảnh cáo nào cả.
-      title: Quản lý mẫu cảnh cáo
     webhooks:
       add_new: Thêm endpoint
       delete: Xóa bỏ
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 12b619793..b668c23d2 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -934,7 +934,7 @@ zh-CN:
       delete: 删除
       edit_preset: 编辑预置警告
       empty: 你尚未定义任何警告预设。
-      title: 管理预设警告
+      title: 预设警告
     webhooks:
       add_new: 新增对端
       delete: 删除
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 1bfbe38bb..ddc6571e6 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -933,7 +933,6 @@ zh-HK:
       delete: 刪除
       edit_preset: 設定警告預設
       empty: 您尚未定義任何預設警告
-      title: 管理警告預設
     webhooks:
       add_new: 新增端點
       delete: 刪除
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index ac633a201..14f54f9a1 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -936,7 +936,7 @@ zh-TW:
       delete: 刪除
       edit_preset: 編輯預設警告
       empty: 您尚未定義任何預設警告。
-      title: 管理預設警告
+      title: 預設警告內容
     webhooks:
       add_new: 新增端點
       delete: 刪除

From 3a862439dfc989c6c5741e007c2f4e0335fffe33 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Thu, 23 May 2024 04:26:58 -0400
Subject: [PATCH 178/215] Remove unused account record in api/v2/admin/accounts
 spec (#30397)

---
 spec/requests/api/v2/admin/accounts_spec.rb | 1 -
 1 file changed, 1 deletion(-)

diff --git a/spec/requests/api/v2/admin/accounts_spec.rb b/spec/requests/api/v2/admin/accounts_spec.rb
index fb04850bb..f5db93233 100644
--- a/spec/requests/api/v2/admin/accounts_spec.rb
+++ b/spec/requests/api/v2/admin/accounts_spec.rb
@@ -8,7 +8,6 @@ RSpec.describe 'API V2 Admin Accounts' do
   let(:scopes) { 'admin:read admin:write' }
   let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
   let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
-  let(:account) { Fabricate(:account) }
 
   describe 'GET #index' do
     let!(:remote_account)       { Fabricate(:account, domain: 'example.org') }

From 10ec421dd4e0da987e69a3dd7f4f696f9c5878e0 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Thu, 23 May 2024 11:50:13 +0200
Subject: [PATCH 179/215] Proposal: a modern & typed way of writing Redux
 actions doing API requests (#30270)

---
 .../mastodon/actions/account_notes.ts         |  21 +-
 .../mastodon/actions/interactions.js          |  86 +-------
 .../mastodon/actions/interactions_typed.ts    |  30 +++
 app/javascript/mastodon/api.ts                |  16 +-
 app/javascript/mastodon/api/accounts.ts       |   7 +
 app/javascript/mastodon/api/interactions.ts   |  10 +
 .../mastodon/containers/status_container.jsx  |   4 +-
 .../containers/account_note_container.js      |   2 +-
 .../containers/notification_container.js      |   4 +-
 .../picture_in_picture/components/footer.jsx  |   4 +-
 .../containers/detailed_status_container.js   |   4 +-
 .../mastodon/features/status/index.jsx        |   4 +-
 app/javascript/mastodon/reducers/statuses.js  |  28 +--
 .../mastodon/store/typed_functions.ts         | 186 ++++++++++++++++++
 14 files changed, 281 insertions(+), 125 deletions(-)
 create mode 100644 app/javascript/mastodon/actions/interactions_typed.ts
 create mode 100644 app/javascript/mastodon/api/accounts.ts
 create mode 100644 app/javascript/mastodon/api/interactions.ts

diff --git a/app/javascript/mastodon/actions/account_notes.ts b/app/javascript/mastodon/actions/account_notes.ts
index acd9ecf41..bf4f93dca 100644
--- a/app/javascript/mastodon/actions/account_notes.ts
+++ b/app/javascript/mastodon/actions/account_notes.ts
@@ -1,18 +1,9 @@
-import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships';
-import { createAppAsyncThunk } from 'mastodon/store/typed_functions';
+import { apiSubmitAccountNote } from 'mastodon/api/accounts';
+import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
 
-import api from '../api';
-
-export const submitAccountNote = createAppAsyncThunk(
+export const submitAccountNote = createDataLoadingThunk(
   'account_note/submit',
-  async (args: { id: string; value: string }) => {
-    const response = await api().post<ApiRelationshipJSON>(
-      `/api/v1/accounts/${args.id}/note`,
-      {
-        comment: args.value,
-      },
-    );
-
-    return { relationship: response.data };
-  },
+  (accountId: string, note: string) => apiSubmitAccountNote(accountId, note),
+  (relationship) => ({ relationship }),
+  { skipLoading: true },
 );
diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js
index fe7c911b6..57f2459c0 100644
--- a/app/javascript/mastodon/actions/interactions.js
+++ b/app/javascript/mastodon/actions/interactions.js
@@ -3,10 +3,6 @@ import api, { getLinks } from '../api';
 import { fetchRelationships } from './accounts';
 import { importFetchedAccounts, importFetchedStatus } from './importer';
 
-export const REBLOG_REQUEST = 'REBLOG_REQUEST';
-export const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
-export const REBLOG_FAIL    = 'REBLOG_FAIL';
-
 export const REBLOGS_EXPAND_REQUEST = 'REBLOGS_EXPAND_REQUEST';
 export const REBLOGS_EXPAND_SUCCESS = 'REBLOGS_EXPAND_SUCCESS';
 export const REBLOGS_EXPAND_FAIL = 'REBLOGS_EXPAND_FAIL';
@@ -15,10 +11,6 @@ export const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST';
 export const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS';
 export const FAVOURITE_FAIL    = 'FAVOURITE_FAIL';
 
-export const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST';
-export const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS';
-export const UNREBLOG_FAIL    = 'UNREBLOG_FAIL';
-
 export const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST';
 export const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS';
 export const UNFAVOURITE_FAIL    = 'UNFAVOURITE_FAIL';
@@ -51,83 +43,7 @@ export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST';
 export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS';
 export const UNBOOKMARK_FAIL    = 'UNBOOKMARKED_FAIL';
 
-export function reblog(status, visibility) {
-  return function (dispatch) {
-    dispatch(reblogRequest(status));
-
-    api().post(`/api/v1/statuses/${status.get('id')}/reblog`, { visibility }).then(function (response) {
-      // The reblog API method returns a new status wrapped around the original. In this case we are only
-      // interested in how the original is modified, hence passing it skipping the wrapper
-      dispatch(importFetchedStatus(response.data.reblog));
-      dispatch(reblogSuccess(status));
-    }).catch(function (error) {
-      dispatch(reblogFail(status, error));
-    });
-  };
-}
-
-export function unreblog(status) {
-  return (dispatch) => {
-    dispatch(unreblogRequest(status));
-
-    api().post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => {
-      dispatch(importFetchedStatus(response.data));
-      dispatch(unreblogSuccess(status));
-    }).catch(error => {
-      dispatch(unreblogFail(status, error));
-    });
-  };
-}
-
-export function reblogRequest(status) {
-  return {
-    type: REBLOG_REQUEST,
-    status: status,
-    skipLoading: true,
-  };
-}
-
-export function reblogSuccess(status) {
-  return {
-    type: REBLOG_SUCCESS,
-    status: status,
-    skipLoading: true,
-  };
-}
-
-export function reblogFail(status, error) {
-  return {
-    type: REBLOG_FAIL,
-    status: status,
-    error: error,
-    skipLoading: true,
-  };
-}
-
-export function unreblogRequest(status) {
-  return {
-    type: UNREBLOG_REQUEST,
-    status: status,
-    skipLoading: true,
-  };
-}
-
-export function unreblogSuccess(status) {
-  return {
-    type: UNREBLOG_SUCCESS,
-    status: status,
-    skipLoading: true,
-  };
-}
-
-export function unreblogFail(status, error) {
-  return {
-    type: UNREBLOG_FAIL,
-    status: status,
-    error: error,
-    skipLoading: true,
-  };
-}
+export * from "./interactions_typed";
 
 export function favourite(status) {
   return function (dispatch) {
diff --git a/app/javascript/mastodon/actions/interactions_typed.ts b/app/javascript/mastodon/actions/interactions_typed.ts
new file mode 100644
index 000000000..518080608
--- /dev/null
+++ b/app/javascript/mastodon/actions/interactions_typed.ts
@@ -0,0 +1,30 @@
+import { apiReblog, apiUnreblog } from 'mastodon/api/interactions';
+import type { StatusVisibility } from 'mastodon/models/status';
+import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
+
+import { importFetchedStatus } from './importer';
+
+export const reblog = createDataLoadingThunk(
+  'status/reblog',
+  (statusId: string, visibility: StatusVisibility) =>
+    apiReblog(statusId, visibility),
+  (data, { dispatch, discardLoadData }) => {
+    // The reblog API method returns a new status wrapped around the original. In this case we are only
+    // interested in how the original is modified, hence passing it skipping the wrapper
+    dispatch(importFetchedStatus(data.reblog));
+
+    // The payload is not used in any actions
+    return discardLoadData;
+  },
+);
+
+export const unreblog = createDataLoadingThunk(
+  'status/unreblog',
+  (statusId: string) => apiUnreblog(statusId),
+  (data, { dispatch, discardLoadData }) => {
+    dispatch(importFetchedStatus(data));
+
+    // The payload is not used in any actions
+    return discardLoadData;
+  },
+);
diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts
index 2ccf178f0..4e5ccef08 100644
--- a/app/javascript/mastodon/api.ts
+++ b/app/javascript/mastodon/api.ts
@@ -1,4 +1,4 @@
-import type { AxiosResponse, RawAxiosRequestHeaders } from 'axios';
+import type { AxiosResponse, Method, RawAxiosRequestHeaders } from 'axios';
 import axios from 'axios';
 import LinkHeader from 'http-link-header';
 
@@ -58,3 +58,17 @@ export default function api(withAuthorization = true) {
     ],
   });
 }
+
+export async function apiRequest<ApiResponse = unknown>(
+  method: Method,
+  url: string,
+  params?: unknown,
+) {
+  const { data } = await api().request<ApiResponse>({
+    method,
+    url,
+    params,
+  });
+
+  return data;
+}
diff --git a/app/javascript/mastodon/api/accounts.ts b/app/javascript/mastodon/api/accounts.ts
new file mode 100644
index 000000000..51b1f4f8d
--- /dev/null
+++ b/app/javascript/mastodon/api/accounts.ts
@@ -0,0 +1,7 @@
+import { apiRequest } from 'mastodon/api';
+import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships';
+
+export const apiSubmitAccountNote = (id: string, value: string) =>
+  apiRequest<ApiRelationshipJSON>('post', `/api/v1/accounts/${id}/note`, {
+    comment: value,
+  });
diff --git a/app/javascript/mastodon/api/interactions.ts b/app/javascript/mastodon/api/interactions.ts
new file mode 100644
index 000000000..4c466a1b4
--- /dev/null
+++ b/app/javascript/mastodon/api/interactions.ts
@@ -0,0 +1,10 @@
+import { apiRequest } from 'mastodon/api';
+import type { Status, StatusVisibility } from 'mastodon/models/status';
+
+export const apiReblog = (statusId: string, visibility: StatusVisibility) =>
+  apiRequest<{ reblog: Status }>('post', `v1/statuses/${statusId}/reblog`, {
+    visibility,
+  });
+
+export const apiUnreblog = (statusId: string) =>
+  apiRequest<Status>('post', `v1/statuses/${statusId}/unreblog`);
diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx
index c6842e8df..0174e5a02 100644
--- a/app/javascript/mastodon/containers/status_container.jsx
+++ b/app/javascript/mastodon/containers/status_container.jsx
@@ -96,9 +96,9 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
 
   onModalReblog (status, privacy) {
     if (status.get('reblogged')) {
-      dispatch(unreblog(status));
+      dispatch(unreblog(status.id));
     } else {
-      dispatch(reblog(status, privacy));
+      dispatch(reblog(status.id, privacy));
     }
   },
 
diff --git a/app/javascript/mastodon/features/account/containers/account_note_container.js b/app/javascript/mastodon/features/account/containers/account_note_container.js
index 20304a452..9fbe0671c 100644
--- a/app/javascript/mastodon/features/account/containers/account_note_container.js
+++ b/app/javascript/mastodon/features/account/containers/account_note_container.js
@@ -11,7 +11,7 @@ const mapStateToProps = (state, { account }) => ({
 const mapDispatchToProps = (dispatch, { account }) => ({
 
   onSave (value) {
-    dispatch(submitAccountNote({ id: account.get('id'), value}));
+    dispatch(submitAccountNote(account.get('id'), value));
   },
 
 });
diff --git a/app/javascript/mastodon/features/notifications/containers/notification_container.js b/app/javascript/mastodon/features/notifications/containers/notification_container.js
index de450cd1a..d829cb833 100644
--- a/app/javascript/mastodon/features/notifications/containers/notification_container.js
+++ b/app/javascript/mastodon/features/notifications/containers/notification_container.js
@@ -39,12 +39,12 @@ const mapDispatchToProps = dispatch => ({
   },
 
   onModalReblog (status, privacy) {
-    dispatch(reblog(status, privacy));
+    dispatch(reblog(status.id, privacy));
   },
 
   onReblog (status, e) {
     if (status.get('reblogged')) {
-      dispatch(unreblog(status));
+      dispatch(unreblog(status.id));
     } else {
       if (e.shiftKey || !boostModal) {
         this.onModalReblog(status);
diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
index d6b1b5fa8..1c142f3c1 100644
--- a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
+++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
@@ -123,7 +123,7 @@ class Footer extends ImmutablePureComponent {
 
   _performReblog = (status, privacy) => {
     const { dispatch } = this.props;
-    dispatch(reblog(status, privacy));
+    dispatch(reblog(status.id, privacy));
   };
 
   handleReblogClick = e => {
@@ -132,7 +132,7 @@ class Footer extends ImmutablePureComponent {
 
     if (signedIn) {
       if (status.get('reblogged')) {
-        dispatch(unreblog(status));
+        dispatch(unreblog(status.id));
       } else if ((e && e.shiftKey) || !boostModal) {
         this._performReblog(status);
       } else {
diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
index 1c650f544..91bc700e9 100644
--- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js
+++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
@@ -74,12 +74,12 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
   },
 
   onModalReblog (status, privacy) {
-    dispatch(reblog(status, privacy));
+    dispatch(reblog(status.id, privacy));
   },
 
   onReblog (status, e) {
     if (status.get('reblogged')) {
-      dispatch(unreblog(status));
+      dispatch(unreblog(status.id));
     } else {
       if (e.shiftKey || !boostModal) {
         this.onModalReblog(status);
diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx
index 3a9bf524f..48f045a4a 100644
--- a/app/javascript/mastodon/features/status/index.jsx
+++ b/app/javascript/mastodon/features/status/index.jsx
@@ -299,7 +299,7 @@ class Status extends ImmutablePureComponent {
   };
 
   handleModalReblog = (status, privacy) => {
-    this.props.dispatch(reblog(status, privacy));
+    this.props.dispatch(reblog(status.id, privacy));
   };
 
   handleReblogClick = (status, e) => {
@@ -308,7 +308,7 @@ class Status extends ImmutablePureComponent {
 
     if (signedIn) {
       if (status.get('reblogged')) {
-        dispatch(unreblog(status));
+        dispatch(unreblog(status.id));
       } else {
         if ((e && e.shiftKey) || !boostModal) {
           this.handleModalReblog(status);
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index 683fe848f..1da1c9cf2 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -3,10 +3,6 @@ import { Map as ImmutableMap, fromJS } from 'immutable';
 import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer';
 import { normalizeStatusTranslation } from '../actions/importer/normalizer';
 import {
-  REBLOG_REQUEST,
-  REBLOG_FAIL,
-  UNREBLOG_REQUEST,
-  UNREBLOG_FAIL,
   FAVOURITE_REQUEST,
   FAVOURITE_FAIL,
   UNFAVOURITE_REQUEST,
@@ -16,6 +12,10 @@ import {
   UNBOOKMARK_REQUEST,
   UNBOOKMARK_FAIL,
 } from '../actions/interactions';
+import {
+  reblog,
+  unreblog,
+} from '../actions/interactions_typed';
 import {
   STATUS_MUTE_SUCCESS,
   STATUS_UNMUTE_SUCCESS,
@@ -65,6 +65,7 @@ const statusTranslateUndo = (state, id) => {
 
 const initialState = ImmutableMap();
 
+/** @type {import('@reduxjs/toolkit').Reducer<typeof initialState>} */
 export default function statuses(state = initialState, action) {
   switch(action.type) {
   case STATUS_FETCH_REQUEST:
@@ -91,14 +92,6 @@ export default function statuses(state = initialState, action) {
     return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], false);
   case UNBOOKMARK_FAIL:
     return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'bookmarked'], true);
-  case REBLOG_REQUEST:
-    return state.setIn([action.status.get('id'), 'reblogged'], true);
-  case REBLOG_FAIL:
-    return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'reblogged'], false);
-  case UNREBLOG_REQUEST:
-    return state.setIn([action.status.get('id'), 'reblogged'], false);
-  case UNREBLOG_FAIL:
-    return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'reblogged'], true);
   case STATUS_MUTE_SUCCESS:
     return state.setIn([action.id, 'muted'], true);
   case STATUS_UNMUTE_SUCCESS:
@@ -128,6 +121,15 @@ export default function statuses(state = initialState, action) {
   case STATUS_TRANSLATE_UNDO:
     return statusTranslateUndo(state, action.id);
   default:
-    return state;
+    if(reblog.pending.match(action))
+      return state.setIn([action.meta.params.statusId, 'reblogged'], true);
+    else if(reblog.rejected.match(action))
+      return state.get(action.meta.params.statusId) === undefined ? state : state.setIn([action.meta.params.statusId, 'reblogged'], false);
+    else if(unreblog.pending.match(action))
+      return state.setIn([action.meta.params.statusId, 'reblogged'], false);
+    else if(unreblog.rejected.match(action))
+      return state.get(action.meta.params.statusId) === undefined ? state : state.setIn([action.meta.params.statusId, 'reblogged'], true);
+    else
+      return state;
   }
 }
diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts
index b66d7545c..4b07a5561 100644
--- a/app/javascript/mastodon/store/typed_functions.ts
+++ b/app/javascript/mastodon/store/typed_functions.ts
@@ -2,6 +2,8 @@ import { createAsyncThunk } from '@reduxjs/toolkit';
 // eslint-disable-next-line @typescript-eslint/no-restricted-imports
 import { useDispatch, useSelector } from 'react-redux';
 
+import type { BaseThunkAPI } from '@reduxjs/toolkit/dist/createAsyncThunk';
+
 import type { AppDispatch, RootState } from './store';
 
 export const useAppDispatch = useDispatch.withTypes<AppDispatch>();
@@ -13,8 +15,192 @@ export interface AsyncThunkRejectValue {
   error?: unknown;
 }
 
+interface AppMeta {
+  skipLoading?: boolean;
+}
+
 export const createAppAsyncThunk = createAsyncThunk.withTypes<{
   state: RootState;
   dispatch: AppDispatch;
   rejectValue: AsyncThunkRejectValue;
 }>();
+
+type AppThunkApi = Pick<
+  BaseThunkAPI<
+    RootState,
+    unknown,
+    AppDispatch,
+    AsyncThunkRejectValue,
+    AppMeta,
+    AppMeta
+  >,
+  'getState' | 'dispatch'
+>;
+
+interface AppThunkOptions {
+  skipLoading?: boolean;
+}
+
+const createBaseAsyncThunk = createAsyncThunk.withTypes<{
+  state: RootState;
+  dispatch: AppDispatch;
+  rejectValue: AsyncThunkRejectValue;
+  fulfilledMeta: AppMeta;
+  rejectedMeta: AppMeta;
+}>();
+
+export function createThunk<Arg = void, Returned = void>(
+  name: string,
+  creator: (arg: Arg, api: AppThunkApi) => Returned | Promise<Returned>,
+  options: AppThunkOptions = {},
+) {
+  return createBaseAsyncThunk(
+    name,
+    async (
+      arg: Arg,
+      { getState, dispatch, fulfillWithValue, rejectWithValue },
+    ) => {
+      try {
+        const result = await creator(arg, { dispatch, getState });
+
+        return fulfillWithValue(result, {
+          skipLoading: options.skipLoading,
+        });
+      } catch (error) {
+        return rejectWithValue({ error }, { skipLoading: true });
+      }
+    },
+    {
+      getPendingMeta() {
+        if (options.skipLoading) return { skipLoading: true };
+        return {};
+      },
+    },
+  );
+}
+
+const discardLoadDataInPayload = Symbol('discardLoadDataInPayload');
+type DiscardLoadData = typeof discardLoadDataInPayload;
+
+type OnData<LoadDataResult, ReturnedData> = (
+  data: LoadDataResult,
+  api: AppThunkApi & {
+    discardLoadData: DiscardLoadData;
+  },
+) => ReturnedData | DiscardLoadData | Promise<ReturnedData | DiscardLoadData>;
+
+// Overload when there is no `onData` method, the payload is the `onData` result
+export function createDataLoadingThunk<
+  LoadDataResult,
+  Args extends readonly unknown[],
+>(
+  name: string,
+  loadData: (...args: Args) => Promise<LoadDataResult>,
+  thunkOptions?: AppThunkOptions,
+): ReturnType<typeof createThunk<Args, LoadDataResult>>;
+
+// Overload when the `onData` method returns discardLoadDataInPayload, then the payload is empty
+export function createDataLoadingThunk<
+  LoadDataResult,
+  Args extends readonly unknown[],
+>(
+  name: string,
+  loadData: (...args: Args) => Promise<LoadDataResult>,
+  onDataOrThunkOptions?:
+    | AppThunkOptions
+    | OnData<LoadDataResult, DiscardLoadData>,
+  thunkOptions?: AppThunkOptions,
+): ReturnType<typeof createThunk<Args, void>>;
+
+// Overload when the `onData` method returns nothing, then the mayload is the `onData` result
+export function createDataLoadingThunk<
+  LoadDataResult,
+  Args extends readonly unknown[],
+>(
+  name: string,
+  loadData: (...args: Args) => Promise<LoadDataResult>,
+  onDataOrThunkOptions?: AppThunkOptions | OnData<LoadDataResult, void>,
+  thunkOptions?: AppThunkOptions,
+): ReturnType<typeof createThunk<Args, LoadDataResult>>;
+
+// Overload when there is an `onData` method returning something
+export function createDataLoadingThunk<
+  LoadDataResult,
+  Args extends readonly unknown[],
+  Returned,
+>(
+  name: string,
+  loadData: (...args: Args) => Promise<LoadDataResult>,
+  onDataOrThunkOptions?: AppThunkOptions | OnData<LoadDataResult, Returned>,
+  thunkOptions?: AppThunkOptions,
+): ReturnType<typeof createThunk<Args, Returned>>;
+
+/**
+ * This function creates a Redux Thunk that handles loading data asynchronously (usually from the API), dispatching `pending`, `fullfilled` and `rejected` actions.
+ *
+ * You can run a callback on the `onData` results to either dispatch side effects or modify the payload.
+ *
+ * It is a wrapper around RTK's [`createAsyncThunk`](https://redux-toolkit.js.org/api/createAsyncThunk)
+ * @param name Prefix for the actions types
+ * @param loadData Function that loads the data. It's arguments will become the thunk's arguments
+ * @param onDataOrThunkOptions
+ *   Callback called on the results from `loadData`.
+ *
+ *   First argument will be the return from `loadData`.
+ *
+ *   Second argument is an object with: `dispatch`, `getState` and `discardLoadData`.
+ *   It can return:
+ *   - `undefined` (or no explicit return), meaning that the `onData` results will be the payload
+ *   - `discardLoadData` to discard the `onData` results and return an empty payload
+ *   - anything else, which will be the payload
+ *
+ *   You can also omit this parameter and pass `thunkOptions` directly
+ * @param maybeThunkOptions
+ *   Additional Mastodon specific options for the thunk. Currently supports:
+ *   - `skipLoading` to avoid showing the loading bar when the request is in progress
+ * @returns The created thunk
+ */
+export function createDataLoadingThunk<
+  LoadDataResult,
+  Args extends readonly unknown[],
+  Returned,
+>(
+  name: string,
+  loadData: (...args: Args) => Promise<LoadDataResult>,
+  onDataOrThunkOptions?: AppThunkOptions | OnData<LoadDataResult, Returned>,
+  maybeThunkOptions?: AppThunkOptions,
+) {
+  let onData: OnData<LoadDataResult, Returned> | undefined;
+  let thunkOptions: AppThunkOptions | undefined;
+
+  if (typeof onDataOrThunkOptions === 'function') onData = onDataOrThunkOptions;
+  else if (typeof onDataOrThunkOptions === 'object')
+    thunkOptions = onDataOrThunkOptions;
+
+  if (maybeThunkOptions) {
+    thunkOptions = maybeThunkOptions;
+  }
+
+  return createThunk<Args, Returned>(
+    name,
+    async (arg, { getState, dispatch }) => {
+      const data = await loadData(...arg);
+
+      if (!onData) return data as Returned;
+
+      const result = await onData(data, {
+        dispatch,
+        getState,
+        discardLoadData: discardLoadDataInPayload,
+      });
+
+      // if there is no return in `onData`, we return the `onData` result
+      if (typeof result === 'undefined') return data as Returned;
+      // the user explicitely asked to discard the payload
+      else if (result === discardLoadDataInPayload)
+        return undefined as Returned;
+      else return result;
+    },
+    thunkOptions,
+  );
+}

From 133d98fb25e623745326945b3800173c27519d57 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 23 May 2024 19:28:18 +0200
Subject: [PATCH 180/215] Normalize language code of incoming posts (#30403)

---
 app/lib/activitypub/parser/status_parser.rb   | 11 +++-
 .../activitypub/parser/status_parser_spec.rb  | 50 +++++++++++++++++++
 2 files changed, 59 insertions(+), 2 deletions(-)
 create mode 100644 spec/lib/activitypub/parser/status_parser_spec.rb

diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb
index cfc2b8788..2940aea44 100644
--- a/app/lib/activitypub/parser/status_parser.rb
+++ b/app/lib/activitypub/parser/status_parser.rb
@@ -3,6 +3,8 @@
 class ActivityPub::Parser::StatusParser
   include JsonLdHelper
 
+  NORMALIZED_LOCALE_NAMES = LanguagesHelper::SUPPORTED_LOCALES.keys.index_by(&:downcase).freeze
+
   # @param [Hash] json
   # @param [Hash] options
   # @option options [String] :followers_collection
@@ -87,6 +89,13 @@ class ActivityPub::Parser::StatusParser
   end
 
   def language
+    lang = raw_language_code
+    lang.presence && NORMALIZED_LOCALE_NAMES.fetch(lang.downcase.to_sym, lang)
+  end
+
+  private
+
+  def raw_language_code
     if content_language_map?
       @object['contentMap'].keys.first
     elsif name_language_map?
@@ -96,8 +105,6 @@ class ActivityPub::Parser::StatusParser
     end
   end
 
-  private
-
   def audience_to
     as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) }
   end
diff --git a/spec/lib/activitypub/parser/status_parser_spec.rb b/spec/lib/activitypub/parser/status_parser_spec.rb
new file mode 100644
index 000000000..5d9f008db
--- /dev/null
+++ b/spec/lib/activitypub/parser/status_parser_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe ActivityPub::Parser::StatusParser do
+  subject { described_class.new(json) }
+
+  let(:sender) { Fabricate(:account, followers_url: 'http://example.com/followers', domain: 'example.com', uri: 'https://example.com/actor') }
+  let(:follower) { Fabricate(:account, username: 'bob') }
+
+  let(:json) do
+    {
+      '@context': 'https://www.w3.org/ns/activitystreams',
+      id: [ActivityPub::TagManager.instance.uri_for(sender), '#foo'].join,
+      type: 'Create',
+      actor: ActivityPub::TagManager.instance.uri_for(sender),
+      object: object_json,
+    }.with_indifferent_access
+  end
+
+  let(:object_json) do
+    {
+      id: [ActivityPub::TagManager.instance.uri_for(sender), 'post1'].join('/'),
+      type: 'Note',
+      to: [
+        'https://www.w3.org/ns/activitystreams#Public',
+        ActivityPub::TagManager.instance.uri_for(follower),
+      ],
+      content: '@bob lorem ipsum',
+      contentMap: {
+        EN: '@bob lorem ipsum',
+      },
+      published: 1.hour.ago.utc.iso8601,
+      updated: 1.hour.ago.utc.iso8601,
+      tag: {
+        type: 'Mention',
+        href: ActivityPub::TagManager.instance.uri_for(follower),
+      },
+    }
+  end
+
+  it 'correctly parses status' do
+    expect(subject).to have_attributes(
+      text: '@bob lorem ipsum',
+      uri: [ActivityPub::TagManager.instance.uri_for(sender), 'post1'].join('/'),
+      reply: false,
+      language: :en
+    )
+  end
+end

From b6fd14f0e2842eca269ef8962e3c5bd560a76357 Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Thu, 23 May 2024 20:22:42 +0200
Subject: [PATCH 181/215] Fix `createDataLoadingThunk` and related actions
 (#30408)

---
 .../mastodon/actions/account_notes.ts         |  3 ++-
 .../mastodon/actions/interactions_typed.ts    | 11 ++++++---
 app/javascript/mastodon/api.ts                |  6 ++---
 app/javascript/mastodon/api/accounts.ts       |  2 +-
 .../mastodon/containers/status_container.jsx  |  4 ++--
 .../containers/account_note_container.js      |  2 +-
 .../containers/notification_container.js      |  4 ++--
 .../picture_in_picture/components/footer.jsx  |  4 ++--
 .../containers/detailed_status_container.js   |  4 ++--
 .../mastodon/features/status/index.jsx        |  4 ++--
 app/javascript/mastodon/reducers/statuses.js  |  8 +++----
 .../mastodon/store/typed_functions.ts         | 24 +++++++++----------
 12 files changed, 41 insertions(+), 35 deletions(-)

diff --git a/app/javascript/mastodon/actions/account_notes.ts b/app/javascript/mastodon/actions/account_notes.ts
index bf4f93dca..c2ebaf54a 100644
--- a/app/javascript/mastodon/actions/account_notes.ts
+++ b/app/javascript/mastodon/actions/account_notes.ts
@@ -3,7 +3,8 @@ import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
 
 export const submitAccountNote = createDataLoadingThunk(
   'account_note/submit',
-  (accountId: string, note: string) => apiSubmitAccountNote(accountId, note),
+  ({ accountId, note }: { accountId: string; note: string }) =>
+    apiSubmitAccountNote(accountId, note),
   (relationship) => ({ relationship }),
   { skipLoading: true },
 );
diff --git a/app/javascript/mastodon/actions/interactions_typed.ts b/app/javascript/mastodon/actions/interactions_typed.ts
index 518080608..f58faffa8 100644
--- a/app/javascript/mastodon/actions/interactions_typed.ts
+++ b/app/javascript/mastodon/actions/interactions_typed.ts
@@ -6,8 +6,13 @@ import { importFetchedStatus } from './importer';
 
 export const reblog = createDataLoadingThunk(
   'status/reblog',
-  (statusId: string, visibility: StatusVisibility) =>
-    apiReblog(statusId, visibility),
+  ({
+    statusId,
+    visibility,
+  }: {
+    statusId: string;
+    visibility: StatusVisibility;
+  }) => apiReblog(statusId, visibility),
   (data, { dispatch, discardLoadData }) => {
     // The reblog API method returns a new status wrapped around the original. In this case we are only
     // interested in how the original is modified, hence passing it skipping the wrapper
@@ -20,7 +25,7 @@ export const reblog = createDataLoadingThunk(
 
 export const unreblog = createDataLoadingThunk(
   'status/unreblog',
-  (statusId: string) => apiUnreblog(statusId),
+  ({ statusId }: { statusId: string }) => apiUnreblog(statusId),
   (data, { dispatch, discardLoadData }) => {
     dispatch(importFetchedStatus(data));
 
diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts
index 4e5ccef08..e133125a2 100644
--- a/app/javascript/mastodon/api.ts
+++ b/app/javascript/mastodon/api.ts
@@ -62,12 +62,12 @@ export default function api(withAuthorization = true) {
 export async function apiRequest<ApiResponse = unknown>(
   method: Method,
   url: string,
-  params?: unknown,
+  params?: Record<string, unknown>,
 ) {
   const { data } = await api().request<ApiResponse>({
     method,
-    url,
-    params,
+    url: '/api/' + url,
+    data: params,
   });
 
   return data;
diff --git a/app/javascript/mastodon/api/accounts.ts b/app/javascript/mastodon/api/accounts.ts
index 51b1f4f8d..3d89e44b2 100644
--- a/app/javascript/mastodon/api/accounts.ts
+++ b/app/javascript/mastodon/api/accounts.ts
@@ -2,6 +2,6 @@ import { apiRequest } from 'mastodon/api';
 import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships';
 
 export const apiSubmitAccountNote = (id: string, value: string) =>
-  apiRequest<ApiRelationshipJSON>('post', `/api/v1/accounts/${id}/note`, {
+  apiRequest<ApiRelationshipJSON>('post', `v1/accounts/${id}/note`, {
     comment: value,
   });
diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx
index 0174e5a02..4a9b52577 100644
--- a/app/javascript/mastodon/containers/status_container.jsx
+++ b/app/javascript/mastodon/containers/status_container.jsx
@@ -96,9 +96,9 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
 
   onModalReblog (status, privacy) {
     if (status.get('reblogged')) {
-      dispatch(unreblog(status.id));
+      dispatch(unreblog({ statusId: status.get('id') }));
     } else {
-      dispatch(reblog(status.id, privacy));
+      dispatch(reblog({ statusId: status.get('id'), visibility: privacy }));
     }
   },
 
diff --git a/app/javascript/mastodon/features/account/containers/account_note_container.js b/app/javascript/mastodon/features/account/containers/account_note_container.js
index 9fbe0671c..1530242d6 100644
--- a/app/javascript/mastodon/features/account/containers/account_note_container.js
+++ b/app/javascript/mastodon/features/account/containers/account_note_container.js
@@ -11,7 +11,7 @@ const mapStateToProps = (state, { account }) => ({
 const mapDispatchToProps = (dispatch, { account }) => ({
 
   onSave (value) {
-    dispatch(submitAccountNote(account.get('id'), value));
+    dispatch(submitAccountNote({ accountId: account.get('id'), note: value }));
   },
 
 });
diff --git a/app/javascript/mastodon/features/notifications/containers/notification_container.js b/app/javascript/mastodon/features/notifications/containers/notification_container.js
index d829cb833..650acf4cc 100644
--- a/app/javascript/mastodon/features/notifications/containers/notification_container.js
+++ b/app/javascript/mastodon/features/notifications/containers/notification_container.js
@@ -39,12 +39,12 @@ const mapDispatchToProps = dispatch => ({
   },
 
   onModalReblog (status, privacy) {
-    dispatch(reblog(status.id, privacy));
+    dispatch(reblog({ statusId: status.get('id'), visibility: privacy }));
   },
 
   onReblog (status, e) {
     if (status.get('reblogged')) {
-      dispatch(unreblog(status.id));
+      dispatch(unreblog({ statusId: status.get('id') }));
     } else {
       if (e.shiftKey || !boostModal) {
         this.onModalReblog(status);
diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
index 1c142f3c1..ba0642da2 100644
--- a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
+++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx
@@ -123,7 +123,7 @@ class Footer extends ImmutablePureComponent {
 
   _performReblog = (status, privacy) => {
     const { dispatch } = this.props;
-    dispatch(reblog(status.id, privacy));
+    dispatch(reblog({ statusId: status.get('id'), visibility: privacy }));
   };
 
   handleReblogClick = e => {
@@ -132,7 +132,7 @@ class Footer extends ImmutablePureComponent {
 
     if (signedIn) {
       if (status.get('reblogged')) {
-        dispatch(unreblog(status.id));
+        dispatch(unreblog({ statusId: status.get('id') }));
       } else if ((e && e.shiftKey) || !boostModal) {
         this._performReblog(status);
       } else {
diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
index 91bc700e9..c3d4fec4d 100644
--- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js
+++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
@@ -74,12 +74,12 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
   },
 
   onModalReblog (status, privacy) {
-    dispatch(reblog(status.id, privacy));
+    dispatch(reblog({ statusId: status.get('id'), visibility: privacy }));
   },
 
   onReblog (status, e) {
     if (status.get('reblogged')) {
-      dispatch(unreblog(status.id));
+      dispatch(unreblog({ statusId: status.get('id') }));
     } else {
       if (e.shiftKey || !boostModal) {
         this.onModalReblog(status);
diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx
index 48f045a4a..7f37cb50d 100644
--- a/app/javascript/mastodon/features/status/index.jsx
+++ b/app/javascript/mastodon/features/status/index.jsx
@@ -299,7 +299,7 @@ class Status extends ImmutablePureComponent {
   };
 
   handleModalReblog = (status, privacy) => {
-    this.props.dispatch(reblog(status.id, privacy));
+    this.props.dispatch(reblog({ statusId: status.get('id'), visibility: privacy }));
   };
 
   handleReblogClick = (status, e) => {
@@ -308,7 +308,7 @@ class Status extends ImmutablePureComponent {
 
     if (signedIn) {
       if (status.get('reblogged')) {
-        dispatch(unreblog(status.id));
+        dispatch(unreblog({ statusId: status.get('id') }));
       } else {
         if ((e && e.shiftKey) || !boostModal) {
           this.handleModalReblog(status);
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index 1da1c9cf2..ca766f73a 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -122,13 +122,13 @@ export default function statuses(state = initialState, action) {
     return statusTranslateUndo(state, action.id);
   default:
     if(reblog.pending.match(action))
-      return state.setIn([action.meta.params.statusId, 'reblogged'], true);
+      return state.setIn([action.meta.arg.statusId, 'reblogged'], true);
     else if(reblog.rejected.match(action))
-      return state.get(action.meta.params.statusId) === undefined ? state : state.setIn([action.meta.params.statusId, 'reblogged'], false);
+      return state.get(action.meta.arg.statusId) === undefined ? state : state.setIn([action.meta.arg.statusId, 'reblogged'], false);
     else if(unreblog.pending.match(action))
-      return state.setIn([action.meta.params.statusId, 'reblogged'], false);
+      return state.setIn([action.meta.arg.statusId, 'reblogged'], false);
     else if(unreblog.rejected.match(action))
-      return state.get(action.meta.params.statusId) === undefined ? state : state.setIn([action.meta.params.statusId, 'reblogged'], true);
+      return state.get(action.meta.arg.statusId) === undefined ? state : state.setIn([action.meta.arg.statusId, 'reblogged'], true);
     else
       return state;
   }
diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts
index 4b07a5561..0392f373c 100644
--- a/app/javascript/mastodon/store/typed_functions.ts
+++ b/app/javascript/mastodon/store/typed_functions.ts
@@ -92,20 +92,20 @@ type OnData<LoadDataResult, ReturnedData> = (
 // Overload when there is no `onData` method, the payload is the `onData` result
 export function createDataLoadingThunk<
   LoadDataResult,
-  Args extends readonly unknown[],
+  Args extends Record<string, unknown>,
 >(
   name: string,
-  loadData: (...args: Args) => Promise<LoadDataResult>,
+  loadData: (args: Args) => Promise<LoadDataResult>,
   thunkOptions?: AppThunkOptions,
 ): ReturnType<typeof createThunk<Args, LoadDataResult>>;
 
 // Overload when the `onData` method returns discardLoadDataInPayload, then the payload is empty
 export function createDataLoadingThunk<
   LoadDataResult,
-  Args extends readonly unknown[],
+  Args extends Record<string, unknown>,
 >(
   name: string,
-  loadData: (...args: Args) => Promise<LoadDataResult>,
+  loadData: (args: Args) => Promise<LoadDataResult>,
   onDataOrThunkOptions?:
     | AppThunkOptions
     | OnData<LoadDataResult, DiscardLoadData>,
@@ -115,10 +115,10 @@ export function createDataLoadingThunk<
 // Overload when the `onData` method returns nothing, then the mayload is the `onData` result
 export function createDataLoadingThunk<
   LoadDataResult,
-  Args extends readonly unknown[],
+  Args extends Record<string, unknown>,
 >(
   name: string,
-  loadData: (...args: Args) => Promise<LoadDataResult>,
+  loadData: (args: Args) => Promise<LoadDataResult>,
   onDataOrThunkOptions?: AppThunkOptions | OnData<LoadDataResult, void>,
   thunkOptions?: AppThunkOptions,
 ): ReturnType<typeof createThunk<Args, LoadDataResult>>;
@@ -126,11 +126,11 @@ export function createDataLoadingThunk<
 // Overload when there is an `onData` method returning something
 export function createDataLoadingThunk<
   LoadDataResult,
-  Args extends readonly unknown[],
+  Args extends Record<string, unknown>,
   Returned,
 >(
   name: string,
-  loadData: (...args: Args) => Promise<LoadDataResult>,
+  loadData: (args: Args) => Promise<LoadDataResult>,
   onDataOrThunkOptions?: AppThunkOptions | OnData<LoadDataResult, Returned>,
   thunkOptions?: AppThunkOptions,
 ): ReturnType<typeof createThunk<Args, Returned>>;
@@ -142,7 +142,7 @@ export function createDataLoadingThunk<
  *
  * It is a wrapper around RTK's [`createAsyncThunk`](https://redux-toolkit.js.org/api/createAsyncThunk)
  * @param name Prefix for the actions types
- * @param loadData Function that loads the data. It's arguments will become the thunk's arguments
+ * @param loadData Function that loads the data. It's (object) argument will become the thunk's argument
  * @param onDataOrThunkOptions
  *   Callback called on the results from `loadData`.
  *
@@ -162,11 +162,11 @@ export function createDataLoadingThunk<
  */
 export function createDataLoadingThunk<
   LoadDataResult,
-  Args extends readonly unknown[],
+  Args extends Record<string, unknown>,
   Returned,
 >(
   name: string,
-  loadData: (...args: Args) => Promise<LoadDataResult>,
+  loadData: (args: Args) => Promise<LoadDataResult>,
   onDataOrThunkOptions?: AppThunkOptions | OnData<LoadDataResult, Returned>,
   maybeThunkOptions?: AppThunkOptions,
 ) {
@@ -184,7 +184,7 @@ export function createDataLoadingThunk<
   return createThunk<Args, Returned>(
     name,
     async (arg, { getState, dispatch }) => {
-      const data = await loadData(...arg);
+      const data = await loadData(arg);
 
       if (!onData) return data as Returned;
 

From 8ea2726376ed9507072a8e2ec07fdfc219264dad Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Fri, 24 May 2024 10:25:42 +0200
Subject: [PATCH 182/215] Fix a leftover argument to `api()` (#30405)

---
 .../hashtag_timeline/containers/column_settings_container.js    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js b/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js
index be95004cc..680b44519 100644
--- a/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js
+++ b/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js
@@ -15,7 +15,7 @@ const mapStateToProps = (state, { columnId }) => {
   return {
     settings: columns.get(index).get('params'),
     onLoad (value) {
-      return api(() => state).get('/api/v2/search', { params: { q: value, type: 'hashtags' } }).then(response => {
+      return api().get('/api/v2/search', { params: { q: value, type: 'hashtags' } }).then(response => {
         return (response.data.hashtags || []).map((tag) => {
           return { value: tag.name, label: `#${tag.name}` };
         });

From 52a7d053ffc82572d460974b6dde3c6ed776e592 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 24 May 2024 10:26:07 +0200
Subject: [PATCH 183/215] fix(deps): update dependency postcss-preset-env to
 v9.5.14 (#30409)

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 9f953bb78..df8ba62d8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13592,16 +13592,16 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss-nesting@npm:^12.1.4":
-  version: 12.1.4
-  resolution: "postcss-nesting@npm:12.1.4"
+"postcss-nesting@npm:^12.1.5":
+  version: 12.1.5
+  resolution: "postcss-nesting@npm:12.1.5"
   dependencies:
     "@csstools/selector-resolve-nested": "npm:^1.1.0"
     "@csstools/selector-specificity": "npm:^3.1.1"
-    postcss-selector-parser: "npm:^6.0.13"
+    postcss-selector-parser: "npm:^6.1.0"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/b3408de4c04b58a88a56fa81aeff59b12615c78d4f5a57e09c1ee47e74cff51f8c9cad1684da0059067303cf65b4b688f85f0c5ca8d54af8c4ab998f727ab9fd
+  checksum: 10c0/8f049fe24dccb186707e065ffb697f9f0633a03b0e1139e9c24656f3d2158a738a51c7b1f405b48fdb8b4f19515ad4ad9d3cd4ec9d9fe1dd4e5f18729bf8e589
   languageName: node
   linkType: hard
 
@@ -13756,8 +13756,8 @@ __metadata:
   linkType: hard
 
 "postcss-preset-env@npm:^9.5.2":
-  version: 9.5.13
-  resolution: "postcss-preset-env@npm:9.5.13"
+  version: 9.5.14
+  resolution: "postcss-preset-env@npm:9.5.14"
   dependencies:
     "@csstools/postcss-cascade-layers": "npm:^4.0.6"
     "@csstools/postcss-color-function": "npm:^3.0.16"
@@ -13811,7 +13811,7 @@ __metadata:
     postcss-image-set-function: "npm:^6.0.3"
     postcss-lab-function: "npm:^6.0.16"
     postcss-logical: "npm:^7.0.1"
-    postcss-nesting: "npm:^12.1.4"
+    postcss-nesting: "npm:^12.1.5"
     postcss-opacity-percentage: "npm:^2.0.0"
     postcss-overflow-shorthand: "npm:^5.0.1"
     postcss-page-break: "npm:^3.0.4"
@@ -13821,7 +13821,7 @@ __metadata:
     postcss-selector-not: "npm:^7.0.2"
   peerDependencies:
     postcss: ^8.4
-  checksum: 10c0/5bbb6e87b1b3acc816ef445836f85df5f50ac96bdc3d571952a83794c80863c652d27ab14c66f6b88f86f5664119d49b357e4184162022cc3436676f3fbe833b
+  checksum: 10c0/8e0c8f5c2e7b8385a770c13185986dc50d7a73b10b98c65c2f86bb4cd2860de722caef8172b1676962dafbbc044d6be1955f2a092e951976a30d4ee33b0d7571
   languageName: node
   linkType: hard
 
@@ -13904,13 +13904,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4":
-  version: 6.0.16
-  resolution: "postcss-selector-parser@npm:6.0.16"
+"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.0":
+  version: 6.1.0
+  resolution: "postcss-selector-parser@npm:6.1.0"
   dependencies:
     cssesc: "npm:^3.0.0"
     util-deprecate: "npm:^1.0.2"
-  checksum: 10c0/0e11657cb3181aaf9ff67c2e59427c4df496b4a1b6a17063fae579813f80af79d444bf38f82eeb8b15b4679653fd3089e66ef0283f9aab01874d885e6cf1d2cf
+  checksum: 10c0/91e9c6434772506bc7f318699dd9d19d32178b52dfa05bed24cb0babbdab54f8fb765d9920f01ac548be0a642aab56bce493811406ceb00ae182bbb53754c473
   languageName: node
   linkType: hard
 

From 54351d01f209447448c57782a034e07968b56a59 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 24 May 2024 08:26:38 +0000
Subject: [PATCH 184/215] New Crowdin Translations (automated) (#30410)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/ko.json | 2 +-
 app/javascript/mastodon/locales/nn.json | 5 +++++
 config/locales/fi.yml                   | 1 +
 config/locales/nn.yml                   | 2 ++
 4 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 52ce9455a..b34026147 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -234,7 +234,7 @@
   "embed.preview": "이렇게 표시됩니다:",
   "emoji_button.activity": "활동",
   "emoji_button.clear": "지우기",
-  "emoji_button.custom": "사용자 지정",
+  "emoji_button.custom": "커스텀",
   "emoji_button.flags": "깃발",
   "emoji_button.food": "음식과 마실것",
   "emoji_button.label": "에모지 추가",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 14b355233..3316e7af8 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -297,6 +297,7 @@
   "filter_modal.select_filter.subtitle": "Bruk ein eksisterande kategori eller opprett ein ny",
   "filter_modal.select_filter.title": "Filtrer dette innlegget",
   "filter_modal.title.status": "Filtrer eit innlegg",
+  "filtered_notifications_banner.mentions": "{count, plural, one {omtale} other {omtaler}}",
   "filtered_notifications_banner.pending_requests": "Varsel frå {count, plural, =0 {ingen} one {ein person} other {# folk}} du kanskje kjenner",
   "filtered_notifications_banner.title": "Filtrerte varslingar",
   "firehose.all": "Alle",
@@ -307,6 +308,8 @@
   "follow_requests.unlocked_explanation": "Sjølv om kontoen din ikkje er låst tenkte dei som driv {domain} at du kanskje ville gå gjennom førespurnadar frå desse kontoane manuelt.",
   "follow_suggestions.curated_suggestion": "Utvalt av staben",
   "follow_suggestions.dismiss": "Ikkje vis igjen",
+  "follow_suggestions.featured_longer": "Hanplukka av gjengen på {domain}",
+  "follow_suggestions.friends_of_friends_longer": "Populært hjå dei du fylgjer",
   "follow_suggestions.hints.featured": "Denne profilen er handplukka av folka på {domain}.",
   "follow_suggestions.hints.friends_of_friends": "Denne profilen er populær hjå dei du fylgjer.",
   "follow_suggestions.hints.most_followed": "Mange på {domain} fylgjer denne profilen.",
@@ -314,6 +317,8 @@
   "follow_suggestions.hints.similar_to_recently_followed": "Denne profilen liknar på dei andre profilane du har fylgt i det siste.",
   "follow_suggestions.personalized_suggestion": "Personleg forslag",
   "follow_suggestions.popular_suggestion": "Populært forslag",
+  "follow_suggestions.popular_suggestion_longer": "Populært på {domain}",
+  "follow_suggestions.similar_to_recently_followed_longer": "Liknar på profilar du har fylgt i det siste",
   "follow_suggestions.view_all": "Vis alle",
   "follow_suggestions.who_to_follow": "Kven du kan fylgja",
   "followed_tags": "Fylgde emneknaggar",
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 3a75066d5..d1fa24467 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -951,6 +951,7 @@ fi:
       delete: Poista
       edit_preset: Muokkaa varoituksen esiasetusta
       empty: Et ole vielä määrittänyt yhtäkään varoitusten esiasetusta.
+      title: Varoituksen esiasetukset
     webhooks:
       add_new: Lisää päätepiste
       delete: Poista
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index 9291ba2c2..94efdcb15 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -285,6 +285,7 @@ nn:
         update_custom_emoji_html: "%{name} oppdaterte emojien %{target}"
         update_domain_block_html: "%{name} oppdaterte domeneblokkeringa for %{target}"
         update_ip_block_html: "%{name} endret regel for IP %{target}"
+        update_report_html: "%{name} oppdaterte rapporten %{target}"
         update_status_html: "%{name} oppdaterte innlegg av %{target}"
         update_user_role_html: "%{name} endret %{target} -rolle"
       deleted_account: sletta konto
@@ -950,6 +951,7 @@ nn:
       delete: Slett
       edit_preset: Endr åtvaringsoppsett
       empty: Du har ikke definert noen forhåndsinnstillinger for advarsler enda.
+      title: Førehandsinnstillingar for varsel
     webhooks:
       add_new: Legg til endepunkt
       delete: Slett

From 9305caf1fd5aaeba5c4d980a282c5ca415a7de5c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 24 May 2024 08:27:11 +0000
Subject: [PATCH 185/215] fix(deps): update dependency glob to v10.4.1 (#30411)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index df8ba62d8..b4e94dbb3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8936,17 +8936,17 @@ __metadata:
   linkType: hard
 
 "glob@npm:^10.2.2, glob@npm:^10.2.6, glob@npm:^10.3.10, glob@npm:^10.3.7":
-  version: 10.3.16
-  resolution: "glob@npm:10.3.16"
+  version: 10.4.1
+  resolution: "glob@npm:10.4.1"
   dependencies:
     foreground-child: "npm:^3.1.0"
     jackspeak: "npm:^3.1.2"
-    minimatch: "npm:^9.0.1"
-    minipass: "npm:^7.0.4"
-    path-scurry: "npm:^1.11.0"
+    minimatch: "npm:^9.0.4"
+    minipass: "npm:^7.1.2"
+    path-scurry: "npm:^1.11.1"
   bin:
     glob: dist/esm/bin.mjs
-  checksum: 10c0/f7eb4c3e66f221f0be3967c02527047167967549bdf8ed1bd5f6277d43a35191af4e2bb8c89f07a79664958bae088fd06659e69a0f1de462972f1eab52a715e8
+  checksum: 10c0/77f2900ed98b9cc2a0e1901ee5e476d664dae3cd0f1b662b8bfd4ccf00d0edc31a11595807706a274ca10e1e251411bbf2e8e976c82bed0d879a9b89343ed379
   languageName: node
   linkType: hard
 
@@ -11915,7 +11915,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"minimatch@npm:^9.0.1, minimatch@npm:^9.0.4":
+"minimatch@npm:^9.0.4":
   version: 9.0.4
   resolution: "minimatch@npm:9.0.4"
   dependencies:
@@ -11998,10 +11998,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4":
-  version: 7.0.4
-  resolution: "minipass@npm:7.0.4"
-  checksum: 10c0/6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5
+"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2":
+  version: 7.1.2
+  resolution: "minipass@npm:7.1.2"
+  checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557
   languageName: node
   linkType: hard
 
@@ -12824,13 +12824,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"path-scurry@npm:^1.11.0":
-  version: 1.11.0
-  resolution: "path-scurry@npm:1.11.0"
+"path-scurry@npm:^1.11.1":
+  version: 1.11.1
+  resolution: "path-scurry@npm:1.11.1"
   dependencies:
     lru-cache: "npm:^10.2.0"
     minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0"
-  checksum: 10c0/a5cd5dfbc6d5bb01d06bc2eb16ccdf303d617865438a21fe15431b8ad334f23351f73259abeb7e4be56f9c68d237b26b4dba51c78b508586035dfc2b55085493
+  checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d
   languageName: node
   linkType: hard
 

From 9b5055d34dfd079a76493467236d5b4c1496a9a7 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Fri, 24 May 2024 04:36:21 -0400
Subject: [PATCH 186/215] Fix `Style/SuperArguments` cop (#30406)

---
 app/controllers/auth/registrations_controller.rb  | 2 +-
 app/lib/activitypub/serializer.rb                 | 2 +-
 app/lib/connection_pool/shared_connection_pool.rb | 2 +-
 app/lib/rss/channel.rb                            | 2 +-
 app/lib/rss/item.rb                               | 2 +-
 app/models/concerns/attachmentable.rb             | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb
index acfc0af0d..f858c0ad9 100644
--- a/app/controllers/auth/registrations_controller.rb
+++ b/app/controllers/auth/registrations_controller.rb
@@ -44,7 +44,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
   end
 
   def build_resource(hash = nil)
-    super(hash)
+    super
 
     resource.locale                 = I18n.locale
     resource.invite_code            = @invite&.code if resource.invite_code.blank?
diff --git a/app/lib/activitypub/serializer.rb b/app/lib/activitypub/serializer.rb
index 1fdc79310..b17ec3fdf 100644
--- a/app/lib/activitypub/serializer.rb
+++ b/app/lib/activitypub/serializer.rb
@@ -33,6 +33,6 @@ class ActivityPub::Serializer < ActiveModel::Serializer
       adapter_options[:named_contexts].merge!(_named_contexts)
       adapter_options[:context_extensions].merge!(_context_extensions)
     end
-    super(adapter_options, options, adapter_instance)
+    super
   end
 end
diff --git a/app/lib/connection_pool/shared_connection_pool.rb b/app/lib/connection_pool/shared_connection_pool.rb
index 3ca22d0ef..1cfcc5823 100644
--- a/app/lib/connection_pool/shared_connection_pool.rb
+++ b/app/lib/connection_pool/shared_connection_pool.rb
@@ -5,7 +5,7 @@ require_relative 'shared_timed_stack'
 
 class ConnectionPool::SharedConnectionPool < ConnectionPool
   def initialize(options = {}, &block)
-    super(options, &block)
+    super
 
     @available = ConnectionPool::SharedTimedStack.new(@size, &block)
   end
diff --git a/app/lib/rss/channel.rb b/app/lib/rss/channel.rb
index 9013ed066..518ea7140 100644
--- a/app/lib/rss/channel.rb
+++ b/app/lib/rss/channel.rb
@@ -2,7 +2,7 @@
 
 class RSS::Channel < RSS::Element
   def initialize
-    super()
+    super
 
     @root = create_element('channel')
   end
diff --git a/app/lib/rss/item.rb b/app/lib/rss/item.rb
index 6739a2c18..8be8d4bf3 100644
--- a/app/lib/rss/item.rb
+++ b/app/lib/rss/item.rb
@@ -2,7 +2,7 @@
 
 class RSS::Item < RSS::Element
   def initialize
-    super()
+    super
 
     @root = create_element('item')
   end
diff --git a/app/models/concerns/attachmentable.rb b/app/models/concerns/attachmentable.rb
index 3b7db1fce..f457f5822 100644
--- a/app/models/concerns/attachmentable.rb
+++ b/app/models/concerns/attachmentable.rb
@@ -23,7 +23,7 @@ module Attachmentable
 
   included do
     def self.has_attached_file(name, options = {}) # rubocop:disable Naming/PredicateName
-      super(name, options)
+      super
 
       send(:"before_#{name}_validate", prepend: true) do
         attachment = send(name)

From 8394a150d787bb9334993ef2ba1e79c9d213be78 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 24 May 2024 11:01:42 +0200
Subject: [PATCH 187/215] chore(deps): update dependency rubocop to v1.64.0
 (#30404)

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 f1a1d2a93..78023bd7f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -726,7 +726,7 @@ GEM
       rspec-mocks (~> 3.0)
       sidekiq (>= 5, < 8)
     rspec-support (3.13.1)
-    rubocop (1.63.5)
+    rubocop (1.64.0)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)

From acc77c3836974473e7c6a423cbd1138479ae197a Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Fri, 24 May 2024 15:13:23 +0200
Subject: [PATCH 188/215] Add instrumentation to the search services (#30350)

---
 Gemfile                                 |  2 ++
 Gemfile.lock                            |  1 +
 app/services/account_search_service.rb  | 22 ++++++++++++++++------
 app/services/statuses_search_service.rb | 24 +++++++++++++++++-------
 app/services/tag_search_service.rb      | 24 +++++++++++++++++-------
 config/initializers/opentelemetry.rb    |  2 ++
 6 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/Gemfile b/Gemfile
index 240dcce95..d9de33182 100644
--- a/Gemfile
+++ b/Gemfile
@@ -103,6 +103,8 @@ gem 'rdf-normalize', '~> 0.5'
 
 gem 'private_address_check', '~> 0.5'
 
+gem 'opentelemetry-api', '~> 1.2.5'
+
 group :opentelemetry do
   gem 'opentelemetry-exporter-otlp', '~> 0.26.3', require: false
   gem 'opentelemetry-instrumentation-active_job', '~> 0.7.1', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 78023bd7f..ad60eb8be 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -975,6 +975,7 @@ DEPENDENCIES
   omniauth-rails_csrf_protection (~> 1.0)
   omniauth-saml (~> 2.0)
   omniauth_openid_connect (~> 0.6.1)
+  opentelemetry-api (~> 1.2.5)
   opentelemetry-exporter-otlp (~> 0.26.3)
   opentelemetry-instrumentation-active_job (~> 0.7.1)
   opentelemetry-instrumentation-active_model_serializers (~> 0.20.1)
diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb
index 571a0fa57..b86c9b9e7 100644
--- a/app/services/account_search_service.rb
+++ b/app/services/account_search_service.rb
@@ -151,13 +151,23 @@ class AccountSearchService < BaseService
   end
 
   def call(query, account = nil, options = {})
-    @query   = query&.strip&.gsub(/\A@/, '')
-    @limit   = options[:limit].to_i
-    @offset  = options[:offset].to_i
-    @options = options
-    @account = account
+    MastodonOTELTracer.in_span('AccountSearchService#call') do |span|
+      @query   = query&.strip&.gsub(/\A@/, '')
+      @limit   = options[:limit].to_i
+      @offset  = options[:offset].to_i
+      @options = options
+      @account = account
 
-    search_service_results.compact.uniq
+      span.add_attributes(
+        'search.offset' => @offset,
+        'search.limit' => @limit,
+        'search.backend' => Chewy.enabled? ? 'elasticsearch' : 'database'
+      )
+
+      search_service_results.compact.uniq.tap do |results|
+        span.set_attribute('search.results.count', results.size)
+      end
+    end
   end
 
   private
diff --git a/app/services/statuses_search_service.rb b/app/services/statuses_search_service.rb
index 7d5b0203a..ab8e28f61 100644
--- a/app/services/statuses_search_service.rb
+++ b/app/services/statuses_search_service.rb
@@ -2,14 +2,24 @@
 
 class StatusesSearchService < BaseService
   def call(query, account = nil, options = {})
-    @query   = query&.strip
-    @account = account
-    @options = options
-    @limit   = options[:limit].to_i
-    @offset  = options[:offset].to_i
+    MastodonOTELTracer.in_span('StatusesSearchService#call') do |span|
+      @query   = query&.strip
+      @account = account
+      @options = options
+      @limit   = options[:limit].to_i
+      @offset  = options[:offset].to_i
+      convert_deprecated_options!
 
-    convert_deprecated_options!
-    status_search_results
+      span.add_attributes(
+        'search.offset' => @offset,
+        'search.limit' => @limit,
+        'search.backend' => Chewy.enabled? ? 'elasticsearch' : 'database'
+      )
+
+      status_search_results.tap do |results|
+        span.set_attribute('search.results.count', results.size)
+      end
+    end
   end
 
   private
diff --git a/app/services/tag_search_service.rb b/app/services/tag_search_service.rb
index 929cfd884..57400b76a 100644
--- a/app/services/tag_search_service.rb
+++ b/app/services/tag_search_service.rb
@@ -2,15 +2,25 @@
 
 class TagSearchService < BaseService
   def call(query, options = {})
-    @query   = query.strip.delete_prefix('#')
-    @offset  = options.delete(:offset).to_i
-    @limit   = options.delete(:limit).to_i
-    @options = options
+    MastodonOTELTracer.in_span('TagSearchService#call') do |span|
+      @query   = query.strip.delete_prefix('#')
+      @offset  = options.delete(:offset).to_i
+      @limit   = options.delete(:limit).to_i
+      @options = options
 
-    results   = from_elasticsearch if Chewy.enabled?
-    results ||= from_database
+      span.add_attributes(
+        'search.offset' => @offset,
+        'search.limit' => @limit,
+        'search.backend' => Chewy.enabled? ? 'elasticsearch' : 'database'
+      )
 
-    results
+      results   = from_elasticsearch if Chewy.enabled?
+      results ||= from_database
+
+      span.set_attribute('search.results.count', results.size)
+
+      results
+    end
   end
 
   private
diff --git a/config/initializers/opentelemetry.rb b/config/initializers/opentelemetry.rb
index cf9f0b96f..d121a95a3 100644
--- a/config/initializers/opentelemetry.rb
+++ b/config/initializers/opentelemetry.rb
@@ -66,3 +66,5 @@ if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) }
     c.service_version = Mastodon::Version.to_s
   end
 end
+
+MastodonOTELTracer = OpenTelemetry.tracer_provider.tracer('mastodon')

From 33350cde96187c7356eadfe19a0d602045b0dcbb Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 24 May 2024 16:44:00 +0200
Subject: [PATCH 189/215] chore(deps): update dependency webmock to v3.23.1
 (#30414)

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 ad60eb8be..5feab4d09 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -877,7 +877,7 @@ GEM
     webfinger (1.2.0)
       activesupport
       httpclient (>= 2.4)
-    webmock (3.23.0)
+    webmock (3.23.1)
       addressable (>= 2.8.0)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)

From ccb6aeddacbab950d7d7f1b0d2b64212d7aa99eb Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 24 May 2024 16:44:03 +0200
Subject: [PATCH 190/215] fix(deps): update babel monorepo to v7.24.6 (#30415)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 1283 ++++++++++++++++++++++++++---------------------------
 1 file changed, 641 insertions(+), 642 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index b4e94dbb3..03157cce5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -42,128 +42,128 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.2":
-  version: 7.24.2
-  resolution: "@babel/code-frame@npm:7.24.2"
+"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/code-frame@npm:7.24.6"
   dependencies:
-    "@babel/highlight": "npm:^7.24.2"
+    "@babel/highlight": "npm:^7.24.6"
     picocolors: "npm:^1.0.0"
-  checksum: 10c0/d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406
+  checksum: 10c0/c93c6d1763530f415218c31d07359364397f19b70026abdff766164c21ed352a931cf07f3102c5fb9e04792de319e332d68bcb1f7debef601a02197f90f9ba24
   languageName: node
   linkType: hard
 
-"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.24.4":
-  version: 7.24.4
-  resolution: "@babel/compat-data@npm:7.24.4"
-  checksum: 10c0/9cd8a9cd28a5ca6db5d0e27417d609f95a8762b655e8c9c97fd2de08997043ae99f0139007083c5e607601c6122e8432c85fe391731b19bf26ad458fa0c60dd3
+"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/compat-data@npm:7.24.6"
+  checksum: 10c0/f50abbd4008eb2a5d12139c578809cebbeaeb8e660fb12d546eb2e7c2108ae1836ab8339184a5f5ce0e95bf81bb91e18edce86b387c59db937b01693ec0bc774
   languageName: node
   linkType: hard
 
 "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1, @babel/core@npm:^7.24.4":
-  version: 7.24.5
-  resolution: "@babel/core@npm:7.24.5"
+  version: 7.24.6
+  resolution: "@babel/core@npm:7.24.6"
   dependencies:
     "@ampproject/remapping": "npm:^2.2.0"
-    "@babel/code-frame": "npm:^7.24.2"
-    "@babel/generator": "npm:^7.24.5"
-    "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-module-transforms": "npm:^7.24.5"
-    "@babel/helpers": "npm:^7.24.5"
-    "@babel/parser": "npm:^7.24.5"
-    "@babel/template": "npm:^7.24.0"
-    "@babel/traverse": "npm:^7.24.5"
-    "@babel/types": "npm:^7.24.5"
+    "@babel/code-frame": "npm:^7.24.6"
+    "@babel/generator": "npm:^7.24.6"
+    "@babel/helper-compilation-targets": "npm:^7.24.6"
+    "@babel/helper-module-transforms": "npm:^7.24.6"
+    "@babel/helpers": "npm:^7.24.6"
+    "@babel/parser": "npm:^7.24.6"
+    "@babel/template": "npm:^7.24.6"
+    "@babel/traverse": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
     convert-source-map: "npm:^2.0.0"
     debug: "npm:^4.1.0"
     gensync: "npm:^1.0.0-beta.2"
     json5: "npm:^2.2.3"
     semver: "npm:^6.3.1"
-  checksum: 10c0/e26ba810a77bc8e21579a12fc36c79a0a60554404dc9447f2d64eb1f26d181c48d3b97d39d9f158e9911ec7162a8280acfaf2b4b210e975f0dd4bd4dbb1ee159
+  checksum: 10c0/e0762a8daef7f417494d555929418cfacd6848c7fc3310ec00e6dd8cecac20b7f590e760bfc9365d2af07874a3f5599832f9c9ff7f1a9d126a168f77ba67945a
   languageName: node
   linkType: hard
 
-"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.7.2":
-  version: 7.24.5
-  resolution: "@babel/generator@npm:7.24.5"
+"@babel/generator@npm:^7.24.6, @babel/generator@npm:^7.7.2":
+  version: 7.24.6
+  resolution: "@babel/generator@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.24.5"
+    "@babel/types": "npm:^7.24.6"
     "@jridgewell/gen-mapping": "npm:^0.3.5"
     "@jridgewell/trace-mapping": "npm:^0.3.25"
     jsesc: "npm:^2.5.1"
-  checksum: 10c0/0d64f880150e7dfb92ceff2b4ac865f36aa1e295120920246492ffd0146562dabf79ba8699af1c8833f8a7954818d4d146b7b02f808df4d6024fb99f98b2f78d
+  checksum: 10c0/8d71a17b386536582354afba53cc784396458a88cc9f05f0c6de0ec99475f6f539943b3566b2e733820c4928236952473831765e483c25d68cc007a6e604d782
   languageName: node
   linkType: hard
 
-"@babel/helper-annotate-as-pure@npm:^7.22.5":
-  version: 7.22.5
-  resolution: "@babel/helper-annotate-as-pure@npm:7.22.5"
+"@babel/helper-annotate-as-pure@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-annotate-as-pure@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.22.5"
-  checksum: 10c0/5a80dc364ddda26b334bbbc0f6426cab647381555ef7d0cd32eb284e35b867c012ce6ce7d52a64672ed71383099c99d32765b3d260626527bb0e3470b0f58e45
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/3fe446e3bd37e5e32152279c84ace4e83815e5b88b9e09a82a83974a0bb22e941d89db26b23aaab4c9eb0f9713772c2f6163feffc1bcb055c4cdb6b67e5dc82f
   languageName: node
   linkType: hard
 
-"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15":
-  version: 7.22.15
-  resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15"
+"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.22.15"
-  checksum: 10c0/2535e3824ca6337f65786bbac98e562f71699f25532cecd196f027d7698b4967a96953d64e36567956658ad1a05ccbdc62d1ba79ee751c79f4f1d2d3ecc2e01c
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/d468ba492163bdcf5b6c53248edcf0aaed6194c0f7bdebef4f29ef626e5b03e9fcc7ed737445eb80a961ec6e687c330e1c5242d8a724efb0af002141f3b3e66c
   languageName: node
   linkType: hard
 
-"@babel/helper-builder-react-jsx@npm:^7.22.10":
-  version: 7.22.10
-  resolution: "@babel/helper-builder-react-jsx@npm:7.22.10"
+"@babel/helper-builder-react-jsx@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-builder-react-jsx@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/types": "npm:^7.22.10"
-  checksum: 10c0/8e2ad2e17dd779ddccec29f6b1de61df1f199694673bdbbae0474878211139f2e574810726110e4d46c1e9a0221af1f2d38bd0398dd20490eb03a24f790602be
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/93b0500d00f214bc2f7f142ebfa0a634872cadd446bd767f7d58b26ae1b46e1f262b0fe80a9151691463611a3148a69ad28f930295d976bf8ced32c79449a3ce
   languageName: node
   linkType: hard
 
-"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6":
-  version: 7.23.6
-  resolution: "@babel/helper-compilation-targets@npm:7.23.6"
+"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-compilation-targets@npm:7.24.6"
   dependencies:
-    "@babel/compat-data": "npm:^7.23.5"
-    "@babel/helper-validator-option": "npm:^7.23.5"
+    "@babel/compat-data": "npm:^7.24.6"
+    "@babel/helper-validator-option": "npm:^7.24.6"
     browserslist: "npm:^4.22.2"
     lru-cache: "npm:^5.1.1"
     semver: "npm:^6.3.1"
-  checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa
+  checksum: 10c0/4d41150086959f5f4d72d27bae29204192e943537ecb71df1711d1f5d8791358a44f3a5882ed3c8238ba0c874b0b55213af43767e14771765f13b8d15b262432
   languageName: node
   linkType: hard
 
-"@babel/helper-create-class-features-plugin@npm:^7.24.1, @babel/helper-create-class-features-plugin@npm:^7.24.4, @babel/helper-create-class-features-plugin@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/helper-create-class-features-plugin@npm:7.24.5"
+"@babel/helper-create-class-features-plugin@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-create-class-features-plugin@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-function-name": "npm:^7.23.0"
-    "@babel/helper-member-expression-to-functions": "npm:^7.24.5"
-    "@babel/helper-optimise-call-expression": "npm:^7.22.5"
-    "@babel/helper-replace-supers": "npm:^7.24.1"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5"
-    "@babel/helper-split-export-declaration": "npm:^7.24.5"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-function-name": "npm:^7.24.6"
+    "@babel/helper-member-expression-to-functions": "npm:^7.24.6"
+    "@babel/helper-optimise-call-expression": "npm:^7.24.6"
+    "@babel/helper-replace-supers": "npm:^7.24.6"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6"
+    "@babel/helper-split-export-declaration": "npm:^7.24.6"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/afc72e8075a249663f8024ef1760de4c0b9252bdde16419ac955fa7e15b8d4096ca1e01f796df4fa8cfdb056708886f60b631ad492242a8e47307974fc305920
+  checksum: 10c0/e6734671bc6a5f3cca4ec46e4cc70238e5a2fa063e51225c2be572f157119002af419b33ea0f846dbb1307370fe9f3aa92d199449abbea5e88e0262513c8a821
   languageName: node
   linkType: hard
 
-"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5":
-  version: 7.22.15
-  resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15"
+"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
     regexpu-core: "npm:^5.3.1"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/8eba4c1b7b94a83e7a82df5c3e504584ff0ba6ab8710a67ecc2c434a7fb841a29c2f5c94d2de51f25446119a1df538fa90b37bd570db22ddd5e7147fe98277c6
+  checksum: 10c0/c6e1b07c94b3b93a3f534039da88bc67ec3156080f1959aa07d5d534e9a640de3533e7ded0516dfcbccde955e91687044e6a950852b1d3f402ac5d5001be56cf
   languageName: node
   linkType: hard
 
@@ -182,243 +182,242 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/helper-environment-visitor@npm:^7.22.20":
-  version: 7.22.20
-  resolution: "@babel/helper-environment-visitor@npm:7.22.20"
-  checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94
+"@babel/helper-environment-visitor@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-environment-visitor@npm:7.24.6"
+  checksum: 10c0/fdcd18ac505ed71f40c05cc992b648a4495b0aa5310a774492a0f74d8dcf3579691102f516561a651d3de6c3a44fe64bfb3049d11c14c5857634ef1823ea409a
   languageName: node
   linkType: hard
 
-"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0":
-  version: 7.23.0
-  resolution: "@babel/helper-function-name@npm:7.23.0"
+"@babel/helper-function-name@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-function-name@npm:7.24.6"
   dependencies:
-    "@babel/template": "npm:^7.22.15"
-    "@babel/types": "npm:^7.23.0"
-  checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428
+    "@babel/template": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/5ba2f8db789b3f5a2b2239300a217aa212e303cd7bfad9c8b90563807f49215e8c679e8f8f177b6aaca2038038e29bc702b83839e1f7b4896d79c44a75cac97a
   languageName: node
   linkType: hard
 
-"@babel/helper-hoist-variables@npm:^7.22.5":
-  version: 7.22.5
-  resolution: "@babel/helper-hoist-variables@npm:7.22.5"
+"@babel/helper-hoist-variables@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-hoist-variables@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.22.5"
-  checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/e10ec6b864aaa419ec4934f5fcb5d0cfcc9d0657584a1b6c3c42ada949d44ca6bffcdab433a90ada4396c747e551cca31ba0e565ea005ab3f50964e3817bf6cf
   languageName: node
   linkType: hard
 
-"@babel/helper-member-expression-to-functions@npm:^7.23.0, @babel/helper-member-expression-to-functions@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/helper-member-expression-to-functions@npm:7.24.5"
+"@babel/helper-member-expression-to-functions@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-member-expression-to-functions@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.24.5"
-  checksum: 10c0/a3c0276a1ede8648a0e6fd86ad846cd57421d05eddfa29446b8b5a013db650462022b9ec1e65ea32c747d0542d729c80866830697f94fb12d603e87c51f080a5
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/7595f62978f55921b24de6ed5252fcedbffacfb8271f71e092f38724179ba554cb3a24a4764a1a3890b8a53504c2bee9c99eab81f1f365582739f566c8e28eaa
   languageName: node
   linkType: hard
 
-"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.1, @babel/helper-module-imports@npm:^7.24.3":
-  version: 7.24.3
-  resolution: "@babel/helper-module-imports@npm:7.24.3"
+"@babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-module-imports@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.24.0"
-  checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/e0db3fbfcd963d138f0792ff626f940a576fcf212d02b8fe6478dccf3421bd1c2a76f8e69c7450c049985e7b63b30be309a24eeeb6ad7c2137a31b676a095a84
   languageName: node
   linkType: hard
 
-"@babel/helper-module-transforms@npm:^7.23.3, @babel/helper-module-transforms@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/helper-module-transforms@npm:7.24.5"
+"@babel/helper-module-transforms@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-module-transforms@npm:7.24.6"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-module-imports": "npm:^7.24.3"
-    "@babel/helper-simple-access": "npm:^7.24.5"
-    "@babel/helper-split-export-declaration": "npm:^7.24.5"
-    "@babel/helper-validator-identifier": "npm:^7.24.5"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-module-imports": "npm:^7.24.6"
+    "@babel/helper-simple-access": "npm:^7.24.6"
+    "@babel/helper-split-export-declaration": "npm:^7.24.6"
+    "@babel/helper-validator-identifier": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/6e77d72f62b7e87abaea800ea0bccd4d54cde26485750969f5f493c032eb63251eb50c3522cace557781565d51c1d0c4bcc866407d24becfb109c18fb92c978d
+  checksum: 10c0/9e2e3d0ddb397b36b9e8c7d94e175a36be8cb888ef370cefef2cdfd53ae1f87d567b268bd90ed9a6c706485a8de3da19cac577657613e9cd17210b91cbdfb00b
   languageName: node
   linkType: hard
 
-"@babel/helper-optimise-call-expression@npm:^7.22.5":
-  version: 7.22.5
-  resolution: "@babel/helper-optimise-call-expression@npm:7.22.5"
+"@babel/helper-optimise-call-expression@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-optimise-call-expression@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.22.5"
-  checksum: 10c0/31b41a764fc3c585196cf5b776b70cf4705c132e4ce9723f39871f215f2ddbfb2e28a62f9917610f67c8216c1080482b9b05f65dd195dae2a52cef461f2ac7b8
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/7fce2c4ce22c4ba3c2178d1ce85f34fc9bbe286af5ec153b4b6ea9bf2212390359c4a1e8a54551c4daa4688022d619668bdb8c8060cb185c0c9ad02c5247efc9
   languageName: node
   linkType: hard
 
-"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.24.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
-  version: 7.24.5
-  resolution: "@babel/helper-plugin-utils@npm:7.24.5"
-  checksum: 10c0/4ae40094e6a2f183281213344f4df60c66b16b19a2bc38d2bb11810a6dc0a0e7ec638957d0e433ff8b615775b8f3cd1b7edbf59440d1b50e73c389fc22913377
+"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.6, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
+  version: 7.24.6
+  resolution: "@babel/helper-plugin-utils@npm:7.24.6"
+  checksum: 10c0/636d3ce8cabc0621c1f78187e1d95f1087209921fa452f76aad06224ef5dffb3d934946f5183109920f32a4b94dd75ac91c63bc52813fee639d10cd54d49ba1f
   languageName: node
   linkType: hard
 
-"@babel/helper-remap-async-to-generator@npm:^7.22.20":
-  version: 7.22.20
-  resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20"
+"@babel/helper-remap-async-to-generator@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-remap-async-to-generator@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-wrap-function": "npm:^7.22.20"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-wrap-function": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/aa93aa74250b636d477e8d863fbe59d4071f8c2654841b7ac608909e480c1cf3ff7d7af5a4038568829ad09d810bb681668cbe497d9c89ba5c352793dc9edf1e
+  checksum: 10c0/b379b844eba352ac9487d31867e7bb2b8a264057f1739d9161b614145ea6e60969a7a82e75e5e83089e50cf1b6559f53aa085a787942bf40706fee15a2faa33c
   languageName: node
   linkType: hard
 
-"@babel/helper-replace-supers@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/helper-replace-supers@npm:7.24.1"
+"@babel/helper-replace-supers@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-replace-supers@npm:7.24.6"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-member-expression-to-functions": "npm:^7.23.0"
-    "@babel/helper-optimise-call-expression": "npm:^7.22.5"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-member-expression-to-functions": "npm:^7.24.6"
+    "@babel/helper-optimise-call-expression": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/d39a3df7892b7c3c0e307fb229646168a9bd35e26a72080c2530729322600e8cff5f738f44a14860a2358faffa741b6a6a0d6749f113387b03ddbfa0ec10e1a0
+  checksum: 10c0/aaf2dfaf25360da1525ecea5979d5afed201b96f0feeed2e15f90883a97776132a720b25039e67fee10a5c537363aea5cc2a46c0f1d13fdb86d0e920244f2da7
   languageName: node
   linkType: hard
 
-"@babel/helper-simple-access@npm:^7.22.5, @babel/helper-simple-access@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/helper-simple-access@npm:7.24.5"
+"@babel/helper-simple-access@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-simple-access@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.24.5"
-  checksum: 10c0/d96a0ab790a400f6c2dcbd9457b9ca74b9ba6d0f67ff9cd5bcc73792c8fbbd0847322a0dddbd8987dd98610ee1637c680938c7d83d3ffce7d06d7519d823d996
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/b17e404dd6c9787fc7d558aea5222471a77e29596705f0d10b4c2a58b9d71ff7eae915094204848cc1af99b771553caa69337a768b9abdd82b54a0050ba83eb9
   languageName: node
   linkType: hard
 
-"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5":
-  version: 7.22.5
-  resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5"
+"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.22.5"
-  checksum: 10c0/ab7fa2aa709ab49bb8cd86515a1e715a3108c4bb9a616965ba76b43dc346dee66d1004ccf4d222b596b6224e43e04cbc5c3a34459501b388451f8c589fbc3691
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/6928f698362d6082a67ee2bc73991ef6b0cc6b5f2854177389bc8f3c09296580f0ee20134dd1a29dfcb1906ad9e346fa0f7c6fcd7589ab3ff176d4f09504577f
   languageName: node
   linkType: hard
 
-"@babel/helper-split-export-declaration@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/helper-split-export-declaration@npm:7.24.5"
+"@babel/helper-split-export-declaration@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-split-export-declaration@npm:7.24.6"
   dependencies:
-    "@babel/types": "npm:^7.24.5"
-  checksum: 10c0/d7a812d67d031a348f3fb0e6263ce2dbe6038f81536ba7fb16db385383bcd6542b71833194303bf6d3d0e4f7b6b584c9c8fae8772122e2ce68fc9bdf07f4135d
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/53a5dd8691fdffc89cc7fcf5aed0ad1d8bc39796a5782a3d170dcbf249eb5c15cc8a290e8d09615711d18798ad04a7d0694ab5195d35fa651abbc1b9c885d6a8
   languageName: node
   linkType: hard
 
-"@babel/helper-string-parser@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/helper-string-parser@npm:7.24.1"
-  checksum: 10c0/2f9bfcf8d2f9f083785df0501dbab92770111ece2f90d120352fda6dd2a7d47db11b807d111e6f32aa1ba6d763fe2dc6603d153068d672a5d0ad33ca802632b2
+"@babel/helper-string-parser@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-string-parser@npm:7.24.6"
+  checksum: 10c0/95115bf676e92c4e99166395649108d97447e6cabef1fabaec8cdbc53a43f27b5df2268ff6534439d405bc1bd06685b163eb3b470455bd49f69159dada414145
   languageName: node
   linkType: hard
 
-"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/helper-validator-identifier@npm:7.24.5"
-  checksum: 10c0/05f957229d89ce95a137d04e27f7d0680d84ae48b6ad830e399db0779341f7d30290f863a93351b4b3bde2166737f73a286ea42856bb07c8ddaa95600d38645c
+"@babel/helper-validator-identifier@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-validator-identifier@npm:7.24.6"
+  checksum: 10c0/d29d2e3fca66c31867a009014169b93f7bc21c8fc1dd7d0b9d85d7a4000670526ff2222d966febb75a6e12f9859a31d1e75b558984e28ecb69651314dd0a6fd1
   languageName: node
   linkType: hard
 
-"@babel/helper-validator-option@npm:^7.23.5":
-  version: 7.23.5
-  resolution: "@babel/helper-validator-option@npm:7.23.5"
-  checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94
+"@babel/helper-validator-option@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-validator-option@npm:7.24.6"
+  checksum: 10c0/787268dff5cf77f3b704454b96ab7b58aa4f43b2808247e51859a103a1c28a9c252100f830433f4b37a73f4a61ba745bbeef4cdccbab48c1e9adf037f4ca3491
   languageName: node
   linkType: hard
 
-"@babel/helper-wrap-function@npm:^7.22.20":
-  version: 7.22.20
-  resolution: "@babel/helper-wrap-function@npm:7.22.20"
+"@babel/helper-wrap-function@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helper-wrap-function@npm:7.24.6"
   dependencies:
-    "@babel/helper-function-name": "npm:^7.22.5"
-    "@babel/template": "npm:^7.22.15"
-    "@babel/types": "npm:^7.22.19"
-  checksum: 10c0/97b5f42ff4d305318ff2f99a5f59d3e97feff478333b2d893c4f85456d3c66372070f71d7bf9141f598c8cf2741c49a15918193633c427a88d170d98eb8c46eb
+    "@babel/helper-function-name": "npm:^7.24.6"
+    "@babel/template": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/d32844275a544a8e7c71c13e9832d34d80656aafce659dc6c23b02e14d1c1179d8045125ded5096da1a99de83299ffb48211183d0403da2c8584ed55dc0ab646
   languageName: node
   linkType: hard
 
-"@babel/helpers@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/helpers@npm:7.24.5"
+"@babel/helpers@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/helpers@npm:7.24.6"
   dependencies:
-    "@babel/template": "npm:^7.24.0"
-    "@babel/traverse": "npm:^7.24.5"
-    "@babel/types": "npm:^7.24.5"
-  checksum: 10c0/0630b0223c3a9a34027ddc05b3bac54d68d5957f84e92d2d4814b00448a76e12f9188f9c85cfce2011696d82a8ffcbd8189da097c0af0181d32eb27eca34185e
+    "@babel/template": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/e5b5c0919fd6fa56ae11c15a72962d8de0ac19db524849554af28cf08ac32f9ae5aee49a43146eb150f54418cefb8e890fa2b2f33d029434dc7777dbcdfd5bac
   languageName: node
   linkType: hard
 
-"@babel/highlight@npm:^7.24.2":
-  version: 7.24.2
-  resolution: "@babel/highlight@npm:7.24.2"
+"@babel/highlight@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/highlight@npm:7.24.6"
   dependencies:
-    "@babel/helper-validator-identifier": "npm:^7.22.20"
+    "@babel/helper-validator-identifier": "npm:^7.24.6"
     chalk: "npm:^2.4.2"
     js-tokens: "npm:^4.0.0"
     picocolors: "npm:^1.0.0"
-  checksum: 10c0/98ce00321daedeed33a4ed9362dc089a70375ff1b3b91228b9f05e6591d387a81a8cba68886e207861b8871efa0bc997ceabdd9c90f6cce3ee1b2f7f941b42db
+  checksum: 10c0/5bbc31695e5d44e97feb267f7aaf4c52908560d184ffeb2e2e57aae058d40125592931883889413e19def3326895ddb41ff45e090fa90b459d8c294b4ffc238c
   languageName: node
   linkType: hard
 
-"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/parser@npm:7.24.5"
+"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/parser@npm:7.24.6"
   bin:
     parser: ./bin/babel-parser.js
-  checksum: 10c0/8333a6ad5328bad34fa0e12bcee147c3345ea9a438c0909e7c68c6cfbea43c464834ffd7eabd1cbc1c62df0a558e22ffade9f5b29440833ba7b33d96a71f88c0
+  checksum: 10c0/cbef70923078a20fe163b03f4a6482be65ed99d409a57f3091a23ce3a575ee75716c30e7ea9f40b692ac5660f34055f4cbeb66a354fad15a6cf1fca35c3496c5
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.5"
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.6"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/b471972dcc4a3ba32821329a57725e2b563421e975d7ffec7fcabd70af0fced6a50bcc9ed2a8cbd4a9ac7c09cfbf43c7116e82f3b9064b33a22309500b632108
+  checksum: 10c0/0dbf12de5a7e5d092271124f0d9bff1ceb94871d5563041940512671cd40ab2a93d613715ee37076cd8263cf49579afb805faa3189996c11639bb10d3e9837f1
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.1"
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/d4e592e6fc4878654243d2e7b51ea86471b868a8cb09de29e73b65d2b64159990c6c198fd7c9c2af2e38b1cddf70206243792853c47384a84f829dada152f605
+  checksum: 10c0/b0a03d4f587e1fa92312c912864a0af3f68bfc87367b7c93770e94f171767d563d7adfca7ad571d20cd755e89e1373e7414973ce30e694e7b6eb8f57d2b1b889
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.1"
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5"
-    "@babel/plugin-transform-optional-chaining": "npm:^7.24.1"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6"
+    "@babel/plugin-transform-optional-chaining": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.13.0
-  checksum: 10c0/351c36e45795a7890d610ab9041a52f4078a59429f6e74c281984aa44149a10d43e82b3a8172c703c0d5679471e165d1c02b6d2e45a677958ee301b89403f202
+  checksum: 10c0/fdd40fdf7e87f3dbc5396c9a8f92005798865f6f20d2c24c33246ac43aab8df93742b63dfcfcda67c0a5cf1f7b8a987fdbccaceb9ccbb9a67bef10012b522390
   languageName: node
   linkType: hard
 
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1"
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.6"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/d7dd5a59a54635a3152895dcaa68f3370bb09d1f9906c1e72232ff759159e6be48de4a598a993c986997280a2dc29922a48aaa98020f16439f3f57ad72788354
+  checksum: 10c0/cc1e8ee138c71e78ec262a5198d2cf75c305f2fb4ea9771ebd4ded47f51bc1bacbf917db3cb28c681e7499a07f9803ab0bbe5ad50b9576cbe03902189e3871ed
   languageName: node
   linkType: hard
 
@@ -497,25 +496,25 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-import-assertions@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.1"
+"@babel/plugin-syntax-import-assertions@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/72f0340d73e037f0702c61670054e0af66ece7282c5c2f4ba8de059390fee502de282defdf15959cd9f71aa18dc5c5e4e7a0fde317799a0600c6c4e0a656d82b
+  checksum: 10c0/8e81c7cd3d5812a3dda32f06f84492a1b5640f42c594619ed57bf4017529889f87bfb4e8e95c50ba1527d89501dae71a0c73770502676545c2cd9ce58ce3258d
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-import-attributes@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1"
+"@babel/plugin-syntax-import-attributes@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/309634e3335777aee902552b2cf244c4a8050213cc878b3fb9d70ad8cbbff325dc46ac5e5791836ff477ea373b27832238205f6ceaff81f7ea7c4c7e8fbb13bb
+  checksum: 10c0/c4d8554b89c0daa6d3c430582b98c10a3af2de8eab484082e97cb73f2712780ab6dd8d11d783c4b266efef76f4479abf4944ef8f416a4459b05eecaf438f8774
   languageName: node
   linkType: hard
 
@@ -541,14 +540,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-jsx@npm:7, @babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.24.1, @babel/plugin-syntax-jsx@npm:^7.7.2":
-  version: 7.24.1
-  resolution: "@babel/plugin-syntax-jsx@npm:7.24.1"
+"@babel/plugin-syntax-jsx@npm:7, @babel/plugin-syntax-jsx@npm:^7.24.6, @babel/plugin-syntax-jsx@npm:^7.7.2":
+  version: 7.24.6
+  resolution: "@babel/plugin-syntax-jsx@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a
+  checksum: 10c0/f00d783a9e2d52f0a8797823a3cbdbe2d0dc09c7235fe8c88e6dce3a02f234f52fb5e976a001cc30b0e2b330590b5680f54436e56d67f9ab05d1e4bdeb3992cd
   languageName: node
   linkType: hard
 
@@ -640,14 +639,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-syntax-typescript@npm:^7.24.1, @babel/plugin-syntax-typescript@npm:^7.7.2":
-  version: 7.24.1
-  resolution: "@babel/plugin-syntax-typescript@npm:7.24.1"
+"@babel/plugin-syntax-typescript@npm:^7.24.6, @babel/plugin-syntax-typescript@npm:^7.7.2":
+  version: 7.24.6
+  resolution: "@babel/plugin-syntax-typescript@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/7a81e277dcfe3138847e8e5944e02a42ff3c2e864aea6f33fd9b70d1556d12b0e70f0d56cc1985d353c91bcbf8fe163e6cc17418da21129b7f7f1d8b9ac00c93
+  checksum: 10c0/b1eeabf8bebfa78cea559c0a0d55e480fe2ebd799472d1f6bd5afbd2759d02b362d29ad30009c81d5b112797beb987e58a3000d2331adaa4bf03862e1ed18cef
   languageName: node
   linkType: hard
 
@@ -663,456 +662,456 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-arrow-functions@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.1"
+"@babel/plugin-transform-arrow-functions@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/f44bfacf087dc21b422bab99f4e9344ee7b695b05c947dacae66de05c723ab9d91800be7edc1fa016185e8c819f3aca2b4a5f66d8a4d1e47d9bad80b8fa55b8e
+  checksum: 10c0/46250eb3f535327825db323740a301b76b882b70979f1fb5f89cbb1a820378ab68ee880b912981dd5276dd116deaaee0f4a2a95f1c9cf537a67749fd4209a2d3
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-async-generator-functions@npm:^7.24.3":
-  version: 7.24.3
-  resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3"
+"@babel/plugin-transform-async-generator-functions@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.6"
   dependencies:
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-remap-async-to-generator": "npm:^7.22.20"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-remap-async-to-generator": "npm:^7.24.6"
     "@babel/plugin-syntax-async-generators": "npm:^7.8.4"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/55ceed059f819dcccbfe69600bfa1c055ada466bd54eda117cfdd2cf773dd85799e2f6556e4a559b076e93b9704abcca2aef9d72aad7dc8a5d3d17886052f1d3
+  checksum: 10c0/8876431855220ccfbf1ae510a4a7c4e0377b21189d3f73ea6dde5ffd31eee57f03ea2b2d1da59b6a36b6e107e41b38d0c1d1bb015e0d1c2c2fb627962260edb7
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-async-to-generator@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.1"
+"@babel/plugin-transform-async-to-generator@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.6"
   dependencies:
-    "@babel/helper-module-imports": "npm:^7.24.1"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-remap-async-to-generator": "npm:^7.22.20"
+    "@babel/helper-module-imports": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-remap-async-to-generator": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/3731ba8e83cbea1ab22905031f25b3aeb0b97c6467360a2cc685352f16e7c786417d8883bc747f5a0beff32266bdb12a05b6292e7b8b75967087200a7bc012c4
+  checksum: 10c0/52c137668e7a35356c3b1caf25ab3bf90ff61199885bfd9f0232bfe168a53a5cf0ca4c1e283c27e44ad76cc366b73e4ff7042241469d1944c7042fb78c57bfd8
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-block-scoped-functions@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.1"
+"@babel/plugin-transform-block-scoped-functions@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/6fbaa85f5204f34845dfc0bebf62fdd3ac5a286241c85651e59d426001e7a1785ac501f154e093e0b8ee49e1f51e3f8b06575a5ae8d4a9406d43e4816bf18c37
+  checksum: 10c0/0c761b5e3a2959b63edf47d67f6752e01f24777ad1accd82457a2dca059877f8a8297fbc7a062db6b48836309932f2ac645c507070ef6ad4e765b3600822c048
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-block-scoping@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-block-scoping@npm:7.24.5"
+"@babel/plugin-transform-block-scoping@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-block-scoping@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/85997fc8179b7d26e8af30865aeb91789f3bc1f0cd5643ed25f25891ff9c071460ec1220599b19070b424a3b902422f682e9b02e515872540173eae2e25f760c
+  checksum: 10c0/95c25e501c4553515f92d4e86032a8859a8855cea8aafb6df30f956979caa70af1e126e6dfaf9e51328d1306232ff1e081bda7d84a9aaf23f418d9da120c7018
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-class-properties@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-class-properties@npm:7.24.1"
+"@babel/plugin-transform-class-properties@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-class-properties@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.1"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-class-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/00dff042ac9df4ae67b5ef98b1137cc72e0a24e6d911dc200540a8cb1f00b4cff367a922aeb22da17da662079f0abcd46ee1c5f4cdf37ceebf6ff1639bb9af27
+  checksum: 10c0/ae01e00dd528112d542a77f0f1cf6b43726553d2011bbdec9e4fac441dfa161d44bf14449dc4121b45cc971686a8c652652032594e83c5d6cab8e9fd794eecb2
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-class-static-block@npm:^7.24.4":
-  version: 7.24.4
-  resolution: "@babel/plugin-transform-class-static-block@npm:7.24.4"
+"@babel/plugin-transform-class-static-block@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-class-static-block@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.4"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-class-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-class-static-block": "npm:^7.14.5"
   peerDependencies:
     "@babel/core": ^7.12.0
-  checksum: 10c0/19dfeaf4a2ac03695034f7211a8b5ad89103b224608ac3e91791055107c5fe4d7ebe5d9fbb31b4a91265694af78762260642eb270f4b239c175984ee4b253f80
+  checksum: 10c0/425f237faf62b531d973f23ac3eefe3f29c4f6c988c33c2dd660b6dfb61d4ed1e865a5088574742d87ed02437d26aa6ec6b107468b7df35ca9d3082bad742d8f
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-classes@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-classes@npm:7.24.5"
+"@babel/plugin-transform-classes@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-classes@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-function-name": "npm:^7.23.0"
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
-    "@babel/helper-replace-supers": "npm:^7.24.1"
-    "@babel/helper-split-export-declaration": "npm:^7.24.5"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/helper-compilation-targets": "npm:^7.24.6"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-function-name": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-replace-supers": "npm:^7.24.6"
+    "@babel/helper-split-export-declaration": "npm:^7.24.6"
     globals: "npm:^11.1.0"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/4affcbb7cb01fa4764c7a4b534c30fd24a4b68e680a2d6e242dd7ca8726490f0f1426c44797deff84a38a162e0629718900c68d28daffe2b12adf5b4194156a7
+  checksum: 10c0/d29c26feea9ad5a64d790aeab1833b7a50d6af2be24140dad7e06510b754b8fe0ffb292d43d96fedaf7765fcb90c0034ac7c42635f814d9235697431076a1cf0
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-computed-properties@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-computed-properties@npm:7.24.1"
+"@babel/plugin-transform-computed-properties@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-computed-properties@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/template": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/template": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/8292c508b656b7722e2c2ca0f6f31339852e3ed2b9b80f6e068a4010e961b431ca109ecd467fc906283f4b1574c1e7b1cb68d35a4dea12079d386c15ff7e0eac
+  checksum: 10c0/c464144c2eda8d526d70c8d8e3bf30820f591424991452f816617347ef3ccc5d04133c6e903b90c1d832d95d9c8550e5693ea40ea14856ede54fb8e1cd36c5de
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-destructuring@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-destructuring@npm:7.24.5"
+"@babel/plugin-transform-destructuring@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-destructuring@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/6a37953a95f04b335bf3e2118fb93f50dd9593c658d1b2f8918a380a2ee30f1b420139eccf7ec3873c86a8208527895fcf6b7e21c0e734a6ad6e5d5042eace4d
+  checksum: 10c0/1fcc064e2b0c45a4340418bd70d2cf2b3644d1215eb975ec14f83e4f7615fdc3948e355db5091f81602f6c3d933f9308caa66232091aad4edd6c16b00240fcc7
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-dotall-regex@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.1"
+"@babel/plugin-transform-dotall-regex@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/758def705ec5a87ef910280dc2df5d2fda59dc5d4771c1725c7aed0988ae5b79e29aeb48109120301a3e1c6c03dfac84700469de06f38ca92c96834e09eadf5d
+  checksum: 10c0/4a2c98f1c22a18754c6ada1486563865690008df2536066d8a146fa58eed8515b607e162c7efb0b8fa062d755e77afea145495046cffdb4ea56194d38f489254
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-duplicate-keys@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.1"
+"@babel/plugin-transform-duplicate-keys@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/41072f57f83a6c2b15f3ee0b6779cdca105ff3d98061efe92ac02d6c7b90fdb6e7e293b8a4d5b9c690d9ae5d3ae73e6bde4596dc4d8c66526a0e5e1abc73c88c
+  checksum: 10c0/44ddba252f0b9f1f0b1ff8d903bbcf8871246670fb2883f65d09d371d403ce9c3e2e582b94b36506c1d042110b464eb3492e53cd1e87c1d479b145bcc01c04fd
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-dynamic-import@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1"
+"@babel/plugin-transform-dynamic-import@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/7e2834780e9b5251ef341854043a89c91473b83c335358620ca721554877e64e416aeb3288a35f03e825c4958e07d5d00ead08c4490fadc276a21fe151d812f1
+  checksum: 10c0/b4411f21112127a02aef15103765e207e4c03e7321d7f4de3522fc181cb377c5abc8484cf0169e6c30f2e51e6c602c09894fa6b15643d24f66273833ef34e4a6
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-exponentiation-operator@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.1"
+"@babel/plugin-transform-exponentiation-operator@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.6"
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.22.15"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/f0fc4c5a9add25fd6bf23dabe6752e9b7c0a2b2554933dddfd16601245a2ba332b647951079c782bf3b94c6330e3638b9b4e0227f469a7c1c707446ba0eba6c7
+  checksum: 10c0/c4f15518a5d1614dfac0dbadfb99b0f36a98c1c1ff1c39794a105c3c87cfce00689e0943fcb13368b43b00b2eebaa01136ea12fb8600a574720853b5a8a11de7
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-export-namespace-from@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1"
+"@babel/plugin-transform-export-namespace-from@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/510bb23b2423d5fbffef69b356e4050929c21a7627e8194b1506dd935c7d9cbbd696c9ae9d7c3bcd7e6e7b69561b0b290c2d72d446327b40fc20ce40bbca6712
+  checksum: 10c0/bff16d1800d7e5b38d3a3c8d404cc14442a37383dff7769dcc599a0723b2507647cafe9ba7d9b52d2e2f02a78bb78d149676d8d8ddf7357b160f4096b89ae9c5
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-for-of@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-for-of@npm:7.24.1"
+"@babel/plugin-transform-for-of@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-for-of@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e4bc92b1f334246e62d4bde079938df940794db564742034f6597f2e38bd426e11ae8c5670448e15dd6e45c462f2a9ab3fa87259bddf7c08553ffd9457fc2b2c
+  checksum: 10c0/c8def2a160783c5c4a1c136c721fc88aca9cd3757a60f1c885a804b5320edb5f143d3f989f698bdd9aae359fdabab0830dba3d35138cea42988a77d2c72c8443
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-function-name@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-function-name@npm:7.24.1"
+"@babel/plugin-transform-function-name@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-function-name@npm:7.24.6"
   dependencies:
-    "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-function-name": "npm:^7.23.0"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-compilation-targets": "npm:^7.24.6"
+    "@babel/helper-function-name": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/65c1735ec3b5e43db9b5aebf3c16171c04b3050c92396b9e22dda0d2aaf51f43fdcf147f70a40678fd9a4ee2272a5acec4826e9c21bcf968762f4c184897ad75
+  checksum: 10c0/efa6527438ad94df0b7a4c92c33110ec40b086a0aceda567176b150ed291f8eb44b2ce697d8e3e1d4841496c10693add1e88f296418e72a171ead5c76b890a47
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-json-strings@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-json-strings@npm:7.24.1"
+"@babel/plugin-transform-json-strings@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-json-strings@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-json-strings": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/13d9b6a3c31ab4be853b3d49d8d1171f9bd8198562fd75da8f31e7de31398e1cfa6eb1d073bed93c9746e4f9c47a53b20f8f4c255ece3f88c90852ad3181dc2d
+  checksum: 10c0/46af52dcc16f494c6c11dc22c944f2533623b9d9dfce5097bc0bdb99535ad4c4cfe5bca0d8ce8c39a94202e69d99ee60f546ce0be0ad782b681c7b5b4c9ddd6f
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-literals@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-literals@npm:7.24.1"
+"@babel/plugin-transform-literals@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-literals@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/a27cc7d565ee57b5a2bf136fa889c5c2f5988545ae7b3b2c83a7afe5dd37dfac80dca88b1c633c65851ce6af7d2095c04c01228657ce0198f918e64b5ccd01fa
+  checksum: 10c0/961b64df79a673706d74cf473d1f4646f250b4f8813f9d7ef5d897e30acdacd1ca104584de2e88546289fce055d71bd7559cdb8ad4a2d5e7eea17f3c829faa97
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1"
+"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/98a2e0843ddfe51443c1bfcf08ba40ad8856fd4f8e397b392a5390a54f257c8c1b9a99d8ffc0fc7e8c55cce45e2cd9c2795a4450303f48f501bcbd662de44554
+  checksum: 10c0/0ae7f4098c63f442fd038de6034155bcf20214e7e490e92189decb2980932247b97cb069b11ac8bc471b53f71d6859e607969440d63ff400b8932ee3e05b4958
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-member-expression-literals@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.1"
+"@babel/plugin-transform-member-expression-literals@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/2af731d02aa4c757ef80c46df42264128cbe45bfd15e1812d1a595265b690a44ad036041c406a73411733540e1c4256d8174705ae6b8cfaf757fc175613993fd
+  checksum: 10c0/ec8908a409bd39d20f0428e35425c9e4c540bad252a0e33e08b84e3bea5088c785531197bdcf049afbdba841325962a93030b7be6da3586cb13d0ca0ebab89c9
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-amd@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-modules-amd@npm:7.24.1"
+"@babel/plugin-transform-modules-amd@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-modules-amd@npm:7.24.6"
   dependencies:
-    "@babel/helper-module-transforms": "npm:^7.23.3"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-module-transforms": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/71fd04e5e7026e6e52701214b1e9f7508ba371b757e5075fbb938a79235ed66a54ce65f89bb92b59159e9f03f01b392e6c4de6d255b948bec975a90cfd6809ef
+  checksum: 10c0/074d26c79f517b27a07fef00319aff9705df1e6b41a805db855fe719e0f246b9815d6525cf1c5f0890c7f830dd0b9776e9b2493bbc929a3c23c0dee15f10a514
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-commonjs@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.1"
+"@babel/plugin-transform-modules-commonjs@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.6"
   dependencies:
-    "@babel/helper-module-transforms": "npm:^7.23.3"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-simple-access": "npm:^7.22.5"
+    "@babel/helper-module-transforms": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-simple-access": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/efb3ea2047604a7eb44a9289311ebb29842fe6510ff8b66a77a60440448c65e1312a60dc48191ed98246bdbd163b5b6f3348a0669bcc0e3809e69c7c776b20fa
+  checksum: 10c0/4fc790136d066105fa773ffc7e249d88c6f0d0126984ede36fedd51ac2b622b46c08565bcdd1ab62ac10195eeedeaba0d26e7e4c676ed50906cbed16540a4e22
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-systemjs@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.1"
+"@babel/plugin-transform-modules-systemjs@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.6"
   dependencies:
-    "@babel/helper-hoist-variables": "npm:^7.22.5"
-    "@babel/helper-module-transforms": "npm:^7.23.3"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-validator-identifier": "npm:^7.22.20"
+    "@babel/helper-hoist-variables": "npm:^7.24.6"
+    "@babel/helper-module-transforms": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-validator-identifier": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/38145f8abe8a4ce2b41adabe5d65eb7bd54a139dc58e2885fec975eb5cf247bd938c1dd9f09145c46dbe57d25dd0ef7f00a020e5eb0cbe8195b2065d51e2d93d
+  checksum: 10c0/500962e3ac1bb1a9890e94f1967ec9e3aa3d41e22d4a9d1c739918707e4a8936710fd8d0ed4f3a8aad87260f7566b54566bead77977eb21e90124835cb6bcdca
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-modules-umd@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-modules-umd@npm:7.24.1"
+"@babel/plugin-transform-modules-umd@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-modules-umd@npm:7.24.6"
   dependencies:
-    "@babel/helper-module-transforms": "npm:^7.23.3"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-module-transforms": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/14c90c58562b54e17fe4a8ded3f627f9a993648f8378ef00cb2f6c34532032b83290d2ad54c7fff4f0c2cd49091bda780f8cc28926ec4b77a6c2141105a2e699
+  checksum: 10c0/73c6cecb4f45ca3f665e2c57b6d04d65358518522dfaffb9b6913c026aeb704281d015324d02bf07f2cb026de6bac9308c62e82979364bd39f3687f752652b0d
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5":
-  version: 7.22.5
-  resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5"
+"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.22.5"
-    "@babel/helper-plugin-utils": "npm:^7.22.5"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/b0b072bef303670b5a98307bc37d1ac326cb7ad40ea162b89a03c2ffc465451be7ef05be95cb81ed28bfeb29670dc98fe911f793a67bceab18b4cb4c81ef48f3
+  checksum: 10c0/92547309d81938488753f87b05a679a7557a1cec253756966044367c268b27311e51efad91724aa3e433cf61626e10bf1008e112998350c2013a87824c4cfe0b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-new-target@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-new-target@npm:7.24.1"
+"@babel/plugin-transform-new-target@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-new-target@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/c4cabe628163855f175a8799eb73d692b6f1dc347aae5022af0c253f80c92edb962e48ddccc98b691eff3d5d8e53c9a8f10894c33ba4cebc2e2f8f8fe554fb7a
+  checksum: 10c0/5e9b9edfbe46489f64013d2bbd422f29acdb8057ccc85e7c759f7cf1415fde6a82ac13a13f0f246defaba6e2f7f4d424178ba78fc02237bdbf7df6692fc1dca8
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1"
+"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.3, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/c8532951506fb031287280cebeef10aa714f8a7cea2b62a13c805f0e0af945ba77a7c87e4bbbe4c37fe973e0e5d5e649cfac7f0374f57efc54cdf9656362a392
+  checksum: 10c0/53ab5b16bbcf47e842a48f1f0774d238dae0222c3e1f31653307808048e249ed140cba12dfc280cbc9a577cb3bb5b2f50ca0e3e4ffe5260fcf8c3ca0b83fb21e
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-numeric-separator@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1"
+"@babel/plugin-transform-numeric-separator@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/15e2b83292e586fb4f5b4b4021d4821a806ca6de2b77d5ad6c4e07aa7afa23704e31b4d683dac041afc69ac51b2461b96e8c98e46311cc1faba54c73f235044f
+  checksum: 10c0/14863e735fc407e065e1574914864a956b8250a84cfb4704592656763c9455d67034c7745e53066725195d9ed042121f424c4aaee00027791640e2639386b701
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-object-rest-spread@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.5"
+"@babel/plugin-transform-object-rest-spread@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.6"
   dependencies:
-    "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
+    "@babel/helper-compilation-targets": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3"
-    "@babel/plugin-transform-parameters": "npm:^7.24.5"
+    "@babel/plugin-transform-parameters": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/91d7303af9b5744b8f569c1b8e45c9c9322ded05e7ee94e71b9ff2327f0d2c7b5aa87e040697a6baacc2dcb5c5e5e00913087c36f24c006bdaa4f958fd5bfd2d
+  checksum: 10c0/1a192b9756ebfa0bc69ad5e285d7d0284963b4b95738ca7721354297329d5c1ab4eb05ff5b198cbfffa3ec00e97a15a712aa7a5011d9407478796966aab54527
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-object-super@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-object-super@npm:7.24.1"
+"@babel/plugin-transform-object-super@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-object-super@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-replace-supers": "npm:^7.24.1"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-replace-supers": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/d30e6b9e59a707efd7ed524fc0a8deeea046011a6990250f2e9280516683138e2d13d9c52daf41d78407bdab0378aef7478326f2a15305b773d851cb6e106157
+  checksum: 10c0/2e48b9e0a1f3b04b439ede2d0c83bcc5324a81c8bab73c70f0c466cf48061a4ff469f283e2feb17b4cc2e20372c1362253604477ecd77e622192d5d7906aa062
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-optional-catch-binding@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1"
+"@babel/plugin-transform-optional-catch-binding@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/68408b9ef772d9aa5dccf166c86dc4d2505990ce93e03dcfc65c73fb95c2511248e009ba9ccf5b96405fb85de1c16ad8291016b1cc5689ee4becb1e3050e0ae7
+  checksum: 10c0/411db3177b1bffd2f9e5b33a6b62e70158380e67d91ff4725755312e8a0a2f2c3fd340c60005295a672115fb593222ab2d7076266aebced6ef087a5505b6f371
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-optional-chaining@npm:^7.24.1, @babel/plugin-transform-optional-chaining@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.5"
+"@babel/plugin-transform-optional-chaining@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6"
     "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/f4e9446ec69f58f40b7843ce7603cfc50332976e6e794d4ddbe6b24670cd50ebc7766c4e3cbaecf0fbb744e98cbfbb54146f4e966314b1d58511b8bbf3d2722b
+  checksum: 10c0/8ee5a500a2309444d4fb27979857598e9c91d804fe23217c51cc208b1bc6b9cd0650b355b1ebd625f180c5f1dc4cb89b5f313c982f7c89d90281a69b24a88ccb
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-parameters@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-parameters@npm:7.24.5"
+"@babel/plugin-transform-parameters@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-parameters@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/e08b8c46a24b1b21dde7783cb0aeb56ffe9ef6d6f1795649ce76273657158d3bfa5370c6594200ed7d371983b599c8e194b76108dffed9ab5746fe630ef2e8f5
+  checksum: 10c0/d9648924b9c0d35a243c0742c22838932a024205c61f4cc419857e5195edd893a33e6be4f2c8fbd89e925051c7cbe8968029ec2d3e7f2f098bfa682f4e2b9731
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-private-methods@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-private-methods@npm:7.24.1"
+"@babel/plugin-transform-private-methods@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-private-methods@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.1"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-class-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/d8e18587d2a8b71a795da5e8841b0e64f1525a99ad73ea8b9caa331bc271d69646e2e1e749fd634321f3df9d126070208ddac22a27ccf070566b2efb74fecd99
+  checksum: 10c0/55f93959b2e8aeda818db7cdc7dfdcd5076f5bdc8a819566818004a68969fb7297d617f9d108bf76ac232d6056d9f9d20f73ce10380baa43ff1755c5591aa803
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-private-property-in-object@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.5"
+"@babel/plugin-transform-private-property-in-object@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.5"
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/helper-create-class-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/de7182bfde298e56c08a5d7ee1156f83c9af8c856bbe2248438848846a4ce544e050666bd0482e16a6006195e8be4923abd14650bef51fa0edd7f82014c2efcd
+  checksum: 10c0/c9eb9597362b598a91536375a49ba80cdf13461e849680e040898b103f7998c4d33a7832da5afba9fa51e3473f79cf8605f9ace07a887e386b7801797021631b
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-property-literals@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-property-literals@npm:7.24.1"
+"@babel/plugin-transform-property-literals@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-property-literals@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/3bf3e01f7bb8215a8b6d0081b6f86fea23e3a4543b619e059a264ede028bc58cdfb0acb2c43271271915a74917effa547bc280ac636a9901fa9f2fb45623f87e
+  checksum: 10c0/d1195d93406b6c400cdbc9ac57a2b8b58c72cc6480cc03656abfc243be0e2a48133cbb96559c2db95b1c78803daeb538277821540fe19e2a9105905e727ef618
   languageName: node
   linkType: hard
 
@@ -1127,243 +1126,243 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-display-name@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-react-display-name@npm:7.24.1"
+"@babel/plugin-transform-react-display-name@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-react-display-name@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/adf1a3cb0df8134533a558a9072a67e34127fd489dfe431c3348a86dd41f3e74861d5d5134bbb68f61a9cdb3f7e79b2acea1346be94ce4d3328a64e5a9e09be1
+  checksum: 10c0/e929d054035fa3b7432bd2b3e5cf280ffd8cf60d1ce80c863c5e0b03ad01bf6ae2546575d2da31cca2ab83d9399ac01a351f20e21af5075d9c0d4c893e4a36bd
   languageName: node
   linkType: hard
 
 "@babel/plugin-transform-react-inline-elements@npm:^7.21.0":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-react-inline-elements@npm:7.24.1"
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-react-inline-elements@npm:7.24.6"
   dependencies:
-    "@babel/helper-builder-react-jsx": "npm:^7.22.10"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-builder-react-jsx": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/83fc6afaebbe82a5b14936f00b6d1ffce1a3d908ac749d5daa43f724d32c98b50807ffc3ce2492c1aa49870189507b751993a4a079b9c3226c9b8aab783d08b6
+  checksum: 10c0/b29f32a0c345db24f32569cf7a5626e37dd31c21bb764148757e91f609d41e2d09031ff1ad86e5672d578cf16f513b197ef3ebc8f0650d8314890a34ca68f02c
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-jsx-development@npm:^7.22.5":
-  version: 7.22.5
-  resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5"
+"@babel/plugin-transform-react-jsx-development@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.6"
   dependencies:
-    "@babel/plugin-transform-react-jsx": "npm:^7.22.5"
+    "@babel/plugin-transform-react-jsx": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/4d2e9e68383238feb873f6111df972df4a2ebf6256d6f787a8772241867efa975b3980f7d75ab7d750e7eaad4bd454e8cc6e106301fd7572dd389e553f5f69d2
+  checksum: 10c0/f899ffa65c7f459a682246a346af0e4132929ffe928cb0d02ae08aac1cf3fb01b2f6e944ef1eaca78f14e94eff935e2bf96aad878030c25ff6de2070a8b72448
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-jsx@npm:^7.22.5, @babel/plugin-transform-react-jsx@npm:^7.23.4":
-  version: 7.23.4
-  resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4"
+"@babel/plugin-transform-react-jsx@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-react-jsx@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-module-imports": "npm:^7.22.15"
-    "@babel/helper-plugin-utils": "npm:^7.22.5"
-    "@babel/plugin-syntax-jsx": "npm:^7.23.3"
-    "@babel/types": "npm:^7.23.4"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/helper-module-imports": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/plugin-syntax-jsx": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/8851b3adc515cd91bdb06ff3a23a0f81f0069cfef79dfb3fa744da4b7a82e3555ccb6324c4fa71ecf22508db13b9ff6a0ed96675f95fc87903b9fc6afb699580
+  checksum: 10c0/6144f56a76529a82077475583a17be8f0b0b461c83673e650f3894e09dbe2bcdfdbfff089eca2e5e239e119f72cd9562749a9af7eb3f2e3266a730da31cd19f2
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-react-pure-annotations@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.1"
+"@babel/plugin-transform-react-pure-annotations@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/9eb3056fcaadd63d404fd5652b2a3f693bc4758ba753fee5b5c580c7a64346eeeb94e5a4f77a99c76f3cf06d1f1ad6c227647cd0b1219efe3d00cafa5a6e7b2a
+  checksum: 10c0/7f83c5a3a275dbb9a291dee4642a3a0f2249265346d8d3cc9324fc9ee063c3e35c3853b52752ece603f0ac92b405deb38c4b5307a99a74d3e1c9c32a2cefa465
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-regenerator@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-regenerator@npm:7.24.1"
+"@babel/plugin-transform-regenerator@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-regenerator@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     regenerator-transform: "npm:^0.15.2"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/0a333585d7c0b38d31cc549d0f3cf7c396d1d50b6588a307dc58325505ddd4f5446188bc536c4779431b396251801b3f32d6d8e87db8274bc84e8c41950737f7
+  checksum: 10c0/d17eaa97514d583866182420024b8c22da2c6ca822bdbf16fe7564121564c1844935592dc3315c73d1f78f7c908a4338b1d783618811e694c9bb6d5f9233e58d
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-reserved-words@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-reserved-words@npm:7.24.1"
+"@babel/plugin-transform-reserved-words@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-reserved-words@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/936d6e73cafb2cbb495f6817c6f8463288dbc9ab3c44684b931ebc1ece24f0d55dfabc1a75ba1de5b48843d0fef448dcfdbecb8485e4014f8f41d0d1440c536f
+  checksum: 10c0/5d2d4c579bd90c60fc6468a1285b3384e7b650b47d41a937a1590d4aecfc28bd945e82704c6e71cc91aa016b7e78c5594290c1c386edf11ec98e09e36235c5ae
   languageName: node
   linkType: hard
 
 "@babel/plugin-transform-runtime@npm:^7.22.4":
-  version: 7.24.3
-  resolution: "@babel/plugin-transform-runtime@npm:7.24.3"
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-runtime@npm:7.24.6"
   dependencies:
-    "@babel/helper-module-imports": "npm:^7.24.3"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-module-imports": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
     babel-plugin-polyfill-corejs2: "npm:^0.4.10"
     babel-plugin-polyfill-corejs3: "npm:^0.10.1"
     babel-plugin-polyfill-regenerator: "npm:^0.6.1"
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/ee01967bf405d84bd95ca4089166a18fb23fe9851a6da53dcf712a7f8ba003319996f21f320d568ec76126e18adfaee978206ccda86eef7652d47cc9a052e75e
+  checksum: 10c0/89c43c1236506ecbfc547b12936283ca41e611430c2d2e6d12bf1cbdb0d80760cdae481951f486946733e1c9ae064cb05f4bc779c65b3288d40963b0c4a20c5c
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-shorthand-properties@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.1"
+"@babel/plugin-transform-shorthand-properties@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/8273347621183aada3cf1f3019d8d5f29467ba13a75b72cb405bc7f23b7e05fd85f4edb1e4d9f0103153dddb61826a42dc24d466480d707f8932c1923a4c25fa
+  checksum: 10c0/4141b5da1d0d20d66ca0affaef8dfc45ed5e954bfa9003eb8aa779842599de443b37c2b265da27693f304c35ab68a682b44098e9eea0d39f8f94072ab616657f
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-spread@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-spread@npm:7.24.1"
+"@babel/plugin-transform-spread@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-spread@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/50a0302e344546d57e5c9f4dea575f88e084352eeac4e9a3e238c41739eef2df1daf4a7ebbb3ccb7acd3447f6a5ce9938405f98bf5f5583deceb8257f5a673c9
+  checksum: 10c0/6d12da05311690c4a73d775688ba6931b441e96e512377a166a60184292edeac0b17f5154a49e2f1d262a3f80b96e064bc9c88c63b2a6125f0a2132eff9ed585
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-sticky-regex@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.1"
+"@babel/plugin-transform-sticky-regex@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/786fe2ae11ef9046b9fa95677935abe495031eebf1274ad03f2054a20adea7b9dbd00336ac0b143f7924bc562e5e09793f6e8613607674b97e067d4838ccc4a0
+  checksum: 10c0/2a65f57554f51d3b9cd035513a610f47e46b26dba112b3b9fb42d1c1f2ae153fce8f76294b4721d099817814f57895c656f5b7dccd5df683277da6522c817ee9
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-template-literals@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-template-literals@npm:7.24.1"
+"@babel/plugin-transform-template-literals@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-template-literals@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/f73bcda5488eb81c6e7a876498d9e6b72be32fca5a4d9db9053491a2d1300cd27b889b463fd2558f3cd5826a85ed00f61d81b234aa55cb5a0abf1b6fa1bd5026
+  checksum: 10c0/fcde48e9c3ecd7f5f37ceb6908f1edd537d3115fc2f27d187d58fd83b2a13637a1bb3d24589d841529ed081405b951bf1c5d194ea81eff6ad2d88204d153010d
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-typeof-symbol@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.5"
+"@babel/plugin-transform-typeof-symbol@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/5f0b5e33a86b84d89673829ffa2b5f175e102d3d0f45917cda121bc2b3650e1e5bb7a653f8cc1059c5b3a7b2e91e1aafd6623028b96ae752715cc5c2171c96e5
+  checksum: 10c0/a24b3a3c7b87c6496ee13d2438effd4645868f054397357ec3cbe92a2f0df4152ac7fd7228cb956576c1b772c0675b065d6ad5f5053c382e97dd022015e9a028
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-typescript@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-typescript@npm:7.24.1"
+"@babel/plugin-transform-typescript@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-typescript@npm:7.24.6"
   dependencies:
-    "@babel/helper-annotate-as-pure": "npm:^7.22.5"
-    "@babel/helper-create-class-features-plugin": "npm:^7.24.1"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/plugin-syntax-typescript": "npm:^7.24.1"
+    "@babel/helper-annotate-as-pure": "npm:^7.24.6"
+    "@babel/helper-create-class-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/plugin-syntax-typescript": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/9abce423ed2d3cb9398b09e3ed9efea661e92bd32e919f5c7942ac4bad4c5fd23a1d575bb7444d8c92261b68fb626552e0d9eea960372b6b6f54c2c9699a2649
+  checksum: 10c0/46b054e4d4253187403e392ef30f4dd624d8486a1992703f5ff1b415d4e8d00f474e35fb77bc7a3a16a17330873cadcd5af4a8493c61b16da2dde212b2788ccd
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-escapes@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.1"
+"@babel/plugin-transform-unicode-escapes@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/67a72a1ed99639de6a93aead35b1993cb3f0eb178a8991fcef48732c38c9f0279c85bbe1e2e2477b85afea873e738ff0955a35057635ce67bc149038e2d8a28e
+  checksum: 10c0/0e4038c589b7a63a2469466a25b78aad4ecb7267732e3c953c3055f9a77c7bee859a71983a08b025179f1b094964f2ebbfca1b6c33de4ead90a0b5ef06ddb47e
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-property-regex@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1"
+"@babel/plugin-transform-unicode-property-regex@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/d9d9752df7d51bf9357c0bf3762fe16b8c841fca9ecf4409a16f15ccc34be06e8e71abfaee1251b7d451227e70e6b873b36f86b090efdb20f6f7de5fdb6c7a05
+  checksum: 10c0/bca99e00de91d0460dfcb25f285f3606248acc905193c05587e2862c54ddb790c5d8cb45e80927290390cffbcba7620f8af3e74c5301ff0c1c59ce7d47c5629f
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-regex@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.1"
+"@babel/plugin-transform-unicode-regex@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/6046ab38e5d14ed97dbb921bd79ac1d7ad9d3286da44a48930e980b16896db2df21e093563ec3c916a630dc346639bf47c5924a33902a06fe3bbb5cdc7ef5f2f
+  checksum: 10c0/ab6e253cfc38c7e8a2844d7ad46f85fdcbe33610b7f92f71045cf0b040438a08f1f1717ab4b84c480537f54e5478db8b404a4ccc2ff846b4e3ed33d373e3b47a
   languageName: node
   linkType: hard
 
-"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1":
-  version: 7.24.1
-  resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1"
+"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.6"
   dependencies:
-    "@babel/helper-create-regexp-features-plugin": "npm:^7.22.15"
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
+    "@babel/helper-create-regexp-features-plugin": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0
-  checksum: 10c0/b6c1f6b90afeeddf97e5713f72575787fcb7179be7b4c961869bfbc66915f66540dc49da93e4369da15596bd44b896d1eb8a50f5e1fd907abd7a1a625901006b
+  checksum: 10c0/a52e84f85519fed330e88f7a17611064d2b5f1d0fe2823f8113ed312828e69787888bd023f404e8d35d0bb96461e42e19cdc4f0a44d35959bc86c219a3062237
   languageName: node
   linkType: hard
 
 "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4":
-  version: 7.24.5
-  resolution: "@babel/preset-env@npm:7.24.5"
+  version: 7.24.6
+  resolution: "@babel/preset-env@npm:7.24.6"
   dependencies:
-    "@babel/compat-data": "npm:^7.24.4"
-    "@babel/helper-compilation-targets": "npm:^7.23.6"
-    "@babel/helper-plugin-utils": "npm:^7.24.5"
-    "@babel/helper-validator-option": "npm:^7.23.5"
-    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.5"
-    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.1"
-    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.1"
-    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.1"
+    "@babel/compat-data": "npm:^7.24.6"
+    "@babel/helper-compilation-targets": "npm:^7.24.6"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-validator-option": "npm:^7.24.6"
+    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.6"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.6"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.6"
+    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.6"
     "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2"
     "@babel/plugin-syntax-async-generators": "npm:^7.8.4"
     "@babel/plugin-syntax-class-properties": "npm:^7.12.13"
     "@babel/plugin-syntax-class-static-block": "npm:^7.14.5"
     "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3"
     "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3"
-    "@babel/plugin-syntax-import-assertions": "npm:^7.24.1"
-    "@babel/plugin-syntax-import-attributes": "npm:^7.24.1"
+    "@babel/plugin-syntax-import-assertions": "npm:^7.24.6"
+    "@babel/plugin-syntax-import-attributes": "npm:^7.24.6"
     "@babel/plugin-syntax-import-meta": "npm:^7.10.4"
     "@babel/plugin-syntax-json-strings": "npm:^7.8.3"
     "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4"
@@ -1375,54 +1374,54 @@ __metadata:
     "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5"
     "@babel/plugin-syntax-top-level-await": "npm:^7.14.5"
     "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6"
-    "@babel/plugin-transform-arrow-functions": "npm:^7.24.1"
-    "@babel/plugin-transform-async-generator-functions": "npm:^7.24.3"
-    "@babel/plugin-transform-async-to-generator": "npm:^7.24.1"
-    "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.1"
-    "@babel/plugin-transform-block-scoping": "npm:^7.24.5"
-    "@babel/plugin-transform-class-properties": "npm:^7.24.1"
-    "@babel/plugin-transform-class-static-block": "npm:^7.24.4"
-    "@babel/plugin-transform-classes": "npm:^7.24.5"
-    "@babel/plugin-transform-computed-properties": "npm:^7.24.1"
-    "@babel/plugin-transform-destructuring": "npm:^7.24.5"
-    "@babel/plugin-transform-dotall-regex": "npm:^7.24.1"
-    "@babel/plugin-transform-duplicate-keys": "npm:^7.24.1"
-    "@babel/plugin-transform-dynamic-import": "npm:^7.24.1"
-    "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.1"
-    "@babel/plugin-transform-export-namespace-from": "npm:^7.24.1"
-    "@babel/plugin-transform-for-of": "npm:^7.24.1"
-    "@babel/plugin-transform-function-name": "npm:^7.24.1"
-    "@babel/plugin-transform-json-strings": "npm:^7.24.1"
-    "@babel/plugin-transform-literals": "npm:^7.24.1"
-    "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.1"
-    "@babel/plugin-transform-member-expression-literals": "npm:^7.24.1"
-    "@babel/plugin-transform-modules-amd": "npm:^7.24.1"
-    "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1"
-    "@babel/plugin-transform-modules-systemjs": "npm:^7.24.1"
-    "@babel/plugin-transform-modules-umd": "npm:^7.24.1"
-    "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5"
-    "@babel/plugin-transform-new-target": "npm:^7.24.1"
-    "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.1"
-    "@babel/plugin-transform-numeric-separator": "npm:^7.24.1"
-    "@babel/plugin-transform-object-rest-spread": "npm:^7.24.5"
-    "@babel/plugin-transform-object-super": "npm:^7.24.1"
-    "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.1"
-    "@babel/plugin-transform-optional-chaining": "npm:^7.24.5"
-    "@babel/plugin-transform-parameters": "npm:^7.24.5"
-    "@babel/plugin-transform-private-methods": "npm:^7.24.1"
-    "@babel/plugin-transform-private-property-in-object": "npm:^7.24.5"
-    "@babel/plugin-transform-property-literals": "npm:^7.24.1"
-    "@babel/plugin-transform-regenerator": "npm:^7.24.1"
-    "@babel/plugin-transform-reserved-words": "npm:^7.24.1"
-    "@babel/plugin-transform-shorthand-properties": "npm:^7.24.1"
-    "@babel/plugin-transform-spread": "npm:^7.24.1"
-    "@babel/plugin-transform-sticky-regex": "npm:^7.24.1"
-    "@babel/plugin-transform-template-literals": "npm:^7.24.1"
-    "@babel/plugin-transform-typeof-symbol": "npm:^7.24.5"
-    "@babel/plugin-transform-unicode-escapes": "npm:^7.24.1"
-    "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.1"
-    "@babel/plugin-transform-unicode-regex": "npm:^7.24.1"
-    "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.1"
+    "@babel/plugin-transform-arrow-functions": "npm:^7.24.6"
+    "@babel/plugin-transform-async-generator-functions": "npm:^7.24.6"
+    "@babel/plugin-transform-async-to-generator": "npm:^7.24.6"
+    "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.6"
+    "@babel/plugin-transform-block-scoping": "npm:^7.24.6"
+    "@babel/plugin-transform-class-properties": "npm:^7.24.6"
+    "@babel/plugin-transform-class-static-block": "npm:^7.24.6"
+    "@babel/plugin-transform-classes": "npm:^7.24.6"
+    "@babel/plugin-transform-computed-properties": "npm:^7.24.6"
+    "@babel/plugin-transform-destructuring": "npm:^7.24.6"
+    "@babel/plugin-transform-dotall-regex": "npm:^7.24.6"
+    "@babel/plugin-transform-duplicate-keys": "npm:^7.24.6"
+    "@babel/plugin-transform-dynamic-import": "npm:^7.24.6"
+    "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.6"
+    "@babel/plugin-transform-export-namespace-from": "npm:^7.24.6"
+    "@babel/plugin-transform-for-of": "npm:^7.24.6"
+    "@babel/plugin-transform-function-name": "npm:^7.24.6"
+    "@babel/plugin-transform-json-strings": "npm:^7.24.6"
+    "@babel/plugin-transform-literals": "npm:^7.24.6"
+    "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.6"
+    "@babel/plugin-transform-member-expression-literals": "npm:^7.24.6"
+    "@babel/plugin-transform-modules-amd": "npm:^7.24.6"
+    "@babel/plugin-transform-modules-commonjs": "npm:^7.24.6"
+    "@babel/plugin-transform-modules-systemjs": "npm:^7.24.6"
+    "@babel/plugin-transform-modules-umd": "npm:^7.24.6"
+    "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.6"
+    "@babel/plugin-transform-new-target": "npm:^7.24.6"
+    "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.6"
+    "@babel/plugin-transform-numeric-separator": "npm:^7.24.6"
+    "@babel/plugin-transform-object-rest-spread": "npm:^7.24.6"
+    "@babel/plugin-transform-object-super": "npm:^7.24.6"
+    "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.6"
+    "@babel/plugin-transform-optional-chaining": "npm:^7.24.6"
+    "@babel/plugin-transform-parameters": "npm:^7.24.6"
+    "@babel/plugin-transform-private-methods": "npm:^7.24.6"
+    "@babel/plugin-transform-private-property-in-object": "npm:^7.24.6"
+    "@babel/plugin-transform-property-literals": "npm:^7.24.6"
+    "@babel/plugin-transform-regenerator": "npm:^7.24.6"
+    "@babel/plugin-transform-reserved-words": "npm:^7.24.6"
+    "@babel/plugin-transform-shorthand-properties": "npm:^7.24.6"
+    "@babel/plugin-transform-spread": "npm:^7.24.6"
+    "@babel/plugin-transform-sticky-regex": "npm:^7.24.6"
+    "@babel/plugin-transform-template-literals": "npm:^7.24.6"
+    "@babel/plugin-transform-typeof-symbol": "npm:^7.24.6"
+    "@babel/plugin-transform-unicode-escapes": "npm:^7.24.6"
+    "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.6"
+    "@babel/plugin-transform-unicode-regex": "npm:^7.24.6"
+    "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.6"
     "@babel/preset-modules": "npm:0.1.6-no-external-plugins"
     babel-plugin-polyfill-corejs2: "npm:^0.4.10"
     babel-plugin-polyfill-corejs3: "npm:^0.10.4"
@@ -1431,7 +1430,7 @@ __metadata:
     semver: "npm:^6.3.1"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/2cc0edae09205d6409a75d02e53aaa1c590e89adbb7b389019c7b75e4c47b6b63eeb1a816df5c42b672ce410747e7ddc23b6747e8e41a6c95d6fa00c665509e2
+  checksum: 10c0/d837d294197803d550e48d9458a356853a54a0528e7cdc51c2b8a5d8dfe41c6fbc597b4fc67464615a7385198a3db2e839da15cca7b9502fedf27170fc6ef673
   languageName: node
   linkType: hard
 
@@ -1449,33 +1448,33 @@ __metadata:
   linkType: hard
 
 "@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.22.3":
-  version: 7.24.1
-  resolution: "@babel/preset-react@npm:7.24.1"
+  version: 7.24.6
+  resolution: "@babel/preset-react@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-validator-option": "npm:^7.23.5"
-    "@babel/plugin-transform-react-display-name": "npm:^7.24.1"
-    "@babel/plugin-transform-react-jsx": "npm:^7.23.4"
-    "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5"
-    "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.1"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-validator-option": "npm:^7.24.6"
+    "@babel/plugin-transform-react-display-name": "npm:^7.24.6"
+    "@babel/plugin-transform-react-jsx": "npm:^7.24.6"
+    "@babel/plugin-transform-react-jsx-development": "npm:^7.24.6"
+    "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/a842abc5a024ed68a0ce4c1244607d40165cb6f8cf1817ebda282e470f20302d81c6a61cb41c1a31aa6c4e99ce93df4dd9e998a8ded1417c25d7480f0e14103a
+  checksum: 10c0/edc470b86dfcfdedf53feca3f2266bd7f836a300806938a422f4120d39bbdea6a780b9b0a9ac0333e0bb1b8e554699a74cafd135b2a75b02b77ef1b21f7c7f62
   languageName: node
   linkType: hard
 
 "@babel/preset-typescript@npm:^7.21.5":
-  version: 7.24.1
-  resolution: "@babel/preset-typescript@npm:7.24.1"
+  version: 7.24.6
+  resolution: "@babel/preset-typescript@npm:7.24.6"
   dependencies:
-    "@babel/helper-plugin-utils": "npm:^7.24.0"
-    "@babel/helper-validator-option": "npm:^7.23.5"
-    "@babel/plugin-syntax-jsx": "npm:^7.24.1"
-    "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1"
-    "@babel/plugin-transform-typescript": "npm:^7.24.1"
+    "@babel/helper-plugin-utils": "npm:^7.24.6"
+    "@babel/helper-validator-option": "npm:^7.24.6"
+    "@babel/plugin-syntax-jsx": "npm:^7.24.6"
+    "@babel/plugin-transform-modules-commonjs": "npm:^7.24.6"
+    "@babel/plugin-transform-typescript": "npm:^7.24.6"
   peerDependencies:
     "@babel/core": ^7.0.0-0
-  checksum: 10c0/0033dc6fbc898ed0d8017c83a2dd5e095c82909e2f83e48cf9f305e3e9287148758c179ad90f27912cf98ca68bfec3643c57c70c0ca34d3a6c50dc8243aef406
+  checksum: 10c0/bfcef91ed80d67301301e17a799814457b57bfd0d85d9897dce6df6ed0b0af155c0f5b2af7a1a122a3f36faaaa1de87ccf9954ce06d2f440898ffdfaf18aab86
   languageName: node
   linkType: hard
 
@@ -1496,51 +1495,51 @@ __metadata:
   linkType: hard
 
 "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
-  version: 7.24.5
-  resolution: "@babel/runtime@npm:7.24.5"
+  version: 7.24.6
+  resolution: "@babel/runtime@npm:7.24.6"
   dependencies:
     regenerator-runtime: "npm:^0.14.0"
-  checksum: 10c0/05730e43e8ba6550eae9fd4fb5e7d9d3cb91140379425abcb2a1ff9cebad518a280d82c4c4b0f57ada26a863106ac54a748d90c775790c0e2cd0ddd85ccdf346
+  checksum: 10c0/224ad205de33ea28979baaec89eea4c4d4e9482000dd87d15b97859365511cdd4d06517712504024f5d33a5fb9412f9b91c96f1d923974adf9359e1575cde049
   languageName: node
   linkType: hard
 
-"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3":
-  version: 7.24.0
-  resolution: "@babel/template@npm:7.24.0"
+"@babel/template@npm:^7.24.6, @babel/template@npm:^7.3.3":
+  version: 7.24.6
+  resolution: "@babel/template@npm:7.24.6"
   dependencies:
-    "@babel/code-frame": "npm:^7.23.5"
-    "@babel/parser": "npm:^7.24.0"
-    "@babel/types": "npm:^7.24.0"
-  checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54
+    "@babel/code-frame": "npm:^7.24.6"
+    "@babel/parser": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
+  checksum: 10c0/a4d5805770de908b445f7cdcebfcb6eaa07b1ec9c7b78fd3f375a911b1522c249bddae6b96bc4aac24247cc603e3e6cffcf2fe50b4c929dfeb22de289b517525
   languageName: node
   linkType: hard
 
-"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.5":
-  version: 7.24.5
-  resolution: "@babel/traverse@npm:7.24.5"
+"@babel/traverse@npm:7, @babel/traverse@npm:^7.24.6":
+  version: 7.24.6
+  resolution: "@babel/traverse@npm:7.24.6"
   dependencies:
-    "@babel/code-frame": "npm:^7.24.2"
-    "@babel/generator": "npm:^7.24.5"
-    "@babel/helper-environment-visitor": "npm:^7.22.20"
-    "@babel/helper-function-name": "npm:^7.23.0"
-    "@babel/helper-hoist-variables": "npm:^7.22.5"
-    "@babel/helper-split-export-declaration": "npm:^7.24.5"
-    "@babel/parser": "npm:^7.24.5"
-    "@babel/types": "npm:^7.24.5"
+    "@babel/code-frame": "npm:^7.24.6"
+    "@babel/generator": "npm:^7.24.6"
+    "@babel/helper-environment-visitor": "npm:^7.24.6"
+    "@babel/helper-function-name": "npm:^7.24.6"
+    "@babel/helper-hoist-variables": "npm:^7.24.6"
+    "@babel/helper-split-export-declaration": "npm:^7.24.6"
+    "@babel/parser": "npm:^7.24.6"
+    "@babel/types": "npm:^7.24.6"
     debug: "npm:^4.3.1"
     globals: "npm:^11.1.0"
-  checksum: 10c0/3f22534bc2b2ed9208e55ef48af3b32939032b23cb9dc4037447cb108640df70bbb0b9fea86e9c58648949fdc2cb14e89aa79ffa3c62a5dd43459a52fe8c01d1
+  checksum: 10c0/39027d5fc7a241c6b71bb5872c2bdcec53743cd7ef3c151bbe6fd7cf874d15f4bc09e5d7e19e2f534b0eb2c115f5368553885fa4253aa1bc9441c6e5bf9efdaf
   languageName: node
   linkType: hard
 
-"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
-  version: 7.24.5
-  resolution: "@babel/types@npm:7.24.5"
+"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
+  version: 7.24.6
+  resolution: "@babel/types@npm:7.24.6"
   dependencies:
-    "@babel/helper-string-parser": "npm:^7.24.1"
-    "@babel/helper-validator-identifier": "npm:^7.24.5"
+    "@babel/helper-string-parser": "npm:^7.24.6"
+    "@babel/helper-validator-identifier": "npm:^7.24.6"
     to-fast-properties: "npm:^2.0.0"
-  checksum: 10c0/e1284eb046c5e0451b80220d1200e2327e0a8544a2fe45bb62c952e5fdef7099c603d2336b17b6eac3cc046b7a69bfbce67fe56e1c0ea48cd37c65cb88638f2a
+  checksum: 10c0/1d94d92d97ef49030ad7f9e14cfccfeb70b1706dabcaa69037e659ec9d2c3178fb005d2088cce40d88dfc1306153d9157fe038a79ea2be92e5e6b99a59ef80cc
   languageName: node
   linkType: hard
 

From a5c808e9b033eeb605dcf6b36dc14ddb1127db7b Mon Sep 17 00:00:00 2001
From: Julius Rajala <juliusrajala@gmail.com>
Date: Fri, 24 May 2024 19:39:03 +0300
Subject: [PATCH 191/215] Fix issue with post-create scripts failing on local
 docker (#28402)

---
 .devcontainer/docker-compose.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 97331f74e..5d9917b39 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -2,6 +2,7 @@ version: '3'
 
 services:
   app:
+    working_dir: /workspaces/mastodon/
     build:
       context: .
       dockerfile: Dockerfile

From 6a75e1c8c82a1625867ea69be3d0c55697448f4e Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Mon, 27 May 2024 11:00:40 +0200
Subject: [PATCH 192/215] Fix `createDataLoadingThunk` to allow actions without
 arguments (#30439)

---
 .../mastodon/store/typed_functions.ts         | 21 +++++++------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts
index 0392f373c..dae37e622 100644
--- a/app/javascript/mastodon/store/typed_functions.ts
+++ b/app/javascript/mastodon/store/typed_functions.ts
@@ -89,21 +89,17 @@ type OnData<LoadDataResult, ReturnedData> = (
   },
 ) => ReturnedData | DiscardLoadData | Promise<ReturnedData | DiscardLoadData>;
 
+type ArgsType = Record<string, unknown> | undefined;
+
 // Overload when there is no `onData` method, the payload is the `onData` result
-export function createDataLoadingThunk<
-  LoadDataResult,
-  Args extends Record<string, unknown>,
->(
+export function createDataLoadingThunk<LoadDataResult, Args extends ArgsType>(
   name: string,
   loadData: (args: Args) => Promise<LoadDataResult>,
   thunkOptions?: AppThunkOptions,
 ): ReturnType<typeof createThunk<Args, LoadDataResult>>;
 
 // Overload when the `onData` method returns discardLoadDataInPayload, then the payload is empty
-export function createDataLoadingThunk<
-  LoadDataResult,
-  Args extends Record<string, unknown>,
->(
+export function createDataLoadingThunk<LoadDataResult, Args extends ArgsType>(
   name: string,
   loadData: (args: Args) => Promise<LoadDataResult>,
   onDataOrThunkOptions?:
@@ -113,10 +109,7 @@ export function createDataLoadingThunk<
 ): ReturnType<typeof createThunk<Args, void>>;
 
 // Overload when the `onData` method returns nothing, then the mayload is the `onData` result
-export function createDataLoadingThunk<
-  LoadDataResult,
-  Args extends Record<string, unknown>,
->(
+export function createDataLoadingThunk<LoadDataResult, Args extends ArgsType>(
   name: string,
   loadData: (args: Args) => Promise<LoadDataResult>,
   onDataOrThunkOptions?: AppThunkOptions | OnData<LoadDataResult, void>,
@@ -126,7 +119,7 @@ export function createDataLoadingThunk<
 // Overload when there is an `onData` method returning something
 export function createDataLoadingThunk<
   LoadDataResult,
-  Args extends Record<string, unknown>,
+  Args extends ArgsType,
   Returned,
 >(
   name: string,
@@ -162,7 +155,7 @@ export function createDataLoadingThunk<
  */
 export function createDataLoadingThunk<
   LoadDataResult,
-  Args extends Record<string, unknown>,
+  Args extends ArgsType,
   Returned,
 >(
   name: string,

From 404e203d41bc47e78a2265368b6caaad084dbb16 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 27 May 2024 11:19:44 +0200
Subject: [PATCH 193/215] chore(deps): update dependency simple_form to v5.3.1
 (#30416)

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 5feab4d09..934d41334 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -425,7 +425,7 @@ GEM
     mime-types-data (3.2024.0507)
     mini_mime (1.1.5)
     mini_portile2 (2.8.6)
-    minitest (5.23.0)
+    minitest (5.23.1)
     msgpack (1.7.2)
     multi_json (1.15.0)
     multipart-post (2.4.0)
@@ -799,7 +799,7 @@ GEM
       thor (>= 0.20, < 3.0)
     simple-navigation (4.4.0)
       activesupport (>= 2.3.2)
-    simple_form (5.3.0)
+    simple_form (5.3.1)
       actionpack (>= 5.2)
       activemodel (>= 5.2)
     simplecov (0.22.0)

From 564ebfefcf1deb79b38422dfadbc9d5023eca4b6 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 27 May 2024 05:20:28 -0400
Subject: [PATCH 194/215] Remove hard reference from status pin validator spec
 (#30432)

---
 spec/validators/status_pin_validator_spec.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/spec/validators/status_pin_validator_spec.rb b/spec/validators/status_pin_validator_spec.rb
index d5109f990..e50a952db 100644
--- a/spec/validators/status_pin_validator_spec.rb
+++ b/spec/validators/status_pin_validator_spec.rb
@@ -45,8 +45,8 @@ RSpec.describe StatusPinValidator do
       end
     end
 
-    context 'when pin.account.status_pins.count > 4 && pin.account.local?' do
-      let(:count) { 5 }
+    context 'when pin account is local and has too many pins' do
+      let(:count) { described_class::PIN_LIMIT + 1 }
       let(:local) { true }
 
       it 'calls errors.add' do

From 3750e8050cb4a5707e76dfb8f49687cc0984f67f Mon Sep 17 00:00:00 2001
From: Renaud Chaput <renchap@gmail.com>
Date: Mon, 27 May 2024 11:24:59 +0200
Subject: [PATCH 195/215] Enable stricter Typescript options (#30435)

---
 app/javascript/entrypoints/public.tsx                | 12 ++++++------
 .../entrypoints/remote_interaction_helper.ts         |  9 ++++++++-
 .../mastodon/components/animated_number.tsx          |  5 +++--
 app/javascript/mastodon/components/hashtag_bar.tsx   |  7 +++++--
 app/javascript/mastodon/components/short_number.tsx  |  2 +-
 .../mastodon/features/emoji/emoji_mart_data_light.ts |  5 ++++-
 .../features/emoji/emoji_unicode_mapping_light.ts    |  5 ++++-
 app/javascript/mastodon/store/middlewares/sounds.ts  |  5 +++--
 tsconfig.json                                        |  2 ++
 9 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx
index d45927226..40a9b7c0c 100644
--- a/app/javascript/entrypoints/public.tsx
+++ b/app/javascript/entrypoints/public.tsx
@@ -65,7 +65,7 @@ window.addEventListener('message', (e) => {
       {
         type: 'setHeight',
         id: data.id,
-        height: document.getElementsByTagName('html')[0].scrollHeight,
+        height: document.getElementsByTagName('html')[0]?.scrollHeight,
       },
       '*',
     );
@@ -135,7 +135,7 @@ function loaded() {
     );
   };
   const todayFormat = new IntlMessageFormat(
-    localeData['relative_format.today'] || 'Today at {time}',
+    localeData['relative_format.today'] ?? 'Today at {time}',
     locale,
   );
 
@@ -288,13 +288,13 @@ function loaded() {
       if (statusEl.dataset.spoiler === 'expanded') {
         statusEl.dataset.spoiler = 'folded';
         this.textContent = new IntlMessageFormat(
-          localeData['status.show_more'] || 'Show more',
+          localeData['status.show_more'] ?? 'Show more',
           locale,
         ).format() as string;
       } else {
         statusEl.dataset.spoiler = 'expanded';
         this.textContent = new IntlMessageFormat(
-          localeData['status.show_less'] || 'Show less',
+          localeData['status.show_less'] ?? 'Show less',
           locale,
         ).format() as string;
       }
@@ -316,8 +316,8 @@ function loaded() {
 
       const message =
         statusEl.dataset.spoiler === 'expanded'
-          ? localeData['status.show_less'] || 'Show less'
-          : localeData['status.show_more'] || 'Show more';
+          ? localeData['status.show_less'] ?? 'Show less'
+          : localeData['status.show_more'] ?? 'Show more';
       spoilerLink.textContent = new IntlMessageFormat(
         message,
         locale,
diff --git a/app/javascript/entrypoints/remote_interaction_helper.ts b/app/javascript/entrypoints/remote_interaction_helper.ts
index d5834c6c3..419571c89 100644
--- a/app/javascript/entrypoints/remote_interaction_helper.ts
+++ b/app/javascript/entrypoints/remote_interaction_helper.ts
@@ -67,7 +67,9 @@ const fetchInteractionURLFailure = () => {
   );
 };
 
-const isValidDomain = (value: string) => {
+const isValidDomain = (value: unknown) => {
+  if (typeof value !== 'string') return false;
+
   const url = new URL('https:///path');
   url.hostname = value;
   return url.hostname === value;
@@ -124,6 +126,11 @@ const fromAcct = (acct: string) => {
   const domain = segments[1];
   const fallbackTemplate = `https://${domain}/authorize_interaction?uri={uri}`;
 
+  if (!domain) {
+    fetchInteractionURLFailure();
+    return;
+  }
+
   axios
     .get(`https://${domain}/.well-known/webfinger`, {
       params: { resource: `acct:${acct}` },
diff --git a/app/javascript/mastodon/components/animated_number.tsx b/app/javascript/mastodon/components/animated_number.tsx
index e98e30b24..6c1e0aaec 100644
--- a/app/javascript/mastodon/components/animated_number.tsx
+++ b/app/javascript/mastodon/components/animated_number.tsx
@@ -48,8 +48,9 @@ export const AnimatedNumber: React.FC<Props> = ({ value }) => {
             <span
               key={key}
               style={{
-                position: direction * style.y > 0 ? 'absolute' : 'static',
-                transform: `translateY(${style.y * 100}%)`,
+                position:
+                  direction * (style.y ?? 0) > 0 ? 'absolute' : 'static',
+                transform: `translateY(${(style.y ?? 0) * 100}%)`,
               }}
             >
               <ShortNumber value={data as number} />
diff --git a/app/javascript/mastodon/components/hashtag_bar.tsx b/app/javascript/mastodon/components/hashtag_bar.tsx
index ed5de7d3a..1642ba650 100644
--- a/app/javascript/mastodon/components/hashtag_bar.tsx
+++ b/app/javascript/mastodon/components/hashtag_bar.tsx
@@ -52,7 +52,10 @@ function uniqueHashtagsWithCaseHandling(hashtags: string[]) {
   );
 
   return Object.values(groups).map((tags) => {
-    if (tags.length === 1) return tags[0];
+    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- we know that the array has at least one element
+    const firstTag = tags[0]!;
+
+    if (tags.length === 1) return firstTag;
 
     // The best match is the one where we have the less difference between upper and lower case letter count
     const best = minBy(tags, (tag) => {
@@ -66,7 +69,7 @@ function uniqueHashtagsWithCaseHandling(hashtags: string[]) {
       return Math.abs(lowerCase - upperCase);
     });
 
-    return best ?? tags[0];
+    return best ?? firstTag;
   });
 }
 
diff --git a/app/javascript/mastodon/components/short_number.tsx b/app/javascript/mastodon/components/short_number.tsx
index 74c3c5d75..a0b523aaa 100644
--- a/app/javascript/mastodon/components/short_number.tsx
+++ b/app/javascript/mastodon/components/short_number.tsx
@@ -48,7 +48,7 @@ const ShortNumberCounter: React.FC<ShortNumberCounterProps> = ({ value }) => {
 
   const count = (
     <FormattedNumber
-      value={rawNumber}
+      value={rawNumber ?? 0}
       maximumFractionDigits={maxFractionDigits}
     />
   );
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 ffca1f8b0..806a3f892 100644
--- a/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts
+++ b/app/javascript/mastodon/features/emoji/emoji_mart_data_light.ts
@@ -29,7 +29,10 @@ const emojis: Emojis = {};
 
 // decompress
 Object.keys(shortCodesToEmojiData).forEach((shortCode) => {
-  const [_filenameData, searchData] = shortCodesToEmojiData[shortCode];
+  const emojiData = shortCodesToEmojiData[shortCode];
+  if (!emojiData) return;
+
+  const [_filenameData, searchData] = emojiData;
   const [native, short_names, search, unified] = searchData;
 
   emojis[shortCode] = {
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 191419496..d116c6c62 100644
--- a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts
+++ b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts
@@ -46,7 +46,10 @@ function processEmojiMapData(
 Object.keys(shortCodesToEmojiData).forEach(
   (shortCode: ShortCodesToEmojiDataKey) => {
     if (shortCode === undefined) return;
-    const [filenameData, _searchData] = shortCodesToEmojiData[shortCode];
+
+    const emojiData = shortCodesToEmojiData[shortCode];
+    if (!emojiData) return;
+    const [filenameData, _searchData] = emojiData;
     filenameData.forEach((emojiMapData) => {
       processEmojiMapData(emojiMapData, shortCode);
     });
diff --git a/app/javascript/mastodon/store/middlewares/sounds.ts b/app/javascript/mastodon/store/middlewares/sounds.ts
index 720ee163e..91407b1ec 100644
--- a/app/javascript/mastodon/store/middlewares/sounds.ts
+++ b/app/javascript/mastodon/store/middlewares/sounds.ts
@@ -74,8 +74,9 @@ export const soundsMiddleware = (): Middleware<
     if (isActionWithMetaSound(action)) {
       const sound = action.meta.sound;
 
-      if (sound && Object.hasOwn(soundCache, sound)) {
-        play(soundCache[sound]);
+      if (sound) {
+        const s = soundCache[sound];
+        if (s) play(s);
       }
     }
 
diff --git a/tsconfig.json b/tsconfig.json
index 7010dda1f..cc1f18a99 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -7,6 +7,8 @@
     "allowJs": true,
     "noEmit": true,
     "strict": true,
+    "noImplicitReturns": true,
+    "noUncheckedIndexedAccess": true,
     "esModuleInterop": true,
     "skipLibCheck": true,
     "baseUrl": "./",

From 1034f13f57ec98f316e2b356957d01992371b59d Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 27 May 2024 11:25:55 +0200
Subject: [PATCH 196/215] chore(deps): update devdependencies (non-major)
 (#30442)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 256 ++++++++++++++++++++++++++----------------------------
 1 file changed, 121 insertions(+), 135 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 03157cce5..ad07e4e42 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1590,7 +1590,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/css-parser-algorithms@npm:^2.6.1, @csstools/css-parser-algorithms@npm:^2.6.3":
+"@csstools/css-parser-algorithms@npm:^2.6.3":
   version: 2.6.3
   resolution: "@csstools/css-parser-algorithms@npm:2.6.3"
   peerDependencies:
@@ -1599,14 +1599,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/css-tokenizer@npm:^2.2.4, @csstools/css-tokenizer@npm:^2.3.1":
+"@csstools/css-tokenizer@npm:^2.3.1":
   version: 2.3.1
   resolution: "@csstools/css-tokenizer@npm:2.3.1"
   checksum: 10c0/fed6619fb5108e109d4dd10b0e967035a92793bae8fb84544e1342058b6df4e306d9d075623e2201fe88831b1ada797aea3546a8d12229d2d81cd7a5dfee4444
   languageName: node
   linkType: hard
 
-"@csstools/media-query-list-parser@npm:^2.1.11, @csstools/media-query-list-parser@npm:^2.1.9":
+"@csstools/media-query-list-parser@npm:^2.1.11":
   version: 2.1.11
   resolution: "@csstools/media-query-list-parser@npm:2.1.11"
   peerDependencies:
@@ -1982,7 +1982,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@csstools/selector-specificity@npm:^3.0.3, @csstools/selector-specificity@npm:^3.1.1":
+"@csstools/selector-specificity@npm:^3.1.1":
   version: 3.1.1
   resolution: "@csstools/selector-specificity@npm:3.1.1"
   peerDependencies:
@@ -2007,10 +2007,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@dual-bundle/import-meta-resolve@npm:^4.0.0":
-  version: 4.0.0
-  resolution: "@dual-bundle/import-meta-resolve@npm:4.0.0"
-  checksum: 10c0/868b8314fc753b7767887108535afe3288de941d92bc8453164dbcb1abe886b171e338f6f7d02ff556256dee69c90e4ac6360e0c6a856a5ad7190274ab52de2e
+"@dual-bundle/import-meta-resolve@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "@dual-bundle/import-meta-resolve@npm:4.1.0"
+  checksum: 10c0/55069e550ee2710e738dd8bbd34aba796cede456287454b50c3be46fbef8695d00625677f3f41f5ffbec1174c0f57f314da9a908388bc9f8ad41a8438db884d9
   languageName: node
   linkType: hard
 
@@ -5609,12 +5609,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"braces@npm:^3.0.2, braces@npm:~3.0.2":
-  version: 3.0.2
-  resolution: "braces@npm:3.0.2"
+"braces@npm:^3.0.3, braces@npm:~3.0.2":
+  version: 3.0.3
+  resolution: "braces@npm:3.0.3"
   dependencies:
-    fill-range: "npm:^7.0.1"
-  checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381
+    fill-range: "npm:^7.1.1"
+  checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04
   languageName: node
   linkType: hard
 
@@ -5917,13 +5917,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"chalk@npm:5.3.0":
-  version: 5.3.0
-  resolution: "chalk@npm:5.3.0"
-  checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09
-  languageName: node
-  linkType: hard
-
 "chalk@npm:^2.4.1, chalk@npm:^2.4.2":
   version: 2.4.2
   resolution: "chalk@npm:2.4.2"
@@ -5955,6 +5948,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"chalk@npm:~5.3.0":
+  version: 5.3.0
+  resolution: "chalk@npm:5.3.0"
+  checksum: 10c0/8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09
+  languageName: node
+  linkType: hard
+
 "char-regex@npm:^1.0.2":
   version: 1.0.2
   resolution: "char-regex@npm:1.0.2"
@@ -6247,13 +6247,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"commander@npm:11.1.0":
-  version: 11.1.0
-  resolution: "commander@npm:11.1.0"
-  checksum: 10c0/13cc6ac875e48780250f723fb81c1c1178d35c5decb1abb1b628b3177af08a8554e76b2c0f29de72d69eef7c864d12613272a71fabef8047922bc622ab75a179
-  languageName: node
-  linkType: hard
-
 "commander@npm:^2.20.0":
   version: 2.20.3
   resolution: "commander@npm:2.20.3"
@@ -6268,6 +6261,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"commander@npm:~12.1.0":
+  version: 12.1.0
+  resolution: "commander@npm:12.1.0"
+  checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9
+  languageName: node
+  linkType: hard
+
 "comment-parser@npm:1.4.1":
   version: 1.4.1
   resolution: "comment-parser@npm:1.4.1"
@@ -6947,7 +6947,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"debug@npm:4, debug@npm:4.3.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, 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.4":
   version: 4.3.4
   resolution: "debug@npm:4.3.4"
   dependencies:
@@ -8165,23 +8165,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"execa@npm:8.0.1":
-  version: 8.0.1
-  resolution: "execa@npm:8.0.1"
-  dependencies:
-    cross-spawn: "npm:^7.0.3"
-    get-stream: "npm:^8.0.1"
-    human-signals: "npm:^5.0.0"
-    is-stream: "npm:^3.0.0"
-    merge-stream: "npm:^2.0.0"
-    npm-run-path: "npm:^5.1.0"
-    onetime: "npm:^6.0.0"
-    signal-exit: "npm:^4.1.0"
-    strip-final-newline: "npm:^3.0.0"
-  checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af
-  languageName: node
-  linkType: hard
-
 "execa@npm:^1.0.0":
   version: 1.0.0
   resolution: "execa@npm:1.0.0"
@@ -8214,6 +8197,23 @@ __metadata:
   languageName: node
   linkType: hard
 
+"execa@npm:~8.0.1":
+  version: 8.0.1
+  resolution: "execa@npm:8.0.1"
+  dependencies:
+    cross-spawn: "npm:^7.0.3"
+    get-stream: "npm:^8.0.1"
+    human-signals: "npm:^5.0.0"
+    is-stream: "npm:^3.0.0"
+    merge-stream: "npm:^2.0.0"
+    npm-run-path: "npm:^5.1.0"
+    onetime: "npm:^6.0.0"
+    signal-exit: "npm:^4.1.0"
+    strip-final-newline: "npm:^3.0.0"
+  checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af
+  languageName: node
+  linkType: hard
+
 "exit@npm:^0.1.2":
   version: 0.1.2
   resolution: "exit@npm:0.1.2"
@@ -8339,10 +8339,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fast-copy@npm:^3.0.0":
-  version: 3.0.1
-  resolution: "fast-copy@npm:3.0.1"
-  checksum: 10c0/a8310dbcc4c94ed001dc3e0bbc3c3f0491bb04e6c17163abe441a54997ba06cdf1eb532c2f05e54777c6f072c84548c23ef0ecd54665cd611be1d42f37eca258
+"fast-copy@npm:^3.0.2":
+  version: 3.0.2
+  resolution: "fast-copy@npm:3.0.2"
+  checksum: 10c0/02e8b9fd03c8c024d2987760ce126456a0e17470850b51e11a1c3254eed6832e4733ded2d93316c82bc0b36aeb991ad1ff48d1ba95effe7add7c3ab8d8eb554a
   languageName: node
   linkType: hard
 
@@ -8493,12 +8493,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fill-range@npm:^7.0.1":
-  version: 7.0.1
-  resolution: "fill-range@npm:7.0.1"
+"fill-range@npm:^7.1.1":
+  version: 7.1.1
+  resolution: "fill-range@npm:7.1.1"
   dependencies:
     to-regex-range: "npm:^5.0.1"
-  checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f
+  checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018
   languageName: node
   linkType: hard
 
@@ -11229,10 +11229,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"known-css-properties@npm:^0.30.0":
-  version: 0.30.0
-  resolution: "known-css-properties@npm:0.30.0"
-  checksum: 10c0/8b487a6b33487affcec41eb392ceb77acf4d093558dde5c88b5ea06b9a3c81781876d7cb09872e0518b9602f27c8f4112c9ac333e02c90a91c8fbd12e202ed48
+"known-css-properties@npm:^0.31.0":
+  version: 0.31.0
+  resolution: "known-css-properties@npm:0.31.0"
+  checksum: 10c0/8e643cbed32d7733278ba215c43dfc38fc7e77d391f66b81f07228af97d69ce2cebba03a9bc1ac859479e162aea812e258b30f4c93cb7b7adfd0622a141d36da
   languageName: node
   linkType: hard
 
@@ -11269,14 +11269,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"lilconfig@npm:3.0.0":
-  version: 3.0.0
-  resolution: "lilconfig@npm:3.0.0"
-  checksum: 10c0/7f5ee7a658dc016cacf146815e8d88b06f06f4402823b8b0934e305a57a197f55ccc9c5cd4fb5ea1b2b821c8ccaf2d54abd59602a4931af06eabda332388d3e6
-  languageName: node
-  linkType: hard
-
-"lilconfig@npm:^3.1.1":
+"lilconfig@npm:^3.1.1, lilconfig@npm:~3.1.1":
   version: 3.1.1
   resolution: "lilconfig@npm:3.1.1"
   checksum: 10c0/311b559794546894e3fe176663427326026c1c644145be9e8041c58e268aa9328799b8dfe7e4dd8c6a4ae305feae95a1c9e007db3569f35b42b6e1bc8274754c
@@ -11291,36 +11284,36 @@ __metadata:
   linkType: hard
 
 "lint-staged@npm:^15.0.0":
-  version: 15.2.2
-  resolution: "lint-staged@npm:15.2.2"
+  version: 15.2.5
+  resolution: "lint-staged@npm:15.2.5"
   dependencies:
-    chalk: "npm:5.3.0"
-    commander: "npm:11.1.0"
-    debug: "npm:4.3.4"
-    execa: "npm:8.0.1"
-    lilconfig: "npm:3.0.0"
-    listr2: "npm:8.0.1"
-    micromatch: "npm:4.0.5"
-    pidtree: "npm:0.6.0"
-    string-argv: "npm:0.3.2"
-    yaml: "npm:2.3.4"
+    chalk: "npm:~5.3.0"
+    commander: "npm:~12.1.0"
+    debug: "npm:~4.3.4"
+    execa: "npm:~8.0.1"
+    lilconfig: "npm:~3.1.1"
+    listr2: "npm:~8.2.1"
+    micromatch: "npm:~4.0.7"
+    pidtree: "npm:~0.6.0"
+    string-argv: "npm:~0.3.2"
+    yaml: "npm:~2.4.2"
   bin:
     lint-staged: bin/lint-staged.js
-  checksum: 10c0/a1ba6c7ee53e30a0f6ea9a351d95d3d0d2be916a41b561e22907e9ea513eb18cb3dbe65bff3ec13fad15777999efe56b2e2a95427e31d12a9b7e7948c3630ee2
+  checksum: 10c0/89c54489783510f86df15756659facade82e849c0cbfb564fe047b82be91c5d2b1b5608a4bfc5237bd7b9fd0e1206e66aa3e4f8cad3ac51e37a098b8492c2fa6
   languageName: node
   linkType: hard
 
-"listr2@npm:8.0.1":
-  version: 8.0.1
-  resolution: "listr2@npm:8.0.1"
+"listr2@npm:~8.2.1":
+  version: 8.2.1
+  resolution: "listr2@npm:8.2.1"
   dependencies:
     cli-truncate: "npm:^4.0.0"
     colorette: "npm:^2.0.20"
     eventemitter3: "npm:^5.0.1"
     log-update: "npm:^6.0.0"
-    rfdc: "npm:^1.3.0"
+    rfdc: "npm:^1.3.1"
     wrap-ansi: "npm:^9.0.0"
-  checksum: 10c0/b565d6ceb3a4c2dbe0c1735c0fd907afd0d6f89de21aced8e05187b2d88ca2f8f9ebc5d743885396a00f05f13146f6be744d098a56ce0402cf1cd131485a7ff1
+  checksum: 10c0/ac32cba8e5c79bcf0dbbb43c2fcc73e47902320c1fa1891074fefb3aa3dfaeef9c76348da22909f65334ba9bee1140bfc903e2f0c64427dd08ef4ba8f6b1dbd0
   languageName: node
   linkType: hard
 
@@ -11762,16 +11755,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"micromatch@npm:4.0.5, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5":
-  version: 4.0.5
-  resolution: "micromatch@npm:4.0.5"
-  dependencies:
-    braces: "npm:^3.0.2"
-    picomatch: "npm:^2.3.1"
-  checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff
-  languageName: node
-  linkType: hard
-
 "micromatch@npm:^3.0.4, micromatch@npm:^3.1.10, micromatch@npm:^3.1.4":
   version: 3.1.10
   resolution: "micromatch@npm:3.1.10"
@@ -11793,6 +11776,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:~4.0.7":
+  version: 4.0.7
+  resolution: "micromatch@npm:4.0.7"
+  dependencies:
+    braces: "npm:^3.0.3"
+    picomatch: "npm:^2.3.1"
+  checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772
+  languageName: node
+  linkType: hard
+
 "miller-rabin@npm:^4.0.0":
   version: 4.0.1
   resolution: "miller-rabin@npm:4.0.1"
@@ -12986,10 +12979,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"picocolors@npm:^1.0.0":
-  version: 1.0.0
-  resolution: "picocolors@npm:1.0.0"
-  checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7
+"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "picocolors@npm:1.0.1"
+  checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400
   languageName: node
   linkType: hard
 
@@ -13000,7 +12993,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"pidtree@npm:0.6.0":
+"pidtree@npm:~0.6.0":
   version: 0.6.0
   resolution: "pidtree@npm:0.6.0"
   bin:
@@ -13069,12 +13062,12 @@ __metadata:
   linkType: hard
 
 "pino-pretty@npm:^11.0.0":
-  version: 11.0.0
-  resolution: "pino-pretty@npm:11.0.0"
+  version: 11.1.0
+  resolution: "pino-pretty@npm:11.1.0"
   dependencies:
     colorette: "npm:^2.0.7"
     dateformat: "npm:^4.6.3"
-    fast-copy: "npm:^3.0.0"
+    fast-copy: "npm:^3.0.2"
     fast-safe-stringify: "npm:^2.1.1"
     help-me: "npm:^5.0.0"
     joycon: "npm:^3.1.1"
@@ -13084,11 +13077,11 @@ __metadata:
     pump: "npm:^3.0.0"
     readable-stream: "npm:^4.0.0"
     secure-json-parse: "npm:^2.4.0"
-    sonic-boom: "npm:^3.0.0"
+    sonic-boom: "npm:^4.0.1"
     strip-json-comments: "npm:^3.1.1"
   bin:
     pino-pretty: bin.js
-  checksum: 10c0/d42213f3fdf19d92152b0a14683b2bb8443423739c81ab7c1181a5dac0e0ca7621d232c8264ece81edc01106ca2a8e165783daca0a902f0fde480027075d5540
+  checksum: 10c0/418be6f854b0d62c83c65e75b0969d5311792bfadeefbfe77d8a7f8c5ba26b8bea40f549222b5f500439f440eb4d6c2fa99d712bdd02881ebae7be3a0193b581
   languageName: node
   linkType: hard
 
@@ -15200,10 +15193,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"rfdc@npm:^1.3.0":
-  version: 1.3.0
-  resolution: "rfdc@npm:1.3.0"
-  checksum: 10c0/a17fd7b81f42c7ae4cb932abd7b2f677b04cc462a03619fb46945ae1ccae17c3bc87c020ffdde1751cbfa8549860a2883486fdcabc9b9de3f3108af32b69a667
+"rfdc@npm:^1.3.1":
+  version: 1.3.1
+  resolution: "rfdc@npm:1.3.1"
+  checksum: 10c0/69f65e3ed30970f8055fac9fbbef9ce578800ca19554eab1dcbffe73a4b8aef536bc4248313889cf25e3b4e38b212c721eabe30856575bf2b2bc3d90f8ba93ef
   languageName: node
   linkType: hard
 
@@ -15865,15 +15858,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"sonic-boom@npm:^3.0.0":
-  version: 3.7.0
-  resolution: "sonic-boom@npm:3.7.0"
-  dependencies:
-    atomic-sleep: "npm:^1.0.0"
-  checksum: 10c0/57a3d560efb77f4576db111168ee2649c99e7869fda6ce0ec2a4e5458832d290ba58d74b073ddb5827d9a30f96d23cff79157993d919e1a6d5f28d8b6391c7f0
-  languageName: node
-  linkType: hard
-
 "sonic-boom@npm:^4.0.1":
   version: 4.0.1
   resolution: "sonic-boom@npm:4.0.1"
@@ -16180,7 +16164,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"string-argv@npm:0.3.2":
+"string-argv@npm:~0.3.2":
   version: 0.3.2
   resolution: "string-argv@npm:0.3.2"
   checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82
@@ -16504,14 +16488,14 @@ __metadata:
   linkType: hard
 
 "stylelint@npm:^16.0.2":
-  version: 16.5.0
-  resolution: "stylelint@npm:16.5.0"
+  version: 16.6.0
+  resolution: "stylelint@npm:16.6.0"
   dependencies:
-    "@csstools/css-parser-algorithms": "npm:^2.6.1"
-    "@csstools/css-tokenizer": "npm:^2.2.4"
-    "@csstools/media-query-list-parser": "npm:^2.1.9"
-    "@csstools/selector-specificity": "npm:^3.0.3"
-    "@dual-bundle/import-meta-resolve": "npm:^4.0.0"
+    "@csstools/css-parser-algorithms": "npm:^2.6.3"
+    "@csstools/css-tokenizer": "npm:^2.3.1"
+    "@csstools/media-query-list-parser": "npm:^2.1.11"
+    "@csstools/selector-specificity": "npm:^3.1.1"
+    "@dual-bundle/import-meta-resolve": "npm:^4.1.0"
     balanced-match: "npm:^2.0.0"
     colord: "npm:^2.9.3"
     cosmiconfig: "npm:^9.0.0"
@@ -16528,16 +16512,16 @@ __metadata:
     ignore: "npm:^5.3.1"
     imurmurhash: "npm:^0.1.4"
     is-plain-object: "npm:^5.0.0"
-    known-css-properties: "npm:^0.30.0"
+    known-css-properties: "npm:^0.31.0"
     mathml-tag-names: "npm:^2.1.3"
     meow: "npm:^13.2.0"
     micromatch: "npm:^4.0.5"
     normalize-path: "npm:^3.0.0"
-    picocolors: "npm:^1.0.0"
+    picocolors: "npm:^1.0.1"
     postcss: "npm:^8.4.38"
     postcss-resolve-nested-selector: "npm:^0.1.1"
     postcss-safe-parser: "npm:^7.0.0"
-    postcss-selector-parser: "npm:^6.0.16"
+    postcss-selector-parser: "npm:^6.1.0"
     postcss-value-parser: "npm:^4.2.0"
     resolve-from: "npm:^5.0.0"
     string-width: "npm:^4.2.3"
@@ -16548,7 +16532,7 @@ __metadata:
     write-file-atomic: "npm:^5.0.1"
   bin:
     stylelint: bin/stylelint.mjs
-  checksum: 10c0/9281693ff6c1918e07fdcf7a950531f79678a28261a0d5bd36ca2fcf524e53d7305158d20ba890f5dd01c0ff90c09a13453dce2fe6887f4c157d8c2c0acf3666
+  checksum: 10c0/acfb7983a0b71677d066b2aa570eefdac0a7be2e21351bac8884b8156deaeec19e53ad128ae7ae7933c79f6045f1de8d759ba06cfbc373b2711015860805a3e7
   languageName: node
   linkType: hard
 
@@ -18442,13 +18426,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"yaml@npm:2.3.4":
-  version: 2.3.4
-  resolution: "yaml@npm:2.3.4"
-  checksum: 10c0/cf03b68f8fef5e8516b0f0b54edaf2459f1648317fc6210391cf606d247e678b449382f4bd01f77392538429e306c7cba8ff46ff6b37cac4de9a76aff33bd9e1
-  languageName: node
-  linkType: hard
-
 "yaml@npm:^1.10.0":
   version: 1.10.2
   resolution: "yaml@npm:1.10.2"
@@ -18456,6 +18433,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"yaml@npm:~2.4.2":
+  version: 2.4.2
+  resolution: "yaml@npm:2.4.2"
+  bin:
+    yaml: bin.mjs
+  checksum: 10c0/280ddb2e43ffa7d91a95738e80c8f33e860749cdc25aa6d9e4d350a28e174fd7e494e4aa023108aaee41388e451e3dc1292261d8f022aabcf90df9c63d647549
+  languageName: node
+  linkType: hard
+
 "yargs-parser@npm:^13.1.2":
   version: 13.1.2
   resolution: "yargs-parser@npm:13.1.2"

From e5c3dc33a29d9f104b7101fb872da52114a38112 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 27 May 2024 11:35:45 +0200
Subject: [PATCH 197/215] New Crowdin Translations (automated) (#30421)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/lt.json    |  1 +
 app/javascript/mastodon/locales/nn.json    |  2 +-
 app/javascript/mastodon/locales/pt-BR.json |  1 +
 app/javascript/mastodon/locales/si.json    |  7 +++++++
 config/locales/ja.yml                      |  2 ++
 config/locales/lt.yml                      |  2 ++
 config/locales/nn.yml                      | 12 ++++++------
 config/locales/pt-BR.yml                   |  2 ++
 config/locales/si.yml                      | 12 ++++++------
 config/locales/simple_form.lt.yml          |  2 ++
 config/locales/simple_form.nn.yml          |  6 +++---
 config/locales/simple_form.si.yml          |  2 +-
 config/locales/simple_form.uk.yml          |  5 +++++
 config/locales/th.yml                      |  1 +
 config/locales/uk.yml                      |  2 ++
 15 files changed, 42 insertions(+), 17 deletions(-)

diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 0f42e97fc..5fc7d3286 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -466,6 +466,7 @@
   "notification.follow_request": "{name} paprašė tave sekti",
   "notification.mention": "{name} paminėjo tave",
   "notification.moderation-warning.learn_more": "Sužinoti daugiau",
+  "notification.moderation_warning": "Gavai prižiūrėjimo įspėjimą",
   "notification.moderation_warning.action_delete_statuses": "Kai kurie tavo įrašai buvo pašalintos.",
   "notification.moderation_warning.action_disable": "Tavo paskyra buvo išjungta.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Kai kurie tavo įrašai buvo pažymėtos kaip jautrios.",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 3316e7af8..3711cc0ae 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -673,7 +673,7 @@
   "search.quick_action.account_search": "Profiler som samsvarer med {x}",
   "search.quick_action.go_to_account": "Gå til profil {x}",
   "search.quick_action.go_to_hashtag": "Gå til emneknagg {x}",
-  "search.quick_action.open_url": "Åpne URL i Mastodon",
+  "search.quick_action.open_url": "Opne adressa i Mastodon",
   "search.quick_action.status_search": "Innlegg som samsvarer med {x}",
   "search.search_or_paste": "Søk eller lim inn URL",
   "search_popout.full_text_search_disabled_message": "Ikkje tilgjengeleg på {domain}.",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 1a6de0835..b11daeaaa 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -474,6 +474,7 @@
   "notification.follow_request": "{name} quer te seguir",
   "notification.mention": "{name} te mencionou",
   "notification.moderation-warning.learn_more": "Aprender mais",
+  "notification.moderation_warning": "Você recebeu um aviso de moderação",
   "notification.moderation_warning.action_delete_statuses": "Algumas das suas publicações foram removidas.",
   "notification.moderation_warning.action_disable": "Sua conta foi desativada.",
   "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algumas de suas publicações foram marcadas por ter conteúdo sensível.",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index 4cb81a760..ccbface05 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -18,6 +18,7 @@
   "account.edit_profile": "පැතිකඩ සංස්කරණය",
   "account.enable_notifications": "@{name} පළ කරන විට මට දැනුම් දෙන්න",
   "account.endorse": "පැතිකඩෙහි විශේෂාංගය",
+  "account.featured_tags.last_status_at": "අවසාන ලිපිය: {date}",
   "account.featured_tags.last_status_never": "ලිපි නැත",
   "account.follow": "අනුගමනය",
   "account.followers": "අනුගාමිකයින්",
@@ -104,6 +105,7 @@
   "compose_form.poll.duration": "මත විමසීමේ කාලය",
   "compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට මත විමසුම වෙනස් කරන්න",
   "compose_form.poll.switch_to_single": "තනි තේරීමකට මත විමසුම වෙනස් කරන්න",
+  "compose_form.publish": "ප්‍රකාශනය",
   "compose_form.publish_form": "නව ලිපිය",
   "compose_form.spoiler.marked": "අන්තර්ගත අවවාදය ඉවත් කරන්න",
   "compose_form.spoiler.unmarked": "අන්තර්ගත අවවාදයක් එක් කරන්න",
@@ -154,6 +156,7 @@
   "empty_column.bookmarked_statuses": "ඔබ සතුව පොත්යොමු තබන ලද ලිපි කිසිවක් නැත. ඔබ පොත්යොමුවක් තබන විට, එය මෙහි දිස්වනු ඇත.",
   "empty_column.domain_blocks": "අවහිර කරන ලද වසම් නැත.",
   "empty_column.explore_statuses": "දැන් කිසිවක් නැඹුරු නොවේ. පසුව නැවත පරීක්ෂා කරන්න!",
+  "empty_column.favourited_statuses": "ඔබ සතුව ප්‍රියතම ලිපි කිසිවක් නැත. ඔබ යමකට ප්‍රිය කළ විට එය මෙහි පෙන්වනු ඇත.",
   "empty_column.follow_requests": "ඔබට තවමත් අනුගමන ඉල්ලීම් ලැබී නැත. ඉල්ලීමක් ලැබුණු විට, එය මෙහි පෙන්වනු ඇත.",
   "empty_column.home": "මුල් පිටුව හිස් ය! මෙය පිරවීමට බොහෝ පුද්ගලයින් අනුගමනය කරන්න.",
   "empty_column.lists": "ඔබට තවමත් ලැයිස්තු කිසිවක් නැත. ඔබ එකක් සාදන විට, එය මෙහි පෙන්වනු ඇත.",
@@ -205,6 +208,7 @@
   "interaction_modal.on_this_server": "මෙම සේවාදායකයෙහි",
   "interaction_modal.title.favourite": "{name}ගේ ලිපිය ප්‍රිය කරන්න",
   "interaction_modal.title.follow": "{name} අනුගමනය",
+  "interaction_modal.title.reply": "{name}ගේ ලිපියට පිළිතුරු",
   "intervals.full.days": "{number, plural, one {දවස් #} other {දවස් #}}",
   "intervals.full.hours": "{number, plural, one {පැය #} other {පැය #}}",
   "intervals.full.minutes": "{number, plural, one {විනාඩි #} other {විනාඩි #}}",
@@ -239,6 +243,7 @@
   "lists.delete": "ලැයිස්තුව මකන්න",
   "lists.edit": "ලැයිස්තුව සංස්කරණය",
   "lists.edit.submit": "සිරැසිය සංශෝධනය",
+  "lists.new.create": "එකතු",
   "lists.new.title_placeholder": "නව ලැයිස්තුවේ සිරැසිය",
   "lists.replies_policy.list": "ලැයිස්තුවේ සාමාජිකයින්",
   "lists.replies_policy.none": "කිසිවෙක් නැත",
@@ -266,6 +271,7 @@
   "navigation_bar.search": "සොයන්න",
   "navigation_bar.security": "ආරක්ෂාව",
   "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
+  "notification.favourite": "{name} ඔබගේ ලිපියට ප්‍රිය කළා",
   "notification.follow": "{name} ඔබව අනුගමනය කළා",
   "notification.mention": "{name} ඔබව සඳහන් කර ඇත",
   "notification.own_poll": "ඔබගේ මත විමසුම නිමයි",
@@ -395,6 +401,7 @@
   "status.admin_status": "මෙම ලිපිය මැදිහත්කරණ අතුරුමුහුණතෙහි අරින්න",
   "status.block": "@{name} අවහිර",
   "status.bookmark": "පොත්යොමුවක්",
+  "status.copy": "ලිපියට සබැඳියේ පිටපතක්",
   "status.delete": "මකන්න",
   "status.detailed_status": "විස්තරාත්මක සංවාද දැක්ම",
   "status.edit": "සංස්කරණය",
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 6c0fba259..ec6963517 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -282,6 +282,7 @@ ja:
         update_custom_emoji_html: "%{name}さんがカスタム絵文字 %{target}を更新しました"
         update_domain_block_html: "%{name}さんが%{target}のドメインブロックを更新しました"
         update_ip_block_html: "%{name} さんがIP %{target} のルールを更新しました"
+        update_report_html: "%{name}さんが通報 %{target} を更新しました"
         update_status_html: "%{name}さんが%{target}さんの投稿を更新しました"
         update_user_role_html: "%{name}さんがロール『%{target}』を変更しました"
       deleted_account: 削除されたアカウント
@@ -933,6 +934,7 @@ ja:
       delete: 削除
       edit_preset: プリセット警告文を編集
       empty: まだプリセット警告文が作成されていません。
+      title: プリセット警告文
     webhooks:
       add_new: エンドポイントを追加
       delete: 削除
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 8e32ed07b..f3d71bf6e 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -291,6 +291,7 @@ lt:
         update_custom_emoji_html: "%{name} atnaujino jaustuką %{target}"
         update_domain_block_html: "%{name} atnaujino domeno bloką %{target}"
         update_ip_block_html: "%{name} pakeitė taisyklę IP %{target}"
+        update_report_html: "%{name} atnaujino ataskaitą %{target}"
         update_status_html: "%{name} atnaujino įrašą %{target}"
         update_user_role_html: "%{name} pakeitė %{target} vaidmenį"
       deleted_account: ištrinta paskyra
@@ -624,6 +625,7 @@ lt:
       add_new: Pridėti naują
       delete: Ištrinti
       edit_preset: Keisti įspėjimo nustatymus
+      title: Įspėjamieji numatytieji
     webhooks:
       description_html: "<strong>Webhook</strong> leidžia Mastodon siųsti <strong>realaus laiko pranešimus</strong> apie pasirinktus įvykius į tavo programą, kad programa galėtų <strong>automatiškai paleisti reakcijas</strong>."
       events: Įvykiai
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index 94efdcb15..d82c92c26 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -461,13 +461,13 @@ nn:
         title: Importer domeneblokkeringar
       no_file: Inga fil vald
     follow_recommendations:
-      description_html: "<strong>Følgjeforslag hjelper nye brukarar å raskt finna interessant innhald</strong>. Om ein brukar ikkje har interagera nok med andre til å danne personlege følgjeforslag, vert disse kontiane føreslått i staden. Dei vert gjenkalkulert på dagleg basis ut frå ei blanding av dei konti med flest nylege engasjement og flest lokale følgjarar for eit gitt språk."
+      description_html: "<strong>Fylgjeforslag hjelper nye brukarar å finna interessant innhald raskt</strong>. Om ein brukar ikkje har samhandla nok med andre til å få tilpassa fylgjeforslag, blir desse kontoane føreslått i staden. Dei blir rekna ut på nytt kvar dag ut frå ei blanding av kva kontoar som har mykje nyleg aktivitet og høgast tal på fylgjarar på eit bestemt språk."
       language: For språk
       status: Status
       suppress: Demp følgjeforslag
       suppressed: Dempa
-      title: Følgjeforslag
-      unsuppress: Tilbakestill følgjeforslag
+      title: Fylgjeforslag
+      unsuppress: Nullstill fylgjeforslag
     instances:
       availability:
         description_html:
@@ -746,7 +746,7 @@ nn:
         preamble: Tilpasse web-grensesnittet.
         title: Utsjånad
       branding:
-        preamble: Profileringa av tenaren din skil den frå andre tenarar i nettverket. Informasjonen kan bli vist ulike stadar, til dømes i Mastodon sitt web-grensesnitt, i eigne applikasjonar, i førehandsvisningar på andre nettsider, i meldingsappar og så bortetter. På grunn av dette er det best å halde informasjonen enkel, kort og treffande.
+        preamble: Profileringa av tenaren din skil den frå andre tenarar i nettverket. Informasjonen kan bli vist ulike stader, til dømes i Mastodon sitt web-grensesnitt, i eigne applikasjonar, i førehandsvisningar på andre nettsider, i meldingsappar og så bortetter. På grunn av dette er det best at denne informasjonen er enkel, kort og treffande.
         title: Profilering
       captcha_enabled:
         desc_html: Dette baserer seg på eksterne skript frå hCaptcha, noko som kan vera eit tryggleiks- og personvernsproblem. <strong>I tillegg kan dette gjera registreringsprosessen monaleg mindre tilgjengeleg (særleg for folk med nedsett funksjonsevne)</strong>. Dette gjer at du bør du vurdera alternative tiltak, som til dømes godkjennings- eller invitasjonsbasert registrering.
@@ -759,7 +759,7 @@ nn:
         desc_html: Påverkar alle brukarar som ikkje har justert denne innstillinga sjølve
         title: Ikkje la brukarar indekserast av søkjemotorar som standard
       discovery:
-        follow_recommendations: Følgjeforslag
+        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.
         profile_directory: Profilkatalog
         public_timelines: Offentlege tidsliner
@@ -1562,7 +1562,7 @@ nn:
     activity: Kontoaktivitet
     confirm_follow_selected_followers: Er du sikker på at du ynskjer å fylgja dei valde fylgjarane?
     confirm_remove_selected_followers: Er du sikker på at du ynskjer å fjerna dei valde fylgjarane?
-    confirm_remove_selected_follows: Er du sikker på at du ynskjer å fjerna det valde følgjet?
+    confirm_remove_selected_follows: Er du sikker på at du ikkje vil fylgja desse?
     dormant: I dvale
     follow_failure: Greidde ikkje fylgja alle kontoane du valde.
     follow_selected_followers: Følg valgte tilhengere
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 6b80edb24..8d3b53f77 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -285,6 +285,7 @@ pt-BR:
         update_custom_emoji_html: "%{name} atualizou o emoji %{target}"
         update_domain_block_html: "%{name} atualizou o bloqueio de domínio de %{target}"
         update_ip_block_html: "%{name} alterou a regra para o IP %{target}"
+        update_report_html: "%{name} atualizou o relatório %{target}"
         update_status_html: "%{name} atualizou a publicação de %{target}"
         update_user_role_html: "%{name} alterou o cargo %{target}"
       deleted_account: conta excluída
@@ -950,6 +951,7 @@ pt-BR:
       delete: Excluir
       edit_preset: Editar o aviso pré-definido
       empty: Você ainda não definiu nenhuma predefinição de alerta.
+      title: Predefinições de aviso
     webhooks:
       add_new: Adicionar endpoint
       delete: Excluir
diff --git a/config/locales/si.yml b/config/locales/si.yml
index 0f714ee14..85e242b63 100644
--- a/config/locales/si.yml
+++ b/config/locales/si.yml
@@ -66,7 +66,7 @@ si:
       inbox_url: එන ලිපි URL
       invite_request_text: එක්වීමට හේතුව
       invited_by: විසින් ආරාධනා කරන ලදී
-      ip: අ.ජා. කෙ. (IP)
+      ip: අ.ජා.කෙ. (IP)
       joined: එක් වූ දිනය
       location:
         all: සියල්ල
@@ -87,7 +87,7 @@ si:
         title: මැදිහත්කරණය
       moderation_notes: මැදිහත්කරණ සටහන්
       most_recent_activity: වඩාත්ම මෑත ක්රියාකාරිත්වය
-      most_recent_ip: මෑත අ.ජා.කෙ. (IP)
+      most_recent_ip: මෑත අ.ජා.කෙ.
       no_account_selected: කිසිවක් තෝරා නොගත් බැවින් ගිණුම් කිසිවක් වෙනස් කර නැත
       no_limits_imposed: සීමාවන් පනවා නැත
       not_subscribed: දායක වී නැත
@@ -160,7 +160,7 @@ si:
         create_custom_emoji: අභිරුචි ඉමොජි සාදන්න
         create_domain_allow: වසමකට ඉඩදීම සාදන්න
         create_email_domain_block: ඊමේල් ඩොමේන් බ්ලොක් එකක් සාදන්න
-        create_ip_block: අ.ජා. කෙ. (IP) නීතියක් සාදන්න
+        create_ip_block: අ.ජා.කෙ. නීතියක් සාදන්න
         create_unavailable_domain: ලබා ගත නොහැකි වසම සාදන්න
         create_user_role: භූමිකාව සාදන්න
         demote_user: පරිශීලකයා පහත් කරන්න
@@ -473,7 +473,7 @@ si:
       new:
         title: නව අ.ජා.කෙ. නීතියක් සාදන්න
       no_ip_block_selected: IP රීති කිසිවක් තෝරා නොගත් බැවින් වෙනස් කර නැත
-      title: අ.ජා. කෙ. (IP) නීති
+      title: අ.ජා.කෙ. (IP) නීති
     relationships:
       title: "%{acct}හි සබඳතා"
     relays:
@@ -1239,7 +1239,7 @@ si:
     current_session: වත්මන් වාරය
     description: "%{platform} හි %{browser}"
     explanation: ඔබගේ මාස්ටඩන් ගිණුමට පිවිසීම සඳහා භාවිතා කර තිබෙන අතිරික්සු.
-    ip: අ.ජා. කෙ. (IP)
+    ip: අ.ජා.කෙ.
     platforms:
       adobe_air: ඇඩෝබි එයාර්
       android: ඇන්ඩ්‍රොයිඩ්
@@ -1399,7 +1399,7 @@ si:
       details: 'ප්‍රවේශයට අදාළ විස්තර:'
       explanation: ඔබගේ ගිණුමට නව අ.ජා.කෙ. (IP) ලිපිනයකින් ප්‍රවේශයක් අනාවරණය වී ඇත.
       further_actions_html: මේ ඔබ නොවේ නම්, වහාම %{action}. ඔබගේ ගිණුම සුරක්‍ෂිතව තබා ගැනීමට ද්වි-සාධකය සබල කරන්න.
-      subject: ඔබගේ ගිණුමට නව අ.ජා.කෙ. (IP) ලිපිනයකින් ප්‍රවේශ වී ඇත
+      subject: ඔබගේ ගිණුමට නව අ.ජා.කෙ. ලිපිනයකින් ප්‍රවේශ වී ඇත
       title: නව ප්‍රවේශයක්
     warning:
       appeal: අභියාචනයක් ඉදිරිපත් කරන්න
diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml
index 789121be4..feec37ae0 100644
--- a/config/locales/simple_form.lt.yml
+++ b/config/locales/simple_form.lt.yml
@@ -74,8 +74,10 @@ lt:
           warn: Slėpti filtruojamą turinį po įspėjimu, paminint filtro pavadinimą
       form_admin_settings:
         activity_api_enabled: Vietinių paskelbtų įrašų, aktyvių naudotojų ir naujų registracijų skaičiai kas savaitę
+        app_icon: WEBP, PNG, GIF arba JPG. Pakeičia numatytąją programos piktogramą mobiliuosiuose įrenginiuose pasirinktine piktograma.
         backups_retention_period: Naudotojai gali generuoti savo įrašų archyvus, kuriuos vėliau galės atsisiųsti. Nustačius teigiamą reikšmę, šie archyvai po nurodyto dienų skaičiaus bus automatiškai ištrinti iš saugyklos.
         content_cache_retention_period: Visi įrašai iš kitų serverių (įskaitant pakėlimus ir atsakymus) bus ištrinti po nurodyto dienų skaičiaus, neatsižvelgiant į bet kokią vietinio naudotojo sąveiką su tais įrašais. Tai taikoma ir tiems įrašams, kuriuos vietinis naudotojas yra pažymėjęs kaip žymes ar mėgstamus. Privačios paminėjimai tarp naudotojų iš skirtingų instancijų taip pat bus prarastos ir jų bus neįmanoma atkurti. Šis nustatymas skirtas naudoti ypatingos paskirties instancijose, o įgyvendinus jį bendram naudojimui, pažeidžiami daugelio naudotojų lūkesčiai.
+        favicon: WEBP, PNG, GIF arba JPG. Pakeičia numatytąją Mastodon svetaines piktogramą pasirinktine piktograma.
         mascot: Pakeičia išplėstinės žiniatinklio sąsajos iliustraciją.
         media_cache_retention_period: Nuotolinių naudotojų įrašytų įrašų medijos failai talpinami tavo serveryje. Nustačius teigiamą reikšmę, medijos bus ištrinamos po nurodyto dienų skaičiaus. Jei medijos duomenų bus paprašyta po to, kai jie bus ištrinti, jie bus atsiųsti iš naujo, jei šaltinio turinys vis dar prieinamas. Dėl apribojimų, susijusių su nuorodų peržiūros kortelių apklausos dažnumu trečiųjų šalių svetainėse, rekomenduojama nustatyti šią reikšmę ne trumpesnę kaip 14 dienų, kitaip nuorodų peržiūros kortelės nebus atnaujinamos pagal pareikalavimą iki to laiko.
         peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme.
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index a93a80322..a200e1206 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -8,8 +8,8 @@ nn:
         fields: Heimesida di, pronomen, alder, eller kva du måtte ynskje.
         indexable: Dei offentlege innlegga dine kan dukka opp i søkjeresultat på Mastodon. Folk som har reagert på oinnlegga dine kan uansett søkja gjennom dei.
         note: 'Du kan @nemne folk eller #emneknaggar.'
-        show_collections: Andre kan sjå kven du følgjer og kven som følgjer deg. Dei du følgjer kan alltid sjå at du følgjer dei.
-        unlocked: Alle kan følgje deg utan å måtte spørje om det. Vel bort om du vil gå gjennom førespurnadar om å følgje deg og seie ja eller nei.
+        show_collections: Andre kan sjå kven du fylgjer og kven som fylgjer deg. Dei du fylgjer kan alltid sjå at du fylgjer dei.
+        unlocked: Alle kan fylgja deg utan å måtta be om det. Vel bort dersom du vil gå gjennom førespurnader om å fylgja deg og seia ja eller nei til kvar av dei.
       account_alias:
         acct: Angi brukarnamn@domene til brukaren du ynskjer å flytta frå
       account_migration:
@@ -148,7 +148,7 @@ nn:
           name: Merkelapp
           value: Innhald
         indexable: Ta med offentlege innlegg i søkjeresultat
-        show_collections: Vis følgjer og følgjare på profilen
+        show_collections: Vis dei du fylgjer og dei som fylgjer deg på profilen din
         unlocked: Godta nye følgjare automatisk
       account_alias:
         acct: Brukarnamnet på den gamle kontoen
diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml
index eb41d263b..a81ba27bb 100644
--- a/config/locales/simple_form.si.yml
+++ b/config/locales/simple_form.si.yml
@@ -190,7 +190,7 @@ si:
         text: ඔබට එක් වීමට අවශ්‍ය ඇයි?
       ip_block:
         comment: අදහස
-        ip: අ.ජා. කෙ. (IP)
+        ip: අ.ජා.කෙ. (IP)
         severities:
           no_access: ප්‍රවේශය අවහිර කරන්න
           sign_up_requires_approval: ලියාපදිංචි වීම සීමා කරන්න
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index 1d69f5c57..11337f2f6 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -77,10 +77,15 @@ uk:
           warn: Сховати відфільтрований вміст за попередженням, у якому вказано заголовок фільтра
       form_admin_settings:
         activity_api_enabled: Кількість локальних опублікованих дописів, активних і нових користувачів у тижневих розрізах
+        app_icon: WEBP, PNG, GIF або JPG. Замінює іконку програми за замовчуванням на мобільних пристроях на власну іконку.
+        backups_retention_period: Користувачі мають можливість створювати архіви своїх дописів, щоб завантажити їх пізніше. Якщо встановлено додатне значення, ці архіви будуть автоматично видалені з вашого сховища через вказану кількість днів.
         bootstrap_timeline_accounts: Ці облікові записи будуть закріплені в топі пропозицій для нових користувачів.
         closed_registrations_message: Показується, коли реєстрація закрита
+        content_cache_retention_period: Усі дописи з інших серверів (включно з коментарями та відповідями) будуть видалені через певну кількість днів, незважаючи на будь-яку локальну взаємодію користувачів з цими дописами. Сюди входять дописи, які локальний користувач позначив як закладки або вибране. Приватні згадки між користувачами з різних інстанцій також будуть втрачені і не підлягатимуть відновленню. Використання цього параметра призначено для екземплярів спеціального призначення і порушує багато очікувань користувачів, якщо його застосовано для загального використання.
         custom_css: Ви можете застосувати користувацькі стилі у вебверсії Mastodon.
+        favicon: WEBP, PNG, GIF або JPG. Замінює стандартну піктограму Mastodon на власну піктограму.
         mascot: Змінює ілюстрацію в розширеному вебінтерфейсі.
+        media_cache_retention_period: Медіафайли з дописів віддалених користувачів кешуються на вашому сервері. Якщо встановлено додатне значення, медіа буде видалено через вказану кількість днів. Якщо медіа-дані будуть запитані після видалення, вони будуть завантажені повторно, якщо вихідний вміст все ще доступний. Через обмеження на частоту опитування карток попереднього перегляду посилань на сторонніх сайтах, рекомендується встановити це значення не менше 14 днів, інакше картки попереднього перегляду посилань не будуть оновлюватися на вимогу раніше цього часу.
         peers_api_enabled: Список доменів імен цього сервера з'явився у федівсесвіті. Сюди не входять дані чи ви пов'язані федерацією з цим сервером, а лише відомості, що вашому серверу відомо про нього. Його використовують служби, які збирають загальну статистику про федерації.
         profile_directory: У каталозі профілів перераховані всі користувачі, які погодились бути видимими.
         require_invite_text: Якщо реєстрація вимагає власноручного затвердження, зробіть текстове поле «Чому ви хочете приєднатися?» обов'язковим, а не додатковим
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 3ca4f0973..bafcd30de 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -934,6 +934,7 @@ th:
       delete: ลบ
       edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า
       empty: คุณยังไม่ได้กำหนดคำเตือนที่ตั้งไว้ล่วงหน้าใด ๆ
+      title: คำเตือนที่ตั้งไว้ล่วงหน้า
     webhooks:
       add_new: เพิ่มปลายทาง
       delete: ลบ
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 5baaa9387..c4f4a2638 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -291,6 +291,7 @@ uk:
         update_custom_emoji_html: "%{name} оновлює емодзі %{target}"
         update_domain_block_html: "%{name} оновлює блокування домену для %{target}"
         update_ip_block_html: "%{name} змінює правило для IP %{target}"
+        update_report_html: "%{name} оновлений звіт %{target}"
         update_status_html: "%{name} оновлює допис %{target}"
         update_user_role_html: "%{name} змінює роль %{target}"
       deleted_account: видалений обліковий запис
@@ -984,6 +985,7 @@ uk:
       delete: Видалити
       edit_preset: Редагувати шаблон попередження
       empty: Ви ще не визначили жодних попереджень.
+      title: Попереджувальні пресети
     webhooks:
       add_new: Додати кінцеву точку
       delete: Видалити

From 15480643e11b32536d9da736ad5cf357ccfb8405 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 27 May 2024 11:36:59 +0200
Subject: [PATCH 198/215] chore(deps): update dependency @types/react to
 v18.3.3 (#30441)

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 ad07e4e42..54cd764e6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3976,12 +3976,12 @@ __metadata:
   linkType: hard
 
 "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7":
-  version: 18.3.2
-  resolution: "@types/react@npm:18.3.2"
+  version: 18.3.3
+  resolution: "@types/react@npm:18.3.3"
   dependencies:
     "@types/prop-types": "npm:*"
     csstype: "npm:^3.0.2"
-  checksum: 10c0/9fb2f1fcf7e889ee4ea7c3c5978df595c66e770e5fd3a245dbdd2589b9b911524c11dab25a6275d8af4e336e4cb5fa850d447884b84c335a187a338c89df99ba
+  checksum: 10c0/fe455f805c5da13b89964c3d68060cebd43e73ec15001a68b34634604a78140e6fc202f3f61679b9d809dde6d7a7c2cb3ed51e0fd1462557911db09879b55114
   languageName: node
   linkType: hard
 

From 0ef5dc2b2047361c79fde8a3ee3c4683d7541034 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 27 May 2024 11:40:37 +0200
Subject: [PATCH 199/215] fix(deps): update dependency jsdom to v24.1.0
 (#30431)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 yarn.lock | 59 +++++++++++++++++++++++++++++++------------------------
 1 file changed, 33 insertions(+), 26 deletions(-)

diff --git a/yarn.lock b/yarn.lock
index 54cd764e6..aa0b26c02 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9392,13 +9392,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"http-proxy-agent@npm:^7.0.0":
-  version: 7.0.0
-  resolution: "http-proxy-agent@npm:7.0.0"
+"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2":
+  version: 7.0.2
+  resolution: "http-proxy-agent@npm:7.0.2"
   dependencies:
     agent-base: "npm:^7.1.0"
     debug: "npm:^4.3.4"
-  checksum: 10c0/a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8
+  checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921
   languageName: node
   linkType: hard
 
@@ -9442,13 +9442,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2":
-  version: 7.0.2
-  resolution: "https-proxy-agent@npm:7.0.2"
+"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.4":
+  version: 7.0.4
+  resolution: "https-proxy-agent@npm:7.0.4"
   dependencies:
     agent-base: "npm:^7.0.2"
     debug: "npm:4"
-  checksum: 10c0/7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77
+  checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b
   languageName: node
   linkType: hard
 
@@ -11010,36 +11010,36 @@ __metadata:
   linkType: hard
 
 "jsdom@npm:^24.0.0":
-  version: 24.0.0
-  resolution: "jsdom@npm:24.0.0"
+  version: 24.1.0
+  resolution: "jsdom@npm:24.1.0"
   dependencies:
     cssstyle: "npm:^4.0.1"
     data-urls: "npm:^5.0.0"
     decimal.js: "npm:^10.4.3"
     form-data: "npm:^4.0.0"
     html-encoding-sniffer: "npm:^4.0.0"
-    http-proxy-agent: "npm:^7.0.0"
-    https-proxy-agent: "npm:^7.0.2"
+    http-proxy-agent: "npm:^7.0.2"
+    https-proxy-agent: "npm:^7.0.4"
     is-potential-custom-element-name: "npm:^1.0.1"
-    nwsapi: "npm:^2.2.7"
+    nwsapi: "npm:^2.2.10"
     parse5: "npm:^7.1.2"
-    rrweb-cssom: "npm:^0.6.0"
+    rrweb-cssom: "npm:^0.7.0"
     saxes: "npm:^6.0.0"
     symbol-tree: "npm:^3.2.4"
-    tough-cookie: "npm:^4.1.3"
+    tough-cookie: "npm:^4.1.4"
     w3c-xmlserializer: "npm:^5.0.0"
     webidl-conversions: "npm:^7.0.0"
     whatwg-encoding: "npm:^3.1.1"
     whatwg-mimetype: "npm:^4.0.0"
     whatwg-url: "npm:^14.0.0"
-    ws: "npm:^8.16.0"
+    ws: "npm:^8.17.0"
     xml-name-validator: "npm:^5.0.0"
   peerDependencies:
     canvas: ^2.11.2
   peerDependenciesMeta:
     canvas:
       optional: true
-  checksum: 10c0/7b35043d7af39ad6dcaef0fa5679d8c8a94c6c9b6cc4a79222b7c9987d57ab7150c50856684ae56b473ab28c7d82aec0fb7ca19dcbd4c3f46683c807d717a3af
+  checksum: 10c0/34eadd8a7ae20c1505abe7a0f3988b2f0881cce7e27d75c4f5224f440f81f8ac08f4f449695b0f4178f048ed1c1709f3594e9d3f2fe0406c28e8da6eddd44f5a
   languageName: node
   linkType: hard
 
@@ -12332,10 +12332,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"nwsapi@npm:^2.2.2, nwsapi@npm:^2.2.7":
-  version: 2.2.7
-  resolution: "nwsapi@npm:2.2.7"
-  checksum: 10c0/44be198adae99208487a1c886c0a3712264f7bbafa44368ad96c003512fed2753d4e22890ca1e6edb2690c3456a169f2a3c33bfacde1905cf3bf01c7722464db
+"nwsapi@npm:^2.2.10, nwsapi@npm:^2.2.2":
+  version: 2.2.10
+  resolution: "nwsapi@npm:2.2.10"
+  checksum: 10c0/43dfa150387bd2a578e37556d0ae3330d5617f99e5a7b64e3400d4c2785620762aa6169caf8f5fbce17b7ef29c372060b602594320c374fba0a39da4163d77ed
   languageName: node
   linkType: hard
 
@@ -15264,6 +15264,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"rrweb-cssom@npm:^0.7.0":
+  version: 0.7.0
+  resolution: "rrweb-cssom@npm:0.7.0"
+  checksum: 10c0/278350b1f383f76db20e37394361b709740bd4f5f27f924e1c3c3fdd7112b2ae37ed9bc7cee63776f7df395b9b0f644d1f8be104990e3028d276a3288cd7e564
+  languageName: node
+  linkType: hard
+
 "run-parallel@npm:^1.1.9":
   version: 1.2.0
   resolution: "run-parallel@npm:1.2.0"
@@ -16933,15 +16940,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tough-cookie@npm:^4.1.2, tough-cookie@npm:^4.1.3":
-  version: 4.1.3
-  resolution: "tough-cookie@npm:4.1.3"
+"tough-cookie@npm:^4.1.2, tough-cookie@npm:^4.1.4":
+  version: 4.1.4
+  resolution: "tough-cookie@npm:4.1.4"
   dependencies:
     psl: "npm:^1.1.33"
     punycode: "npm:^2.1.1"
     universalify: "npm:^0.2.0"
     url-parse: "npm:^1.5.3"
-  checksum: 10c0/4fc0433a0cba370d57c4b240f30440c848906dee3180bb6e85033143c2726d322e7e4614abb51d42d111ebec119c4876ed8d7247d4113563033eebbc1739c831
+  checksum: 10c0/aca7ff96054f367d53d1e813e62ceb7dd2eda25d7752058a74d64b7266fd07be75908f3753a32ccf866a2f997604b414cfb1916d6e7f69bc64d9d9939b0d6c45
   languageName: node
   linkType: hard
 
@@ -18355,7 +18362,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ws@npm:^8.11.0, ws@npm:^8.12.1, ws@npm:^8.16.0":
+"ws@npm:^8.11.0, ws@npm:^8.12.1, ws@npm:^8.17.0":
   version: 8.17.0
   resolution: "ws@npm:8.17.0"
   peerDependencies:

From 87156f57b5b7b71be8a40e9cc568a87583b55144 Mon Sep 17 00:00:00 2001
From: Nick Schonning <nschonni@gmail.com>
Date: Mon, 27 May 2024 05:41:45 -0400
Subject: [PATCH 200/215] Enable Style/StringConcatenation (#30428)

---
 .rubocop_todo.yml                | 6 ------
 config/initializers/paperclip.rb | 4 ++--
 2 files changed, 2 insertions(+), 8 deletions(-)

diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 064f62208..a70caad8c 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -176,12 +176,6 @@ Style/SafeNavigation:
   Exclude:
     - 'app/models/concerns/account/finder_concern.rb'
 
-# This cop supports unsafe autocorrection (--autocorrect-all).
-# Configuration parameters: Mode.
-Style/StringConcatenation:
-  Exclude:
-    - 'config/initializers/paperclip.rb'
-
 # This cop supports safe autocorrection (--autocorrect).
 # Configuration parameters: WordRegex.
 # SupportedStyles: percent, brackets
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index b54fc6cf0..5b9365a53 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -13,7 +13,7 @@ end
 
 Paperclip.interpolates :prefix_path do |attachment, _style|
   if attachment.storage_schema_version >= 1 && attachment.instance.respond_to?(:local?) && !attachment.instance.local?
-    'cache' + File::SEPARATOR
+    "cache#{File::SEPARATOR}"
   else
     ''
   end
@@ -159,7 +159,7 @@ else
   Paperclip::Attachment.default_options.merge!(
     storage: :filesystem,
     path: File.join(ENV.fetch('PAPERCLIP_ROOT_PATH', File.join(':rails_root', 'public', 'system')), ':prefix_path:class', ':attachment', ':id_partition', ':style', ':filename'),
-    url: ENV.fetch('PAPERCLIP_ROOT_URL', '/system') + '/:prefix_url:class/:attachment/:id_partition/:style/:filename'
+    url: "#{ENV.fetch('PAPERCLIP_ROOT_URL', '/system')}/:prefix_url:class/:attachment/:id_partition/:style/:filename"
   )
 end
 

From c61e356475cf5df85f067a951abf404b93795f19 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Mon, 27 May 2024 05:49:44 -0400
Subject: [PATCH 201/215] Add `Status::MEDIA_ATTACHMENTS_LIMIT` configuration
 constant (#30433)

---
 app/lib/activitypub/activity/create.rb                    | 4 ++--
 app/models/status.rb                                      | 2 ++
 app/serializers/rest/instance_serializer.rb               | 2 +-
 app/serializers/rest/v1/instance_serializer.rb            | 2 +-
 app/services/activitypub/process_status_update_service.rb | 2 +-
 app/services/post_status_service.rb                       | 4 ++--
 app/services/update_status_service.rb                     | 4 ++--
 spec/requests/api/v2/instance_spec.rb                     | 2 +-
 spec/services/post_status_service_spec.rb                 | 5 +++--
 9 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 85195f4c3..7ec7e84bd 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -110,7 +110,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
   def process_status_params
     @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url, object: @object)
 
-    attachment_ids = process_attachments.take(4).map(&:id)
+    attachment_ids = process_attachments.take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:id)
 
     @params = {
       uri: @status_parser.uri,
@@ -260,7 +260,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     as_array(@object['attachment']).each do |attachment|
       media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment)
 
-      next if media_attachment_parser.remote_url.blank? || media_attachments.size >= 4
+      next if media_attachment_parser.remote_url.blank? || media_attachments.size >= Status::MEDIA_ATTACHMENTS_LIMIT
 
       begin
         media_attachment = MediaAttachment.create(
diff --git a/app/models/status.rb b/app/models/status.rb
index 72a8d6c40..9d09fa5fe 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -39,6 +39,8 @@ class Status < ApplicationRecord
   include Status::SnapshotConcern
   include Status::ThreadingConcern
 
+  MEDIA_ATTACHMENTS_LIMIT = 4
+
   rate_limit by: :account, family: :statuses
 
   self.discard_column = :deleted_at
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index 42b73f438..8df79db6c 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -59,7 +59,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
 
       statuses: {
         max_characters: StatusLengthValidator::MAX_CHARS,
-        max_media_attachments: 4,
+        max_media_attachments: Status::MEDIA_ATTACHMENTS_LIMIT,
         characters_reserved_per_url: StatusLengthValidator::URL_PLACEHOLDER_CHARS,
       },
 
diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb
index fdf939cfc..636925b97 100644
--- a/app/serializers/rest/v1/instance_serializer.rb
+++ b/app/serializers/rest/v1/instance_serializer.rb
@@ -64,7 +64,7 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer
 
       statuses: {
         max_characters: StatusLengthValidator::MAX_CHARS,
-        max_media_attachments: 4,
+        max_media_attachments: Status::MEDIA_ATTACHMENTS_LIMIT,
         characters_reserved_per_url: StatusLengthValidator::URL_PLACEHOLDER_CHARS,
       },
 
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index fb2b33114..1dbed27f2 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -73,7 +73,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
     as_array(@json['attachment']).each do |attachment|
       media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment)
 
-      next if media_attachment_parser.remote_url.blank? || @next_media_attachments.size > 4
+      next if media_attachment_parser.remote_url.blank? || @next_media_attachments.size > Status::MEDIA_ATTACHMENTS_LIMIT
 
       begin
         media_attachment   = previous_media_attachments.find { |previous_media_attachment| previous_media_attachment.remote_url == media_attachment_parser.remote_url }
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 22a6a24af..83a931817 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -130,9 +130,9 @@ class PostStatusService < BaseService
       return
     end
 
-    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > 4 || @options[:poll].present?
+    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > Status::MEDIA_ATTACHMENTS_LIMIT || @options[:poll].present?
 
-    @media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(4).map(&:to_i))
+    @media = @account.media_attachments.where(status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i))
 
     raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:audio_or_video?)
     raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if @media.any?(&:not_processed?)
diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb
index cdfe28365..dc7d177e2 100644
--- a/app/services/update_status_service.rb
+++ b/app/services/update_status_service.rb
@@ -69,9 +69,9 @@ class UpdateStatusService < BaseService
   def validate_media!
     return [] if @options[:media_ids].blank? || !@options[:media_ids].is_a?(Enumerable)
 
-    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > 4 || @options[:poll].present?
+    raise Mastodon::ValidationError, I18n.t('media_attachments.validations.too_many') if @options[:media_ids].size > Status::MEDIA_ATTACHMENTS_LIMIT || @options[:poll].present?
 
-    media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(4).map(&:to_i)).to_a
+    media_attachments = @status.account.media_attachments.where(status_id: [nil, @status.id]).where(scheduled_status_id: nil).where(id: @options[:media_ids].take(Status::MEDIA_ATTACHMENTS_LIMIT).map(&:to_i)).to_a
 
     raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if media_attachments.size > 1 && media_attachments.find(&:audio_or_video?)
     raise Mastodon::ValidationError, I18n.t('media_attachments.validations.not_ready') if media_attachments.any?(&:not_processed?)
diff --git a/spec/requests/api/v2/instance_spec.rb b/spec/requests/api/v2/instance_spec.rb
index c5c6a26f4..5c464f09a 100644
--- a/spec/requests/api/v2/instance_spec.rb
+++ b/spec/requests/api/v2/instance_spec.rb
@@ -45,7 +45,7 @@ describe 'Instances' do
           ),
           statuses: include(
             max_characters: StatusLengthValidator::MAX_CHARS,
-            max_media_attachments: 4 # TODO, move to constant somewhere
+            max_media_attachments: Status::MEDIA_ATTACHMENTS_LIMIT
           ),
           polls: include(
             max_options: PollValidator::MAX_OPTIONS
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 18891bf11..11bf4c30e 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -228,14 +228,15 @@ RSpec.describe PostStatusService do
     expect(media.reload.status).to be_nil
   end
 
-  it 'does not allow attaching more than 4 files' do
+  it 'does not allow attaching more files than configured limit' do
+    stub_const('Status::MEDIA_ATTACHMENTS_LIMIT', 1)
     account = Fabricate(:account)
 
     expect do
       subject.call(
         account,
         text: 'test status update',
-        media_ids: Array.new(5) { Fabricate(:media_attachment, account: account) }.map(&:id)
+        media_ids: Array.new(2) { Fabricate(:media_attachment, account: account) }.map(&:id)
       )
     end.to raise_error(
       Mastodon::ValidationError,

From ed99923138311fa07d4185a9132c72e618fd21fd Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 27 May 2024 11:57:19 +0200
Subject: [PATCH 202/215] chore(deps): update eslint (non-major) (#30444)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
 package.json |   2 +-
 yarn.lock    | 197 ++++++++++++++++++---------------------------------
 2 files changed, 70 insertions(+), 129 deletions(-)

diff --git a/package.json b/package.json
index f38076d4c..f84d45c32 100644
--- a/package.json
+++ b/package.json
@@ -178,7 +178,7 @@
     "eslint-plugin-import": "~2.29.0",
     "eslint-plugin-jsdoc": "^48.0.0",
     "eslint-plugin-jsx-a11y": "~6.8.0",
-    "eslint-plugin-promise": "~6.1.1",
+    "eslint-plugin-promise": "~6.2.0",
     "eslint-plugin-react": "^7.33.2",
     "eslint-plugin-react-hooks": "^4.6.0",
     "husky": "^9.0.11",
diff --git a/yarn.lock b/yarn.lock
index aa0b26c02..da5bf1dca 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2248,16 +2248,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@formatjs/ecma402-abstract@npm:1.18.2":
-  version: 1.18.2
-  resolution: "@formatjs/ecma402-abstract@npm:1.18.2"
-  dependencies:
-    "@formatjs/intl-localematcher": "npm:0.5.4"
-    tslib: "npm:^2.4.0"
-  checksum: 10c0/87afb37dd937555e712ca85d5142a9083d617c491d1dddf8d660fdfb6186272d2bc75b78809b076388d26f016200c8bddbce73281fd707eb899da2bf3bc9b7ca
-  languageName: node
-  linkType: hard
-
 "@formatjs/ecma402-abstract@npm:2.0.0":
   version: 2.0.0
   resolution: "@formatjs/ecma402-abstract@npm:2.0.0"
@@ -2277,17 +2267,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@formatjs/icu-messageformat-parser@npm:2.7.6":
-  version: 2.7.6
-  resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6"
-  dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
-    "@formatjs/icu-skeleton-parser": "npm:1.8.0"
-    tslib: "npm:^2.4.0"
-  checksum: 10c0/9fc72c2075333a969601e2be4260638940b1abefd1a5fc15b93b0b10d2319c9df5778aa51fc2a173ce66ca5e8a47b4b64caca85a32d0eb6095e16e8d65cb4b00
-  languageName: node
-  linkType: hard
-
 "@formatjs/icu-messageformat-parser@npm:2.7.8":
   version: 2.7.8
   resolution: "@formatjs/icu-messageformat-parser@npm:2.7.8"
@@ -2299,16 +2278,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@formatjs/icu-skeleton-parser@npm:1.8.0":
-  version: 1.8.0
-  resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0"
-  dependencies:
-    "@formatjs/ecma402-abstract": "npm:1.18.2"
-    tslib: "npm:^2.4.0"
-  checksum: 10c0/10956732d70cc67049d216410b5dc3ef048935d1ea2ae76f5755bb9d0243af37ddeabd5d140ddbf5f6c7047068c3d02a05f93c68a89cedfaf7488d5062885ea4
-  languageName: node
-  linkType: hard
-
 "@formatjs/icu-skeleton-parser@npm:1.8.2":
   version: 1.8.2
   resolution: "@formatjs/icu-skeleton-parser@npm:1.8.2"
@@ -2381,26 +2350,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@formatjs/ts-transformer@npm:3.13.12":
-  version: 3.13.12
-  resolution: "@formatjs/ts-transformer@npm:3.13.12"
-  dependencies:
-    "@formatjs/icu-messageformat-parser": "npm:2.7.6"
-    "@types/json-stable-stringify": "npm:^1.0.32"
-    "@types/node": "npm:14 || 16 || 17"
-    chalk: "npm:^4.0.0"
-    json-stable-stringify: "npm:^1.0.1"
-    tslib: "npm:^2.4.0"
-    typescript: "npm:5"
-  peerDependencies:
-    ts-jest: ">=27"
-  peerDependenciesMeta:
-    ts-jest:
-      optional: true
-  checksum: 10c0/68f72ee6379b87b7ef6340e118a5370cb2fa18cbbae08f5f3d10893803a52f0533e644002e0b5e9ffeded5b2f0aa9daad6adf8b487b10f5d2b61f9fb3fed0dbd
-  languageName: node
-  linkType: hard
-
 "@formatjs/ts-transformer@npm:3.13.14":
   version: 3.13.14
   resolution: "@formatjs/ts-transformer@npm:3.13.14"
@@ -2873,7 +2822,7 @@ __metadata:
     eslint-plugin-import: "npm:~2.29.0"
     eslint-plugin-jsdoc: "npm:^48.0.0"
     eslint-plugin-jsx-a11y: "npm:~6.8.0"
-    eslint-plugin-promise: "npm:~6.1.1"
+    eslint-plugin-promise: "npm:~6.2.0"
     eslint-plugin-react: "npm:^7.33.2"
     eslint-plugin-react-hooks: "npm:^4.6.0"
     file-loader: "npm:^6.2.0"
@@ -3733,7 +3682,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8":
+"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8":
   version: 7.0.15
   resolution: "@types/json-schema@npm:7.0.15"
   checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db
@@ -4009,7 +3958,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/semver@npm:^7.5.0, @types/semver@npm:^7.5.8":
+"@types/semver@npm:^7.5.0":
   version: 7.5.8
   resolution: "@types/semver@npm:7.5.8"
   checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa
@@ -4160,19 +4109,17 @@ __metadata:
   linkType: hard
 
 "@typescript-eslint/eslint-plugin@npm:^7.0.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/eslint-plugin@npm:7.8.0"
+  version: 7.10.0
+  resolution: "@typescript-eslint/eslint-plugin@npm:7.10.0"
   dependencies:
     "@eslint-community/regexpp": "npm:^4.10.0"
-    "@typescript-eslint/scope-manager": "npm:7.8.0"
-    "@typescript-eslint/type-utils": "npm:7.8.0"
-    "@typescript-eslint/utils": "npm:7.8.0"
-    "@typescript-eslint/visitor-keys": "npm:7.8.0"
-    debug: "npm:^4.3.4"
+    "@typescript-eslint/scope-manager": "npm:7.10.0"
+    "@typescript-eslint/type-utils": "npm:7.10.0"
+    "@typescript-eslint/utils": "npm:7.10.0"
+    "@typescript-eslint/visitor-keys": "npm:7.10.0"
     graphemer: "npm:^1.4.0"
     ignore: "npm:^5.3.1"
     natural-compare: "npm:^1.4.0"
-    semver: "npm:^7.6.0"
     ts-api-utils: "npm:^1.3.0"
   peerDependencies:
     "@typescript-eslint/parser": ^7.0.0
@@ -4180,25 +4127,25 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/37ca22620d1834ff0baa28fa4b8fd92039a3903cb95748353de32d56bae2a81ce50d1bbaed27487eebc884e0a0f9387fcb0f1647593e4e6df5111ef674afa9f0
+  checksum: 10c0/bf3f0118ea5961c3eb01894678246458a329d82dda9ac7c2f5bfe77896410d05a08a4655e533bcb1ed2a3132ba6421981ec8c2ed0a3545779d9603ea231947ae
   languageName: node
   linkType: hard
 
 "@typescript-eslint/parser@npm:^7.0.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/parser@npm:7.8.0"
+  version: 7.10.0
+  resolution: "@typescript-eslint/parser@npm:7.10.0"
   dependencies:
-    "@typescript-eslint/scope-manager": "npm:7.8.0"
-    "@typescript-eslint/types": "npm:7.8.0"
-    "@typescript-eslint/typescript-estree": "npm:7.8.0"
-    "@typescript-eslint/visitor-keys": "npm:7.8.0"
+    "@typescript-eslint/scope-manager": "npm:7.10.0"
+    "@typescript-eslint/types": "npm:7.10.0"
+    "@typescript-eslint/typescript-estree": "npm:7.10.0"
+    "@typescript-eslint/visitor-keys": "npm:7.10.0"
     debug: "npm:^4.3.4"
   peerDependencies:
     eslint: ^8.56.0
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/0dd994c1b31b810c25e1b755b8d352debb7bf21a31f9a91acaec34acf4e471320bcceaa67cf64c110c0b8f5fac10a037dbabac6ec423e17adf037e59a7bce9c1
+  checksum: 10c0/4c4fbf43b5b05d75b766acb803d3dd078c6e080641a77f9e48ba005713466738ea4a71f0564fa3ce520988d65158d14c8c952ba01ccbc431ab4a05935db5ce6d
   languageName: node
   linkType: hard
 
@@ -4212,22 +4159,22 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/scope-manager@npm:7.8.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/scope-manager@npm:7.8.0"
+"@typescript-eslint/scope-manager@npm:7.10.0":
+  version: 7.10.0
+  resolution: "@typescript-eslint/scope-manager@npm:7.10.0"
   dependencies:
-    "@typescript-eslint/types": "npm:7.8.0"
-    "@typescript-eslint/visitor-keys": "npm:7.8.0"
-  checksum: 10c0/c253b98e96d4bf0375f473ca2c4d081726f1fd926cdfa65ee14c9ee99cca8eddb763b2d238ac365daa7246bef21b0af38180d04e56e9df7443c0e6f8474d097c
+    "@typescript-eslint/types": "npm:7.10.0"
+    "@typescript-eslint/visitor-keys": "npm:7.10.0"
+  checksum: 10c0/1d4f7ee137b95bd423b5a1b0d03251202dfc19bd8b6adfa5ff5df25fd5aa30e2d8ca50ab0d8d2e92441670ecbc2a82b3c2dbe39a4f268ec1ee1c1e267f7fd1d1
   languageName: node
   linkType: hard
 
-"@typescript-eslint/type-utils@npm:7.8.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/type-utils@npm:7.8.0"
+"@typescript-eslint/type-utils@npm:7.10.0":
+  version: 7.10.0
+  resolution: "@typescript-eslint/type-utils@npm:7.10.0"
   dependencies:
-    "@typescript-eslint/typescript-estree": "npm:7.8.0"
-    "@typescript-eslint/utils": "npm:7.8.0"
+    "@typescript-eslint/typescript-estree": "npm:7.10.0"
+    "@typescript-eslint/utils": "npm:7.10.0"
     debug: "npm:^4.3.4"
     ts-api-utils: "npm:^1.3.0"
   peerDependencies:
@@ -4235,7 +4182,7 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/00f6315626b64f7dbc1f7fba6f365321bb8d34141ed77545b2a07970e59a81dbdf768c1e024225ea00953750d74409ddd8a16782fc4a39261e507c04192dacab
+  checksum: 10c0/55e9a6690f9cedb79d30abb1990b161affaa2684dac246b743223353812c9c1e3fd2d923c67b193c6a3624a07e1c82c900ce7bf5b6b9891c846f04cb480ebd9f
   languageName: node
   linkType: hard
 
@@ -4246,10 +4193,10 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/types@npm:7.8.0, @typescript-eslint/types@npm:^7.2.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/types@npm:7.8.0"
-  checksum: 10c0/b2fdbfc21957bfa46f7d8809b607ad8c8b67c51821d899064d09392edc12f28b2318a044f0cd5d523d782e84e8f0558778877944964cf38e139f88790cf9d466
+"@typescript-eslint/types@npm:7.10.0, @typescript-eslint/types@npm:^7.2.0":
+  version: 7.10.0
+  resolution: "@typescript-eslint/types@npm:7.10.0"
+  checksum: 10c0/f01d9330b93cc362ba7967ab5037396f64742076450e1f93139fa69cbe93a6ece3ed55d68ab780c9b7d07ef4a7c645da410305216a2cfc5dec7eba49ee65ab23
   languageName: node
   linkType: hard
 
@@ -4272,12 +4219,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/typescript-estree@npm:7.8.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/typescript-estree@npm:7.8.0"
+"@typescript-eslint/typescript-estree@npm:7.10.0":
+  version: 7.10.0
+  resolution: "@typescript-eslint/typescript-estree@npm:7.10.0"
   dependencies:
-    "@typescript-eslint/types": "npm:7.8.0"
-    "@typescript-eslint/visitor-keys": "npm:7.8.0"
+    "@typescript-eslint/types": "npm:7.10.0"
+    "@typescript-eslint/visitor-keys": "npm:7.10.0"
     debug: "npm:^4.3.4"
     globby: "npm:^11.1.0"
     is-glob: "npm:^4.0.3"
@@ -4287,24 +4234,21 @@ __metadata:
   peerDependenciesMeta:
     typescript:
       optional: true
-  checksum: 10c0/1690b62679685073dcb0f62499f0b52b445b37ae6e12d02aa4acbafe3fb023cf999b01f714b6282e88f84fd934fe3e2eefb21a64455d19c348d22bbc68ca8e47
+  checksum: 10c0/6200695834c566e52e2fa7331f1a05019f7815969d8c1e1e237b85a99664d36f41ccc16384eff3f8582a0ecb75f1cc315b56ee9283b818da37f24fa4d42f1d7a
   languageName: node
   linkType: hard
 
-"@typescript-eslint/utils@npm:7.8.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/utils@npm:7.8.0"
+"@typescript-eslint/utils@npm:7.10.0":
+  version: 7.10.0
+  resolution: "@typescript-eslint/utils@npm:7.10.0"
   dependencies:
     "@eslint-community/eslint-utils": "npm:^4.4.0"
-    "@types/json-schema": "npm:^7.0.15"
-    "@types/semver": "npm:^7.5.8"
-    "@typescript-eslint/scope-manager": "npm:7.8.0"
-    "@typescript-eslint/types": "npm:7.8.0"
-    "@typescript-eslint/typescript-estree": "npm:7.8.0"
-    semver: "npm:^7.6.0"
+    "@typescript-eslint/scope-manager": "npm:7.10.0"
+    "@typescript-eslint/types": "npm:7.10.0"
+    "@typescript-eslint/typescript-estree": "npm:7.10.0"
   peerDependencies:
     eslint: ^8.56.0
-  checksum: 10c0/31fb58388d15b082eb7bd5bce889cc11617aa1131dfc6950471541b3df64c82d1c052e2cccc230ca4ae80456d4f63a3e5dccb79899a8f3211ce36c089b7d7640
+  checksum: 10c0/6724471f94f2788f59748f7efa2a3a53ea910099993bee2fa5746ab5acacecdc9fcb110c568b18099ddc946ea44919ed394bff2bd055ba81fc69f5e6297b73bf
   languageName: node
   linkType: hard
 
@@ -4335,13 +4279,13 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@typescript-eslint/visitor-keys@npm:7.8.0":
-  version: 7.8.0
-  resolution: "@typescript-eslint/visitor-keys@npm:7.8.0"
+"@typescript-eslint/visitor-keys@npm:7.10.0":
+  version: 7.10.0
+  resolution: "@typescript-eslint/visitor-keys@npm:7.10.0"
   dependencies:
-    "@typescript-eslint/types": "npm:7.8.0"
+    "@typescript-eslint/types": "npm:7.10.0"
     eslint-visitor-keys: "npm:^3.4.3"
-  checksum: 10c0/5892fb5d9c58efaf89adb225f7dbbb77f9363961f2ff420b6b130bdd102dddd7aa8a16c46a5a71c19889d27b781e966119a89270555ea2cb5653a04d8994123d
+  checksum: 10c0/049e812bcd28869059d04c7bf3543bb55f5205f468b777439c4f120417fb856fb6024cb1d25291aa12556bd08e84f043a96d754ffb2cde37abb604d6f3c51634
   languageName: node
   linkType: hard
 
@@ -7825,11 +7769,11 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-formatjs@npm:^4.10.1":
-  version: 4.13.1
-  resolution: "eslint-plugin-formatjs@npm:4.13.1"
+  version: 4.13.3
+  resolution: "eslint-plugin-formatjs@npm:4.13.3"
   dependencies:
-    "@formatjs/icu-messageformat-parser": "npm:2.7.6"
-    "@formatjs/ts-transformer": "npm:3.13.12"
+    "@formatjs/icu-messageformat-parser": "npm:2.7.8"
+    "@formatjs/ts-transformer": "npm:3.13.14"
     "@types/eslint": "npm:7 || 8"
     "@types/picomatch": "npm:^2.3.0"
     "@typescript-eslint/utils": "npm:^6.18.1"
@@ -7841,7 +7785,7 @@ __metadata:
     unicode-emoji-utils: "npm:^1.2.0"
   peerDependencies:
     eslint: 7 || 8
-  checksum: 10c0/ce18141dff84e8fe026127085c1a63279acb3a1bc0b70dc1ddce2fc65bb37d68ccf6d097231428745eda2caea42080e1c80a01a1895803155c15123a01bfeee3
+  checksum: 10c0/5e98f487a097189e3bdc64b678d19f4c83502c32d7c89a8959eda4ed9cb664bf16f13ad8871be89ca192cb39c1007d6a158c39bbf5b23c56962d949dbe9abfab
   languageName: node
   linkType: hard
 
@@ -7873,8 +7817,8 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-jsdoc@npm:^48.0.0":
-  version: 48.2.4
-  resolution: "eslint-plugin-jsdoc@npm:48.2.4"
+  version: 48.2.6
+  resolution: "eslint-plugin-jsdoc@npm:48.2.6"
   dependencies:
     "@es-joy/jsdoccomment": "npm:~0.43.0"
     are-docs-informative: "npm:^0.0.2"
@@ -7882,12 +7826,11 @@ __metadata:
     debug: "npm:^4.3.4"
     escape-string-regexp: "npm:^4.0.0"
     esquery: "npm:^1.5.0"
-    is-builtin-module: "npm:^3.2.1"
-    semver: "npm:^7.6.0"
+    semver: "npm:^7.6.1"
     spdx-expression-parse: "npm:^4.0.0"
   peerDependencies:
     eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
-  checksum: 10c0/601c9d6ee41de56102c7813106ceb0b8b8342223670f7add010a8f89753c250cde4cc93e353e3911b7b29677f2634f3f4be45f27abb7a95c6fdbd058adfa3343
+  checksum: 10c0/9f01b3000aa31f17767786c62caf62f1e8c4b88bfef04b207d3b1de785be287cc2da3ad16ed32afacd5f6e6a9b76ebf3369069be416ce2228c44cd6d084fcd8f
   languageName: node
   linkType: hard
 
@@ -7917,12 +7860,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"eslint-plugin-promise@npm:~6.1.1":
-  version: 6.1.1
-  resolution: "eslint-plugin-promise@npm:6.1.1"
+"eslint-plugin-promise@npm:~6.2.0":
+  version: 6.2.0
+  resolution: "eslint-plugin-promise@npm:6.2.0"
   peerDependencies:
-    eslint: ^7.0.0 || ^8.0.0
-  checksum: 10c0/ec705741c110cd1cb4d702776e1c7f7fe60b671b71f706c88054ab443cf2767aae5a663928fb426373ba1095eaeda312a740a4f880546631f0e0727f298b3393
+    eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+  checksum: 10c0/5f42ee774023c089453ecb792076c64c6d0739ea6e9d6cdc9d6a63da5ba928c776e349d01cc110548f2c67045ec55343136aa7eb8b486e4ab145ac016c06a492
   languageName: node
   linkType: hard
 
@@ -15487,14 +15430,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0":
-  version: 7.6.0
-  resolution: "semver@npm:7.6.0"
-  dependencies:
-    lru-cache: "npm:^6.0.0"
+"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.1":
+  version: 7.6.2
+  resolution: "semver@npm:7.6.2"
   bin:
     semver: bin/semver.js
-  checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53
+  checksum: 10c0/97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c
   languageName: node
   linkType: hard
 

From 32c30bf0fdc8c0d57f4e272a7827daa39faa6313 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 28 May 2024 10:05:37 +0200
Subject: [PATCH 203/215] New Crowdin Translations (automated) (#30452)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 config/locales/lt.yml | 18 ++++++++++++++++++
 config/locales/vi.yml |  1 +
 2 files changed, 19 insertions(+)

diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index f3d71bf6e..77fcf4286 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -345,6 +345,8 @@ lt:
       shortcode: Trumpas kodas
       shortcode_hint: Bent du ženklai, tik raidiniai skaitmeniniai ženklai bei akcentai(_)
       title: Asmeniniai jaustukai
+      uncategorized: Be kategorijos
+      unlist: Išbraukti iš sąrašo
       unlisted: Neįtrauktas į sąrašą
       update_failed_msg: Jaustukas negalėjo būti pakeistas
       updated_msg: Jaustukas sėkmingai pakeistas!
@@ -392,8 +394,16 @@ lt:
       created_msg: Domenas buvo sėkmingai leistas federacijai.
       destroyed_msg: Domenas buvo neleistas federacijai.
       export: Eksportuoti
+      import: Importuoti
+      undo: Neleisti federavimo su domenu
     domain_blocks:
       add_new: Pridėti naują domeno bloką
+      confirm_suspension:
+        cancel: Atšaukti
+        confirm: Pristabdyti
+        permanent_action: Atšaukus pristabdymą jokie duomenys ar sąryšiai nebus atkurti.
+        preamble_html: Jūs pristabdysite <strong>%{domain}</strong> ir jo subdomenus.
+        remove_all_data: Taip iš serverio bus pašalintas visas šio domeno paskyrų turinys, medija ir profilio duomenys.
       created_msg: Domeno užblokavimas nagrinėjamas
       destroyed_msg: Domeno blokas pašalintas
       domain: Domenas
@@ -411,6 +421,7 @@ lt:
           silence: Riboti
           suspend: Pristabdyti
         title: Naujos domeno blokas
+      private_comment: Privatus komentaras
       public_comment: Viešas komentaras
       public_comment_hint: Komentaras apie šį domeno apribojimą plačiajai visuomenei, jei įjungtas domenų apribojimų sąrašo reklamavimas.
       reject_media: Atmesti medijos failus
@@ -418,6 +429,7 @@ lt:
       reject_reports: Atmesti ataskaitas
       reject_reports_hint: Ignoruoti visus skundus, kurie siunčiami iš šio domeno. Neliečia užblokavimu
       undo: Atkurti domeno bloką
+      view: Peržiūrėti domeno bloką
     email_domain_blocks:
       add_new: Pridėti naują
       allow_registrations_with_approval: Leisti registracijas su patvirtinimu
@@ -429,10 +441,16 @@ lt:
         title: Naujas el pašto juodojo sąrašo įtraukimas
       title: El pašto juodasis sąrašas
     instances:
+      availability:
+        title: Prieinamumas
       back_to_all: Visi
+      back_to_limited: Apribotas
+      back_to_warning: Įspėjimas
       by_domain: Domenas
       content_policies:
+        policy: Politika
         reason: Viešoji priežastis
+        title: Turinio politika
       delivery:
         all: Visi
       delivery_available: Pristatymas galimas
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 4265c1a33..459d1bb0d 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -934,6 +934,7 @@ vi:
       delete: Xóa bỏ
       edit_preset: Sửa mẫu có sẵn
       empty: Bạn chưa thêm mẫu cảnh cáo nào cả.
+      title: Cảnh báo cài sẵn
     webhooks:
       add_new: Thêm endpoint
       delete: Xóa bỏ

From 4a77e477ee50f69160cecec25a68ee88b53dfcf8 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Tue, 28 May 2024 10:11:31 -0400
Subject: [PATCH 204/215] Consolidate account scopes for `LOWER` (index using)
 username/domain queries (#30451)

---
 app/models/account.rb                         |  2 +
 .../account_suggestions/setting_source.rb     | 10 ++---
 app/models/concerns/account/finder_concern.rb | 41 +++----------------
 .../concerns/user/ldap_authenticable.rb       |  2 +-
 app/services/report_service.rb                |  2 +-
 app/validators/unique_username_validator.rb   |  5 +--
 6 files changed, 14 insertions(+), 48 deletions(-)

diff --git a/app/models/account.rb b/app/models/account.rb
index 3c533822f..8a990bb83 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -142,6 +142,8 @@ class Account < ApplicationRecord
   scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) }
   scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) }
   scope :dormant, -> { joins(:account_stat).merge(AccountStat.without_recent_activity) }
+  scope :with_username, ->(value) { where arel_table[:username].lower.eq(value.to_s.downcase) }
+  scope :with_domain, ->(value) { where arel_table[:domain].lower.eq(value&.to_s&.downcase) }
 
   after_update_commit :trigger_update_webhooks
 
diff --git a/app/models/account_suggestions/setting_source.rb b/app/models/account_suggestions/setting_source.rb
index 9f3cd7bd3..614348172 100644
--- a/app/models/account_suggestions/setting_source.rb
+++ b/app/models/account_suggestions/setting_source.rb
@@ -3,7 +3,7 @@
 class AccountSuggestions::SettingSource < AccountSuggestions::Source
   def get(account, limit: DEFAULT_LIMIT)
     if setting_enabled?
-      base_account_scope(account).where(setting_to_where_condition).limit(limit).pluck(:id).zip([key].cycle)
+      base_account_scope(account).merge(setting_to_where_condition).limit(limit).pluck(:id).zip([key].cycle)
     else
       []
     end
@@ -25,11 +25,9 @@ class AccountSuggestions::SettingSource < AccountSuggestions::Source
 
   def setting_to_where_condition
     usernames_and_domains.map do |(username, domain)|
-      Arel::Nodes::Grouping.new(
-        Account.arel_table[:username].lower.eq(username.downcase).and(
-          Account.arel_table[:domain].lower.eq(domain&.downcase)
-        )
-      )
+      Account
+        .with_username(username)
+        .with_domain(domain)
     end.reduce(:or)
   end
 
diff --git a/app/models/concerns/account/finder_concern.rb b/app/models/concerns/account/finder_concern.rb
index a7acff1cb..249a7b5fd 100644
--- a/app/models/concerns/account/finder_concern.rb
+++ b/app/models/concerns/account/finder_concern.rb
@@ -25,42 +25,11 @@ module Account::FinderConcern
     end
 
     def find_remote(username, domain)
-      AccountFinder.new(username, domain).account
-    end
-  end
-
-  class AccountFinder
-    attr_reader :username, :domain
-
-    def initialize(username, domain)
-      @username = username
-      @domain = domain
-    end
-
-    def account
-      scoped_accounts.order(id: :asc).take
-    end
-
-    private
-
-    def scoped_accounts
-      Account.unscoped.tap do |scope|
-        scope.merge! with_usernames
-        scope.merge! matching_username
-        scope.merge! matching_domain
-      end
-    end
-
-    def with_usernames
-      Account.where.not(Account.arel_table[:username].lower.eq '')
-    end
-
-    def matching_username
-      Account.where(Account.arel_table[:username].lower.eq username.to_s.downcase)
-    end
-
-    def matching_domain
-      Account.where(Account.arel_table[:domain].lower.eq(domain.nil? ? nil : domain.to_s.downcase))
+      Account
+        .with_username(username)
+        .with_domain(domain)
+        .order(id: :asc)
+        .take
     end
   end
 end
diff --git a/app/models/concerns/user/ldap_authenticable.rb b/app/models/concerns/user/ldap_authenticable.rb
index c8e9fa934..fc1ee78d0 100644
--- a/app/models/concerns/user/ldap_authenticable.rb
+++ b/app/models/concerns/user/ldap_authenticable.rb
@@ -22,7 +22,7 @@ module User::LdapAuthenticable
         safe_username = safe_username.gsub(keys, replacement)
       end
 
-      resource = joins(:account).merge(Account.where(Account.arel_table[:username].lower.eq safe_username.downcase)).take
+      resource = joins(:account).merge(Account.with_username(safe_username)).take
 
       if resource.blank?
         resource = new(
diff --git a/app/services/report_service.rb b/app/services/report_service.rb
index fe546c383..dea6df7b0 100644
--- a/app/services/report_service.rb
+++ b/app/services/report_service.rb
@@ -81,7 +81,7 @@ class ReportService < BaseService
 
     # If the account making reports is remote, it is likely anonymized so we have to relax the requirements for attaching statuses.
     domain = @source_account.domain.to_s.downcase
-    has_followers = @target_account.followers.where(Account.arel_table[:domain].lower.eq(domain)).exists?
+    has_followers = @target_account.followers.with_domain(domain).exists?
     visibility = has_followers ? %i(public unlisted private) : %i(public unlisted)
     scope = @target_account.statuses.with_discarded
     scope.merge!(scope.where(visibility: visibility).or(scope.where('EXISTS (SELECT 1 FROM mentions m JOIN accounts a ON m.account_id = a.id WHERE lower(a.domain) = ?)', domain)))
diff --git a/app/validators/unique_username_validator.rb b/app/validators/unique_username_validator.rb
index 09c8fadb5..c417e2f69 100644
--- a/app/validators/unique_username_validator.rb
+++ b/app/validators/unique_username_validator.rb
@@ -6,10 +6,7 @@ class UniqueUsernameValidator < ActiveModel::Validator
   def validate(account)
     return if account.username.blank?
 
-    normalized_username = account.username.downcase
-    normalized_domain = account.domain&.downcase
-
-    scope = Account.where(Account.arel_table[:username].lower.eq normalized_username).where(Account.arel_table[:domain].lower.eq normalized_domain)
+    scope = Account.with_username(account.username).with_domain(account.domain)
     scope = scope.where.not(id: account.id) if account.persisted?
 
     account.errors.add(:username, :taken) if scope.exists?

From 128987ededcbcdf73529d98a4f11c747b2bbe892 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 29 May 2024 01:34:33 +0200
Subject: [PATCH 205/215] Add support for `fediverse:creator` OpenGraph tag
 (#30398)

---
 .../api/v1/conversations_controller.rb        |  8 ++--
 .../features/status/components/card.jsx       | 32 +++++++++++---
 app/javascript/mastodon/locales/en.json       |  1 +
 .../styles/mastodon/components.scss           | 43 +++++++++++++++++++
 app/lib/link_details_extractor.rb             |  4 ++
 app/models/preview_card.rb                    |  2 +
 app/models/status.rb                          | 10 ++---
 .../rest/preview_card_serializer.rb           |  2 +
 app/services/fetch_link_card_service.rb       |  3 ++
 ..._add_author_account_id_to_preview_cards.rb | 10 +++++
 db/schema.rb                                  |  5 ++-
 11 files changed, 105 insertions(+), 15 deletions(-)
 create mode 100644 db/migrate/20240522041528_add_author_account_id_to_preview_cards.rb

diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb
index a95c816e1..a29b90855 100644
--- a/app/controllers/api/v1/conversations_controller.rb
+++ b/app/controllers/api/v1/conversations_controller.rb
@@ -38,15 +38,15 @@ class Api::V1::ConversationsController < Api::BaseController
   def paginated_conversations
     AccountConversation.where(account: current_account)
                        .includes(
-                         account: :account_stat,
+                         account: [:account_stat, user: :role],
                          last_status: [
                            :media_attachments,
                            :status_stat,
                            :tags,
                            {
-                             preview_cards_status: :preview_card,
-                             active_mentions: [account: :account_stat],
-                             account: :account_stat,
+                             preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } },
+                             active_mentions: :account,
+                             account: [:account_stat, user: :role],
                            },
                          ]
                        )
diff --git a/app/javascript/mastodon/features/status/components/card.jsx b/app/javascript/mastodon/features/status/components/card.jsx
index f47861f66..c2f5703b3 100644
--- a/app/javascript/mastodon/features/status/components/card.jsx
+++ b/app/javascript/mastodon/features/status/components/card.jsx
@@ -6,6 +6,8 @@ import { PureComponent } from 'react';
 import { FormattedMessage } from 'react-intl';
 
 import classNames from 'classnames';
+import { Link } from 'react-router-dom';
+
 
 import Immutable from 'immutable';
 import ImmutablePropTypes from 'react-immutable-proptypes';
@@ -13,6 +15,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import DescriptionIcon from '@/material-icons/400-24px/description-fill.svg?react';
 import OpenInNewIcon from '@/material-icons/400-24px/open_in_new.svg?react';
 import PlayArrowIcon from '@/material-icons/400-24px/play_arrow-fill.svg?react';
+import { Avatar } from 'mastodon/components/avatar';
 import { Blurhash } from 'mastodon/components/blurhash';
 import { Icon }  from 'mastodon/components/icon';
 import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
@@ -56,6 +59,20 @@ const addAutoPlay = html => {
   return html;
 };
 
+const MoreFromAuthor = ({ author }) => (
+  <div className='more-from-author'>
+    <svg viewBox='0 0 79 79' className='logo logo--icon' role='img'>
+      <use xlinkHref='#logo-symbol-icon' />
+    </svg>
+
+    <FormattedMessage id='link_preview.more_from_author' defaultMessage='More from {name}' values={{ name: <Link to={`/@${author.get('acct')}`}><Avatar account={author} size={16} /> {author.get('display_name')}</Link> }} />
+  </div>
+);
+
+MoreFromAuthor.propTypes = {
+  author: ImmutablePropTypes.map,
+};
+
 export default class Card extends PureComponent {
 
   static propTypes = {
@@ -136,6 +153,7 @@ export default class Card extends PureComponent {
     const interactive = card.get('type') === 'video';
     const language    = card.get('language') || '';
     const largeImage  = (card.get('image')?.length > 0 && card.get('width') > card.get('height')) || interactive;
+    const showAuthor  = !!card.get('author_account');
 
     const description = (
       <div className='status-card__content'>
@@ -146,7 +164,7 @@ export default class Card extends PureComponent {
 
         <strong className='status-card__title' title={card.get('title')} lang={language}>{card.get('title')}</strong>
 
-        {card.get('author_name').length > 0 ? <span className='status-card__author'><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{card.get('author_name')}</strong> }} /></span> : <span className='status-card__description' lang={language}>{card.get('description')}</span>}
+        {!showAuthor && (card.get('author_name').length > 0 ? <span className='status-card__author'><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{card.get('author_name')}</strong> }} /></span> : <span className='status-card__description' lang={language}>{card.get('description')}</span>)}
       </div>
     );
 
@@ -235,10 +253,14 @@ export default class Card extends PureComponent {
     }
 
     return (
-      <a href={card.get('url')} className={classNames('status-card', { expanded: largeImage })} target='_blank' rel='noopener noreferrer' ref={this.setRef}>
-        {embed}
-        {description}
-      </a>
+      <>
+        <a href={card.get('url')} className={classNames('status-card', { expanded: largeImage, bottomless: showAuthor })} target='_blank' rel='noopener noreferrer' ref={this.setRef}>
+          {embed}
+          {description}
+        </a>
+
+        {showAuthor && <MoreFromAuthor author={card.get('author_account')} />}
+      </>
     );
   }
 
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 56e4612c1..63298d59e 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Show profile anyway",
   "limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
   "link_preview.author": "By {name}",
+  "link_preview.more_from_author": "More from {name}",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 859c6e326..4f36d85aa 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -3896,6 +3896,10 @@ $ui-header-logo-wordmark-width: 99px;
   border: 1px solid var(--background-border-color);
   border-radius: 8px;
 
+  &.bottomless {
+    border-radius: 8px 8px 0 0;
+  }
+
   &__actions {
     bottom: 0;
     inset-inline-start: 0;
@@ -10223,3 +10227,42 @@ noscript {
     }
   }
 }
+
+.more-from-author {
+  font-size: 14px;
+  color: $darker-text-color;
+  background: var(--surface-background-color);
+  border: 1px solid var(--background-border-color);
+  border-top: 0;
+  border-radius: 0 0 8px 8px;
+  padding: 15px;
+  display: flex;
+  align-items: center;
+  gap: 8px;
+
+  .logo {
+    height: 16px;
+    color: $darker-text-color;
+  }
+
+  & > span {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+  }
+
+  a {
+    display: inline-flex;
+    align-items: center;
+    gap: 4px;
+    font-weight: 500;
+    color: $primary-text-color;
+    text-decoration: none;
+
+    &:hover,
+    &:focus,
+    &:active {
+      color: $highlight-text-color;
+    }
+  }
+}
diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb
index 07776c369..2e49d3fb4 100644
--- a/app/lib/link_details_extractor.rb
+++ b/app/lib/link_details_extractor.rb
@@ -195,6 +195,10 @@ class LinkDetailsExtractor
     structured_data&.author_url
   end
 
+  def author_account
+    opengraph_tag('fediverse:creator')
+  end
+
   def embed_url
     valid_url_or_nil(opengraph_tag('twitter:player:stream'))
   end
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index 9fe02bd16..11fdd9d88 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -32,6 +32,7 @@
 #  link_type                    :integer
 #  published_at                 :datetime
 #  image_description            :string           default(""), not null
+#  author_account_id            :bigint(8)
 #
 
 class PreviewCard < ApplicationRecord
@@ -54,6 +55,7 @@ class PreviewCard < ApplicationRecord
   has_many :statuses, through: :preview_cards_statuses
 
   has_one :trend, class_name: 'PreviewCardTrend', inverse_of: :preview_card, dependent: :destroy
+  belongs_to :author_account, class_name: 'Account', optional: true
 
   has_attached_file :image, processors: [:thumbnail, :blurhash_transcoder], styles: ->(f) { image_styles(f) }, convert_options: { all: '-quality 90 +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' }, validate_media_type: false
 
diff --git a/app/models/status.rb b/app/models/status.rb
index 9d09fa5fe..baa657800 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -157,9 +157,9 @@ class Status < ApplicationRecord
                    :status_stat,
                    :tags,
                    :preloadable_poll,
-                   preview_cards_status: [:preview_card],
+                   preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } },
                    account: [:account_stat, user: :role],
-                   active_mentions: { account: :account_stat },
+                   active_mentions: :account,
                    reblog: [
                      :application,
                      :tags,
@@ -167,11 +167,11 @@ class Status < ApplicationRecord
                      :conversation,
                      :status_stat,
                      :preloadable_poll,
-                     preview_cards_status: [:preview_card],
+                     preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } },
                      account: [:account_stat, user: :role],
-                     active_mentions: { account: :account_stat },
+                     active_mentions: :account,
                    ],
-                   thread: { account: :account_stat }
+                   thread: :account
 
   delegate :domain, to: :account, prefix: true
 
diff --git a/app/serializers/rest/preview_card_serializer.rb b/app/serializers/rest/preview_card_serializer.rb
index 039262cd5..7d4c99c2d 100644
--- a/app/serializers/rest/preview_card_serializer.rb
+++ b/app/serializers/rest/preview_card_serializer.rb
@@ -8,6 +8,8 @@ class REST::PreviewCardSerializer < ActiveModel::Serializer
              :provider_url, :html, :width, :height,
              :image, :image_description, :embed_url, :blurhash, :published_at
 
+  has_one :author_account, serializer: REST::AccountSerializer, if: -> { object.author_account.present? }
+
   def url
     object.original_url.presence || object.url
   end
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 36e866b6c..900cb9863 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -147,9 +147,12 @@ class FetchLinkCardService < BaseService
     return if html.nil?
 
     link_details_extractor = LinkDetailsExtractor.new(@url, @html, @html_charset)
+    provider = PreviewCardProvider.matching_domain(Addressable::URI.parse(link_details_extractor.canonical_url).normalized_host)
+    linked_account = ResolveAccountService.new.call(link_details_extractor.author_account, suppress_errors: true) if link_details_extractor.author_account.present? && provider&.trendable?
 
     @card = PreviewCard.find_or_initialize_by(url: link_details_extractor.canonical_url) if link_details_extractor.canonical_url != @card.url
     @card.assign_attributes(link_details_extractor.to_preview_card_attributes)
+    @card.author_account = linked_account
     @card.save_with_optional_image! unless @card.title.blank? && @card.html.blank?
   end
 end
diff --git a/db/migrate/20240522041528_add_author_account_id_to_preview_cards.rb b/db/migrate/20240522041528_add_author_account_id_to_preview_cards.rb
new file mode 100644
index 000000000..a6e7a883d
--- /dev/null
+++ b/db/migrate/20240522041528_add_author_account_id_to_preview_cards.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddAuthorAccountIdToPreviewCards < ActiveRecord::Migration[7.1]
+  disable_ddl_transaction!
+
+  def change
+    safety_assured { add_reference :preview_cards, :author_account, null: true, foreign_key: { to_table: 'accounts', on_delete: :nullify }, index: false }
+    add_index :preview_cards, :author_account_id, algorithm: :concurrently, where: 'author_account_id IS NOT NULL'
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index ad5860492..3a47522d2 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[7.1].define(version: 2024_05_10_192043) do
+ActiveRecord::Schema[7.1].define(version: 2024_05_22_041528) do
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
 
@@ -877,6 +877,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_05_10_192043) do
     t.integer "link_type"
     t.datetime "published_at"
     t.string "image_description", default: "", null: false
+    t.bigint "author_account_id"
+    t.index ["author_account_id"], name: "index_preview_cards_on_author_account_id", where: "(author_account_id IS NOT NULL)"
     t.index ["url"], name: "index_preview_cards_on_url", unique: true
   end
 
@@ -1352,6 +1354,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_05_10_192043) do
   add_foreign_key "polls", "accounts", on_delete: :cascade
   add_foreign_key "polls", "statuses", on_delete: :cascade
   add_foreign_key "preview_card_trends", "preview_cards", on_delete: :cascade
+  add_foreign_key "preview_cards", "accounts", column: "author_account_id", on_delete: :nullify
   add_foreign_key "report_notes", "accounts", on_delete: :cascade
   add_foreign_key "report_notes", "reports", on_delete: :cascade
   add_foreign_key "reports", "accounts", column: "action_taken_by_account_id", name: "fk_bca45b75fd", on_delete: :nullify

From 5d7d23999ca0fffc3012d84b89fc9d3e66099115 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Wed, 29 May 2024 10:15:06 +0200
Subject: [PATCH 206/215] Fix leaking Elasticsearch connections in Sidekiq
 processes (#30450)

---
 lib/mastodon/sidekiq_middleware.rb | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/lib/mastodon/sidekiq_middleware.rb b/lib/mastodon/sidekiq_middleware.rb
index 3a747afb6..c5f4d8da3 100644
--- a/lib/mastodon/sidekiq_middleware.rb
+++ b/lib/mastodon/sidekiq_middleware.rb
@@ -8,6 +8,7 @@ class Mastodon::SidekiqMiddleware
   rescue Mastodon::HostValidationError
     # Do not retry
   rescue => e
+    clean_up_elasticsearch_connections!
     limit_backtrace_and_raise(e)
   ensure
     clean_up_sockets!
@@ -25,6 +26,32 @@ class Mastodon::SidekiqMiddleware
     clean_up_statsd_socket!
   end
 
+  # This is a hack to immediately free up unused Elasticsearch connections.
+  #
+  # Indeed, Chewy creates one `Elasticsearch::Client` instance per thread,
+  # and each such client manages its long-lasting connection to
+  # Elasticsearch.
+  #
+  # As far as I know, neither `chewy`,  `elasticsearch-transport` or even
+  # `faraday` provide a reliable way to immediately close a connection, and
+  # rely on the underlying object to be garbage-collected instead.
+  #
+  # Furthermore, `sidekiq` creates a new thread each time a job throws an
+  # exception, meaning that each failure will create a new connection, and
+  # the old one will only be closed on full garbage collection.
+  def clean_up_elasticsearch_connections!
+    return unless Chewy.enabled? && Chewy.current[:chewy_client].present?
+
+    Chewy.client.transport.transport.connections.each do |connection|
+      # NOTE: This bit of code is tailored for the HTTPClient Faraday adapter
+      connection.connection.app.instance_variable_get(:@client)&.reset_all
+    end
+
+    Chewy.current.delete(:chewy_client)
+  rescue
+    nil
+  end
+
   def clean_up_redis_socket!
     RedisConfiguration.pool.checkin if Thread.current[:redis]
     Thread.current[:redis] = nil

From 36fe8f85667717e78740a9fed3c2bf116a96da1e Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Wed, 29 May 2024 11:19:17 +0200
Subject: [PATCH 207/215] Change `ids` param to `id` in `/api/v1/statuses` and
 `/api/v1/accounts` for consistency (#30465)

---
 app/controllers/api/v1/accounts_controller.rb | 4 ++--
 app/controllers/api/v1/statuses_controller.rb | 4 ++--
 spec/requests/api/v1/accounts_spec.rb         | 4 ++--
 spec/requests/api/v1/statuses_spec.rb         | 4 ++--
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index be7b302d3..84b604b30 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -106,11 +106,11 @@ class Api::V1::AccountsController < Api::BaseController
   end
 
   def account_ids
-    Array(accounts_params[:ids]).uniq.map(&:to_i)
+    Array(accounts_params[:id]).uniq.map(&:to_i)
   end
 
   def accounts_params
-    params.permit(ids: [])
+    params.permit(id: [])
   end
 
   def account_params
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 5f7e66617..cca3865f6 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -141,11 +141,11 @@ class Api::V1::StatusesController < Api::BaseController
   end
 
   def status_ids
-    Array(statuses_params[:ids]).uniq.map(&:to_i)
+    Array(statuses_params[:id]).uniq.map(&:to_i)
   end
 
   def statuses_params
-    params.permit(ids: [])
+    params.permit(id: [])
   end
 
   def status_params
diff --git a/spec/requests/api/v1/accounts_spec.rb b/spec/requests/api/v1/accounts_spec.rb
index 55f8e1c6f..3d9eb6501 100644
--- a/spec/requests/api/v1/accounts_spec.rb
+++ b/spec/requests/api/v1/accounts_spec.rb
@@ -8,13 +8,13 @@ describe '/api/v1/accounts' do
   let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
   let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
 
-  describe 'GET /api/v1/accounts?ids[]=:id' do
+  describe 'GET /api/v1/accounts?id[]=:id' do
     let(:account) { Fabricate(:account) }
     let(:other_account) { Fabricate(:account) }
     let(:scopes) { 'read:accounts' }
 
     it 'returns expected response' do
-      get '/api/v1/accounts', headers: headers, params: { ids: [account.id, other_account.id, 123_123] }
+      get '/api/v1/accounts', headers: headers, params: { id: [account.id, other_account.id, 123_123] }
 
       expect(response).to have_http_status(200)
       expect(body_as_json).to contain_exactly(
diff --git a/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb
index 0b2d1f90c..694861fb1 100644
--- a/spec/requests/api/v1/statuses_spec.rb
+++ b/spec/requests/api/v1/statuses_spec.rb
@@ -9,13 +9,13 @@ describe '/api/v1/statuses' do
     let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: client_app, scopes: scopes) }
     let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
 
-    describe 'GET /api/v1/statuses?ids[]=:id' do
+    describe 'GET /api/v1/statuses?id[]=:id' do
       let(:status) { Fabricate(:status) }
       let(:other_status) { Fabricate(:status) }
       let(:scopes) { 'read:statuses' }
 
       it 'returns expected response' do
-        get '/api/v1/statuses', headers: headers, params: { ids: [status.id, other_status.id, 123_123] }
+        get '/api/v1/statuses', headers: headers, params: { id: [status.id, other_status.id, 123_123] }
 
         expect(response).to have_http_status(200)
         expect(body_as_json).to contain_exactly(

From 41729313e23bc4305cf0e7536d49af2490477c32 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 29 May 2024 11:34:36 +0200
Subject: [PATCH 208/215] chore(deps): update dependency faker to v3.4.1
 (#30463)

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 934d41334..5c480c525 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -231,7 +231,7 @@ GEM
       tzinfo
     excon (0.110.0)
     fabrication (2.31.0)
-    faker (3.3.1)
+    faker (3.4.1)
       i18n (>= 1.8.11, < 2)
     faraday (1.10.3)
       faraday-em_http (~> 1.0)

From 6eea83211c049e416d24f394039a74bc60450cd7 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 29 May 2024 13:12:23 +0200
Subject: [PATCH 209/215] New Crowdin Translations (automated) (#30464)

Co-authored-by: GitHub Actions <noreply@github.com>
---
 app/javascript/mastodon/locales/ca.json    | 1 +
 app/javascript/mastodon/locales/es-AR.json | 1 +
 app/javascript/mastodon/locales/fi.json    | 1 +
 app/javascript/mastodon/locales/gl.json    | 1 +
 app/javascript/mastodon/locales/it.json    | 1 +
 app/javascript/mastodon/locales/ko.json    | 1 +
 app/javascript/mastodon/locales/pl.json    | 1 +
 app/javascript/mastodon/locales/pt-BR.json | 1 +
 app/javascript/mastodon/locales/pt-PT.json | 1 +
 app/javascript/mastodon/locales/sl.json    | 1 +
 app/javascript/mastodon/locales/vi.json    | 1 +
 app/javascript/mastodon/locales/zh-CN.json | 1 +
 app/javascript/mastodon/locales/zh-TW.json | 1 +
 13 files changed, 13 insertions(+)

diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index ea67d217d..68429b093 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Mostra el perfil de totes maneres",
   "limited_account_hint.title": "Aquest perfil l'han amagat els moderadors de {domain}.",
   "link_preview.author": "Per {name}",
+  "link_preview.more_from_author": "Més de {name}",
   "lists.account.add": "Afegeix a la llista",
   "lists.account.remove": "Elimina de la llista",
   "lists.delete": "Elimina la llista",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 2d42b3e94..4c30bfa25 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Mostrar perfil de todos modos",
   "limited_account_hint.title": "Este perfil fue ocultado por los moderadores de {domain}.",
   "link_preview.author": "Por {name}",
+  "link_preview.more_from_author": "Más de {name}",
   "lists.account.add": "Agregar a lista",
   "lists.account.remove": "Quitar de lista",
   "lists.delete": "Eliminar lista",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index bae714b1d..6c2162e52 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Näytä profiili joka tapauksessa",
   "limited_account_hint.title": "Palvelimen {domain} valvojat ovat piilottaneet tämän käyttäjätilin.",
   "link_preview.author": "Julkaissut {name}",
+  "link_preview.more_from_author": "Lisää käyttäjältä {name}",
   "lists.account.add": "Lisää listalle",
   "lists.account.remove": "Poista listalta",
   "lists.delete": "Poista lista",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 98cc31394..0847b8bf0 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Mostrar perfil igualmente",
   "limited_account_hint.title": "Este perfil foi agochado pola moderación de {domain}.",
   "link_preview.author": "Por {name}",
+  "link_preview.more_from_author": "Máis de {name}",
   "lists.account.add": "Engadir á listaxe",
   "lists.account.remove": "Eliminar da listaxe",
   "lists.delete": "Eliminar listaxe",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 8ab5db1b1..f66497e0a 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Mostra comunque il profilo",
   "limited_account_hint.title": "Questo profilo è stato nascosto dai moderatori di {domain}.",
   "link_preview.author": "Di {name}",
+  "link_preview.more_from_author": "Altro da {name}",
   "lists.account.add": "Aggiungi all'elenco",
   "lists.account.remove": "Rimuovi dall'elenco",
   "lists.delete": "Elimina elenco",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index b34026147..7cd74fa50 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "그래도 프로필 보기",
   "limited_account_hint.title": "이 프로필은 {domain}의 중재자에 의해 숨겨진 상태입니다.",
   "link_preview.author": "{name}",
+  "link_preview.more_from_author": "{name} 더 둘러보기",
   "lists.account.add": "리스트에 추가",
   "lists.account.remove": "리스트에서 제거",
   "lists.delete": "리스트 삭제",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index b763f740a..6f67e8f74 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Pokaż profil mimo to",
   "limited_account_hint.title": "Ten profil został ukryty przez moderatorów {domain}.",
   "link_preview.author": "{name}",
+  "link_preview.more_from_author": "Więcej od {name}",
   "lists.account.add": "Dodaj do listy",
   "lists.account.remove": "Usunąć z listy",
   "lists.delete": "Usuń listę",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index b11daeaaa..3c8f3cf41 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Exibir perfil mesmo assim",
   "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do {domain}.",
   "link_preview.author": "Por {name}",
+  "link_preview.more_from_author": "Mais de {name}",
   "lists.account.add": "Adicionar à lista",
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Excluir lista",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 70903065d..c389d4f4f 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Exibir perfil mesmo assim",
   "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores de {domain}.",
   "link_preview.author": "Por {name}",
+  "link_preview.more_from_author": "Mais de {name}",
   "lists.account.add": "Adicionar à lista",
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Eliminar lista",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 7806abc6b..a8cce3202 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Vseeno pokaži profil",
   "limited_account_hint.title": "Profil so moderatorji strežnika {domain} skrili.",
   "link_preview.author": "Avtor_ica {name}",
+  "link_preview.more_from_author": "Več od {name}",
   "lists.account.add": "Dodaj na seznam",
   "lists.account.remove": "Odstrani s seznama",
   "lists.delete": "Izbriši seznam",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 102f1c3b4..56b2f7e52 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "Vẫn cứ xem",
   "limited_account_hint.title": "Người này đã bị ẩn bởi quản trị viên của {domain}.",
   "link_preview.author": "Bởi {name}",
+  "link_preview.more_from_author": "Thêm từ {name}",
   "lists.account.add": "Thêm vào danh sách",
   "lists.account.remove": "Xóa khỏi danh sách",
   "lists.delete": "Xóa danh sách",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index ab6fe0bd7..0f8bcae6f 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "仍要显示个人资料",
   "limited_account_hint.title": "此账号资料已被 {domain} 管理员隐藏。",
   "link_preview.author": "由 {name}",
+  "link_preview.more_from_author": "查看 {name} 的更多内容",
   "lists.account.add": "添加到列表",
   "lists.account.remove": "从列表中移除",
   "lists.delete": "删除列表",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index f00d62c07..1d20034db 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -414,6 +414,7 @@
   "limited_account_hint.action": "一律顯示個人檔案",
   "limited_account_hint.title": "此個人檔案已被 {domain} 的管理員隱藏。",
   "link_preview.author": "來自 {name}",
+  "link_preview.more_from_author": "來自 {name} 之更多內容",
   "lists.account.add": "新增至列表",
   "lists.account.remove": "自列表中移除",
   "lists.delete": "刪除列表",

From d20a5c3ec9ed40a991245fe32d0acb6187dd48c4 Mon Sep 17 00:00:00 2001
From: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
Date: Wed, 29 May 2024 16:00:05 +0200
Subject: [PATCH 210/215] Fix: remove broken OAuth Application vacuuming &
 throttle OAuth Application registrations (#30316)

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
---
 app/lib/vacuum/applications_vacuum.rb        | 10 ----
 app/workers/scheduler/vacuum_scheduler.rb    |  5 --
 config/initializers/rack_attack.rb           |  4 ++
 spec/config/initializers/rack/attack_spec.rb | 18 ++++++++
 spec/lib/vacuum/applications_vacuum_spec.rb  | 48 --------------------
 5 files changed, 22 insertions(+), 63 deletions(-)
 delete mode 100644 app/lib/vacuum/applications_vacuum.rb
 delete mode 100644 spec/lib/vacuum/applications_vacuum_spec.rb

diff --git a/app/lib/vacuum/applications_vacuum.rb b/app/lib/vacuum/applications_vacuum.rb
deleted file mode 100644
index ba88655f1..000000000
--- a/app/lib/vacuum/applications_vacuum.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class Vacuum::ApplicationsVacuum
-  def perform
-    Doorkeeper::Application.where(owner_id: nil)
-                           .where.missing(:created_users, :access_tokens, :access_grants)
-                           .where(created_at: ...1.day.ago)
-                           .in_batches.delete_all
-  end
-end
diff --git a/app/workers/scheduler/vacuum_scheduler.rb b/app/workers/scheduler/vacuum_scheduler.rb
index 1c9a2aabe..c22d6f5f8 100644
--- a/app/workers/scheduler/vacuum_scheduler.rb
+++ b/app/workers/scheduler/vacuum_scheduler.rb
@@ -22,7 +22,6 @@ class Scheduler::VacuumScheduler
       preview_cards_vacuum,
       backups_vacuum,
       access_tokens_vacuum,
-      applications_vacuum,
       feeds_vacuum,
       imports_vacuum,
     ]
@@ -56,10 +55,6 @@ class Scheduler::VacuumScheduler
     Vacuum::ImportsVacuum.new
   end
 
-  def applications_vacuum
-    Vacuum::ApplicationsVacuum.new
-  end
-
   def content_retention_policy
     ContentRetentionPolicy.current
   end
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index fa1bdca54..1757ce5df 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -105,6 +105,10 @@ class Rack::Attack
     req.authenticated_user_id if (req.post? && req.path.match?(API_DELETE_REBLOG_REGEX)) || (req.delete? && req.path.match?(API_DELETE_STATUS_REGEX))
   end
 
+  throttle('throttle_oauth_application_registrations/ip', limit: 5, period: 10.minutes) do |req|
+    req.throttleable_remote_ip if req.post? && req.path == '/api/v1/apps'
+  end
+
   throttle('throttle_sign_up_attempts/ip', limit: 25, period: 5.minutes) do |req|
     req.throttleable_remote_ip if req.post? && req.path_matches?('/auth')
   end
diff --git a/spec/config/initializers/rack/attack_spec.rb b/spec/config/initializers/rack/attack_spec.rb
index e25b7dfde..0a388c2f4 100644
--- a/spec/config/initializers/rack/attack_spec.rb
+++ b/spec/config/initializers/rack/attack_spec.rb
@@ -131,4 +131,22 @@ describe Rack::Attack, type: :request do
       it_behaves_like 'throttled endpoint'
     end
   end
+
+  describe 'throttle excessive oauth application registration requests by IP address' do
+    let(:throttle) { 'throttle_oauth_application_registrations/ip' }
+    let(:limit)  { 5 }
+    let(:period) { 10.minutes }
+    let(:path)   { '/api/v1/apps' }
+    let(:params) do
+      {
+        client_name: 'Throttle Test',
+        redirect_uris: 'urn:ietf:wg:oauth:2.0:oob',
+        scopes: 'read',
+      }
+    end
+
+    let(:request) { -> { post path, params: params, headers: { 'REMOTE_ADDR' => remote_ip } } }
+
+    it_behaves_like 'throttled endpoint'
+  end
 end
diff --git a/spec/lib/vacuum/applications_vacuum_spec.rb b/spec/lib/vacuum/applications_vacuum_spec.rb
deleted file mode 100644
index df5c86060..000000000
--- a/spec/lib/vacuum/applications_vacuum_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Vacuum::ApplicationsVacuum do
-  subject { described_class.new }
-
-  describe '#perform' do
-    let!(:app_with_token)  { Fabricate(:application, created_at: 1.month.ago) }
-    let!(:app_with_grant)  { Fabricate(:application, created_at: 1.month.ago) }
-    let!(:app_with_signup) { Fabricate(:application, created_at: 1.month.ago) }
-    let!(:app_with_owner)  { Fabricate(:application, created_at: 1.month.ago, owner: Fabricate(:user)) }
-    let!(:unused_app)      { Fabricate(:application, created_at: 1.month.ago) }
-    let!(:recent_app)      { Fabricate(:application, created_at: 1.hour.ago) }
-
-    before do
-      Fabricate(:access_token, application: app_with_token)
-      Fabricate(:access_grant, application: app_with_grant)
-      Fabricate(:user, created_by_application: app_with_signup)
-
-      subject.perform
-    end
-
-    it 'does not delete applications with valid access tokens' do
-      expect { app_with_token.reload }.to_not raise_error
-    end
-
-    it 'does not delete applications with valid access grants' do
-      expect { app_with_grant.reload }.to_not raise_error
-    end
-
-    it 'does not delete applications that were used to create users' do
-      expect { app_with_signup.reload }.to_not raise_error
-    end
-
-    it 'does not delete owned applications' do
-      expect { app_with_owner.reload }.to_not raise_error
-    end
-
-    it 'does not delete applications registered less than a day ago' do
-      expect { recent_app.reload }.to_not raise_error
-    end
-
-    it 'deletes unused applications' do
-      expect { unused_app.reload }.to raise_error ActiveRecord::RecordNotFound
-    end
-  end
-end

From 3ea4275ae3b7dc2b75e7a2db09b13576b49cec7a Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 30 May 2024 14:03:13 +0200
Subject: [PATCH 211/215] Merge pull request from GHSA-5fq7-3p3j-9vrf

---
 app/services/notify_service.rb       | 20 ++++++++++++--------
 spec/services/notify_service_spec.rb | 13 +++++++++++++
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb
index e56562c0a..1f01c2d48 100644
--- a/app/services/notify_service.rb
+++ b/app/services/notify_service.rb
@@ -147,6 +147,9 @@ class NotifyService < BaseService
     end
 
     def statuses_that_mention_sender
+      # This queries private mentions from the recipient to the sender up in the thread.
+      # This allows up to 100 messages that do not match in the thread, allowing conversations
+      # involving multiple people.
       Status.count_by_sql([<<-SQL.squish, id: @notification.target_status.in_reply_to_id, recipient_id: @recipient.id, sender_id: @sender.id, depth_limit: 100])
         WITH RECURSIVE ancestors(id, in_reply_to_id, mention_id, path, depth) AS (
             SELECT s.id, s.in_reply_to_id, m.id, ARRAY[s.id], 0
@@ -154,16 +157,17 @@ class NotifyService < BaseService
             LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id
             WHERE s.id = :id
           UNION ALL
-            SELECT s.id, s.in_reply_to_id, m.id, st.path || s.id, st.depth + 1
-            FROM ancestors st
-            JOIN statuses s ON s.id = st.in_reply_to_id
-            LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id
-            WHERE st.mention_id IS NULL AND NOT s.id = ANY(path) AND st.depth < :depth_limit
+            SELECT s.id, s.in_reply_to_id, m.id, ancestors.path || s.id, ancestors.depth + 1
+            FROM ancestors
+            JOIN statuses s ON s.id = ancestors.in_reply_to_id
+            /* early exit if we already have a mention matching our requirements */
+            LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id AND s.account_id = :recipient_id
+            WHERE ancestors.mention_id IS NULL AND NOT s.id = ANY(path) AND ancestors.depth < :depth_limit
         )
         SELECT COUNT(*)
-        FROM ancestors st
-        JOIN statuses s ON s.id = st.id
-        WHERE st.mention_id IS NOT NULL AND s.visibility = 3
+        FROM ancestors
+        JOIN statuses s ON s.id = ancestors.id
+        WHERE ancestors.mention_id IS NOT NULL AND s.account_id = :recipient_id AND s.visibility = 3
       SQL
     end
   end
diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb
index 514f634d7..6064d2b05 100644
--- a/spec/services/notify_service_spec.rb
+++ b/spec/services/notify_service_spec.rb
@@ -309,6 +309,19 @@ RSpec.describe NotifyService do
               expect(subject.filter?).to be false
             end
           end
+
+          context 'when the sender is mentioned in an unrelated message chain' do
+            before do
+              original_status = Fabricate(:status, visibility: :direct)
+              intermediary_status = Fabricate(:status, visibility: :direct, thread: original_status)
+              notification.target_status.update(thread: intermediary_status)
+              Fabricate(:mention, status: original_status, account: notification.from_account)
+            end
+
+            it 'returns true' do
+              expect(subject.filter?).to be true
+            end
+          end
         end
       end
     end

From 16249946aea0db8a74748909d65c94742482dcb7 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 30 May 2024 14:14:04 +0200
Subject: [PATCH 212/215] Merge pull request from GHSA-q3rg-xx5v-4mxh

---
 config/initializers/rack_attack.rb           | 10 ++++++-
 spec/config/initializers/rack/attack_spec.rb | 31 ++++++++++++++++++--
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index 1757ce5df..034fb7444 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -30,13 +30,17 @@ class Rack::Attack
     end
 
     def authenticated_user_id
-      authenticated_token&.resource_owner_id
+      authenticated_token&.resource_owner_id || warden_user_id
     end
 
     def authenticated_token_id
       authenticated_token&.id
     end
 
+    def warden_user_id
+      @env['warden']&.user&.id
+    end
+
     def unauthenticated?
       !authenticated_user_id
     end
@@ -141,6 +145,10 @@ class Rack::Attack
     req.session[:attempt_user_id] || req.params.dig('user', 'email').presence if req.post? && req.path_matches?('/auth/sign_in')
   end
 
+  throttle('throttle_password_change/account', limit: 10, period: 10.minutes) do |req|
+    req.authenticated_user_id if req.put? || (req.patch? && req.path_matches?('/auth'))
+  end
+
   self.throttled_responder = lambda do |request|
     now        = Time.now.utc
     match_data = request.env['rack.attack.match_data']
diff --git a/spec/config/initializers/rack/attack_spec.rb b/spec/config/initializers/rack/attack_spec.rb
index 0a388c2f4..19de48089 100644
--- a/spec/config/initializers/rack/attack_spec.rb
+++ b/spec/config/initializers/rack/attack_spec.rb
@@ -56,7 +56,7 @@ describe Rack::Attack, type: :request do
     end
 
     def throttle_count
-      described_class.cache.read("#{counter_prefix}:#{throttle}:#{remote_ip}") || 0
+      described_class.cache.read("#{counter_prefix}:#{throttle}:#{discriminator}") || 0
     end
 
     def counter_prefix
@@ -64,11 +64,12 @@ describe Rack::Attack, type: :request do
     end
 
     def increment_counter
-      described_class.cache.count("#{throttle}:#{remote_ip}", period)
+      described_class.cache.count("#{throttle}:#{discriminator}", period)
     end
   end
 
   let(:remote_ip) { '1.2.3.5' }
+  let(:discriminator) { remote_ip }
 
   describe 'throttle excessive sign-up requests by IP address' do
     context 'when accessed through the website' do
@@ -149,4 +150,30 @@ describe Rack::Attack, type: :request do
 
     it_behaves_like 'throttled endpoint'
   end
+
+  describe 'throttle excessive password change requests by account' do
+    let(:user) { Fabricate(:user, email: 'user@host.example') }
+    let(:throttle) { 'throttle_password_change/account' }
+    let(:limit) { 10 }
+    let(:period) { 10.minutes }
+    let(:request) { -> { put path, headers: { 'REMOTE_ADDR' => remote_ip } } }
+    let(:path) { '/auth' }
+    let(:discriminator) { user.id }
+
+    before do
+      sign_in user, scope: :user
+
+      # Unfortunately, devise's `sign_in` helper causes the `session` to be
+      # loaded in the next request regardless of whether it's actually accessed
+      # by the client code.
+      #
+      # So, we make an extra query to clear issue a session cookie instead.
+      #
+      # A less resource-intensive way to deal with that would be to generate the
+      # session cookie manually, but this seems pretty involved.
+      get '/'
+    end
+
+    it_behaves_like 'throttled endpoint'
+  end
 end

From 3fa0dd0b88bae1aeb505195044951eb9eebe90f1 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 30 May 2024 14:24:29 +0200
Subject: [PATCH 213/215] Merge pull request from GHSA-c2r5-cfqr-c553

* Add hardening monkey-patch to prevent IP spoofing on misconfigured installations

* Remove rack-attack safelist
---
 config/application.rb                       |  1 +
 config/initializers/rack_attack.rb          |  4 --
 lib/action_dispatch/remote_ip_extensions.rb | 72 +++++++++++++++++++++
 3 files changed, 73 insertions(+), 4 deletions(-)
 create mode 100644 lib/action_dispatch/remote_ip_extensions.rb

diff --git a/config/application.rb b/config/application.rb
index 07b50ca03..6d6e91a5c 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -48,6 +48,7 @@ require_relative '../lib/chewy/strategy/bypass_with_warning'
 require_relative '../lib/webpacker/manifest_extensions'
 require_relative '../lib/webpacker/helper_extensions'
 require_relative '../lib/rails/engine_extensions'
+require_relative '../lib/action_dispatch/remote_ip_extensions'
 require_relative '../lib/active_record/database_tasks_extensions'
 require_relative '../lib/active_record/batches'
 require_relative '../lib/simple_navigation/item_extensions'
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index 034fb7444..b3739429e 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -62,10 +62,6 @@ class Rack::Attack
     end
   end
 
-  Rack::Attack.safelist('allow from localhost') do |req|
-    req.remote_ip == '127.0.0.1' || req.remote_ip == '::1'
-  end
-
   Rack::Attack.blocklist('deny from blocklist') do |req|
     IpBlock.blocked?(req.remote_ip)
   end
diff --git a/lib/action_dispatch/remote_ip_extensions.rb b/lib/action_dispatch/remote_ip_extensions.rb
new file mode 100644
index 000000000..e5c48bf3c
--- /dev/null
+++ b/lib/action_dispatch/remote_ip_extensions.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+# Mastodon is not made to be directly accessed without a reverse proxy.
+# This monkey-patch prevents remote IP address spoofing when being accessed
+# directly.
+#
+# See PR: https://github.com/rails/rails/pull/51610
+
+# In addition to the PR above, it also raises an error if a request with
+# `X-Forwarded-For` or `Client-Ip` comes directly from a client without
+# going through a trusted proxy.
+
+# rubocop:disable all -- This is a mostly vendored file
+
+module ActionDispatch
+  class RemoteIp
+    module GetIpExtensions
+      def calculate_ip
+        # Set by the Rack web server, this is a single value.
+        remote_addr = ips_from(@req.remote_addr).last
+
+        # Could be a CSV list and/or repeated headers that were concatenated.
+        client_ips    = ips_from(@req.client_ip).reverse!
+        forwarded_ips = ips_from(@req.x_forwarded_for).reverse!
+
+        # `Client-Ip` and `X-Forwarded-For` should not, generally, both be set. If they
+        # are both set, it means that either:
+        #
+        # 1) This request passed through two proxies with incompatible IP header
+        #     conventions.
+        #
+        # 2) The client passed one of `Client-Ip` or `X-Forwarded-For`
+        #     (whichever the proxy servers weren't using) themselves.
+        #
+        # Either way, there is no way for us to determine which header is the right one
+        # after the fact. Since we have no idea, if we are concerned about IP spoofing
+        # we need to give up and explode. (If you're not concerned about IP spoofing you
+        # can turn the `ip_spoofing_check` option off.)
+        should_check_ip = @check_ip && client_ips.last && forwarded_ips.last
+        if should_check_ip && !forwarded_ips.include?(client_ips.last)
+          # We don't know which came from the proxy, and which from the user
+          raise IpSpoofAttackError, "IP spoofing attack?! " \
+            "HTTP_CLIENT_IP=#{@req.client_ip.inspect} " \
+            "HTTP_X_FORWARDED_FOR=#{@req.x_forwarded_for.inspect}"
+        end
+
+        # NOTE: Mastodon addition to make sure we don't get requests from a non-trusted client
+        if @check_ip && (forwarded_ips.last || client_ips.last) && !@proxies.any? { |proxy| proxy === remote_addr }
+          raise IpSpoofAttackError, "IP spoofing attack?! client #{remote_addr} is not a trusted proxy " \
+            "HTTP_CLIENT_IP=#{@req.client_ip.inspect} " \
+            "HTTP_X_FORWARDED_FOR=#{@req.x_forwarded_for.inspect}"
+        end
+
+        # We assume these things about the IP headers:
+        #
+        #     - X-Forwarded-For will be a list of IPs, one per proxy, or blank
+        #     - Client-Ip is propagated from the outermost proxy, or is blank
+        #     - REMOTE_ADDR will be the IP that made the request to Rack
+        ips = forwarded_ips + client_ips
+        ips.compact!
+
+        # If every single IP option is in the trusted list, return the IP that's
+        # furthest away
+        filter_proxies([remote_addr] + ips).first || ips.last || remote_addr
+      end
+    end
+  end
+end
+
+ActionDispatch::RemoteIp::GetIp.prepend(ActionDispatch::RemoteIp::GetIpExtensions)
+
+# rubocop:enable all

From 73a78cc19d0bff68425678c6b4c0ee0fc0a0f528 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 30 May 2024 14:56:18 +0200
Subject: [PATCH 214/215] Fix rate-limiting incorrectly triggering a session
 cookie on most endpoints (#30483)

---
 config/initializers/rack_attack.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index b3739429e..14fab7ecd 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -30,7 +30,7 @@ class Rack::Attack
     end
 
     def authenticated_user_id
-      authenticated_token&.resource_owner_id || warden_user_id
+      authenticated_token&.resource_owner_id
     end
 
     def authenticated_token_id
@@ -142,7 +142,7 @@ class Rack::Attack
   end
 
   throttle('throttle_password_change/account', limit: 10, period: 10.minutes) do |req|
-    req.authenticated_user_id if req.put? || (req.patch? && req.path_matches?('/auth'))
+    req.warden_user_id if req.put? || (req.patch? && req.path_matches?('/auth'))
   end
 
   self.throttled_responder = lambda do |request|

From 7f808ff6e9148f1cfe1e16d000e2405b6e31f243 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Thu, 30 May 2024 15:34:46 +0200
Subject: [PATCH 215/215] Bump version to v4.3.0-alpha.4 (#30482)

---
 CHANGELOG.md            | 55 +++++++++++++++++++++++++++++++++++++++++
 docker-compose.yml      |  6 ++---
 lib/mastodon/version.rb |  2 +-
 3 files changed, 59 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a53790afa..c9b24d6f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,61 @@
 
 All notable changes to this project will be documented in this file.
 
+## [4.2.9] - 2024-05-30
+
+### Security
+
+- Update dependencies
+- Fix private mention filtering ([GHSA-5fq7-3p3j-9vrf](https://github.com/mastodon/mastodon/security/advisories/GHSA-5fq7-3p3j-9vrf))
+- Fix password change endpoint not being rate-limited ([GHSA-q3rg-xx5v-4mxh](https://github.com/mastodon/mastodon/security/advisories/GHSA-q3rg-xx5v-4mxh))
+- Add hardening around rate-limit bypass ([GHSA-c2r5-cfqr-c553](https://github.com/mastodon/mastodon/security/advisories/GHSA-c2r5-cfqr-c553))
+
+### Added
+
+- Add rate-limit on OAuth application registration ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/30316))
+- Add fallback redirection when getting a webfinger query `WEB_DOMAIN@WEB_DOMAIN` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28592))
+- Add `digest` attribute to `Admin::DomainBlock` entity in REST API ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/29092))
+
+### Removed
+
+- Remove superfluous application-level caching in some controllers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29862))
+- Remove aggressive OAuth application vacuuming ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/30316))
+
+### Fixed
+
+- Fix leaking Elasticsearch connections in Sidekiq processes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30450))
+- Fix language of remote posts not being recognized when using unusual casing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30403))
+- Fix off-by-one in `tootctl media` commands ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30306))
+- Fix removal of allowed domains (in `LIMITED_FEDERATION_MODE`) not being recorded in the audit log ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/30125))
+- Fix not being able to block a subdomain of an already-blocked domain through the API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30119))
+- Fix `Idempotency-Key` being ignored when scheduling a post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/30084))
+- Fix crash when supplying the `FFMPEG_BINARY` environment variable ([timothyjrogers](https://github.com/mastodon/mastodon/pull/30022))
+- Fix improper email address validation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29838))
+- Fix results/query in `api/v1/featured_tags/suggestions` ([mjankowski](https://github.com/mastodon/mastodon/pull/29597))
+- Fix unblocking internationalized domain names under certain conditions ([tribela](https://github.com/mastodon/mastodon/pull/29530))
+- Fix admin account created by `mastodon:setup` not being auto-approved ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29379))
+- Fix reference to non-existent var in CLI maintenance command ([mjankowski](https://github.com/mastodon/mastodon/pull/28363))
+
+## [4.2.8] - 2024-02-23
+
+### Added
+
+- Add hourly task to automatically require approval for new registrations in the absence of moderators ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29318), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/29355))
+  In order to prevent future abandoned Mastodon servers from being used for spam, harassment and other malicious activity, Mastodon will now automatically switch new user registrations to require moderator approval whenever they are left open and no activity (including non-moderation actions from apps) from any logged-in user with permission to access moderation reports has been detected in a full week.
+  When this happens, users with the permission to change server settings will receive an email notification.
+  This feature is disabled when `EMAIL_DOMAIN_ALLOWLIST` is used, and can also be disabled with `DISABLE_AUTOMATIC_SWITCHING_TO_APPROVED_REGISTRATIONS=true`.
+
+### Changed
+
+- Change registrations to be closed by default on new installations ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29280))
+  If you are running a server and never changed your registrations mode from the default, updating will automatically close your registrations.
+  Simply re-enable them through the administration interface or using `tootctl settings registrations open` if you want to enable them again.
+
+### Fixed
+
+- Fix processing of remote ActivityPub actors making use of `Link` objects as `Image` `url` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29335))
+- Fix link verifications when page size exceeds 1MB ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29358))
+
 ## [4.2.7] - 2024-02-16
 
 ### Fixed
diff --git a/docker-compose.yml b/docker-compose.yml
index 3f2336f1d..e7ae95ea7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -55,7 +55,7 @@ services:
 
   web:
     build: .
-    image: ghcr.io/mastodon/mastodon:v4.2.7
+    image: ghcr.io/mastodon/mastodon:v4.2.9
     restart: always
     env_file: .env.production
     command: bundle exec puma -C config/puma.rb
@@ -76,7 +76,7 @@ services:
 
   streaming:
     build: .
-    image: ghcr.io/mastodon/mastodon:v4.2.7
+    image: ghcr.io/mastodon/mastodon:v4.2.9
     restart: always
     env_file: .env.production
     command: node ./streaming
@@ -94,7 +94,7 @@ services:
 
   sidekiq:
     build: .
-    image: ghcr.io/mastodon/mastodon:v4.2.7
+    image: ghcr.io/mastodon/mastodon:v4.2.9
     restart: always
     env_file: .env.production
     command: bundle exec sidekiq
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 1135ba0a1..03972ba93 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -17,7 +17,7 @@ module Mastodon
     end
 
     def default_prerelease
-      'alpha.3'
+      'alpha.4'
     end
 
     def prerelease