diff --git a/.dockerignore b/.dockerignore
index 6b1879e62..2b5f1abff 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -6,6 +6,12 @@ COPYING
*file
elixir_buildpack.config
test/
+instance/
+_build
+deps
+test
+benchmarks
+docs/site
# Required to get version
!.git
diff --git a/.woodpecker.yml b/.woodpecker.yml
new file mode 100644
index 000000000..32db2f1c5
--- /dev/null
+++ b/.woodpecker.yml
@@ -0,0 +1,187 @@
+variables:
+ - &scw-secrets
+ - SCW_ACCESS_KEY
+ - SCW_SECRET_KEY
+ - SCW_DEFAULT_ORGANIZATION_ID
+ - &setup-hex "mix local.hex --force && mix local.rebar --force"
+ - &on-release
+ when:
+ event:
+ - push
+ - tag
+ branch:
+ - develop
+ - stable
+ - refs/tags/v*
+ - refs/tags/stable-*
+ - &on-point-release
+ when:
+ event:
+ - push
+ branch:
+ - develop
+ - stable
+ - &on-pr-open
+ when:
+ event:
+ - pull_request
+
+ - &tag-build "export BUILD_TAG=$${CI_COMMIT_TAG:-\"$CI_COMMIT_BRANCH\"} && export PLEROMA_BUILD_BRANCH=$BUILD_TAG"
+
+ - &clean "(rm -rf release || true) && (rm -rf _build || true) && (rm -rf /root/.mix)"
+ - &mix-clean "mix deps.clean --all && mix clean"
+
+services:
+ postgres:
+ image: postgres:13
+ when:
+ event:
+ - pull_request
+ environment:
+ POSTGRES_DB: pleroma_test
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+
+pipeline:
+ lint:
+ <<: *on-pr-open
+ image: akkoma/ci-base:latest
+ commands:
+ - mix local.hex --force
+ - mix local.rebar --force
+ - mix format --check-formatted
+
+ build:
+ image: akkoma/ci-base:latest
+ <<: *on-pr-open
+ environment:
+ MIX_ENV: test
+ POSTGRES_DB: pleroma_test
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ DB_HOST: postgres
+ commands:
+ - mix local.hex --force
+ - mix local.rebar --force
+ - mix deps.get
+ - mix compile
+
+ test:
+ image: akkoma/ci-base:latest
+ <<: *on-pr-open
+ environment:
+ MIX_ENV: test
+ POSTGRES_DB: pleroma_test
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ DB_HOST: postgres
+ commands:
+ - mix local.hex --force
+ - mix local.rebar --force
+ - mix deps.get
+ - mix compile
+ - mix ecto.drop -f -q
+ - mix ecto.create
+ - mix ecto.migrate
+ - mix test --preload-modules --exclude erratic --exclude federated --max-cases 4
+
+ # Canonical amd64
+ ubuntu22:
+ image: hexpm/elixir:1.13.4-erlang-25.0.2-ubuntu-jammy-20220428
+ <<: *on-release
+ environment:
+ MIX_ENV: prod
+ DEBIAN_FRONTEND: noninteractive
+ commands:
+ - apt-get update && apt-get install -y cmake libmagic-dev rclone zip imagemagick libmagic-dev git build-essential g++ wget
+ - *clean
+ - echo "import Config" > config/prod.secret.exs
+ - *setup-hex
+ - *tag-build
+ - mix deps.get --only prod
+ - mix release --path release
+ - zip akkoma-ubuntu-jammy.zip -r release
+
+ release-ubuntu22:
+ image: akkoma/releaser
+ <<: *on-release
+ secrets: *scw-secrets
+ commands:
+ - export SOURCE=akkoma-ubuntu-jammy.zip
+ - export DEST=scaleway:akkoma-updates/$${CI_COMMIT_TAG:-"$CI_COMMIT_BRANCH"}/akkoma-ubuntu-jammy.zip
+ - /bin/sh /entrypoint.sh
+
+ debian-bullseye:
+ image: elixir:1.13.4
+ <<: *on-release
+ environment:
+ MIX_ENV: prod
+ DEBIAN_FRONTEND: noninteractive
+ commands:
+ - apt-get update && apt-get install -y cmake libmagic-dev rclone zip imagemagick libmagic-dev git build-essential gcc make g++ wget
+ - *clean
+ - echo "import Config" > config/prod.secret.exs
+ - *setup-hex
+ - *tag-build
+ - *mix-clean
+ - mix deps.get --only prod
+ - mix release --path release
+ - zip akkoma-amd64.zip -r release
+
+ release-debian:
+ image: akkoma/releaser
+ <<: *on-release
+ secrets: *scw-secrets
+ commands:
+ - export SOURCE=akkoma-amd64.zip
+ - export DEST=scaleway:akkoma-updates/$${CI_COMMIT_TAG:-"$CI_COMMIT_BRANCH"}/akkoma-amd64.zip
+ - /bin/sh /entrypoint.sh
+ - export DEST=scaleway:akkoma-updates/$${CI_COMMIT_TAG:-"$CI_COMMIT_BRANCH"}/akkoma-debian-stable.zip
+ - /bin/sh /entrypoint.sh
+
+ # Canonical amd64-musl
+ musl:
+ image: elixir:1.13.4-alpine
+ <<: *on-release
+ environment:
+ MIX_ENV: prod
+ commands:
+ - apk add git gcc g++ musl-dev make cmake file-dev rclone wget zip imagemagick
+ - *clean
+ - *setup-hex
+ - *mix-clean
+ - *tag-build
+ - mix deps.get --only prod
+ - mix release --path release
+ - zip akkoma-amd64-musl.zip -r release
+
+ release-musl:
+ image: akkoma/releaser
+ <<: *on-release
+ secrets: *scw-secrets
+ commands:
+ - export SOURCE=akkoma-amd64-musl.zip
+ - export DEST=scaleway:akkoma-updates/$${CI_COMMIT_TAG:-"$CI_COMMIT_BRANCH"}/akkoma-amd64-musl.zip
+ - /bin/sh /entrypoint.sh
+
+ docs:
+ <<: *on-point-release
+ secrets:
+ - SCW_ACCESS_KEY
+ - SCW_SECRET_KEY
+ - SCW_DEFAULT_ORGANIZATION_ID
+ environment:
+ CI: "true"
+ image: python:3.10-slim
+ commands:
+ - apt-get update && apt-get install -y rclone wget git zip
+ - wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64
+ - mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli
+ - chmod +x scaleway-cli
+ - ./scaleway-cli object config install type=rclone
+ - cd docs
+ - pip install -r requirements.txt
+ - mkdocs build
+ - zip -r docs.zip site/*
+ - cd site
+ - rclone copy . scaleway:akkoma-docs/$CI_COMMIT_BRANCH/
diff --git a/.woodpecker/.docs.yml b/.woodpecker/.docs.yml
deleted file mode 100644
index 61b369e51..000000000
--- a/.woodpecker/.docs.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-pipeline:
- build:
- when:
- event:
- - push
- branch:
- - develop
- - stable
- secrets:
- - SCW_ACCESS_KEY
- - SCW_SECRET_KEY
- - SCW_DEFAULT_ORGANIZATION_ID
- environment:
- CI: "true"
- image: python:3.10-slim
- commands:
- - apt-get update && apt-get install -y rclone wget git zip
- - wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64
- - mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli
- - chmod +x scaleway-cli
- - ./scaleway-cli object config install type=rclone
- - cd docs
- - pip install -r requirements.txt
- - mkdocs build
- - zip -r docs.zip site/*
- - cd site
- - rclone copy . scaleway:akkoma-docs/$CI_COMMIT_BRANCH/
diff --git a/.woodpecker/.release.yml b/.woodpecker/.release.yml
deleted file mode 100644
index c411dd2e9..000000000
--- a/.woodpecker/.release.yml
+++ /dev/null
@@ -1,127 +0,0 @@
-matrix:
- docker_prefix:
- - ""
- - arm64v8/
- - arm32v7/
- tag:
- - amd64
- - arm64
- - arm
-
- include:
- - tag: amd64
- docker_prefix: ""
-
-pipeline:
- glibc:
- when:
- event:
- - push
- - tag
- branch:
- - develop
- - stable
- - refs/tags/v*
- - refs/tags/stable-*
- secrets:
- - SCW_ACCESS_KEY
- - SCW_SECRET_KEY
- - SCW_DEFAULT_ORGANIZATION_ID
- image: ${docker_prefix}elixir:1.13
- environment:
- MIX_ENV: prod
- commands:
- - apt-get update && apt-get install -y cmake libmagic-dev rclone zip imagemagick libmagic-dev
- - wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64
- - mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli
- - chmod +x scaleway-cli
- - ./scaleway-cli object config install type=rclone
- - echo "import Mix.Config" > config/prod.secret.exs
- - mix local.hex --force
- - mix local.rebar --force
- - export BUILD_TAG=$${CI_COMMIT_TAG:-"$CI_COMMIT_BRANCH"}
- - export PLEROMA_BUILD_BRANCH=$BUILD_TAG
- - mix deps.clean --all
- - mix deps.get --only prod
- - mkdir release
- - mix release --path release
- - zip akkoma-${tag}.zip -r release
- - rclone copyto akkoma-${tag}.zip scaleway:akkoma-updates/$BUILD_TAG/akkoma-${tag}.zip
-
- musl:
- when:
- event:
- - push
- - tag
- branch:
- - develop
- - stable
- - refs/tags/v*
- - refs/tags/stable-*
- secrets:
- - SCW_ACCESS_KEY
- - SCW_SECRET_KEY
- - SCW_DEFAULT_ORGANIZATION_ID
- image: ${docker_prefix}elixir:1.13-alpine
- environment:
- MIX_ENV: prod
- commands:
- - apk add git gcc g++ musl-dev make cmake file-dev rclone wget zip imagemagick
- - rm -rf release || true
- - rm -rf _build || true
- - rm -rf /root/.mix
- - rm scaleway-cli || true
- - wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64
- - mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli
- - chmod +x scaleway-cli
- - ./scaleway-cli object config install type=rclone
-
- - mix local.hex --force
- - mix local.rebar --force
- - export BUILD_TAG=$${CI_COMMIT_TAG:-"$CI_COMMIT_BRANCH"}
- - export PLEROMA_BUILD_BRANCH=$BUILD_TAG
- - mix deps.clean --all
- - mix deps.get --only prod
- - mix release --path release
- - zip akkoma-${tag}.zip -r release
- - rclone copyto akkoma-${tag}.zip scaleway:akkoma-updates/$BUILD_TAG/akkoma-${tag}-musl.zip
-
- musl1.1:
- when:
- event:
- - push
- - tag
- branch:
- - develop
- - stable
- - refs/tags/v*
- - refs/tags/stable-*
- secrets:
- - SCW_ACCESS_KEY
- - SCW_SECRET_KEY
- - SCW_DEFAULT_ORGANIZATION_ID
- image: voidlinux/voidlinux-musl
- environment:
- MIX_ENV: prod
- commands:
- - xbps-install -Suy || xbps-install -uy xbps
- - xbps-install -Suy
- - xbps-install -y git gcc musl-devel make cmake file-devel rclone wget zip libmagic elixir
- - rm -rf release || true
- - rm -rf _build || true
- - rm -rf /root/.mix
- - rm scaleway-cli || true
- - wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64
- - mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli
- - chmod +x scaleway-cli
- - ./scaleway-cli object config install type=rclone
-
- - mix local.hex --force
- - mix local.rebar --force
- - export BUILD_TAG=$${CI_COMMIT_TAG:-"$CI_COMMIT_BRANCH"}
- - export PLEROMA_BUILD_BRANCH=$BUILD_TAG
- - mix deps.clean --all
- - mix deps.get --only prod
- - mix release --path release
- - zip akkoma-${tag}.zip -r release
- - rclone copyto akkoma-${tag}.zip scaleway:akkoma-updates/$BUILD_TAG/akkoma-${tag}-musl11.zip
diff --git a/.woodpecker/.test.yml b/.woodpecker/.test.yml
deleted file mode 100644
index f41655029..000000000
--- a/.woodpecker/.test.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-matrix:
- ELIXIR_VERSION:
- - 1.13
-
-pipeline:
- lint:
- when:
- event:
- - pull_request
- image: pleromaforkci/ci-base:1.13
- commands:
- - mix local.hex --force
- - mix local.rebar --force
- - mix format --check-formatted
-
- build:
- image: pleromaforkci/ci-base:${ELIXIR_VERSION}
- when:
- event:
- - pull_request
- environment:
- MIX_ENV: test
- commands:
- - mix local.hex --force
- - mix local.rebar --force
- - mix deps.get
- - mix compile
-
- test:
- group: test
- image: pleromaforkci/ci-base:${ELIXIR_VERSION}
- when:
- event:
- - pull_request
- environment:
- MIX_ENV: test
- POSTGRES_DB: pleroma_test
- POSTGRES_USER: postgres
- POSTGRES_PASSWORD: postgres
- DB_HOST: postgres
- commands:
- - mix local.hex --force
- - mix local.rebar --force
- - mix deps.get
- - mix ecto.drop -f -q
- - mix ecto.create
- - mix ecto.migrate
- - mix test --preload-modules --exclude erratic --exclude federated --max-cases 4
-
-services:
- postgres:
- image: postgres:13
- when:
- event:
- - pull_request
- environment:
- POSTGRES_DB: pleroma_test
- POSTGRES_USER: postgres
- POSTGRES_PASSWORD: postgres
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ae33be6d..c658af460 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,36 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
+## [Unreleased]
+
+### Added
+- extended runtime module support, see config cheatsheet
+- quote posting; quotes are limited to public posts
+
+### Changed
+- quarantining is now considered absolutely; public activities are no longer
+ an exception.
+- also merged quarantine and mrf reject - quarantine is now deprecated
+- flavours:
+ - amd64 is built for debian stable. Compatible with ubuntu 20.
+ - ubuntu-jammy is built for... well, ubuntu 22 (LTS)
+ - amd64-musl is built for alpine 3.16
+
+### Fixed
+- Updated mastoFE path, for the newer version
+
+### Removed
+- Scrobbling support
+ - `/api/v1/pleroma/scrobble`
+ - `/api/v1/pleroma/accounts/{id}/scrobbles`
+- Deprecated endpoints
+ - `/api/v1/pleroma/chats`
+ - `/api/v1/notifications/dismiss`
+ - `/api/v1/search`
+ - `/api/v1/statuses/{id}/card`
+- Chats, they were half-baked. Just use PMs.
+- Prometheus, it causes massive slowdown
+
## 2022.07
### Added
@@ -144,6 +174,7 @@ you might end up in a situation where you don't have an ability to get it.
- Attachment dimensions and blurhashes are federated when available.
- Mastodon API: support `poll` notification.
- Pinned posts federation
+- Possibility to discover users like `user@example.org`, while Akkoma is working on `akkoma.example.org`. Additional configuration required.
### Fixed
- Don't crash so hard when email settings are invalid.
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..599610780
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,24 @@
+# Akkoma Code of Conduct
+
+The Akkoma project aims to be **enjoyable** for anyone to participate in, regardless of their identity or level of expertise. To achieve this, the community must create an environment which is **safe** and **equitable**; the following guidelines have been created with these goals in mind.
+
+1. **Treat individuals with respect.** Differing experiences and viewpoints deserve to be respected, and bigotry and harassment are not tolerated under any circumstances.
+ - Individuals should at all times be treated as equals, regardless of their age, gender, sexuality, race, ethnicity, _or any other characteristic_, intrinsic or otherwise.
+ - Behaviour that is harmful in nature should be addressed and corrected *regardless of intent*.
+ - Respect personal boundaries and ask for clarification whenever they are unclear.
+ - (Obviously, hate does not count as merely a "differing viewpoint", because it is harmful in nature.)
+
+2. **Be understanding of differences in communication.** Not everyone is aware of unspoken social cues, and speech that is not intended to be offensive should not be treated as such simply due to an atypical manner of communication.
+ - Somebody who speaks bluntly is not necessarily rude, and somebody who swears a lot is not necessarily volatile.
+ - Try to confirm your interpretation of their intent rather than assuming bad faith.
+ - Someone may not communicate as, or come across as a picture of "professionalism", but this should not be seen as a reason to dismiss them. This is a **casual** space, and communication styles can reflect that.
+
+3. **"Uncomfortable" does not mean "unsafe".** In an ideal world, the community would be safe, equitable, enjoyable, *and* comfortable for all members at all times. Unfortunately, this is not always possible in reality.
+ - Safety and equity will be prioritized over comfort whenever it is necessary to do so.
+ - Weaponizing one's own discomfort to deflect accountability or censor an individual (e.g. "white fragility") is a form of discriminatory conduct.
+
+4. **Let people grow from their mistakes.** Nobody is perfect; even the most well-meaning individual can do something hurtful. Everyone should be given a fair opportunity to explain themselves and correct their behaviour. Portraying someone as inherently malicious prevents improvement and shifts focus away from the *action* that was problematic.
+ - Avoid bringing up past events that do not accurately reflect an individual's current actions or beliefs. (This is, of course, different from providing evidence of a recurring pattern of behaviour.)
+
+---
+This document was adapted from one created by ~keith as part of punks default repository template, and is licensed under CC-BY-SA 4.0. The original template is here:
diff --git a/Dockerfile b/Dockerfile
index c51ebbab0..42ba9616b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,52 +1,50 @@
-FROM elixir:1.9-alpine as build
+FROM elixir:1.13.4-alpine as build
COPY . .
ENV MIX_ENV=prod
RUN apk add git gcc g++ musl-dev make cmake file-dev &&\
- echo "import Mix.Config" > config/prod.secret.exs &&\
+ echo "import Config" > config/prod.secret.exs &&\
mix local.hex --force &&\
mix local.rebar --force &&\
mix deps.get --only prod &&\
mkdir release &&\
mix release --path release
-FROM alpine:3.14
+FROM alpine:3.16
ARG BUILD_DATE
ARG VCS_REF
-LABEL maintainer="ops@pleroma.social" \
- org.opencontainers.image.title="pleroma" \
- org.opencontainers.image.description="Pleroma for Docker" \
- org.opencontainers.image.authors="ops@pleroma.social" \
- org.opencontainers.image.vendor="pleroma.social" \
- org.opencontainers.image.documentation="https://git.pleroma.social/pleroma/pleroma" \
+LABEL org.opencontainers.image.title="akkoma" \
+ org.opencontainers.image.description="Akkoma for Docker" \
+ org.opencontainers.image.vendor="akkoma.dev" \
+ org.opencontainers.image.documentation="https://docs.akkoma.dev/stable/" \
org.opencontainers.image.licenses="AGPL-3.0" \
- org.opencontainers.image.url="https://pleroma.social" \
+ org.opencontainers.image.url="https://akkoma.dev" \
org.opencontainers.image.revision=$VCS_REF \
org.opencontainers.image.created=$BUILD_DATE
-ARG HOME=/opt/pleroma
-ARG DATA=/var/lib/pleroma
+ARG HOME=/opt/akkoma
+ARG DATA=/var/lib/akkoma
RUN apk update &&\
apk add exiftool ffmpeg imagemagick libmagic ncurses postgresql-client &&\
- adduser --system --shell /bin/false --home ${HOME} pleroma &&\
+ adduser --system --shell /bin/false --home ${HOME} akkoma &&\
mkdir -p ${DATA}/uploads &&\
mkdir -p ${DATA}/static &&\
- chown -R pleroma ${DATA} &&\
- mkdir -p /etc/pleroma &&\
- chown -R pleroma /etc/pleroma
+ chown -R akkoma ${DATA} &&\
+ mkdir -p /etc/akkoma &&\
+ chown -R akkoma /etc/akkoma
-USER pleroma
+USER akkoma
-COPY --from=build --chown=pleroma:0 /release ${HOME}
+COPY --from=build --chown=akkoma:0 /release ${HOME}
-COPY ./config/docker.exs /etc/pleroma/config.exs
+COPY ./config/docker.exs /etc/akkoma/config.exs
COPY ./docker-entrypoint.sh ${HOME}
EXPOSE 4000
-ENTRYPOINT ["/opt/pleroma/docker-entrypoint.sh"]
+ENTRYPOINT ["/opt/akkoma/docker-entrypoint.sh"]
diff --git a/README.md b/README.md
index 38ca76003..5debafaea 100644
--- a/README.md
+++ b/README.md
@@ -4,21 +4,21 @@
## About
-This is a fork of Pleroma, which is a microblogging server software that can federate (= exchange messages with) other servers that support ActivityPub. What that means is that you can host a server for yourself or your friends and stay in control of your online identity, but still exchange messages with people on larger servers. Pleroma will federate with all servers that implement ActivityPub, like Friendica, GNU Social, Hubzilla, Mastodon, Misskey, Peertube, and Pixelfed.
+This is a fork of Pleroma, which is a microblogging server software that can federate (= exchange messages with) other servers that support ActivityPub. What that means is that you can host a server for yourself or your friends and stay in control of your online identity, but still exchange messages with people on larger servers. Akkoma will federate with all servers that implement ActivityPub, like Friendica, GNU Social, Hubzilla, Mastodon, Misskey, Peertube, and Pixelfed.
Akkoma is written in Elixir and uses PostgresSQL for data storage.
For clients it supports the [Mastodon client API](https://docs.joinmastodon.org/api/guidelines/) with Pleroma extensions (see the API section on ).
-- [Client Applications for Pleroma](https://docs.akkoma.dev/stable/clients/)
+- [Client Applications for Akkoma](https://docs.akkoma.dev/stable/clients/)
## Installation
### OTP releases (Recommended)
-If you are running Linux (glibc or musl) on x86, the recommended way to install Pleroma is by using OTP releases. OTP releases are as close as you can get to binary releases with Erlang/Elixir. The release is self-contained, and provides everything needed to boot it. The installation instructions are available [here](https://docs.akkoma.dev/stable/installation/otp_en/).
+If you are running Linux (glibc or musl) on x86, the recommended way to install Akkoma is by using OTP releases. OTP releases are as close as you can get to binary releases with Erlang/Elixir. The release is self-contained, and provides everything needed to boot it. The installation instructions are available [here](https://docs.akkoma.dev/stable/installation/otp_en/).
### From Source
-If your platform is not supported, or you just want to be able to edit the source code easily, you may install Pleroma from source.
+If your platform is not supported, or you just want to be able to edit the source code easily, you may install Akkoma from source.
- [Alpine Linux](https://docs.akkoma.dev/stable/installation/alpine_linux_en/)
- [Arch Linux](https://docs.akkoma.dev/stable/installation/arch_linux_en/)
@@ -34,7 +34,7 @@ If your platform is not supported, or you just want to be able to edit the sourc
While we don’t provide docker files, other people have written very good ones. Take a look at or .
### Compilation Troubleshooting
-If you ever encounter compilation issues during the updating of Pleroma, you can try these commands and see if they fix things:
+If you ever encounter compilation issues during the updating of Akkoma, you can try these commands and see if they fix things:
- `mix deps.clean --all`
- `mix local.rebar`
diff --git a/config/config.exs b/config/config.exs
index 9186b011d..f49ec861c 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -215,7 +215,6 @@
],
allow_relay: true,
public: true,
- quarantined_instances: [],
static_dir: "instance/static/",
allowed_post_formats: [
"text/plain",
@@ -259,7 +258,8 @@
show_reactions: true,
password_reset_token_validity: 60 * 60 * 24,
profile_directory: true,
- privileged_staff: false
+ privileged_staff: false,
+ local_bubble: []
config :pleroma, :welcome,
direct_message: [
@@ -267,11 +267,6 @@
sender_nickname: nil,
message: nil
],
- chat_message: [
- enabled: false,
- sender_nickname: nil,
- message: nil
- ],
email: [
enabled: false,
sender: nil,
@@ -411,6 +406,8 @@
accept: [],
reject: []
+config :pleroma, :mrf_inline_quote, prefix: "RE"
+
# threshold of 7 days
config :pleroma, :mrf_object_age,
threshold: 604_800,
@@ -638,13 +635,6 @@
config :pleroma, Pleroma.Emails.NewUsersDigestEmail, enabled: false
-config :prometheus, Pleroma.Web.Endpoint.MetricsExporter,
- enabled: false,
- auth: false,
- ip_whitelist: [],
- path: "/api/pleroma/app_metrics",
- format: :text
-
config :pleroma, Pleroma.ScheduledActivity,
daily_user_limit: 25,
total_user_limit: 300,
@@ -720,6 +710,7 @@
config :pleroma, :frontends,
primary: %{"name" => "pleroma-fe", "ref" => "stable"},
admin: %{"name" => "admin-fe", "ref" => "stable"},
+ mastodon: %{"name" => "mastodon-fe", "ref" => "akkoma"},
swagger: %{
"name" => "swagger-ui",
"ref" => "stable",
@@ -738,9 +729,10 @@
"mastodon-fe" => %{
"name" => "mastodon-fe",
"git" => "https://akkoma.dev/AkkomaGang/masto-fe",
- "build_url" => "https://akkoma-updates.s3-website.fr-par.scw.cloud/frontend/masto-fe.zip",
+ "build_url" =>
+ "https://akkoma-updates.s3-website.fr-par.scw.cloud/frontend/${ref}/masto-fe.zip",
"build_dir" => "distribution",
- "ref" => "develop"
+ "ref" => "akkoma"
},
"admin-fe" => %{
"name" => "admin-fe",
@@ -754,7 +746,7 @@
"git" => "https://gitlab.com/soapbox-pub/soapbox-fe",
"build_url" =>
"https://gitlab.com/soapbox-pub/soapbox-fe/-/jobs/artifacts/${ref}/download?job=build-production",
- "ref" => "v1.0.0",
+ "ref" => "v2.0.0",
"build_dir" => "static"
},
# For developers - enables a swagger frontend to view the openapi spec
@@ -816,6 +808,8 @@
{Pleroma.Search, [max_running: 30, max_waiting: 50]}
]
+config :pleroma, Pleroma.Web.WebFinger, domain: nil, update_nickname_on_user_fetch: true
+
config :pleroma, Pleroma.Search, module: Pleroma.Search.DatabaseSearch
config :pleroma, Pleroma.Search.Meilisearch,
diff --git a/config/description.exs b/config/description.exs
index 098a6f5b7..a44ab2432 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -691,7 +691,7 @@
key_placeholder: "instance",
value_placeholder: "reason",
description:
- "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so",
+ "(Deprecated, will be removed in next release) List of ActivityPub instances where activities will not be sent, and the reason for doing so",
suggestions: [
{"quarantined.com", "Reason"},
{"*.quarantined.com", "Reason"}
@@ -946,7 +946,13 @@
key: :privileged_staff,
type: :boolean,
description:
- "Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
+ "Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses)"
+ },
+ %{
+ key: :local_bubble,
+ type: {:list, :string},
+ description:
+ "List of instances that make up your local bubble (closely-related instances). Used to populate the 'bubble' timeline (domain only)."
}
]
},
@@ -984,35 +990,6 @@
}
]
},
- %{
- key: :chat_message,
- type: :keyword,
- descpiption: "Chat message settings",
- children: [
- %{
- key: :enabled,
- type: :boolean,
- description: "Enables sending a chat message to newly registered users"
- },
- %{
- key: :message,
- type: :string,
- description:
- "A message that will be sent to newly registered users as a chat message",
- suggestions: [
- "Hello, welcome on board!"
- ]
- },
- %{
- key: :sender_nickname,
- type: :string,
- description: "The nickname of the local user that sends a welcome chat message",
- suggestions: [
- "lain"
- ]
- }
- ]
- },
%{
key: :email,
type: :keyword,
@@ -1465,13 +1442,14 @@
%{
key: :theme_color,
type: :string,
- description: "Describe the theme color of the app",
+ description: "Describe the theme color of the app - this is only used for mastodon-fe",
suggestions: ["#282c37", "mediumpurple"]
},
%{
key: :background_color,
type: :string,
- description: "Describe the background color of the app",
+ description:
+ "Describe the background color of the app - this is only used for mastodon-fe",
suggestions: ["#191b22", "aliceblue"]
}
]
@@ -1678,6 +1656,11 @@
type: :boolean,
description: "Sign object fetches with HTTP signatures"
},
+ %{
+ key: :authorized_fetch_mode,
+ type: :boolean,
+ description: "Require HTTP signatures on AP fetches"
+ },
%{
key: :note_replies_output_limit,
type: :integer,
@@ -2605,27 +2588,6 @@
}
]
},
- %{
- group: :pleroma,
- key: :shout,
- type: :group,
- description: "Pleroma shout settings",
- children: [
- %{
- key: :enabled,
- type: :boolean,
- description: "Enables the backend Shoutbox chat feature."
- },
- %{
- key: :limit,
- type: :integer,
- description: "Shout message character limit.",
- suggestions: [
- 5_000
- ]
- }
- ]
- },
%{
group: :pleroma,
key: :http,
@@ -3089,6 +3051,12 @@
description: "Admin frontend",
children: installed_frontend_options
},
+ %{
+ key: :mastodon,
+ type: :map,
+ description: "Mastodon frontend",
+ children: installed_frontend_options
+ },
%{
key: :swagger,
type: :map,
@@ -3166,43 +3134,6 @@
}
]
},
- %{
- group: :prometheus,
- key: Pleroma.Web.Endpoint.MetricsExporter,
- type: :group,
- description: "Prometheus app metrics endpoint configuration",
- children: [
- %{
- key: :enabled,
- type: :boolean,
- description: "[Pleroma extension] Enables app metrics endpoint."
- },
- %{
- key: :ip_whitelist,
- label: "IP Whitelist",
- type: [{:list, :string}, {:list, :charlist}, {:list, :tuple}],
- description: "Restrict access of app metrics endpoint to the specified IP addresses."
- },
- %{
- key: :auth,
- type: [:boolean, :tuple],
- description: "Enables HTTP Basic Auth for app metrics endpoint.",
- suggestion: [false, {:basic, "myusername", "mypassword"}]
- },
- %{
- key: :path,
- type: :string,
- description: "App metrics endpoint URI path.",
- suggestions: ["/api/pleroma/app_metrics"]
- },
- %{
- key: :format,
- type: :atom,
- description: "App metrics endpoint output format.",
- suggestions: [:text, :protobuf]
- }
- ]
- },
%{
group: :pleroma,
key: ConcurrentLimiter,
diff --git a/config/emoji.txt b/config/emoji.txt
deleted file mode 100644
index 1d13437c9..000000000
--- a/config/emoji.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-firefox, /emoji/Firefox.gif, Gif,Fun
-blank, /emoji/blank.png, Fun
-dinosaur, /emoji/dino walking.gif, Gif
-100a, /emoji/100a.png, Fun
diff --git a/config/test.exs b/config/test.exs
index 93d07ff19..a5edb1149 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -126,6 +126,8 @@
config :pleroma, :cachex, provider: Pleroma.CachexMock
+config :pleroma, Pleroma.Web.WebFinger, update_nickname_on_user_fetch: false
+
config :pleroma, :side_effects,
ap_streamer: Pleroma.Web.ActivityPub.ActivityPubMock,
logger: Pleroma.LoggerMock
diff --git a/docs/Makefile b/docs/Makefile
index e51c1d188..022459cf0 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -5,3 +5,5 @@ install:
pipenv install
clean:
rm -rf site
+serve:
+ pipenv run python3 -m http.server -d site
diff --git a/docs/docs/administration/CLI_tasks/user.md b/docs/docs/administration/CLI_tasks/user.md
index 0d19b5622..b7a60751d 100644
--- a/docs/docs/administration/CLI_tasks/user.md
+++ b/docs/docs/administration/CLI_tasks/user.md
@@ -300,3 +300,28 @@
```sh
mix pleroma.user unconfirm_all
```
+
+## Fix following state
+
+Sometimes the system can get into a situation where
+it think you're already following someone and won't send a request
+to the remote instance, or won't let you unfollow someone. This
+bug was fixed, but in case you encounter these weird states:
+
+=== "OTP"
+
+ ```sh
+ ./bin/pleroma_ctl user fix_follow_state localuser remoteuser@example.com
+ ```
+
+=== "From Source"
+
+ ```sh
+ mix pleroma.user fix_follow_state localuser remoteuser@example.com
+ ```
+
+The first argument is the local user's nickname - if you are `myuser@myinstance`, this should be `myuser`.
+
+The second is the remote user, consisting of both nickname AND domain.
+
+If you are a weird follow state situation and cannot resolve it with the above, you may need to co-operate with the remote admin to clear the state their side too - they should provide the arguments *backwards*, i.e `fix_follow_state remote local`.
diff --git a/docs/docs/configuration/cheatsheet.md b/docs/docs/configuration/cheatsheet.md
index c7df00190..71ebf28dc 100644
--- a/docs/docs/configuration/cheatsheet.md
+++ b/docs/docs/configuration/cheatsheet.md
@@ -8,11 +8,6 @@ For from source installations Akkoma configuration works by first importing the
To add configuration to your config file, you can copy it from the base config. The latest version of it can be viewed [here](https://akkoma.dev/AkkomaGang/akkoma/src/branch/develop/config/config.exs). You can also use this file if you don't know how an option is supposed to be formatted.
-## :shout
-
-* `enabled` - Enables the backend Shoutbox chat feature. Defaults to `true`.
-* `limit` - Shout character limit. Defaults to `5_000`
-
## :instance
* `name`: The instance’s name.
* `email`: Email used to reach an Administrator/Moderator of the instance.
@@ -39,7 +34,7 @@ To add configuration to your config file, you can copy it from the base config.
* `federation_reachability_timeout_days`: Timeout (in days) of each external federation target being unreachable prior to pausing federating to it.
* `allow_relay`: Permits remote instances to subscribe to all public posts of your instance. This may increase the visibility of your instance.
* `public`: Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note that there is a dependent setting restricting or allowing unauthenticated access to specific resources, see `restrict_unauthenticated` for more details.
-* `quarantined_instances`: ActivityPub instances where private (DMs, followers-only) activities will not be send.
+* `quarantined_instances`: *DEPRECATED* ActivityPub instances where activities will not be sent. They can still reach there via other means, we just won't send them.
* `allowed_post_formats`: MIME-type list of formats allowed to be posted (transformed into HTML).
* `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscores/dashes). This will break federation with
older software for theses nicknames.
@@ -77,10 +72,6 @@ To add configuration to your config file, you can copy it from the base config.
* `enabled`: Enables the send a direct message to a newly registered user. Defaults to `false`.
* `sender_nickname`: The nickname of the local user that sends the welcome message.
* `message`: A message that will be send to a newly registered users as a direct message.
-* `chat_message`: - welcome message sent as a chat message.
- * `enabled`: Enables the send a chat message to a newly registered user. Defaults to `false`.
- * `sender_nickname`: The nickname of the local user that sends the welcome message.
- * `message`: A message that will be send to a newly registered users as a chat message.
* `email`: - welcome message sent as a email.
* `enabled`: Enables the send a welcome email to a newly registered user. Defaults to `false`.
* `sender`: The email address or tuple with `{nickname, email}` that will use as sender to the welcome email.
@@ -140,7 +131,7 @@ To add configuration to your config file, you can copy it from the base config.
* `media_removal`: List of instances to strip media attachments from and the reason for doing so.
* `media_nsfw`: List of instances to tag all media as NSFW (sensitive) from and the reason for doing so.
* `federated_timeline_removal`: List of instances to remove from the Federated Timeline (aka The Whole Known Network) and the reason for doing so.
-* `reject`: List of instances to reject activities (except deletes) from and the reason for doing so.
+* `reject`: List of instances to reject activities (except deletes) from and the reason for doing so. Additionally prevents activities from being sent to that instance.
* `accept`: List of instances to only accept activities (except deletes) from and the reason for doing so.
* `followers_only`: Force posts from the given instances to be visible by followers only and the reason for doing so.
* `report_removal`: List of instances to reject reports from and the reason for doing so.
@@ -292,14 +283,19 @@ config :pleroma, :frontends,
"name" => "swagger-ui",
"ref" => "stable",
"enabled" => true
- }
+ },
+ mastodon: %{
+ "name" => "mastodon-fe",
+ "ref" => "akkoma"
+ }
```
* `:primary` - The frontend that will be served at `/`
* `:admin` - The frontend that will be served at `/pleroma/admin`
* `:swagger` - Config for developers to act as an API reference to be served at `/akkoma/swaggerui/` (trailing slash _needed_). Disabled by default.
+* `:mastodon` - The mastodon-fe configuration. This shouldn't need to be changed. This is served at `/web` when installed.
-### :static_fe
+### :static\_fe
Render profiles and posts using server-generated HTML that is viewable without using JavaScript.
@@ -1043,7 +1039,22 @@ config :pleroma, Pleroma.Formatter,
## Custom Runtime Modules (`:modules`)
-* `runtime_dir`: A path to custom Elixir modules (such as MRF policies).
+* `runtime_dir`: A path to custom Elixir modules, such as MRF policies or
+ custom authenticators. These modules will be loaded on boot, and can be
+ contained in subdirectories. It is advised to use version-controlled
+ subdirectories to make management of them a bit easier. Note that only
+ files with the extension `.ex` will be loaded.
+
+```elixir
+config :pleroma, :modules, runtime_dir: "instance/modules"
+```
+
+### Adding a module
+
+```bash
+cd instance/modules/
+git clone
+```
## :configurable_from_database
diff --git a/docs/docs/configuration/how_to_serve_another_domain_for_webfinger.md b/docs/docs/configuration/how_to_serve_another_domain_for_webfinger.md
new file mode 100644
index 000000000..ccf13ad84
--- /dev/null
+++ b/docs/docs/configuration/how_to_serve_another_domain_for_webfinger.md
@@ -0,0 +1,62 @@
+# How to use a different domain name for Akkoma and the users it serves
+
+Akkoma users are primarily identified by a `user@example.org` handle, and you might want this identifier to be the same as your email or jabber account, for instance.
+However, in this case, you are almost certainly serving some web content on `https://example.org` already, and you might want to use another domain (say `akkoma.example.org`) for Akkoma itself.
+
+Akkoma supports that, but it might be tricky to set up, and any error might prevent you from federating with other instances.
+
+*If you are already running Akkoma on `example.org`, it is no longer possible to move it to `akkoma.example.org`.*
+
+## Account identifiers
+
+It is important to understand that for federation purposes, a user in Akkoma has two unique identifiers associated:
+
+- A webfinger `acct:` URI, used for discovery and as a verifiable global name for the user across Akkoma instances. In our example, our account's acct: URI is `acct:user@example.org`
+- An author/actor URI, used in every other aspect of federation. This is the way in which users are identified in ActivityPub, the underlying protocol used for federation with other Akkoma instances.
+In our case, it is `https://akkoma.example.org/users/user`.
+
+Both account identifiers are unique and required for Akkoma. An important risk if you set up your Akkoma instance incorrectly is to create two users (with different acct: URIs) with conflicting author/actor URIs.
+
+## WebFinger
+
+As said earlier, each Akkoma user has an `acct`: URI, which is used for discovery and authentication. When you add @user@example.org, a webfinger query is performed. This is done in two steps:
+
+1. Querying `https://example.org/.well-known/host-meta` (where the domain of the URL matches the domain part of the `acct`: URI) to get information on how to perform the query.
+This file will indeed contain a URL template of the form `https://example.org/.well-known/webfinger?resource={uri}` that will be used in the second step.
+2. Fill the returned template with the `acct`: URI to be queried and perform the query: `https://example.org/.well-known/webfinger?resource=acct:user@example.org`
+
+## Configuring your Akkoma instance
+
+**_DO NOT ATTEMPT TO CONFIGURE YOUR INSTANCE THIS WAY IF YOU DID NOT UNDERSTAND THE ABOVE_**
+
+### Configuring Akkoma
+
+Akkoma has a two configuration settings to enable using different domains for your users and Akkoma itself. `host` in `Pleroma.Web.Endpoint` and `domain` in `Pleroma.Web.WebFinger`. When the latter is not set, it defaults to the value of `host`.
+
+*Be extra careful when configuring your Akkoma instance, as changing `host` may cause remote instances to register different accounts with the same author/actor URI, which will result in federation issues!*
+
+```elixir
+config :pleroma, Pleroma.Web.Endpoint,
+ url: [host: "pleroma.example.org"]
+
+config :pleroma, Pleroma.Web.WebFinger, domain: "example.org"
+```
+
+- `domain` - is the domain for which your Akkoma instance has authority, it's the domain used in `acct:` URI. In our example, `domain` would be set to `example.org`.
+- `host` - is the domain used for any URL generated for your instance, including the author/actor URL's. In our case, that would be `akkoma.example.org`.
+
+### Configuring WebFinger domain
+
+Now, you have Akkoma running at `https://akkoma.example.org` as well as a website at `https://example.org`. If you recall how webfinger queries work, the first step is to query `https://example.org/.well-known/host-meta`, which will contain an URL template.
+
+Therefore, the easiest way to configure `example.org` is to redirect `/.well-known/host-meta` to `akkoma.example.org`.
+
+With nginx, it would be as simple as adding:
+
+```nginx
+location = /.well-known/host-meta {
+ return 301 https://akkoma.example.org$request_uri;
+}
+```
+
+in example.org's server block.
diff --git a/docs/docs/development/API/admin_api.md b/docs/docs/development/API/admin_api.md
index f14081893..241e0b95c 100644
--- a/docs/docs/development/API/admin_api.md
+++ b/docs/docs/development/API/admin_api.md
@@ -1031,7 +1031,6 @@ Most of the settings will be applied in `runtime`, this means that you don't nee
- `:hackney_pools`
- `:connections_pool`
- `:pools`
- - `:chat`
- partially settings inside these keys:
- `:seconds_valid` in `Pleroma.Captcha`
- `:proxy_remote` in `Pleroma.Upload`
@@ -1411,127 +1410,6 @@ Loads json generated from `config/descriptions.exs`.
```
-## GET /api/v1/pleroma/admin/users/:nickname/chats
-
-### List a user's chats
-
-- Params: None
-
-- Response:
-
-```json
-[
- {
- "sender": {
- "id": "someflakeid",
- "username": "somenick",
- ...
- },
- "receiver": {
- "id": "someflakeid",
- "username": "somenick",
- ...
- },
- "id" : "1",
- "unread" : 2,
- "last_message" : {...}, // The last message in that chat
- "updated_at": "2020-04-21T15:11:46.000Z"
- }
-]
-```
-
-## GET /api/v1/pleroma/admin/chats/:chat_id
-
-### View a single chat
-
-- Params: None
-
-- Response:
-
-```json
-{
- "sender": {
- "id": "someflakeid",
- "username": "somenick",
- ...
- },
- "receiver": {
- "id": "someflakeid",
- "username": "somenick",
- ...
- },
- "id" : "1",
- "unread" : 2,
- "last_message" : {...}, // The last message in that chat
- "updated_at": "2020-04-21T15:11:46.000Z"
-}
-```
-
-## GET /api/v1/pleroma/admin/chats/:chat_id/messages
-
-### List the messages in a chat
-
-- Params: `max_id`, `min_id`
-
-- Response:
-
-```json
-[
- {
- "account_id": "someflakeid",
- "chat_id": "1",
- "content": "Check this out :firefox:",
- "created_at": "2020-04-21T15:11:46.000Z",
- "emojis": [
- {
- "shortcode": "firefox",
- "static_url": "https://dontbulling.me/emoji/Firefox.gif",
- "url": "https://dontbulling.me/emoji/Firefox.gif",
- "visible_in_picker": false
- }
- ],
- "id": "13",
- "unread": true
- },
- {
- "account_id": "someflakeid",
- "chat_id": "1",
- "content": "Whats' up?",
- "created_at": "2020-04-21T15:06:45.000Z",
- "emojis": [],
- "id": "12",
- "unread": false
- }
-]
-```
-
-## DELETE /api/v1/pleroma/admin/chats/:chat_id/messages/:message_id
-
-### Delete a single message
-
-- Params: None
-
-- Response:
-
-```json
-{
- "account_id": "someflakeid",
- "chat_id": "1",
- "content": "Check this out :firefox:",
- "created_at": "2020-04-21T15:11:46.000Z",
- "emojis": [
- {
- "shortcode": "firefox",
- "static_url": "https://dontbulling.me/emoji/Firefox.gif",
- "url": "https://dontbulling.me/emoji/Firefox.gif",
- "visible_in_picker": false
- }
- ],
- "id": "13",
- "unread": false
-}
-```
-
## `GET /api/v1/pleroma/admin/instance_document/:document_name`
### Get an instance document
@@ -1636,3 +1514,117 @@ Returns the content of the document
"error": "Could not install frontend"
}
```
+
+## `GET /api/v1/pleroma/admin/announcements`
+
+### List announcements
+
+- Params: `offset`, `limit`
+
+- Response: JSON, list of announcements
+
+```json
+[
+ {
+ "id": "AHDp0GBdRn1EPN5HN2",
+ "content": "some content",
+ "starts_at": null,
+ "ends_at": null,
+ "all_day": false,
+ "published_at": "2022-03-09T02:13:05",
+ "reactions": [],
+ "statuses": [],
+ "tags": [],
+ "emojis": [],
+ "updated_at": "2022-03-09T02:13:05"
+ }
+]
+```
+
+Note that this differs from the Mastodon API variant: Mastodon API only returns *active* announcements, while this returns all.
+
+## `GET /api/v1/pleroma/admin/announcements/:id`
+
+### Display one announcement
+
+- Response: JSON, one announcement
+
+```json
+{
+ "id": "AHDp0GBdRn1EPN5HN2",
+ "content": "some content",
+ "starts_at": null,
+ "ends_at": null,
+ "all_day": false,
+ "published_at": "2022-03-09T02:13:05",
+ "reactions": [],
+ "statuses": [],
+ "tags": [],
+ "emojis": [],
+ "updated_at": "2022-03-09T02:13:05"
+}
+```
+
+## `POST /api/v1/pleroma/admin/announcements`
+
+### Create an announcement
+
+- Params:
+ - `content`: string, required, announcement content
+ - `starts_at`: datetime, optional, default to null, the time when the announcement will become active (displayed to users); if it is null, the announcement will be active immediately
+ - `ends_at`: datetime, optional, default to null, the time when the announcement will become inactive (no longer displayed to users); if it is null, the announcement will be active until an admin deletes it
+ - `all_day`: boolean, optional, default to false, tells the client whether to only display dates for `starts_at` and `ends_at`
+
+- Response: JSON, created announcement
+
+```json
+{
+ "id": "AHDp0GBdRn1EPN5HN2",
+ "content": "some content",
+ "starts_at": null,
+ "ends_at": null,
+ "all_day": false,
+ "published_at": "2022-03-09T02:13:05",
+ "reactions": [],
+ "statuses": [],
+ "tags": [],
+ "emojis": [],
+ "updated_at": "2022-03-09T02:13:05"
+}
+```
+
+## `PATCH /api/v1/pleroma/admin/announcements/:id`
+
+### Change an announcement
+
+- Params: same as `POST /api/v1/pleroma/admin/announcements`, except no param is required.
+
+- Updates the announcement according to params. Missing params are kept as-is.
+
+- Response: JSON, updated announcement
+
+```json
+{
+ "id": "AHDp0GBdRn1EPN5HN2",
+ "content": "some content",
+ "starts_at": null,
+ "ends_at": null,
+ "all_day": false,
+ "published_at": "2022-03-09T02:13:05",
+ "reactions": [],
+ "statuses": [],
+ "tags": [],
+ "emojis": [],
+ "updated_at": "2022-03-09T02:13:05"
+}
+```
+
+## `DELETE /api/v1/pleroma/admin/announcements/:id`
+
+### Delete an announcement
+
+- Response: JSON, empty object
+
+```json
+{}
+```
diff --git a/docs/docs/development/API/chats.md b/docs/docs/development/API/chats.md
deleted file mode 100644
index 69b214ab1..000000000
--- a/docs/docs/development/API/chats.md
+++ /dev/null
@@ -1,255 +0,0 @@
-# Chats
-
-Chats are a way to represent an IM-style conversation between two actors. They are not the same as direct messages and they are not `Status`es, even though they have a lot in common.
-
-## Why Chats?
-
-There are no 'visibility levels' in ActivityPub, their definition is purely a Mastodon convention. Direct Messaging between users on the fediverse has mostly been modeled by using ActivityPub addressing following Mastodon conventions on normal `Note` objects. In this case, a 'direct message' would be a message that has no followers addressed and also does not address the special public actor, but just the recipients in the `to` field. It would still be a `Note` and is presented with other `Note`s as a `Status` in the API.
-
-This is an awkward setup for a few reasons:
-
-- As DMs generally still follow the usual `Status` conventions, it is easy to accidentally pull somebody into a DM thread by mentioning them. (e.g. "I hate @badguy so much")
-- It is possible to go from a publicly addressed `Status` to a DM reply, back to public, then to a 'followers only' reply, and so on. This can be become very confusing, as it is unclear which user can see which part of the conversation.
-- The standard `Status` format of implicit addressing also leads to rather ugly results if you try to display the messages as a chat, because all the recipients are always mentioned by name in the message.
-- As direct messages are posted with the same api call (and usually same frontend component) as public messages, accidentally making a public message private or vice versa can happen easily. Client bugs can also lead to this, accidentally making private messages public.
-
-As a measure to improve this situation, the `Conversation` concept and related Akkoma extensions were introduced. While it made it possible to work around a few of the issues, many of the problems remained and it didn't see much adoption because it was too complicated to use correctly.
-
-## Chats explained
-For this reasons, Chats are a new and different entity, both in the API as well as in ActivityPub. A quick overview:
-
-- Chats are meant to represent an instant message conversation between two actors. For now these are only 1-on-1 conversations, but the other actor can be a group in the future.
-- Chat messages have the ActivityPub type `ChatMessage`. They are not `Note`s. Servers that don't understand them will just drop them.
-- The only addressing allowed in `ChatMessage`s is one single ActivityPub actor in the `to` field.
-- There's always only one Chat between two actors. If you start chatting with someone and later start a 'new' Chat, the old Chat will be continued.
-- `ChatMessage`s are posted with a different api, making it very hard to accidentally send a message to the wrong person.
-- `ChatMessage`s don't show up in the existing timelines.
-- Chats can never go from private to public. They are always private between the two actors.
-
-## Caveats
-
-- Chats are NOT E2E encrypted (yet). Security is still the same as email.
-
-## API
-
-In general, the way to send a `ChatMessage` is to first create a `Chat`, then post a message to that `Chat`. `Group`s will later be supported by making them a sub-type of `Account`.
-
-This is the overview of using the API. The API is also documented via OpenAPI, so you can view it and play with it by pointing SwaggerUI or a similar OpenAPI tool to `https://yourinstance.tld/api/openapi`.
-
-### Creating or getting a chat.
-
-To create or get an existing Chat for a certain recipient (identified by Account ID)
-you can call:
-
-`POST /api/v1/pleroma/chats/by-account-id/:account_id`
-
-The account id is the normal FlakeId of the user
-```
-POST /api/v1/pleroma/chats/by-account-id/someflakeid
-```
-
-If you already have the id of a chat, you can also use
-
-```
-GET /api/v1/pleroma/chats/:id
-```
-
-There will only ever be ONE Chat for you and a given recipient, so this call
-will return the same Chat if you already have one with that user.
-
-Returned data:
-
-```json
-{
- "account": {
- "id": "someflakeid",
- "username": "somenick",
- ...
- },
- "id" : "1",
- "unread" : 2,
- "last_message" : {...}, // The last message in that chat
- "updated_at": "2020-04-21T15:11:46.000Z"
-}
-```
-
-### Marking a chat as read
-
-To mark a number of messages in a chat up to a certain message as read, you can use
-
-`POST /api/v1/pleroma/chats/:id/read`
-
-
-Parameters:
-- last_read_id: Given this id, all chat messages until this one will be marked as read. Required.
-
-
-Returned data:
-
-```json
-{
- "account": {
- "id": "someflakeid",
- "username": "somenick",
- ...
- },
- "id" : "1",
- "unread" : 0,
- "updated_at": "2020-04-21T15:11:46.000Z"
-}
-```
-
-### Marking a single chat message as read
-
-To set the `unread` property of a message to `false`
-
-`POST /api/v1/pleroma/chats/:id/messages/:message_id/read`
-
-Returned data:
-
-The modified chat message
-
-### Getting a list of Chats
-
-`GET /api/v1/pleroma/chats`
-
-This will return a list of chats that you have been involved in, sorted by their
-last update (so new chats will be at the top).
-
-Parameters:
-
-- with_muted: Include chats from muted users (boolean).
-
-Returned data:
-
-```json
-[
- {
- "account": {
- "id": "someflakeid",
- "username": "somenick",
- ...
- },
- "id" : "1",
- "unread" : 2,
- "last_message" : {...}, // The last message in that chat
- "updated_at": "2020-04-21T15:11:46.000Z"
- }
-]
-```
-
-The recipient of messages that are sent to this chat is given by their AP ID.
-No pagination is implemented for now.
-
-### Getting the messages for a Chat
-
-For a given Chat id, you can get the associated messages with
-
-`GET /api/v1/pleroma/chats/:id/messages`
-
-This will return all messages, sorted by most recent to least recent. The usual
-pagination options are implemented.
-
-Returned data:
-
-```json
-[
- {
- "account_id": "someflakeid",
- "chat_id": "1",
- "content": "Check this out :firefox:",
- "created_at": "2020-04-21T15:11:46.000Z",
- "emojis": [
- {
- "shortcode": "firefox",
- "static_url": "https://dontbulling.me/emoji/Firefox.gif",
- "url": "https://dontbulling.me/emoji/Firefox.gif",
- "visible_in_picker": false
- }
- ],
- "id": "13",
- "unread": true
- },
- {
- "account_id": "someflakeid",
- "chat_id": "1",
- "content": "Whats' up?",
- "created_at": "2020-04-21T15:06:45.000Z",
- "emojis": [],
- "id": "12",
- "unread": false,
- "idempotency_key": "75442486-0874-440c-9db1-a7006c25a31f"
- }
-]
-```
-
-- idempotency_key: The copy of the `idempotency-key` HTTP request header that can be used for optimistic message sending. Included only during the first few minutes after the message creation.
-
-### Posting a chat message
-
-Posting a chat message for given Chat id works like this:
-
-`POST /api/v1/pleroma/chats/:id/messages`
-
-Parameters:
-- content: The text content of the message. Optional if media is attached.
-- media_id: The id of an upload that will be attached to the message.
-
-Currently, no formatting beyond basic escaping and emoji is implemented.
-
-Returned data:
-
-```json
-{
- "account_id": "someflakeid",
- "chat_id": "1",
- "content": "Check this out :firefox:",
- "created_at": "2020-04-21T15:11:46.000Z",
- "emojis": [
- {
- "shortcode": "firefox",
- "static_url": "https://dontbulling.me/emoji/Firefox.gif",
- "url": "https://dontbulling.me/emoji/Firefox.gif",
- "visible_in_picker": false
- }
- ],
- "id": "13",
- "unread": false
-}
-```
-
-### Deleting a chat message
-
-Deleting a chat message for given Chat id works like this:
-
-`DELETE /api/v1/pleroma/chats/:chat_id/messages/:message_id`
-
-Returned data is the deleted message.
-
-### Notifications
-
-There's a new `pleroma:chat_mention` notification, which has this form. It is not given out in the notifications endpoint by default, you need to explicitly request it with `include_types[]=pleroma:chat_mention`:
-
-```json
-{
- "id": "someid",
- "type": "pleroma:chat_mention",
- "account": { ... } // User account of the sender,
- "chat_message": {
- "chat_id": "1",
- "id": "10",
- "content": "Hello",
- "account_id": "someflakeid",
- "unread": false
- },
- "created_at": "somedate"
-}
-```
-
-### Streaming
-
-There is an additional `user:pleroma_chat` stream. Incoming chat messages will make the current chat be sent to this `user` stream. The `event` of an incoming chat message is `pleroma:chat_update`. The payload is the updated chat with the incoming chat message in the `last_message` field.
-
-### Web Push
-
-If you want to receive push messages for this type, you'll need to add the `pleroma:chat_mention` type to your alerts in the push subscription.
diff --git a/docs/docs/development/API/differences_in_mastoapi_responses.md b/docs/docs/development/API/differences_in_mastoapi_responses.md
index 6130d716b..4465784bf 100644
--- a/docs/docs/development/API/differences_in_mastoapi_responses.md
+++ b/docs/docs/development/API/differences_in_mastoapi_responses.md
@@ -99,13 +99,11 @@ Has these additional fields under the `pleroma` object:
- `hide_followers_count`: boolean, true when the user has follower stat hiding enabled
- `hide_follows_count`: boolean, true when the user has follow stat hiding enabled
- `settings_store`: A generic map of settings for frontends. Opaque to the backend. Only returned in `/api/v1/accounts/verify_credentials` and `/api/v1/accounts/update_credentials`
-- `chat_token`: The token needed for Akkoma shoutbox. Only returned in `/api/v1/accounts/verify_credentials`
- `deactivated`: boolean, true when the user is deactivated
- `allow_following_move`: boolean, true when the user allows automatically follow moved following accounts
- `unread_conversation_count`: The count of unread conversations. Only returned to the account owner.
- `unread_notifications_count`: The count of unread notifications. Only returned to the account owner.
- `notification_settings`: object, can be absent. See `/api/v1/pleroma/notification_settings` for the parameters/keys returned.
-- `accepts_chat_messages`: boolean, but can be null if we don't have that information about a user
- `favicon`: nullable URL string, Favicon image of the user's instance
### Source
@@ -159,15 +157,6 @@ The `type` value is `pleroma:emoji_reaction`. Has these fields:
- `account`: The account of the user who reacted
- `status`: The status that was reacted on
-### ChatMention Notification (not default)
-
-This notification has to be requested explicitly.
-
-The `type` value is `pleroma:chat_mention`
-
-- `account`: The account who sent the message
-- `chat_message`: The chat message
-
### Report Notification (not default)
This notification has to be requested explicitly.
@@ -182,7 +171,7 @@ The `type` value is `pleroma:report`
Accepts additional parameters:
- `exclude_visibilities`: will exclude the notifications for activities with the given visibilities. The parameter accepts an array of visibility types (`public`, `unlisted`, `private`, `direct`). Usage example: `GET /api/v1/notifications?exclude_visibilities[]=direct&exclude_visibilities[]=private`.
-- `include_types`: will include the notifications for activities with the given types. The parameter accepts an array of types (`mention`, `follow`, `reblog`, `favourite`, `move`, `pleroma:emoji_reaction`, `pleroma:chat_mention`, `pleroma:report`). Usage example: `GET /api/v1/notifications?include_types[]=mention&include_types[]=reblog`.
+- `include_types`: will include the notifications for activities with the given types. The parameter accepts an array of types (`mention`, `follow`, `reblog`, `favourite`, `move`, `pleroma:emoji_reaction`, `pleroma:report`). Usage example: `GET /api/v1/notifications?include_types[]=mention&include_types[]=reblog`.
## DELETE `/api/v1/notifications/destroy_multiple`
@@ -240,7 +229,6 @@ Additional parameters can be added to the JSON body/Form data:
- `pleroma_background_image` - sets the background image of the user. Can be set to "" (an empty string) to reset.
- `discoverable` - if true, external services (search bots) etc. are allowed to index / list the account (regardless of this setting, user will still appear in regular search results).
- `actor_type` - the type of this account.
-- `accepts_chat_messages` - if false, this account will reject all chat messages.
- `language` - user's preferred language for receiving emails (digest, confirmation, etc.)
All images (avatar, banner and background) can be reset to the default by sending an empty string ("") instead of a file.
@@ -300,7 +288,6 @@ Has these additional parameters (which are the same as in Akkoma-API):
`GET /api/v1/instance` has additional fields
- `max_toot_chars`: The maximum characters per post
-- `chat_limit`: The maximum characters per chat message
- `description_limit`: The maximum characters per image description
- `poll_limits`: The limits of polls
- `upload_limit`: The maximum upload file size
@@ -321,7 +308,6 @@ Has these additional parameters (which are the same as in Akkoma-API):
Permits these additional alert types:
-- pleroma:chat_mention
- pleroma:emoji_reaction
## Markers
@@ -332,10 +318,6 @@ Has these additional fields under the `pleroma` object:
## Streaming
-### Chats
-
-There is an additional `user:pleroma_chat` stream. Incoming chat messages will make the current chat be sent to this `user` stream. The `event` of an incoming chat message is `pleroma:chat_update`. The payload is the updated chat with the incoming chat message in the `last_message` field.
-
### Remote timelines
For viewing remote server timelines, there are `public:remote` and `public:remote:media` streams. Each of these accept a parameter like `?instance=lain.com`.
diff --git a/docs/docs/development/API/nodeinfo.md b/docs/docs/development/API/nodeinfo.md
index 30150ac47..08453cdc8 100644
--- a/docs/docs/development/API/nodeinfo.md
+++ b/docs/docs/development/API/nodeinfo.md
@@ -44,11 +44,8 @@ See also [the Nodeinfo standard](https://nodeinfo.diaspora.software/).
"shareable_emoji_packs",
"multifetch",
"pleroma:api/v1/notifications:include_types_filter",
- "chat",
- "shout",
"relay",
- "pleroma_emoji_reactions",
- "pleroma_chat_messages"
+ "pleroma_emoji_reactions"
],
"federation":{
"enabled":true,
@@ -204,11 +201,8 @@ See also [the Nodeinfo standard](https://nodeinfo.diaspora.software/).
"shareable_emoji_packs",
"multifetch",
"pleroma:api/v1/notifications:include_types_filter",
- "chat",
- "shout",
"relay",
- "pleroma_emoji_reactions",
- "pleroma_chat_messages"
+ "pleroma_emoji_reactions"
],
"federation":{
"enabled":true,
diff --git a/docs/docs/development/API/pleroma_api.md b/docs/docs/development/API/pleroma_api.md
index 1c4c959f0..a34948878 100644
--- a/docs/docs/development/API/pleroma_api.md
+++ b/docs/docs/development/API/pleroma_api.md
@@ -576,38 +576,6 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
* Response: the archive of the pack with a 200 status code, 403 if the pack is not set as shared,
404 if the pack does not exist
-## `GET /api/v1/pleroma/accounts/:id/scrobbles`
-### Requests a list of current and recent Listen activities for an account
-* Method `GET`
-* Authentication: not required
-* Params: None
-* Response: An array of media metadata entities.
-* Example response:
-```json
-[
- {
- "account": {...},
- "id": "1234",
- "title": "Some Title",
- "artist": "Some Artist",
- "album": "Some Album",
- "length": 180000,
- "created_at": "2019-09-28T12:40:45.000Z"
- }
-]
-```
-
-## `POST /api/v1/pleroma/scrobble`
-### Creates a new Listen activity for an account
-* Method `POST`
-* Authentication: required
-* Params:
- * `title`: the title of the media playing
- * `album`: the album of the media playing [optional]
- * `artist`: the artist of the media playing [optional]
- * `length`: the length of the media playing [optional]
-* Response: the newly created media metadata entity representing the Listen activity
-
# Emoji Reactions
Emoji reactions work a lot like favourites do. They make it possible to react to a post with a single emoji character. To detect the presence of this feature, you can check `pleroma_emoji_reactions` entry in the features list of nodeinfo.
diff --git a/docs/docs/development/ap_extensions.md b/docs/docs/development/ap_extensions.md
index 3d1caeb3e..bf9420272 100644
--- a/docs/docs/development/ap_extensions.md
+++ b/docs/docs/development/ap_extensions.md
@@ -26,40 +26,3 @@ Response: HTTP 201 Created with the object into the body, no `Location` header p
The object given in the reponse should then be inserted into an Object's `attachment` field.
-## ChatMessages
-
-`ChatMessage`s are the messages sent in 1-on-1 chats. They are similar to
-`Note`s, but the addresing is done by having a single AP actor in the `to`
-field. Addressing multiple actors is not allowed. These messages are always
-private, there is no public version of them. They are created with a `Create`
-activity.
-
-They are part of the `litepub` namespace as `http://litepub.social/ns#ChatMessage`.
-
-Example:
-
-```json
-{
- "actor": "http://2hu.gensokyo/users/raymoo",
- "id": "http://2hu.gensokyo/objects/1",
- "object": {
- "attributedTo": "http://2hu.gensokyo/users/raymoo",
- "content": "You expected a cute girl? Too bad.",
- "id": "http://2hu.gensokyo/objects/2",
- "published": "2020-02-12T14:08:20Z",
- "to": [
- "http://2hu.gensokyo/users/marisa"
- ],
- "type": "ChatMessage"
- },
- "published": "2018-02-12T14:08:20Z",
- "to": [
- "http://2hu.gensokyo/users/marisa"
- ],
- "type": "Create"
-}
-```
-
-This setup does not prevent multi-user chats, but these will have to go through
-a `Group`, which will be the recipient of the messages and then `Announce` them
-to the users in the `Group`.
diff --git a/docs/docs/installation/debian_based_jp.md b/docs/docs/installation/debian_based_jp.md
deleted file mode 100644
index ec829c903..000000000
--- a/docs/docs/installation/debian_based_jp.md
+++ /dev/null
@@ -1,188 +0,0 @@
-# Akkomaの入れ方
-## 日本語訳について
-
-この記事は [Installing on Debian based distributions](Installing on Debian based distributions) の日本語訳です。何かがおかしいと思ったら、原文を見てください。
-
-## インストール
-
-このガイドはDebian Stretchを利用することを想定しています。Ubuntu 16.04や18.04でもおそらく動作します。また、ユーザはrootもしくはsudoにより管理者権限を持っていることを前提とします。もし、以下の操作をrootユーザで行う場合は、 `sudo` を無視してください。ただし、`sudo -Hu akkoma` のようにユーザを指定している場合には `su -s $SHELL -c 'command'` を代わりに使ってください。
-
-### 必要なソフトウェア
-
-- PostgreSQL 9.6以上 (Ubuntu16.04では9.5しか提供されていないので,[](https://www.postgresql.org/download/linux/ubuntu/)こちらから新しいバージョンを入手してください)
-- `postgresql-contrib` 9.6以上 (同上)
-- Elixir 1.8 以上 ([Debianのリポジトリからインストールしないこと!!! ここからインストールすること!](https://elixir-lang.org/install.html#unix-and-unix-like)。または [asdf](https://github.com/asdf-vm/asdf) をakkomaユーザーでインストールしてください)
-- `erlang-dev`
-- `erlang-nox`
-- `git`
-- `build-essential`
-- `cmake`
-- `libmagic-dev`
-
-#### このガイドで利用している追加パッケージ
-
-- `nginx` (おすすめです。他のリバースプロキシを使う場合は、参考となる設定をこのリポジトリから探してください)
-- `certbot` (または何らかのLet's Encrypt向けACMEクライアント)
-- `ImageMagick`
-- `ffmpeg`
-- `exiftool`
-
-### システムを準備する
-
-* まずシステムをアップデートしてください。
-```
-sudo apt update
-sudo apt full-upgrade
-```
-
-* 上記に挙げたパッケージをインストールしておきます。
-```
-sudo apt install git build-essential postgresql postgresql-contrib cmake ffmpeg imagemagick libmagic-dev
-```
-
-### ElixirとErlangをインストールします
-
-* Erlangのリポジトリをダウンロードおよびインストールします。
-```
-wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
-sudo dpkg -i /tmp/erlang-solutions_2.0_all.deb
-```
-
-* ElixirとErlangをインストールします、
-```
-sudo apt update
-sudo apt install elixir erlang-dev erlang-nox
-```
-
-### オプションパッケージ: [`docs/installation/optional/media_graphics_packages.md`](../installation/optional/media_graphics_packages.md)
-
-```shell
-sudo apt install imagemagick ffmpeg libimage-exiftool-perl
-```
-
-### Akkoma BE (バックエンド) をインストールします
-
-* Akkoma用に新しいユーザーを作ります。
-
-```
-sudo useradd -r -s /bin/false -m -d /var/lib/akkoma -U akkoma
-```
-
-**注意**: Akkomaユーザとして単発のコマンドを実行したい場合はは、`sudo -Hu akkoma command` を使ってください。シェルを使いたい場合は `sudo -Hu akkoma $SHELL`です。もし `sudo` を使わない場合は、rootユーザで `su -l akkoma -s $SHELL -c 'command'` とすることでコマンドを、`su -l akkoma -s $SHELL` とすることでシェルを開始できます。
-
-* Gitリポジトリをクローンします。
-```
-sudo mkdir -p /opt/akkoma
-sudo chown -R akkoma:akkoma /opt/akkoma
-sudo -Hu akkoma git clone https://akkoma.dev/AkkomaGang/akkoma.git /opt/akkoma
-```
-
-* 新しいディレクトリに移動します。
-```
-cd /opt/akkoma
-```
-
-* Akkomaが依存するパッケージをインストールします。Hexをインストールしてもよいか聞かれたら、yesを入力してください。
-```
-sudo -Hu akkoma mix deps.get
-```
-
-* コンフィギュレーションを生成します。
-```
-sudo -Hu akkoma MIX_ENV=prod mix pleroma.instance gen
-```
- * rebar3をインストールしてもよいか聞かれたら、yesを入力してください。
- * このときにakkomaの一部がコンパイルされるため、この処理には時間がかかります。
- * あなたのインスタンスについて、いくつかの質問されます。この質問により `config/generated_config.exs` という設定ファイルが生成されます。
-
-
-* コンフィギュレーションを確認して、もし問題なければ、ファイル名を変更してください。
-```
-sudo -Hu akkoma mv config/{generated_config.exs,prod.secret.exs}
-```
-
-* 先程のコマンドで、すでに `config/setup_db.psql` というファイルが作られています。このファイルをもとに、データベースを作成します。
-```
-sudo -Hu akkoma MIX_ENV=prod mix pleroma.instance gen
-```
-
-* そして、データベースのマイグレーションを実行します。
-```
-sudo -Hu akkoma MIX_ENV=prod mix ecto.migrate
-```
-
-* これでAkkomaを起動できるようになりました。
-```
-sudo -Hu akkoma MIX_ENV=prod mix phx.server
-```
-
-### インストールの最終段階
-
-あなたの新しいインスタンスを世界に向けて公開するには、nginx等のWebサーバやプロキシサーバをAkkomaの前段に使用する必要があります。また、Akkoma のためにシステムサービスファイルを作成する必要があります。
-
-#### Nginx
-
-* まだインストールしていないなら、nginxをインストールします。
-```
-sudo apt install nginx
-```
-
-* SSLをセットアップします。他の方法でもよいですが、ここではcertbotを説明します。
-certbotを使うならば、まずそれをインストールします。
-```
-sudo apt install certbot
-```
-そしてセットアップします。
-```
-sudo mkdir -p /var/lib/letsencrypt/
-sudo certbot certonly --email -d --standalone
-```
-もしうまくいかないときは、nginxが正しく動いていない可能性があります。先にnginxを設定してください。ssl "on" を "off" に変えてから再試行してください。
-
----
-
-* nginxの設定ファイルサンプルをnginxフォルダーにコピーします。
-```
-sudo cp /opt/akkoma/installation/nginx/akkoma.nginx /etc/nginx/sites-available/akkoma.nginx
-sudo ln -s /etc/nginx/sites-available/akkoma.nginx /etc/nginx/sites-enabled/akkoma.nginx
-```
-
-* nginxを起動する前に、設定ファイルを編集してください。例えば、サーバー名、証明書のパスなどを変更する必要があります。
-* nginxを再起動します。
-```
-sudo systemctl enable --now nginx.service
-```
-
-もし証明書を更新する必要が出てきた場合には、nginxの関連するlocationブロックのコメントアウトを外し、以下のコマンドを動かします。
-
-```
-sudo certbot certonly --email -d --webroot -w /var/lib/letsencrypt/
-```
-
-#### 他のWebサーバやプロキシ
-これに関してはサンプルが `/opt/akkoma/installation/` にあるので、探してみてください。
-
-#### Systemd サービス
-
-* サービスファイルのサンプルをコピーします。
-```
-sudo cp /opt/akkoma/installation/akkoma.service /etc/systemd/system/akkoma.service
-```
-
-* サービスファイルを変更します。すべてのパスが正しいことを確認してください
-* サービスを有効化し `akkoma.service` を開始してください
-```
-sudo systemctl enable --now akkoma.service
-```
-
-#### 初期ユーザの作成
-
-新たにインスタンスを作成したら、以下のコマンドにより管理者権限を持った初期ユーザを作成できます。
-
-```
-sudo -Hu akkoma MIX_ENV=prod mix pleroma.user new --admin
-```
-
-#### その他の設定とカスタマイズ
-
-{! installation/further_reading.include !}
diff --git a/docs/docs/installation/fedora_based_en.md b/docs/docs/installation/fedora_based_en.md
new file mode 100644
index 000000000..30d68d97f
--- /dev/null
+++ b/docs/docs/installation/fedora_based_en.md
@@ -0,0 +1,206 @@
+# Installing on Fedora
+
+## OTP releases and RedHat-distributions
+
+While the OTP releases of Akkoma work on most Linux distributions, they do not work correctly with RedHat-distributions. Therefore from-source installations are the recommended way to go when trying to install Akkoma on Fedora, Centos Stream or RedHat.
+
+However, it is possible to compile your own OTP release of Akkoma for RedHat. Keep in mind that this has a few drawbacks, and has no particular advantage over a from-source installation, since you'll need to install Erlang and Elixir anyway.
+
+This guide will cover a from-source installation. For instructions on how to build your own OTP release, please check out [the OTP for RedHat guide](./otp_redhat_en.md).
+
+## Installation
+
+This guide will assume you are on Fedora 36. This guide should also work with current releases of Centos Stream and RedHat, although it has not been tested yet. It also assumes that you have administrative rights, either as root or a user with [sudo permissions](https://docs.fedoraproject.org/en-US/quick-docs/adding_user_to_sudoers_file/). If you want to run this guide with root, ignore the `sudo` at the beginning of the lines, unless it calls a user like `sudo -Hu akkoma`; in this case, use `su -s $SHELL -c 'command'` instead.
+
+{! installation/generic_dependencies.include !}
+
+### Prepare the system
+
+* First update the system, if not already done:
+
+```shell
+sudo dnf upgrade --refresh
+```
+
+* Install some of the above mentioned programs:
+
+```shell
+sudo dnf install git gcc g++ make cmake file-devel postgresql-server postgresql-contrib
+```
+
+* Enable and initialize Postgres:
+```shell
+sudo systemctl enable postgresql.service
+sudo postgresql-setup --initdb --unit postgresql
+# Allow password auth for postgres
+sudo sed -E -i 's|(host +all +all +127.0.0.1/32 +)ident|\1md5|' /var/lib/pgsql/data/pg_hba.conf
+sudo systemctl start postgresql.service
+```
+
+### Install Elixir and Erlang
+
+* Install Elixir and Erlang:
+
+```shell
+sudo dnf install elixir erlang-os_mon erlang-eldap erlang-xmerl erlang-erl_interface erlang-syntax_tools
+```
+
+
+### Optional packages: [`docs/installation/optional/media_graphics_packages.md`](../installation/optional/media_graphics_packages.md)
+
+* Install ffmpeg (requires setting up the RPM-fusion repositories):
+
+```shell
+sudo dnf -y install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
+sudo dnf -y install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
+sudo dnf install ffmpeg
+```
+
+* Install ImageMagick and ExifTool for image manipulation:
+
+```shell
+sudo dnf install Imagemagick perl-Image-ExifTool
+```
+
+
+
+### Install AkkomaBE
+
+* Add a new system user for the Akkoma service:
+
+```shell
+sudo useradd -r -s /bin/false -m -d /var/lib/akkoma -U akkoma
+```
+
+**Note**: To execute a single command as the Akkoma system user, use `sudo -Hu akkoma command`. You can also switch to a shell by using `sudo -Hu akkoma $SHELL`. If you don’t have and want `sudo` on your system, you can use `su` as root user (UID 0) for a single command by using `su -l akkoma -s $SHELL -c 'command'` and `su -l akkoma -s $SHELL` for starting a shell.
+
+* Git clone the AkkomaBE repository and make the Akkoma user the owner of the directory:
+
+```shell
+sudo mkdir -p /opt/akkoma
+sudo chown -R akkoma:akkoma /opt/akkoma
+sudo -Hu akkoma git clone https://akkoma.dev/AkkomaGang/akkoma.git /opt/akkoma
+```
+
+* Change to the new directory:
+
+```shell
+cd /opt/akkoma
+```
+
+* Install the dependencies for Akkoma and answer with `yes` if it asks you to install `Hex`:
+
+```shell
+sudo -Hu akkoma mix deps.get
+```
+
+* Generate the configuration: `sudo -Hu akkoma MIX_ENV=prod mix pleroma.instance gen`
+ * Answer with `yes` if it asks you to install `rebar3`.
+ * This may take some time, because parts of akkoma get compiled first.
+ * After that it will ask you a few questions about your instance and generates a configuration file in `config/generated_config.exs`.
+
+* Check the configuration and if all looks right, rename it, so Akkoma will load it (`prod.secret.exs` for productive instance, `dev.secret.exs` for development instances):
+
+```shell
+sudo -Hu akkoma mv config/{generated_config.exs,prod.secret.exs}
+```
+
+
+* The previous command creates also the file `config/setup_db.psql`, with which you can create the database:
+
+```shell
+sudo -Hu postgres psql -f config/setup_db.psql
+```
+
+* Now run the database migration:
+
+```shell
+sudo -Hu akkoma MIX_ENV=prod mix ecto.migrate
+```
+
+* Now you can start Akkoma already
+
+```shell
+sudo -Hu akkoma MIX_ENV=prod mix phx.server
+```
+
+### Finalize installation
+
+If you want to open your newly installed instance to the world, you should run nginx or some other webserver/proxy in front of Akkoma and you should consider to create a systemd service file for Akkoma.
+
+#### Nginx
+
+* Install nginx, if not already done:
+
+```shell
+sudo dnf install nginx
+```
+
+* Setup your SSL cert, using your method of choice or certbot. If using certbot, first install it:
+
+```shell
+sudo dnf install certbot
+```
+
+and then set it up:
+
+```shell
+sudo mkdir -p /var/lib/letsencrypt/
+sudo certbot certonly --email -d --standalone
+```
+
+If that doesn’t work, make sure, that nginx is not already running. If it still doesn’t work, try setting up nginx first (change ssl “on” to “off” and try again).
+
+---
+
+* Copy the example nginx configuration and activate it:
+
+```shell
+sudo cp /opt/akkoma/installation/nginx/akkoma.nginx /etc/nginx/conf.d/akkoma.conf
+```
+
+* Before starting nginx edit the configuration and change it to your needs (e.g. change servername, change cert paths)
+* Enable and start nginx:
+
+```shell
+sudo systemctl enable --now nginx.service
+```
+
+If you need to renew the certificate in the future, uncomment the relevant location block in the nginx config and run:
+
+```shell
+sudo certbot certonly --email -d --webroot -w /var/lib/letsencrypt/
+```
+
+#### Other webserver/proxies
+
+You can find example configurations for them in `/opt/akkoma/installation/`.
+
+#### Systemd service
+
+* Copy example service file
+
+```shell
+sudo cp /opt/akkoma/installation/akkoma.service /etc/systemd/system/akkoma.service
+```
+
+* Edit the service file and make sure that all paths fit your installation
+* Enable and start `akkoma.service`:
+
+```shell
+sudo systemctl enable --now akkoma.service
+```
+
+#### Create your first user
+
+If your instance is up and running, you can create your first user with administrative rights with the following task:
+
+```shell
+sudo -Hu akkoma MIX_ENV=prod mix pleroma.user new --admin
+```
+
+#### Further reading
+
+{! installation/further_reading.include !}
+
+{! support.include !}
diff --git a/docs/docs/installation/generic_dependencies.include b/docs/docs/installation/generic_dependencies.include
index 2dbd93e42..68c61129a 100644
--- a/docs/docs/installation/generic_dependencies.include
+++ b/docs/docs/installation/generic_dependencies.include
@@ -1,7 +1,7 @@
## Required dependencies
* PostgreSQL 9.6+
-* Elixir 1.9+
+* Elixir 1.12+ (1.13+ recommended)
* Erlang OTP 22.2+
* git
* file / libmagic
diff --git a/docs/docs/installation/migrating_to_akkoma.md b/docs/docs/installation/migrating_to_akkoma.md
index 181f6dae6..74b87e318 100644
--- a/docs/docs/installation/migrating_to_akkoma.md
+++ b/docs/docs/installation/migrating_to_akkoma.md
@@ -30,22 +30,18 @@ upstream git URL then just rebuild - that'll be:
git remote set-url origin https://akkoma.dev/AkkomaGang/akkoma.git/
git fetch origin
git pull -r
+# or, if you're on an instance-specific branch, you may want
+# to run "git merge stable" instead (or develop if you want)
```
Then compile, migrate and restart as usual.
## From OTP
-**IMPORTANT: if you are using musl1.1 (void linux musl edition),
-you will need to override the FLAVOUR to amd64-musl11,
-also pls go shout at your maintainers to actually upgrade from EOL software.**
-
-the flavour to be
-
-This will just be setting the update URL -
+This will just be setting the update URL - find your flavour from the [mapping on the install guide](../otp_en/#detecting-flavour) first.
```bash
-export FLAVOUR=$(arch="$(uname -m)";if [ "$arch" = "x86_64" ];then arch="amd64";elif [ "$arch" = "armv7l" ];then arch="arm";elif [ "$arch" = "aarch64" ];then arch="arm64";else echo "Unsupported arch: $arch">&2;fi;if getconf GNU_LIBC_VERSION>/dev/null;then libc_postfix="";elif [ "$(ldd 2>&1|head -c 9)" = "musl libc" ];then libc_postfix="-musl";elif [ "$(find /lib/libc.musl*|wc -l)" ];then libc_postfix="-musl";else echo "Unsupported libc">&2;fi;echo "$arch$libc_postfix")
+export FLAVOUR=[the flavour you found above]
./bin/pleroma_ctl update --zip-url https://akkoma-updates.s3-website.fr-par.scw.cloud/develop/akkoma-$FLAVOUR.zip
./bin/pleroma_ctl migrate
@@ -64,13 +60,18 @@ your upgrade path here depends on your setup
### I just run with the built-in frontend
-You'll need to run a single command,
+You'll need to run a couple of commands,
```bash
# From source
mix pleroma.frontend install pleroma-fe
+# you'll probably want this too
+mix pleroma.frontend install admin-fe
+
# OTP
./bin/pleroma_ctl frontend install pleroma-fe
+# you'll probably want this too
+./bin/pleroma_ctl frontend install admin-fe
```
### I've run the mix task to install a frontend
diff --git a/docs/docs/installation/openbsd_fi.md b/docs/docs/installation/openbsd_fi.md
deleted file mode 100644
index 4b51b9015..000000000
--- a/docs/docs/installation/openbsd_fi.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# Akkoman asennus OpenBSD:llä
-
-Tarvitset:
-* Oman domainin
-* OpenBSD 6.3 -serverin
-* Auttavan ymmärryksen unix-järjestelmistä
-
-Komennot, joiden edessä on '#', tulee ajaa käyttäjänä `root`. Tämä on
-suositeltavaa tehdä komennon `doas` avulla, katso `doas (1)` ja `doas.conf (5)`.
-Tästä eteenpäin oletuksena on, että domain "esimerkki.com" osoittaa
-serverin IP-osoitteeseen.
-
-Jos asennuksen kanssa on ongelmia, IRC-kanava #pleroma Libera.chat tai
-Matrix-kanava #pleroma:libera.chat ovat hyviä paikkoja löytää apua
-(englanniksi), `/msg eal kukkuu` jos haluat välttämättä puhua härmää.
-
-Asenna tarvittava ohjelmisto:
-
-`# pkg_add git elixir gmake postgresql-server-10.3 postgresql-contrib-10.3 cmake ffmpeg ImageMagick`
-
-#### Optional software
-
-[`docs/installation/optional/media_graphics_packages.md`](../installation/optional/media_graphics_packages.md):
- * ImageMagick
- * ffmpeg
- * exiftool
-
-Asenna tarvittava ohjelmisto:
-
-`# pkg_add ImageMagick ffmpeg p5-Image-ExifTool`
-
-Luo postgresql-tietokanta:
-
-`# su - _postgresql`
-
-`$ mkdir /var/postgresql/data`
-
-`$ initdb -D /var/postgresql/data -E UTF8`
-
-`$ createdb`
-
-Käynnistä tietokanta ja aseta se käynnistymään automaattisesti.
-
-`# rcctl start postgresql`
-
-`# rcctl enable postgresql`
-
-Luo käyttäjä akkomaa varten (kysyy muutaman kysymyksen):
-
-`# adduser akkoma`
-
-Vaihda akkoma-käyttäjään ja mene kotihakemistoosi:
-
-`# su - akkoma`
-
-Lataa akkoman lähdekoodi:
-
-`$ git clone https://akkoma.dev/AkkomaGang/akkoma.git`
-
-`$ cd akkoma`
-
-Asenna tarvittavat elixir-kirjastot:
-
-`$ mix deps.get`
-
-`$ mix deps.compile`
-
-Luo tarvittava konfiguraatio:
-
-`$ mix generate_config`
-
-`$ cp config/generated_config.exs config/prod.secret.exs`
-
-Aja luodut tietokantakomennot:
-
-`# su _postgres -c 'psql -f config/setup_db.psql'`
-
-`$ MIX_ENV=prod mix ecto.migrate`
-
-Käynnistä akkoma-prosessi:
-
-`$ MIX_ENV=prod mix compile`
-
-`$ MIX_ENV=prod mix phx.server`
-
-Tässä vaiheessa on hyvä tarkistaa että asetukset ovat oikein. Avaa selaimella,
-curlilla tai vastaavalla työkalulla `esimerkki.com:4000/api/v1/instance` ja katso
-että kohta "uri" on "https://esimerkki.com".
-
-Huom! Muista varmistaa että muuttuja MIX_ENV on "prod" mix-komentoja ajaessasi.
-Mix lukee oikean konfiguraatiotiedoston sen mukaisesti.
-
-Ohessa enimmäkseen toimivaksi todettu rc.d-skripti akkoman käynnistämiseen.
-Kirjoita se tiedostoon /etc/rc.d/akkoma. Tämän jälkeen aja
-`# chmod +x /etc/rc.d/akkoma`, ja voit käynnistää akkoman komennolla
-`# /etc/rc.d/akkoma start`.
-
-```
-#!/bin/ksh
-#/etc/rc.d/akkoma
-
-daemon="cd /home/akkoma/akkoma;MIX_ENV=prod /usr/local/bin/elixir"
-daemon_flags="--detached /usr/local/bin/mix phx.server"
-daemon_user="akkoma"
-rc_reload="NO"
-rc_bg="YES"
-
-pexp="beam"
-
-. /etc/rc.d/rc.subr
-
-rc_cmd $1
-```
-
-Tämän jälkeen tarvitset enää HTTP-serverin välittämään kutsut akkoma-prosessille.
-Tiedostosta `install/akkoma.nginx` löytyy esimerkkikonfiguraatio, ja TLS-sertifikaatit
-saat ilmaiseksi esimerkiksi [letsencryptiltä](https://certbot.eff.org/lets-encrypt/opbsd-nginx.html).
-Nginx asentuu yksinkertaisesti komennolla `# pkg_add nginx`.
-
-Kun olet valmis, avaa https://esimerkki.com selaimessasi. Luo käyttäjä ja seuraa kiinnostavia
-tyyppejä muilla palvelimilla!
diff --git a/docs/docs/installation/otp_en.md b/docs/docs/installation/otp_en.md
index 5ae626bba..022716fec 100644
--- a/docs/docs/installation/otp_en.md
+++ b/docs/docs/installation/otp_en.md
@@ -6,6 +6,7 @@ This guide covers a installation using an OTP release. To install Akkoma from so
## Pre-requisites
* A machine running Linux with GNU (e.g. Debian, Ubuntu) or musl (e.g. Alpine) libc and `x86_64`, `aarch64` or `armv7l` CPU, you have root access to. If you are not sure if it's compatible see [Detecting flavour section](#detecting-flavour) below
+* For installing OTP releases on RedHat-based distros like Fedora and Centos Stream, please follow [this guide](./otp_redhat_en.md) instead.
* A (sub)domain pointed to the machine
You will be running commands as root. If you aren't root already, please elevate your priviledges by executing `sudo su`/`su`.
@@ -14,12 +15,19 @@ While in theory OTP releases are possbile to install on any compatible machine,
### Detecting flavour
-Paste the following into the shell:
-```sh
-arch="$(uname -m)";if [ "$arch" = "x86_64" ];then arch="amd64";elif [ "$arch" = "armv7l" ];then arch="arm";elif [ "$arch" = "aarch64" ];then arch="arm64";else echo "Unsupported arch: $arch">&2;fi;if getconf GNU_LIBC_VERSION>/dev/null;then libc_postfix="";elif [ "$(ldd 2>&1|head -c 9)" = "musl libc" ];then libc_postfix="-musl";elif [ "$(find /lib/libc.musl*|wc -l)" ];then libc_postfix="-musl";else echo "Unsupported libc">&2;fi;echo "$arch$libc_postfix"
-```
+This is a little more complex than it used to be (thanks ubuntu)
-If your platform is supported the output will contain the flavour string, you will need it later. If not, this just means that we don't build releases for your platform, you can still try installing from source.
+Use the following mapping to figure out your flavour:
+
+| distribution | flavour |
+| ------------- | ------------ |
+| debian stable | amd64 |
+| ubuntu focal | amd64 |
+| ubuntu jammy | ubuntu-jammy |
+| alpine | amd64-musl |
+
+Other similar distributions will _probably_ work, but if it is not listed above, there is no official
+support.
### Installing the required packages
diff --git a/docs/docs/installation/otp_redhat_en.md b/docs/docs/installation/otp_redhat_en.md
new file mode 100644
index 000000000..2e6b58c9e
--- /dev/null
+++ b/docs/docs/installation/otp_redhat_en.md
@@ -0,0 +1,285 @@
+# Installing on RedHat using OTP releases
+
+## OTP releases and Fedora/RedHat
+
+The current OTP builds available for Linux are unfortunately incompatible with RedHat Linux distributions, like Fedora and Centos Stream. This is due to RedHat maintaining patched versions of certain Erlang libraries, making them incompatible with other Linux distributions.
+
+However, you may compile your own OTP release from scratch. This is particularly useful if you wish to quickly distribute your OTP build onto multiple systems, without having to worry about compiling code on every system. However, if your goal is to simply set up a single instance for yourself, installing from-source might be a simpler option. To install from-source, please follow [this guide](./fedora_based_en.md).
+
+
+## Pre-requisites
+
+In order to compile a RedHat-compatible OTP release, you will need to run a RedHat Linux distribution. This guide will assume you run Fedora 36, though it should also work on older Fedora releases and other RedHat distributions. It also assumes that you have administrative rights and sufficient knowledge on how to perform common CLI tasks in Linux. If you want to run this guide with root, ignore the `sudo` at the beginning of the lines.
+
+Important: keep in mind that you must build your OTP release for the specific RedHat distribution you wish to use it on. A build on Fedora will only be compatible with a specific Fedora release version.
+
+
+## Building an OTP release for Fedora 36
+
+### Installing required packages
+
+* First, update your system, if not already done:
+
+```shell
+sudo dnf upgrade --refresh
+```
+
+* Then install the required packages to build your OTP release:
+
+```shell
+sudo dnf install git gcc g++ erlang elixir erlang-os_mon erlang-eldap erlang-xmerl erlang-erl_interface erlang-syntax_tools make cmake file-devel
+```
+
+
+### Preparing the project files
+
+* Git clone the AkkomaBE repository. This can be done anywhere:
+
+```shell
+cd ~
+git clone https://akkoma.dev/AkkomaGang/akkoma.git
+```
+
+* Change to the new directory:
+
+```shell
+cd ./akkoma
+```
+
+
+### Building the OTP release
+
+* Run the following commands:
+
+```shell
+export MIX_ENV=prod
+echo "import Config" > config/prod.secret.exs
+mix local.hex --force
+mix local.rebar --force
+mix deps.get --only prod
+mkdir release
+mix release --path release
+```
+
+Note that compiling the OTP release will take some time. Once it completes, you will find the OTP files in the directory `release`.
+
+If all went well, you will have built your very own Fedora-compatible OTP release! You can now pack up the files in the `release` directory and deploy them to your other Fedora servers.
+
+
+## Installing the OTP release
+
+Installing the OTP release from this point onward will be very similar to the regular OTP release. This guide assumes you will want to install your OTP package on other systems, so additional pre-requisites will be listed below.
+
+Please note that running your own OTP release has some minor caveats that you should be aware of. They will be listed below as well.
+
+
+### Installing required packages
+
+Other than things bundled in the OTP release Akkoma depends on:
+
+* curl (to download the release build)
+* ncurses (ERTS won't run without it)
+* PostgreSQL (also utilizes extensions in postgresql-contrib)
+* nginx (could be swapped with another reverse proxy but this guide covers only it)
+* certbot (for Let's Encrypt certificates, could be swapped with another ACME client, but this guide covers only it)
+* libmagic/file
+
+First, update your system, if not already done:
+
+```shell
+sudo dnf upgrade --refresh
+```
+
+Then install the required packages:
+
+```shell
+sudo dnf install curl ncurses postgresql postgresql-contrib nginx certbot file-devel
+```
+
+
+### Optional packages: [`docs/installation/optional/media_graphics_packages.md`](../installation/optional/media_graphics_packages.md)
+
+* Install ffmpeg (requires setting up the RPM-fusion repositories):
+
+```shell
+sudo dnf -y install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
+sudo dnf -y install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
+sudo dnf install ffmpeg
+```
+
+* Install ImageMagick and ExifTool for image manipulation:
+
+```shell
+sudo dnf install Imagemagick perl-Image-ExifTool
+```
+
+
+### Configuring PostgreSQL
+#### (Optional) Performance configuration
+It is encouraged to check [Optimizing your PostgreSQL performance](../configuration/postgresql.md) document, for tips on PostgreSQL tuning.
+
+Restart PostgreSQL to apply configuration changes:
+
+```shell
+sudo systemctl restart postgresql
+```
+
+### Installing Akkoma
+```sh
+# Create a Akkoma user
+adduser --system --shell /bin/false --home /opt/akkoma akkoma
+
+# Move your custom OTP release to the home directory
+sudo -Hu akkoma mv /your/custom/otp/release /opt/akkoma
+
+# Create uploads directory and set proper permissions (skip if planning to use a remote uploader)
+# Note: It does not have to be `/var/lib/akkoma/uploads`, the config generator will ask about the upload directory later
+
+sudo mkdir -p /var/lib/akkoma/uploads
+sudo chown -R akkoma /var/lib/akkoma
+
+# Create custom public files directory (custom emojis, frontend bundle overrides, robots.txt, etc.)
+# Note: It does not have to be `/var/lib/akkoma/static`, the config generator will ask about the custom public files directory later
+sudo mkdir -p /var/lib/akkoma/static
+sudo chown -R akkoma /var/lib/akkoma
+
+# Create a config directory
+sudo mkdir -p /etc/akkoma
+sudo chown -R akkoma /etc/akkoma
+
+# Run the config generator
+sudo -Hu akkoma ./bin/pleroma_ctl instance gen --output /etc/akkoma/config.exs --output-psql /tmp/setup_db.psql
+
+# Create the postgres database
+sudo -Hu postgres psql -f /tmp/setup_db.psql
+
+# Create the database schema
+sudo -Hu akkoma ./bin/pleroma_ctl migrate
+
+# Start the instance to verify that everything is working as expected
+sudo -Hu akkoma ./bin/pleroma daemon
+
+# Wait for about 20 seconds and query the instance endpoint, if it shows your uri, name and email correctly, you are configured correctly
+sleep 20 && curl http://localhost:4000/api/v1/instance
+
+# Stop the instance
+sudo -Hu akkoma ./bin/pleroma stop
+```
+
+
+### Setting up nginx and getting Let's Encrypt SSL certificaties
+
+#### Get a Let's Encrypt certificate
+
+```shell
+certbot certonly --standalone --preferred-challenges http -d yourinstance.tld
+```
+
+#### Copy Akkoma nginx configuration to the nginx folder
+
+```shell
+cp /opt/akkoma/installation/nginx/akkoma.nginx /etc/nginx/conf.d/akkoma.conf
+```
+
+#### Edit the nginx config
+```shell
+# Replace example.tld with your (sub)domain (replace $EDITOR with your editor of choice)
+sudo $EDITOR /etc/nginx/conf.d/akkoma.conf
+
+# Verify that the config is valid
+sudo nginx -t
+```
+#### Start nginx
+
+```shell
+sudo systemctl start nginx
+```
+
+At this point if you open your (sub)domain in a browser you should see a 502 error, that's because Akkoma is not started yet.
+
+
+### Setting up a system service
+
+```shell
+# Copy the service into a proper directory
+cp /opt/akkoma/installation/akkoma.service /etc/systemd/system/akkoma.service
+
+# Edit the service file and make any neccesary changes
+sudo $EDITOR /etc/systemd/system/akkoma.service
+
+# If you use SELinux, set the correct file context on the pleroma binary
+sudo semanage fcontext -a -t init_t /opt/akkoma/bin/pleroma
+sudo restorecon -v /opt/akkoma/bin/pleroma
+
+# Start akkoma and enable it on boot
+sudo systemctl start akkoma
+sudo systemctl enable akkoma
+```
+
+If everything worked, you should see a response from Akkoma-BE when visiting your domain. You may need to install frontends like Akkoma-FE and Admin-FE; refer to [this guide](../administration/CLI_tasks/frontend.md) on how to install them.
+
+If that didn't happen, try reviewing the installation steps, starting Akkoma in the foreground and seeing if there are any errrors.
+
+{! support.include !}
+
+## Post installation
+
+### Setting up auto-renew of the Let's Encrypt certificate
+
+```shell
+# Create the directory for webroot challenges
+sudo mkdir -p /var/lib/letsencrypt
+
+# Uncomment the webroot method
+sudo $EDITOR /etc/nginx/conf.d/akkoma.conf
+
+# Verify that the config is valid
+sudo nginx -t
+
+# Restart nginx
+sudo systemctl restart nginx
+
+# Ensure the webroot menthod and post hook is working
+sudo certbot renew --cert-name yourinstance.tld --webroot -w /var/lib/letsencrypt/ --dry-run --post-hook 'systemctl reload nginx'
+
+# Add it to the daily cron
+echo '#!/bin/sh
+certbot renew --cert-name yourinstance.tld --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
+' > /etc/cron.daily/renew-akkoma-cert
+sudo chmod +x /etc/cron.daily/renew-akkoma-cert
+
+# If everything worked the output should contain /etc/cron.daily/renew-akkoma-cert
+sudo run-parts --test /etc/cron.daily
+```
+
+
+## Create your first user and set as admin
+```shell
+cd /opt/akkoma
+sudo -Hu akkoma ./bin/pleroma_ctl user new joeuser joeuser@sld.tld --admin
+```
+This will create an account withe the username of 'joeuser' with the email address of joeuser@sld.tld, and set that user's account as an admin. This will result in a link that you can paste into the browser, which logs you in and enables you to set the password.
+
+## Further reading
+
+### Caveats of building your own OTP release
+
+There are some things to take note of when your are running your own OTP builds.
+
+#### Updating your OTP builds
+
+Using your custom OTP build, you will not be able to update the installation using the `pleroma_ctl update` command. Running this command would overwrite your install with an OTP release from the main Akkoma repository, which will break your install.
+
+Instead, you will have to rebuild your OTP release every time there are updates, then manually move it to where your Akkoma installation is running, overwriting the old OTP release files. Make sure to stop the Akkoma-BE server before overwriting any files!
+
+After that, run the `pleroma_ctl migrate` command as usual to perform database migrations.
+
+
+#### Cross-compatibility between RedHat distributions
+
+As it currently stands, your OTP build will only be compatible for the specific RedHat distribution you've built it on. Fedora builds only work on Fedora, Centos builds only on Centos, RedHat builds only on RedHat. Secondly, for Fedora, they will also be bound to the specific Fedora release. This is because different releases of Fedora may have significant changes made in some of the required packages and libraries.
+
+
+{! installation/further_reading.include !}
+
+{! support.include !}
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index 925363e2c..c19439942 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -14,8 +14,8 @@ theme:
extra_css:
- css/extra.css
-repo_name: 'AkkomaGang/docs'
-repo_url: 'https://akkoma.dev/AkkomaGang/docs'
+repo_name: 'AkkomaGang/akkoma'
+repo_url: 'https://akkoma.dev/AkkomaGang/akkoma'
extra:
repo_icon: gitea
diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex
index 8972d4cfb..d2d416655 100644
--- a/lib/mix/tasks/pleroma/user.ex
+++ b/lib/mix/tasks/pleroma/user.ex
@@ -496,12 +496,12 @@ def run(["fix_follow_state", local_user, remote_user]) do
{:follow_data, Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(local, remote)} do
calculated_state = User.following?(local, remote)
- shell_info(
+ IO.puts(
"Request state is #{request_state}, vs calculated state of following=#{calculated_state}"
)
if calculated_state == false && request_state == "accept" do
- shell_info("Discrepancy found, fixing")
+ IO.puts("Discrepancy found, fixing")
Pleroma.Web.CommonAPI.reject_follow_request(local, remote)
shell_info("Relationship fixed")
else
diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex
index abfe778d2..01c9df53b 100644
--- a/lib/pleroma/activity.ex
+++ b/lib/pleroma/activity.ex
@@ -292,6 +292,12 @@ def get_in_reply_to_activity(%Activity{} = activity) do
get_in_reply_to_activity_from_object(Object.normalize(activity, fetch: false))
end
+ def get_quoted_activity_from_object(%Object{data: %{"quoteUri" => ap_id}}) do
+ get_create_by_object_ap_id_with_object(ap_id)
+ end
+
+ def get_quoted_activity_from_object(_), do: nil
+
def normalize(%Activity{data: %{"id" => ap_id}}), do: get_by_ap_id_with_object(ap_id)
def normalize(%{"id" => ap_id}), do: get_by_ap_id_with_object(ap_id)
def normalize(ap_id) when is_binary(ap_id), do: get_by_ap_id_with_object(ap_id)
diff --git a/lib/pleroma/announcement.ex b/lib/pleroma/announcement.ex
new file mode 100644
index 000000000..d97c5e728
--- /dev/null
+++ b/lib/pleroma/announcement.ex
@@ -0,0 +1,160 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Announcement do
+ use Ecto.Schema
+
+ import Ecto.Changeset, only: [cast: 3, validate_required: 2]
+ import Ecto.Query
+
+ alias Pleroma.AnnouncementReadRelationship
+ alias Pleroma.Repo
+
+ @type t :: %__MODULE__{}
+ @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true}
+
+ schema "announcements" do
+ field(:data, :map)
+ field(:starts_at, :utc_datetime)
+ field(:ends_at, :utc_datetime)
+ field(:rendered, :map)
+
+ timestamps(type: :utc_datetime)
+ end
+
+ def change(struct, params \\ %{}) do
+ struct
+ |> cast(validate_params(struct, params), [:data, :starts_at, :ends_at, :rendered])
+ |> validate_required([:data])
+ end
+
+ defp validate_params(struct, params) do
+ base_data =
+ %{
+ "content" => "",
+ "all_day" => false
+ }
+ |> Map.merge((struct && struct.data) || %{})
+
+ merged_data =
+ Map.merge(base_data, params.data)
+ |> Map.take(["content", "all_day"])
+
+ params
+ |> Map.merge(%{data: merged_data})
+ |> add_rendered_properties()
+ end
+
+ def add_rendered_properties(params) do
+ {content_html, _, _} =
+ Pleroma.Web.CommonAPI.Utils.format_input(params.data["content"], "text/plain",
+ mentions_format: :full
+ )
+
+ rendered = %{
+ "content" => content_html
+ }
+
+ params
+ |> Map.put(:rendered, rendered)
+ end
+
+ def add(params) do
+ changeset = change(%__MODULE__{}, params)
+
+ Repo.insert(changeset)
+ end
+
+ def update(announcement, params) do
+ changeset = change(announcement, params)
+
+ Repo.update(changeset)
+ end
+
+ def list_all do
+ __MODULE__
+ |> Repo.all()
+ end
+
+ def list_paginated(%{limit: limited_number, offset: offset_number}) do
+ __MODULE__
+ |> limit(^limited_number)
+ |> offset(^offset_number)
+ |> Repo.all()
+ end
+
+ def get_by_id(id) do
+ Repo.get_by(__MODULE__, id: id)
+ end
+
+ def delete_by_id(id) do
+ with announcement when not is_nil(announcement) <- get_by_id(id),
+ {:ok, _} <- Repo.delete(announcement) do
+ :ok
+ else
+ _ ->
+ :error
+ end
+ end
+
+ def read_by?(announcement, user) do
+ AnnouncementReadRelationship.exists?(user, announcement)
+ end
+
+ def mark_read_by(announcement, user) do
+ AnnouncementReadRelationship.mark_read(user, announcement)
+ end
+
+ def render_json(announcement, opts \\ []) do
+ extra_params =
+ case Keyword.fetch(opts, :for) do
+ {:ok, user} when not is_nil(user) ->
+ %{read: read_by?(announcement, user)}
+
+ _ ->
+ %{}
+ end
+
+ admin_extra_params =
+ case Keyword.fetch(opts, :admin) do
+ {:ok, true} ->
+ %{pleroma: %{raw_content: announcement.data["content"]}}
+
+ _ ->
+ %{}
+ end
+
+ base = %{
+ id: announcement.id,
+ content: announcement.rendered["content"],
+ starts_at: announcement.starts_at,
+ ends_at: announcement.ends_at,
+ all_day: announcement.data["all_day"],
+ published_at: announcement.inserted_at,
+ updated_at: announcement.updated_at,
+ mentions: [],
+ statuses: [],
+ tags: [],
+ emojis: [],
+ reactions: []
+ }
+
+ base
+ |> Map.merge(extra_params)
+ |> Map.merge(admin_extra_params)
+ end
+
+ # "visible" means:
+ # starts_at < time < ends_at
+ def list_all_visible_when(time) do
+ __MODULE__
+ |> where([a], is_nil(a.starts_at) or a.starts_at < ^time)
+ |> where([a], is_nil(a.ends_at) or a.ends_at > ^time)
+ |> Repo.all()
+ end
+
+ def list_all_visible do
+ list_all_visible_when(DateTime.now("Etc/UTC") |> elem(1))
+ end
+end
diff --git a/lib/pleroma/announcement_read_relationship.ex b/lib/pleroma/announcement_read_relationship.ex
new file mode 100644
index 000000000..9b64404ce
--- /dev/null
+++ b/lib/pleroma/announcement_read_relationship.ex
@@ -0,0 +1,55 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.AnnouncementReadRelationship do
+ use Ecto.Schema
+
+ import Ecto.Changeset
+
+ alias FlakeId.Ecto.CompatType
+ alias Pleroma.Announcement
+ alias Pleroma.Repo
+ alias Pleroma.User
+
+ @type t :: %__MODULE__{}
+
+ schema "announcement_read_relationships" do
+ belongs_to(:user, User, type: CompatType)
+ belongs_to(:announcement, Announcement, type: CompatType)
+
+ timestamps(updated_at: false)
+ end
+
+ def mark_read(user, announcement) do
+ %__MODULE__{}
+ |> cast(%{user_id: user.id, announcement_id: announcement.id}, [:user_id, :announcement_id])
+ |> validate_required([:user_id, :announcement_id])
+ |> foreign_key_constraint(:user_id)
+ |> foreign_key_constraint(:announcement_id)
+ |> unique_constraint([:user_id, :announcement_id])
+ |> Repo.insert()
+ end
+
+ def mark_unread(user, announcement) do
+ with relationship <- get(user, announcement),
+ {:exists, true} <- {:exists, not is_nil(relationship)},
+ {:ok, _} <- Repo.delete(relationship) do
+ :ok
+ else
+ {:exists, false} ->
+ :ok
+
+ _ ->
+ :error
+ end
+ end
+
+ def get(user, announcement) do
+ Repo.get_by(__MODULE__, user_id: user.id, announcement_id: announcement.id)
+ end
+
+ def exists?(user, announcement) do
+ not is_nil(get(user, announcement))
+ end
+end
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 5801e930d..e29bf3ca3 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -53,7 +53,6 @@ def start(_type, _args) do
Config.DeprecationWarnings.warn()
Pleroma.Web.Plugs.HTTPSecurityPlug.warn_if_disabled()
Pleroma.ApplicationRequirements.verify!()
- setup_instrumenters()
load_custom_modules()
Pleroma.Docs.JSON.compile()
limiters_setup()
@@ -77,8 +76,7 @@ def start(_type, _args) do
] ++
elasticsearch_children() ++
task_children(@mix_env) ++
- dont_run_in_test(@mix_env) ++
- shout_child(shout_enabled?())
+ dont_run_in_test(@mix_env)
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
@@ -93,11 +91,16 @@ def start(_type, _args) do
end
opts = [strategy: :one_for_one, name: Pleroma.Supervisor, max_restarts: max_restarts]
- result = Supervisor.start_link(children, opts)
- set_postgres_server_version()
-
- result
+ with {:ok, data} <- Supervisor.start_link(children, opts) do
+ set_postgres_server_version()
+ {:ok, data}
+ else
+ e ->
+ Logger.error("Failed to start!")
+ Logger.error("#{inspect(e)}")
+ e
+ end
end
defp set_postgres_server_version do
@@ -139,29 +142,6 @@ def load_custom_modules do
end
end
- defp setup_instrumenters do
- require Prometheus.Registry
-
- if Application.get_env(:prometheus, Pleroma.Repo.Instrumenter) do
- :ok =
- :telemetry.attach(
- "prometheus-ecto",
- [:pleroma, :repo, :query],
- &Pleroma.Repo.Instrumenter.handle_event/4,
- %{}
- )
-
- Pleroma.Repo.Instrumenter.setup()
- end
-
- Pleroma.Web.Endpoint.MetricsExporter.setup()
- Pleroma.Web.Endpoint.PipelineInstrumenter.setup()
-
- # Note: disabled until prometheus-phx is integrated into prometheus-phoenix:
- # Pleroma.Web.Endpoint.Instrumenter.setup()
- PrometheusPhx.setup()
- end
-
defp cachex_children do
[
build_cachex("used_captcha", ttl_interval: seconds_valid_interval()),
@@ -173,11 +153,7 @@ defp cachex_children do
build_cachex("web_resp", limit: 2500),
build_cachex("emoji_packs", expiration: emoji_packs_expiration(), limit: 10),
build_cachex("failed_proxy_url", limit: 2500),
- build_cachex("banned_urls", default_ttl: :timer.hours(24 * 30), limit: 5_000),
- build_cachex("chat_message_id_idempotency_key",
- expiration: chat_message_id_idempotency_key_expiration(),
- limit: 500_000
- )
+ build_cachex("banned_urls", default_ttl: :timer.hours(24 * 30), limit: 5_000)
]
end
@@ -187,9 +163,6 @@ defp emoji_packs_expiration,
defp idempotency_expiration,
do: expiration(default: :timer.seconds(6 * 60 * 60), interval: :timer.seconds(60))
- defp chat_message_id_idempotency_key_expiration,
- do: expiration(default: :timer.minutes(2), interval: :timer.seconds(60))
-
defp seconds_valid_interval,
do: :timer.seconds(Config.get!([Pleroma.Captcha, :seconds_valid]))
@@ -201,8 +174,6 @@ def build_cachex(type, opts),
type: :worker
}
- defp shout_enabled?, do: Config.get([:shout, :enabled])
-
defp dont_run_in_test(env) when env in [:test, :benchmark], do: []
defp dont_run_in_test(_) do
@@ -222,15 +193,6 @@ defp background_migrators do
]
end
- defp shout_child(true) do
- [
- Pleroma.Web.ShoutChannel.ShoutChannelState,
- {Phoenix.PubSub, [name: Pleroma.PubSub, adapter: Phoenix.PubSub.PG2]}
- ]
- end
-
- defp shout_child(_), do: []
-
defp task_children(:test) do
[
%{
diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex
deleted file mode 100644
index bacff24b5..000000000
--- a/lib/pleroma/chat.ex
+++ /dev/null
@@ -1,97 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Chat do
- use Ecto.Schema
-
- import Ecto.Changeset
- import Ecto.Query
-
- alias Pleroma.Chat
- alias Pleroma.Repo
- alias Pleroma.User
-
- @moduledoc """
- Chat keeps a reference to ChatMessage conversations between a user and an recipient. The recipient can be a user (for now) or a group (not implemented yet).
-
- It is a helper only, to make it easy to display a list of chats with other people, ordered by last bump. The actual messages are retrieved by querying the recipients of the ChatMessages.
- """
-
- @type t :: %__MODULE__{}
- @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true}
-
- schema "chats" do
- belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
- field(:recipient, :string)
-
- timestamps()
- end
-
- def changeset(struct, params) do
- struct
- |> cast(params, [:user_id, :recipient])
- |> validate_change(:recipient, fn
- :recipient, recipient ->
- case User.get_cached_by_ap_id(recipient) do
- nil -> [recipient: "must be an existing user"]
- _ -> []
- end
- end)
- |> validate_required([:user_id, :recipient])
- |> unique_constraint(:user_id, name: :chats_user_id_recipient_index)
- end
-
- @spec get_by_user_and_id(User.t(), FlakeId.Ecto.CompatType.t()) ::
- {:ok, t()} | {:error, :not_found}
- def get_by_user_and_id(%User{id: user_id}, id) do
- from(c in __MODULE__,
- where: c.id == ^id,
- where: c.user_id == ^user_id
- )
- |> Repo.find_resource()
- end
-
- @spec get_by_id(FlakeId.Ecto.CompatType.t()) :: t() | nil
- def get_by_id(id) do
- Repo.get(__MODULE__, id)
- end
-
- @spec get(FlakeId.Ecto.CompatType.t(), String.t()) :: t() | nil
- def get(user_id, recipient) do
- Repo.get_by(__MODULE__, user_id: user_id, recipient: recipient)
- end
-
- @spec get_or_create(FlakeId.Ecto.CompatType.t(), String.t()) ::
- {:ok, t()} | {:error, Ecto.Changeset.t()}
- def get_or_create(user_id, recipient) do
- %__MODULE__{}
- |> changeset(%{user_id: user_id, recipient: recipient})
- |> Repo.insert(
- # Need to set something, otherwise we get nothing back at all
- on_conflict: [set: [recipient: recipient]],
- returning: true,
- conflict_target: [:user_id, :recipient]
- )
- end
-
- @spec bump_or_create(FlakeId.Ecto.CompatType.t(), String.t()) ::
- {:ok, t()} | {:error, Ecto.Changeset.t()}
- def bump_or_create(user_id, recipient) do
- %__MODULE__{}
- |> changeset(%{user_id: user_id, recipient: recipient})
- |> Repo.insert(
- on_conflict: [set: [updated_at: NaiveDateTime.utc_now()]],
- returning: true,
- conflict_target: [:user_id, :recipient]
- )
- end
-
- @spec for_user_query(FlakeId.Ecto.CompatType.t()) :: Ecto.Query.t()
- def for_user_query(user_id) do
- from(c in Chat,
- where: c.user_id == ^user_id,
- order_by: [desc: c.updated_at]
- )
- end
-end
diff --git a/lib/pleroma/chat/message_reference.ex b/lib/pleroma/chat/message_reference.ex
deleted file mode 100644
index 89537d155..000000000
--- a/lib/pleroma/chat/message_reference.ex
+++ /dev/null
@@ -1,117 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Chat.MessageReference do
- @moduledoc """
- A reference that builds a relation between an AP chat message that a user can see and whether it has been seen
- by them, or should be displayed to them. Used to build the chat view that is presented to the user.
- """
-
- use Ecto.Schema
-
- alias Pleroma.Chat
- alias Pleroma.Object
- alias Pleroma.Repo
-
- import Ecto.Changeset
- import Ecto.Query
-
- @primary_key {:id, FlakeId.Ecto.Type, autogenerate: true}
-
- schema "chat_message_references" do
- belongs_to(:object, Object)
- belongs_to(:chat, Chat, type: FlakeId.Ecto.CompatType)
-
- field(:unread, :boolean, default: true)
-
- timestamps()
- end
-
- def changeset(struct, params) do
- struct
- |> cast(params, [:object_id, :chat_id, :unread])
- |> validate_required([:object_id, :chat_id, :unread])
- end
-
- def get_by_id(id) do
- __MODULE__
- |> Repo.get(id)
- |> Repo.preload(:object)
- end
-
- def delete(cm_ref) do
- cm_ref
- |> Repo.delete()
- end
-
- def delete_for_object(%{id: object_id}) do
- from(cr in __MODULE__,
- where: cr.object_id == ^object_id
- )
- |> Repo.delete_all()
- end
-
- def for_chat_and_object(%{id: chat_id}, %{id: object_id}) do
- __MODULE__
- |> Repo.get_by(chat_id: chat_id, object_id: object_id)
- |> Repo.preload(:object)
- end
-
- def for_chat_query(chat) do
- from(cr in __MODULE__,
- where: cr.chat_id == ^chat.id,
- order_by: [desc: :id],
- preload: [:object]
- )
- end
-
- def last_message_for_chat(chat) do
- chat
- |> for_chat_query()
- |> limit(1)
- |> Repo.one()
- end
-
- def create(chat, object, unread) do
- params = %{
- chat_id: chat.id,
- object_id: object.id,
- unread: unread
- }
-
- %__MODULE__{}
- |> changeset(params)
- |> Repo.insert()
- end
-
- def unread_count_for_chat(chat) do
- chat
- |> for_chat_query()
- |> where([cmr], cmr.unread == true)
- |> Repo.aggregate(:count)
- end
-
- def mark_as_read(cm_ref) do
- cm_ref
- |> changeset(%{unread: false})
- |> Repo.update()
- end
-
- def set_all_seen_for_chat(chat, last_read_id \\ nil) do
- query =
- chat
- |> for_chat_query()
- |> exclude(:order_by)
- |> exclude(:preload)
- |> where([cmr], cmr.unread == true)
-
- if last_read_id do
- query
- |> where([cmr], cmr.id <= ^last_read_id)
- else
- query
- end
- |> Repo.update_all(set: [unread: false])
- end
-end
diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex
index 911357841..8a336c35a 100644
--- a/lib/pleroma/config/deprecation_warnings.ex
+++ b/lib/pleroma/config/deprecation_warnings.ex
@@ -17,7 +17,9 @@ defmodule Pleroma.Config.DeprecationWarnings do
{[:instance, :mrf_transparency], [:mrf, :transparency],
"\n* `config :pleroma, :instance, mrf_transparency` is now `config :pleroma, :mrf, transparency`"},
{[:instance, :mrf_transparency_exclusions], [:mrf, :transparency_exclusions],
- "\n* `config :pleroma, :instance, mrf_transparency_exclusions` is now `config :pleroma, :mrf, transparency_exclusions`"}
+ "\n* `config :pleroma, :instance, mrf_transparency_exclusions` is now `config :pleroma, :mrf, transparency_exclusions`"},
+ {[:instance, :quarantined_instances], [:mrf_simple, :reject],
+ "\n* `config :pleroma, :instance, :quarantined_instances` is now covered by `:pleroma, :mrf_simple, :reject`"}
]
def check_simple_policy_tuples do
@@ -81,7 +83,7 @@ def check_simple_policy_tuples do
end
def check_quarantined_instances_tuples do
- has_strings = Config.get([:instance, :quarantined_instances]) |> Enum.any?(&is_binary/1)
+ has_strings = Config.get([:instance, :quarantined_instances], []) |> Enum.any?(&is_binary/1)
if has_strings do
Logger.warn("""
@@ -176,7 +178,6 @@ def warn do
check_activity_expiration_config(),
check_remote_ip_plug_name(),
check_uploders_s3_public_endpoint(),
- check_old_chat_shoutbox(),
check_quarantined_instances_tuples(),
check_transparency_exclusions_tuples(),
check_simple_policy_tuples()
@@ -308,27 +309,4 @@ def check_uploders_s3_public_endpoint do
:ok
end
end
-
- @spec check_old_chat_shoutbox() :: :ok | nil
- def check_old_chat_shoutbox do
- instance_config = Pleroma.Config.get([:instance])
- chat_config = Pleroma.Config.get([:chat]) || []
-
- use_old_config =
- Keyword.has_key?(instance_config, :chat_limit) or
- Keyword.has_key?(chat_config, :enabled)
-
- if use_old_config do
- Logger.error("""
- !!!DEPRECATION WARNING!!!
- Your config is using the old namespace for the Shoutbox configuration. You need to convert to the new namespace. e.g.,
- \n* `config :pleroma, :chat, enabled` and `config :pleroma, :instance, chat_limit` are now equal to:
- \n* `config :pleroma, :shout, enabled` and `config :pleroma, :shout, limit`
- """)
-
- :error
- else
- :ok
- end
- end
end
diff --git a/lib/pleroma/config/holder.ex b/lib/pleroma/config/holder.ex
index 4d186a854..d6bf948ae 100644
--- a/lib/pleroma/config/holder.ex
+++ b/lib/pleroma/config/holder.ex
@@ -32,9 +32,9 @@ defp get_default, do: Pleroma.Config.get(:default_config)
def release_defaults do
[
pleroma: [
- {:instance, [static_dir: "/var/lib/pleroma/static"]},
- {Pleroma.Uploaders.Local, [uploads: "/var/lib/pleroma/uploads"]},
- {:modules, [runtime_dir: "/var/lib/pleroma/modules"]},
+ {:instance, [static_dir: "/var/lib/akkoma/static"]},
+ {Pleroma.Uploaders.Local, [uploads: "/var/lib/akkoma/uploads"]},
+ {:modules, [runtime_dir: "/var/lib/akkoma/modules"]},
{:release, true}
]
]
diff --git a/lib/pleroma/config/release_runtime_provider.ex b/lib/pleroma/config/release_runtime_provider.ex
index 1e4bddc59..e5f2d6339 100644
--- a/lib/pleroma/config/release_runtime_provider.ex
+++ b/lib/pleroma/config/release_runtime_provider.ex
@@ -14,10 +14,10 @@ def load(config, opts) do
config_path =
cond do
opts[:config_path] -> opts[:config_path]
- System.get_env("PLEROMA_CONFIG_PATH") -> System.get_env("PLEROMA_CONFIG_PATH")
System.get_env("AKKOMA_CONFIG_PATH") -> System.get_env("AKKOMA_CONFIG_PATH")
- File.exists?("/etc/akkoma/config.exs") -> "/etc/akkoma/config.exs"
- true -> "/etc/pleroma/config.exs"
+ System.get_env("PLEROMA_CONFIG_PATH") -> System.get_env("PLEROMA_CONFIG_PATH")
+ File.exists?("/etc/pleroma/config.exs") -> "/etc/pleroma/config.exs"
+ true -> "/etc/akkoma/config.exs"
end
with_runtime_config =
@@ -31,7 +31,7 @@ def load(config, opts) do
warning = [
IO.ANSI.red(),
IO.ANSI.bright(),
- "!!! Config path is not declared! Please ensure it exists and that PLEROMA_CONFIG_PATH is unset or points to an existing file",
+ "!!! Config path is not declared! Please ensure it exists and that AKKOMA_CONFIG_PATH and/or PLEROMA_CONFIG_PATH is unset or points to an existing file",
IO.ANSI.reset()
]
diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex
index 4676429ae..6a3184e6c 100644
--- a/lib/pleroma/config/transfer_task.ex
+++ b/lib/pleroma/config/transfer_task.ex
@@ -15,7 +15,6 @@ defmodule Pleroma.Config.TransferTask do
defp reboot_time_keys,
do: [
- {:pleroma, :shout},
{:pleroma, Oban},
{:pleroma, :rate_limit},
{:pleroma, :markup},
@@ -51,8 +50,7 @@ def load_and_update_env(deleted_settings \\ [], restart_pleroma? \\ true) do
started_applications = Application.started_applications()
- # TODO: some problem with prometheus after restart!
- reject = [nil, :prometheus, :postgrex]
+ reject = [nil, :postgrex]
reject =
if restart_pleroma? do
diff --git a/lib/pleroma/docs/translator.ex b/lib/pleroma/docs/translator.ex
new file mode 100644
index 000000000..13e33c87e
--- /dev/null
+++ b/lib/pleroma/docs/translator.ex
@@ -0,0 +1,10 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Docs.Translator do
+ require Pleroma.Docs.Translator.Compiler
+ require Pleroma.Web.Gettext
+
+ @before_compile Pleroma.Docs.Translator.Compiler
+end
diff --git a/lib/pleroma/docs/translator/compiler.ex b/lib/pleroma/docs/translator/compiler.ex
new file mode 100644
index 000000000..5d27d9fa2
--- /dev/null
+++ b/lib/pleroma/docs/translator/compiler.ex
@@ -0,0 +1,119 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Docs.Translator.Compiler do
+ @external_resource "config/description.exs"
+ @raw_config Pleroma.Config.Loader.read("config/description.exs")
+ @raw_descriptions @raw_config[:pleroma][:config_description]
+
+ defmacro __before_compile__(_env) do
+ strings =
+ __MODULE__.descriptions()
+ |> __MODULE__.extract_strings()
+
+ quote do
+ def placeholder do
+ unquote do
+ Enum.map(
+ strings,
+ fn {path, type, string} ->
+ ctxt = msgctxt_for(path, type)
+
+ quote do
+ Pleroma.Web.Gettext.dpgettext_noop(
+ "config_descriptions",
+ unquote(ctxt),
+ unquote(string)
+ )
+ end
+ end
+ )
+ end
+ end
+ end
+ end
+
+ def descriptions do
+ Pleroma.Web.ActivityPub.MRF.config_descriptions()
+ |> Enum.reduce(@raw_descriptions, fn description, acc -> [description | acc] end)
+ |> Pleroma.Docs.Generator.convert_to_strings()
+ end
+
+ def extract_strings(descriptions) do
+ descriptions
+ |> Enum.reduce(%{strings: [], path: []}, &process_item/2)
+ |> Map.get(:strings)
+ end
+
+ defp process_item(entity, acc) do
+ current_level =
+ acc
+ |> process_desc(entity)
+ |> process_label(entity)
+
+ process_children(entity, current_level)
+ end
+
+ defp process_desc(acc, %{description: desc} = item) do
+ %{
+ strings: [{acc.path ++ [key_for(item)], "description", desc} | acc.strings],
+ path: acc.path
+ }
+ end
+
+ defp process_desc(acc, _) do
+ acc
+ end
+
+ defp process_label(acc, %{label: label} = item) do
+ %{
+ strings: [{acc.path ++ [key_for(item)], "label", label} | acc.strings],
+ path: acc.path
+ }
+ end
+
+ defp process_label(acc, _) do
+ acc
+ end
+
+ defp process_children(%{children: children} = item, acc) do
+ current_level = Map.put(acc, :path, acc.path ++ [key_for(item)])
+
+ children
+ |> Enum.reduce(current_level, &process_item/2)
+ |> Map.put(:path, acc.path)
+ end
+
+ defp process_children(_, acc) do
+ acc
+ end
+
+ def msgctxt_for(path, type) do
+ "config #{type} at #{Enum.join(path, " > ")}"
+ end
+
+ defp convert_group({_, group}) do
+ group
+ end
+
+ defp convert_group(group) do
+ group
+ end
+
+ def key_for(%{group: group, key: key}) do
+ "#{convert_group(group)}-#{key}"
+ end
+
+ def key_for(%{group: group}) do
+ convert_group(group)
+ end
+
+ def key_for(%{key: key}) do
+ key
+ end
+
+ def key_for(_) do
+ nil
+ end
+end
diff --git a/lib/pleroma/emoji.ex b/lib/pleroma/emoji.ex
index ced2ae83d..24eafda41 100644
--- a/lib/pleroma/emoji.ex
+++ b/lib/pleroma/emoji.ex
@@ -9,6 +9,7 @@ defmodule Pleroma.Emoji do
"""
use GenServer
+ alias Pleroma.Emoji.Combinations
alias Pleroma.Emoji.Loader
require Logger
@@ -124,7 +125,7 @@ defp update_emojis(emojis) do
|> String.split("\n")
|> Enum.filter(fn line ->
line != "" and not String.starts_with?(line, "#") and
- String.contains?(line, "qualified")
+ String.contains?(line, "fully-qualified")
end)
|> Enum.map(fn line ->
line
@@ -186,4 +187,17 @@ def emoji_url(%{"type" => "EmojiReact", "content" => emoji, "tag" => tags}) do
end
def emoji_url(_), do: nil
+
+ emoji_qualification_map =
+ emojis
+ |> Enum.filter(&String.contains?(&1, "\uFE0F"))
+ |> Combinations.variate_emoji_qualification()
+
+ for {qualified, unqualified_list} <- emoji_qualification_map do
+ for unqualified <- unqualified_list do
+ def fully_qualify_emoji(unquote(unqualified)), do: unquote(qualified)
+ end
+ end
+
+ def fully_qualify_emoji(emoji), do: emoji
end
diff --git a/lib/pleroma/emoji/combinations.ex b/lib/pleroma/emoji/combinations.ex
new file mode 100644
index 000000000..981c73596
--- /dev/null
+++ b/lib/pleroma/emoji/combinations.ex
@@ -0,0 +1,45 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Emoji.Combinations do
+ # FE0F is the emoji variation sequence. It is used for fully-qualifying
+ # emoji, and that includes emoji combinations.
+ # This code generates combinations per emoji: for each FE0F, all possible
+ # combinations of the character being removed or staying will be generated.
+ # This is made as an attempt to find all partially-qualified and unqualified
+ # versions of a fully-qualified emoji.
+ # I have found *no cases* for which this would be a problem, after browsing
+ # the entire emoji list in emoji-test.txt. This is safe, and, sadly, most
+ # likely sane too.
+
+ defp qualification_combinations(codepoints) do
+ qualification_combinations([[]], codepoints)
+ end
+
+ defp qualification_combinations(acc, []), do: acc
+
+ defp qualification_combinations(acc, ["\uFE0F" | tail]) do
+ acc
+ |> Enum.flat_map(fn x -> [x, x ++ ["\uFE0F"]] end)
+ |> qualification_combinations(tail)
+ end
+
+ defp qualification_combinations(acc, [codepoint | tail]) do
+ acc
+ |> Enum.map(&Kernel.++(&1, [codepoint]))
+ |> qualification_combinations(tail)
+ end
+
+ def variate_emoji_qualification(emoji) when is_binary(emoji) do
+ emoji
+ |> String.codepoints()
+ |> qualification_combinations()
+ |> Enum.map(&List.to_string/1)
+ end
+
+ def variate_emoji_qualification(emoji) when is_list(emoji) do
+ emoji
+ |> Enum.map(fn emoji -> {emoji, variate_emoji_qualification(emoji)} end)
+ end
+end
diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex
index ad29d21d7..575bf9b2d 100644
--- a/lib/pleroma/formatter.ex
+++ b/lib/pleroma/formatter.ex
@@ -136,7 +136,12 @@ def html_escape(text, "text/html") do
HTML.filter_tags(text)
end
- def html_escape(text, format) when format in ["text/plain", "text/x.misskeymarkdown"] do
+ def html_escape(text, "text/x.misskeymarkdown") do
+ text
+ |> HTML.filter_tags()
+ end
+
+ def html_escape(text, "text/plain") do
Regex.split(@link_regex, text, include_captures: true)
|> Enum.map_every(2, fn chunk ->
{:safe, part} = Phoenix.HTML.html_escape(chunk)
diff --git a/lib/pleroma/migration_helper/notification_backfill.ex b/lib/pleroma/migration_helper/notification_backfill.ex
index 62b710f82..75d20a402 100644
--- a/lib/pleroma/migration_helper/notification_backfill.ex
+++ b/lib/pleroma/migration_helper/notification_backfill.ex
@@ -3,7 +3,6 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.MigrationHelper.NotificationBackfill do
- alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.User
@@ -79,14 +78,5 @@ defp type_from_activity(%{data: %{"type" => type}} = activity) do
end
end
- defp type_from_activity_object(%{data: %{"type" => "Create", "object" => %{}}}), do: "mention"
-
- defp type_from_activity_object(%{data: %{"type" => "Create"}} = activity) do
- object = Object.get_by_ap_id(activity.data["object"])
-
- case object && object.data["type"] do
- "ChatMessage" -> "pleroma:chat_mention"
- _ -> "mention"
- end
- end
+ defp type_from_activity_object(%{data: %{"type" => "Create"}}), do: "mention"
end
diff --git a/lib/pleroma/moderation_log.ex b/lib/pleroma/moderation_log.ex
index adb51d33a..7da8d0c63 100644
--- a/lib/pleroma/moderation_log.ex
+++ b/lib/pleroma/moderation_log.ex
@@ -237,17 +237,6 @@ def insert_log(%{actor: %User{}, action: action, target: target} = attrs)
insert_log_entry_with_message(%ModerationLog{data: data})
end
- def insert_log(%{actor: %User{} = actor, action: "chat_message_delete", subject_id: subject_id}) do
- %ModerationLog{
- data: %{
- "actor" => %{"nickname" => actor.nickname},
- "action" => "chat_message_delete",
- "subject_id" => subject_id
- }
- }
- |> insert_log_entry_with_message()
- end
-
@spec insert_log_entry_with_message(ModerationLog) :: {:ok, ModerationLog} | {:error, any}
defp insert_log_entry_with_message(entry) do
entry.data["message"]
@@ -554,16 +543,6 @@ def get_log_entry_message(%ModerationLog{
"@#{actor_nickname} updated users: #{users_to_nicknames_string(subjects)}"
end
- def get_log_entry_message(%ModerationLog{
- data: %{
- "actor" => %{"nickname" => actor_nickname},
- "action" => "chat_message_delete",
- "subject_id" => subject_id
- }
- }) do
- "@#{actor_nickname} deleted chat message ##{subject_id}"
- end
-
def get_log_entry_message(%ModerationLog{
data: %{
"actor" => %{"nickname" => actor_nickname},
diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex
index 2ab09495d..d8878338e 100644
--- a/lib/pleroma/notification.ex
+++ b/lib/pleroma/notification.ex
@@ -68,7 +68,6 @@ def unread_notifications_count(%User{id: user_id}) do
follow_request
mention
move
- pleroma:chat_mention
pleroma:emoji_reaction
pleroma:report
reblog
@@ -444,16 +443,7 @@ defp type_from_activity(%{data: %{"type" => type}} = activity) do
end
end
- defp type_from_activity_object(%{data: %{"type" => "Create", "object" => %{}}}), do: "mention"
-
- defp type_from_activity_object(%{data: %{"type" => "Create"}} = activity) do
- object = Object.get_by_ap_id(activity.data["object"])
-
- case object && object.data["type"] do
- "ChatMessage" -> "pleroma:chat_mention"
- _ -> "mention"
- end
- end
+ defp type_from_activity_object(%{data: %{"type" => "Create"}}), do: "mention"
# TODO move to sql, too.
def create_notification(%Activity{} = activity, %User{} = user, opts \\ []) do
diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex
index c3ea1b98b..00af77f57 100644
--- a/lib/pleroma/object.ex
+++ b/lib/pleroma/object.ex
@@ -208,10 +208,6 @@ def get_cached_by_ap_id(ap_id) do
end
end
- def context_mapping(context) do
- Object.change(%Object{}, %{data: %{"id" => context}})
- end
-
def make_tombstone(%Object{data: %{"id" => id, "type" => type}}, deleted \\ DateTime.utc_now()) do
%ObjectTombstone{
id: id,
diff --git a/lib/pleroma/repo.ex b/lib/pleroma/repo.ex
index 61b64ed3e..1fca0fccb 100644
--- a/lib/pleroma/repo.ex
+++ b/lib/pleroma/repo.ex
@@ -11,8 +11,6 @@ defmodule Pleroma.Repo do
import Ecto.Query
require Logger
- defmodule Instrumenter, do: use(Prometheus.EctoInstrumenter)
-
@doc """
Dynamically loads the repository url from the
DATABASE_URL environment variable.
diff --git a/lib/pleroma/reverse_proxy.ex b/lib/pleroma/reverse_proxy.ex
index 51f9609cb..91cf1bba3 100644
--- a/lib/pleroma/reverse_proxy.ex
+++ b/lib/pleroma/reverse_proxy.ex
@@ -114,6 +114,7 @@ def call(conn = %{method: method}, url, opts) when method in @methods do
else
{:ok, true} ->
conn
+ |> put_private(:proxied_url, url)
|> error_or_redirect(500, "Request failed", opts)
|> halt()
diff --git a/lib/pleroma/search/elasticsearch/activity_parser.ex b/lib/pleroma/search/elasticsearch/activity_parser.ex
index 9c39e516a..f2fa394fa 100644
--- a/lib/pleroma/search/elasticsearch/activity_parser.ex
+++ b/lib/pleroma/search/elasticsearch/activity_parser.ex
@@ -37,6 +37,13 @@ defp to_es({:filter, [field, query]}) do
end
def parse(q) do
- Enum.map(q, &to_es/1)
+ [
+ %{
+ exists: %{
+ field: "content"
+ }
+ }
+ ] ++
+ Enum.map(q, &to_es/1)
end
end
diff --git a/lib/pleroma/signature.ex b/lib/pleroma/signature.ex
index 43ab569a4..a71a504b3 100644
--- a/lib/pleroma/signature.ex
+++ b/lib/pleroma/signature.ex
@@ -10,17 +10,14 @@ defmodule Pleroma.Signature do
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
+ @known_suffixes ["/publickey", "/main-key"]
+
def key_id_to_actor_id(key_id) do
uri =
- URI.parse(key_id)
+ key_id
+ |> URI.parse()
|> Map.put(:fragment, nil)
-
- uri =
- if not is_nil(uri.path) and String.ends_with?(uri.path, "/publickey") do
- Map.put(uri, :path, String.replace(uri.path, "/publickey", ""))
- else
- uri
- end
+ |> remove_suffix(@known_suffixes)
maybe_ap_id = URI.to_string(uri)
@@ -36,6 +33,16 @@ def key_id_to_actor_id(key_id) do
end
end
+ defp remove_suffix(uri, [test | rest]) do
+ if not is_nil(uri.path) and String.ends_with?(uri.path, test) do
+ Map.put(uri, :path, String.replace(uri.path, test, ""))
+ else
+ remove_suffix(uri, rest)
+ end
+ end
+
+ defp remove_suffix(uri, []), do: uri
+
def fetch_public_key(conn) do
with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn),
{:ok, actor_id} <- key_id_to_actor_id(kid),
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 384535377..2a1b5af94 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -145,7 +145,6 @@ defmodule Pleroma.User do
field(:also_known_as, {:array, ObjectValidators.ObjectID}, default: [])
field(:inbox, :string)
field(:shared_inbox, :string)
- field(:accepts_chat_messages, :boolean, default: nil)
field(:last_active_at, :naive_datetime)
field(:disclose_client, :boolean, default: true)
field(:pinned_objects, :map, default: %{})
@@ -194,17 +193,6 @@ defmodule Pleroma.User do
has_many(incoming_relation_source, through: [incoming_relation, :source])
end
- # `:blocks` is deprecated (replaced with `blocked_users` relation)
- field(:blocks, {:array, :string}, default: [])
- # `:mutes` is deprecated (replaced with `muted_users` relation)
- field(:mutes, {:array, :string}, default: [])
- # `:muted_reblogs` is deprecated (replaced with `reblog_muted_users` relation)
- field(:muted_reblogs, {:array, :string}, default: [])
- # `:muted_notifications` is deprecated (replaced with `notification_muted_users` relation)
- field(:muted_notifications, {:array, :string}, default: [])
- # `:subscribers` is deprecated (replaced with `subscriber_users` relation)
- field(:subscribers, {:array, :string}, default: [])
-
embeds_one(
:multi_factor_authentication_settings,
MFA.Settings,
@@ -466,7 +454,6 @@ def remote_user_changeset(struct \\ %User{local: false}, params) do
:invisible,
:actor_type,
:also_known_as,
- :accepts_chat_messages,
:pinned_objects
]
)
@@ -527,7 +514,6 @@ def update_changeset(struct, params \\ %{}) do
:pleroma_settings_store,
:is_discoverable,
:actor_type,
- :accepts_chat_messages,
:disclose_client
]
)
@@ -677,8 +663,6 @@ def force_password_reset(user), do: update_password_reset_pending(user, true)
# Used to auto-register LDAP accounts which won't have a password hash stored locally
def register_changeset_ldap(struct, params = %{password: password})
when is_nil(password) do
- params = Map.put_new(params, :accepts_chat_messages, true)
-
params =
if Map.has_key?(params, :email) do
Map.put_new(params, :email, params[:email])
@@ -690,8 +674,7 @@ def register_changeset_ldap(struct, params = %{password: password})
|> cast(params, [
:name,
:nickname,
- :email,
- :accepts_chat_messages
+ :email
])
|> validate_required([:name, :nickname])
|> unique_constraint(:nickname)
@@ -706,7 +689,6 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do
bio_limit = Config.get([:instance, :user_bio_length], 5000)
name_limit = Config.get([:instance, :user_name_length], 100)
reason_limit = Config.get([:instance, :registration_reason_length], 500)
- params = Map.put_new(params, :accepts_chat_messages, true)
confirmed? =
if is_nil(opts[:confirmed]) do
@@ -734,7 +716,6 @@ def register_changeset(struct, params \\ %{}, opts \\ []) do
:password,
:password_confirmation,
:emoji,
- :accepts_chat_messages,
:registration_reason,
:language
])
@@ -774,12 +755,12 @@ def maybe_validate_required_email(changeset, _) do
end
end
- defp put_ap_id(changeset) do
+ def put_ap_id(changeset) do
ap_id = ap_id(%User{nickname: get_field(changeset, :nickname)})
put_change(changeset, :ap_id, ap_id)
end
- defp put_following_and_follower_and_featured_address(changeset) do
+ def put_following_and_follower_and_featured_address(changeset) do
user = %User{nickname: get_field(changeset, :nickname)}
followers = ap_followers(user)
following = ap_following(user)
@@ -837,8 +818,7 @@ def post_register_action(%User{is_approved: true, is_confirmed: true} = user) do
{:ok, user} <- set_cache(user),
{:ok, _} <- maybe_send_registration_email(user),
{:ok, _} <- maybe_send_welcome_email(user),
- {:ok, _} <- maybe_send_welcome_message(user),
- {:ok, _} <- maybe_send_welcome_chat_message(user) do
+ {:ok, _} <- maybe_send_welcome_message(user) do
{:ok, user}
end
end
@@ -872,15 +852,6 @@ defp maybe_send_welcome_message(user) do
end
end
- defp maybe_send_welcome_chat_message(user) do
- if User.WelcomeChatMessage.enabled?() do
- User.WelcomeChatMessage.post_message(user)
- {:ok, :enqueued}
- else
- {:ok, :noop}
- end
- end
-
defp maybe_send_welcome_email(%User{email: email} = user) when is_binary(email) do
if User.WelcomeEmail.enabled?() do
User.WelcomeEmail.send_email(user)
@@ -2095,7 +2066,7 @@ defp normalize_tags(tags) do
|> Enum.map(&String.downcase/1)
end
- defp local_nickname_regex do
+ def local_nickname_regex do
if Config.get([:instance, :extended_nickname_format]) do
@extended_local_nickname_regex
else
diff --git a/lib/pleroma/user/backup.ex b/lib/pleroma/user/backup.ex
index cba94248f..2c6378265 100644
--- a/lib/pleroma/user/backup.ex
+++ b/lib/pleroma/user/backup.ex
@@ -32,9 +32,7 @@ defmodule Pleroma.User.Backup do
end
def create(user, admin_id \\ nil) do
- with :ok <- validate_email_enabled(),
- :ok <- validate_user_email(user),
- :ok <- validate_limit(user, admin_id),
+ with :ok <- validate_limit(user, admin_id),
{:ok, backup} <- user |> new() |> Repo.insert() do
BackupWorker.process(backup, admin_id)
end
@@ -86,20 +84,6 @@ defp validate_limit(user, nil) do
end
end
- defp validate_email_enabled do
- if Pleroma.Config.get([Pleroma.Emails.Mailer, :enabled]) do
- :ok
- else
- {:error, dgettext("errors", "Backups require enabled email")}
- end
- end
-
- defp validate_user_email(%User{email: nil}) do
- {:error, dgettext("errors", "Email is required")}
- end
-
- defp validate_user_email(%User{email: email}) when is_binary(email), do: :ok
-
def get_last(user_id) do
__MODULE__
|> where(user_id: ^user_id)
diff --git a/lib/pleroma/user/welcome_chat_message.ex b/lib/pleroma/user/welcome_chat_message.ex
deleted file mode 100644
index 0d6690e34..000000000
--- a/lib/pleroma/user/welcome_chat_message.ex
+++ /dev/null
@@ -1,45 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.User.WelcomeChatMessage do
- alias Pleroma.Config
- alias Pleroma.User
- alias Pleroma.Web.CommonAPI
-
- @spec enabled?() :: boolean()
- def enabled?, do: Config.get([:welcome, :chat_message, :enabled], false)
-
- @spec post_message(User.t()) :: {:ok, Pleroma.Activity.t() | nil}
- def post_message(user) do
- [:welcome, :chat_message, :sender_nickname]
- |> Config.get(nil)
- |> fetch_sender()
- |> do_post(user, welcome_message())
- end
-
- defp do_post(%User{} = sender, recipient, message)
- when is_binary(message) do
- CommonAPI.post_chat_message(
- sender,
- recipient,
- message
- )
- end
-
- defp do_post(_sender, _recipient, _message), do: {:ok, nil}
-
- defp fetch_sender(nickname) when is_binary(nickname) do
- with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do
- user
- else
- _ -> nil
- end
- end
-
- defp fetch_sender(_), do: nil
-
- defp welcome_message do
- Config.get([:welcome, :chat_message, :message], nil)
- end
-end
diff --git a/lib/pleroma/utils.ex b/lib/pleroma/utils.ex
index a446d3ae6..bd9939c9f 100644
--- a/lib/pleroma/utils.ex
+++ b/lib/pleroma/utils.ex
@@ -14,10 +14,23 @@ defmodule Pleroma.Utils do
@repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000)
def compile_dir(dir) when is_binary(dir) do
+ dir
+ |> elixir_files()
+ |> Kernel.ParallelCompiler.compile()
+ end
+
+ defp elixir_files(dir) when is_binary(dir) do
dir
|> File.ls!()
|> Enum.map(&Path.join(dir, &1))
- |> Kernel.ParallelCompiler.compile()
+ |> Enum.flat_map(fn path ->
+ if File.dir?(path) do
+ elixir_files(path)
+ else
+ [path]
+ end
+ end)
+ |> Enum.filter(fn path -> String.ends_with?(path, ".ex") end)
end
@doc """
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 236181b07..03e72be58 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -97,7 +97,7 @@ defp increase_replies_count_if_reply(%{
defp increase_replies_count_if_reply(_create_data), do: :noop
- @object_types ~w[ChatMessage Question Answer Audio Video Event Article Note Page]
+ @object_types ~w[Question Answer Audio Video Event Article Note Page]
@impl true
def persist(%{"type" => type} = object, meta) when type in @object_types do
with {:ok, object} <- Object.create(object) do
@@ -318,26 +318,6 @@ defp maybe_schedule_poll_notifications(activity) do
:ok
end
- @spec listen(map()) :: {:ok, Activity.t()} | {:error, any()}
- def listen(%{to: to, actor: actor, context: context, object: object} = params) do
- additional = params[:additional] || %{}
- # only accept false as false value
- local = !(params[:local] == false)
- published = params[:published]
-
- listen_data =
- make_listen_data(
- %{to: to, actor: actor, published: published, context: context, object: object},
- additional
- )
-
- with {:ok, activity} <- insert(listen_data, local),
- _ <- notify_and_stream(activity),
- :ok <- maybe_federate(activity) do
- {:ok, activity}
- end
- end
-
@spec unfollow(User.t(), User.t(), String.t() | nil, boolean()) ::
{:ok, Activity.t()} | nil | {:error, any()}
def unfollow(follower, followed, activity_id \\ nil, local \\ true) do
@@ -347,7 +327,9 @@ def unfollow(follower, followed, activity_id \\ nil, local \\ true) do
end
end
- defp do_unfollow(follower, followed, activity_id, local) do
+ defp do_unfollow(follower, followed, activity_id, local)
+
+ defp do_unfollow(follower, followed, activity_id, local) when local == true do
with %Activity{} = follow_activity <- fetch_latest_follow(follower, followed),
{:ok, follow_activity} <- update_follow_state(follow_activity, "cancelled"),
unfollow_data <- make_unfollow_data(follower, followed, follow_activity, activity_id),
@@ -361,6 +343,32 @@ defp do_unfollow(follower, followed, activity_id, local) do
end
end
+ defp do_unfollow(follower, followed, activity_id, false) do
+ # On a remote unfollow, _remove_ their activity from the database, since some software (MISSKEEEEY)
+ # uses deterministic ids for follows.
+ with %Activity{} = follow_activity <- fetch_latest_follow(follower, followed),
+ {:ok, _activity} <- Repo.delete(follow_activity),
+ unfollow_data <- make_unfollow_data(follower, followed, follow_activity, activity_id),
+ unfollow_activity <- remote_unfollow_data(unfollow_data),
+ _ <- notify_and_stream(unfollow_activity) do
+ {:ok, unfollow_activity}
+ else
+ nil -> nil
+ {:error, error} -> Repo.rollback(error)
+ end
+ end
+
+ defp remote_unfollow_data(data) do
+ {recipients, _, _} = get_recipients(data)
+
+ %Activity{
+ data: data,
+ local: false,
+ actor: data["actor"],
+ recipients: recipients
+ }
+ end
+
@spec flag(map()) :: {:ok, Activity.t()} | {:error, any()}
def flag(params) do
with {:ok, result} <- Repo.transaction(fn -> do_flag(params) end) do
@@ -506,9 +514,18 @@ def fetch_activities(recipients, opts \\ %{}, pagination \\ :keyset) do
@spec fetch_public_or_unlisted_activities(map(), Pagination.type()) :: [Activity.t()]
def fetch_public_or_unlisted_activities(opts \\ %{}, pagination \\ :keyset) do
+ includes_local_public = Map.get(opts, :includes_local_public, false)
+
opts = Map.delete(opts, :user)
- [Constants.as_public()]
+ intended_recipients =
+ if includes_local_public do
+ [Constants.as_public(), as_local_public()]
+ else
+ [Constants.as_public()]
+ end
+
+ intended_recipients
|> fetch_activities_query(opts)
|> restrict_unlisted(opts)
|> fetch_paginated_optimized(opts, pagination)
@@ -608,9 +625,11 @@ defp restrict_thread_visibility(query, %{user: %User{skip_thread_containment: tr
do: query
defp restrict_thread_visibility(query, %{user: %User{ap_id: ap_id}}, _) do
+ local_public = as_local_public()
+
from(
a in query,
- where: fragment("thread_visibility(?, (?)->>'id') = true", ^ap_id, a.data)
+ where: fragment("thread_visibility(?, (?)->>'id', ?) = true", ^ap_id, a.data, ^local_public)
)
end
@@ -697,8 +716,12 @@ defp fetch_activities_for_reading_user(reading_user, params) do
defp user_activities_recipients(%{godmode: true}), do: []
defp user_activities_recipients(%{reading_user: reading_user}) do
- if reading_user do
- [Constants.as_public(), reading_user.ap_id | User.following(reading_user)]
+ if not is_nil(reading_user) and reading_user.local do
+ [
+ Constants.as_public(),
+ as_local_public(),
+ reading_user.ap_id | User.following(reading_user)
+ ]
else
[Constants.as_public()]
end
@@ -1174,6 +1197,13 @@ defp restrict_instance(query, %{instance: instance}) when is_binary(instance) do
)
end
+ defp restrict_instance(query, %{instance: instance}) when is_list(instance) do
+ from(
+ activity in query,
+ where: fragment("split_part(actor::text, '/'::text, 3) = ANY(?)", ^instance)
+ )
+ end
+
defp restrict_instance(query, _), do: query
defp restrict_filtered(query, %{user: %User{} = user}) do
@@ -1208,18 +1238,6 @@ defp exclude_poll_votes(query, _) do
end
end
- defp exclude_chat_messages(query, %{include_chat_messages: true}), do: query
-
- defp exclude_chat_messages(query, _) do
- if has_named_binding?(query, :object) do
- from([activity, object: o] in query,
- where: fragment("not(?->>'type' = ?)", o.data, "ChatMessage")
- )
- else
- query
- end
- end
-
defp exclude_invisible_actors(query, %{invisible_actors: true}), do: query
defp exclude_invisible_actors(query, _opts) do
@@ -1360,7 +1378,6 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|> restrict_filtered(opts)
|> Activity.restrict_deactivated_users()
|> exclude_poll_votes(opts)
- |> exclude_chat_messages(opts)
|> exclude_invisible_actors(opts)
|> exclude_visibility(opts)
@@ -1463,7 +1480,7 @@ defp normalize_image(%{"url" => url}) do
defp normalize_image(urls) when is_list(urls), do: urls |> List.first() |> normalize_image()
defp normalize_image(_), do: nil
- defp object_to_user_data(data) do
+ defp object_to_user_data(data, additional) do
fields =
data
|> Map.get("attachment", [])
@@ -1482,8 +1499,6 @@ defp object_to_user_data(data) do
end)
is_locked = data["manuallyApprovesFollowers"] || false
- capabilities = data["capabilities"] || %{}
- accepts_chat_messages = capabilities["acceptsChatMessages"]
data = Transmogrifier.maybe_fix_user_object(data)
is_discoverable = data["discoverable"] || false
invisible = data["invisible"] || false
@@ -1495,18 +1510,18 @@ defp object_to_user_data(data) do
public_key =
if is_map(data["publicKey"]) && is_binary(data["publicKey"]["publicKeyPem"]) do
data["publicKey"]["publicKeyPem"]
- else
- nil
end
shared_inbox =
if is_map(data["endpoints"]) && is_binary(data["endpoints"]["sharedInbox"]) do
data["endpoints"]["sharedInbox"]
- else
- nil
end
- user_data = %{
+ # if WebFinger request was already done, we probably have acct, otherwise
+ # we request WebFinger here
+ nickname = additional[:nickname_from_acct] || generate_nickname(data)
+
+ %{
ap_id: data["id"],
uri: get_actor_url(data["url"]),
ap_enabled: true,
@@ -1527,22 +1542,27 @@ defp object_to_user_data(data) do
public_key: public_key,
inbox: data["inbox"],
shared_inbox: shared_inbox,
- accepts_chat_messages: accepts_chat_messages,
- pinned_objects: pinned_objects
+ pinned_objects: pinned_objects,
+ nickname: nickname
}
+ end
- # nickname can be nil because of virtual actors
- if data["preferredUsername"] do
- Map.put(
- user_data,
- :nickname,
- "#{data["preferredUsername"]}@#{URI.parse(data["id"]).host}"
- )
+ defp generate_nickname(%{"preferredUsername" => username} = data) when is_binary(username) do
+ generated = "#{username}@#{URI.parse(data["id"]).host}"
+
+ if Config.get([WebFinger, :update_nickname_on_user_fetch]) do
+ case WebFinger.finger(generated) do
+ {:ok, %{"subject" => "acct:" <> acct}} -> acct
+ _ -> generated
+ end
else
- Map.put(user_data, :nickname, nil)
+ generated
end
end
+ # nickname can be nil because of virtual actors
+ defp generate_nickname(_), do: nil
+
def fetch_follow_information_for_user(user) do
with {:ok, following_data} <-
Fetcher.fetch_and_contain_remote_object_from_id(user.following_address),
@@ -1614,17 +1634,17 @@ defp collection_private(%{"first" => first}) do
defp collection_private(_data), do: {:ok, true}
- def user_data_from_user_object(data) do
+ def user_data_from_user_object(data, additional \\ []) do
with {:ok, data} <- MRF.filter(data) do
- {:ok, object_to_user_data(data)}
+ {:ok, object_to_user_data(data, additional)}
else
e -> {:error, e}
end
end
- def fetch_and_prepare_user_from_ap_id(ap_id) do
+ def fetch_and_prepare_user_from_ap_id(ap_id, additional \\ []) do
with {:ok, data} <- Fetcher.fetch_and_contain_remote_object_from_id(ap_id),
- {:ok, data} <- user_data_from_user_object(data) do
+ {:ok, data} <- user_data_from_user_object(data, additional) do
{:ok, maybe_update_follow_information(data)}
else
# If this has been deleted, only log a debug and not an error
@@ -1686,7 +1706,13 @@ def pin_data_from_featured_collection(
)
when type in ["OrderedCollection", "Collection"] do
{:ok, objects} = Collections.Fetcher.fetch_collection(collection)
- Map.new(objects, fn %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()} end)
+
+ # Items can either be a map _or_ a string
+ objects
+ |> Map.new(fn
+ ap_id when is_binary(ap_id) -> {ap_id, NaiveDateTime.utc_now()}
+ %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()}
+ end)
end
def fetch_and_prepare_featured_from_ap_id(nil) do
@@ -1716,13 +1742,13 @@ def pinned_fetch_task(%{pinned_objects: pins}) do
end
end
- def make_user_from_ap_id(ap_id) do
+ def make_user_from_ap_id(ap_id, additional \\ []) do
user = User.get_cached_by_ap_id(ap_id)
if user && !User.ap_enabled?(user) do
Transmogrifier.upgrade_user_from_ap_id(ap_id)
else
- with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id) do
+ with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id, additional) do
{:ok, _pid} = Task.start(fn -> pinned_fetch_task(data) end)
if user do
@@ -1742,8 +1768,9 @@ def make_user_from_ap_id(ap_id) do
end
def make_user_from_nickname(nickname) do
- with {:ok, %{"ap_id" => ap_id}} when not is_nil(ap_id) <- WebFinger.finger(nickname) do
- make_user_from_ap_id(ap_id)
+ with {:ok, %{"ap_id" => ap_id, "subject" => "acct:" <> acct}} when not is_nil(ap_id) <-
+ WebFinger.finger(nickname) do
+ make_user_from_ap_id(ap_id, nickname_from_acct: acct)
else
_e -> {:error, "No AP id in WebFinger"}
end
diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex
index 006e92bf4..97ceaf08e 100644
--- a/lib/pleroma/web/activity_pub/builder.ex
+++ b/lib/pleroma/web/activity_pub/builder.ex
@@ -168,6 +168,7 @@ def note(%ActivityDraft{} = draft) do
"tag" => Keyword.values(draft.tags) |> Enum.uniq()
}
|> add_in_reply_to(draft.in_reply_to)
+ |> add_quote(draft.quote)
|> Map.merge(draft.extra)
{:ok, data, []}
@@ -183,27 +184,13 @@ defp add_in_reply_to(object, in_reply_to) do
end
end
- def chat_message(actor, recipient, content, opts \\ []) do
- basic = %{
- "id" => Utils.generate_object_id(),
- "actor" => actor.ap_id,
- "type" => "ChatMessage",
- "to" => [recipient],
- "content" => content,
- "published" => DateTime.utc_now() |> DateTime.to_iso8601(),
- "emoji" => Emoji.Formatter.get_emoji_map(content)
- }
+ defp add_quote(object, nil), do: object
- case opts[:attachment] do
- %Object{data: attachment_data} ->
- {
- :ok,
- Map.put(basic, "attachment", attachment_data),
- []
- }
-
- _ ->
- {:ok, basic, []}
+ defp add_quote(object, quote) do
+ with %Object{} = quote_object <- Object.normalize(quote, fetch: false) do
+ Map.put(object, "quoteUri", quote_object.data["id"])
+ else
+ _ -> object
end
end
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
new file mode 100644
index 000000000..20432410b
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -0,0 +1,71 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
+ @moduledoc "Force a quote line into the message content."
+ @behaviour Pleroma.Web.ActivityPub.MRF.Policy
+
+ defp build_inline_quote(prefix, url) do
+ " #{prefix}: #{url} "
+ end
+
+ defp has_inline_quote?(content, quote_url) do
+ cond do
+ # Does the quote URL exist in the content?
+ content =~ quote_url -> true
+ # Does the content already have a .quote-inline span?
+ content =~ "" -> true
+ # No inline quote found
+ true -> false
+ end
+ end
+
+ defp filter_object(%{"quoteUri" => quote_url} = object) do
+ content = object["content"] || ""
+
+ if has_inline_quote?(content, quote_url) do
+ object
+ else
+ prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
+
+ content =
+ if String.ends_with?(content, "
") do
+ String.trim_trailing(content, "") <> build_inline_quote(prefix, quote_url) <> ""
+ else
+ content <> build_inline_quote(prefix, quote_url)
+ end
+
+ Map.put(object, "content", content)
+ end
+ end
+
+ @impl true
+ def filter(%{"object" => %{"quoteUri" => _} = object} = activity) do
+ {:ok, Map.put(activity, "object", filter_object(object))}
+ end
+
+ @impl true
+ def filter(object), do: {:ok, object}
+
+ @impl true
+ def describe, do: {:ok, %{}}
+
+ @impl true
+ def config_description do
+ %{
+ key: :mrf_inline_quote,
+ related_policy: "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy",
+ label: "MRF Inline Quote",
+ description: "Force quote post URLs inline",
+ children: [
+ %{
+ key: :prefix,
+ type: :string,
+ description: "Prefix before the link",
+ suggestions: ["RE", "QT", "RT", "RN"]
+ }
+ ]
+ }
+ end
+end
diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex
index 187cd0cfd..283cd884c 100644
--- a/lib/pleroma/web/activity_pub/object_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validator.ex
@@ -23,8 +23,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do
alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator
alias Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator
alias Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator
- alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator
- alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator
alias Pleroma.Web.ActivityPub.ObjectValidators.CreateGenericValidator
alias Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator
alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator
@@ -83,21 +81,6 @@ def validate(%{"type" => "Delete"} = object, meta) do
end
end
- def validate(
- %{"type" => "Create", "object" => %{"type" => "ChatMessage"} = object} = create_activity,
- meta
- ) do
- with {:ok, object_data} <- cast_and_apply(object),
- meta = Keyword.put(meta, :object_data, object_data |> stringify_keys),
- {:ok, create_activity} <-
- create_activity
- |> CreateChatMessageValidator.cast_and_validate(meta)
- |> Ecto.Changeset.apply_action(:insert) do
- create_activity = stringify_keys(create_activity)
- {:ok, create_activity, meta}
- end
- end
-
def validate(
%{"type" => "Create", "object" => %{"type" => objtype} = object} = create_activity,
meta
@@ -143,7 +126,7 @@ def validate(%{"type" => type} = object, meta)
def validate(%{"type" => type} = object, meta)
when type in ~w[Accept Reject Follow Update Like EmojiReact Announce
- ChatMessage Answer] do
+ Answer] do
validator =
case type do
"Accept" -> AcceptRejectValidator
@@ -153,7 +136,6 @@ def validate(%{"type" => type} = object, meta)
"Like" -> LikeValidator
"EmojiReact" -> EmojiReactValidator
"Announce" -> AnnounceValidator
- "ChatMessage" -> ChatMessageValidator
"Answer" -> AnswerValidator
end
@@ -178,10 +160,6 @@ def validate(%{"type" => type} = object, meta) when type in ~w(Add Remove) do
def validate(o, m), do: {:error, {:validator_not_set, {o, m}}}
- def cast_and_apply(%{"type" => "ChatMessage"} = object) do
- ChatMessageValidator.cast_and_apply(object)
- end
-
def cast_and_apply(%{"type" => "Question"} = object) do
QuestionValidator.cast_and_apply(object)
end
diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
index 5e377c294..eee7629ad 100644
--- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
@@ -110,7 +110,8 @@ defp remote_mention_resolver(
# https://github.com/misskey-dev/misskey/pull/8787
defp fix_misskey_content(
%{"source" => %{"mediaType" => "text/x.misskeymarkdown", "content" => content}} = object
- ) do
+ )
+ when is_binary(content) do
mention_handler = fn nick, buffer, opts, acc ->
remote_mention_resolver(object, nick, buffer, opts, acc)
end
@@ -121,7 +122,7 @@ defp fix_misskey_content(
Map.put(object, "content", linked)
end
- defp fix_misskey_content(%{"_misskey_content" => content} = object) do
+ defp fix_misskey_content(%{"_misskey_content" => content} = object) when is_binary(content) do
mention_handler = fn nick, buffer, opts, acc ->
remote_mention_resolver(object, nick, buffer, opts, acc)
end
@@ -173,7 +174,7 @@ def changeset(struct, data) do
defp validate_data(data_cng) do
data_cng
|> validate_inclusion(:type, ["Article", "Note", "Page"])
- |> validate_required([:id, :actor, :attributedTo, :type, :context, :context_id])
+ |> validate_required([:id, :actor, :attributedTo, :type, :context])
|> CommonValidations.validate_any_presence([:cc, :to])
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|> CommonValidations.validate_actor_presence()
diff --git a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex
index 59fef42d6..ffdb16976 100644
--- a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex
@@ -44,9 +44,9 @@ def changeset(struct, data) do
struct
|> cast(data, [:type, :mediaType, :name, :blurhash])
- |> cast_embed(:url, with: &url_changeset/2)
+ |> cast_embed(:url, with: &url_changeset/2, required: true)
|> validate_inclusion(:type, ~w[Link Document Audio Image Video])
- |> validate_required([:type, :mediaType, :url])
+ |> validate_required([:type, :mediaType])
end
def url_changeset(struct, data) do
@@ -96,6 +96,6 @@ defp fix_url(data) do
defp validate_data(cng) do
cng
|> validate_inclusion(:type, ~w[Document Audio Image Video])
- |> validate_required([:mediaType, :url, :type])
+ |> validate_required([:mediaType, :type])
end
end
diff --git a/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex
index 331ec9050..ffdeb1757 100644
--- a/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex
@@ -104,14 +104,14 @@ def changeset(struct, data) do
struct
|> cast(data, __schema__(:fields) -- [:attachment, :tag])
- |> cast_embed(:attachment)
+ |> cast_embed(:attachment, required: true)
|> cast_embed(:tag)
end
defp validate_data(data_cng) do
data_cng
|> validate_inclusion(:type, ["Audio", "Video"])
- |> validate_required([:id, :actor, :attributedTo, :type, :context, :attachment])
+ |> validate_required([:id, :actor, :attributedTo, :type, :context])
|> CommonValidations.validate_any_presence([:cc, :to])
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|> CommonValidations.validate_actor_presence()
diff --git a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex
deleted file mode 100644
index b153156b0..000000000
--- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex
+++ /dev/null
@@ -1,129 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do
- use Ecto.Schema
-
- alias Pleroma.EctoType.ActivityPub.ObjectValidators
- alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator
-
- import Ecto.Changeset
- import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1]
-
- @primary_key false
- @derive Jason.Encoder
-
- embedded_schema do
- field(:id, ObjectValidators.ObjectID, primary_key: true)
- field(:to, ObjectValidators.Recipients, default: [])
- field(:type, :string)
- field(:content, ObjectValidators.SafeText)
- field(:actor, ObjectValidators.ObjectID)
- field(:published, ObjectValidators.DateTime)
- field(:emoji, ObjectValidators.Emoji, default: %{})
-
- embeds_one(:attachment, AttachmentValidator)
- end
-
- def cast_and_apply(data) do
- data
- |> cast_data
- |> apply_action(:insert)
- end
-
- def cast_and_validate(data) do
- data
- |> cast_data()
- |> validate_data()
- end
-
- def cast_data(data) do
- %__MODULE__{}
- |> changeset(data)
- end
-
- def fix(data) do
- data
- |> fix_emoji()
- |> fix_attachment()
- |> Map.put_new("actor", data["attributedTo"])
- end
-
- # Throws everything but the first one away
- def fix_attachment(%{"attachment" => [attachment | _]} = data) do
- data
- |> Map.put("attachment", attachment)
- end
-
- def fix_attachment(data), do: data
-
- def changeset(struct, data) do
- data = fix(data)
-
- struct
- |> cast(data, List.delete(__schema__(:fields), :attachment))
- |> cast_embed(:attachment)
- end
-
- defp validate_data(data_cng) do
- data_cng
- |> validate_inclusion(:type, ["ChatMessage"])
- |> validate_required([:id, :actor, :to, :type, :published])
- |> validate_content_or_attachment()
- |> validate_length(:to, is: 1)
- |> validate_length(:content, max: Pleroma.Config.get([:instance, :remote_limit]))
- |> validate_local_concern()
- end
-
- def validate_content_or_attachment(cng) do
- attachment = get_field(cng, :attachment)
-
- if attachment do
- cng
- else
- cng
- |> validate_required([:content])
- end
- end
-
- @doc """
- Validates the following
- - If both users are in our system
- - If at least one of the users in this ChatMessage is a local user
- - If the recipient is not blocking the actor
- - If the recipient is explicitly not accepting chat messages
- """
- def validate_local_concern(cng) do
- with actor_ap <- get_field(cng, :actor),
- {_, %User{} = actor} <- {:find_actor, User.get_cached_by_ap_id(actor_ap)},
- {_, %User{} = recipient} <-
- {:find_recipient, User.get_cached_by_ap_id(get_field(cng, :to) |> hd())},
- {_, false} <- {:not_accepting_chats?, recipient.accepts_chat_messages == false},
- {_, false} <- {:blocking_actor?, User.blocks?(recipient, actor)},
- {_, true} <- {:local?, Enum.any?([actor, recipient], & &1.local)} do
- cng
- else
- {:blocking_actor?, true} ->
- cng
- |> add_error(:actor, "actor is blocked by recipient")
-
- {:not_accepting_chats?, true} ->
- cng
- |> add_error(:to, "recipient does not accept chat messages")
-
- {:local?, false} ->
- cng
- |> add_error(:actor, "actor and recipient are both remote")
-
- {:find_actor, _} ->
- cng
- |> add_error(:actor, "can't find user")
-
- {:find_recipient, _} ->
- cng
- |> add_error(:to, "can't find user")
- end
- end
-end
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
index 011cf66ca..49aba68af 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
@@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFields do
alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator
alias Pleroma.Web.ActivityPub.ObjectValidators.TagValidator
- # Activities and Objects, except (Create)ChatMessage
+ # Activities and Objects
defmacro message_fields do
quote bind_quoted: binding() do
field(:type, :string)
@@ -38,7 +38,7 @@ defmacro object_fields do
end
end
- # Basically objects that aren't ChatMessage and Answer
+ # Basically objects that aren't Answer
defmacro status_object_fields do
quote bind_quoted: binding() do
# TODO: Remove actor on objects
@@ -51,14 +51,13 @@ defmacro status_object_fields do
field(:summary, :string)
field(:context, :string)
- # short identifier for PleromaFE to group statuses by context
- field(:context_id, :integer)
field(:sensitive, :boolean, default: false)
field(:replies_count, :integer, default: 0)
field(:like_count, :integer, default: 0)
field(:announcement_count, :integer, default: 0)
field(:inReplyTo, ObjectValidators.ObjectID)
+ field(:quoteUri, ObjectValidators.ObjectID)
field(:url, ObjectValidators.Uri)
field(:likes, {:array, ObjectValidators.ObjectID}, default: [])
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
index 9631013a7..779c8b622 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
@@ -22,14 +22,12 @@ def cast_and_filter_recipients(message, field, follower_collection, field_fallba
end
def fix_object_defaults(data) do
- %{data: %{"id" => context}, id: context_id} =
- Utils.create_context(data["context"] || data["conversation"])
+ context = Utils.maybe_create_context(data["context"] || data["conversation"])
%User{follower_address: follower_collection} = User.get_cached_by_ap_id(data["attributedTo"])
data
|> Map.put("context", context)
- |> Map.put("context_id", context_id)
|> cast_and_filter_recipients("to", follower_collection)
|> cast_and_filter_recipients("cc", follower_collection)
|> cast_and_filter_recipients("bto", follower_collection)
diff --git a/lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex
deleted file mode 100644
index 6551f64ca..000000000
--- a/lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex
+++ /dev/null
@@ -1,96 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-# NOTES
-# - Can probably be a generic create validator
-# - doesn't embed, will only get the object id
-defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator do
- use Ecto.Schema
- alias Pleroma.EctoType.ActivityPub.ObjectValidators
-
- alias Pleroma.Object
-
- import Ecto.Changeset
- import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
-
- @primary_key false
-
- embedded_schema do
- quote do
- unquote do
- import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
- activity_fields()
- end
- end
-
- field(:id, ObjectValidators.ObjectID, primary_key: true)
- field(:type, :string)
- field(:to, ObjectValidators.Recipients, default: [])
- end
-
- def cast_and_apply(data) do
- data
- |> cast_data
- |> apply_action(:insert)
- end
-
- def cast_data(data) do
- cast(%__MODULE__{}, data, __schema__(:fields))
- end
-
- def cast_and_validate(data, meta \\ []) do
- cast_data(data)
- |> validate_data(meta)
- end
-
- defp validate_data(cng, meta) do
- cng
- |> validate_required([:id, :actor, :to, :type, :object])
- |> validate_inclusion(:type, ["Create"])
- |> validate_actor_presence()
- |> validate_recipients_match(meta)
- |> validate_actors_match(meta)
- |> validate_object_nonexistence()
- end
-
- def validate_object_nonexistence(cng) do
- cng
- |> validate_change(:object, fn :object, object_id ->
- if Object.get_cached_by_ap_id(object_id) do
- [{:object, "The object to create already exists"}]
- else
- []
- end
- end)
- end
-
- def validate_actors_match(cng, meta) do
- object_actor = meta[:object_data]["actor"]
-
- cng
- |> validate_change(:actor, fn :actor, actor ->
- if actor == object_actor do
- []
- else
- [{:actor, "Actor doesn't match with object actor"}]
- end
- end)
- end
-
- def validate_recipients_match(cng, meta) do
- object_recipients = meta[:object_data]["to"] || []
-
- cng
- |> validate_change(:to, fn :to, recipients ->
- activity_set = MapSet.new(recipients)
- object_set = MapSet.new(object_recipients)
-
- if MapSet.equal?(activity_set, object_set) do
- []
- else
- [{:to, "Recipients don't match with object recipients"}]
- end
- end)
- end
-end
diff --git a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
index f0c99356e..a08e8ebe0 100644
--- a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
@@ -48,7 +48,6 @@ def add_deleted_activity_id(cng) do
Answer
Article
Audio
- ChatMessage
Event
Note
Page
diff --git a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
index f4870f580..306a57a93 100644
--- a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
@@ -53,6 +53,7 @@ def changeset(struct, data) do
defp fix(data) do
data =
data
+ |> fix_emoji_qualification()
|> CommonFixes.fix_actor()
|> CommonFixes.fix_activity_addressing()
@@ -77,6 +78,23 @@ defp fix(data) do
defp matches_shortcode?(nil), do: false
defp matches_shortcode?(s), do: Regex.match?(@emoji_regex, s)
+ defp fix_emoji_qualification(%{"content" => emoji} = data) do
+ new_emoji = Pleroma.Emoji.fully_qualify_emoji(emoji)
+
+ cond do
+ Pleroma.Emoji.is_unicode_emoji?(emoji) ->
+ data
+
+ Pleroma.Emoji.is_unicode_emoji?(new_emoji) ->
+ data |> Map.put("content", new_emoji)
+
+ true ->
+ data
+ end
+ end
+
+ defp fix_emoji_qualification(data), do: data
+
defp validate_emoji(cng) do
content = get_field(cng, :content)
diff --git a/lib/pleroma/web/activity_pub/object_validators/event_validator.ex b/lib/pleroma/web/activity_pub/object_validators/event_validator.ex
index 34a3031c3..76bba2778 100644
--- a/lib/pleroma/web/activity_pub/object_validators/event_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/event_validator.ex
@@ -62,7 +62,7 @@ def changeset(struct, data) do
defp validate_data(data_cng) do
data_cng
|> validate_inclusion(:type, ["Event"])
- |> validate_required([:id, :actor, :attributedTo, :type, :context, :context_id])
+ |> validate_required([:id, :actor, :attributedTo, :type, :context])
|> CommonValidations.validate_any_presence([:cc, :to])
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|> CommonValidations.validate_actor_presence()
diff --git a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex
index bdddfdaeb..9c45374a4 100644
--- a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex
@@ -80,7 +80,7 @@ def changeset(struct, data) do
defp validate_data(data_cng) do
data_cng
|> validate_inclusion(:type, ["Question"])
- |> validate_required([:id, :actor, :attributedTo, :type, :context, :context_id])
+ |> validate_required([:id, :actor, :attributedTo, :type, :context])
|> CommonValidations.validate_any_presence([:cc, :to])
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|> CommonValidations.validate_actor_presence()
diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex
index ed99079e2..ed67a060d 100644
--- a/lib/pleroma/web/activity_pub/publisher.ex
+++ b/lib/pleroma/web/activity_pub/publisher.ex
@@ -103,19 +103,20 @@ defp signature_host(%URI{port: port, scheme: scheme, host: host}) do
end
end
- defp should_federate?(inbox, public) do
- if public do
- true
- else
- %{host: host} = URI.parse(inbox)
+ defp blocked_instances do
+ Config.get([:instance, :quarantined_instances], []) ++
+ Config.get([:mrf_simple, :reject], [])
+ end
- quarantined_instances =
- Config.get([:instance, :quarantined_instances], [])
- |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
- |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
+ defp should_federate?(inbox) do
+ %{host: host} = URI.parse(inbox)
- !Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
- end
+ quarantined_instances =
+ blocked_instances()
+ |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
+ |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
+
+ !Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
end
@spec recipients(User.t(), Activity.t()) :: list(User.t()) | []
@@ -192,7 +193,6 @@ def determine_inbox(
def publish(%User{} = actor, %{data: %{"bcc" => bcc}} = activity)
when is_list(bcc) and bcc != [] do
- public = is_public?(activity)
{:ok, data} = Transmogrifier.prepare_outgoing(activity.data)
recipients = recipients(actor, activity)
@@ -201,7 +201,7 @@ def publish(%User{} = actor, %{data: %{"bcc" => bcc}} = activity)
recipients
|> Enum.filter(&User.ap_enabled?/1)
|> Enum.map(fn actor -> actor.inbox end)
- |> Enum.filter(fn inbox -> should_federate?(inbox, public) end)
+ |> Enum.filter(fn inbox -> should_federate?(inbox) end)
|> Instances.filter_reachable()
Repo.checkout(fn ->
@@ -246,7 +246,7 @@ def publish(%User{} = actor, %Activity{} = activity) do
determine_inbox(activity, user)
end)
|> Enum.uniq()
- |> Enum.filter(fn inbox -> should_federate?(inbox, public) end)
+ |> Enum.filter(fn inbox -> should_federate?(inbox) end)
|> Instances.filter_reachable()
|> Enum.each(fn {inbox, unreachable_since} ->
Pleroma.Web.Federator.Publisher.enqueue_one(
diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex
index e2371b693..439268470 100644
--- a/lib/pleroma/web/activity_pub/side_effects.ex
+++ b/lib/pleroma/web/activity_pub/side_effects.ex
@@ -10,8 +10,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
collection, and so on.
"""
alias Pleroma.Activity
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
alias Pleroma.FollowingRelationship
alias Pleroma.Notification
alias Pleroma.Object
@@ -27,7 +25,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
require Logger
- @cachex Pleroma.Config.get([:cachex, :provider], Cachex)
@logger Pleroma.Config.get([:side_effects, :logger], Logger)
@behaviour Pleroma.Web.ActivityPub.SideEffects.Handling
@@ -306,8 +303,6 @@ def handle(%{data: %{"type" => "Delete", "object" => deleted_object}} = object,
Object.decrease_replies_count(in_reply_to)
end
- MessageReference.delete_for_object(deleted_object)
-
ap_streamer().stream_out(object)
ap_streamer().stream_out_participations(deleted_object, user)
:ok
@@ -400,41 +395,6 @@ def handle(object, meta) do
{:ok, object, meta}
end
- def handle_object_creation(%{"type" => "ChatMessage"} = object, _activity, meta) do
- with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do
- actor = User.get_cached_by_ap_id(object.data["actor"])
- recipient = User.get_cached_by_ap_id(hd(object.data["to"]))
-
- streamables =
- [[actor, recipient], [recipient, actor]]
- |> Enum.uniq()
- |> Enum.map(fn [user, other_user] ->
- if user.local do
- {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
- {:ok, cm_ref} = MessageReference.create(chat, object, user.ap_id != actor.ap_id)
-
- @cachex.put(
- :chat_message_id_idempotency_key_cache,
- cm_ref.id,
- meta[:idempotency_key]
- )
-
- {
- ["user", "user:pleroma_chat"],
- {user, %{cm_ref | chat: chat, object: object}}
- }
- end
- end)
- |> Enum.filter(& &1)
-
- meta =
- meta
- |> add_streamables(streamables)
-
- {:ok, object, meta}
- end
- end
-
def handle_object_creation(%{"type" => "Question"} = object, activity, meta) do
with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do
PollWorker.schedule_poll_end(activity)
@@ -533,13 +493,6 @@ defp send_streamables(meta) do
meta
end
- defp add_streamables(meta, streamables) do
- existing = Keyword.get(meta, :streamables, [])
-
- meta
- |> Keyword.put(:streamables, streamables ++ existing)
- end
-
defp add_notifications(meta, notifications) do
existing = Keyword.get(meta, :notifications, [])
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index cf0c9a9e2..d2077967c 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -38,6 +38,7 @@ def fix_object(object, options \\ []) do
|> fix_attachments()
|> fix_context()
|> fix_in_reply_to(options)
+ |> fix_quote_url(options)
|> fix_emoji()
|> fix_tag()
|> fix_content_map()
@@ -167,6 +168,53 @@ def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object, options)
def fix_in_reply_to(object, _options), do: object
+ def fix_quote_url(object, options \\ [])
+
+ def fix_quote_url(%{"quoteUri" => quote_url} = object, options)
+ when not is_nil(quote_url) do
+ depth = (options[:depth] || 0) + 1
+
+ if Federator.allowed_thread_distance?(depth) do
+ with {:ok, quoted_object} <- get_obj_helper(quote_url, options),
+ %Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do
+ object
+ |> Map.put("quoteUri", quoted_object.data["id"])
+ else
+ e ->
+ Logger.warn("Couldn't fetch #{inspect(quote_url)}, error: #{inspect(e)}")
+ object
+ end
+ else
+ object
+ end
+ end
+
+ # Soapbox
+ def fix_quote_url(%{"quoteUrl" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUri", quote_url)
+ |> Map.delete("quoteUrl")
+ |> fix_quote_url(options)
+ end
+
+ # Old Fedibird (bug)
+ # https://github.com/fedibird/mastodon/issues/9
+ def fix_quote_url(%{"quoteURL" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUri", quote_url)
+ |> Map.delete("quoteURL")
+ |> fix_quote_url(options)
+ end
+
+ def fix_quote_url(%{"_misskey_quote" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUri", quote_url)
+ |> Map.delete("_misskey_quote")
+ |> fix_quote_url(options)
+ end
+
+ def fix_quote_url(object, _), do: object
+
defp prepare_in_reply_to(in_reply_to) do
cond do
is_bitstring(in_reply_to) ->
@@ -384,37 +432,6 @@ def handle_incoming(%{"id" => ""}, _options), do: :error
def handle_incoming(%{"id" => id}, _options) when is_binary(id) and byte_size(id) < 8,
do: :error
- def handle_incoming(
- %{"type" => "Listen", "object" => %{"type" => "Audio"} = object} = data,
- options
- ) do
- actor = Containment.get_actor(data)
-
- data =
- Map.put(data, "actor", actor)
- |> fix_addressing
-
- with {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(data["actor"]) do
- reply_depth = (options[:depth] || 0) + 1
- options = Keyword.put(options, :depth, reply_depth)
- object = fix_object(object, options)
-
- params = %{
- to: data["to"],
- object: object,
- actor: user,
- context: nil,
- local: false,
- published: data["published"],
- additional: Map.take(data, ["cc", "id"])
- }
-
- ActivityPub.listen(params)
- else
- _e -> :error
- end
- end
-
@doc "Rewrite misskey likes into EmojiReacts"
def handle_incoming(
%{
@@ -447,7 +464,7 @@ def handle_incoming(
%{"type" => "Create", "object" => %{"type" => objtype, "id" => obj_id}} = data,
options
)
- when objtype in ~w{Question Answer ChatMessage Audio Video Event Article Note Page} do
+ when objtype in ~w{Question Answer Audio Video Event Article Note Page} do
fetch_options = Keyword.put(options, :depth, (options[:depth] || 0) + 1)
object =
@@ -455,8 +472,18 @@ def handle_incoming(
|> strip_internal_fields()
|> fix_type(fetch_options)
|> fix_in_reply_to(fetch_options)
+ |> fix_quote_url(fetch_options)
+
+ # Only change the Create's context if the object's context has been modified.
+ data =
+ if data["object"]["context"] != object["context"] do
+ data
+ |> Map.put("object", object)
+ |> Map.put("context", object["context"])
+ else
+ Map.put(data, "object", object)
+ end
- data = Map.put(data, "object", object)
options = Keyword.put(options, :local, false)
with {:ok, %User{}} <- ObjectValidator.fetch_actor(data),
@@ -629,6 +656,12 @@ def set_reply_to_uri(%{"inReplyTo" => in_reply_to} = object) when is_binary(in_r
def set_reply_to_uri(obj), do: obj
+ def set_quote_url(%{"quoteUri" => quote} = object) when is_binary(quote) do
+ Map.put(object, "quoteUrl", quote)
+ end
+
+ def set_quote_url(obj), do: obj
+
@doc """
Serialized Mastodon-compatible `replies` collection containing _self-replies_.
Based on Mastodon's ActivityPub::NoteSerializer#replies.
@@ -683,6 +716,7 @@ def prepare_object(object) do
|> prepare_attachments
|> set_conversation
|> set_reply_to_uri
+ |> set_quote_url()
|> set_replies
|> strip_internal_fields
|> strip_internal_tags
@@ -695,7 +729,7 @@ def prepare_object(object) do
# """
def prepare_outgoing(%{"type" => activity_type, "object" => object_id} = data)
- when activity_type in ["Create", "Listen"] do
+ when activity_type in ["Create"] do
object =
object_id
|> Object.normalize(fetch: false)
@@ -877,9 +911,6 @@ def add_attributed_to(object) do
Map.put(object, "attributedTo", attributed_to)
end
- # TODO: Revisit this
- def prepare_attachments(%{"type" => "ChatMessage"} = object), do: object
-
def prepare_attachments(object) do
attachments =
object
diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex
index 6a8360def..5e5df4888 100644
--- a/lib/pleroma/web/activity_pub/utils.ex
+++ b/lib/pleroma/web/activity_pub/utils.ex
@@ -154,22 +154,7 @@ def get_notified_from_object(object) do
Notification.get_notified_from_activity(%Activity{data: object}, false)
end
- def create_context(context) do
- context = context || generate_id("contexts")
-
- # Ecto has problems accessing the constraint inside the jsonb,
- # so we explicitly check for the existed object before insert
- object = Object.get_cached_by_ap_id(context)
-
- with true <- is_nil(object),
- changeset <- Object.context_mapping(context),
- {:ok, inserted_object} <- Repo.insert(changeset) do
- inserted_object
- else
- _ ->
- object
- end
- end
+ def maybe_create_context(context), do: context || generate_id("contexts")
@doc """
Enqueues an activity for federation if it's local
@@ -201,18 +186,16 @@ def lazy_put_activity_defaults(map, true) do
|> Map.put_new("id", "pleroma:fakeid")
|> Map.put_new_lazy("published", &make_date/0)
|> Map.put_new("context", "pleroma:fakecontext")
- |> Map.put_new("context_id", -1)
|> lazy_put_object_defaults(true)
end
def lazy_put_activity_defaults(map, _fake?) do
- %{data: %{"id" => context}, id: context_id} = create_context(map["context"])
+ context = maybe_create_context(map["context"])
map
|> Map.put_new_lazy("id", &generate_activity_id/0)
|> Map.put_new_lazy("published", &make_date/0)
|> Map.put_new("context", context)
- |> Map.put_new("context_id", context_id)
|> lazy_put_object_defaults(false)
end
@@ -226,7 +209,6 @@ defp lazy_put_object_defaults(%{"object" => map} = activity, true)
|> Map.put_new("id", "pleroma:fake_object_id")
|> Map.put_new_lazy("published", &make_date/0)
|> Map.put_new("context", activity["context"])
- |> Map.put_new("context_id", activity["context_id"])
|> Map.put_new("fake", true)
%{activity | "object" => object}
@@ -239,7 +221,6 @@ defp lazy_put_object_defaults(%{"object" => map} = activity, _)
|> Map.put_new_lazy("id", &generate_object_id/0)
|> Map.put_new_lazy("published", &make_date/0)
|> Map.put_new("context", activity["context"])
- |> Map.put_new("context_id", activity["context_id"])
%{activity | "object" => object}
end
@@ -713,21 +694,6 @@ def make_create_data(params, additional) do
|> Map.merge(additional)
end
- #### Listen-related helpers
- def make_listen_data(params, additional) do
- published = params.published || make_date()
-
- %{
- "type" => "Listen",
- "to" => params.to |> Enum.uniq(),
- "actor" => params.actor.ap_id,
- "object" => params.object,
- "published" => published,
- "context" => params.context
- }
- |> Map.merge(additional)
- end
-
#### Flag-related helpers
@spec make_flag_data(map(), map()) :: map()
def make_flag_data(%{actor: actor, context: context, content: content} = params, additional) do
diff --git a/lib/pleroma/web/activity_pub/views/object_view.ex b/lib/pleroma/web/activity_pub/views/object_view.ex
index 8a3e4d77b..d9b59406c 100644
--- a/lib/pleroma/web/activity_pub/views/object_view.ex
+++ b/lib/pleroma/web/activity_pub/views/object_view.ex
@@ -16,7 +16,7 @@ def render("object.json", %{object: %Object{} = object}) do
end
def render("object.json", %{object: %Activity{data: %{"type" => activity_type}} = activity})
- when activity_type in ["Create", "Listen"] do
+ when activity_type in ["Create"] do
base = Pleroma.Web.ActivityPub.Utils.make_json_ld_header()
object = Object.normalize(activity, fetch: false)
diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex
index 344da19d3..760515f34 100644
--- a/lib/pleroma/web/activity_pub/views/user_view.ex
+++ b/lib/pleroma/web/activity_pub/views/user_view.ex
@@ -83,14 +83,7 @@ def render("user.json", %{user: user}) do
fields = Enum.map(user.fields, &Map.put(&1, "type", "PropertyValue"))
- capabilities =
- if is_boolean(user.accepts_chat_messages) do
- %{
- "acceptsChatMessages" => user.accepts_chat_messages
- }
- else
- %{}
- end
+ capabilities = %{}
%{
"id" => user.ap_id,
diff --git a/lib/pleroma/web/activity_pub/visibility.ex b/lib/pleroma/web/activity_pub/visibility.ex
index 98b69f0b7..02d4e195a 100644
--- a/lib/pleroma/web/activity_pub/visibility.ex
+++ b/lib/pleroma/web/activity_pub/visibility.ex
@@ -85,11 +85,9 @@ def visible_for_user?(%{__struct__: module} = message, user)
x = [user.ap_id | User.following(user)]
y = [message.data["actor"]] ++ message.data["to"] ++ (message.data["cc"] || [])
- if is_local_public?(message) do
- user.local
- else
- is_public?(message) || Enum.any?(x, &(&1 in y))
- end
+ user_is_local = user.local
+ federatable = not is_local_public?(message)
+ (is_public?(message) || Enum.any?(x, &(&1 in y))) and (user_is_local || federatable)
end
def entire_thread_visible_for_user?(%Activity{} = activity, %User{} = user) do
diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex
index 50aa294f0..1d7ac78a0 100644
--- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex
+++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex
@@ -52,12 +52,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
when action in [:list_user_statuses]
)
- plug(
- OAuthScopesPlug,
- %{scopes: ["admin:read:chats"]}
- when action in [:list_user_chats]
- )
-
plug(
OAuthScopesPlug,
%{scopes: ["admin:read"]}
@@ -106,20 +100,6 @@ def list_user_statuses(%{assigns: %{user: admin}} = conn, %{"nickname" => nickna
end
end
- def list_user_chats(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname} = _params) do
- with %User{id: user_id} <- User.get_cached_by_nickname_or_id(nickname, for: admin) do
- chats =
- Pleroma.Chat.for_user_query(user_id)
- |> Pleroma.Repo.all()
-
- conn
- |> put_view(AdminAPI.ChatView)
- |> render("index.json", chats: chats)
- else
- _ -> {:error, :not_found}
- end
- end
-
def tag_users(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames, "tags" => tags}) do
with {:ok, _} <- User.tag(nicknames, tags) do
ModerationLog.insert_log(%{
diff --git a/lib/pleroma/web/admin_api/controllers/announcement_controller.ex b/lib/pleroma/web/admin_api/controllers/announcement_controller.ex
new file mode 100644
index 000000000..6ad5fc12c
--- /dev/null
+++ b/lib/pleroma/web/admin_api/controllers/announcement_controller.ex
@@ -0,0 +1,83 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.AdminAPI.AnnouncementController do
+ use Pleroma.Web, :controller
+
+ alias Pleroma.Announcement
+ alias Pleroma.Web.ControllerHelper
+ alias Pleroma.Web.Plugs.OAuthScopesPlug
+
+ plug(Pleroma.Web.ApiSpec.CastAndValidate)
+ plug(OAuthScopesPlug, %{scopes: ["admin:write"]} when action in [:create, :delete, :change])
+ plug(OAuthScopesPlug, %{scopes: ["admin:read"]} when action in [:index, :show])
+ action_fallback(Pleroma.Web.AdminAPI.FallbackController)
+
+ defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.AnnouncementOperation
+
+ defp default_limit, do: 20
+
+ def index(conn, params) do
+ limit = Map.get(params, :limit, default_limit())
+ offset = Map.get(params, :offset, 0)
+
+ announcements = Announcement.list_paginated(%{limit: limit, offset: offset})
+
+ render(conn, "index.json", announcements: announcements)
+ end
+
+ def show(conn, %{id: id} = _params) do
+ announcement = Announcement.get_by_id(id)
+
+ if is_nil(announcement) do
+ {:error, :not_found}
+ else
+ render(conn, "show.json", announcement: announcement)
+ end
+ end
+
+ def create(%{body_params: params} = conn, _params) do
+ with {:ok, announcement} <- Announcement.add(change_params(params)) do
+ render(conn, "show.json", announcement: announcement)
+ else
+ _ ->
+ {:error, 400}
+ end
+ end
+
+ def change_params(orig_params) do
+ data =
+ %{}
+ |> Pleroma.Maps.put_if_present("content", orig_params, &Map.fetch(&1, :content))
+ |> Pleroma.Maps.put_if_present("all_day", orig_params, &Map.fetch(&1, :all_day))
+
+ orig_params
+ |> Map.merge(%{data: data})
+ end
+
+ def change(%{body_params: params} = conn, %{id: id} = _params) do
+ with announcement <- Announcement.get_by_id(id),
+ {:exists, true} <- {:exists, not is_nil(announcement)},
+ {:ok, announcement} <- Announcement.update(announcement, change_params(params)) do
+ render(conn, "show.json", announcement: announcement)
+ else
+ {:exists, false} ->
+ {:error, :not_found}
+
+ _ ->
+ {:error, 400}
+ end
+ end
+
+ def delete(conn, %{id: id} = _params) do
+ case Announcement.delete_by_id(id) do
+ :ok ->
+ conn
+ |> ControllerHelper.json_response(:ok, %{})
+
+ _ ->
+ {:error, :not_found}
+ end
+ end
+end
diff --git a/lib/pleroma/web/admin_api/controllers/chat_controller.ex b/lib/pleroma/web/admin_api/controllers/chat_controller.ex
deleted file mode 100644
index ff20c8604..000000000
--- a/lib/pleroma/web/admin_api/controllers/chat_controller.ex
+++ /dev/null
@@ -1,85 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.AdminAPI.ChatController do
- use Pleroma.Web, :controller
-
- alias Pleroma.Activity
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.ModerationLog
- alias Pleroma.Pagination
- alias Pleroma.Web.AdminAPI
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
- alias Pleroma.Web.Plugs.OAuthScopesPlug
-
- require Logger
-
- plug(Pleroma.Web.ApiSpec.CastAndValidate)
-
- plug(
- OAuthScopesPlug,
- %{scopes: ["admin:read:chats"]} when action in [:show, :messages]
- )
-
- plug(
- OAuthScopesPlug,
- %{scopes: ["admin:write:chats"]} when action in [:delete_message]
- )
-
- action_fallback(Pleroma.Web.AdminAPI.FallbackController)
-
- defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ChatOperation
-
- def delete_message(%{assigns: %{user: user}} = conn, %{
- message_id: message_id,
- id: chat_id
- }) do
- with %MessageReference{object: %{data: %{"id" => object_ap_id}}} = cm_ref <-
- MessageReference.get_by_id(message_id),
- ^chat_id <- to_string(cm_ref.chat_id),
- %Activity{id: activity_id} <- Activity.get_create_by_object_ap_id(object_ap_id),
- {:ok, _} <- CommonAPI.delete(activity_id, user) do
- ModerationLog.insert_log(%{
- action: "chat_message_delete",
- actor: user,
- subject_id: message_id
- })
-
- conn
- |> put_view(MessageReferenceView)
- |> render("show.json", chat_message_reference: cm_ref)
- else
- _e ->
- {:error, :could_not_delete}
- end
- end
-
- def messages(conn, %{id: id} = params) do
- with %Chat{} = chat <- Chat.get_by_id(id) do
- cm_refs =
- chat
- |> MessageReference.for_chat_query()
- |> Pagination.fetch_paginated(params)
-
- conn
- |> put_view(MessageReferenceView)
- |> render("index.json", chat_message_references: cm_refs)
- else
- _ ->
- conn
- |> put_status(:not_found)
- |> json(%{error: "not found"})
- end
- end
-
- def show(conn, %{id: id}) do
- with %Chat{} = chat <- Chat.get_by_id(id) do
- conn
- |> put_view(AdminAPI.ChatView)
- |> render("show.json", chat: chat)
- end
- end
-end
diff --git a/lib/pleroma/web/admin_api/controllers/config_controller.ex b/lib/pleroma/web/admin_api/controllers/config_controller.ex
index a718d7b8d..831ba3b6f 100644
--- a/lib/pleroma/web/admin_api/controllers/config_controller.ex
+++ b/lib/pleroma/web/admin_api/controllers/config_controller.ex
@@ -22,10 +22,58 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ConfigOperation
+ defp translate_descriptions(descriptions, path \\ []) do
+ Enum.map(descriptions, fn desc -> translate_item(desc, path) end)
+ end
+
+ defp translate_string(str, path, type) do
+ Gettext.dpgettext(
+ Pleroma.Web.Gettext,
+ "config_descriptions",
+ Pleroma.Docs.Translator.Compiler.msgctxt_for(path, type),
+ str
+ )
+ end
+
+ defp maybe_put_translated(item, key, path) do
+ if item[key] do
+ Map.put(
+ item,
+ key,
+ translate_string(
+ item[key],
+ path ++ [Pleroma.Docs.Translator.Compiler.key_for(item)],
+ to_string(key)
+ )
+ )
+ else
+ item
+ end
+ end
+
+ defp translate_item(item, path) do
+ item
+ |> maybe_put_translated(:label, path)
+ |> maybe_put_translated(:description, path)
+ |> translate_children(path)
+ end
+
+ defp translate_children(%{children: children} = item, path) when is_list(children) do
+ item
+ |> Map.put(
+ :children,
+ translate_descriptions(children, path ++ [Pleroma.Docs.Translator.Compiler.key_for(item)])
+ )
+ end
+
+ defp translate_children(item, _path) do
+ item
+ end
+
def descriptions(conn, _params) do
descriptions = Enum.filter(Pleroma.Docs.JSON.compiled_descriptions(), &whitelisted_config?/1)
- json(conn, descriptions)
+ json(conn, translate_descriptions(descriptions))
end
def show(conn, %{only_db: true}) do
diff --git a/lib/pleroma/web/admin_api/views/announcement_view.ex b/lib/pleroma/web/admin_api/views/announcement_view.ex
new file mode 100644
index 000000000..a35bd60cf
--- /dev/null
+++ b/lib/pleroma/web/admin_api/views/announcement_view.ex
@@ -0,0 +1,15 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.AdminAPI.AnnouncementView do
+ use Pleroma.Web, :view
+
+ def render("index.json", %{announcements: announcements}) do
+ render_many(announcements, __MODULE__, "show.json")
+ end
+
+ def render("show.json", %{announcement: announcement}) do
+ Pleroma.Announcement.render_json(announcement, admin: true)
+ end
+end
diff --git a/lib/pleroma/web/admin_api/views/chat_view.ex b/lib/pleroma/web/admin_api/views/chat_view.ex
deleted file mode 100644
index 2a2015ad1..000000000
--- a/lib/pleroma/web/admin_api/views/chat_view.ex
+++ /dev/null
@@ -1,30 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.AdminAPI.ChatView do
- use Pleroma.Web, :view
-
- alias Pleroma.Chat
- alias Pleroma.User
- alias Pleroma.Web.MastodonAPI
- alias Pleroma.Web.PleromaAPI
-
- def render("index.json", %{chats: chats} = opts) do
- render_many(chats, __MODULE__, "show.json", Map.delete(opts, :chats))
- end
-
- def render("show.json", %{chat: %Chat{user_id: user_id}} = opts) do
- user = User.get_by_id(user_id)
- sender = MastodonAPI.AccountView.render("show.json", user: user, skip_visibility_check: true)
-
- serialized_chat = PleromaAPI.ChatView.render("show.json", opts)
-
- serialized_chat
- |> Map.put(:sender, sender)
- |> Map.put(:receiver, serialized_chat[:account])
- |> Map.delete(:account)
- end
-
- def render(view, opts), do: PleromaAPI.ChatView.render(view, opts)
-end
diff --git a/lib/pleroma/web/api_spec.ex b/lib/pleroma/web/api_spec.ex
index 528cd9cf4..8ac5c8b94 100644
--- a/lib/pleroma/web/api_spec.ex
+++ b/lib/pleroma/web/api_spec.ex
@@ -79,12 +79,11 @@ def spec(opts \\ []) do
"x-tagGroups": [
%{
"name" => "Accounts",
- "tags" => ["Account actions", "Retrieve account information", "Scrobbles"]
+ "tags" => ["Account actions", "Retrieve account information"]
},
%{
"name" => "Administration",
"tags" => [
- "Chat administration",
"Emoji pack administration",
"Frontend managment",
"Instance configuration",
@@ -114,7 +113,6 @@ def spec(opts \\ []) do
]
},
%{"name" => "Instance", "tags" => ["Custom emojis"]},
- %{"name" => "Messaging", "tags" => ["Chats", "Conversations"]},
%{
"name" => "Statuses",
"tags" => [
diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex
index bdbae9b74..b1f4932ee 100644
--- a/lib/pleroma/web/api_spec/operations/account_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/account_operation.ex
@@ -595,11 +595,6 @@ defp update_credentials_request do
nullable: true,
description: "Whether manual approval of follow requests is required."
},
- accepts_chat_messages: %Schema{
- allOf: [BooleanLike],
- nullable: true,
- description: "Whether the user accepts receiving chat messages."
- },
fields_attributes: %Schema{
nullable: true,
oneOf: [
diff --git a/lib/pleroma/web/api_spec/operations/admin/announcement_operation.ex b/lib/pleroma/web/api_spec/operations/admin/announcement_operation.ex
new file mode 100644
index 000000000..58a039e72
--- /dev/null
+++ b/lib/pleroma/web/api_spec/operations/admin/announcement_operation.ex
@@ -0,0 +1,165 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ApiSpec.Admin.AnnouncementOperation do
+ alias OpenApiSpex.Operation
+ alias OpenApiSpex.Schema
+ alias Pleroma.Web.ApiSpec.Schemas.Announcement
+ alias Pleroma.Web.ApiSpec.Schemas.ApiError
+
+ import Pleroma.Web.ApiSpec.Helpers
+
+ def open_api_operation(action) do
+ operation = String.to_existing_atom("#{action}_operation")
+ apply(__MODULE__, operation, [])
+ end
+
+ def index_operation do
+ %Operation{
+ tags: ["Announcement managment"],
+ summary: "Retrieve a list of announcements",
+ operationId: "AdminAPI.AnnouncementController.index",
+ security: [%{"oAuth" => ["admin:read"]}],
+ parameters: [
+ Operation.parameter(
+ :limit,
+ :query,
+ %Schema{type: :integer, minimum: 1},
+ "the maximum number of announcements to return"
+ ),
+ Operation.parameter(
+ :offset,
+ :query,
+ %Schema{type: :integer, minimum: 0},
+ "the offset of the first announcement to return"
+ )
+ | admin_api_params()
+ ],
+ responses: %{
+ 200 => Operation.response("Response", "application/json", list_of_announcements()),
+ 400 => Operation.response("Forbidden", "application/json", ApiError),
+ 403 => Operation.response("Forbidden", "application/json", ApiError)
+ }
+ }
+ end
+
+ def show_operation do
+ %Operation{
+ tags: ["Announcement managment"],
+ summary: "Display one announcement",
+ operationId: "AdminAPI.AnnouncementController.show",
+ security: [%{"oAuth" => ["admin:read"]}],
+ parameters: [
+ Operation.parameter(
+ :id,
+ :path,
+ :string,
+ "announcement id"
+ )
+ | admin_api_params()
+ ],
+ responses: %{
+ 200 => Operation.response("Response", "application/json", Announcement),
+ 403 => Operation.response("Forbidden", "application/json", ApiError),
+ 404 => Operation.response("Not Found", "application/json", ApiError)
+ }
+ }
+ end
+
+ def delete_operation do
+ %Operation{
+ tags: ["Announcement managment"],
+ summary: "Delete one announcement",
+ operationId: "AdminAPI.AnnouncementController.delete",
+ security: [%{"oAuth" => ["admin:write"]}],
+ parameters: [
+ Operation.parameter(
+ :id,
+ :path,
+ :string,
+ "announcement id"
+ )
+ | admin_api_params()
+ ],
+ responses: %{
+ 200 => Operation.response("Response", "application/json", %Schema{type: :object}),
+ 403 => Operation.response("Forbidden", "application/json", ApiError),
+ 404 => Operation.response("Not Found", "application/json", ApiError)
+ }
+ }
+ end
+
+ def create_operation do
+ %Operation{
+ tags: ["Announcement managment"],
+ summary: "Create one announcement",
+ operationId: "AdminAPI.AnnouncementController.create",
+ security: [%{"oAuth" => ["admin:write"]}],
+ requestBody: request_body("Parameters", create_request(), required: true),
+ responses: %{
+ 200 => Operation.response("Response", "application/json", Announcement),
+ 400 => Operation.response("Bad Request", "application/json", ApiError),
+ 403 => Operation.response("Forbidden", "application/json", ApiError)
+ }
+ }
+ end
+
+ def change_operation do
+ %Operation{
+ tags: ["Announcement managment"],
+ summary: "Change one announcement",
+ operationId: "AdminAPI.AnnouncementController.change",
+ security: [%{"oAuth" => ["admin:write"]}],
+ parameters: [
+ Operation.parameter(
+ :id,
+ :path,
+ :string,
+ "announcement id"
+ )
+ | admin_api_params()
+ ],
+ requestBody: request_body("Parameters", change_request(), required: true),
+ responses: %{
+ 200 => Operation.response("Response", "application/json", Announcement),
+ 400 => Operation.response("Bad Request", "application/json", ApiError),
+ 403 => Operation.response("Forbidden", "application/json", ApiError),
+ 404 => Operation.response("Not Found", "application/json", ApiError)
+ }
+ }
+ end
+
+ defp create_or_change_props do
+ %{
+ content: %Schema{type: :string},
+ starts_at: %Schema{type: :string, format: "date-time", nullable: true},
+ ends_at: %Schema{type: :string, format: "date-time", nullable: true},
+ all_day: %Schema{type: :boolean}
+ }
+ end
+
+ def create_request do
+ %Schema{
+ title: "AnnouncementCreateRequest",
+ type: :object,
+ required: [:content],
+ properties: create_or_change_props()
+ }
+ end
+
+ def change_request do
+ %Schema{
+ title: "AnnouncementChangeRequest",
+ type: :object,
+ properties: create_or_change_props()
+ }
+ end
+
+ def list_of_announcements do
+ %Schema{
+ type: :array,
+ items: Announcement
+ }
+ end
+end
diff --git a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex
deleted file mode 100644
index 57906445e..000000000
--- a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex
+++ /dev/null
@@ -1,96 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do
- alias OpenApiSpex.Operation
- alias Pleroma.Web.ApiSpec.Schemas.Chat
- alias Pleroma.Web.ApiSpec.Schemas.ChatMessage
-
- import Pleroma.Web.ApiSpec.Helpers
-
- def open_api_operation(action) do
- operation = String.to_existing_atom("#{action}_operation")
- apply(__MODULE__, operation, [])
- end
-
- def delete_message_operation do
- %Operation{
- tags: ["Chat administration"],
- summary: "Delete an individual chat message",
- operationId: "AdminAPI.ChatController.delete_message",
- parameters: [
- Operation.parameter(:id, :path, :string, "The ID of the Chat"),
- Operation.parameter(:message_id, :path, :string, "The ID of the message")
- ],
- responses: %{
- 200 =>
- Operation.response(
- "The deleted ChatMessage",
- "application/json",
- ChatMessage
- )
- },
- security: [
- %{
- "oAuth" => ["admin:write:chats"]
- }
- ]
- }
- end
-
- def messages_operation do
- %Operation{
- tags: ["Chat administration"],
- summary: "Get chat's messages",
- operationId: "AdminAPI.ChatController.messages",
- parameters:
- [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++
- pagination_params(),
- responses: %{
- 200 =>
- Operation.response(
- "The messages in the chat",
- "application/json",
- Pleroma.Web.ApiSpec.ChatOperation.chat_messages_response()
- )
- },
- security: [
- %{
- "oAuth" => ["admin:read:chats"]
- }
- ]
- }
- end
-
- def show_operation do
- %Operation{
- tags: ["Chat administration"],
- summary: "Create a chat",
- operationId: "AdminAPI.ChatController.show",
- parameters: [
- Operation.parameter(
- :id,
- :path,
- :string,
- "The id of the chat",
- required: true,
- example: "1234"
- )
- ],
- responses: %{
- 200 =>
- Operation.response(
- "The existing chat",
- "application/json",
- Chat
- )
- },
- security: [
- %{
- "oAuth" => ["admin:read"]
- }
- ]
- }
- end
-end
diff --git a/lib/pleroma/web/api_spec/operations/announcement_operation.ex b/lib/pleroma/web/api_spec/operations/announcement_operation.ex
new file mode 100644
index 000000000..71be0002a
--- /dev/null
+++ b/lib/pleroma/web/api_spec/operations/announcement_operation.ex
@@ -0,0 +1,57 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ApiSpec.AnnouncementOperation do
+ alias OpenApiSpex.Operation
+ alias OpenApiSpex.Schema
+ alias Pleroma.Web.ApiSpec.Schemas.Announcement
+ alias Pleroma.Web.ApiSpec.Schemas.ApiError
+
+ def open_api_operation(action) do
+ operation = String.to_existing_atom("#{action}_operation")
+ apply(__MODULE__, operation, [])
+ end
+
+ def index_operation do
+ %Operation{
+ tags: ["Announcement"],
+ summary: "Retrieve a list of announcements",
+ operationId: "MastodonAPI.AnnouncementController.index",
+ security: [%{"oAuth" => []}],
+ responses: %{
+ 200 => Operation.response("Response", "application/json", list_of_announcements()),
+ 403 => Operation.response("Forbidden", "application/json", ApiError)
+ }
+ }
+ end
+
+ def mark_read_operation do
+ %Operation{
+ tags: ["Announcement"],
+ summary: "Mark one announcement as read",
+ operationId: "MastodonAPI.AnnouncementController.mark_read",
+ security: [%{"oAuth" => ["write:accounts"]}],
+ parameters: [
+ Operation.parameter(
+ :id,
+ :path,
+ :string,
+ "announcement id"
+ )
+ ],
+ responses: %{
+ 200 => Operation.response("Response", "application/json", %Schema{type: :object}),
+ 403 => Operation.response("Forbidden", "application/json", ApiError),
+ 404 => Operation.response("Not Found", "application/json", ApiError)
+ }
+ }
+ end
+
+ def list_of_announcements do
+ %Schema{
+ type: :array,
+ items: Announcement
+ }
+ end
+end
diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex
deleted file mode 100644
index 23cb66392..000000000
--- a/lib/pleroma/web/api_spec/operations/chat_operation.ex
+++ /dev/null
@@ -1,383 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.ChatOperation do
- alias OpenApiSpex.Operation
- alias OpenApiSpex.Schema
- alias Pleroma.Web.ApiSpec.Schemas.ApiError
- alias Pleroma.Web.ApiSpec.Schemas.BooleanLike
- alias Pleroma.Web.ApiSpec.Schemas.Chat
- alias Pleroma.Web.ApiSpec.Schemas.ChatMessage
-
- import Pleroma.Web.ApiSpec.Helpers
-
- @spec open_api_operation(atom) :: Operation.t()
- def open_api_operation(action) do
- operation = String.to_existing_atom("#{action}_operation")
- apply(__MODULE__, operation, [])
- end
-
- def mark_as_read_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Mark all messages in the chat as read",
- operationId: "ChatController.mark_as_read",
- parameters: [Operation.parameter(:id, :path, :string, "The ID of the Chat")],
- requestBody: request_body("Parameters", mark_as_read()),
- responses: %{
- 200 =>
- Operation.response(
- "The updated chat",
- "application/json",
- Chat
- )
- },
- security: [
- %{
- "oAuth" => ["write:chats"]
- }
- ]
- }
- end
-
- def mark_message_as_read_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Mark a message as read",
- operationId: "ChatController.mark_message_as_read",
- parameters: [
- Operation.parameter(:id, :path, :string, "The ID of the Chat"),
- Operation.parameter(:message_id, :path, :string, "The ID of the message")
- ],
- responses: %{
- 200 =>
- Operation.response(
- "The read ChatMessage",
- "application/json",
- ChatMessage
- )
- },
- security: [
- %{
- "oAuth" => ["write:chats"]
- }
- ]
- }
- end
-
- def show_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Retrieve a chat",
- operationId: "ChatController.show",
- parameters: [
- Operation.parameter(
- :id,
- :path,
- :string,
- "The id of the chat",
- required: true,
- example: "1234"
- )
- ],
- responses: %{
- 200 =>
- Operation.response(
- "The existing chat",
- "application/json",
- Chat
- )
- },
- security: [
- %{
- "oAuth" => ["read"]
- }
- ]
- }
- end
-
- def create_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Create a chat",
- operationId: "ChatController.create",
- parameters: [
- Operation.parameter(
- :id,
- :path,
- :string,
- "The account id of the recipient of this chat",
- required: true,
- example: "someflakeid"
- )
- ],
- responses: %{
- 200 =>
- Operation.response(
- "The created or existing chat",
- "application/json",
- Chat
- )
- },
- security: [
- %{
- "oAuth" => ["write:chats"]
- }
- ]
- }
- end
-
- def index_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Retrieve list of chats (unpaginated)",
- deprecated: true,
- description:
- "Deprecated due to no support for pagination. Using [/api/v2/pleroma/chats](#operation/ChatController.index2) instead is recommended.",
- operationId: "ChatController.index",
- parameters: [
- Operation.parameter(:with_muted, :query, BooleanLike, "Include chats from muted users")
- ],
- responses: %{
- 200 => Operation.response("The chats of the user", "application/json", chats_response())
- },
- security: [
- %{
- "oAuth" => ["read:chats"]
- }
- ]
- }
- end
-
- def index2_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Retrieve list of chats",
- operationId: "ChatController.index2",
- parameters: [
- Operation.parameter(:with_muted, :query, BooleanLike, "Include chats from muted users")
- | pagination_params()
- ],
- responses: %{
- 200 => Operation.response("The chats of the user", "application/json", chats_response())
- },
- security: [
- %{
- "oAuth" => ["read:chats"]
- }
- ]
- }
- end
-
- def messages_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Retrieve chat's messages",
- operationId: "ChatController.messages",
- parameters:
- [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++
- pagination_params(),
- responses: %{
- 200 =>
- Operation.response(
- "The messages in the chat",
- "application/json",
- chat_messages_response()
- ),
- 404 => Operation.response("Not Found", "application/json", ApiError)
- },
- security: [
- %{
- "oAuth" => ["read:chats"]
- }
- ]
- }
- end
-
- def post_chat_message_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Post a message to the chat",
- operationId: "ChatController.post_chat_message",
- parameters: [
- Operation.parameter(:id, :path, :string, "The ID of the Chat")
- ],
- requestBody: request_body("Parameters", chat_message_create()),
- responses: %{
- 200 =>
- Operation.response(
- "The newly created ChatMessage",
- "application/json",
- ChatMessage
- ),
- 400 => Operation.response("Bad Request", "application/json", ApiError),
- 422 => Operation.response("MRF Rejection", "application/json", ApiError)
- },
- security: [
- %{
- "oAuth" => ["write:chats"]
- }
- ]
- }
- end
-
- def delete_message_operation do
- %Operation{
- tags: ["Chats"],
- summary: "Delete message",
- operationId: "ChatController.delete_message",
- parameters: [
- Operation.parameter(:id, :path, :string, "The ID of the Chat"),
- Operation.parameter(:message_id, :path, :string, "The ID of the message")
- ],
- responses: %{
- 200 =>
- Operation.response(
- "The deleted ChatMessage",
- "application/json",
- ChatMessage
- )
- },
- security: [
- %{
- "oAuth" => ["write:chats"]
- }
- ]
- }
- end
-
- def chats_response do
- %Schema{
- title: "ChatsResponse",
- description: "Response schema for multiple Chats",
- type: :array,
- items: Chat,
- example: [
- %{
- "account" => %{
- "pleroma" => %{
- "is_admin" => false,
- "is_confirmed" => true,
- "hide_followers_count" => false,
- "is_moderator" => false,
- "hide_favorites" => true,
- "ap_id" => "https://dontbulling.me/users/lain",
- "hide_follows_count" => false,
- "hide_follows" => false,
- "background_image" => nil,
- "skip_thread_containment" => false,
- "hide_followers" => false,
- "relationship" => %{},
- "tags" => []
- },
- "avatar" =>
- "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
- "following_count" => 0,
- "header_static" => "https://originalpatchou.li/images/banner.png",
- "source" => %{
- "sensitive" => false,
- "note" => "lain",
- "pleroma" => %{
- "discoverable" => false,
- "actor_type" => "Person"
- },
- "fields" => []
- },
- "statuses_count" => 1,
- "locked" => false,
- "created_at" => "2020-04-16T13:40:15.000Z",
- "display_name" => "lain",
- "fields" => [],
- "acct" => "lain@dontbulling.me",
- "id" => "9u6Qw6TAZANpqokMkK",
- "emojis" => [],
- "avatar_static" =>
- "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
- "username" => "lain",
- "followers_count" => 0,
- "header" => "https://originalpatchou.li/images/banner.png",
- "bot" => false,
- "note" => "lain",
- "url" => "https://dontbulling.me/users/lain"
- },
- "id" => "1",
- "unread" => 2
- }
- ]
- }
- end
-
- def chat_messages_response do
- %Schema{
- title: "ChatMessagesResponse",
- description: "Response schema for multiple ChatMessages",
- type: :array,
- items: ChatMessage,
- example: [
- %{
- "emojis" => [
- %{
- "static_url" => "https://dontbulling.me/emoji/Firefox.gif",
- "visible_in_picker" => false,
- "shortcode" => "firefox",
- "url" => "https://dontbulling.me/emoji/Firefox.gif"
- }
- ],
- "created_at" => "2020-04-21T15:11:46.000Z",
- "content" => "Check this out :firefox:",
- "id" => "13",
- "chat_id" => "1",
- "account_id" => "someflakeid",
- "unread" => false
- },
- %{
- "account_id" => "someflakeid",
- "content" => "Whats' up?",
- "id" => "12",
- "chat_id" => "1",
- "emojis" => [],
- "created_at" => "2020-04-21T15:06:45.000Z",
- "unread" => false
- }
- ]
- }
- end
-
- def chat_message_create do
- %Schema{
- title: "ChatMessageCreateRequest",
- description: "POST body for creating an chat message",
- type: :object,
- properties: %{
- content: %Schema{
- type: :string,
- description: "The content of your message. Optional if media_id is present"
- },
- media_id: %Schema{type: :string, description: "The id of an upload"}
- },
- example: %{
- "content" => "Hey wanna buy feet pics?",
- "media_id" => "134234"
- }
- }
- end
-
- def mark_as_read do
- %Schema{
- title: "MarkAsReadRequest",
- description: "POST body for marking a number of chat messages as read",
- type: :object,
- required: [:last_read_id],
- properties: %{
- last_read_id: %Schema{
- type: :string,
- description: "The content of your message."
- }
- },
- example: %{
- "last_read_id" => "abcdef12456"
- }
- }
- end
-end
diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex
index e4ce42f1c..b4a20e5e5 100644
--- a/lib/pleroma/web/api_spec/operations/notification_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex
@@ -108,24 +108,6 @@ def dismiss_operation do
}
end
- def dismiss_via_body_operation do
- %Operation{
- tags: ["Notifications"],
- summary: "Dismiss a single notification",
- deprecated: true,
- description: "Clear a single notification from the server.",
- operationId: "NotificationController.dismiss_via_body",
- requestBody:
- request_body(
- "Parameters",
- %Schema{type: :object, properties: %{id: %Schema{type: :string}}},
- required: true
- ),
- security: [%{"oAuth" => ["write:notifications"]}],
- responses: %{200 => empty_object_response()}
- }
- end
-
def destroy_multiple_operation do
%Operation{
tags: ["Notifications"],
@@ -192,7 +174,6 @@ defp notification_type do
"reblog",
"mention",
"pleroma:emoji_reaction",
- "pleroma:chat_mention",
"pleroma:report",
"move",
"follow_request",
@@ -208,7 +189,6 @@ defp notification_type do
- `poll` - A poll you have voted in or created has ended
- `move` - Someone moved their account
- `pleroma:emoji_reaction` - Someone reacted with emoji to your status
- - `pleroma:chat_mention` - Someone mentioned you in a chat message
- `pleroma:report` - Someone was reported
"""
}
diff --git a/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex
deleted file mode 100644
index 6a909fc85..000000000
--- a/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex
+++ /dev/null
@@ -1,102 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.PleromaScrobbleOperation do
- alias OpenApiSpex.Operation
- alias OpenApiSpex.Reference
- alias OpenApiSpex.Schema
- alias Pleroma.Web.ApiSpec.Schemas.Account
- alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope
-
- import Pleroma.Web.ApiSpec.Helpers
-
- def open_api_operation(action) do
- operation = String.to_existing_atom("#{action}_operation")
- apply(__MODULE__, operation, [])
- end
-
- def create_operation do
- %Operation{
- tags: ["Scrobbles"],
- summary: "Creates a new Listen activity for an account",
- security: [%{"oAuth" => ["write"]}],
- operationId: "PleromaAPI.ScrobbleController.create",
- requestBody: request_body("Parameters", create_request(), requried: true),
- responses: %{
- 200 => Operation.response("Scrobble", "application/json", scrobble())
- }
- }
- end
-
- def index_operation do
- %Operation{
- tags: ["Scrobbles"],
- summary: "Requests a list of current and recent Listen activities for an account",
- operationId: "PleromaAPI.ScrobbleController.index",
- parameters: [
- %Reference{"$ref": "#/components/parameters/accountIdOrNickname"} | pagination_params()
- ],
- security: [%{"oAuth" => ["read"]}],
- responses: %{
- 200 =>
- Operation.response("Array of Scrobble", "application/json", %Schema{
- type: :array,
- items: scrobble()
- })
- }
- }
- end
-
- defp create_request do
- %Schema{
- type: :object,
- required: [:title],
- properties: %{
- title: %Schema{type: :string, description: "The title of the media playing"},
- album: %Schema{type: :string, description: "The album of the media playing"},
- artist: %Schema{type: :string, description: "The artist of the media playing"},
- length: %Schema{type: :integer, description: "The length of the media playing"},
- visibility: %Schema{
- allOf: [VisibilityScope],
- default: "public",
- description: "Scrobble visibility"
- }
- },
- example: %{
- "title" => "Some Title",
- "artist" => "Some Artist",
- "album" => "Some Album",
- "length" => 180_000
- }
- }
- end
-
- defp scrobble do
- %Schema{
- type: :object,
- properties: %{
- id: %Schema{type: :string},
- account: Account,
- title: %Schema{type: :string, description: "The title of the media playing"},
- album: %Schema{type: :string, description: "The album of the media playing"},
- artist: %Schema{type: :string, description: "The artist of the media playing"},
- length: %Schema{
- type: :integer,
- description: "The length of the media playing",
- nullable: true
- },
- created_at: %Schema{type: :string, format: :"date-time"}
- },
- example: %{
- "id" => "1234",
- "account" => Account.schema().example,
- "title" => "Some Title",
- "artist" => "Some Artist",
- "album" => "Some Album",
- "length" => 180_000,
- "created_at" => "2019-09-28T12:40:45.000Z"
- }
- }
- end
-end
diff --git a/lib/pleroma/web/api_spec/operations/search_operation.ex b/lib/pleroma/web/api_spec/operations/search_operation.ex
index ff4fd0027..f90c54853 100644
--- a/lib/pleroma/web/api_spec/operations/search_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/search_operation.ex
@@ -59,53 +59,6 @@ def account_search_operation do
}
end
- def search_operation do
- %Operation{
- tags: ["Search"],
- summary: "Search results",
- security: [%{"oAuth" => ["read:search"]}],
- operationId: "SearchController.search",
- deprecated: true,
- parameters: [
- Operation.parameter(
- :account_id,
- :query,
- FlakeID,
- "If provided, statuses returned will be authored only by this account"
- ),
- Operation.parameter(
- :type,
- :query,
- %Schema{type: :string, enum: ["accounts", "hashtags", "statuses"]},
- "Search type"
- ),
- Operation.parameter(:q, :query, %Schema{type: :string}, "The search query", required: true),
- Operation.parameter(
- :resolve,
- :query,
- %Schema{allOf: [BooleanLike], default: false},
- "Attempt WebFinger lookup"
- ),
- Operation.parameter(
- :following,
- :query,
- %Schema{allOf: [BooleanLike], default: false},
- "Only include accounts that the user is following"
- ),
- Operation.parameter(
- :offset,
- :query,
- %Schema{type: :integer},
- "Offset"
- ),
- with_relationships_param() | pagination_params()
- ],
- responses: %{
- 200 => Operation.response("Results", "application/json", results())
- }
- }
- end
-
def search2_operation do
%Operation{
tags: ["Search"],
@@ -176,33 +129,4 @@ defp results2 do
}
}
end
-
- defp results do
- %Schema{
- title: "SearchResults",
- type: :object,
- properties: %{
- accounts: %Schema{
- type: :array,
- items: Account,
- description: "Accounts which match the given query"
- },
- statuses: %Schema{
- type: :array,
- items: Status,
- description: "Statuses which match the given query"
- },
- hashtags: %Schema{
- type: :array,
- items: %Schema{type: :string},
- description: "Hashtags which match the given query"
- }
- },
- example: %{
- "accounts" => [Account.schema().example],
- "statuses" => [Status.schema().example],
- "hashtags" => ["cofe"]
- }
- }
- end
end
diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex
index 802fbef3e..a5da8b58e 100644
--- a/lib/pleroma/web/api_spec/operations/status_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/status_operation.ex
@@ -323,34 +323,6 @@ def unmute_conversation_operation do
}
end
- def card_operation do
- %Operation{
- tags: ["Retrieve status information"],
- deprecated: true,
- summary: "Preview card",
- description: "Deprecated in favor of card property inlined on Status entity",
- operationId: "StatusController.card",
- parameters: [id_param()],
- security: [%{"oAuth" => ["read:statuses"]}],
- responses: %{
- 200 =>
- Operation.response("Card", "application/json", %Schema{
- type: :object,
- nullable: true,
- properties: %{
- type: %Schema{type: :string, enum: ["link", "photo", "video", "rich"]},
- provider_name: %Schema{type: :string, nullable: true},
- provider_url: %Schema{type: :string, format: :uri},
- url: %Schema{type: :string, format: :uri},
- image: %Schema{type: :string, nullable: true, format: :uri},
- title: %Schema{type: :string},
- description: %Schema{type: :string}
- }
- })
- }
- }
- end
-
def favourited_by_operation do
%Operation{
tags: ["Retrieve status information"],
@@ -524,6 +496,11 @@ defp create_request do
type: :string,
description:
"Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`."
+ },
+ quote_id: %Schema{
+ nullable: true,
+ type: :string,
+ description: "Will quote a given status."
}
},
example: %{
diff --git a/lib/pleroma/web/api_spec/operations/subscription_operation.ex b/lib/pleroma/web/api_spec/operations/subscription_operation.ex
index 60a7fb3b0..a0cf76c32 100644
--- a/lib/pleroma/web/api_spec/operations/subscription_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/subscription_operation.ex
@@ -142,11 +142,6 @@ defp create_request do
nullable: true,
description: "Receive poll notifications?"
},
- "pleroma:chat_mention": %Schema{
- allOf: [BooleanLike],
- nullable: true,
- description: "Receive chat notifications?"
- },
"pleroma:emoji_reaction": %Schema{
allOf: [BooleanLike],
nullable: true,
@@ -216,11 +211,6 @@ defp update_request do
nullable: true,
description: "Receive poll notifications?"
},
- "pleroma:chat_mention": %Schema{
- allOf: [BooleanLike],
- nullable: true,
- description: "Receive chat notifications?"
- },
"pleroma:emoji_reaction": %Schema{
allOf: [BooleanLike],
nullable: true,
diff --git a/lib/pleroma/web/api_spec/operations/timeline_operation.ex b/lib/pleroma/web/api_spec/operations/timeline_operation.ex
index 24d792916..3eb6f700b 100644
--- a/lib/pleroma/web/api_spec/operations/timeline_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/timeline_operation.ex
@@ -43,7 +43,7 @@ def direct_operation do
tags: ["Timelines"],
summary: "Direct timeline",
description:
- "View statuses with a “direct” scope addressed to the account. Using this endpoint is discouraged, please use [conversations](#tag/Conversations) or [chats](#tag/Chats).",
+ "View statuses with a “direct” scope addressed to the account. Using this endpoint is discouraged, please use [conversations](#tag/Conversations).",
parameters: [with_muted_param() | pagination_params()],
security: [%{"oAuth" => ["read:statuses"]}],
operationId: "TimelineController.direct",
@@ -75,6 +75,26 @@ def public_operation do
}
end
+ def bubble_operation do
+ %Operation{
+ tags: ["Timelines"],
+ summary: "Bubble timeline",
+ security: [%{"oAuth" => ["read:statuses"]}],
+ parameters: [
+ only_media_param(),
+ remote_param(),
+ with_muted_param(),
+ exclude_visibilities_param(),
+ reply_visibility_param() | pagination_params()
+ ],
+ operationId: "TimelineController.bubble",
+ responses: %{
+ 200 => Operation.response("Array of Status", "application/json", array_of_statuses()),
+ 401 => Operation.response("Error", "application/json", ApiError)
+ }
+ }
+ end
+
def hashtag_operation do
%Operation{
tags: ["Timelines"],
diff --git a/lib/pleroma/web/api_spec/schemas/account.ex b/lib/pleroma/web/api_spec/schemas/account.ex
index 548e70544..5d3ac9cd0 100644
--- a/lib/pleroma/web/api_spec/schemas/account.ex
+++ b/lib/pleroma/web/api_spec/schemas/account.ex
@@ -47,7 +47,6 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
description: "whether the user allows automatically follow moved following accounts"
},
background_image: %Schema{type: :string, nullable: true, format: :uri},
- chat_token: %Schema{type: :string},
is_confirmed: %Schema{
type: :boolean,
description:
@@ -102,7 +101,6 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
description:
"A generic map of settings for frontends. Opaque to the backend. Only returned in `verify_credentials` and `update_credentials`"
},
- accepts_chat_messages: %Schema{type: :boolean, nullable: true},
favicon: %Schema{
type: :string,
format: :uri,
@@ -175,9 +173,6 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
"is_admin" => false,
"is_moderator" => false,
"skip_thread_containment" => false,
- "accepts_chat_messages" => true,
- "chat_token" =>
- "SFMyNTY.g3QAAAACZAAEZGF0YW0AAAASOXRLaTNlc2JHN09RZ1oyOTIwZAAGc2lnbmVkbgYARNplS3EB.Mb_Iaqew2bN1I1o79B_iP7encmVCpTKC4OtHZRxdjKc",
"unread_conversation_count" => 0,
"tags" => [],
"notification_settings" => %{
diff --git a/lib/pleroma/web/api_spec/schemas/announcement.ex b/lib/pleroma/web/api_spec/schemas/announcement.ex
new file mode 100644
index 000000000..67d129ef6
--- /dev/null
+++ b/lib/pleroma/web/api_spec/schemas/announcement.ex
@@ -0,0 +1,45 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ApiSpec.Schemas.Announcement do
+ alias OpenApiSpex.Schema
+ alias Pleroma.Web.ApiSpec.Schemas.FlakeID
+
+ require OpenApiSpex
+
+ OpenApiSpex.schema(%{
+ title: "Announcement",
+ description: "Response schema for an announcement",
+ type: :object,
+ properties: %{
+ id: FlakeID,
+ content: %Schema{type: :string},
+ starts_at: %Schema{
+ type: :string,
+ format: "date-time",
+ nullable: true
+ },
+ ends_at: %Schema{
+ type: :string,
+ format: "date-time",
+ nullable: true
+ },
+ all_day: %Schema{type: :boolean},
+ published_at: %Schema{type: :string, format: "date-time"},
+ updated_at: %Schema{type: :string, format: "date-time"},
+ read: %Schema{type: :boolean},
+ mentions: %Schema{type: :array},
+ statuses: %Schema{type: :array},
+ tags: %Schema{type: :array},
+ emojis: %Schema{type: :array},
+ reactions: %Schema{type: :array},
+ pleroma: %Schema{
+ type: :object,
+ properties: %{
+ raw_content: %Schema{type: :string}
+ }
+ }
+ }
+ })
+end
diff --git a/lib/pleroma/web/api_spec/schemas/chat.ex b/lib/pleroma/web/api_spec/schemas/chat.ex
deleted file mode 100644
index 4afed910d..000000000
--- a/lib/pleroma/web/api_spec/schemas/chat.ex
+++ /dev/null
@@ -1,75 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.Schemas.Chat do
- alias OpenApiSpex.Schema
- alias Pleroma.Web.ApiSpec.Schemas.ChatMessage
-
- require OpenApiSpex
-
- OpenApiSpex.schema(%{
- title: "Chat",
- description: "Response schema for a Chat",
- type: :object,
- properties: %{
- id: %Schema{type: :string},
- account: %Schema{type: :object},
- unread: %Schema{type: :integer},
- last_message: ChatMessage,
- updated_at: %Schema{type: :string, format: :"date-time"}
- },
- example: %{
- "account" => %{
- "pleroma" => %{
- "is_admin" => false,
- "is_confirmed" => true,
- "hide_followers_count" => false,
- "is_moderator" => false,
- "hide_favorites" => true,
- "ap_id" => "https://dontbulling.me/users/lain",
- "hide_follows_count" => false,
- "hide_follows" => false,
- "background_image" => nil,
- "skip_thread_containment" => false,
- "hide_followers" => false,
- "relationship" => %{},
- "tags" => []
- },
- "avatar" =>
- "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
- "following_count" => 0,
- "header_static" => "https://originalpatchou.li/images/banner.png",
- "source" => %{
- "sensitive" => false,
- "note" => "lain",
- "pleroma" => %{
- "discoverable" => false,
- "actor_type" => "Person"
- },
- "fields" => []
- },
- "statuses_count" => 1,
- "is_locked" => false,
- "created_at" => "2020-04-16T13:40:15.000Z",
- "display_name" => "lain",
- "fields" => [],
- "acct" => "lain@dontbulling.me",
- "id" => "9u6Qw6TAZANpqokMkK",
- "emojis" => [],
- "avatar_static" =>
- "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
- "username" => "lain",
- "followers_count" => 0,
- "header" => "https://originalpatchou.li/images/banner.png",
- "bot" => false,
- "note" => "lain",
- "url" => "https://dontbulling.me/users/lain"
- },
- "id" => "1",
- "unread" => 2,
- "last_message" => ChatMessage.schema().example(),
- "updated_at" => "2020-04-21T15:06:45.000Z"
- }
- })
-end
diff --git a/lib/pleroma/web/api_spec/schemas/chat_message.ex b/lib/pleroma/web/api_spec/schemas/chat_message.ex
deleted file mode 100644
index 348fe95f8..000000000
--- a/lib/pleroma/web/api_spec/schemas/chat_message.ex
+++ /dev/null
@@ -1,77 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do
- alias OpenApiSpex.Schema
- alias Pleroma.Web.ApiSpec.Schemas.Emoji
-
- require OpenApiSpex
-
- OpenApiSpex.schema(%{
- title: "ChatMessage",
- description: "Response schema for a ChatMessage",
- nullable: true,
- type: :object,
- properties: %{
- id: %Schema{type: :string},
- account_id: %Schema{type: :string, description: "The Mastodon API id of the actor"},
- chat_id: %Schema{type: :string},
- content: %Schema{type: :string, nullable: true},
- created_at: %Schema{type: :string, format: :"date-time"},
- emojis: %Schema{type: :array, items: Emoji},
- attachment: %Schema{type: :object, nullable: true},
- card: %Schema{
- type: :object,
- nullable: true,
- description: "Preview card for links included within status content",
- required: [:url, :title, :description, :type],
- properties: %{
- type: %Schema{
- type: :string,
- enum: ["link", "photo", "video", "rich"],
- description: "The type of the preview card"
- },
- provider_name: %Schema{
- type: :string,
- nullable: true,
- description: "The provider of the original resource"
- },
- provider_url: %Schema{
- type: :string,
- format: :uri,
- description: "A link to the provider of the original resource"
- },
- url: %Schema{type: :string, format: :uri, description: "Location of linked resource"},
- image: %Schema{
- type: :string,
- nullable: true,
- format: :uri,
- description: "Preview thumbnail"
- },
- title: %Schema{type: :string, description: "Title of linked resource"},
- description: %Schema{type: :string, description: "Description of preview"}
- }
- },
- unread: %Schema{type: :boolean, description: "Whether a message has been marked as read."}
- },
- example: %{
- "account_id" => "someflakeid",
- "chat_id" => "1",
- "content" => "hey you again",
- "created_at" => "2020-04-21T15:06:45.000Z",
- "card" => nil,
- "emojis" => [
- %{
- "static_url" => "https://dontbulling.me/emoji/Firefox.gif",
- "visible_in_picker" => false,
- "shortcode" => "firefox",
- "url" => "https://dontbulling.me/emoji/Firefox.gif"
- }
- ],
- "id" => "14",
- "attachment" => nil,
- "unread" => false
- }
- })
-end
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index 3caab0f00..c5d9119ef 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -133,6 +133,16 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
type: :boolean,
description: "Have you pinned this status? Only appears if the status is pinnable."
},
+ quote_id: %Schema{
+ type: :string,
+ description: "ID of the status being quoted",
+ nullable: true
+ },
+ quote: %Schema{
+ allOf: [%OpenApiSpex.Reference{"$ref": "#/components/schemas/Status"}],
+ nullable: true,
+ description: "Quoted status (if any)"
+ },
pleroma: %Schema{
type: :object,
properties: %{
@@ -142,9 +152,15 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
description:
"A map consisting of alternate representations of the `content` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`"
},
+ context: %Schema{
+ type: :string,
+ description: "The thread identifier the status is associated with"
+ },
conversation_id: %Schema{
type: :integer,
- description: "The ID of the AP context the status is associated with (if any)"
+ deprecated: true,
+ description:
+ "The ID of the AP context the status is associated with (if any); deprecated, please use `context` instead"
},
direct_conversation_id: %Schema{
type: :integer,
@@ -204,6 +220,33 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
}
}
},
+ akkoma: %Schema{
+ type: :object,
+ properties: %{
+ source: %Schema{
+ nullable: true,
+ oneOf: [
+ %Schema{type: :string, example: 'plaintext content'},
+ %Schema{
+ type: :object,
+ properties: %{
+ content: %Schema{
+ type: :string,
+ description: "The source content of the status",
+ nullable: true
+ },
+ mediaType: %Schema{
+ type: :string,
+ description: "The source MIME type of the status",
+ example: "text/plain",
+ nullable: true
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
poll: %Schema{allOf: [Poll], nullable: true, description: "The poll attached to the status"},
reblog: %Schema{
allOf: [%OpenApiSpex.Reference{"$ref": "#/components/schemas/Status"}],
@@ -319,6 +362,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
"pinned" => false,
"pleroma" => %{
"content" => %{"text/plain" => "foobar"},
+ "context" => "http://localhost:4001/objects/8b4c0c80-6a37-4d2a-b1b9-05a19e3875aa",
"conversation_id" => 345_972,
"direct_conversation_id" => nil,
"emoji_reactions" => [],
diff --git a/lib/pleroma/web/auth/wrapper_authenticator.ex b/lib/pleroma/web/auth/wrapper_authenticator.ex
index c67082f7b..b8450872b 100644
--- a/lib/pleroma/web/auth/wrapper_authenticator.ex
+++ b/lib/pleroma/web/auth/wrapper_authenticator.ex
@@ -30,7 +30,7 @@ def handle_error(plug, error),
def auth_template do
# Note: `config :pleroma, :auth_template, "..."` support is deprecated
implementation().auth_template() ||
- Pleroma.Config.get([:auth, :auth_template], Pleroma.Config.get(:auth_template)) ||
+ Pleroma.Config.get(:auth_template) ||
"show.html"
end
diff --git a/lib/pleroma/web/channels/user_socket.ex b/lib/pleroma/web/channels/user_socket.ex
deleted file mode 100644
index 043206835..000000000
--- a/lib/pleroma/web/channels/user_socket.ex
+++ /dev/null
@@ -1,45 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.UserSocket do
- use Phoenix.Socket
- alias Pleroma.User
-
- ## Channels
- # channel "room:*", Pleroma.Web.RoomChannel
- channel("chat:*", Pleroma.Web.ShoutChannel)
-
- # Socket params are passed from the client and can
- # be used to verify and authenticate a user. After
- # verification, you can put default assigns into
- # the socket that will be set for all channels, ie
- #
- # {:ok, assign(socket, :user_id, verified_user_id)}
- #
- # To deny connection, return `:error`.
- #
- # See `Phoenix.Token` documentation for examples in
- # performing token verification on connect.
- def connect(%{"token" => token}, socket) do
- with true <- Pleroma.Config.get([:shout, :enabled]),
- {:ok, user_id} <- Phoenix.Token.verify(socket, "user socket", token, max_age: 84_600),
- %User{} = user <- Pleroma.User.get_cached_by_id(user_id) do
- {:ok, assign(socket, :user_name, user.nickname)}
- else
- _e -> :error
- end
- end
-
- # Socket id's are topics that allow you to identify all sockets for a given user:
- #
- # def id(socket), do: "user_socket:#{socket.assigns.user_id}"
- #
- # Would allow you to broadcast a "disconnect" event and terminate
- # all active sockets and channels for a given user:
- #
- # Pleroma.Web.Endpoint.broadcast("user_socket:#{user.id}", "disconnect", %{})
- #
- # Returning `nil` makes this socket anonymous.
- def id(_socket), do: nil
-end
diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex
index 856fa95b9..bc5e26cf7 100644
--- a/lib/pleroma/web/common_api.ex
+++ b/lib/pleroma/web/common_api.ex
@@ -5,7 +5,6 @@
defmodule Pleroma.Web.CommonAPI do
alias Pleroma.Activity
alias Pleroma.Conversation.Participation
- alias Pleroma.Formatter
alias Pleroma.Object
alias Pleroma.ThreadMute
alias Pleroma.User
@@ -30,57 +29,6 @@ def block(blocker, blocked) do
end
end
- def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) do
- with maybe_attachment <- opts[:media_id] && Object.get_by_id(opts[:media_id]),
- :ok <- validate_chat_content_length(content, !!maybe_attachment),
- {_, {:ok, chat_message_data, _meta}} <-
- {:build_object,
- Builder.chat_message(
- user,
- recipient.ap_id,
- content |> format_chat_content,
- attachment: maybe_attachment
- )},
- {_, {:ok, create_activity_data, _meta}} <-
- {:build_create_activity, Builder.create(user, chat_message_data, [recipient.ap_id])},
- {_, {:ok, %Activity{} = activity, _meta}} <-
- {:common_pipeline,
- Pipeline.common_pipeline(create_activity_data,
- local: true,
- idempotency_key: opts[:idempotency_key]
- )} do
- {:ok, activity}
- else
- {:common_pipeline, {:reject, _} = e} -> e
- e -> e
- end
- end
-
- defp format_chat_content(nil), do: nil
-
- defp format_chat_content(content) do
- {text, _, _} =
- content
- |> Formatter.html_escape("text/plain")
- |> Formatter.linkify()
- |> (fn {text, mentions, tags} ->
- {String.replace(text, ~r/\r?\n/, " "), mentions, tags}
- end).()
-
- text
- end
-
- defp validate_chat_content_length(_, true), do: :ok
- defp validate_chat_content_length(nil, false), do: {:error, :no_content}
-
- defp validate_chat_content_length(content, _) do
- if String.length(content) <= Pleroma.Config.get([:instance, :chat_limit]) do
- :ok
- else
- {:error, :content_too_long}
- end
- end
-
def unblock(blocker, blocked) do
with {_, %Activity{} = block} <- {:fetch_block, Utils.fetch_latest_block(blocker, blocked)},
{:ok, unblock_data, _} <- Builder.undo(blocker, block),
@@ -371,6 +319,10 @@ def get_replied_to_visibility(activity) do
end
end
+ def get_quoted_visibility(nil), do: nil
+
+ def get_quoted_visibility(activity), do: get_replied_to_visibility(activity)
+
def check_expiry_date({:ok, nil} = res), do: res
def check_expiry_date({:ok, in_seconds}) do
@@ -388,12 +340,6 @@ def check_expiry_date(expiry_str) do
|> check_expiry_date()
end
- def listen(user, data) do
- with {:ok, draft} <- ActivityDraft.listen(user, data) do
- ActivityPub.listen(draft.changes)
- end
- end
-
def post(user, %{status: _} = data) do
with {:ok, draft} <- ActivityDraft.create(user, data) do
ActivityPub.create(draft.changes, draft.preview?)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index bd56b6e20..767b2bf0f 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -22,6 +22,8 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
attachments: [],
in_reply_to: nil,
in_reply_to_conversation: nil,
+ quote_id: nil,
+ quote: nil,
visibility: nil,
expires_at: nil,
extra: nil,
@@ -54,6 +56,7 @@ def create(user, params) do
|> with_valid(&in_reply_to/1)
|> with_valid(&in_reply_to_conversation/1)
|> with_valid(&visibility/1)
+ |> with_valid("e_id/1)
|> content()
|> with_valid(&to_and_cc/1)
|> with_valid(&context/1)
@@ -64,30 +67,6 @@ def create(user, params) do
|> validate()
end
- def listen(user, params) do
- user
- |> new(params)
- |> visibility()
- |> to_and_cc()
- |> context()
- |> listen_object()
- |> with_valid(&changes/1)
- |> validate()
- end
-
- defp listen_object(draft) do
- object =
- draft.params
- |> Map.take([:album, :artist, :title, :length])
- |> Map.new(fn {key, value} -> {to_string(key), value} end)
- |> Map.put("type", "Audio")
- |> Map.put("to", draft.to)
- |> Map.put("cc", draft.cc)
- |> Map.put("actor", draft.user.ap_id)
-
- %__MODULE__{draft | object: object}
- end
-
defp put_params(draft, params) do
params = Map.put_new(params, :in_reply_to_status_id, params[:in_reply_to_id])
%__MODULE__{draft | params: params}
@@ -132,6 +111,28 @@ defp in_reply_to_conversation(draft) do
%__MODULE__{draft | in_reply_to_conversation: in_reply_to_conversation}
end
+ defp quote_id(%{params: %{quote_id: ""}} = draft), do: draft
+
+ defp quote_id(%{params: %{quote_id: id}} = draft) when is_binary(id) do
+ with {:activity, %Activity{} = quote} <- {:activity, Activity.get_by_id(id)},
+ visibility <- CommonAPI.get_quoted_visibility(quote),
+ {:visibility, true} <- {:visibility, visibility in ["public", "unlisted"]} do
+ %__MODULE__{draft | quote: Activity.get_by_id(id)}
+ else
+ {:activity, _} ->
+ add_error(draft, dgettext("errors", "You can't quote a status that doesn't exist"))
+
+ {:visibility, false} ->
+ add_error(draft, dgettext("errors", "You can only quote public or unlisted statuses"))
+ end
+ end
+
+ defp quote_id(%{params: %{quote_id: %Activity{} = quote}} = draft) do
+ %__MODULE__{draft | quote: quote}
+ end
+
+ defp quote_id(draft), do: draft
+
defp visibility(%{params: params} = draft) do
case CommonAPI.get_visibility(params, draft.in_reply_to, draft.in_reply_to_conversation) do
{visibility, "direct"} when visibility != "direct" ->
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index f5bc3acf5..61af71acd 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -259,8 +259,7 @@ def format_input(text, format, options \\ [])
@doc """
Formatting text to plain text, BBCode, HTML, or Markdown
"""
- def format_input(text, format, options)
- when format in ["text/plain", "text/x.misskeymarkdown"] do
+ def format_input(text, "text/plain", options) do
text
|> Formatter.html_escape("text/plain")
|> Formatter.linkify(options)
@@ -284,6 +283,15 @@ def format_input(text, "text/html", options) do
|> Formatter.linkify(options)
end
+ def format_input(text, "text/x.misskeymarkdown", options) do
+ text
+ |> Formatter.linkify(options)
+ |> Formatter.html_escape("text/x.misskeymarkdown")
+ |> (fn {text, mentions, tags} ->
+ {String.replace(text, ~r/\r?\n/, " "), mentions, tags}
+ end).()
+ end
+
def format_input(text, "text/markdown", options) do
text
|> Formatter.mentions_escape(options)
@@ -450,35 +458,6 @@ def get_report_statuses(%User{ap_id: actor}, %{status_ids: status_ids})
def get_report_statuses(_, _), do: {:ok, nil}
- # DEPRECATED mostly, context objects are now created at insertion time.
- def context_to_conversation_id(context) do
- with %Object{id: id} <- Object.get_cached_by_ap_id(context) do
- id
- else
- _e ->
- changeset = Object.context_mapping(context)
-
- case Repo.insert(changeset) do
- {:ok, %{id: id}} ->
- id
-
- # This should be solved by an upsert, but it seems ecto
- # has problems accessing the constraint inside the jsonb.
- {:error, _} ->
- Object.get_cached_by_ap_id(context).id
- end
- end
- end
-
- def conversation_id_to_context(id) do
- with %Object{data: %{"id" => context}} <- Repo.get(Object, id) do
- context
- else
- _e ->
- {:error, dgettext("errors", "No such conversation")}
- end
- end
-
def validate_character_limit("" = _full_payload, [] = _attachments) do
{:error, dgettext("errors", "Cannot post an empty status without attachments")}
end
diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex
index 62a6459b1..6dd66a424 100644
--- a/lib/pleroma/web/endpoint.ex
+++ b/lib/pleroma/web/endpoint.ex
@@ -9,7 +9,6 @@ defmodule Pleroma.Web.Endpoint do
alias Pleroma.Config
- socket("/socket", Pleroma.Web.UserSocket)
socket("/live", Phoenix.LiveView.Socket)
plug(Pleroma.Web.Plugs.SetLocalePlug)
@@ -162,47 +161,6 @@ defmodule Pleroma.Web.Endpoint do
plug(Pleroma.Web.Plugs.RemoteIp)
- defmodule Instrumenter do
- use Prometheus.PhoenixInstrumenter
- end
-
- defmodule PipelineInstrumenter do
- use Prometheus.PlugPipelineInstrumenter
- end
-
- defmodule MetricsExporter do
- use Prometheus.PlugExporter
- end
-
- defmodule MetricsExporterCaller do
- @behaviour Plug
-
- def init(opts), do: opts
-
- def call(conn, opts) do
- prometheus_config = Application.get_env(:prometheus, MetricsExporter, [])
- ip_whitelist = List.wrap(prometheus_config[:ip_whitelist])
-
- cond do
- !prometheus_config[:enabled] ->
- conn
-
- ip_whitelist != [] and
- !Enum.find(ip_whitelist, fn ip ->
- Pleroma.Helpers.InetHelper.parse_address(ip) == {:ok, conn.remote_ip}
- end) ->
- conn
-
- true ->
- MetricsExporter.call(conn, opts)
- end
- end
- end
-
- plug(PipelineInstrumenter)
-
- plug(MetricsExporterCaller)
-
plug(Pleroma.Web.Router)
@doc """
diff --git a/lib/pleroma/web/feed/tag_controller.ex b/lib/pleroma/web/feed/tag_controller.ex
index ef9293a55..1e0f7223c 100644
--- a/lib/pleroma/web/feed/tag_controller.ex
+++ b/lib/pleroma/web/feed/tag_controller.ex
@@ -31,7 +31,8 @@ defp render_feed(conn, %{"tag" => raw_tag} = params) do
|> render("tag.#{format}",
activities: activities,
tag: tag,
- feed_config: Config.get([:feed])
+ feed_config: Config.get([:feed]),
+ view_module: FeedView
)
end
diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex
index 739b1f026..dc3b1f94b 100644
--- a/lib/pleroma/web/feed/user_controller.ex
+++ b/lib/pleroma/web/feed/user_controller.ex
@@ -60,7 +60,8 @@ def feed(conn, %{"nickname" => nickname} = params) do
|> render("user.#{format}",
user: user,
activities: activities,
- feed_config: Config.get([:feed])
+ feed_config: Config.get([:feed]),
+ view_module: FeedView
)
end
end
diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex
index 83cebbb96..ed7fb802a 100644
--- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex
@@ -153,13 +153,10 @@ defp validate_email_param(_) do
@doc "GET /api/v1/accounts/verify_credentials"
def verify_credentials(%{assigns: %{user: user}} = conn, _) do
- chat_token = Phoenix.Token.sign(conn, "user socket", user.id)
-
render(conn, "show.json",
user: user,
for: user,
- with_pleroma_settings: true,
- with_chat_token: chat_token
+ with_pleroma_settings: true
)
end
@@ -188,8 +185,7 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p
:show_role,
:skip_thread_containment,
:allow_following_move,
- :also_known_as,
- :accepts_chat_messages
+ :also_known_as
]
|> Enum.reduce(%{}, fn key, acc ->
Maps.put_if_present(acc, key, params[key], &{:ok, Params.truthy_param?(&1)})
diff --git a/lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex b/lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex
new file mode 100644
index 000000000..080af96d5
--- /dev/null
+++ b/lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex
@@ -0,0 +1,60 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.AnnouncementController do
+ use Pleroma.Web, :controller
+
+ import Pleroma.Web.ControllerHelper,
+ only: [
+ json_response: 3
+ ]
+
+ alias Pleroma.Announcement
+ alias Pleroma.Web.Plugs.OAuthScopesPlug
+
+ plug(Pleroma.Web.ApiSpec.CastAndValidate)
+
+ # Mastodon docs say this only requires a user token, no scopes needed
+ # As the op `|` requires at least one scope to be present, we use `&` here.
+ plug(
+ OAuthScopesPlug,
+ %{scopes: [], op: :&}
+ when action in [:index]
+ )
+
+ # Same as in MastodonAPI specs
+ plug(
+ OAuthScopesPlug,
+ %{scopes: ["write:accounts"]}
+ when action in [:mark_read]
+ )
+
+ action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
+
+ defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.AnnouncementOperation
+
+ @doc "GET /api/v1/announcements"
+ def index(%{assigns: %{user: user}} = conn, _params) do
+ render(conn, "index.json", announcements: all_visible(), user: user)
+ end
+
+ def index(conn, _params) do
+ render(conn, "index.json", announcements: all_visible(), user: nil)
+ end
+
+ defp all_visible do
+ Announcement.list_all_visible()
+ end
+
+ @doc "POST /api/v1/announcements/:id/dismiss"
+ def mark_read(%{assigns: %{user: user}} = conn, %{id: id} = _params) do
+ with announcement when not is_nil(announcement) <- Announcement.get_by_id(id),
+ {:ok, _} <- Announcement.mark_read_by(announcement, user) do
+ json_response(conn, :ok, %{})
+ else
+ _ ->
+ {:error, :not_found}
+ end
+ end
+end
diff --git a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex
index 002d6b2ce..ae4432e85 100644
--- a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex
@@ -98,11 +98,6 @@ def dismiss(%{assigns: %{user: user}} = conn, %{id: id} = _params) do
end
end
- # POST /api/v1/notifications/dismiss (deprecated)
- def dismiss_via_body(%{body_params: params} = conn, _) do
- dismiss(conn, params)
- end
-
# DELETE /api/v1/notifications/destroy_multiple
def destroy_multiple(%{assigns: %{user: user}} = conn, %{ids: ids} = _params) do
Notification.destroy_multiple(user, ids)
diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex
index e4acba226..bd12069c1 100644
--- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex
@@ -25,7 +25,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do
# Note: on private instances auth is required (EnsurePublicOrAuthenticatedPlug is not skipped)
- plug(RateLimiter, [name: :search] when action in [:search, :search2, :account_search])
+ plug(RateLimiter, [name: :search] when action in [:search2, :account_search])
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.SearchOperation
@@ -42,7 +42,6 @@ def account_search(%{assigns: %{user: user}} = conn, %{q: query} = params) do
end
def search2(conn, params), do: do_search(:v2, conn, params)
- def search(conn, params), do: do_search(:v1, conn, params)
defp do_search(version, %{assigns: %{user: user}} = conn, %{q: query} = params) do
query = String.trim(query)
@@ -118,10 +117,6 @@ defp resource_search(:v2, "hashtags", query, options) do
end)
end
- defp resource_search(:v1, "hashtags", query, options) do
- prepare_tags(query, options)
- end
-
defp prepare_tags(query, options) do
tags =
query
diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex
index 60f4c44d7..9ab30742b 100644
--- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex
@@ -37,7 +37,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do
when action in [
:index,
:show,
- :card,
:context
]
)
@@ -315,18 +314,6 @@ def unmute_conversation(%{assigns: %{user: user}} = conn, %{id: id}) do
end
end
- @doc "GET /api/v1/statuses/:id/card"
- @deprecated "https://github.com/tootsuite/mastodon/pull/11213"
- def card(%{assigns: %{user: user}} = conn, %{id: status_id}) do
- with %Activity{} = activity <- Activity.get_by_id(status_id),
- true <- Visibility.visible_for_user?(activity, user) do
- data = Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
- render(conn, "card.json", data)
- else
- _ -> render_error(conn, :not_found, "Record not found")
- end
- end
-
@doc "GET /api/v1/statuses/:id/favourited_by"
def favourited_by(%{assigns: %{user: user}} = conn, %{id: id}) do
with true <- Pleroma.Config.get([:instance, :show_reactions]),
diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex
index 10c279893..5f8acb2df 100644
--- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex
@@ -26,8 +26,9 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do
plug(RateLimiter, [name: :timeline, bucket_name: :home_timeline] when action == :home)
plug(RateLimiter, [name: :timeline, bucket_name: :hashtag_timeline] when action == :hashtag)
plug(RateLimiter, [name: :timeline, bucket_name: :list_timeline] when action == :list)
+ plug(RateLimiter, [name: :timeline, bucket_name: :bubble_timeline] when action == :bubble)
- plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:home, :direct])
+ plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:home, :direct, :bubble])
plug(OAuthScopesPlug, %{scopes: ["read:lists"]} when action == :list)
plug(
@@ -112,6 +113,8 @@ def public(%{assigns: %{user: user}} = conn, params) do
|> Map.put(:muting_user, user)
|> Map.put(:reply_filtering_user, user)
|> Map.put(:instance, params[:instance])
+ # Restricts unfederated content to authenticated users
+ |> Map.put(:includes_local_public, not is_nil(user))
|> ActivityPub.fetch_public_activities()
conn
@@ -125,6 +128,37 @@ def public(%{assigns: %{user: user}} = conn, params) do
end
end
+ # GET /api/v1/timelines/bubble
+ def bubble(%{assigns: %{user: user}} = conn, params) do
+ bubble_instances =
+ Enum.uniq(
+ Config.get([:instance, :local_bubble], []) ++
+ [Pleroma.Web.Endpoint.host()]
+ )
+
+ if is_nil(user) do
+ fail_on_bad_auth(conn)
+ else
+ activities =
+ params
+ |> Map.put(:type, ["Create"])
+ |> Map.put(:blocking_user, user)
+ |> Map.put(:muting_user, user)
+ |> Map.put(:reply_filtering_user, user)
+ |> Map.put(:instance, bubble_instances)
+ |> ActivityPub.fetch_public_activities()
+
+ conn
+ |> add_link_headers(activities)
+ |> render("index.json",
+ activities: activities,
+ for: user,
+ as: :activity,
+ with_muted: Map.get(params, :with_muted, false)
+ )
+ end
+ end
+
defp fail_on_bad_auth(conn) do
render_error(conn, :unauthorized, "authorization required for timeline view")
end
diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex
index 4b15b1635..06acf0a26 100644
--- a/lib/pleroma/web/mastodon_api/views/account_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/account_view.ex
@@ -289,7 +289,6 @@ defp do_render("show.json", %{user: user} = opts) do
relationship: relationship,
skip_thread_containment: user.skip_thread_containment,
background_image: image_url(user.background) |> MediaProxy.url(),
- accepts_chat_messages: user.accepts_chat_messages,
favicon: favicon
}
}
@@ -297,7 +296,6 @@ defp do_render("show.json", %{user: user} = opts) do
|> maybe_put_settings(user, opts[:for], opts)
|> maybe_put_notification_settings(user, opts[:for])
|> maybe_put_settings_store(user, opts[:for], opts)
- |> maybe_put_chat_token(user, opts[:for], opts)
|> maybe_put_activation_status(user, opts[:for])
|> maybe_put_follow_requests_count(user, opts[:for])
|> maybe_put_allow_following_move(user, opts[:for])
@@ -350,15 +348,6 @@ defp maybe_put_settings_store(data, %User{} = user, %User{}, %{
defp maybe_put_settings_store(data, _, _, _), do: data
- defp maybe_put_chat_token(data, %User{id: id}, %User{id: id}, %{
- with_chat_token: token
- }) do
- data
- |> Kernel.put_in([:pleroma, :chat_token], token)
- end
-
- defp maybe_put_chat_token(data, _, _, _), do: data
-
defp maybe_put_role(data, %User{show_role: true} = user, _) do
data
|> Kernel.put_in([:pleroma, :is_admin], user.is_admin)
diff --git a/lib/pleroma/web/mastodon_api/views/announcement_view.ex b/lib/pleroma/web/mastodon_api/views/announcement_view.ex
new file mode 100644
index 000000000..93fdfb1f1
--- /dev/null
+++ b/lib/pleroma/web/mastodon_api/views/announcement_view.ex
@@ -0,0 +1,15 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.AnnouncementView do
+ use Pleroma.Web, :view
+
+ def render("index.json", %{announcements: announcements, user: user}) do
+ render_many(announcements, __MODULE__, "show.json", user: user)
+ end
+
+ def render("show.json", %{announcement: announcement, user: user}) do
+ Pleroma.Announcement.render_json(announcement, for: user)
+ end
+end
diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex
index c36271654..4cfa8d85c 100644
--- a/lib/pleroma/web/mastodon_api/views/instance_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex
@@ -37,7 +37,6 @@ def render("show.json", _) do
background_upload_limit: Keyword.get(instance, :background_upload_limit),
banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
background_image: Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
- shout_limit: Config.get([:shout, :limit]),
description_limit: Keyword.get(instance, :description_limit),
pleroma: %{
metadata: %{
@@ -57,6 +56,7 @@ def render("show.json", _) do
def features do
[
"pleroma_api",
+ "akkoma_api",
"mastodon_api",
"mastodon_api_streaming",
"polls",
@@ -68,13 +68,6 @@ def features do
if Config.get([:media_proxy, :enabled]) do
"media_proxy"
end,
- # backwards compat
- if Config.get([:shout, :enabled]) do
- "chat"
- end,
- if Config.get([:shout, :enabled]) do
- "shout"
- end,
if Config.get([:instance, :allow_relay]) do
"relay"
end,
@@ -82,7 +75,6 @@ def features do
"safe_dm_mentions"
end,
"pleroma_emoji_reactions",
- "pleroma_chat_messages",
if Config.get([:instance, :show_reactions]) do
"exposable_reactions"
end,
diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex
index bb156799e..83914a275 100644
--- a/lib/pleroma/web/mastodon_api/views/notification_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex
@@ -6,9 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do
use Pleroma.Web, :view
alias Pleroma.Activity
- alias Pleroma.Chat.MessageReference
alias Pleroma.Notification
- alias Pleroma.Object
alias Pleroma.User
alias Pleroma.UserRelationship
alias Pleroma.Web.AdminAPI.Report
@@ -18,7 +16,6 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do
alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.MastodonAPI.NotificationView
alias Pleroma.Web.MastodonAPI.StatusView
- alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
@parent_types ~w{Like Announce EmojiReact}
@@ -121,9 +118,6 @@ def render(
|> put_status(parent_activity_fn.(), reading_user, status_render_opts)
|> put_emoji(activity)
- "pleroma:chat_mention" ->
- put_chat_message(response, activity, reading_user, status_render_opts)
-
"pleroma:report" ->
put_report(response, activity)
@@ -144,17 +138,6 @@ defp put_emoji(response, activity) do
|> Map.put(:emoji_url, MediaProxy.url(Pleroma.Emoji.emoji_url(activity.data)))
end
- defp put_chat_message(response, activity, reading_user, opts) do
- object = Object.normalize(activity, fetch: false)
- author = User.get_cached_by_ap_id(object.data["actor"])
- chat = Pleroma.Chat.get(reading_user.id, author.ap_id)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
- render_opts = Map.merge(opts, %{for: reading_user, chat_message_reference: cm_ref})
- chat_message_render = MessageReferenceView.render("show.json", render_opts)
-
- Map.put(response, :chat_message, chat_message_render)
- end
-
defp put_status(response, activity, reading_user, opts) do
status_render_opts = Map.merge(opts, %{activity: activity, for: reading_user})
status_render = StatusView.render("show.json", status_render_opts)
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index c0f467592..f0fe9a4ba 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -57,11 +57,19 @@ defp get_replied_to_activities(activities) do
end)
end
- defp get_context_id(%{data: %{"context_id" => context_id}}) when not is_nil(context_id),
- do: context_id
+ # DEPRECATED This field seems to be a left-over from the StatusNet era.
+ # If your application uses `pleroma.conversation_id`: this field is deprecated.
+ # It is currently stubbed instead by doing a CRC32 of the context, and
+ # clearing the MSB to avoid overflow exceptions with signed integers on the
+ # different clients using this field (Java/Kotlin code, mostly; see Husky.)
+ # This should be removed in a future version of Pleroma. Pleroma-FE currently
+ # depends on this field, as well.
+ defp get_context_id(%{data: %{"context" => context}}) when is_binary(context) do
+ use Bitwise
- defp get_context_id(%{data: %{"context" => context}}) when is_binary(context),
- do: Utils.context_to_conversation_id(context)
+ :erlang.crc32(context)
+ |> band(bnot(0x8000_0000))
+ end
defp get_context_id(_), do: nil
@@ -329,6 +337,8 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity}
{pinned?, pinned_at} = pin_data(object, user)
+ quote = Activity.get_quoted_activity_from_object(object)
+
%{
id: to_string(activity.id),
uri: object.data["id"],
@@ -363,9 +373,12 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity}
application: build_application(object.data["generator"]),
language: nil,
emojis: build_emojis(object.data["emoji"]),
+ quote_id: if(quote, do: quote.id, else: nil),
+ quote: maybe_render_quote(quote, opts),
pleroma: %{
local: activity.local,
conversation_id: get_context_id(activity),
+ context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
@@ -604,4 +617,19 @@ defp build_image_url(%URI{} = image_url_data, %URI{} = page_url_data) do
end
defp build_image_url(_, _), do: nil
+
+ defp maybe_render_quote(nil, _), do: nil
+
+ defp maybe_render_quote(quote, opts) do
+ if opts[:do_not_recurse] || !visible_for_user?(quote, opts[:for]) do
+ nil
+ else
+ opts =
+ opts
+ |> Map.put(:activity, quote)
+ |> Map.put(:do_not_recurse, true)
+
+ render("show.json", opts)
+ end
+ end
end
diff --git a/lib/pleroma/web/mastodon_api/websocket_handler.ex b/lib/pleroma/web/mastodon_api/websocket_handler.ex
index b978167b6..861a7ce3e 100644
--- a/lib/pleroma/web/mastodon_api/websocket_handler.ex
+++ b/lib/pleroma/web/mastodon_api/websocket_handler.ex
@@ -65,6 +65,11 @@ def websocket_handle(:pong, state) do
# We only receive pings for now
def websocket_handle(:ping, state), do: {:ok, state}
+ def websocket_handle({:text, "ping"}, state) do
+ if state.timer, do: Process.cancel_timer(state.timer)
+ {:reply, {:text, "pong"}, %{state | timer: timer()}}
+ end
+
def websocket_handle(frame, state) do
Logger.error("#{__MODULE__} received frame: #{inspect(frame)}")
{:ok, state}
diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex
index b3a92d75a..84e07132a 100644
--- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex
+++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex
@@ -54,7 +54,7 @@ defp handle_preview(conn, url) do
media_proxy_url = MediaProxy.url(url)
with {:ok, %{status: status} = head_response} when status in 200..299 <-
- Pleroma.HTTP.request("head", media_proxy_url, [], [], name: MyFinch) do
+ Pleroma.HTTP.request("HEAD", media_proxy_url, [], [], name: MyFinch) do
content_type = Tesla.get_header(head_response, "content-type")
content_length = Tesla.get_header(head_response, "content-length")
content_length = content_length && String.to_integer(content_length)
diff --git a/lib/pleroma/web/nodeinfo/nodeinfo.ex b/lib/pleroma/web/nodeinfo/nodeinfo.ex
index 80a2ce676..bf0d65f45 100644
--- a/lib/pleroma/web/nodeinfo/nodeinfo.ex
+++ b/lib/pleroma/web/nodeinfo/nodeinfo.ex
@@ -70,7 +70,8 @@ def get_nodeinfo("2.0") do
features: features,
restrictedNicknames: Config.get([Pleroma.User, :restricted_nicknames]),
skipThreadContainment: Config.get([:instance, :skip_thread_containment], false),
- privilegedStaff: Config.get([:instance, :privileged_staff])
+ privilegedStaff: Config.get([:instance, :privileged_staff]),
+ localBubbleInstances: Config.get([:instance, :local_bubble], [])
}
}
end
diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
index 5cee26afe..a0dee7c6b 100644
--- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
+++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
@@ -88,7 +88,8 @@ def raw_nodeinfo do
mailerEnabled: Config.get([Pleroma.Emails.Mailer, :enabled], false),
features: features,
restrictedNicknames: Config.get([Pleroma.User, :restricted_nicknames]),
- skipThreadContainment: Config.get([:instance, :skip_thread_containment], false)
+ skipThreadContainment: Config.get([:instance, :skip_thread_containment], false),
+ localBubbleInstances: Config.get([:instance, :local_bubble], [])
}
}
end
diff --git a/lib/pleroma/web/o_auth/o_auth_controller.ex b/lib/pleroma/web/o_auth/o_auth_controller.ex
index 247d8399c..358120fe6 100644
--- a/lib/pleroma/web/o_auth/o_auth_controller.ex
+++ b/lib/pleroma/web/o_auth/o_auth_controller.ex
@@ -101,7 +101,8 @@ defp do_authorize(%Plug.Conn{} = conn, params) do
scopes: scopes,
redirect_uri: params["redirect_uri"],
state: params["state"],
- params: params
+ params: params,
+ view_module: OAuthView
})
end
@@ -160,7 +161,7 @@ def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{
# Enforcing the view to reuse the template when calling from other controllers
conn
|> put_view(OAuthView)
- |> render("oob_authorization_created.html", %{auth: auth})
+ |> render("oob_authorization_created.html", %{auth: auth, view_module: OAuthView})
end
def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
deleted file mode 100644
index 669d50132..000000000
--- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
+++ /dev/null
@@ -1,188 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.Web.PleromaAPI.ChatController do
- use Pleroma.Web, :controller
-
- import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
-
- alias Pleroma.Activity
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.Object
- alias Pleroma.Pagination
- alias Pleroma.Repo
- alias Pleroma.User
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
- alias Pleroma.Web.Plugs.OAuthScopesPlug
-
- import Ecto.Query
-
- action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
-
- plug(
- OAuthScopesPlug,
- %{scopes: ["write:chats"]}
- when action in [
- :post_chat_message,
- :create,
- :mark_as_read,
- :mark_message_as_read,
- :delete_message
- ]
- )
-
- plug(
- OAuthScopesPlug,
- %{scopes: ["read:chats"]} when action in [:messages, :index, :index2, :show]
- )
-
- plug(Pleroma.Web.ApiSpec.CastAndValidate)
-
- defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation
-
- def delete_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{
- message_id: message_id,
- id: chat_id
- }) do
- with %MessageReference{} = cm_ref <-
- MessageReference.get_by_id(message_id),
- ^chat_id <- to_string(cm_ref.chat_id),
- %Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id),
- {:ok, _} <- remove_or_delete(cm_ref, user) do
- conn
- |> put_view(MessageReferenceView)
- |> render("show.json", chat_message_reference: cm_ref)
- else
- _e ->
- {:error, :could_not_delete}
- end
- end
-
- defp remove_or_delete(
- %{object: %{data: %{"actor" => actor, "id" => id}}},
- %{ap_id: actor} = user
- ) do
- with %Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do
- CommonAPI.delete(activity.id, user)
- end
- end
-
- defp remove_or_delete(cm_ref, _), do: MessageReference.delete(cm_ref)
-
- def post_chat_message(
- %{body_params: params, assigns: %{user: user}} = conn,
- %{id: id}
- ) do
- with {:ok, chat} <- Chat.get_by_user_and_id(user, id),
- %User{} = recipient <- User.get_cached_by_ap_id(chat.recipient),
- {:ok, activity} <-
- CommonAPI.post_chat_message(user, recipient, params[:content],
- media_id: params[:media_id],
- idempotency_key: idempotency_key(conn)
- ),
- message <- Object.normalize(activity, fetch: false),
- cm_ref <- MessageReference.for_chat_and_object(chat, message) do
- conn
- |> put_view(MessageReferenceView)
- |> render("show.json", chat_message_reference: cm_ref)
- else
- {:reject, message} ->
- conn
- |> put_status(:unprocessable_entity)
- |> json(%{error: message})
-
- {:error, message} ->
- conn
- |> put_status(:bad_request)
- |> json(%{error: message})
- end
- end
-
- def mark_message_as_read(
- %{assigns: %{user: %{id: user_id}}} = conn,
- %{id: chat_id, message_id: message_id}
- ) do
- with %MessageReference{} = cm_ref <- MessageReference.get_by_id(message_id),
- ^chat_id <- to_string(cm_ref.chat_id),
- %Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id),
- {:ok, cm_ref} <- MessageReference.mark_as_read(cm_ref) do
- conn
- |> put_view(MessageReferenceView)
- |> render("show.json", chat_message_reference: cm_ref)
- end
- end
-
- def mark_as_read(
- %{body_params: %{last_read_id: last_read_id}, assigns: %{user: user}} = conn,
- %{id: id}
- ) do
- with {:ok, chat} <- Chat.get_by_user_and_id(user, id),
- {_n, _} <- MessageReference.set_all_seen_for_chat(chat, last_read_id) do
- render(conn, "show.json", chat: chat)
- end
- end
-
- def messages(%{assigns: %{user: user}} = conn, %{id: id} = params) do
- with {:ok, chat} <- Chat.get_by_user_and_id(user, id) do
- chat_message_refs =
- chat
- |> MessageReference.for_chat_query()
- |> Pagination.fetch_paginated(params)
-
- conn
- |> add_link_headers(chat_message_refs)
- |> put_view(MessageReferenceView)
- |> render("index.json", chat_message_references: chat_message_refs)
- end
- end
-
- def index(%{assigns: %{user: user}} = conn, params) do
- chats =
- index_query(user, params)
- |> Repo.all()
-
- render(conn, "index.json", chats: chats)
- end
-
- def index2(%{assigns: %{user: user}} = conn, params) do
- chats =
- index_query(user, params)
- |> Pagination.fetch_paginated(params)
-
- conn
- |> add_link_headers(chats)
- |> render("index.json", chats: chats)
- end
-
- defp index_query(%{id: user_id} = user, params) do
- exclude_users =
- User.cached_blocked_users_ap_ids(user) ++
- if params[:with_muted], do: [], else: User.cached_muted_users_ap_ids(user)
-
- user_id
- |> Chat.for_user_query()
- |> where([c], c.recipient not in ^exclude_users)
- end
-
- def create(%{assigns: %{user: user}} = conn, %{id: id}) do
- with %User{ap_id: recipient} <- User.get_cached_by_id(id),
- {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do
- render(conn, "show.json", chat: chat)
- end
- end
-
- def show(%{assigns: %{user: user}} = conn, %{id: id}) do
- with {:ok, chat} <- Chat.get_by_user_and_id(user, id) do
- render(conn, "show.json", chat: chat)
- end
- end
-
- defp idempotency_key(conn) do
- case get_req_header(conn, "idempotency-key") do
- [key] -> key
- _ -> nil
- end
- end
-end
diff --git a/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex b/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex
deleted file mode 100644
index ca26d80ef..000000000
--- a/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex
+++ /dev/null
@@ -1,52 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.ScrobbleController do
- use Pleroma.Web, :controller
-
- import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
-
- alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.Plugs.OAuthScopesPlug
-
- plug(Pleroma.Web.ApiSpec.CastAndValidate)
-
- plug(
- OAuthScopesPlug,
- %{scopes: ["read"], fallback: :proceed_unauthenticated} when action == :index
- )
-
- plug(OAuthScopesPlug, %{scopes: ["write"]} when action == :create)
-
- defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaScrobbleOperation
-
- def create(%{assigns: %{user: user}, body_params: params} = conn, _) do
- with {:ok, activity} <- CommonAPI.listen(user, params) do
- render(conn, "show.json", activity: activity, for: user)
- else
- {:error, message} ->
- conn
- |> put_status(:bad_request)
- |> json(%{"error" => message})
- end
- end
-
- def index(%{assigns: %{user: reading_user}} = conn, %{id: id} = params) do
- with %User{} = user <- User.get_cached_by_nickname_or_id(id, for: reading_user) do
- params = Map.put(params, :type, ["Listen"])
-
- activities = ActivityPub.fetch_user_abstract_activities(user, reading_user, params)
-
- conn
- |> add_link_headers(activities)
- |> render("index.json", %{
- activities: activities,
- for: reading_user,
- as: :activity
- })
- end
- end
-end
diff --git a/lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex b/lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex
deleted file mode 100644
index 2e4355992..000000000
--- a/lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex
+++ /dev/null
@@ -1,63 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.Chat.MessageReferenceView do
- use Pleroma.Web, :view
-
- alias Pleroma.Maps
- alias Pleroma.User
- alias Pleroma.Web.CommonAPI.Utils
- alias Pleroma.Web.MastodonAPI.StatusView
-
- @cachex Pleroma.Config.get([:cachex, :provider], Cachex)
-
- def render(
- "show.json",
- %{
- chat_message_reference: %{
- id: id,
- object: %{data: chat_message} = object,
- chat_id: chat_id,
- unread: unread
- }
- }
- ) do
- %{
- id: id |> to_string(),
- content: chat_message["content"],
- chat_id: chat_id |> to_string(),
- account_id: User.get_cached_by_ap_id(chat_message["actor"]).id,
- created_at: Utils.to_masto_date(chat_message["published"]),
- emojis: StatusView.build_emojis(chat_message["emoji"]),
- attachment:
- chat_message["attachment"] &&
- StatusView.render("attachment.json", attachment: chat_message["attachment"]),
- unread: unread,
- card:
- StatusView.render(
- "card.json",
- Pleroma.Web.RichMedia.Helpers.fetch_data_for_object(object)
- )
- }
- |> put_idempotency_key()
- end
-
- def render("index.json", opts) do
- render_many(
- opts[:chat_message_references],
- __MODULE__,
- "show.json",
- Map.put(opts, :as, :chat_message_reference)
- )
- end
-
- defp put_idempotency_key(data) do
- with {:ok, idempotency_key} <- @cachex.get(:chat_message_id_idempotency_key_cache, data.id) do
- data
- |> Maps.put_if_present(:idempotency_key, idempotency_key)
- else
- _ -> data
- end
- end
-end
diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex
deleted file mode 100644
index 3794818a7..000000000
--- a/lib/pleroma/web/pleroma_api/views/chat_view.ex
+++ /dev/null
@@ -1,44 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.ChatView do
- use Pleroma.Web, :view
-
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.User
- alias Pleroma.Web.CommonAPI.Utils
- alias Pleroma.Web.MastodonAPI.AccountView
- alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
-
- def render("show.json", %{chat: %Chat{} = chat} = opts) do
- recipient = User.get_cached_by_ap_id(chat.recipient)
- last_message = opts[:last_message] || MessageReference.last_message_for_chat(chat)
- account_view_opts = account_view_opts(opts, recipient)
-
- %{
- id: chat.id |> to_string(),
- account: AccountView.render("show.json", account_view_opts),
- unread: MessageReference.unread_count_for_chat(chat),
- last_message:
- last_message &&
- MessageReferenceView.render("show.json", chat_message_reference: last_message),
- updated_at: Utils.to_masto_date(chat.updated_at)
- }
- end
-
- def render("index.json", %{chats: chats} = opts) do
- render_many(chats, __MODULE__, "show.json", Map.delete(opts, :chats))
- end
-
- defp account_view_opts(opts, recipient) do
- account_view_opts = Map.put(opts, :user, recipient)
-
- if Map.has_key?(account_view_opts, :for) do
- account_view_opts
- else
- Map.put(account_view_opts, :skip_visibility_check, true)
- end
- end
-end
diff --git a/lib/pleroma/web/pleroma_api/views/scrobble_view.ex b/lib/pleroma/web/pleroma_api/views/scrobble_view.ex
deleted file mode 100644
index 2bc069529..000000000
--- a/lib/pleroma/web/pleroma_api/views/scrobble_view.ex
+++ /dev/null
@@ -1,37 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.ScrobbleView do
- use Pleroma.Web, :view
-
- require Pleroma.Constants
-
- alias Pleroma.Activity
- alias Pleroma.HTML
- alias Pleroma.Object
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.CommonAPI.Utils
- alias Pleroma.Web.MastodonAPI.AccountView
-
- def render("show.json", %{activity: %Activity{data: %{"type" => "Listen"}} = activity} = opts) do
- object = Object.normalize(activity, fetch: false)
-
- user = CommonAPI.get_user(activity.data["actor"])
- created_at = Utils.to_masto_date(activity.data["published"])
-
- %{
- id: activity.id,
- account: AccountView.render("show.json", %{user: user, for: opts[:for]}),
- created_at: created_at,
- title: object.data["title"] |> HTML.strip_tags(),
- artist: object.data["artist"] |> HTML.strip_tags(),
- album: object.data["album"] |> HTML.strip_tags(),
- length: object.data["length"]
- }
- end
-
- def render("index.json", opts) do
- safe_render_many(opts.activities, __MODULE__, "show.json", opts)
- end
-end
diff --git a/lib/pleroma/web/plugs/http_signature_plug.ex b/lib/pleroma/web/plugs/http_signature_plug.ex
index 0f7550516..cfee392c8 100644
--- a/lib/pleroma/web/plugs/http_signature_plug.ex
+++ b/lib/pleroma/web/plugs/http_signature_plug.ex
@@ -5,6 +5,8 @@
defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do
import Plug.Conn
import Phoenix.Controller, only: [get_format: 1, text: 2]
+ alias Pleroma.Activity
+ alias Pleroma.Web.Router
require Logger
def init(options) do
@@ -25,21 +27,45 @@ def call(conn, _opts) do
end
end
+ def route_aliases(%{path_info: ["objects", id]}) do
+ ap_id = Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :object, id)
+
+ with %Activity{} = activity <- Activity.get_by_object_ap_id_with_object(ap_id) do
+ ["/notice/#{activity.id}"]
+ else
+ _ -> []
+ end
+ end
+
+ def route_aliases(_), do: []
+
+ defp assign_valid_signature_on_route_aliases(conn, []), do: conn
+
+ defp assign_valid_signature_on_route_aliases(%{assigns: %{valid_signature: true}} = conn, _),
+ do: conn
+
+ defp assign_valid_signature_on_route_aliases(conn, [path | rest]) do
+ request_target = String.downcase("#{conn.method}") <> " #{path}"
+
+ conn =
+ conn
+ |> put_req_header("(request-target)", request_target)
+ |> case do
+ %{assigns: %{digest: digest}} = conn -> put_req_header(conn, "digest", digest)
+ conn -> conn
+ end
+
+ conn
+ |> assign(:valid_signature, HTTPSignatures.validate_conn(conn))
+ |> assign_valid_signature_on_route_aliases(rest)
+ end
+
defp maybe_assign_valid_signature(conn) do
if has_signature_header?(conn) do
# set (request-target) header to the appropriate value
# we also replace the digest header with the one we computed
- request_target = String.downcase("#{conn.method}") <> " #{conn.request_path}"
-
- conn =
- conn
- |> put_req_header("(request-target)", request_target)
- |> case do
- %{assigns: %{digest: digest}} = conn -> put_req_header(conn, "digest", digest)
- conn -> conn
- end
-
- assign(conn, :valid_signature, HTTPSignatures.validate_conn(conn))
+ possible_paths = route_aliases(conn) ++ [conn.request_path]
+ assign_valid_signature_on_route_aliases(conn, possible_paths)
else
Logger.debug("No signature header!")
conn
diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex
index 28e13ef9c..c30a39e94 100644
--- a/lib/pleroma/web/push/impl.ex
+++ b/lib/pleroma/web/push/impl.ex
@@ -124,13 +124,6 @@ def build_content(notification, actor, object, mastodon_type) do
def format_body(activity, actor, object, mastodon_type \\ nil)
- def format_body(_activity, actor, %{data: %{"type" => "ChatMessage"} = data}, _) do
- case data["content"] do
- nil -> "@#{actor.nickname}: (Attachment)"
- content -> "@#{actor.nickname}: #{Utils.scrub_html_and_truncate(content, 80)}"
- end
- end
-
def format_body(
%{activity: %{data: %{"type" => "Create"}}},
actor,
@@ -187,7 +180,6 @@ def format_title(%{type: type}, mastodon_type) do
"follow_request" -> "New Follow Request"
"reblog" -> "New Repeat"
"favourite" -> "New Favorite"
- "pleroma:chat_mention" -> "New Chat Message"
"pleroma:emoji_reaction" -> "New Reaction"
type -> "New #{String.capitalize(type || "event")}"
end
diff --git a/lib/pleroma/web/push/subscription.ex b/lib/pleroma/web/push/subscription.ex
index 35bf2e223..b063b103f 100644
--- a/lib/pleroma/web/push/subscription.ex
+++ b/lib/pleroma/web/push/subscription.ex
@@ -26,7 +26,7 @@ defmodule Pleroma.Web.Push.Subscription do
end
# credo:disable-for-next-line Credo.Check.Readability.MaxLineLength
- @supported_alert_types ~w[follow favourite mention reblog poll pleroma:chat_mention pleroma:emoji_reaction]a
+ @supported_alert_types ~w[follow favourite mention reblog poll pleroma:emoji_reaction]a
defp alerts(%{data: %{alerts: alerts}}) do
alerts = Map.take(alerts, @supported_alert_types)
diff --git a/lib/pleroma/web/rich_media/parsers/ogp.ex b/lib/pleroma/web/rich_media/parsers/ogp.ex
deleted file mode 100644
index d0edf1c88..000000000
--- a/lib/pleroma/web/rich_media/parsers/ogp.ex
+++ /dev/null
@@ -1,10 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.RichMedia.Parsers.OGP do
- @deprecated "OGP parser is deprecated. Use TwitterCard instead."
- def parse(_html, _data) do
- %{}
- end
-end
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index b1817ef8b..a0310bbb5 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -235,6 +235,12 @@ defmodule Pleroma.Web.Router do
post("/frontends/install", FrontendController, :install)
post("/backups", AdminAPIController, :create_backup)
+
+ get("/announcements", AnnouncementController, :index)
+ post("/announcements", AnnouncementController, :create)
+ get("/announcements/:id", AnnouncementController, :show)
+ patch("/announcements/:id", AnnouncementController, :change)
+ delete("/announcements/:id", AnnouncementController, :delete)
end
# AdminAPI: admins and mods (staff) can perform these actions (if enabled by config)
@@ -247,12 +253,8 @@ defmodule Pleroma.Web.Router do
patch("/users/:nickname/credentials", AdminAPIController, :update_user_credentials)
get("/users/:nickname/statuses", AdminAPIController, :list_user_statuses)
- get("/users/:nickname/chats", AdminAPIController, :list_user_chats)
get("/statuses", StatusController, :index)
-
- get("/chats/:id", ChatController, :show)
- get("/chats/:id/messages", ChatController, :messages)
end
# AdminAPI: admins and mods (staff) can perform these actions
@@ -292,8 +294,6 @@ defmodule Pleroma.Web.Router do
post("/reload_emoji", AdminAPIController, :reload_emoji)
get("/stats", AdminAPIController, :stats)
-
- delete("/chats/:id/messages/:message_id", ChatController, :delete_message)
end
scope "/api/v1/pleroma/emoji", Pleroma.Web.PleromaAPI do
@@ -421,15 +421,6 @@ defmodule Pleroma.Web.Router do
scope [] do
pipe_through(:authenticated_api)
- post("/chats/by-account-id/:id", ChatController, :create)
- get("/chats", ChatController, :index)
- get("/chats/:id", ChatController, :show)
- get("/chats/:id/messages", ChatController, :messages)
- post("/chats/:id/messages", ChatController, :post_chat_message)
- delete("/chats/:id/messages/:message_id", ChatController, :delete_message)
- post("/chats/:id/read", ChatController, :mark_as_read)
- post("/chats/:id/messages/:message_id/read", ChatController, :mark_message_as_read)
-
get("/conversations/:id/statuses", ConversationController, :statuses)
get("/conversations/:id", ConversationController, :show)
post("/conversations/read", ConversationController, :mark_as_read)
@@ -442,8 +433,6 @@ defmodule Pleroma.Web.Router do
get("/mascot", MascotController, :show)
put("/mascot", MascotController, :update)
- post("/scrobble", ScrobbleController, :create)
-
get("/backups", BackupController, :index)
post("/backups", BackupController, :create)
end
@@ -465,17 +454,9 @@ defmodule Pleroma.Web.Router do
scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do
pipe_through(:api)
- get("/accounts/:id/scrobbles", ScrobbleController, :index)
get("/federation_status", InstancesController, :show)
end
- scope "/api/v2/pleroma", Pleroma.Web.PleromaAPI do
- scope [] do
- pipe_through(:authenticated_api)
- get("/chats", ChatController, :index2)
- end
- end
-
scope "/api/v1", Pleroma.Web.MastodonAPI do
pipe_through(:authenticated_api)
@@ -540,8 +521,6 @@ defmodule Pleroma.Web.Router do
post("/notifications/:id/dismiss", NotificationController, :dismiss)
post("/notifications/clear", NotificationController, :clear)
delete("/notifications/destroy_multiple", NotificationController, :destroy_multiple)
- # Deprecated: was removed in Mastodon v3, use `/notifications/:id/dismiss` instead
- post("/notifications/dismiss", NotificationController, :dismiss_via_body)
post("/polls/:id/votes", PollController, :vote)
@@ -581,6 +560,10 @@ defmodule Pleroma.Web.Router do
get("/timelines/home", TimelineController, :home)
get("/timelines/direct", TimelineController, :direct)
get("/timelines/list/:list_id", TimelineController, :list)
+ get("/timelines/bubble", TimelineController, :bubble)
+
+ get("/announcements", AnnouncementController, :index)
+ post("/announcements/:id/dismiss", AnnouncementController, :mark_read)
end
scope "/api/web", Pleroma.Web do
@@ -601,8 +584,6 @@ defmodule Pleroma.Web.Router do
pipe_through(:api)
get("/accounts/search", SearchController, :account_search)
- get("/search", SearchController, :search)
-
get("/accounts/lookup", AccountController, :lookup)
get("/accounts/:id/statuses", AccountController, :statuses)
@@ -618,7 +599,6 @@ defmodule Pleroma.Web.Router do
get("/statuses", StatusController, :index)
get("/statuses/:id", StatusController, :show)
get("/statuses/:id/context", StatusController, :context)
- get("/statuses/:id/card", StatusController, :card)
get("/statuses/:id/favourited_by", StatusController, :favourited_by)
get("/statuses/:id/reblogged_by", StatusController, :reblogged_by)
diff --git a/lib/pleroma/web/shout_channel.ex b/lib/pleroma/web/shout_channel.ex
deleted file mode 100644
index 17caecb1a..000000000
--- a/lib/pleroma/web/shout_channel.ex
+++ /dev/null
@@ -1,59 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ShoutChannel do
- use Phoenix.Channel
-
- alias Pleroma.User
- alias Pleroma.Web.MastodonAPI.AccountView
- alias Pleroma.Web.ShoutChannel.ShoutChannelState
-
- def join("chat:public", _message, socket) do
- send(self(), :after_join)
- {:ok, socket}
- end
-
- def handle_info(:after_join, socket) do
- push(socket, "messages", %{messages: ShoutChannelState.messages()})
- {:noreply, socket}
- end
-
- def handle_in("new_msg", %{"text" => text}, %{assigns: %{user_name: user_name}} = socket) do
- text = String.trim(text)
-
- if String.length(text) in 1..Pleroma.Config.get([:shout, :limit]) do
- author = User.get_cached_by_nickname(user_name)
- author_json = AccountView.render("show.json", user: author, skip_visibility_check: true)
-
- message = ShoutChannelState.add_message(%{text: text, author: author_json})
-
- broadcast!(socket, "new_msg", message)
- end
-
- {:noreply, socket}
- end
-end
-
-defmodule Pleroma.Web.ShoutChannel.ShoutChannelState do
- use Agent
-
- @max_messages 20
-
- def start_link(_) do
- Agent.start_link(fn -> %{max_id: 1, messages: []} end, name: __MODULE__)
- end
-
- def add_message(message) do
- Agent.get_and_update(__MODULE__, fn state ->
- id = state[:max_id] + 1
- message = Map.put(message, "id", id)
- messages = [message | state[:messages]] |> Enum.take(@max_messages)
- {message, %{max_id: id, messages: messages}}
- end)
- end
-
- def messages do
- Agent.get(__MODULE__, fn state -> state[:messages] |> Enum.reverse() end)
- end
-end
diff --git a/lib/pleroma/web/streamer.ex b/lib/pleroma/web/streamer.ex
index fc3bbb130..9a4ac1317 100644
--- a/lib/pleroma/web/streamer.ex
+++ b/lib/pleroma/web/streamer.ex
@@ -6,7 +6,6 @@ defmodule Pleroma.Web.Streamer do
require Logger
alias Pleroma.Activity
- alias Pleroma.Chat.MessageReference
alias Pleroma.Config
alias Pleroma.Conversation.Participation
alias Pleroma.Notification
@@ -25,7 +24,7 @@ defmodule Pleroma.Web.Streamer do
def registry, do: @registry
@public_streams ["public", "public:local", "public:media", "public:local:media"]
- @user_streams ["user", "user:notification", "direct", "user:pleroma_chat"]
+ @user_streams ["user", "user:notification", "direct"]
@doc "Expands and authorizes a stream, and registers the process for streaming."
@spec get_topic_and_add_socket(
@@ -241,19 +240,6 @@ defp do_stream(topic, %Notification{} = item)
end)
end
- defp do_stream(topic, {user, %MessageReference{} = cm_ref})
- when topic in ["user", "user:pleroma_chat"] do
- topic = "#{topic}:#{user.id}"
-
- text = StreamerView.render("chat_update.json", %{chat_message_reference: cm_ref})
-
- Registry.dispatch(@registry, topic, fn list ->
- Enum.each(list, fn {pid, _auth} ->
- send(pid, {:text, text})
- end)
- end)
- end
-
defp do_stream("user", item) do
Logger.debug("Trying to push to users")
diff --git a/lib/pleroma/web/templates/masto_fe/index.html.eex b/lib/pleroma/web/templates/masto_fe/index.html.eex
index 6f2b98957..dadf8f413 100644
--- a/lib/pleroma/web/templates/masto_fe/index.html.eex
+++ b/lib/pleroma/web/templates/masto_fe/index.html.eex
@@ -11,22 +11,22 @@
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
+
diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex
index 7706035e9..de2e4d1e9 100644
--- a/lib/pleroma/web/views/streamer_view.ex
+++ b/lib/pleroma/web/views/streamer_view.ex
@@ -51,29 +51,6 @@ def render("update.json", %Activity{} = activity) do
|> Jason.encode!()
end
- def render("chat_update.json", %{chat_message_reference: cm_ref}) do
- # Explicitly giving the cmr for the object here, so we don't accidentally
- # send a later 'last_message' that was inserted between inserting this and
- # streaming it out
- #
- # It also contains the chat with a cache of the correct unread count
- Logger.debug("Trying to stream out #{inspect(cm_ref)}")
-
- representation =
- Pleroma.Web.PleromaAPI.ChatView.render(
- "show.json",
- %{last_message: cm_ref, chat: cm_ref.chat}
- )
-
- %{
- event: "pleroma:chat_update",
- payload:
- representation
- |> Jason.encode!()
- }
- |> Jason.encode!()
- end
-
def render("follow_relationships_update.json", item) do
%{
event: "pleroma:follow_relationships_update",
diff --git a/lib/pleroma/web/web_finger.ex b/lib/pleroma/web/web_finger.ex
index 938fc09e3..b5f2cb72e 100644
--- a/lib/pleroma/web/web_finger.ex
+++ b/lib/pleroma/web/web_finger.ex
@@ -32,7 +32,13 @@ def host_meta do
def webfinger(resource, fmt) when fmt in ["XML", "JSON"] do
host = Pleroma.Web.Endpoint.host()
- regex = ~r/(acct:)?(?
[a-z0-9A-Z_\.-]+)@#{host}/
+
+ regex =
+ if webfinger_domain = Pleroma.Config.get([__MODULE__, :domain]) do
+ ~r/(acct:)?(?[a-z0-9A-Z_\.-]+)@(#{host}|#{webfinger_domain})/
+ else
+ ~r/(acct:)?(?[a-z0-9A-Z_\.-]+)@#{host}/
+ end
with %{"username" => username} <- Regex.named_captures(regex, resource),
%User{} = user <- User.get_cached_by_nickname(username) do
@@ -66,7 +72,7 @@ def represent_user(user, "JSON") do
{:ok, user} = User.ensure_keys_present(user)
%{
- "subject" => "acct:#{user.nickname}@#{Pleroma.Web.Endpoint.host()}",
+ "subject" => "acct:#{user.nickname}@#{domain()}",
"aliases" => gather_aliases(user),
"links" => gather_links(user)
}
@@ -88,12 +94,16 @@ def represent_user(user, "XML") do
:XRD,
%{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"},
[
- {:Subject, "acct:#{user.nickname}@#{Pleroma.Web.Endpoint.host()}"}
+ {:Subject, "acct:#{user.nickname}@#{domain()}"}
] ++ aliases ++ links
}
|> XmlBuilder.to_doc()
end
+ defp domain do
+ Pleroma.Config.get([__MODULE__, :domain]) || Pleroma.Web.Endpoint.host()
+ end
+
defp webfinger_from_xml(body) do
with {:ok, doc} <- XML.parse_document(body) do
subject = XML.string_from_xpath("//Subject", doc)
@@ -150,17 +160,15 @@ def get_template_from_xml(body) do
end
def find_lrdd_template(domain) do
- with {:ok, %{status: status, body: body}} when status in 200..299 <-
- HTTP.get("http://#{domain}/.well-known/host-meta") do
+ # WebFinger is restricted to HTTPS - https://tools.ietf.org/html/rfc7033#section-9.1
+ meta_url = "https://#{domain}/.well-known/host-meta"
+
+ with {:ok, %{status: status, body: body}} when status in 200..299 <- HTTP.get(meta_url) do
get_template_from_xml(body)
else
- _ ->
- with {:ok, %{body: body, status: status}} when status in 200..299 <-
- HTTP.get("https://#{domain}/.well-known/host-meta") do
- get_template_from_xml(body)
- else
- e -> {:error, "Can't find LRDD template: #{inspect(e)}"}
- end
+ error ->
+ Logger.warn("Can't find LRDD template in #{inspect(meta_url)}: #{inspect(error)}")
+ {:error, :lrdd_not_found}
end
end
@@ -174,7 +182,7 @@ defp get_address_from_domain(domain, encoded_account) when is_binary(domain) do
end
end
- defp get_address_from_domain(_, _), do: nil
+ defp get_address_from_domain(_, _), do: {:error, :webfinger_no_domain}
@spec finger(String.t()) :: {:ok, map()} | {:error, any()}
def finger(account) do
@@ -191,13 +199,11 @@ def finger(account) do
encoded_account = URI.encode("acct:#{account}")
with address when is_binary(address) <- get_address_from_domain(domain, encoded_account),
- response <-
+ {:ok, %{status: status, body: body, headers: headers}} when status in 200..299 <-
HTTP.get(
address,
[{"accept", "application/xrd+xml,application/jrd+json"}]
- ),
- {:ok, %{status: status, body: body, headers: headers}} when status in 200..299 <-
- response do
+ ) do
case List.keyfind(headers, "content-type", 0) do
{_, content_type} ->
case Plug.Conn.Utils.media_type(content_type) do
@@ -215,10 +221,9 @@ def finger(account) do
{:error, {:content_type, nil}}
end
else
- e ->
- Logger.debug(fn -> "Couldn't finger #{account}" end)
- Logger.debug(fn -> inspect(e) end)
- {:error, e}
+ error ->
+ Logger.debug("Couldn't finger #{account}: #{inspect(error)}")
+ error
end
end
end
diff --git a/lib/pleroma/workers/backup_worker.ex b/lib/pleroma/workers/backup_worker.ex
index 9b763b04b..66c5c3591 100644
--- a/lib/pleroma/workers/backup_worker.ex
+++ b/lib/pleroma/workers/backup_worker.ex
@@ -37,10 +37,7 @@ def perform(%Job{
backup_id |> Backup.get() |> Backup.process(),
{:ok, _job} <- schedule_deletion(backup),
:ok <- Backup.remove_outdated(backup),
- {:ok, _} <-
- backup
- |> Pleroma.Emails.UserEmail.backup_is_ready_email(admin_user_id)
- |> Pleroma.Emails.Mailer.deliver() do
+ :ok <- maybe_deliver_email(backup, admin_user_id) do
{:ok, backup}
end
end
@@ -51,4 +48,23 @@ def perform(%Job{args: %{"op" => "delete", "backup_id" => backup_id}}) do
nil -> :ok
end
end
+
+ defp has_email?(user) do
+ not is_nil(user.email) and user.email != ""
+ end
+
+ defp maybe_deliver_email(backup, admin_user_id) do
+ has_mailer = Pleroma.Config.get([Pleroma.Emails.Mailer, :enabled])
+ backup = backup |> Pleroma.Repo.preload(:user)
+
+ if has_email?(backup.user) and has_mailer do
+ backup
+ |> Pleroma.Emails.UserEmail.backup_is_ready_email(admin_user_id)
+ |> Pleroma.Emails.Mailer.deliver()
+
+ :ok
+ else
+ :ok
+ end
+ end
end
diff --git a/lib/pleroma/workers/receiver_worker.ex b/lib/pleroma/workers/receiver_worker.ex
index 69125dcd0..9c3d8d1c2 100644
--- a/lib/pleroma/workers/receiver_worker.ex
+++ b/lib/pleroma/workers/receiver_worker.ex
@@ -9,6 +9,12 @@ defmodule Pleroma.Workers.ReceiverWorker do
@impl Oban.Worker
def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do
- Federator.perform(:incoming_ap_doc, params)
+ with {:ok, res} <- Federator.perform(:incoming_ap_doc, params) do
+ {:ok, res}
+ else
+ {:error, :origin_containment_failed} -> {:discard, :origin_containment_failed}
+ {:error, {:reject, reason}} -> {:discard, reason}
+ e -> e
+ end
end
end
diff --git a/mix.exs b/mix.exs
index acb2b4b9a..c6bd0e28f 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("3.0.1"),
+ version: version("3.1.0"),
elixir: "~> 1.9",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
@@ -114,15 +114,15 @@ defp oauth_deps do
# Type `mix help deps` for examples and options.
defp deps do
[
- {:phoenix, "~> 1.5.5"},
- {:tzdata, "~> 1.0.3"},
- {:plug_cowboy, "~> 2.3"},
- {:phoenix_pubsub, "~> 2.0"},
- {:phoenix_ecto, "~> 4.0"},
+ {:phoenix, "~> 1.6.11"},
+ {:tzdata, "~> 1.1.1"},
+ {:plug_cowboy, "~> 2.5"},
+ {:phoenix_pubsub, "~> 2.1"},
+ {:phoenix_ecto, "~> 4.4"},
{:ecto_enum, "~> 1.4"},
- {:ecto_sql, "~> 3.6.2"},
- {:postgrex, ">= 0.15.5"},
- {:oban, "~> 2.3.4"},
+ {:ecto_sql, "~> 3.8.3"},
+ {:postgrex, ">= 0.16.3"},
+ {:oban, "~> 2.12.1"},
{:gettext,
git: "https://github.com/tusooa/gettext.git",
ref: "72fb2496b6c5280ed911bdc3756890e7f38a4808",
@@ -164,18 +164,6 @@ defp deps do
{:http_signatures, "~> 0.1.1"},
{:telemetry, "~> 0.3"},
{:poolboy, "~> 1.5"},
- {:prometheus, "~> 4.6"},
- {:prometheus_ex,
- git: "https://git.pleroma.social/pleroma/elixir-libraries/prometheus.ex.git",
- ref: "a4e9beb3c1c479d14b352fd9d6dd7b1f6d7deee5",
- override: true},
- {:prometheus_plugs, "~> 1.1"},
- {:prometheus_phoenix, "~> 1.3"},
- # Note: once `prometheus_phx` is integrated into `prometheus_phoenix`, remove the former:
- {:prometheus_phx,
- git: "https://git.pleroma.social/pleroma/elixir-libraries/prometheus-phx.git",
- branch: "no-logging"},
- {:prometheus_ecto, "~> 1.4"},
{:recon, "~> 2.5"},
{:quack, "~> 0.1.1"},
{:joken, "~> 2.0"},
@@ -194,7 +182,7 @@ defp deps do
{:restarter, path: "./restarter"},
{:majic, "~> 1.0"},
{:eblurhash, "~> 1.2.2"},
- {:open_api_spex, "~> 3.10"},
+ {:open_api_spex, "3.10.0"},
{:search_parser,
git: "https://github.com/FloatingGhost/pleroma-contrib-search-parser.git",
ref: "08971a81e68686f9ac465cfb6661d51c5e4e1e7f"},
diff --git a/mix.lock b/mix.lock
index 8cd6f8255..2d3c9f33e 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,11 +1,8 @@
%{
- "accept": {:hex, :accept, "0.3.5", "b33b127abca7cc948bbe6caa4c263369abf1347cfa9d8e699c6d214660f10cd1", [:rebar3], [], "hexpm", "11b18c220bcc2eab63b5470c038ef10eb6783bcb1fcdb11aa4137defa5ac1bb8"},
"base62": {:hex, :base62, "1.2.2", "85c6627eb609317b70f555294045895ffaaeb1758666ab9ef9ca38865b11e629", [:mix], [{:custom_base, "~> 0.2.1", [hex: :custom_base, repo: "hexpm", optional: false]}], "hexpm", "d41336bda8eaa5be197f1e4592400513ee60518e5b9f4dcf38f4b4dae6f377bb"},
- "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
- "bbcode": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/bbcode.git", "f2d267675e9a7e1ad1ea9beb4cc23382762b66c2", [ref: "v0.2.0"]},
"bbcode_pleroma": {:hex, :bbcode_pleroma, "0.2.0", "d36f5bca6e2f62261c45be30fa9b92725c0655ad45c99025cb1c3e28e25803ef", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "19851074419a5fedb4ef49e1f01b30df504bb5dbb6d6adfc135238063bebd1c3"},
- "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.0", "6cb662d5c1b0a8858801cf20997bd006e7016aa8c52959c9ef80e0f34fb60b7a", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "2c81d61d4f6ed0e5cf7bf27a9109b791ff216a1034b3d541327484f46dd43769"},
- "benchee": {:hex, :benchee, "1.0.1", "66b211f9bfd84bd97e6d1beaddf8fc2312aaabe192f776e8931cb0c16f53a521", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm", "3ad58ae787e9c7c94dd7ceda3b587ec2c64604563e049b2a0e8baafae832addb"},
+ "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.1", "5114d780459a04f2b4aeef52307de23de961b69e13a5cd98a911e39fda13f420", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "42182d5f46764def15bf9af83739e3bf4ad22661b1c34fc3e88558efced07279"},
+ "benchee": {:hex, :benchee, "1.1.0", "f3a43817209a92a1fade36ef36b86e1052627fd8934a8b937ac9ab3a76c43062", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.0", [hex: :statistex, repo: "hexpm", optional: false]}], "hexpm", "7da57d545003165a012b587077f6ba90b89210fd88074ce3c60ce239eb5e6d93"},
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"},
"cachex": {:hex, :cachex, "3.4.0", "868b2959ea4aeb328c6b60ff66c8d5123c083466ad3c33d3d8b5f142e13101fb", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "370123b1ab4fba4d2965fb18f87fd758325709787c8c5fce35b3fe80645ccbe5"},
"calendar": {:hex, :calendar, "1.0.0", "f52073a708528482ec33d0a171954ca610fe2bd28f1e871f247dc7f1565fa807", [:mix], [{:tzdata, "~> 0.5.20 or ~> 0.1.201603 or ~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "990e9581920c82912a5ee50e62ff5ef96da6b15949a2ee4734f935fdef0f0a6f"},
@@ -13,129 +10,110 @@
"castore": {:hex, :castore, "0.1.17", "ba672681de4e51ed8ec1f74ed624d104c0db72742ea1a5e74edbc770c815182f", [:mix], [], "hexpm", "d9844227ed52d26e7519224525cb6868650c272d4a3d327ce3ca5570c12163f9"},
"certifi": {:hex, :certifi, "2.9.0", "6f2a475689dd47f19fb74334859d460a2dc4e3252a3324bd2111b8f0429e7e21", [:rebar3], [], "hexpm", "266da46bdb06d6c6d35fde799bcb28d36d985d424ad7c08b5bb48f5b5cdd4641"},
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
- "comeonin": {:hex, :comeonin, "5.3.2", "5c2f893d05c56ae3f5e24c1b983c2d5dfb88c6d979c9287a76a7feb1e1d8d646", [:mix], [], "hexpm", "d0993402844c49539aeadb3fe46a3c9bd190f1ecf86b6f9ebd71957534c95f04"},
+ "comeonin": {:hex, :comeonin, "5.3.3", "2c564dac95a35650e9b6acfe6d2952083d8a08e4a89b93a481acb552b325892e", [:mix], [], "hexpm", "3e38c9c2cb080828116597ca8807bb482618a315bfafd98c90bc22a821cc84df"},
"concurrent_limiter": {:hex, :concurrent_limiter, "0.1.1", "43ae1dc23edda1ab03dd66febc739c4ff710d047bb4d735754909f9a474ae01c", [:mix], [{:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "53968ff238c0fbb4d7ed76ddb1af0be6f3b2f77909f6796e249e737c505a16eb"},
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
"cors_plug": {:hex, :cors_plug, "2.0.3", "316f806d10316e6d10f09473f19052d20ba0a0ce2a1d910ddf57d663dac402ae", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ee4ae1418e6ce117fc42c2ba3e6cbdca4e95ecd2fe59a05ec6884ca16d469aea"},
"cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"},
"cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
- "credo": {:hex, :credo, "1.6.4", "ddd474afb6e8c240313f3a7b0d025cc3213f0d171879429bf8535d7021d9ad78", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "c28f910b61e1ff829bffa056ef7293a8db50e87f2c57a9b5c3f57eee124536b7"},
- "crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"},
+ "credo": {:hex, :credo, "1.6.5", "330ca591c12244ab95498d8f47994c493064b2689febf1236d43d596b4f2261d", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "101de53e6907397c3246ccd2cc9b9f0d3fc0b7805b8e1c1c3d818471fc85bafd"},
"crypt": {:git, "https://github.com/msantos/crypt.git", "f75cd55325e33cbea198fb41fe41871392f8fb76", [ref: "f75cd55325e33cbea198fb41fe41871392f8fb76"]},
"custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"},
- "db_connection": {:hex, :db_connection, "2.4.0", "d04b1b73795dae60cead94189f1b8a51cc9e1f911c234cc23074017c43c031e5", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad416c21ad9f61b3103d254a71b63696ecadb6a917b36f563921e0de00d7d7c8"},
+ "db_connection": {:hex, :db_connection, "2.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"},
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
"deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
- "earmark": {:hex, :earmark, "1.4.18", "618c4ff1563450d1832b7fb41dc6755e470f91a6fd4c70f350a58b14f64a7db8", [:mix], [{:earmark_parser, ">= 1.4.17", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "57ac3b6da3958ed09c669a9b159e86377fcccda56bacde8a209fa4dcdef52560"},
- "earmark_parser": {:hex, :earmark_parser, "1.4.17", "6f3c7e94170377ba45241d394389e800fb15adc5de51d0a3cd52ae766aafd63f", [:mix], [], "hexpm", "f93ac89c9feca61c165b264b5837bf82344d13bebc634cd575cb711e2e342023"},
+ "earmark": {:hex, :earmark, "1.4.26", "f0e3c3d5c278a6d448ad8c27ab0ecdec9c57a7710553138c56af220a6330a4fd", [:mix], [{:earmark_parser, "~> 1.4.26", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "e1231882b56bece0692af33f0959f06c9cd580c2dc2ecb1dc9f16f2750fa78c5"},
+ "earmark_parser": {:hex, :earmark_parser, "1.4.26", "f4291134583f373c7d8755566122908eb9662df4c4b63caa66a0eabe06569b0a", [:mix], [], "hexpm", "48d460899f8a0c52c5470676611c01f64f3337bad0b26ddab43648428d94aabc"},
"eblurhash": {:hex, :eblurhash, "1.2.2", "7da4255aaea984b31bb71155f673257353b0e0554d0d30dcf859547e74602582", [:rebar3], [], "hexpm", "8c20ca00904de023a835a9dcb7b7762fed32264c85a80c3cafa85288e405044c"},
- "ecto": {:hex, :ecto, "3.6.2", "efdf52acfc4ce29249bab5417415bd50abd62db7b0603b8bab0d7b996548c2bc", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "efad6dfb04e6f986b8a3047822b0f826d9affe8e4ebdd2aeedbfcb14fd48884e"},
+ "ecto": {:hex, :ecto, "3.8.4", "e06b8b87e62b27fea17fd2ff6041572ddd10339fd16cdf58446e402c6c90a74b", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f9244288b8d42db40515463a008cf3f4e0e564bb9c249fe87bf28a6d79fe82d4"},
"ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"},
"ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.4", "5d43fd088d39a158c860b17e8d210669587f63ec89ea122a4654861c8c6e2db4", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.15.7", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "311db02f1b772e3d0dc7f56a05044b5e1499d78ed6abf38885e1ca70059449e5"},
- "ecto_sql": {:hex, :ecto_sql, "3.6.2", "9526b5f691701a5181427634c30655ac33d11e17e4069eff3ae1176c764e0ba3", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.6.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5ec9d7e6f742ea39b63aceaea9ac1d1773d574ea40df5a53ef8afbd9242fdb6b"},
- "eimp": {:hex, :eimp, "1.0.14", "fc297f0c7e2700457a95a60c7010a5f1dcb768a083b6d53f49cd94ab95a28f22", [:rebar3], [{:p1_utils, "1.0.18", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "501133f3112079b92d9e22da8b88bf4f0e13d4d67ae9c15c42c30bd25ceb83b6"},
+ "ecto_sql": {:hex, :ecto_sql, "3.8.3", "a7d22c624202546a39d615ed7a6b784580391e65723f2d24f65941b4dd73d471", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.8.4", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "348cb17fb9e6daf6f251a87049eafcb57805e2892e5e6a0f5dea0985d367329b"},
"elasticsearch": {:git, "https://akkoma.dev/AkkomaGang/elasticsearch-elixir.git", "6cd946f75f6ab9042521a009d1d32d29a90113ca", [ref: "main"]},
- "elastix": {:hex, :elastix, "0.10.0", "7567da885677ba9deffc20063db5f3ca8cd10f23cff1ab3ed9c52b7063b7e340", [:mix], [{:httpoison, "~> 1.4", [hex: :httpoison, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0", [hex: :poison, repo: "hexpm", optional: true]}, {:retry, "~> 0.8", [hex: :retry, repo: "hexpm", optional: false]}], "hexpm", "5fb342ce068b20f7845f5dd198c2dc80d967deafaa940a6e51b846db82696d1d"},
- "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"},
- "esshd": {:hex, :esshd, "0.1.1", "d4dd4c46698093a40a56afecce8a46e246eb35463c457c246dacba2e056f31b5", [:mix], [], "hexpm", "d73e341e3009d390aa36387dc8862860bf9f874c94d9fd92ade2926376f49981"},
+ "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
"eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"},
- "ex2ms": {:hex, :ex2ms, "1.5.0", "19e27f9212be9a96093fed8cdfbef0a2b56c21237196d26760f11dfcfae58e97", [:mix], [], "hexpm"},
"ex_aws": {:hex, :ex_aws, "2.1.9", "dc4865ecc20a05190a34a0ac5213e3e5e2b0a75a0c2835e923ae7bfeac5e3c31", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "3e6c776703c9076001fbe1f7c049535f042cb2afa0d2cbd3b47cbc4e92ac0d10"},
- "ex_aws_s3": {:hex, :ex_aws_s3, "2.2.0", "07a09de557070320e264893c0acc8a1d2e7ddf80155736e0aed966486d1988e6", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "15175c613371e29e1f88b78ec8a4327389ca1ec5b34489744b175727496b21bd"},
+ "ex_aws_s3": {:hex, :ex_aws_s3, "2.3.3", "61412e524616ea31d3f31675d8bc4c73f277e367dee0ae8245610446f9b778aa", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "0044f0b6f9ce925666021eafd630de64c2b3404d79c85245cc7c8a9a32d7f104"},
"ex_const": {:hex, :ex_const, "0.2.4", "d06e540c9d834865b012a17407761455efa71d0ce91e5831e86881b9c9d82448", [:mix], [], "hexpm", "96fd346610cc992b8f896ed26a98be82ac4efb065a0578f334a32d60a3ba9767"},
- "ex_doc": {:hex, :ex_doc, "0.24.2", "e4c26603830c1a2286dae45f4412a4d1980e1e89dc779fcd0181ed1d5a05c8d9", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "e134e1d9e821b8d9e4244687fb2ace58d479b67b282de5158333b0d57c6fb7da"},
+ "ex_doc": {:hex, :ex_doc, "0.28.4", "001a0ea6beac2f810f1abc3dbf4b123e9593eaa5f00dd13ded024eae7c523298", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bf85d003dd34911d89c8ddb8bda1a958af3471a274a4c2150a9c01c78ac3f8ed"},
"ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"},
"ex_syslogger": {:hex, :ex_syslogger, "1.5.2", "72b6aa2d47a236e999171f2e1ec18698740f40af0bd02c8c650bf5f1fd1bac79", [:mix], [{:poison, ">= 1.5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:syslog, "~> 1.1.0", [hex: :syslog, repo: "hexpm", optional: false]}], "hexpm", "ab9fab4136dbc62651ec6f16fa4842f10cf02ab4433fa3d0976c01be99398399"},
"excoveralls": {:hex, :excoveralls, "0.12.3", "2142be7cb978a3ae78385487edda6d1aff0e482ffc6123877bb7270a8ffbcfe0", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "568a3e616c264283f5dea5b020783ae40eef3f7ee2163f7a67cbd7b35bcadada"},
"fast_html": {:hex, :fast_html, "2.0.5", "c61760340606c1077ff1f196f17834056cb1dd3d5cb92a9f2cabf28bc6221c3c", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}], "hexpm", "605f4f4829443c14127694ebabb681778712ceecb4470ec32aa31012330e6506"},
- "fast_sanitize": {:hex, :fast_sanitize, "0.2.2", "3cbbaebaea6043865dfb5b4ecb0f1af066ad410a51470e353714b10c42007b81", [:mix], [{:fast_html, "~> 2.0", [hex: :fast_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "69f204db9250afa94a0d559d9110139850f57de2b081719fbafa1e9a89e94466"},
+ "fast_sanitize": {:hex, :fast_sanitize, "0.2.3", "67b93dfb34e302bef49fec3aaab74951e0f0602fd9fa99085987af05bd91c7a5", [:mix], [{:fast_html, "~> 2.0", [hex: :fast_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "e8ad286d10d0386e15d67d0ee125245ebcfbc7d7290b08712ba9013c8c5e56e2"},
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"finch": {:hex, :finch, "0.10.2", "9ad27d68270d879f73f26604bb2e573d40f29bf0e907064a9a337f90a16a0312", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dd8b11b282072cec2ef30852283949c248bd5d2820c88d8acc89402b81db7550"},
"flake_id": {:hex, :flake_id, "0.1.0", "7716b086d2e405d09b647121a166498a0d93d1a623bead243e1f74216079ccb3", [:mix], [{:base62, "~> 1.2", [hex: :base62, repo: "hexpm", optional: false]}, {:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "31fc8090fde1acd267c07c36ea7365b8604055f897d3a53dd967658c691bd827"},
- "floki": {:hex, :floki, "0.30.1", "75d35526d3a1459920b6e87fdbc2e0b8a3670f965dd0903708d2b267e0904c55", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "e9c03524447d1c4cbfccd672d739b8c18453eee377846b119d4fd71b1a176bb8"},
+ "floki": {:hex, :floki, "0.33.1", "f20f1eb471e726342b45ccb68edb9486729e7df94da403936ea94a794f072781", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "461035fd125f13fdf30f243c85a0b1e50afbec876cbf1ceefe6fddd2e6d712c6"},
"gen_smtp": {:hex, :gen_smtp, "0.15.0", "9f51960c17769b26833b50df0b96123605a8024738b62db747fece14eb2fbfcc", [:rebar3], [], "hexpm", "29bd14a88030980849c7ed2447b8db6d6c9278a28b11a44cafe41b791205440f"},
- "gen_stage": {:hex, :gen_stage, "0.14.3", "d0c66f1c87faa301c1a85a809a3ee9097a4264b2edf7644bf5c123237ef732bf", [:mix], [], "hexpm"},
- "gen_state_machine": {:hex, :gen_state_machine, "2.0.5", "9ac15ec6e66acac994cc442dcc2c6f9796cf380ec4b08267223014be1c728a95", [:mix], [], "hexpm"},
"gettext": {:git, "https://github.com/tusooa/gettext.git", "72fb2496b6c5280ed911bdc3756890e7f38a4808", [ref: "72fb2496b6c5280ed911bdc3756890e7f38a4808"]},
"gun": {:hex, :gun, "2.0.0-rc.2", "7c489a32dedccb77b6e82d1f3c5a7dadfbfa004ec14e322cdb5e579c438632d2", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}], "hexpm", "6b9d1eae146410d727140dbf8b404b9631302ecc2066d1d12f22097ad7d254fc"},
"hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~>2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"},
"hpax": {:hex, :hpax, "0.1.1", "2396c313683ada39e98c20a75a82911592b47e5c24391363343bde74f82396ca", [:mix], [], "hexpm", "0ae7d5a0b04a8a60caf7a39fcf3ec476f35cc2cc16c05abea730d3ce6ac6c826"},
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
- "html_sanitize_ex": {:hex, :html_sanitize_ex, "1.3.0", "f005ad692b717691203f940c686208aa3d8ffd9dd4bb3699240096a51fa9564e", [:mix], [{:mochiweb, "~> 2.15", [hex: :mochiweb, repo: "hexpm", optional: false]}], "hexpm"},
"http_signatures": {:hex, :http_signatures, "0.1.1", "ca7ebc1b61542b163644c8c3b1f0e0f41037d35f2395940d3c6c7deceab41fd8", [:mix], [], "hexpm", "cc3b8a007322cc7b624c0c15eec49ee58ac977254ff529a3c482f681465942a3"},
"httpoison": {:hex, :httpoison, "1.8.1", "df030d96de89dad2e9983f92b0c506a642d4b1f4a819c96ff77d12796189c63e", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "35156a6d678d6d516b9229e208942c405cf21232edd632327ecfaf4fd03e79e0"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"inet_cidr": {:hex, :inet_cidr, "1.0.4", "a05744ab7c221ca8e395c926c3919a821eb512e8f36547c062f62c4ca0cf3d6e", [:mix], [], "hexpm", "64a2d30189704ae41ca7dbdd587f5291db5d1dda1414e0774c29ffc81088c1bc"},
"jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"},
- "joken": {:hex, :joken, "2.3.0", "62a979c46f2c81dcb8ddc9150453b60d3757d1ac393c72bb20fc50a7b0827dc6", [:mix], [{:jose, "~> 1.10", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "57b263a79c0ec5d536ac02d569c01e6b4de91bd1cb825625fe90eab4feb7bc1e"},
- "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"},
+ "joken": {:hex, :joken, "2.5.0", "09be497d804b8115eb6f07615cef2e60c2a1008fb89dc0aef0d4c4b4609b99aa", [:mix], [{:jose, "~> 1.11.2", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "22b25c89617c5ed8ca7b31026340a25ea0f9ca7160f9706b79be9ed81fdf74e7"},
+ "jose": {:hex, :jose, "1.11.2", "f4c018ccf4fdce22c71e44d471f15f723cb3efab5d909ab2ba202b5bf35557b3", [:mix, :rebar3], [], "hexpm", "98143fbc48d55f3a18daba82d34fe48959d44538e9697c08f34200fa5f0947d2"},
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
- "libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
"linkify": {:git, "https://akkoma.dev/AkkomaGang/linkify.git", "2567e2c1073fa371fd26fd66dfa5bc77b6919c16", [branch: "bugfix/line-ending-buffer"]},
"majic": {:hex, :majic, "1.0.0", "37e50648db5f5c2ff0c9fb46454d034d11596c03683807b9fb3850676ffdaab3", [:make, :mix], [{:elixir_make, "~> 0.6.1", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "7905858f76650d49695f14ea55cd9aaaee0c6654fa391671d4cf305c275a0a9e"},
- "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"},
- "makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"},
+ "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
+ "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
"meck": {:hex, :meck, "0.9.2", "85ccbab053f1db86c7ca240e9fc718170ee5bda03810a6292b5306bf31bae5f5", [:rebar3], [], "hexpm", "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
"mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
- "mint": {:hex, :mint, "1.4.1", "49b3b6ea35a9a38836d2ad745251b01ca9ec062f7cb66f546bf22e6699137126", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "cd261766e61011a9079cccf8fa9d826e7a397c24fbedf0e11b49312bea629b58"},
- "mochiweb": {:hex, :mochiweb, "2.18.0", "eb55f1db3e6e960fac4e6db4e2db9ec3602cc9f30b86cd1481d56545c3145d2e", [:rebar3], [], "hexpm"},
+ "mint": {:hex, :mint, "1.4.2", "50330223429a6e1260b2ca5415f69b0ab086141bc76dc2fbf34d7c389a6675b2", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "ce75a5bbcc59b4d7d8d70f8b2fc284b1751ffb35c7b6a6302b5192f8ab4ddd80"},
"mock": {:hex, :mock, "0.3.7", "75b3bbf1466d7e486ea2052a73c6e062c6256fb429d6797999ab02fa32f29e03", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "4da49a4609e41fd99b7836945c26f373623ea968cfb6282742bcb94440cf7e5c"},
- "mogrify": {:hex, :mogrify, "0.9.1", "a26f107c4987477769f272bd0f7e3ac4b7b75b11ba597fd001b877beffa9c068", [:mix], [], "hexpm", "134edf189337d2125c0948bf0c228fdeef975c594317452d536224069a5b7f05"},
- "mox": {:hex, :mox, "1.0.0", "4b3c7005173f47ff30641ba044eb0fe67287743eec9bd9545e37f3002b0a9f8b", [:mix], [], "hexpm", "201b0a20b7abdaaab083e9cf97884950f8a30a1350a1da403b3145e213c6f4df"},
- "myhtmlex": {:git, "https://git.pleroma.social/pleroma/myhtmlex.git", "ad0097e2f61d4953bfef20fb6abddf23b87111e6", [ref: "ad0097e2f61d4953bfef20fb6abddf23b87111e6", submodules: true]},
+ "mogrify": {:hex, :mogrify, "0.9.2", "b360984adea7dd6a55f18028e6327973c58de7f548fdb86c9859848aa904d5b0", [:mix], [], "hexpm", "c18d10fd70ca20e2585301616c89f6e4f7159d92efc9cc8ee579e00c886f699d"},
+ "mox": {:hex, :mox, "1.0.2", "dc2057289ac478b35760ba74165b4b3f402f68803dd5aecd3bfd19c183815d64", [:mix], [], "hexpm", "f9864921b3aaf763c8741b5b8e6f908f44566f1e427b2630e89e9a73b981fef2"},
"nimble_options": {:hex, :nimble_options, "0.4.0", "c89babbab52221a24b8d1ff9e7d838be70f0d871be823165c94dd3418eea728f", [:mix], [], "hexpm", "e6701c1af326a11eea9634a3b1c62b475339ace9456c1a23ec3bc9a847bca02d"},
- "nimble_parsec": {:hex, :nimble_parsec, "1.2.0", "b44d75e2a6542dcb6acf5d71c32c74ca88960421b6874777f79153bbbbd7dccc", [:mix], [], "hexpm", "52b2871a7515a5ac49b00f214e4165a40724cf99798d8e4a65e4fd64ebd002c1"},
+ "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
"nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
- "nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]},
- "oban": {:hex, :oban, "2.3.4", "ec7509b9af2524d55f529cb7aee93d36131ae0bf0f37706f65d2fe707f4d9fd8", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c70ca0434758fd1805422ea4446af5e910ddc697c0c861549c8f0eb0cfbd2fdf"},
+ "oban": {:hex, :oban, "2.12.1", "f604d7e6a8be9fda4a9b0f6cebbd633deba569f85dbff70c4d25d99a6f023177", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b1844c2b74e0d788b73e5144b0c9d5674cb775eae29d88a36f3c3b48d42d058"},
"open_api_spex": {:hex, :open_api_spex, "3.10.0", "94e9521ad525b3fcf6dc77da7c45f87fdac24756d4de588cb0816b413e7c1844", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.1", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "2dbb2bde3d2b821f06936e8dfaf3284331186556291946d84eeba3750ac28765"},
- "p1_utils": {:hex, :p1_utils, "1.0.18", "3fe224de5b2e190d730a3c5da9d6e8540c96484cf4b4692921d1e28f0c32b01c", [:rebar3], [], "hexpm", "1fc8773a71a15553b179c986b22fbeead19b28fe486c332d4929700ffeb71f88"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
- "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "1.2.1", "9cbe354b58121075bd20eb83076900a3832324b7dd171a6895fab57b6bb2752c", [:mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}], "hexpm", "d3b40a4a4630f0b442f19eca891fcfeeee4c40871936fed2f68e1c4faa30481f"},
- "phoenix": {:hex, :phoenix, "1.5.9", "a6368d36cfd59d917b37c44386e01315bc89f7609a10a45a22f47c007edf2597", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7e4bce20a67c012f1fbb0af90e5da49fa7bf0d34e3a067795703b74aef75427d"},
- "phoenix_ecto": {:hex, :phoenix_ecto, "4.2.1", "13f124cf0a3ce0f1948cf24654c7b9f2347169ff75c1123f44674afee6af3b03", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "478a1bae899cac0a6e02be1deec7e2944b7754c04e7d4107fc5a517f877743c0"},
- "phoenix_html": {:hex, :phoenix_html, "3.1.0", "0b499df05aad27160d697a9362f0e89fa0e24d3c7a9065c2bd9d38b4d1416c09", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "0c0a98a2cefa63433657983a2a594c7dee5927e4391e0f1bfd3a151d1def33fc"},
- "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.6.2", "0769470265eb13af01b5001b29cb935f4710d6adaa1ffc18417a570a337a2f0f", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.3", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.17.1", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "5bc6c6b38a2ca8b5020b442322fcee6afd5e641637a0b1fb059d4bd89bc58e7b"},
- "phoenix_live_view": {:hex, :phoenix_live_view, "0.17.5", "63f52a6f9f6983f04e424586ff897c016ecc5e4f8d1e2c22c2887af1c57215d8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.5.9 or ~> 1.6.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c5586e6a3d4df71b8214c769d4f5eb8ece2b4001711a7ca0f97323c36958b0e3"},
- "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"},
- "phoenix_swoosh": {:hex, :phoenix_swoosh, "0.3.3", "039435dd975f7e55953525b88f1d596f26c6141412584c16f4db109708a8ee68", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.0", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "4a540cea32e05356541737033d666ee7fea7700eb2101bf76783adbfe06601cd"},
+ "phoenix": {:hex, :phoenix, "1.6.11", "29f3c0fd12fa1fc4d4b05e341578e55bc78d96ea83a022587a7e276884d397e4", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1664e34f80c25ea4918fbadd957f491225ef601c0e00b4e644b1a772864bfbc2"},
+ "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
+ "phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"},
+ "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.6.5", "1495bb014be12c9a9252eca04b9af54246f6b5c1e4cd1f30210cd00ec540cf8e", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.3", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.17.7", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "ef4fa50dd78364409039c99cf6f98ab5209b4c5f8796c17f4db118324f0db852"},
+ "phoenix_live_view": {:hex, :phoenix_live_view, "0.17.11", "205f6aa5405648c76f2abcd57716f42fc07d8f21dd8ea7b262dd12b324b50c95", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7177791944b7f90ed18f5935a6a5f07f760b36f7b3bdfb9d28c57440a3c43f99"},
+ "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
+ "phoenix_swoosh": {:hex, :phoenix_swoosh, "0.3.4", "615f8f393135de7e0cbb4bd00ba238b1e0cd324b0d90efbaee613c2f02ca5e5c", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.0", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "3971221846232021ab5e3c7489fd62ec5bfd6a2e01cae10a317ccf6fb350571c"},
+ "phoenix_view": {:hex, :phoenix_view, "1.1.2", "1b82764a065fb41051637872c7bd07ed2fdb6f5c3bd89684d4dca6e10115c95a", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "7ae90ad27b09091266f6adbb61e1d2516a7c3d7062c6789d46a7554ec40f3a56"},
"plug": {:hex, :plug, "1.10.4", "41eba7d1a2d671faaf531fa867645bd5a3dce0957d8e2a3f398ccff7d2ef017f", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad1e233fe73d2eec56616568d260777b67f53148a999dc2d048f4eb9778fe4a0"},
- "plug_cowboy": {:hex, :plug_cowboy, "2.5.0", "51c998f788c4e68fc9f947a5eba8c215fbb1d63a520f7604134cab0270ea6513", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5b2c8925a5e2587446f33810a58c01e66b3c345652eeec809b76ba007acde71a"},
+ "plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"},
"plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"},
"plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"},
"poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"},
- "postgrex": {:hex, :postgrex, "0.15.9", "46f8fe6f25711aeb861c4d0ae09780facfdf3adbd2fb5594ead61504dd489bda", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "610719103e4cb2223d4ab78f9f0f3e720320eeca6011415ab4137ddef730adee"},
- "pot": {:hex, :pot, "1.0.1", "81b511b1fa7c3123171c265cb7065a1528cebd7277b0cbc94257c50a8b2e4c17", [:rebar3], [], "hexpm", "ed87f5976531d91528452faa1138a5328db7f9f20d8feaae15f5051f79bcfb6d"},
- "prometheus": {:hex, :prometheus, "4.8.0", "1ce1e1002b173c336d61f186b56263346536e76814edd9a142e12aeb2d6c1ad2", [:mix, :rebar3], [], "hexpm", "0fc2e17103073edb3758a46a5d44b006191bf25b73cbaa2b779109de396afcb5"},
- "prometheus_ecto": {:hex, :prometheus_ecto, "1.4.3", "3dd4da1812b8e0dbee81ea58bb3b62ed7588f2eae0c9e97e434c46807ff82311", [:mix], [{:ecto, "~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.1 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}], "hexpm", "8d66289f77f913b37eda81fd287340c17e61a447549deb28efc254532b2bed82"},
- "prometheus_ex": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/prometheus.ex.git", "a4e9beb3c1c479d14b352fd9d6dd7b1f6d7deee5", [ref: "a4e9beb3c1c479d14b352fd9d6dd7b1f6d7deee5"]},
- "prometheus_phoenix": {:hex, :prometheus_phoenix, "1.3.0", "c4b527e0b3a9ef1af26bdcfbfad3998f37795b9185d475ca610fe4388fdd3bb5", [:mix], [{:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.3 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}], "hexpm", "c4d1404ac4e9d3d963da601db2a7d8ea31194f0017057fabf0cfb9bf5a6c8c75"},
- "prometheus_phx": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/prometheus-phx.git", "9cd8f248c9381ffedc799905050abce194a97514", [branch: "no-logging"]},
- "prometheus_plugs": {:hex, :prometheus_plugs, "1.1.5", "25933d48f8af3a5941dd7b621c889749894d8a1082a6ff7c67cc99dec26377c5", [:mix], [{:accept, "~> 0.1", [hex: :accept, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.1 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}, {:prometheus_process_collector, "~> 1.1", [hex: :prometheus_process_collector, repo: "hexpm", optional: true]}], "hexpm", "0273a6483ccb936d79ca19b0ab629aef0dba958697c94782bb728b920dfc6a79"},
+ "postgrex": {:hex, :postgrex, "0.16.3", "fac79a81a9a234b11c44235a4494d8565303fa4b9147acf57e48978a074971db", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "aeaae1d2d1322da4e5fe90d241b0a564ce03a3add09d7270fb85362166194590"},
+ "pot": {:hex, :pot, "1.0.2", "13abb849139fdc04ab8154986abbcb63bdee5de6ed2ba7e1713527e33df923dd", [:rebar3], [], "hexpm", "78fe127f5a4f5f919d6ea5a2a671827bd53eb9d37e5b4128c0ad3df99856c2e0"},
"quack": {:hex, :quack, "0.1.1", "cca7b4da1a233757fdb44b3334fce80c94785b3ad5a602053b7a002b5a8967bf", [:mix], [{:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2.0", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "d736bfa7444112eb840027bb887832a0e403a4a3437f48028c3b29a2dbbd2543"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
- "recon": {:hex, :recon, "2.5.1", "430ffa60685ac1efdfb1fe4c97b8767c92d0d92e6e7c3e8621559ba77598678a", [:mix, :rebar3], [], "hexpm", "5721c6b6d50122d8f68cccac712caa1231f97894bab779eff5ff0f886cb44648"},
+ "recon": {:hex, :recon, "2.5.2", "cba53fa8db83ad968c9a652e09c3ed7ddcc4da434f27c3eaa9ca47ffb2b1ff03", [:mix, :rebar3], [], "hexpm", "2c7523c8dee91dff41f6b3d63cba2bd49eb6d2fe5bf1eec0df7f87eb5e230e1c"},
"remote_ip": {:git, "https://git.pleroma.social/pleroma/remote_ip.git", "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8", [ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"]},
- "retry": {:hex, :retry, "0.15.0", "ba6aaeba92905a396c18c299a07e638947b2ba781e914f803202bc1b9ae867c3", [:mix], [], "hexpm", "93d3310bce78c0a30cc94610684340a14adfc9136856a3f662e4d9ce6013c784"},
"search_parser": {:git, "https://github.com/FloatingGhost/pleroma-contrib-search-parser.git", "08971a81e68686f9ac465cfb6661d51c5e4e1e7f", [ref: "08971a81e68686f9ac465cfb6661d51c5e4e1e7f"]},
"sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
- "sweet_xml": {:hex, :sweet_xml, "0.7.2", "4729f997286811fabdd8288f8474e0840a76573051062f066c4b597e76f14f9f", [:mix], [], "hexpm", "6894e68a120f454534d99045ea3325f7740ea71260bc315f82e29731d570a6e8"},
- "swoosh": {:hex, :swoosh, "1.3.11", "34f79c57f19892b43bd2168de9ff5de478a721a26328ef59567aad4243e7a77b", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "f1e2a048db454f9982b9cf840f75e7399dd48be31ecc2a7dc10012a803b913af"},
+ "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"},
+ "sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"},
+ "swoosh": {:hex, :swoosh, "1.7.3", "febb47c8c3ce76747eb9e3ea25ed694c815f72069127e3bb039b7724082ec670", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76abac313f95b6825baa8ceec269d597e8395950c928742fc6451d3456ca256d"},
"syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"},
"table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"},
"telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"},
"telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"},
"tesla": {:hex, :tesla, "1.4.4", "bb89aa0c9745190930366f6a2ac612cdf2d0e4d7fff449861baa7875afd797b2", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "d5503a49f9dec1b287567ea8712d085947e247cb11b06bc54adb05bfde466457"},
- "timex": {:hex, :timex, "3.7.5", "3eca56e23bfa4e0848f0b0a29a92fa20af251a975116c6d504966e8a90516dfd", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a15608dca680f2ef663d71c95842c67f0af08a0f3b1d00e17bbd22872e2874e4"},
+ "timex": {:hex, :timex, "3.7.8", "0e6e8bf7c0aba95f1e13204889b2446e7a5297b1c8e408f15ab58b2c8dc85f81", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8f3b8edc5faab5205d69e5255a1d64a83b190bab7f16baa78aefcb897cf81435"},
"trailing_format_plug": {:hex, :trailing_format_plug, "0.0.7", "64b877f912cf7273bed03379936df39894149e35137ac9509117e59866e10e45", [:mix], [{:plug, "> 0.12.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bd4fde4c15f3e993a999e019d64347489b91b7a9096af68b2bdadd192afa693f"},
- "tzdata": {:hex, :tzdata, "1.0.5", "69f1ee029a49afa04ad77801febaf69385f3d3e3d1e4b56b9469025677b89a28", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "55519aa2a99e5d2095c1e61cc74c9be69688f8ab75c27da724eb8279ff402a5a"},
- "ueberauth": {:hex, :ueberauth, "0.6.3", "d42ace28b870e8072cf30e32e385579c57b9cc96ec74fa1f30f30da9c14f3cc0", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "afc293d8a1140d6591b53e3eaf415ca92842cb1d32fad3c450c6f045f7f91b60"},
+ "tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"},
+ "ueberauth": {:hex, :ueberauth, "0.10.1", "6706b410ee6bd9d67eac983ed9dc7fdc1f06b18677d7b8ba71d5725e07cc8826", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bb715b562395c4cc26b2d8e637c6bb0eb8c67d50c0ea543c0f78f06b7e8efdb1"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
"unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"},
"vex": {:hex, :vex, "0.9.0", "613ea5eb3055662e7178b83e25b2df0975f68c3d8bb67c1645f0573e1a78d606", [:mix], [], "hexpm", "c69fff44d5c8aa3f1faee71bba1dcab05dd36364c5a629df8bb11751240c857f"},
diff --git a/priv/gettext/ca/LC_MESSAGES/config_descriptions.po b/priv/gettext/ca/LC_MESSAGES/config_descriptions.po
new file mode 100644
index 000000000..3a25f067e
--- /dev/null
+++ b/priv/gettext/ca/LC_MESSAGES/config_descriptions.po
@@ -0,0 +1,7086 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-07-28 09:35+0000\n"
+"PO-Revision-Date: 2022-08-08 15:48+0000\n"
+"Last-Translator: sola \n"
+"Language-Team: Catalan \n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.13.1\n"
+
+# # This file is a PO Template file.
+# #
+# # "msgid"s here are often extracted from source code.
+# # Add new translations manually only if they're dynamic
+# # translations that can't be statically extracted.
+# #
+# # Run "mix gettext.extract" to bring this file up to
+# # date. Leave "msgstr"s empty as changing them here has no
+# # effect: edit them in PO (.po) files instead.
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :esshd"
+msgid ""
+"Before enabling this you must add :esshd to mix.exs as one of the "
+"extra_applications and generate host keys in your priv dir with ssh-keygen -"
+"m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key"
+msgstr ""
+"Abans d'activar això has d'afegir :esshd a mix.exs com a una de les "
+"extra_applications i generar les claus del hoste en el teu directori priv "
+"amb ssh-keygen -m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger"
+msgid "Logger-related settings"
+msgstr "Configuració relacionada amb el registrador(Log)"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :mime"
+msgid "Mime Types settings"
+msgstr "Configuració de tipus Mime"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma"
+msgid ""
+"Allows setting a token that can be used to authenticate requests with admin "
+"privileges without a normal user account token. Append the `admin_token` "
+"parameter to requests to utilize it. (Please reconsider using HTTP Basic "
+"Auth or OAuth-based authentication if possible)"
+msgstr ""
+"Permet configurar un token que pot ser usat per a autenticar sol·licituds "
+"amb privilegis d'admin sense el token d'un usuari normal. Annexa el "
+"paràmetre `admin_token` a les sol·licituds per a utilitzar-lo. (Si us plau "
+"reconsidera usar HTTP Basic Auth o autenticació basada en OAuth si és "
+"possible)"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma"
+msgid "Authenticator"
+msgstr "Autenticador"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :quack"
+msgid "Quack-related settings"
+msgstr "Configuració relacionada amb Quack"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :cors_plug"
+msgid "CORS plug config"
+msgstr "configuració CORS plug"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :esshd"
+msgid "ESSHD"
+msgstr "ESSHD"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger"
+msgid "Logger"
+msgstr "Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime"
+msgid "Mime Types"
+msgstr "Tipus Mime"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma"
+msgid "Pleroma Admin Token"
+msgstr "Token d'Admin Akkoma"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma"
+msgid "Pleroma Authenticator"
+msgstr "Autenticador Akkoma"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :quack"
+msgid "Quack Logger"
+msgstr "Logger Quack"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:console"
+msgid "Console logger settings"
+msgstr "Ajustos de consola logger"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:ex_syslogger"
+msgid "ExSyslogger-related settings"
+msgstr "Ajustos relacionats amb ExSyslogger"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub"
+msgid "ActivityPub-related settings"
+msgstr "Ajusto relacionats amb ActivityPub"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:assets"
+msgid ""
+"This section configures assets to be used with various frontends. Currently "
+"the only option relates to mascots on the mastodon frontend"
+msgstr ""
+"Aquesta secció configura els assets per a ser usats en diversos frontends. "
+"Actualment l'única opció està relacionada amb les mascotes en el frontend "
+"mastodon"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:auth"
+msgid "Authentication / authorization settings"
+msgstr "Ajustos d' autenticació / autorització"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:connections_pool"
+msgid "Advanced settings for `Gun` connections pool"
+msgstr "Ajustos avançats per el grup de connexions `Gun`"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:email_notifications"
+msgid "Email notifications settings"
+msgstr "Configuració de notificacions per correu electrònic"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:features"
+msgid "Customizable features"
+msgstr "Característiques personalitzables"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:feed"
+msgid "Configure feed rendering"
+msgstr "Configurar el renderitzat del feed"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations"
+msgid ""
+"This form can be used to configure a keyword list that keeps the "
+"configuration data for any kind of frontend. By default, settings for "
+"pleroma_fe are configured. If you want to add your own configuration your "
+"settings all fields must be complete."
+msgstr ""
+"Aquest formulari es pot fer servir per a configurar un llistat de paraules "
+"clau per a qualsevol tipus de \"frontend\". Per defecte es configuren els de "
+"pleroma_fe. Si vols afegir la teva pròpia configuració i els teus ajustos, "
+"tots els camps han d'estar complets."
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends"
+msgid "Installed frontends management"
+msgstr "Gestió dels \"frontend\" instal·lats"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:gopher"
+msgid "Gopher settings"
+msgstr "Configuració Gopher"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools"
+msgid "Advanced settings for `Hackney` connections pools"
+msgstr "Configuració avançada per el grup de connexions `Hackney`"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http"
+msgid "HTTP settings"
+msgstr "Ajustos HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security"
+msgid "HTTP security settings"
+msgstr "Ajustos de seguretat HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance"
+msgid "Instance-related settings"
+msgstr "Configuració relacionada amb l'instància"
+
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instances_favicons"
+msgid "Control favicons for instances"
+msgstr "Control dels favicons per instàncies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap"
+msgid ""
+"Use LDAP for user authentication. When a user logs in to the Pleroma "
+"instance, the name and password will be verified by trying to authenticate "
+"(bind) to a LDAP server. If a user exists in the LDAP directory but there is "
+"no account with the same name yet on the Pleroma instance then a new Pleroma "
+"account will be created with the same name as the LDAP user name."
+msgstr ""
+"Use LDAP for user authentication. When a user logs in to the Pleroma "
+"instance, the name and password will be verified by trying to authenticate "
+"(bind) to a LDAP server. If a user exists in the LDAP directory but there is "
+"no account with the same name yet on the Pleroma instance then a new Pleroma "
+"account will be created with the same name as the LDAP user name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:majic_pool"
+msgid "Majic/libmagic configuration"
+msgstr "Majic/libmagic configuration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:manifest"
+msgid ""
+"This section describe PWA manifest instance-specific values. Currently this "
+"option relate only for MastoFE."
+msgstr ""
+"This section describe PWA manifest instance-specific values. Currently this "
+"option relate only for MastoFE."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Media preview proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Media proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:modules"
+msgid "Custom Runtime Modules"
+msgstr "Custom Runtime Modules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf"
+msgid "General MRF settings"
+msgstr "General MRF settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_activity_expiration"
+msgid "Adds automatic expiration to all local activities"
+msgstr "Adds automatic expiration to all local activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_follow_bot"
+msgid "Automatically follows newly discovered accounts."
+msgstr "Automatically follows newly discovered accounts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag"
+msgid ""
+"Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags "
+"(without the leading #)\n"
+"\n"
+"Note: This MRF Policy is always enabled, if you want to disable it you have "
+"to set empty lists.\n"
+msgstr ""
+"Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags "
+"(without the leading #)\n"
+"\n"
+"Note: This MRF Policy is always enabled, if you want to disable it you have "
+"to set empty lists.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread"
+msgid "Block messages with excessive user mentions"
+msgstr "Block messages with excessive user mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword"
+msgid ""
+"Reject or Word-Replace messages matching a keyword or [Regex](https://"
+"hexdocs.pm/elixir/Regex.html)."
+msgstr ""
+"Reject or Word-Replace messages matching a keyword or [Regex](https://"
+"hexdocs.pm/elixir/Regex.html)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention"
+msgid "Block messages which mention a specific user"
+msgstr "Block messages which mention a specific user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_normalize_markup"
+msgid "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+msgstr "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age"
+msgid ""
+"Rejects or delists posts based on their timestamp deviance from your "
+"server's clock."
+msgstr ""
+"Rejects or delists posts based on their timestamp deviance from your "
+"server's clock."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic"
+msgid "RejectNonPublic drops posts with non-public visibility settings."
+msgstr "RejectNonPublic drops posts with non-public visibility settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple"
+msgid "Simple ingress policies"
+msgstr "Simple ingress policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji"
+msgid "Steals emojis from selected instances when it sees them."
+msgstr "Steals emojis from selected instances when it sees them."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_subchain"
+msgid ""
+"This policy processes messages through an alternate pipeline when a given "
+"message matches certain criteria. All criteria are configured as a map of "
+"regular expressions to lists of policy modules."
+msgstr ""
+"This policy processes messages through an alternate pipeline when a given "
+"message matches certain criteria. All criteria are configured as a map of "
+"regular expressions to lists of policy modules."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary"
+msgid "Filter messages which belong to certain activity vocabularies"
+msgstr "Filter messages which belong to certain activity vocabularies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:oauth2"
+msgid "Configure OAuth 2 provider capabilities"
+msgstr "Configure OAuth 2 provider capabilities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools"
+msgid "Advanced settings for `Gun` workers pools"
+msgstr "Advanced settings for `Gun` workers pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table"
+msgid "`populate_hashtags_table` background migration settings"
+msgstr "`populate_hashtags_table` background migration settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit"
+msgid ""
+"Rate limit settings. This is an advanced feature enabled only for :"
+"authentication by default."
+msgstr ""
+"Rate limit settings. This is an advanced feature enabled only for :"
+"authentication by default."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated"
+msgid ""
+"Disallow viewing timelines, user profiles and statuses for unauthenticated "
+"users."
+msgstr ""
+"Disallow viewing timelines, user profiles and statuses for unauthenticated "
+"users."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rich_media"
+msgid ""
+"If enabled the instance will parse metadata from attached links to generate "
+"link previews"
+msgstr ""
+"If enabled the instance will parse metadata from attached links to generate "
+"link previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:shout"
+msgid "Pleroma shout settings"
+msgstr "Pleroma shout settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:static_fe"
+msgid ""
+"Render profiles and posts using server-generated HTML that is viewable "
+"without using JavaScript"
+msgstr ""
+"Render profiles and posts using server-generated HTML that is viewable "
+"without using JavaScript"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:streamer"
+msgid "Settings for notifications streamer"
+msgstr "Settings for notifications streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes"
+msgid "URI schemes related settings"
+msgstr "URI schemes related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl"
+msgid ""
+"The expiration time for the web responses cache. Values should be in "
+"milliseconds or `nil` to disable expiration."
+msgstr ""
+"The expiration time for the web responses cache. Values should be in "
+"milliseconds or `nil` to disable expiration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome"
+msgid "Welcome messages settings"
+msgstr "Welcome messages settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:workers"
+msgid "Includes custom worker options not interpretable directly by `Oban`"
+msgstr "Includes custom worker options not interpretable directly by `Oban`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter"
+msgid "Limits configuration for background tasks."
+msgstr "Limits configuration for background tasks."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban"
+msgid ""
+"[Oban](https://github.com/sorentwo/oban) asynchronous job processor "
+"configuration."
+msgstr ""
+"[Oban](https://github.com/sorentwo/oban) asynchronous job processor "
+"configuration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha"
+msgid "Captcha-related settings"
+msgstr "Captcha-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid ""
+"Kocaptcha is a very simple captcha service with a single API endpoint, the "
+"source code is here: https://github.com/koto-bank/kocaptcha. The default "
+"endpoint (https://captcha.kotobank.ch) is hosted by the developer."
+msgstr ""
+"Kocaptcha is a very simple captcha service with a single API endpoint, the "
+"source code is here: https://github.com/koto-bank/kocaptcha. The default "
+"endpoint (https://captcha.kotobank.ch) is hosted by the developer."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer"
+msgid "Mailer-related settings"
+msgstr "Mailer-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "New users admin email digest"
+msgstr "New users admin email digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Email template settings"
+msgstr "Email template settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter"
+msgid ""
+"Configuration for Pleroma's link formatter which parses mentions, hashtags, "
+"and URLs."
+msgstr ""
+"Configuration for Pleroma's link formatter which parses mentions, hashtags, "
+"and URLs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity"
+msgid "Scheduled activities settings"
+msgstr "Scheduled activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload"
+msgid "Upload general settings"
+msgstr "Upload general settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Filter replaces the filename of the upload"
+msgstr "Filter replaces the filename of the upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Uploads mogrify filter settings"
+msgstr "Uploads mogrify filter settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local"
+msgid "Local uploader-related settings"
+msgstr "Local uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3"
+msgid "S3 uploader-related settings"
+msgstr "S3 uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup"
+msgid "Account Backup"
+msgstr "Account Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "HTTP invalidate settings"
+msgstr "HTTP invalidate settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Invalidation script settings"
+msgstr "Invalidation script settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata"
+msgid "Metadata-related settings"
+msgstr "Metadata-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid ""
+"`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git."
+"pleroma.social/pleroma/remote_ip) but with runtime configuration.\n"
+"**If your instance is not behind at least one reverse proxy, you should not "
+"enable this plug.**\n"
+msgstr ""
+"`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git."
+"pleroma.social/pleroma/remote_ip) but with runtime configuration.\n"
+"**If your instance is not behind at least one reverse proxy, you should not "
+"enable this plug.**\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload"
+msgid "Preload-related settings"
+msgstr "Preload-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Expired activities settings"
+msgstr "Expired activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Prometheus app metrics endpoint configuration"
+msgstr "Prometheus app metrics endpoint configuration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details"
+msgid ""
+"Web Push Notifications configuration. You can use the mix task mix web_push."
+"gen.keypair to generate it."
+msgstr ""
+"Web Push Notifications configuration. You can use the mix task mix web_push."
+"gen.keypair to generate it."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :ex_aws-:s3"
+msgid "S3"
+msgstr "S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:console"
+msgid "Console Logger"
+msgstr "Console Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:ex_syslogger"
+msgid "ExSyslogger"
+msgstr "ExSyslogger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub"
+msgid "ActivityPub"
+msgstr "ActivityPub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:assets"
+msgid "Assets"
+msgstr "Assets"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:auth"
+msgid "Auth"
+msgstr "Auth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:connections_pool"
+msgid "Connections pool"
+msgstr "Connections pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:email_notifications"
+msgid "Email notifications"
+msgstr "Email notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:emoji"
+msgid "Emoji"
+msgstr "Emoji"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:features"
+msgid "Features"
+msgstr "Features"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:feed"
+msgid "Feed"
+msgstr "Feed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations"
+msgid "Frontend configurations"
+msgstr "Frontend configurations"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends"
+msgid "Frontends"
+msgstr "Frontends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:gopher"
+msgid "Gopher"
+msgstr "Gopher"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools"
+msgid "Hackney pools"
+msgstr "Hackney pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http"
+msgid "HTTP"
+msgstr "HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http_security"
+msgid "HTTP security"
+msgstr "HTTP security"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance"
+msgid "Instance"
+msgstr "Instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons"
+msgid "Instances favicons"
+msgstr "Instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap"
+msgid "LDAP"
+msgstr "LDAP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:majic_pool"
+msgid "Majic pool"
+msgstr "Majic pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:manifest"
+msgid "Manifest"
+msgstr "Manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:markup"
+msgid "Markup Settings"
+msgstr "Markup Settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Media preview proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Media proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:modules"
+msgid "Modules"
+msgstr "Modules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf"
+msgid "MRF"
+msgstr "MRF"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration"
+msgid "MRF Activity Expiration Policy"
+msgstr "MRF Activity Expiration Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot"
+msgid "MRF FollowBot Policy"
+msgstr "MRF FollowBot Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag"
+msgid "MRF Hashtag"
+msgstr "MRF Hashtag"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread"
+msgid "MRF Hellthread"
+msgstr "MRF Hellthread"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword"
+msgid "MRF Keyword"
+msgstr "MRF Keyword"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention"
+msgid "MRF Mention"
+msgstr "MRF Mention"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup"
+msgid "MRF Normalize Markup"
+msgstr "MRF Normalize Markup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age"
+msgid "MRF Object Age"
+msgstr "MRF Object Age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic"
+msgid "MRF Reject Non Public"
+msgstr "MRF Reject Non Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple"
+msgid "MRF Simple"
+msgstr "MRF Simple"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji"
+msgid "MRF Emojis"
+msgstr "MRF Emojis"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain"
+msgid "MRF Subchain"
+msgstr "MRF Subchain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary"
+msgid "MRF Vocabulary"
+msgstr "MRF Vocabulary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:oauth2"
+msgid "OAuth2"
+msgstr "OAuth2"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools"
+msgid "Pools"
+msgstr "Pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table"
+msgid "Populate hashtags table"
+msgstr "Populate hashtags table"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit"
+msgid "Rate limit"
+msgstr "Rate limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated"
+msgid "Restrict Unauthenticated"
+msgstr "Restrict Unauthenticated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rich_media"
+msgid "Rich media"
+msgstr "Rich media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:shout"
+msgid "Shout"
+msgstr "Shout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:static_fe"
+msgid "Static FE"
+msgstr "Static FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:streamer"
+msgid "Streamer"
+msgstr "Streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes"
+msgid "URI Schemes"
+msgstr "URI Schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:user"
+msgid "User"
+msgstr "User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl"
+msgid "Web cache TTL"
+msgstr "Web cache TTL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome"
+msgid "Welcome"
+msgstr "Welcome"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter"
+msgid "ConcurrentLimiter"
+msgstr "ConcurrentLimiter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban"
+msgid "Oban"
+msgstr "Oban"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha"
+msgid "Pleroma.Captcha"
+msgstr "Pleroma.Captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Pleroma.Captcha.Kocaptcha"
+msgstr "Pleroma.Captcha.Kocaptcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer"
+msgid "Pleroma.Emails.Mailer"
+msgstr "Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "Pleroma.Emails.NewUsersDigestEmail"
+msgstr "Pleroma.Emails.NewUsersDigestEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Pleroma.Emails.UserEmail"
+msgstr "Pleroma.Emails.UserEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter"
+msgid "Linkify"
+msgstr "Linkify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity"
+msgid "Pleroma.ScheduledActivity"
+msgstr "Pleroma.ScheduledActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload"
+msgid "Pleroma.Upload"
+msgstr "Pleroma.Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Pleroma.Upload.Filter.AnonymizeFilename"
+msgstr "Pleroma.Upload.Filter.AnonymizeFilename"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Pleroma.Upload.Filter.Mogrify"
+msgstr "Pleroma.Upload.Filter.Mogrify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local"
+msgid "Pleroma.Uploaders.Local"
+msgstr "Pleroma.Uploaders.Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3"
+msgid "Pleroma.Uploaders.S3"
+msgstr "Pleroma.Uploaders.S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User"
+msgid "Pleroma.User"
+msgstr "Pleroma.User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup"
+msgid "Pleroma.User.Backup"
+msgstr "Pleroma.User.Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate"
+msgid "Pleroma.Web.ApiSpec.CastAndValidate"
+msgstr "Pleroma.Web.ApiSpec.CastAndValidate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Http"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Http"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Script"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Script"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata"
+msgid "Pleroma.Web.Metadata"
+msgstr "Pleroma.Web.Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "Pleroma.Web.Plugs.RemoteIp"
+msgstr "Pleroma.Web.Plugs.RemoteIp"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload"
+msgid "Pleroma.Web.Preload"
+msgstr "Pleroma.Web.Preload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Pleroma.Workers.PurgeExpiredActivity"
+msgstr "Pleroma.Workers.PurgeExpiredActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Pleroma.Web.Endpoint.MetricsExporter"
+msgstr "Pleroma.Web.Endpoint.MetricsExporter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details"
+msgid "Vapid Details"
+msgstr "Vapid Details"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :esshd > :enabled"
+msgid "Enables SSH"
+msgstr "Enables SSH"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :esshd > :handler"
+msgid "Handler module"
+msgstr "Handler module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :esshd > :password_authenticator"
+msgid "Authenticator module"
+msgstr "Authenticator module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :esshd > :port"
+msgid "Port to connect"
+msgstr "Port to connect"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :esshd > :priv_dir"
+msgid "Dir with SSH keys"
+msgstr "Dir with SSH keys"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :access_key_id"
+msgid "S3 access key ID"
+msgstr "S3 access key ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :host"
+msgid "S3 host"
+msgstr "S3 host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :region"
+msgid "S3 region (for AWS)"
+msgstr "S3 region (for AWS)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :logger > :backends"
+msgid ""
+"Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :"
+"ex_syslogger } - to syslog, Quack.Logger - to Slack."
+msgstr ""
+"Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :"
+"ex_syslogger } - to syslog, Quack.Logger - to Slack."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :logger-:console > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :logger-:console > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :ident"
+msgid ""
+"A string that's prepended to every message, and is typically set to the app "
+"name"
+msgstr ""
+"A string that's prepended to every message, and is typically set to the app "
+"name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :blockers_visible"
+msgid "Whether a user can see someone who has blocked them"
+msgstr "Whether a user can see someone who has blocked them"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Following handshake timeout"
+msgstr "Following handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:activitypub > :note_replies_output_limit"
+msgid ""
+"The number of Note replies' URIs to be included with outgoing federation "
+"(`5` to match Mastodon hardcoded value, `0` to disable the output)"
+msgstr ""
+"The number of Note replies' URIs to be included with outgoing federation "
+"(`5` to match Mastodon hardcoded value, `0` to disable the output)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Whether to federate blocks to other instances"
+msgstr "Whether to federate blocks to other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches with HTTP signatures"
+msgstr "Sign object fetches with HTTP signatures"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Whether blocks result in people getting unfollowed"
+msgstr "Whether blocks result in people getting unfollowed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_mascot"
+msgid ""
+"This will be used as the default mascot on MastoFE. Default: `:"
+"pleroma_fox_tan`"
+msgstr ""
+"This will be used as the default mascot on MastoFE. Default: `:"
+"pleroma_fox_tan`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_user_avatar"
+msgid "URL of the default user avatar"
+msgstr "URL of the default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:assets > :mascots"
+msgid ""
+"Keyword of mascots, each element must contain both an URL and a mime_type key"
+msgstr ""
+"Keyword of mascots, each element must contain both an URL and a mime_type key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:auth > :auth_template"
+msgid ""
+"Authentication form template. By default it's `show.html` which corresponds "
+"to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+msgstr ""
+"Authentication form template. By default it's `show.html` which corresponds "
+"to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid ""
+"OAuth admin scope requirement toggle. If enabled, admin actions explicitly "
+"demand admin OAuth scope(s) presence in OAuth token (client app must support "
+"admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` "
+"user flag grants access to admin-specific actions."
+msgstr ""
+"OAuth admin scope requirement toggle. If enabled, admin actions explicitly "
+"demand admin OAuth scope(s) presence in OAuth token (client app must support "
+"admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` "
+"user flag grants access to admin-specific actions."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_strategies"
+msgid ""
+"The list of enabled OAuth consumer strategies. By default it's set by "
+"OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-"
+"delimited string should be of format \"strategy\" or \"strategy:dependency"
+"\" (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency "
+"is named differently than ueberauth_)."
+msgstr ""
+"The list of enabled OAuth consumer strategies. By default it's set by "
+"OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-"
+"delimited string should be of format \"strategy\" or \"strategy:dependency"
+"\" (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency "
+"is named differently than ueberauth_)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_template"
+msgid ""
+"OAuth consumer mode authentication form template. By default it's `consumer."
+"html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer."
+"html.eex`."
+msgstr ""
+"OAuth consumer mode authentication form template. By default it's `consumer."
+"html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer."
+"html.eex`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :connect_timeout"
+msgid "Timeout while `gun` will wait until connection is up. Default: 5000ms."
+msgstr "Timeout while `gun` will wait until connection is up. Default: 5000ms."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:connections_pool > :"
+"connection_acquisition_retries"
+msgid ""
+"Number of attempts to acquire the connection from the pool if it is "
+"overloaded. Default: 5"
+msgstr ""
+"Number of attempts to acquire the connection from the pool if it is "
+"overloaded. Default: 5"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:connections_pool > :"
+"connection_acquisition_wait"
+msgid ""
+"Timeout to acquire a connection from pool. The total max time is this value "
+"multiplied by the number of retries. Default: 250ms."
+msgstr ""
+"Timeout to acquire a connection from pool. The total max time is this value "
+"multiplied by the number of retries. Default: 250ms."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :max_connections"
+msgid "Maximum number of connections in the pool. Default: 250 connections."
+msgstr "Maximum number of connections in the pool. Default: 250 connections."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid ""
+"Multiplier for the number of idle connection to be reclaimed if the pool is "
+"full. For example if the pool maxes out at 250 connections and this setting "
+"is set to 0.3, the pool will reclaim at most 75 idle connections if it's "
+"overloaded. Default: 0.1"
+msgstr ""
+"Multiplier for the number of idle connection to be reclaimed if the pool is "
+"full. For example if the pool maxes out at 250 connections and this setting "
+"is set to 0.3, the pool will reclaim at most 75 idle connections if it's "
+"overloaded. Default: 0.1"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest"
+msgid ""
+"emails of \"what you've missed\" for users who have been inactive for a while"
+msgstr ""
+"emails of \"what you've missed\" for users who have been inactive for a while"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:email_notifications > :digest > :active"
+msgid "Globally enable or disable digest emails"
+msgstr "Globally enable or disable digest emails"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:email_notifications > :digest > :"
+"inactivity_threshold"
+msgid "Minimum user inactivity threshold"
+msgstr "Minimum user inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:email_notifications > :digest > :interval"
+msgid "Minimum interval between digest emails to one user"
+msgstr "Minimum interval between digest emails to one user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:email_notifications > :digest > :schedule"
+msgid ""
+"When to send digest email, in crontab format. \"0 0 0\" is the default, "
+"meaning \"once a week at midnight on Sunday morning\"."
+msgstr ""
+"When to send digest email, in crontab format. \"0 0 0\" is the default, "
+"meaning \"once a week at midnight on Sunday morning\"."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:emoji > :default_manifest"
+msgid ""
+"Location of the JSON-manifest. This manifest contains information about the "
+"emoji-packs you can download. Currently only one manifest can be added (no "
+"arrays)."
+msgstr ""
+"Location of the JSON-manifest. This manifest contains information about the "
+"emoji-packs you can download. Currently only one manifest can be added (no "
+"arrays)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:emoji > :groups"
+msgid ""
+"Emojis are ordered in groups (tags). This is an array of key-value pairs "
+"where the key is the group name and the value is the location or array of "
+"locations. * can be used as a wildcard."
+msgstr ""
+"Emojis are ordered in groups (tags). This is an array of key-value pairs "
+"where the key is the group name and the value is the location or array of "
+"locations. * can be used as a wildcard."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:emoji > :pack_extensions"
+msgid ""
+"A list of file extensions for emojis, when no emoji.txt for a pack is present"
+msgstr ""
+"A list of file extensions for emojis, when no emoji.txt for a pack is present"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:emoji > :shortcode_globs"
+msgid "Location of custom emoji files. * can be used as a wildcard."
+msgstr "Location of custom emoji files. * can be used as a wildcard."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:features > :improved_hashtag_timeline"
+msgid ""
+"Setting to force toggle / force disable improved hashtags timeline. `:"
+"enabled` forces hashtags to be fetched from `hashtags` table for hashtags "
+"timeline. `:disabled` forces object-embedded hashtags to be used (slower). "
+"Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` "
+"[unless overridden] when HashtagsTableMigrator completes)."
+msgstr ""
+"Setting to force toggle / force disable improved hashtags timeline. `:"
+"enabled` forces hashtags to be fetched from `hashtags` table for hashtags "
+"timeline. `:disabled` forces object-embedded hashtags to be used (slower). "
+"Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` "
+"[unless overridden] when HashtagsTableMigrator completes)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title"
+msgid "Configure title rendering"
+msgstr "Configure title rendering"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :max_length"
+msgid "Maximum number of characters before truncating title"
+msgstr "Maximum number of characters before truncating title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :omission"
+msgid "Replacement which will be used after truncating string"
+msgstr "Replacement which will be used after truncating string"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Settings for Pleroma FE"
+msgstr "Settings for Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"alwaysShowSubjectInput"
+msgid "When disabled, auto-hide the subject field if it's empty"
+msgstr "When disabled, auto-hide the subject field if it's empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"background"
+msgid ""
+"URL of the background, unless viewing a user profile with a background that "
+"is set"
+msgstr ""
+"URL of the background, unless viewing a user profile with a background that "
+"is set"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"collapseMessageWithSubject"
+msgid ""
+"When a message has a subject (aka Content Warning), collapse it by default"
+msgstr ""
+"When a message has a subject (aka Content Warning), collapse it by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"greentext"
+msgid "Enables green text on lines prefixed with the > character"
+msgstr "Enables green text on lines prefixed with the > character"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideFilteredStatuses"
+msgid "Hides filtered statuses from timelines"
+msgstr "Hides filtered statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideMutedPosts"
+msgid "Hides muted statuses from timelines"
+msgstr "Hides muted statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hidePostStats"
+msgid "Hide notices statistics (repeats, favorites, ...)"
+msgstr "Hide notices statistics (repeats, favorites, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideSitename"
+msgid "Hides instance name from PleromaFE banner"
+msgstr "Hides instance name from PleromaFE banner"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideUserStats"
+msgid ""
+"Hide profile statistics (posts, posts per day, followers, followings, ...)"
+msgstr ""
+"Hide profile statistics (posts, posts per day, followers, followings, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "URL of the logo, defaults to Pleroma's logo"
+msgstr "URL of the logo, defaults to Pleroma's logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"logoMargin"
+msgid ""
+"Allows you to adjust vertical margins between logo boundary and navbar "
+"borders. The idea is that to have logo's image without any extra margins and "
+"instead adjust them to your need in layout."
+msgstr ""
+"Allows you to adjust vertical margins between logo boundary and navbar "
+"borders. The idea is that to have logo's image without any extra margins and "
+"instead adjust them to your need in layout."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"logoMask"
+msgid ""
+"By default it assumes logo used will be monochrome with alpha channel to be "
+"compatible with both light and dark themes. If you want a colorful logo you "
+"must disable logoMask."
+msgstr ""
+"By default it assumes logo used will be monochrome with alpha channel to be "
+"compatible with both light and dark themes. If you want a colorful logo you "
+"must disable logoMask."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"minimalScopesMode"
+msgid ""
+"Limit scope selection to Direct, User default, and Scope of post replying "
+"to. Also prevents replying to a DM with a public post from PleromaFE."
+msgstr ""
+"Limit scope selection to Direct, User default, and Scope of post replying "
+"to. Also prevents replying to a DM with a public post from PleromaFE."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"nsfwCensorImage"
+msgid ""
+"URL of the image to use for hiding NSFW media attachments in the timeline"
+msgstr ""
+"URL of the image to use for hiding NSFW media attachments in the timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"postContentType"
+msgid "Default post formatting option"
+msgstr "Default post formatting option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"redirectRootLogin"
+msgid "Relative URL which indicates where to redirect when a user is logged in"
+msgstr ""
+"Relative URL which indicates where to redirect when a user is logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"redirectRootNoLogin"
+msgid ""
+"Relative URL which indicates where to redirect when a user isn't logged in"
+msgstr ""
+"Relative URL which indicates where to redirect when a user isn't logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"scopeCopy"
+msgid "Copy the scope (private/unlisted/public) in replies to posts by default"
+msgstr ""
+"Copy the scope (private/unlisted/public) in replies to posts by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"showFeaturesPanel"
+msgid ""
+"Enables panel displaying functionality of the instance on the About page"
+msgstr ""
+"Enables panel displaying functionality of the instance on the About page"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"showInstanceSpecificPanel"
+msgid "Whether to show the instance's custom panel"
+msgstr "Whether to show the instance's custom panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"sidebarRight"
+msgid "Change alignment of sidebar and panels to the right"
+msgstr "Change alignment of sidebar and panels to the right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"subjectLineBehavior"
+msgid ""
+"Allows changing the default behaviour of subject lines in replies.\n"
+" `email`: copy and preprend re:, as in email,\n"
+" `masto`: copy verbatim, as in Mastodon,\n"
+" `noop`: don't copy the subject."
+msgstr ""
+"Allows changing the default behaviour of subject lines in replies.\n"
+" `email`: copy and preprend re:, as in email,\n"
+" `masto`: copy verbatim, as in Mastodon,\n"
+" `noop`: don't copy the subject."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"theme"
+msgid "Which theme to use. Available themes are defined in styles.json"
+msgstr "Which theme to use. Available themes are defined in styles.json"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin"
+msgid "Admin frontend"
+msgstr "Admin frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin > name"
+msgid ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin > ref"
+msgid ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available"
+msgid ""
+"A map containing available frontends and parameters for their installation."
+msgstr ""
+"A map containing available frontends and parameters for their installation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > build_dir"
+msgid "The directory inside the zip file "
+msgstr "The directory inside the zip file "
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > build_url"
+msgid ""
+"Either an url to a zip file containing the frontend or a template to build "
+"it by inserting the `ref`. The string `${ref}` will be replaced by the "
+"configured `ref`."
+msgstr ""
+"Either an url to a zip file containing the frontend or a template to build "
+"it by inserting the `ref`. The string `${ref}` will be replaced by the "
+"configured `ref`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:frontends > :available > custom-http-headers"
+msgid "The custom HTTP headers for the frontend"
+msgstr "The custom HTTP headers for the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > git"
+msgid "URL of the git repository of the frontend"
+msgstr "URL of the git repository of the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > name"
+msgid "Name of the frontend."
+msgstr "Name of the frontend."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > ref"
+msgid "Reference of the frontend to be used."
+msgstr "Reference of the frontend to be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary"
+msgid "Primary frontend, the one that is served for all pages by default"
+msgstr "Primary frontend, the one that is served for all pages by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary > name"
+msgid ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary > ref"
+msgid ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:gopher > :dstport"
+msgid "Port advertised in URLs (optional, defaults to port)"
+msgstr "Port advertised in URLs (optional, defaults to port)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:gopher > :enabled"
+msgid "Enables the gopher interface"
+msgstr "Enables the gopher interface"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:gopher > :ip"
+msgid "IP address to bind to"
+msgstr "IP address to bind to"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:gopher > :port"
+msgid "Port to bind to"
+msgstr "Port to bind to"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :federation"
+msgid "Settings for federation pool."
+msgstr "Settings for federation pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:hackney_pools > :federation > :"
+"max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media"
+msgid "Settings for media pool."
+msgstr "Settings for media pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload"
+msgid "Settings for upload pool."
+msgstr "Settings for upload pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter"
+msgid "Adapter specific options"
+msgstr "Adapter specific options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL options for HTTP adapter"
+msgstr "SSL options for HTTP adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "List of TLS version to use"
+msgstr "List of TLS version to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http > :user_agent"
+msgid ""
+"What user agent to use. Must be a string or an atom `:default`. Default "
+"value is `:default`."
+msgstr ""
+"What user agent to use. Must be a string or an atom `:default`. Default "
+"value is `:default`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http_security > :ct_max_age"
+msgid "The maximum age for the Expect-CT header if sent"
+msgstr "The maximum age for the Expect-CT header if sent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http_security > :enabled"
+msgid "Whether the managed content security policy is enabled"
+msgstr "Whether the managed content security policy is enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http_security > :referrer_policy"
+msgid "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+msgstr "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http_security > :report_uri"
+msgid "Adds the specified URL to report-uri and report-to group in CSP header"
+msgstr "Adds the specified URL to report-uri and report-to group in CSP header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts"
+msgid "Whether to additionally send a Strict-Transport-Security header"
+msgstr "Whether to additionally send a Strict-Transport-Security header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts_max_age"
+msgid "The maximum age for the Strict-Transport-Security header if sent"
+msgstr "The maximum age for the Strict-Transport-Security header if sent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :account_activation_required"
+msgid "Require users to confirm their emails before signing in"
+msgstr "Require users to confirm their emails before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_approval_required"
+msgid "Require users to be manually approved by an admin before signing in"
+msgstr "Require users to be manually approved by an admin before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_field_name_length"
+msgid "An account field name maximum length. Default: 512."
+msgstr "An account field name maximum length. Default: 512."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :account_field_value_length"
+msgid "An account field value maximum length. Default: 2048."
+msgstr "An account field value maximum length. Default: 2048."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :allow_relay"
+msgid ""
+"Permits remote instances to subscribe to all public posts of your instance. "
+"(Important!) This may increase the visibility of your instance."
+msgstr ""
+"Permits remote instances to subscribe to all public posts of your instance. "
+"(Important!) This may increase the visibility of your instance."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :allowed_post_formats"
+msgid "MIME-type list of formats allowed to be posted (transformed into HTML)"
+msgstr "MIME-type list of formats allowed to be posted (transformed into HTML)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :attachment_links"
+msgid "Enable to automatically add attachment link text to statuses"
+msgstr "Enable to automatically add attachment link text to statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowed_nicknames"
+msgid ""
+"Set to nicknames of (local) users that every new user should automatically "
+"follow"
+msgstr ""
+"Set to nicknames of (local) users that every new user should automatically "
+"follow"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowing_nicknames"
+msgid ""
+"Set to nicknames of (local) users that automatically follows every newly "
+"registered user"
+msgstr ""
+"Set to nicknames of (local) users that automatically follows every newly "
+"registered user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :avatar_upload_limit"
+msgid "File size limit of user's profile avatars"
+msgstr "File size limit of user's profile avatars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :background_upload_limit"
+msgid "File size limit of user's profile backgrounds"
+msgstr "File size limit of user's profile backgrounds"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :banner_upload_limit"
+msgid "File size limit of user's profile banners"
+msgstr "File size limit of user's profile banners"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :birthday_min_age"
+msgid ""
+"Minimum required age for users to create account. Only used if birthday is "
+"required."
+msgstr ""
+"Minimum required age for users to create account. Only used if birthday is "
+"required."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :birthday_required"
+msgid "Require users to enter their birthday."
+msgstr "Require users to enter their birthday."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :cleanup_attachments"
+msgid ""
+"Enable to remove associated attachments when status is removed.\n"
+"This will not affect duplicates and attachments without status.\n"
+"Enabling this will increase load to database when deleting statuses on "
+"larger instances.\n"
+msgstr ""
+"Enable to remove associated attachments when status is removed.\n"
+"This will not affect duplicates and attachments without status.\n"
+"Enabling this will increase load to database when deleting statuses on "
+"larger instances.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :description"
+msgid ""
+"The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+msgstr ""
+"The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :email"
+msgid "Email used to reach an Administrator/Moderator of the instance"
+msgstr "Email used to reach an Administrator/Moderator of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :extended_nickname_format"
+msgid ""
+"Enable to use extended local nicknames format (allows underscores/dashes). "
+"This will break federation with older software for theses nicknames."
+msgstr ""
+"Enable to use extended local nicknames format (allows underscores/dashes). "
+"This will break federation with older software for theses nicknames."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :external_user_synchronization"
+msgid ""
+"Enabling following/followers counters synchronization for external users"
+msgstr ""
+"Enabling following/followers counters synchronization for external users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :federating"
+msgid "Enable federation with other instances"
+msgstr "Enable federation with other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :"
+"federation_incoming_replies_max_depth"
+msgid ""
+"Max. depth of reply-to and reply activities fetching on incoming federation, "
+"to prevent out-of-memory situations while fetching very long threads. If set "
+"to `nil`, threads of any depth will be fetched. Lower this value if you "
+"experience out-of-memory crashes."
+msgstr ""
+"Max. depth of reply-to and reply activities fetching on incoming federation, "
+"to prevent out-of-memory situations while fetching very long threads. If set "
+"to `nil`, threads of any depth will be fetched. Lower this value if you "
+"experience out-of-memory crashes."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :"
+"federation_reachability_timeout_days"
+msgid ""
+"Timeout (in days) of each external federation target being unreachable prior "
+"to pausing federating to it"
+msgstr ""
+"Timeout (in days) of each external federation target being unreachable prior "
+"to pausing federating to it"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :healthcheck"
+msgid "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
+msgstr "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :instance_thumbnail"
+msgid ""
+"The instance thumbnail can be any image that represents your instance and is "
+"used by some apps or services when they display information about your "
+"instance."
+msgstr ""
+"The instance thumbnail can be any image that represents your instance and is "
+"used by some apps or services when they display information about your "
+"instance."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :invites_enabled"
+msgid ""
+"Enable user invitations for admins (depends on `registrations_open` being "
+"disabled)"
+msgstr ""
+"Enable user invitations for admins (depends on `registrations_open` being "
+"disabled)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :limit"
+msgid "Posts character limit (CW/Subject included in the counter)"
+msgstr "Posts character limit (CW/Subject included in the counter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :limit_to_local_content"
+msgid ""
+"Limit unauthenticated users to search for local statutes and users only. "
+"Default: `:unauthenticated`."
+msgstr ""
+"Limit unauthenticated users to search for local statutes and users only. "
+"Default: `:unauthenticated`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_account_fields"
+msgid "The maximum number of custom fields in the user profile. Default: 10."
+msgstr "The maximum number of custom fields in the user profile. Default: 10."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_endorsed_users"
+msgid "The maximum number of recommended accounts. 0 will disable the feature."
+msgstr ""
+"The maximum number of recommended accounts. 0 will disable the feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_media_attachments"
+msgid "Maximum number of post media attachments"
+msgstr "Maximum number of post media attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_pinned_statuses"
+msgid "The maximum number of pinned statuses. 0 will disable the feature."
+msgstr "The maximum number of pinned statuses. 0 will disable the feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_remote_account_fields"
+msgid ""
+"The maximum number of custom fields in the remote user profile. Default: 20."
+msgstr ""
+"The maximum number of custom fields in the remote user profile. Default: 20."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_report_comment_size"
+msgid "The maximum size of the report comment. Default: 1000."
+msgstr "The maximum size of the report comment. Default: 1000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi-factor authentication settings"
+msgstr "Multi-factor authentication settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :multi_factor_authentication > :"
+"backup_codes"
+msgid "MFA backup codes settings"
+msgstr "MFA backup codes settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :multi_factor_authentication > :"
+"backup_codes > :length"
+msgid ""
+"Determines the length of backup one-time pass-codes, in characters. Defaults "
+"to 16 characters."
+msgstr ""
+"Determines the length of backup one-time pass-codes, in characters. Defaults "
+"to 16 characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :multi_factor_authentication > :"
+"backup_codes > :number"
+msgid "Number of backup codes to generate."
+msgstr "Number of backup codes to generate."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :multi_factor_authentication > :"
+"totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :multi_factor_authentication > :"
+"totp > :digits"
+msgid ""
+"Determines the length of a one-time pass-code, in characters. Defaults to 6 "
+"characters."
+msgstr ""
+"Determines the length of a one-time pass-code, in characters. Defaults to 6 "
+"characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :multi_factor_authentication > :"
+"totp > :period"
+msgid ""
+"A period for which the TOTP code will be valid, in seconds. Defaults to 30 "
+"seconds."
+msgstr ""
+"A period for which the TOTP code will be valid, in seconds. Defaults to 30 "
+"seconds."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :name"
+msgid "Name of the instance"
+msgstr "Name of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :notify_email"
+msgid "Envelope FROM address for mail sent via Pleroma"
+msgstr "Envelope FROM address for mail sent via Pleroma"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits"
+msgid "A map with poll limits for local polls"
+msgstr "A map with poll limits for local polls"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Maximum expiration time (in seconds)"
+msgstr "Maximum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Maximum number of characters per option"
+msgstr "Maximum number of characters per option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Maximum number of options"
+msgstr "Maximum number of options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Minimum expiration time (in seconds)"
+msgstr "Minimum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :privileged_staff"
+msgid ""
+"Let moderators access sensitive data (e.g. updating user credentials, get "
+"password reset token, delete users, index and read private statuses and "
+"chats)"
+msgstr ""
+"Let moderators access sensitive data (e.g. updating user credentials, get "
+"password reset token, delete users, index and read private statuses and "
+"chats)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :profile_directory"
+msgid "Enable profile directory."
+msgstr "Enable profile directory."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :public"
+msgid ""
+"Makes the client API in authenticated mode-only except for user-profiles. "
+"Useful for disabling the Local Timeline and The Whole Known Network. Note: "
+"when setting to `false`, please also check `:restrict_unauthenticated` "
+"setting."
+msgstr ""
+"Makes the client API in authenticated mode-only except for user-profiles. "
+"Useful for disabling the Local Timeline and The Whole Known Network. Note: "
+"when setting to `false`, please also check `:restrict_unauthenticated` "
+"setting."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :quarantined_instances"
+msgid ""
+"List of ActivityPub instances where private (DMs, followers-only) activities "
+"will not be sent and the reason for doing so"
+msgstr ""
+"List of ActivityPub instances where private (DMs, followers-only) activities "
+"will not be sent and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :registration_reason_length"
+msgid "Maximum registration reason length. Default: 500."
+msgstr "Maximum registration reason length. Default: 500."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :registrations_open"
+msgid ""
+"Enable registrations for anyone. Invitations require this setting to be "
+"disabled."
+msgstr ""
+"Enable registrations for anyone. Invitations require this setting to be "
+"disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :remote_limit"
+msgid "Hard character limit beyond which remote posts will be dropped"
+msgstr "Hard character limit beyond which remote posts will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:instance > :remote_post_retention_days"
+msgid ""
+"The default amount of days to retain remote posts when pruning the database"
+msgstr ""
+"The default amount of days to retain remote posts when pruning the database"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :safe_dm_mentions"
+msgid ""
+"If enabled, only mentions at the beginning of a post will be used to address "
+"people in direct messages. This is to prevent accidental mentioning of "
+"people when talking about them (e.g. \"@admin please keep an eye on "
+"@bad_actor\"). Default: disabled"
+msgstr ""
+"If enabled, only mentions at the beginning of a post will be used to address "
+"people in direct messages. This is to prevent accidental mentioning of "
+"people when talking about them (e.g. \"@admin please keep an eye on "
+"@bad_actor\"). Default: disabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :show_reactions"
+msgid "Let favourites and emoji reactions be viewed through the API."
+msgstr "Let favourites and emoji reactions be viewed through the API."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip filtering out broken threads. Default: enabled."
+msgstr "Skip filtering out broken threads. Default: enabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :static_dir"
+msgid "Instance static directory"
+msgstr "Instance static directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :upload_limit"
+msgid "File size limit of uploads (except for avatar, background, banner)"
+msgstr "File size limit of uploads (except for avatar, background, banner)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_bio_length"
+msgid "A user bio maximum length. Default: 5000."
+msgstr "A user bio maximum length. Default: 5000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_name_length"
+msgid "A user name maximum length. Default: 100."
+msgstr "A user name maximum length. Default: 100."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instances_favicons > :enabled"
+msgid "Allow/disallow displaying and getting instances favicons"
+msgstr "Allow/disallow displaying and getting instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :base"
+msgid "LDAP base, e.g. \"dc=example,dc=com\""
+msgstr "LDAP base, e.g. \"dc=example,dc=com\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :enabled"
+msgid "Enables LDAP authentication"
+msgstr "Enables LDAP authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :host"
+msgid "LDAP server hostname"
+msgstr "LDAP server hostname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :port"
+msgid "LDAP port, e.g. 389 or 636"
+msgstr "LDAP port, e.g. 389 or 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :ssl"
+msgid "Enable to use SSL, usually implies the port 636"
+msgstr "Enable to use SSL, usually implies the port 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts"
+msgid "Additional SSL options"
+msgstr "Additional SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tls"
+msgid "Enable to use STARTTLS, usually implies the port 389"
+msgstr "Enable to use STARTTLS, usually implies the port 389"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts"
+msgid "Additional TLS options"
+msgstr "Additional TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:ldap > :uid"
+msgid ""
+"LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter "
+"will be \"cn=username,base\""
+msgstr ""
+"LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter "
+"will be \"cn=username,base\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:majic_pool > :size"
+msgid "Number of majic workers to start."
+msgstr "Number of majic workers to start."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:manifest > :background_color"
+msgid "Describe the background color of the app"
+msgstr "Describe the background color of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:manifest > :icons"
+msgid "Describe the icons of the app"
+msgstr "Describe the icons of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:manifest > :theme_color"
+msgid "Describe the theme color of the app"
+msgstr "Describe the theme color of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:markup > :scrub_policy"
+msgid ""
+"Module names are shortened (removed leading `Pleroma.HTML.` part), but on "
+"adding custom module you need to use full name."
+msgstr ""
+"Module names are shortened (removed leading `Pleroma.HTML.` part), but on "
+"adding custom module you need to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :enabled"
+msgid ""
+"Enables proxying of remote media preview to the instance's proxy. Requires "
+"enabled media proxy."
+msgstr ""
+"Enables proxying of remote media preview to the instance's proxy. Requires "
+"enabled media proxy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :image_quality"
+msgid ""
+"Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+msgstr ""
+"Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_preview_proxy > :min_content_length"
+msgid ""
+"Min content length (in bytes) to perform preview. Media smaller in size will "
+"be served without thumbnailing."
+msgstr ""
+"Min content length (in bytes) to perform preview. Media smaller in size will "
+"be served without thumbnailing."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid ""
+"Max height of preview thumbnail for images (video preview always has "
+"original dimensions)."
+msgstr ""
+"Max height of preview thumbnail for images (video preview always has "
+"original dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid ""
+"Max width of preview thumbnail for images (video preview always has original "
+"dimensions)."
+msgstr ""
+"Max width of preview thumbnail for images (video preview always has original "
+"dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :base_url"
+msgid ""
+"The base URL to access a user-uploaded file. Useful when you want to proxy "
+"the media files via another host/CDN fronts."
+msgstr ""
+"The base URL to access a user-uploaded file. Useful when you want to proxy "
+"the media files via another host/CDN fronts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :enabled"
+msgid "Enables proxying of remote media via the instance's proxy"
+msgstr "Enables proxying of remote media via the instance's proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enables media cache object invalidation."
+msgstr "Enables media cache object invalidation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Module which will be used to purge objects from the cache."
+msgstr "Module which will be used to purge objects from the cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts"
+msgid "Internal Pleroma.ReverseProxy settings"
+msgstr "Internal Pleroma.ReverseProxy settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid ""
+"Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+msgstr ""
+"Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_proxy > :proxy_opts > :"
+"max_read_duration"
+msgid "Timeout (in milliseconds) of GET request to the remote URI."
+msgstr "Timeout (in milliseconds) of GET request to the remote URI."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:media_proxy > :proxy_opts > :"
+"redirect_on_failure"
+msgid ""
+"Redirects the client to the origin server upon encountering HTTP errors.\n"
+"\n"
+"Note that files larger than Max Body Length will trigger an error. (e.g., "
+"Peertube videos)\n"
+"\n"
+"\n"
+"**WARNING:** This setting will allow larger files to be accessed, but "
+"exposes the\n"
+"\n"
+"IP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+msgstr ""
+"Redirects the client to the origin server upon encountering HTTP errors.\n"
+"\n"
+"Note that files larger than Max Body Length will trigger an error. (e.g., "
+"Peertube videos)\n"
+"\n"
+"\n"
+"**WARNING:** This setting will allow larger files to be accessed, but "
+"exposes the\n"
+"\n"
+"IP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :whitelist"
+msgid "List of hosts with scheme to bypass the MediaProxy"
+msgstr "List of hosts with scheme to bypass the MediaProxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:modules > :runtime_dir"
+msgid "A path to custom Elixir modules (such as MRF policies)."
+msgstr "A path to custom Elixir modules (such as MRF policies)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf > :policies"
+msgid ""
+"A list of MRF policies enabled. Module names are shortened (removed leading "
+"`Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need "
+"to use full name."
+msgstr ""
+"A list of MRF policies enabled. Module names are shortened (removed leading "
+"`Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency"
+msgid ""
+"Make the content of your Message Rewrite Facility settings public (via "
+"nodeinfo)"
+msgstr ""
+"Make the content of your Message Rewrite Facility settings public (via "
+"nodeinfo)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency_exclusions"
+msgid ""
+"Exclude specific instance names from MRF transparency. The use of the "
+"exclusions feature will be disclosed in nodeinfo as a boolean value. You can "
+"also provide a reason for excluding these instance names. The instances and "
+"reasons won't be publicly disclosed."
+msgstr ""
+"Exclude specific instance names from MRF transparency. The use of the "
+"exclusions feature will be disclosed in nodeinfo as a boolean value. You can "
+"also provide a reason for excluding these instance names. The instances and "
+"reasons won't be publicly disclosed."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_activity_expiration > :days"
+msgid "Default global expiration time for all local activities (in days)"
+msgstr "Default global expiration time for all local activities (in days)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid ""
+"The name of the bot account to use for following newly discovered users."
+msgstr ""
+"The name of the bot account to use for following newly discovered users."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid ""
+"A list of hashtags which result in message being removed from federated "
+"timelines (a.k.a unlisted)."
+msgstr ""
+"A list of hashtags which result in message being removed from federated "
+"timelines (a.k.a unlisted)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :reject"
+msgid "A list of hashtags which result in message being rejected."
+msgstr "A list of hashtags which result in message being rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :sensitive"
+msgid ""
+"A list of hashtags which result in message being set as sensitive (a.k.a "
+"NSFW/R-18)"
+msgstr ""
+"A list of hashtags which result in message being set as sensitive (a.k.a "
+"NSFW/R-18)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid ""
+"Number of mentioned users after which the message gets removed from "
+"timelines anddisables notifications. Set to 0 to disable."
+msgstr ""
+"Number of mentioned users after which the message gets removed from "
+"timelines anddisables notifications. Set to 0 to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid ""
+"Number of mentioned users after which the messaged gets rejected. Set to 0 "
+"to disable."
+msgstr ""
+"Number of mentioned users after which the messaged gets rejected. Set to 0 "
+"to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid ""
+" A list of patterns which result in message being removed from federated "
+"timelines (a.k.a unlisted).\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns which result in message being removed from federated "
+"timelines (a.k.a unlisted).\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :reject"
+msgid ""
+" A list of patterns which result in message being rejected.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns which result in message being rejected.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :replace"
+msgid ""
+" **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in "
+"the format of `~r/PATTERN/`.\n"
+"\n"
+" **Replacement**: a string. Leaving the field empty is permitted.\n"
+msgstr ""
+" **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in "
+"the format of `~r/PATTERN/`.\n"
+"\n"
+" **Replacement**: a string. Leaving the field empty is permitted.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention > :actors"
+msgid "A list of actors for which any post mentioning them will be dropped"
+msgstr "A list of actors for which any post mentioning them will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age > :actions"
+msgid ""
+"A list of actions to apply to the post. `:delist` removes the post from "
+"public timelines; `:strip_followers` removes followers from the ActivityPub "
+"recipient list ensuring they won't be delivered to home timelines; `:reject` "
+"rejects the message entirely"
+msgstr ""
+"A list of actions to apply to the post. `:delist` removes the post from "
+"public timelines; `:strip_followers` removes followers from the ActivityPub "
+"recipient list ensuring they won't be delivered to home timelines; `:reject` "
+"rejects the message entirely"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age > :threshold"
+msgid "Required age (in seconds) of a post before actions are taken."
+msgstr "Required age (in seconds) of a post before actions are taken."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Whether to allow direct messages"
+msgstr "Whether to allow direct messages"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Whether to allow followers-only posts"
+msgstr "Whether to allow followers-only posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :accept"
+msgid ""
+"List of instances to only accept activities from (except deletes) and the "
+"reason for doing so"
+msgstr ""
+"List of instances to only accept activities from (except deletes) and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :avatar_removal"
+msgid "List of instances to strip avatars from and the reason for doing so"
+msgstr "List of instances to strip avatars from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :banner_removal"
+msgid "List of instances to strip banners from and the reason for doing so"
+msgstr "List of instances to strip banners from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid ""
+"List of instances to remove from the Federated (aka The Whole Known Network) "
+"Timeline and the reason for doing so"
+msgstr ""
+"List of instances to remove from the Federated (aka The Whole Known Network) "
+"Timeline and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :followers_only"
+msgid ""
+"Force posts from the given instances to be visible by followers only and the "
+"reason for doing so"
+msgstr ""
+"Force posts from the given instances to be visible by followers only and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :media_nsfw"
+msgid ""
+"List of instances to tag all media as NSFW (sensitive) from and the reason "
+"for doing so"
+msgstr ""
+"List of instances to tag all media as NSFW (sensitive) from and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :media_removal"
+msgid ""
+"List of instances to strip media attachments from and the reason for doing so"
+msgstr ""
+"List of instances to strip media attachments from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :reject"
+msgid ""
+"List of instances to reject activities from (except deletes) and the reason "
+"for doing so"
+msgstr ""
+"List of instances to reject activities from (except deletes) and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :reject_deletes"
+msgid "List of instances to reject deletions from and the reason for doing so"
+msgstr "List of instances to reject deletions from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :report_removal"
+msgid "List of instances to reject reports from and the reason for doing so"
+msgstr "List of instances to reject reports from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "List of hosts to steal emojis from"
+msgstr "List of hosts to steal emojis from"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid ""
+" A list of patterns or matches to reject shortcodes with.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns or matches to reject shortcodes with.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid ""
+"File size limit (in bytes), checked before an emoji is saved to the disk"
+msgstr ""
+"File size limit (in bytes), checked before an emoji is saved to the disk"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_subchain > :match_actor"
+msgid "Matches a series of regular expressions against the actor field"
+msgstr "Matches a series of regular expressions against the actor field"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :accept"
+msgid ""
+"A list of ActivityStreams terms to accept. If empty, all supported messages "
+"are accepted."
+msgstr ""
+"A list of ActivityStreams terms to accept. If empty, all supported messages "
+"are accepted."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :reject"
+msgid ""
+"A list of ActivityStreams terms to reject. If empty, no messages are "
+"rejected."
+msgstr ""
+"A list of ActivityStreams terms to reject. If empty, no messages are "
+"rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid ""
+"Enable a background job to clean expired OAuth tokens. Default: disabled."
+msgstr ""
+"Enable a background job to clean expired OAuth tokens. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid ""
+"Keeps old refresh token or generate new refresh token when to obtain an "
+"access token"
+msgstr ""
+"Keeps old refresh token or generate new refresh token when to obtain an "
+"access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :token_expires_in"
+msgid "The lifetime in seconds of the access token"
+msgstr "The lifetime in seconds of the access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :default"
+msgid "Settings for default pool."
+msgstr "Settings for default pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :max_waiting"
+msgid ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation"
+msgid "Settings for federation pool."
+msgstr "Settings for federation pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :max_waiting"
+msgid ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :media"
+msgid "Settings for media pool."
+msgstr "Settings for media pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :max_waiting"
+msgid ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload"
+msgid "Settings for upload pool."
+msgstr "Settings for upload pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :max_waiting"
+msgid ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:populate_hashtags_table > :"
+"fault_rate_allowance"
+msgid ""
+"Max accepted rate of objects that failed in the migration. Any value from "
+"0.0 which tolerates no errors to 1.0 which will enable the feature even if "
+"hashtags transfer failed for all records."
+msgstr ""
+"Max accepted rate of objects that failed in the migration. Any value from "
+"0.0 which tolerates no errors to 1.0 which will enable the feature even if "
+"hashtags transfer failed for all records."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid ""
+"Sleep interval between each chunk of processed records in order to decrease "
+"the load on the system (defaults to 0 and should be keep default on most "
+"instances)."
+msgstr ""
+"Sleep interval between each chunk of processed records in order to decrease "
+"the load on the system (defaults to 0 and should be keep default on most "
+"instances)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :app_account_creation"
+msgid "For registering user accounts from the same IP address"
+msgstr "For registering user accounts from the same IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :authentication"
+msgid ""
+"For authentication create / password check / user existence check requests"
+msgstr ""
+"For authentication create / password check / user existence check requests"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relation_id_action"
+msgid "For actions on relation with a specific user (follow, unfollow)"
+msgstr "For actions on relation with a specific user (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relations_actions"
+msgid "For actions on relationships with all users (follow, unfollow)"
+msgstr "For actions on relationships with all users (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :search"
+msgid "For the search requests (account & status search etc.)"
+msgstr "For the search requests (account & status search etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :status_id_action"
+msgid ""
+"For fav / unfav or reblog / unreblog actions on the same status by the same "
+"user"
+msgstr ""
+"For fav / unfav or reblog / unreblog actions on the same status by the same "
+"user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :statuses_actions"
+msgid ""
+"For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+msgstr ""
+"For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :timeline"
+msgid "For requests to timelines (each timeline has it's own limiter)"
+msgstr "For requests to timelines (each timeline has it's own limiter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Settings for statuses."
+msgstr "Settings for statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:restrict_unauthenticated > :activities > :"
+"local"
+msgid "Disallow view local statuses."
+msgstr "Disallow view local statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:restrict_unauthenticated > :activities > :"
+"remote"
+msgid "Disallow view remote statuses."
+msgstr "Disallow view remote statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Settings for user profiles."
+msgstr "Settings for user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Disallow view local user profiles."
+msgstr "Disallow view local user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:restrict_unauthenticated > :profiles > :"
+"remote"
+msgid "Disallow view remote user profiles."
+msgstr "Disallow view remote user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Settings for public and federated timelines."
+msgstr "Settings for public and federated timelines."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:restrict_unauthenticated > :timelines > :"
+"federated"
+msgid "Disallow view federated timeline."
+msgstr "Disallow view federated timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:restrict_unauthenticated > :timelines > :"
+"local"
+msgid "Disallow view public timeline."
+msgstr "Disallow view public timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :enabled"
+msgid "Enables RichMedia parsing of URLs"
+msgstr "Enables RichMedia parsing of URLs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :failure_backoff"
+msgid ""
+"Amount of milliseconds after request failure, during which the request will "
+"not be retried."
+msgstr ""
+"Amount of milliseconds after request failure, during which the request will "
+"not be retried."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_hosts"
+msgid "List of hosts which will be ignored by the metadata parser"
+msgstr "List of hosts which will be ignored by the metadata parser"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_tld"
+msgid "List TLDs (top-level domains) which will ignore for parse metadata"
+msgstr "List TLDs (top-level domains) which will ignore for parse metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :parsers"
+msgid ""
+"List of Rich Media parsers. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need "
+"to use full name."
+msgstr ""
+"List of Rich Media parsers. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ttl_setters"
+msgid ""
+"List of rich media TTL setters. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need "
+"to use full name."
+msgstr ""
+"List of rich media TTL setters. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:shout > :enabled"
+msgid "Enables the backend Shoutbox chat feature."
+msgstr "Enables the backend Shoutbox chat feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:shout > :limit"
+msgid "Shout message character limit."
+msgstr "Shout message character limit."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:static_fe > :enabled"
+msgid "Enables the rendering of static HTML. Default: disabled."
+msgstr "Enables the rendering of static HTML. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:streamer > :overflow_workers"
+msgid "Maximum number of workers created if pool is empty"
+msgstr "Maximum number of workers created if pool is empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:streamer > :workers"
+msgid "Number of workers to send notifications"
+msgstr "Number of workers to send notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes > :valid_schemes"
+msgid "List of the scheme part that is considered valid to be an URL"
+msgstr "List of the scheme part that is considered valid to be an URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub"
+msgid ""
+"Activity pub routes (except question activities). Default: `nil` (no "
+"expiration)."
+msgstr ""
+"Activity pub routes (except question activities). Default: `nil` (no "
+"expiration)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid ""
+"Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+msgstr ""
+"Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enables sending a chat message to newly registered users"
+msgstr "Enables sending a chat message to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :message"
+msgid "A message that will be sent to newly registered users as a chat message"
+msgstr ""
+"A message that will be sent to newly registered users as a chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome chat message"
+msgstr "The nickname of the local user that sends a welcome chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enables sending a direct message to newly registered users"
+msgstr "Enables sending a direct message to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :message"
+msgid "A message that will be sent to newly registered users"
+msgstr "A message that will be sent to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome message"
+msgstr "The nickname of the local user that sends a welcome message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :enabled"
+msgid "Enables sending an email to newly registered users"
+msgstr "Enables sending an email to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :html"
+msgid ""
+"HTML content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+msgstr ""
+"HTML content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :sender"
+msgid ""
+"Email address and/or nickname that will be used to send the welcome email."
+msgstr ""
+"Email address and/or nickname that will be used to send the welcome email."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :subject"
+msgid ""
+"Subject of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+msgstr ""
+"Subject of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :text"
+msgid ""
+"Text content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+msgstr ""
+"Text content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:workers > :retries"
+msgid "Max retry attempts for failed jobs, per `Oban` queue"
+msgstr "Max retry attempts for failed jobs, per `Oban` queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub."
+"MRF.MediaProxyWarmingPolicy"
+msgid "Concurrent limits configuration for MediaProxyWarmingPolicy."
+msgstr "Concurrent limits configuration for MediaProxyWarmingPolicy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub."
+"MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub."
+"MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia."
+"Helpers"
+msgid "Concurrent limits configuration for getting RichMedia for activities."
+msgstr "Concurrent limits configuration for getting RichMedia for activities."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia."
+"Helpers > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia."
+"Helpers > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :crontab"
+msgid "Settings for cron background jobs"
+msgstr "Settings for cron background jobs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :log"
+msgid "Logs verbose mode"
+msgstr "Logs verbose mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues"
+msgid ""
+"Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+msgstr ""
+"Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration queue"
+msgstr "Activity expiration queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachment deletion queue"
+msgstr "Attachment deletion queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :background"
+msgid "Background queue"
+msgstr "Background queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :backup"
+msgid "Backup queue"
+msgstr "Backup queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Incoming federation queue"
+msgstr "Incoming federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Outgoing federation queue"
+msgstr "Outgoing federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :mailer"
+msgid "Email sender queue, see Pleroma.Emails.Mailer"
+msgstr "Email sender queue, see Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities queue, see Pleroma.ScheduledActivities"
+msgstr "Scheduled activities queue, see Pleroma.ScheduledActivities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier queue"
+msgstr "Transmogrifier queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :web_push"
+msgid "Web push notifications queue"
+msgstr "Web push notifications queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Whether the captcha should be shown on registration"
+msgstr "Whether the captcha should be shown on registration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :method"
+msgid "The method/service to use for captcha"
+msgstr "The method/service to use for captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "The time in seconds for which the captcha is valid"
+msgstr "The time in seconds for which the captcha is valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "The kocaptcha endpoint to use"
+msgstr "The kocaptcha endpoint to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid ""
+"One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/"
+"swoosh/Swoosh.html#module-adapters)"
+msgstr ""
+"One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/"
+"swoosh/Swoosh.html#module-adapters)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"auth"
+msgid "SMTP AUTH enforcement mode"
+msgstr "SMTP AUTH enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"password"
+msgid "SMTP AUTH password"
+msgstr "SMTP AUTH password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"port"
+msgid "SMTP port"
+msgstr "SMTP port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"relay"
+msgid "Hostname or IP address"
+msgstr "Hostname or IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"retries"
+msgid "SMTP temporary (4xx) error retries"
+msgstr "SMTP temporary (4xx) error retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"ssl"
+msgid "Use Implicit SSL/TLS. e.g. port 465"
+msgstr "Use Implicit SSL/TLS. e.g. port 465"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"tls"
+msgid "Explicit TLS (STARTTLS) enforcement mode"
+msgstr "Explicit TLS (STARTTLS) enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"username"
+msgid "SMTP AUTH username"
+msgstr "SMTP AUTH username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enables new users admin digest email when `true`"
+msgstr "Enables new users admin digest email when `true`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid ""
+"A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+msgstr ""
+"A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "A map with color settings for email templates."
+msgstr "A map with color settings for email templates."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :class"
+msgid "Specify the class to be added to the generated link. Disable to clear."
+msgstr "Specify the class to be added to the generated link. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :extra"
+msgid "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+msgstr "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :new_window"
+msgid "Link URLs will open in a new window/tab."
+msgstr "Link URLs will open in a new window/tab."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :rel"
+msgid "Override the rel attribute. Disable to clear."
+msgstr "Override the rel attribute. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip the scheme prefix."
+msgstr "Strip the scheme prefix."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :truncate"
+msgid ""
+"Set to a number to truncate URLs longer than the number. Truncated URLs will "
+"end in `...`"
+msgstr ""
+"Set to a number to truncate URLs longer than the number. Truncated URLs will "
+"end in `...`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid ""
+"Set to false to disable TLD validation for URLs/emails. Can be set to :"
+"no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` "
+"will be validated, but `http://example.loki` won't)"
+msgstr ""
+"Set to false to disable TLD validation for URLs/emails. Can be set to :"
+"no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` "
+"will be validated, but `http://example.loki` won't)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid ""
+"The number of scheduled activities a user is allowed to create in a single "
+"day. Default: 25."
+msgstr ""
+"The number of scheduled activities a user is allowed to create in a single "
+"day. Default: 25."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Whether scheduled activities are sent to the job queue to be executed"
+msgstr "Whether scheduled activities are sent to the job queue to be executed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid ""
+"The number of scheduled activities a user is allowed to create in total. "
+"Default: 300."
+msgstr ""
+"The number of scheduled activities a user is allowed to create in total. "
+"Default: 300."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :base_url"
+msgid ""
+"Base URL for the uploads. Required if you use a CDN or host attachments "
+"under a different domain."
+msgstr ""
+"Base URL for the uploads. Required if you use a CDN or host attachments "
+"under a different domain."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Set max length of a filename to display. 0 = no limit. Default: 30"
+msgstr "Set max length of a filename to display. 0 = no limit. Default: 30"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :filters"
+msgid ""
+"List of filter modules for uploads. Module names are shortened (removed "
+"leading `Pleroma.Upload.Filter.` part), but on adding custom module you need "
+"to use full name."
+msgstr ""
+"List of filter modules for uploads. Module names are shortened (removed "
+"leading `Pleroma.Upload.Filter.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :link_name"
+msgid ""
+"If enabled, a name parameter will be added to the URL of the upload. For "
+"example `https://instance.tld/media/imagehash.png?name=realname.png`."
+msgstr ""
+"If enabled, a name parameter will be added to the URL of the upload. For "
+"example `https://instance.tld/media/imagehash.png?name=realname.png`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid ""
+"Proxy requests to the remote uploader.\n"
+"\n"
+"Useful if media upload endpoint is not internet accessible.\n"
+msgstr ""
+"Proxy requests to the remote uploader.\n"
+"\n"
+"Useful if media upload endpoint is not internet accessible.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :uploader"
+msgid "Module which will be used for uploads"
+msgstr "Module which will be used for uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :"
+"text"
+msgid ""
+"Text to replace filenames in links. If no setting, {random}.extension will "
+"be used. You can get the original filename extension by using {extension}, "
+"for example custom-file-name.{extension}."
+msgstr ""
+"Text to replace filenames in links. If no setting, {random}.extension will "
+"be used. You can get the original filename extension by using {extension}, "
+"for example custom-file-name.{extension}."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid ""
+"List of actions for the mogrify command. It's possible to add self-written "
+"settings as string. For example `auto-orient, strip, {\"resize\", "
+"\"3840x1080>\"}` value will be parsed into valid list of the settings."
+msgstr ""
+"List of actions for the mogrify command. It's possible to add self-written "
+"settings as string. For example `auto-orient, strip, {\"resize\", "
+"\"3840x1080>\"}` value will be parsed into valid list of the settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Path where user's uploads will be saved"
+msgstr "Path where user's uploads will be saved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "S3 bucket"
+msgstr "S3 bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "S3 bucket namespace"
+msgstr "S3 bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid ""
+"Enable streaming uploads, when enabled the file will be sent to the server "
+"in chunks as it's being read. This may be unsupported by some providers, try "
+"disabling this if you have upload problems."
+msgstr ""
+"Enable streaming uploads, when enabled the file will be sent to the server "
+"in chunks as it's being read. This may be unsupported by some providers, try "
+"disabling this if you have upload problems."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid ""
+"If you use S3 compatible service such as Digital Ocean Spaces or CDN, set "
+"folder name or \"\" etc. For example, when using CDN to S3 virtual host "
+"format, set \"\". At this time, write CNAME to CDN in Upload base_url."
+msgstr ""
+"If you use S3 compatible service such as Digital Ocean Spaces or CDN, set "
+"folder name or \"\" etc. For example, when using CDN to S3 virtual host "
+"format, set \"\". At this time, write CNAME to CDN in Upload base_url."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :email_blacklist"
+msgid "List of email domains users may not register with."
+msgstr "List of email domains users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "List of nicknames users may not register with."
+msgstr "List of nicknames users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit user to export not more often than once per N days"
+msgstr "Limit user to export not more often than once per N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Remove backup achives after N days"
+msgstr "Remove backup achives after N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid ""
+"Enables strict input validation (useful in development, not recommended in "
+"production)"
+msgstr ""
+"Enables strict input validation (useful in development, not recommended in "
+"production)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :"
+"headers"
+msgid "HTTP headers of request"
+msgstr "HTTP headers of request"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :"
+"method"
+msgid "HTTP method of request. Default: :purge"
+msgstr "HTTP method of request. Default: :purge"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :"
+"options"
+msgid "Request options"
+msgstr "Request options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :"
+"script_path"
+msgid "Path to executable script which will purge cached items."
+msgstr "Path to executable script which will purge cached items."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :"
+"url_format"
+msgid ""
+"Optional URL format preprocessing. Only required for Apache's htcacheclean."
+msgstr ""
+"Optional URL format preprocessing. Only required for Apache's htcacheclean."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "List of metadata providers to enable"
+msgstr "List of metadata providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "When enabled NSFW attachments will be shown in previews"
+msgstr "When enabled NSFW attachments will be shown in previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enable/disable the plug. Default: disabled."
+msgstr "Enable/disable the plug. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid ""
+" A list of strings naming the HTTP headers to use when deriving the true "
+"client IP. Default: `[\"x-forwarded-for\"]`.\n"
+msgstr ""
+" A list of strings naming the HTTP headers to use when deriving the true "
+"client IP. Default: `[\"x-forwarded-for\"]`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid ""
+"A list of upstream proxy IP subnets in CIDR notation from which we will "
+"parse the content of `headers`. Defaults to `[]`. IPv4 entries without a "
+"bitmask will be assumed to be /32 and IPv6 /128."
+msgstr ""
+"A list of upstream proxy IP subnets in CIDR notation from which we will "
+"parse the content of `headers`. Defaults to `[]`. IPv4 entries without a "
+"bitmask will be assumed to be /32 and IPv6 /128."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid ""
+" A list of reserved IP subnets in CIDR notation which should be ignored if "
+"found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", "
+"\"fc00::/7\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
+msgstr ""
+" A list of reserved IP subnets in CIDR notation which should be ignored if "
+"found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", "
+"\"fc00::/7\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "List of preload providers to enable"
+msgstr "List of preload providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :"
+"enabled"
+msgid "Enables expired activities addition & deletion"
+msgstr "Enables expired activities addition & deletion"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :"
+"min_lifetime"
+msgid "Minimum lifetime for ephemeral activity (in seconds)"
+msgstr "Minimum lifetime for ephemeral activity (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :"
+"auth"
+msgid "Enables HTTP Basic Auth for app metrics endpoint."
+msgstr "Enables HTTP Basic Auth for app metrics endpoint."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :"
+"enabled"
+msgid "[Pleroma extension] Enables app metrics endpoint."
+msgstr "[Pleroma extension] Enables app metrics endpoint."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :"
+"format"
+msgid "App metrics endpoint output format."
+msgstr "App metrics endpoint output format."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :"
+"ip_whitelist"
+msgid "Restrict access of app metrics endpoint to the specified IP addresses."
+msgstr "Restrict access of app metrics endpoint to the specified IP addresses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :"
+"path"
+msgid "App metrics endpoint URI path."
+msgstr "App metrics endpoint URI path."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :quack > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :quack > :meta"
+msgid "Configure which metadata you want to report on"
+msgstr "Configure which metadata you want to report on"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :quack > :webhook_url"
+msgid "Configure the Slack incoming webhook"
+msgstr "Configure the Slack incoming webhook"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :web_push_encryption-:vapid_details > :private_key"
+msgid "VAPID private key"
+msgstr "VAPID private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config description at :web_push_encryption-:vapid_details > :public_key"
+msgid "VAPID public key"
+msgstr "VAPID public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :subject"
+msgid ""
+"A mailto link for the administrative contact. It's best if this email is not "
+"a personal email address, but rather a group email to the instance "
+"moderation team."
+msgstr ""
+"A mailto link for the administrative contact. It's best if this email is not "
+"a personal email address, but rather a group email to the instance "
+"moderation team."
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :cors_plug > :credentials"
+msgid "Credentials"
+msgstr "Credentials"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :cors_plug > :expose"
+msgid "Expose"
+msgstr "Expose"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :cors_plug > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :cors_plug > :max_age"
+msgid "Max age"
+msgstr "Max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :cors_plug > :methods"
+msgid "Methods"
+msgstr "Methods"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :esshd > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :esshd > :handler"
+msgid "Handler"
+msgstr "Handler"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :esshd > :password_authenticator"
+msgid "Password authenticator"
+msgstr "Password authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :esshd > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :esshd > :priv_dir"
+msgid "Priv dir"
+msgstr "Priv dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :access_key_id"
+msgid "Access key"
+msgstr "Access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :region"
+msgid "Region"
+msgstr "Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger > :backends"
+msgid "Backends"
+msgstr "Backends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:console > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:console > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:console > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :ident"
+msgid "Ident"
+msgstr "Ident"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :mime > :types"
+msgid "Types"
+msgstr "Types"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :mime > :types > application/activity+json"
+msgid "\"application/activity+json\""
+msgstr "\"application/activity+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :mime > :types > application/jrd+json"
+msgid "\"application/jrd+json\""
+msgstr "\"application/jrd+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :mime > :types > application/ld+json"
+msgid "\"application/ld+json\""
+msgstr "\"application/ld+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :mime > :types > application/xml"
+msgid "\"application/xml\""
+msgstr "\"application/xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :mime > :types > application/xrd+xml"
+msgid "\"application/xrd+xml\""
+msgstr "\"application/xrd+xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma > Pleroma.Web.Auth.Authenticator"
+msgid "Pleroma.Web.Auth.Authenticator"
+msgstr "Pleroma.Web.Auth.Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :blockers_visible"
+msgid "Blockers visible"
+msgstr "Blockers visible"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Follow handshake timeout"
+msgstr "Follow handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "Note replies output limit"
+msgstr "Note replies output limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Outgoing blocks"
+msgstr "Outgoing blocks"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches"
+msgstr "Sign object fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Unfollow blocked"
+msgstr "Unfollow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_mascot"
+msgid "Default mascot"
+msgstr "Default mascot"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_user_avatar"
+msgid "Default user avatar"
+msgstr "Default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:assets > :mascots"
+msgid "Mascots"
+msgstr "Mascots"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:auth > :auth_template"
+msgid "Auth template"
+msgstr "Auth template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "Enforce OAuth admin scope usage"
+msgstr "Enforce OAuth admin scope usage"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "OAuth consumer strategies"
+msgstr "OAuth consumer strategies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer template"
+msgstr "OAuth consumer template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :connect_timeout"
+msgid "Connect timeout"
+msgstr "Connect timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:connections_pool > :connection_acquisition_retries"
+msgid "Connection acquisition retries"
+msgstr "Connection acquisition retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:connections_pool > :connection_acquisition_wait"
+msgid "Connection acquisition wait"
+msgstr "Connection acquisition wait"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid "Reclaim multiplier"
+msgstr "Reclaim multiplier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest"
+msgid "Digest"
+msgstr "Digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :active"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:email_notifications > :digest > :"
+"inactivity_threshold"
+msgid "Inactivity threshold"
+msgstr "Inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :interval"
+msgid "Interval"
+msgstr "Interval"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :schedule"
+msgid "Schedule"
+msgstr "Schedule"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:emoji > :default_manifest"
+msgid "Default manifest"
+msgstr "Default manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:emoji > :groups"
+msgid "Groups"
+msgstr "Groups"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:emoji > :pack_extensions"
+msgid "Pack extensions"
+msgstr "Pack extensions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shared_pack_cache_seconds_per_file"
+msgid "Shared pack cache s/file"
+msgstr "Shared pack cache s/file"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shortcode_globs"
+msgid "Shortcode globs"
+msgstr "Shortcode globs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Improved hashtag timeline"
+msgstr "Improved hashtag timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title"
+msgid "Post title"
+msgstr "Post title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :max_length"
+msgid "Max length"
+msgstr "Max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :omission"
+msgid "Omission"
+msgstr "Omission"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Pleroma FE"
+msgstr "Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"alwaysShowSubjectInput"
+msgid "Always show subject input"
+msgstr "Always show subject input"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"collapseMessageWithSubject"
+msgid "Collapse message with subject"
+msgstr "Collapse message with subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Greentext"
+msgstr "Greentext"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideFilteredStatuses"
+msgid "Hide Filtered Statuses"
+msgstr "Hide Filtered Statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideMutedPosts"
+msgid "Hide Muted Posts"
+msgstr "Hide Muted Posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hidePostStats"
+msgid "Hide post stats"
+msgstr "Hide post stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideSitename"
+msgid "Hide Sitename"
+msgstr "Hide Sitename"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"hideUserStats"
+msgid "Hide user stats"
+msgstr "Hide user stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Logo margin"
+msgstr "Logo margin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "Logo mask"
+msgstr "Logo mask"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"minimalScopesMode"
+msgid "Minimal scopes mode"
+msgstr "Minimal scopes mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"nsfwCensorImage"
+msgid "NSFW Censor Image"
+msgstr "NSFW Censor Image"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"postContentType"
+msgid "Post Content Type"
+msgstr "Post Content Type"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"redirectRootLogin"
+msgid "Redirect root login"
+msgstr "Redirect root login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"redirectRootNoLogin"
+msgid "Redirect root no login"
+msgstr "Redirect root no login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Scope copy"
+msgstr "Scope copy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"showFeaturesPanel"
+msgid "Show instance features panel"
+msgstr "Show instance features panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"showInstanceSpecificPanel"
+msgid "Show instance specific panel"
+msgstr "Show instance specific panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"sidebarRight"
+msgid "Sidebar on Right"
+msgstr "Sidebar on Right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :"
+"subjectLineBehavior"
+msgid "Subject line behavior"
+msgstr "Subject line behavior"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Theme"
+msgstr "Theme"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin"
+msgid "Admin"
+msgstr "Admin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available"
+msgid "Available"
+msgstr "Available"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_dir"
+msgid "Build directory"
+msgstr "Build directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_url"
+msgid "Build URL"
+msgstr "Build URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:frontends > :available > custom-http-headers"
+msgid "Custom HTTP headers"
+msgstr "Custom HTTP headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > git"
+msgid "Git Repository URL"
+msgstr "Git Repository URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary"
+msgid "Primary"
+msgstr "Primary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:gopher > :dstport"
+msgid "Dstport"
+msgstr "Dstport"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:gopher > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:gopher > :ip"
+msgid "IP"
+msgstr "IP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:gopher > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation"
+msgid "Federation"
+msgstr "Federation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:hackney_pools > :federation > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media"
+msgid "Media"
+msgstr "Media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload"
+msgid "Upload"
+msgstr "Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL Options"
+msgstr "SSL Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "Versions"
+msgstr "Versions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http > :send_user_agent"
+msgid "Send user agent"
+msgstr "Send user agent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http > :user_agent"
+msgid "User agent"
+msgstr "User agent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http_security > :ct_max_age"
+msgid "CT max age"
+msgstr "CT max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http_security > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http_security > :referrer_policy"
+msgid "Referrer policy"
+msgstr "Referrer policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http_security > :report_uri"
+msgid "Report URI"
+msgstr "Report URI"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts"
+msgid "STS"
+msgstr "STS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts_max_age"
+msgid "STS max age"
+msgstr "STS max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_activation_required"
+msgid "Account activation required"
+msgstr "Account activation required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_approval_required"
+msgid "Account approval required"
+msgstr "Account approval required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_name_length"
+msgid "Account field name length"
+msgstr "Account field name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_value_length"
+msgid "Account field value length"
+msgstr "Account field value length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :allow_relay"
+msgid "Allow relay"
+msgstr "Allow relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :allowed_post_formats"
+msgid "Allowed post formats"
+msgstr "Allowed post formats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :attachment_links"
+msgid "Attachment links"
+msgstr "Attachment links"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Autofollowed nicknames"
+msgstr "Autofollowed nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Autofollowing nicknames"
+msgstr "Autofollowing nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :avatar_upload_limit"
+msgid "Avatar upload limit"
+msgstr "Avatar upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :background_upload_limit"
+msgid "Background upload limit"
+msgstr "Background upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :banner_upload_limit"
+msgid "Banner upload limit"
+msgstr "Banner upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :birthday_min_age"
+msgid "Birthday min age"
+msgstr "Birthday min age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :birthday_required"
+msgid "Birthday required"
+msgstr "Birthday required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :cleanup_attachments"
+msgid "Cleanup attachments"
+msgstr "Cleanup attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :description"
+msgid "Description"
+msgstr "Description"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :email"
+msgid "Admin Email Address"
+msgstr "Admin Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :extended_nickname_format"
+msgid "Extended nickname format"
+msgstr "Extended nickname format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :external_user_synchronization"
+msgid "External user synchronization"
+msgstr "External user synchronization"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :federating"
+msgid "Federating"
+msgstr "Federating"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Fed. incoming replies max depth"
+msgstr "Fed. incoming replies max depth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Fed. reachability timeout days"
+msgstr "Fed. reachability timeout days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :healthcheck"
+msgid "Healthcheck"
+msgstr "Healthcheck"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :instance_thumbnail"
+msgid "Instance thumbnail"
+msgstr "Instance thumbnail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :invites_enabled"
+msgid "Invites enabled"
+msgstr "Invites enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit"
+msgid "Limit"
+msgstr "Limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit to local content"
+msgstr "Limit to local content"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_account_fields"
+msgid "Max account fields"
+msgstr "Max account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_endorsed_users"
+msgid "Max endorsed users"
+msgstr "Max endorsed users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_media_attachments"
+msgid "Max media attachments"
+msgstr "Max media attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_pinned_statuses"
+msgid "Max pinned statuses"
+msgstr "Max pinned statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_remote_account_fields"
+msgid "Max remote account fields"
+msgstr "Max remote account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_report_comment_size"
+msgid "Max report comment size"
+msgstr "Max report comment size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi factor authentication"
+msgstr "Multi factor authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :multi_factor_authentication > :"
+"backup_codes"
+msgid "Backup codes"
+msgstr "Backup codes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :multi_factor_authentication > :"
+"backup_codes > :length"
+msgid "Length"
+msgstr "Length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :multi_factor_authentication > :"
+"backup_codes > :number"
+msgid "Number"
+msgstr "Number"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :multi_factor_authentication > :totp > :"
+"digits"
+msgid "Digits"
+msgstr "Digits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:instance > :multi_factor_authentication > :totp > :"
+"period"
+msgid "Period"
+msgstr "Period"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :notify_email"
+msgid "Sender Email Address"
+msgstr "Sender Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits"
+msgid "Poll limits"
+msgstr "Poll limits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Max expiration"
+msgstr "Max expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Max option chars"
+msgstr "Max option chars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Max options"
+msgstr "Max options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Min expiration"
+msgstr "Min expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :privileged_staff"
+msgid "Privileged staff"
+msgstr "Privileged staff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :profile_directory"
+msgid "Profile directory"
+msgstr "Profile directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :public"
+msgid "Public"
+msgstr "Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :quarantined_instances"
+msgid "Quarantined instances"
+msgstr "Quarantined instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :registration_reason_length"
+msgid "Registration reason length"
+msgstr "Registration reason length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :registrations_open"
+msgid "Registrations open"
+msgstr "Registrations open"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_limit"
+msgid "Remote limit"
+msgstr "Remote limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_post_retention_days"
+msgid "Remote post retention days"
+msgstr "Remote post retention days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :safe_dm_mentions"
+msgid "Safe DM mentions"
+msgstr "Safe DM mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :show_reactions"
+msgid "Show reactions"
+msgstr "Show reactions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip thread containment"
+msgstr "Skip thread containment"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :static_dir"
+msgid "Static dir"
+msgstr "Static dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :upload_limit"
+msgid "Upload limit"
+msgstr "Upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_bio_length"
+msgid "User bio length"
+msgstr "User bio length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_name_length"
+msgid "User name length"
+msgstr "User name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :base"
+msgid "Base"
+msgstr "Base"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :ssl"
+msgid "SSL"
+msgstr "SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts"
+msgid "SSL options"
+msgstr "SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tls"
+msgid "TLS"
+msgstr "TLS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts"
+msgid "TLS options"
+msgstr "TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:ldap > :uid"
+msgid "UID"
+msgstr "UID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:majic_pool > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:manifest > :background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:manifest > :icons"
+msgid "Icons"
+msgstr "Icons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:manifest > :theme_color"
+msgid "Theme color"
+msgstr "Theme color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_fonts"
+msgid "Allow fonts"
+msgstr "Allow fonts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_headings"
+msgid "Allow headings"
+msgstr "Allow headings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_inline_images"
+msgid "Allow inline images"
+msgstr "Allow inline images"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_tables"
+msgid "Allow tables"
+msgstr "Allow tables"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Image quality"
+msgstr "Image quality"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length"
+msgstr "Min content length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Thumbnail max height"
+msgstr "Thumbnail max height"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Thumbnail max width"
+msgstr "Thumbnail max width"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation"
+msgid "Invalidation"
+msgstr "Invalidation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Provider"
+msgstr "Provider"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts"
+msgid "Advanced MediaProxy Options"
+msgstr "Advanced MediaProxy Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Max body length"
+msgstr "Max body length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Max read duration"
+msgstr "Max read duration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirect on failure"
+msgstr "Redirect on failure"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :whitelist"
+msgid "Whitelist"
+msgstr "Whitelist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:modules > :runtime_dir"
+msgid "Runtime dir"
+msgstr "Runtime dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf > :policies"
+msgid "Policies"
+msgstr "Policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency"
+msgid "MRF transparency"
+msgstr "MRF transparency"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency_exclusions"
+msgid "MRF transparency exclusions"
+msgstr "MRF transparency exclusions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration > :days"
+msgid "Days"
+msgstr "Days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "Follower nickname"
+msgstr "Follower nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :sensitive"
+msgid "Sensitive"
+msgstr "Sensitive"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Delist threshold"
+msgstr "Delist threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Reject threshold"
+msgstr "Reject threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :replace"
+msgid "Replace"
+msgstr "Replace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention > :actors"
+msgid "Actors"
+msgstr "Actors"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :actions"
+msgid "Actions"
+msgstr "Actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :threshold"
+msgid "Threshold"
+msgstr "Threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Allow direct"
+msgstr "Allow direct"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Allow followers-only"
+msgstr "Allow followers-only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :avatar_removal"
+msgid "Avatar removal"
+msgstr "Avatar removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :banner_removal"
+msgid "Banner removal"
+msgstr "Banner removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :followers_only"
+msgid "Followers only"
+msgstr "Followers only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_nsfw"
+msgid "Media NSFW"
+msgstr "Media NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_removal"
+msgid "Media removal"
+msgstr "Media removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject_deletes"
+msgid "Reject deletes"
+msgstr "Reject deletes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :report_removal"
+msgid "Report removal"
+msgstr "Report removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "Hosts"
+msgstr "Hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid "Rejected shortcodes"
+msgstr "Rejected shortcodes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "Size limit"
+msgstr "Size limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain > :match_actor"
+msgid "Match actor"
+msgstr "Match actor"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Clean expired tokens"
+msgstr "Clean expired tokens"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Issue new refresh token"
+msgstr "Issue new refresh token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :token_expires_in"
+msgid "Token expires in"
+msgstr "Token expires in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :default"
+msgid "Default"
+msgstr "Default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation"
+msgid "Federation"
+msgstr "Federation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :media"
+msgid "Media"
+msgstr "Media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload"
+msgid "Upload"
+msgstr "Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Fault rate allowance"
+msgstr "Fault rate allowance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval ms"
+msgstr "Sleep interval ms"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :app_account_creation"
+msgid "App account creation"
+msgstr "App account creation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :authentication"
+msgid "Authentication"
+msgstr "Authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relation_id_action"
+msgid "Relation ID action"
+msgstr "Relation ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relations_actions"
+msgid "Relations actions"
+msgstr "Relations actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :search"
+msgid "Search"
+msgstr "Search"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :status_id_action"
+msgid "Status ID action"
+msgstr "Status ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :statuses_actions"
+msgid "Statuses actions"
+msgstr "Statuses actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :timeline"
+msgid "Timeline"
+msgstr "Timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Activities"
+msgstr "Activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Profiles"
+msgstr "Profiles"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Timelines"
+msgstr "Timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Federated"
+msgstr "Federated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :failure_backoff"
+msgid "Failure backoff"
+msgstr "Failure backoff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_hosts"
+msgid "Ignore hosts"
+msgstr "Ignore hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_tld"
+msgid "Ignore TLD"
+msgstr "Ignore TLD"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :parsers"
+msgid "Parsers"
+msgstr "Parsers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ttl_setters"
+msgid "TTL setters"
+msgstr "TTL setters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:shout > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:shout > :limit"
+msgid "Limit"
+msgstr "Limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:static_fe > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:streamer > :overflow_workers"
+msgid "Overflow workers"
+msgstr "Overflow workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:streamer > :workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes > :valid_schemes"
+msgid "Valid schemes"
+msgstr "Valid schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:user > :deny_follow_blocked"
+msgid "Deny follow blocked"
+msgstr "Deny follow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub"
+msgstr "Activity pub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub question"
+msgstr "Activity pub question"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message"
+msgid "Chat message"
+msgstr "Chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :message"
+msgid "Message"
+msgstr "Message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr "Sender nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message"
+msgid "Direct message"
+msgstr "Direct message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :message"
+msgid "Message"
+msgstr "Message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr "Sender nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email"
+msgid "Email"
+msgstr "Email"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :html"
+msgid "Html"
+msgstr "Html"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :sender"
+msgid "Sender"
+msgstr "Sender"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:workers > :retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF."
+"MediaProxyWarmingPolicy"
+msgid "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgstr "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF."
+"MediaProxyWarmingPolicy > :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF."
+"MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Pleroma.Web.RichMedia.Helpers"
+msgstr "Pleroma.Web.RichMedia.Helpers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers "
+"> :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers "
+"> :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :crontab"
+msgid "Crontab"
+msgstr "Crontab"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :log"
+msgid "Log"
+msgstr "Log"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues"
+msgid "Queues"
+msgstr "Queues"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration"
+msgstr "Activity expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachments cleanup"
+msgstr "Attachments cleanup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :backup"
+msgid "Backup"
+msgstr "Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Federator incoming"
+msgstr "Federator incoming"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Federator outgoing"
+msgstr "Federator outgoing"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :mailer"
+msgid "Mailer"
+msgstr "Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities"
+msgstr "Scheduled activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier"
+msgstr "Transmogrifier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :web_push"
+msgid "Web push"
+msgstr "Web push"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "Seconds valid"
+msgstr "Seconds valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :enabled"
+msgid "Mailer Enabled"
+msgstr "Mailer Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:"
+"access_key"
+msgid "AWS Access Key"
+msgstr "AWS Access Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:"
+"region"
+msgid "AWS Region"
+msgstr "AWS Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:"
+"secret"
+msgid "AWS Secret Key"
+msgstr "AWS Secret Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Dyn-:api_key"
+msgid "Dyn API Key"
+msgstr "Dyn API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Gmail-:"
+"access_token"
+msgid "GMail API Access Token"
+msgstr "GMail API Access Token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:"
+"api_key"
+msgid "Mailgun API Key"
+msgstr "Mailgun API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:"
+"domain"
+msgid "Domain"
+msgstr "Domain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:"
+"api_key"
+msgid "MailJet Public API Key"
+msgstr "MailJet Public API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:"
+"secret"
+msgid "MailJet Private API Key"
+msgstr "MailJet Private API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mandrill-:"
+"api_key"
+msgid "Mandrill API Key"
+msgstr "Mandrill API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Postmark-:"
+"api_key"
+msgid "Postmark API Key"
+msgstr "Postmark API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "AUTH Mode"
+msgstr "AUTH Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"password"
+msgid "Password"
+msgstr "Password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Relay"
+msgstr "Relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use SSL"
+msgstr "Use SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "STARTTLS Mode"
+msgstr "STARTTLS Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:"
+"username"
+msgid "Username"
+msgstr "Username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendgrid-:"
+"api_key"
+msgid "SendGrid API Key"
+msgstr "SendGrid API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:"
+"cmd_args"
+msgid "Cmd args"
+msgstr "Cmd args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:"
+"cmd_path"
+msgid "Cmd path"
+msgstr "Cmd path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:"
+"qmail"
+msgid "Qmail compat mode"
+msgstr "Qmail compat mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:"
+"api_key"
+msgid "SocketLabs API Key"
+msgstr "SocketLabs API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:"
+"server_id"
+msgid "Server ID"
+msgstr "Server ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:"
+"api_key"
+msgid "SparkPost API key"
+msgstr "SparkPost API key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:"
+"endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "Styling"
+msgstr "Styling"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :"
+"background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :"
+"content_background_color"
+msgid "Content background color"
+msgstr "Content background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :header_color"
+msgid "Header color"
+msgstr "Header color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :link_color"
+msgid "Link color"
+msgstr "Link color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_color"
+msgid "Text color"
+msgstr "Text color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :"
+"text_muted_color"
+msgid "Text muted color"
+msgstr "Text muted color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :class"
+msgid "Class"
+msgstr "Class"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :extra"
+msgid "Extra"
+msgstr "Extra"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :new_window"
+msgid "New window"
+msgstr "New window"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :rel"
+msgid "Rel"
+msgstr "Rel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip prefix"
+msgstr "Strip prefix"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Truncate"
+msgstr "Truncate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Validate tld"
+msgstr "Validate tld"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "Daily user limit"
+msgstr "Daily user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "Total user limit"
+msgstr "Total user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Filename display max length"
+msgstr "Filename display max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :filters"
+msgid "Filters"
+msgstr "Filters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :link_name"
+msgid "Link name"
+msgstr "Link name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy remote"
+msgstr "Proxy remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :uploader"
+msgid "Uploader"
+msgstr "Uploader"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "Args"
+msgstr "Args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Uploads"
+msgstr "Uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "Bucket"
+msgstr "Bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "Bucket namespace"
+msgstr "Bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Streaming enabled"
+msgstr "Streaming enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "Truncated namespace"
+msgstr "Truncated namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :email_blacklist"
+msgid "Email blacklist"
+msgstr "Email blacklist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "Restricted nicknames"
+msgstr "Restricted nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit days"
+msgstr "Limit days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Purge after days"
+msgstr "Purge after days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Strict"
+msgstr "Strict"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Options"
+msgstr "Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options "
+"> :params"
+msgid "Params"
+msgstr "Params"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :"
+"script_path"
+msgid "Script path"
+msgstr "Script path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :"
+"url_format"
+msgid "URL Format"
+msgstr "URL Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "Unfurl NSFW"
+msgstr "Unfurl NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "Proxies"
+msgstr "Proxies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid "Reserved"
+msgstr "Reserved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Min lifetime"
+msgstr "Min lifetime"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
+msgid "Auth"
+msgstr "Auth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :"
+"ip_whitelist"
+msgid "IP Whitelist"
+msgstr "IP Whitelist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt ""
+"config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
+msgid "Path"
+msgstr "Path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :quack > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :quack > :meta"
+msgid "Meta"
+msgstr "Meta"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :quack > :webhook_url"
+msgid "Webhook URL"
+msgstr "Webhook URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :private_key"
+msgid "Private key"
+msgstr "Private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :public_key"
+msgid "Public key"
+msgstr "Public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Require HTTP signatures for AP fetches"
+msgstr "Require HTTP signatures for AP fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config description at :pleroma-:instance > :short_description"
+msgid ""
+"Shorter version of instance description. It can be seen on `/api/v1/instance`"
+msgstr ""
+"Shorter version of instance description. It can be seen on `/api/v1/instance`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Authorized fetch mode"
+msgstr "Authorized fetch mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, fuzzy
+msgctxt "config label at :pleroma-:instance > :short_description"
+msgid "Short description"
+msgstr "Short description"
diff --git a/priv/gettext/ca/LC_MESSAGES/errors.po b/priv/gettext/ca/LC_MESSAGES/errors.po
new file mode 100644
index 000000000..f45f21e31
--- /dev/null
+++ b/priv/gettext/ca/LC_MESSAGES/errors.po
@@ -0,0 +1,546 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-07-29 11:37+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 3.7.1\n"
+
+# # This file is a PO Template file.
+# #
+# # `msgid`s here are often extracted from source code.
+# # Add new translations manually only if they're dynamic
+# # translations that can't be statically extracted.
+# #
+# # Run `mix gettext.extract` to bring this file up to
+# # date. Leave `msgstr`s empty as changing them here as no
+# # effect: edit them in PO (`.po`) files instead.
+# # From Ecto.Changeset.cast/4
+msgid "can't be blank"
+msgstr "No pot estar en blanc"
+
+# # From Ecto.Changeset.unique_constraint/3
+msgid "has already been taken"
+msgstr "ja s'ha agafat"
+
+# # From Ecto.Changeset.put_change/3
+msgid "is invalid"
+msgstr "és invàlid"
+
+# # From Ecto.Changeset.validate_format/3
+msgid "has invalid format"
+msgstr "té format invàlid"
+
+# # From Ecto.Changeset.validate_subset/3
+msgid "has an invalid entry"
+msgstr "té una entrada no vàlida"
+
+# # From Ecto.Changeset.validate_exclusion/3
+msgid "is reserved"
+msgstr "està reservat"
+
+# # From Ecto.Changeset.validate_confirmation/3
+msgid "does not match confirmation"
+msgstr "no coincideix amb la confirmació"
+
+# # From Ecto.Changeset.no_assoc_constraint/3
+msgid "is still associated with this entry"
+msgstr "està encara associat amb aquesta entrada"
+
+msgid "are still associated with this entry"
+msgstr "estan encara associats amb aquesta entrada"
+
+# # From Ecto.Changeset.validate_length/3
+msgid "should be %{count} character(s)"
+msgid_plural "should be %{count} character(s)"
+msgstr[0] "hauria de ser %{count} caràcter"
+msgstr[1] "hauria de ser %{count} caràcters"
+
+msgid "should have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] "hauria de tenir %{count} article"
+msgstr[1] "hauria de tenir %{count} articles"
+
+msgid "should be at least %{count} character(s)"
+msgid_plural "should be at least %{count} character(s)"
+msgstr[0] "hauria de ser al menys %{count} caràcter"
+msgstr[1] "hauria de ser al menys %{count} caràcters"
+
+msgid "should have at least %{count} item(s)"
+msgid_plural "should have at least %{count} item(s)"
+msgstr[0] "hauria de tenir al menys %{count} article"
+msgstr[1] "hauria de tenir al menys %{count} articles"
+
+msgid "should be at most %{count} character(s)"
+msgid_plural "should be at most %{count} character(s)"
+msgstr[0] "hauria de ser com a molt %{count} caràcter"
+msgstr[1] "hauria de ser com a molt %{count} caràcters"
+
+msgid "should have at most %{count} item(s)"
+msgid_plural "should have at most %{count} item(s)"
+msgstr[0] "com a molt hauria de ser %{count} article"
+msgstr[1] "com a molt haurien de ser %{count} articles"
+
+# # From Ecto.Changeset.validate_number/3
+msgid "must be less than %{number}"
+msgstr "ha de ser menor que %{number}"
+
+msgid "must be greater than %{number}"
+msgstr "ha de ser major que %{number}"
+
+msgid "must be less than or equal to %{number}"
+msgstr "ha de ser menor o igual a %{number}"
+
+msgid "must be greater than or equal to %{number}"
+msgstr "ha de ser més gran o igual a %{number}"
+
+msgid "must be equal to %{number}"
+msgstr "ha de ser igual a %{number}"
+
+#: lib/pleroma/web/common_api.ex:523
+msgid "Account not found"
+msgstr "Compte no trobat"
+
+#: lib/pleroma/web/common_api.ex:316
+msgid "Already voted"
+msgstr "Ja votada"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:402
+msgid "Bad request"
+msgstr "Mala Sol·licitud"
+
+#: lib/pleroma/web/controller_helper.ex:97
+#: lib/pleroma/web/controller_helper.ex:103
+msgid "Can't display this activity"
+msgstr "No es pot mostrar aquesta activitat"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:325
+msgid "Can't find user"
+msgstr "No es pot trobar l'usuari"
+
+#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:80
+msgid "Can't get favorites"
+msgstr "No es poden obtenir els favorits"
+
+#: lib/pleroma/web/common_api/utils.ex:482
+msgid "Cannot post an empty status without attachments"
+msgstr "No es pot publicar un apunt buit sense adjunts"
+
+#: lib/pleroma/web/common_api/utils.ex:441
+msgid "Comment must be up to %{max_size} characters"
+msgstr "El comentari ha de ser fins a %{max_size} caràcters"
+
+#: lib/pleroma/config_db.ex:200
+msgid "Config with params %{params} not found"
+msgstr "Configuració amb paràmetres %{params} no trobada"
+
+#: lib/pleroma/web/common_api.ex:167 lib/pleroma/web/common_api.ex:171
+msgid "Could not delete"
+msgstr "No es pot esborrar"
+
+#: lib/pleroma/web/common_api.ex:217
+msgid "Could not favorite"
+msgstr "No es pot afavorir"
+
+#: lib/pleroma/web/common_api.ex:254
+msgid "Could not unfavorite"
+msgstr "No es pot desfer el favorit"
+
+#: lib/pleroma/web/common_api.ex:202
+msgid "Could not unrepeat"
+msgstr "No es pot desfer la repetició"
+
+#: lib/pleroma/web/common_api.ex:530 lib/pleroma/web/common_api.ex:539
+msgid "Could not update state"
+msgstr "No es pot actualitzar l'apunt"
+
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:205
+msgid "Error."
+msgstr "Error."
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:105
+msgid "Invalid CAPTCHA"
+msgstr "CAPTCHA invàlid"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:144
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:631
+msgid "Invalid credentials"
+msgstr "Credencials invàlides"
+
+#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:42
+msgid "Invalid credentials."
+msgstr "Credencials invàlides."
+
+#: lib/pleroma/web/common_api.ex:337
+msgid "Invalid indices"
+msgstr "Index invàlids"
+
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:29
+msgid "Invalid parameters"
+msgstr "Paràmetres invàlids"
+
+#: lib/pleroma/web/common_api/utils.ex:349
+msgid "Invalid password."
+msgstr "Contrasenya invàlida."
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:255
+msgid "Invalid request"
+msgstr "Sol·licitud invàlida"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:108
+msgid "Kocaptcha service unavailable"
+msgstr "Servei Kocaptcha no disponible"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:140
+msgid "Missing parameters"
+msgstr "Falten paràmetres"
+
+#: lib/pleroma/web/common_api/utils.ex:477
+msgid "No such conversation"
+msgstr "No hi ha tal conversa"
+
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:171
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:197
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:239
+msgid "No such permission_group"
+msgstr "No existeix permission_group"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:515
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:11
+#: lib/pleroma/web/feed/tag_controller.ex:16
+#: lib/pleroma/web/feed/user_controller.ex:69
+#: lib/pleroma/web/o_status/o_status_controller.ex:132
+#: lib/pleroma/web/plugs/uploaded_media.ex:84
+msgid "Not found"
+msgstr "No trobat"
+
+#: lib/pleroma/web/common_api.ex:308
+msgid "Poll's author can't vote"
+msgstr "L'autor de l'enquesta no pot votar-hi"
+
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:39
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:51
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:52
+#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:326
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71
+msgid "Record not found"
+msgstr "Registre no trobat"
+
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:35
+#: lib/pleroma/web/feed/user_controller.ex:78
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:42
+#: lib/pleroma/web/o_status/o_status_controller.ex:138
+msgid "Something went wrong"
+msgstr "Alguna cosa ha anat malament"
+
+#: lib/pleroma/web/common_api/activity_draft.ex:143
+msgid "The message visibility must be direct"
+msgstr "La visibilitat del missatge ha de ser directe"
+
+#: lib/pleroma/web/common_api/utils.ex:492
+msgid "The status is over the character limit"
+msgstr "L'apunt està per sobre del limit de caràcters"
+
+#: lib/pleroma/web/plugs/ensure_public_or_authenticated_plug.ex:36
+msgid "This resource requires authentication."
+msgstr "Aquest recurs requereix autenticació."
+
+#: lib/pleroma/web/plugs/rate_limiter.ex:208
+msgid "Throttled"
+msgstr "Estrangulat"
+
+#: lib/pleroma/web/common_api.ex:338
+msgid "Too many choices"
+msgstr "Massa opcions"
+
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:268
+msgid "You can't revoke your own admin status."
+msgstr "No pots revocar el teu propi estat d'administrador."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:243
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:333
+msgid "Your account is currently disabled"
+msgstr "El teu compte està actualment desactivat"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:205
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:356
+msgid "Your login is missing a confirmed e-mail address"
+msgstr "Al teu inici de sessió li falta una adreça de correu confirmada"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:403
+msgid "can't read inbox of %{nickname} as %{as_nickname}"
+msgstr "no puc llegir la safata d'entrada de %{nickname} com a %{as_nickname}"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:502
+msgid "can't update outbox of %{nickname} as %{as_nickname}"
+msgstr ""
+"no es pot actualitzar la safata de sortida de %{nickname} com a "
+"%{as_nickname}"
+
+#: lib/pleroma/web/common_api.ex:475
+msgid "conversation is already muted"
+msgstr "la conversa ja està silenciada"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:521
+msgid "error"
+msgstr "error"
+
+#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:34
+msgid "mascots can only be images"
+msgstr "les mascotes només poden ser imatges"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:63
+msgid "not found"
+msgstr "no trobat"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:437
+msgid "Bad OAuth request."
+msgstr "Sol·licitu OAuth dolenta."
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:114
+msgid "CAPTCHA already used"
+msgstr "CAPTCHA ja usat"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:111
+msgid "CAPTCHA expired"
+msgstr "CAPTCHA expirat"
+
+#: lib/pleroma/web/plugs/uploaded_media.ex:57
+msgid "Failed"
+msgstr "Fallat"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:453
+msgid "Failed to authenticate: %{message}."
+msgstr "No s'ha pogut autenticar: %{message}."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:484
+msgid "Failed to set up user account."
+msgstr "No s'ha pogut configurar el compte d'usuari."
+
+#: lib/pleroma/web/plugs/o_auth_scopes_plug.ex:37
+msgid "Insufficient permissions: %{permissions}."
+msgstr "Permisos insuficients: %{permissions}."
+
+#: lib/pleroma/web/plugs/uploaded_media.ex:111
+msgid "Internal Error"
+msgstr "Error intern"
+
+#: lib/pleroma/web/o_auth/fallback_controller.ex:22
+#: lib/pleroma/web/o_auth/fallback_controller.ex:29
+msgid "Invalid Username/Password"
+msgstr "Usuari/Contrasenya invàlids"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:117
+msgid "Invalid answer data"
+msgstr "dada de resposta invàlida"
+
+#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:33
+msgid "Nodeinfo schema version not handled"
+msgstr "Versió no controlada del Esquema Nodeinfo"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:194
+msgid "This action is outside the authorized scopes"
+msgstr "Aquesta acció és fora dels àmbits autoritzats"
+
+#: lib/pleroma/web/o_auth/fallback_controller.ex:14
+msgid "Unknown error, please check the details and try again."
+msgstr "Error desconegut, si us plau verifica els detalls i prova-ho de nou."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:136
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:180
+msgid "Unlisted redirect_uri."
+msgstr "redirect_uri no llistada."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:433
+msgid "Unsupported OAuth provider: %{provider}."
+msgstr "Proveïdor OAuth no compatible: %{provider}."
+
+#: lib/pleroma/uploaders/uploader.ex:74
+msgid "Uploader callback timeout"
+msgstr "Temps d'espera esgotat del callback del carregador"
+
+#: lib/pleroma/web/uploader_controller.ex:23
+msgid "bad request"
+msgstr "sol·licitud dolenta"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:102
+msgid "CAPTCHA Error"
+msgstr "Error CAPTCHA"
+
+#: lib/pleroma/web/common_api.ex:266
+msgid "Could not add reaction emoji"
+msgstr "No es pot afegir la reacció emoji"
+
+#: lib/pleroma/web/common_api.ex:277
+msgid "Could not remove reaction emoji"
+msgstr "No es pot treure la reacció emoji"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:128
+msgid "Invalid CAPTCHA (Missing parameter: %{name})"
+msgstr "CAPTCHA invàlid (Falta el paràmetre: %{name})"
+
+#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:96
+msgid "List not found"
+msgstr "Llista no trobada"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:151
+msgid "Missing parameter: %{name}"
+msgstr "Falta el paràmetre: %{name}"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:232
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:346
+msgid "Password reset is required"
+msgstr "Es requereix restablir la contrasenya"
+
+#: lib/pleroma/tests/auth_test_controller.ex:9
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/announcement_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/chat_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/config_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/frontend_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/instance_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/instance_document_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/invite_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/o_auth_app_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/relay_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/status_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/user_controller.ex:6
+#: lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/embed_controller.ex:6
+#: lib/pleroma/web/fallback/redirect_controller.ex:6
+#: lib/pleroma/web/feed/tag_controller.ex:6
+#: lib/pleroma/web/feed/user_controller.ex:6
+#: lib/pleroma/web/mailer/subscription_controller.ex:6
+#: lib/pleroma/web/manifest_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/app_controller.ex:11
+#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/directory_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14
+#: lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7
+#: lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6
+#: lib/pleroma/web/media_proxy/media_proxy_controller.ex:6
+#: lib/pleroma/web/mongoose_im/mongoose_im_controller.ex:6
+#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6
+#: lib/pleroma/web/o_auth/fallback_controller.ex:6
+#: lib/pleroma/web/o_auth/mfa_controller.ex:10
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:6
+#: lib/pleroma/web/o_status/o_status_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/app_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/backup_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/chat_controller.ex:5
+#: lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/instances_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/notification_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7
+#: lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex:6
+#: lib/pleroma/web/static_fe/static_fe_controller.ex:6
+#: lib/pleroma/web/twitter_api/controller.ex:6
+#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10
+#: lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6
+#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6
+#: lib/pleroma/web/uploader_controller.ex:6
+#: lib/pleroma/web/web_finger/web_finger_controller.ex:6
+msgid ""
+"Security violation: OAuth scopes check was neither handled nor explicitly "
+"skipped."
+msgstr ""
+"Violació de seguretat: la verificació dels àmbits OAuth no ha estat ni "
+"controlada ni explícitament omesa."
+
+#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:32
+msgid "Two-factor authentication enabled, you must use a access token."
+msgstr "Autenticació de dos factor activada, has d'usar un token d'accés."
+
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61
+msgid "Web push subscription is disabled on this Pleroma instance"
+msgstr "La subscripció Web push està desactivada en aquesta instància Akkoma"
+
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:234
+msgid "You can't revoke your own admin/moderator status."
+msgstr "No pots revocar els teu propi estat de admin/moderador."
+
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:129
+msgid "authorization required for timeline view"
+msgstr "es requereix autorització per a veure la línia de temps"
+
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:24
+msgid "Access denied"
+msgstr "Accés denegat"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:322
+msgid "This API requires an authenticated user"
+msgstr "Aquesta API requereix un usuari autenticat"
+
+#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:26
+#: lib/pleroma/web/plugs/user_is_admin_plug.ex:21
+msgid "User is not an admin."
+msgstr "L'usuari no és un admin."
+
+#: lib/pleroma/user/backup.ex:75
+msgid "Last export was less than a day ago"
+msgid_plural "Last export was less than %{days} days ago"
+msgstr[0] "La darrera exportació va ser fa menys d'un dia"
+msgstr[1] "La darrera exportació va ser fa menys de %{days} dies"
+
+#: lib/pleroma/user/backup.ex:93
+msgid "Backups require enabled email"
+msgstr "Les copies de seguretat requereixen un correu activat"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:434
+msgid ""
+"Character limit (%{limit} characters) exceeded, contains %{length} characters"
+msgstr ""
+"Limit de caràcters (%{limit} characters) excedit, conté %{length} caràcters"
+
+#: lib/pleroma/user/backup.ex:98
+msgid "Email is required"
+msgstr "Es requereix correu"
+
+#: lib/pleroma/web/common_api/utils.ex:507
+msgid "Too many attachments"
+msgstr "Massa adjunts"
+
+#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:33
+#: lib/pleroma/web/plugs/user_is_staff_plug.ex:20
+msgid "User is not a staff member."
+msgstr "L'usuari no és un membre del equip."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:366
+msgid "Your account is awaiting approval."
+msgstr "El teu compte espera aprovació."
diff --git a/priv/gettext/ca/LC_MESSAGES/posix_errors.po b/priv/gettext/ca/LC_MESSAGES/posix_errors.po
new file mode 100644
index 000000000..cd723f0f5
--- /dev/null
+++ b/priv/gettext/ca/LC_MESSAGES/posix_errors.po
@@ -0,0 +1,163 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-07-28 09:15+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 3.7.1\n"
+
+## This file is a PO Template file.
+##
+## `msgid`s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run `mix gettext.extract` to bring this file up to
+## date. Leave `msgstr`s empty as changing them here as no
+## effect: edit them in PO (`.po`) files instead.
+msgid "eperm"
+msgstr ""
+
+msgid "eacces"
+msgstr ""
+
+msgid "eagain"
+msgstr ""
+
+msgid "ebadf"
+msgstr ""
+
+msgid "ebadmsg"
+msgstr ""
+
+msgid "ebusy"
+msgstr ""
+
+msgid "edeadlk"
+msgstr ""
+
+msgid "edeadlock"
+msgstr ""
+
+msgid "edquot"
+msgstr ""
+
+msgid "eexist"
+msgstr ""
+
+msgid "efault"
+msgstr ""
+
+msgid "efbig"
+msgstr ""
+
+msgid "eftype"
+msgstr ""
+
+msgid "eintr"
+msgstr ""
+
+msgid "einval"
+msgstr ""
+
+msgid "eio"
+msgstr ""
+
+msgid "eisdir"
+msgstr ""
+
+msgid "eloop"
+msgstr ""
+
+msgid "emfile"
+msgstr ""
+
+msgid "emlink"
+msgstr ""
+
+msgid "emultihop"
+msgstr ""
+
+msgid "enametoolong"
+msgstr ""
+
+msgid "enfile"
+msgstr ""
+
+msgid "enobufs"
+msgstr ""
+
+msgid "enodev"
+msgstr ""
+
+msgid "enolck"
+msgstr ""
+
+msgid "enolink"
+msgstr ""
+
+msgid "enoent"
+msgstr ""
+
+msgid "enomem"
+msgstr ""
+
+msgid "enospc"
+msgstr ""
+
+msgid "enosr"
+msgstr ""
+
+msgid "enostr"
+msgstr ""
+
+msgid "enosys"
+msgstr ""
+
+msgid "enotblk"
+msgstr ""
+
+msgid "enotdir"
+msgstr ""
+
+msgid "enotsup"
+msgstr ""
+
+msgid "enxio"
+msgstr ""
+
+msgid "eopnotsupp"
+msgstr ""
+
+msgid "eoverflow"
+msgstr ""
+
+msgid "epipe"
+msgstr ""
+
+msgid "erange"
+msgstr ""
+
+msgid "erofs"
+msgstr ""
+
+msgid "espipe"
+msgstr ""
+
+msgid "esrch"
+msgstr ""
+
+msgid "estale"
+msgstr ""
+
+msgid "etxtbsy"
+msgstr ""
+
+msgid "exdev"
+msgstr ""
diff --git a/priv/gettext/ca/LC_MESSAGES/static_pages.po b/priv/gettext/ca/LC_MESSAGES/static_pages.po
new file mode 100644
index 000000000..1d7c4e0a8
--- /dev/null
+++ b/priv/gettext/ca/LC_MESSAGES/static_pages.po
@@ -0,0 +1,567 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-07-28 09:15+0000\n"
+"PO-Revision-Date: 2022-07-30 21:58+0000\n"
+"Last-Translator: sola \n"
+"Language-Team: Catalan \n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.13.1\n"
+
+## This file is a PO Template file.
+##
+## "msgid"s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run "mix gettext.extract" to bring this file up to
+## date. Leave "msgstr"s empty as changing them here as no
+## effect: edit them in PO (.po) files instead.
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:9
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button"
+msgid "Authorize"
+msgstr "Autoritza"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "remote follow error"
+msgid "Error fetching user"
+msgstr "Error obtenint usuari"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow header"
+msgid "Remote follow"
+msgstr "Seguiment remot"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for auth code entry"
+msgid "Authentication code"
+msgstr "Codi d'autenticació"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:10
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for password entry"
+msgid "Password"
+msgstr "Contrasenya"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for username entry"
+msgid "Username"
+msgstr "Nom d'usuari"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:13
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button for login"
+msgid "Authorize"
+msgstr "Autoritza"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button for mfa"
+msgid "Authorize"
+msgstr "Autoritza"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "remote follow error"
+msgid "Error following account"
+msgstr "Error seguint el compte"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow header, need login"
+msgid "Log in to follow"
+msgstr "Inicia sessió per a seguir"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow mfa header"
+msgid "Two-factor authentication"
+msgstr "Autenticació de dos factors"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow success"
+msgid "Account followed!"
+msgstr "Compte seguit!"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:7
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for account id"
+msgid "Your account ID, e.g. lain@quitter.se"
+msgstr "L'ID del teu compte, p.e. maria@exemple.cat"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button for following with a remote account"
+msgid "Follow"
+msgstr "Segueix"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "remote follow error"
+msgid "Error: %{error}"
+msgstr "Error: %{error}"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow header"
+msgid "Remotely follow %{nickname}"
+msgstr "Seguir remotament %{nickname}"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "password reset button"
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "password reset failed homepage link"
+msgid "Homepage"
+msgstr "Pàgina d'inici"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "password reset failed message"
+msgid "Password reset failed"
+msgstr "Error al restablir la contrasenya"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "password reset form confirm password prompt"
+msgid "Confirmation"
+msgstr "Confirmació"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "password reset form password prompt"
+msgid "Password"
+msgstr "Contrasenya"
+
+#: lib/pleroma/web/templates/twitter_api/password/invalid_token.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "password reset invalid token message"
+msgid "Invalid Token"
+msgstr "Token Invàlid"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "password reset successful homepage link"
+msgid "Homepage"
+msgstr "Pàgina d'inici"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "password reset successful message"
+msgid "Password changed!"
+msgstr "Contrasenya canviada!"
+
+#: lib/pleroma/web/templates/feed/feed/tag.atom.eex:15
+#: lib/pleroma/web/templates/feed/feed/tag.rss.eex:7
+#, elixir-autogen, elixir-format
+msgctxt "tag feed description"
+msgid "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse."
+msgstr ""
+"Aquests son apunts públics etiquetats amb #%{tag}. Pots interactuar amb ells "
+"si tens un compte en qualsevol lloc del fedivers."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorization exists page title"
+msgid "Authorization exists"
+msgstr "Existeix autorització"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:32
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorize approve button"
+msgid "Approve"
+msgstr "Aprova"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:30
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorize cancel button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:23
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorize message"
+msgid "Application %{client_name} is requesting access to your account."
+msgstr ""
+"L'aplicació %{client_name} sol·licita accés al teu compte."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorized page title"
+msgid "Successfully authorized"
+msgstr "Autoritzat amb èxit"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "oauth external provider page title"
+msgid "Sign in with external provider"
+msgstr "Inicia sessió amb proveïdor extern"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:13
+#, elixir-autogen, elixir-format
+msgctxt "oauth external provider sign in button"
+msgid "Sign in with %{strategy}"
+msgstr "Inicia sessió amb %{strategy}"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:54
+#, elixir-autogen, elixir-format
+msgctxt "oauth login button"
+msgid "Log In"
+msgstr "Inicia sessió"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:51
+#, elixir-autogen, elixir-format
+msgctxt "oauth login password prompt"
+msgid "Password"
+msgstr "Contrasenya"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:47
+#, elixir-autogen, elixir-format
+msgctxt "oauth login username prompt"
+msgid "Username"
+msgstr "Nom d'usuari"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:39
+#, elixir-autogen, elixir-format
+msgctxt "oauth register nickname prompt"
+msgid "Pleroma Handle"
+msgstr "Sobrenom Akkoma"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:37
+#, elixir-autogen, elixir-format
+msgctxt "oauth register nickname unchangeable warning"
+msgid "Choose carefully! You won't be able to change this later. You will be able to change your display name, though."
+msgstr ""
+"Tria amb cura! No podràs canviar-ho més tard. En canvi, podràs canviar el "
+"teu nom a mostrar."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:18
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page email prompt"
+msgid "Email"
+msgstr "Correu"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:10
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page fill form prompt"
+msgid "If you'd like to register a new account, please provide the details below."
+msgstr ""
+"Si desitges registrar un compte nou, si us plau proporciona els detalls a "
+"continuació."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:35
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login button"
+msgid "Proceed as existing user"
+msgstr "Procedir com a usuari existent"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:31
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login password prompt"
+msgid "Password"
+msgstr "Contrasenya"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:24
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login prompt"
+msgid "Alternatively, sign in to connect to existing account."
+msgstr "Alternativament, inicia sessió per a connectar amb un compte existent."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:27
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login username prompt"
+msgid "Name or email"
+msgstr "Nom o correu"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:14
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page nickname prompt"
+msgid "Nickname"
+msgstr "Sobrenom"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:22
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page register button"
+msgid "Proceed as new user"
+msgstr "Procedir com a usuari nou"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page title"
+msgid "Registration Details"
+msgstr "Detalls del registre"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:36
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page title"
+msgid "This is the first time you visit! Please enter your Pleroma handle."
+msgstr ""
+"Aquesta és la primera vegada que ens visites! Si us plau introdueix el teu "
+"sobrenom a Akkoma."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "oauth scopes message"
+msgid "The following permissions will be granted"
+msgstr "Es concediran els següents permisos"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:2
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "oauth token code message"
+msgid "Token code is %{token}"
+msgstr "El codi del Token és %{token}"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth code prompt"
+msgid "Authentication code"
+msgstr "Codi d'autenticació"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth page title"
+msgid "Two-factor authentication"
+msgstr "Autenticació de dos factors"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:23
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth page use recovery code link"
+msgid "Enter a two-factor recovery code"
+msgstr "Entra el codi de recuperació de dos factors"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:20
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth verify code button"
+msgid "Verify"
+msgstr "Verifica"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover page title"
+msgid "Two-factor recovery"
+msgstr "Recuperació de dos factors"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover recovery code prompt"
+msgid "Recovery code"
+msgstr "Codi de recuperació"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:23
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover use 2fa code link"
+msgid "Enter a two-factor code"
+msgstr "Entra el codi de dos factors"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:20
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover verify recovery code button"
+msgid "Verify"
+msgstr "Verifica"
+
+#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "static fe profile page remote follow button"
+msgid "Remote follow"
+msgstr "Seguiment remot"
+
+#: lib/pleroma/web/templates/email/digest.html.eex:163
+#, elixir-autogen, elixir-format
+msgctxt "digest email header line"
+msgid "Hey %{nickname}, here is what you've missed!"
+msgstr "Hola %{nickname}, aquí està el que t'has perdut!"
+
+#: lib/pleroma/web/templates/email/digest.html.eex:544
+#, elixir-autogen, elixir-format
+msgctxt "digest email receiver address"
+msgid "The email address you are subscribed as is %{email} . "
+msgstr ""
+"L'adreça de correu a la que estàs subscrit és %{email} . "
+
+#: lib/pleroma/web/templates/email/digest.html.eex:538
+#, elixir-autogen, elixir-format
+msgctxt "digest email sending reason"
+msgid "You have received this email because you have signed up to receive digest emails from %{instance} Pleroma instance."
+msgstr ""
+"Has rebut aquest correu perquè t'has registrat per a rebre correus resum des "
+"de l'instància Akkoma %{instance}2 ."
+
+#: lib/pleroma/web/templates/email/digest.html.eex:547
+#, elixir-autogen, elixir-format
+msgctxt "digest email unsubscribe action"
+msgid "To unsubscribe, please go %{here}."
+msgstr "Per a donar-te de baixa, si us plau ves a %{here}."
+
+#: lib/pleroma/web/templates/email/digest.html.eex:547
+#, elixir-autogen, elixir-format
+msgctxt "digest email unsubscribe action link text"
+msgid "here"
+msgstr "aquí"
+
+#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_failure.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "mailer unsubscribe failed message"
+msgid "UNSUBSCRIBE FAILURE"
+msgstr "ERROR DE CANCEL·LACIÓ DE LA SUBSCRIPCIÓ"
+
+#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_success.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "mailer unsubscribe successful message"
+msgid "UNSUBSCRIBE SUCCESSFUL"
+msgstr "SUBSCRIPCIÓ CANCEL·LADA AMB ÈXIT"
+
+#: lib/pleroma/web/templates/email/digest.html.eex:385
+#, elixir-format
+msgctxt "new followers count header"
+msgid "%{count} New Follower"
+msgid_plural "%{count} New Followers"
+msgstr[0] "%{count} Nou Seguidor"
+msgstr[1] "%{count} Nous Seguidors"
+
+#: lib/pleroma/emails/user_email.ex:356
+#, elixir-autogen, elixir-format
+msgctxt "account archive email body - self-requested"
+msgid "You requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
+msgstr ""
+"Has sol·licitat una copia de seguretat completa del teu compte Akkoma. "
+"Està llest per a descarrega:
\n"
+"%{download_url}
\n"
+
+#: lib/pleroma/emails/user_email.ex:384
+#, elixir-autogen, elixir-format
+msgctxt "account archive email subject"
+msgid "Your account archive is ready"
+msgstr "L'arxiu del teu compte està preparat"
+
+#: lib/pleroma/emails/user_email.ex:188
+#, elixir-autogen, elixir-format
+msgctxt "approval pending email body"
+msgid "Awaiting Approval \nYour account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.
\n"
+msgstr ""
+"Esperant aprovació \n"
+"El teu compte a %{instance_name} està sent revisat per l'equip. Rebràs un "
+"altre correu quan el teu compte estigui aprovat.
\n"
+
+#: lib/pleroma/emails/user_email.ex:202
+#, elixir-autogen, elixir-format
+msgctxt "approval pending email subject"
+msgid "Your account is awaiting approval"
+msgstr "El teu compte està esperant aprovació"
+
+#: lib/pleroma/emails/user_email.ex:158
+#, elixir-autogen, elixir-format
+msgctxt "confirmation email body"
+msgid "Thank you for registering on %{instance_name} \nEmail confirmation is required to activate the account.
\nPlease click the following link to activate your account .
\n"
+msgstr ""
+"Gràcies per registrar-te a %{instance_name} \n"
+"Es requereix correu de confirmació per a activar el reu compte.
\n"
+"Si us plau clica en l'enllaç següent per a activar el teu compte .
\n"
+
+#: lib/pleroma/emails/user_email.ex:174
+#, elixir-autogen, elixir-format
+msgctxt "confirmation email subject"
+msgid "%{instance_name} account confirmation"
+msgstr "confirmació del compte a %{instance_name}"
+
+#: lib/pleroma/emails/user_email.ex:310
+#, elixir-autogen, elixir-format
+msgctxt "digest email subject"
+msgid "Your digest from %{instance_name}"
+msgstr "El teu resum des de %{instance_name}"
+
+#: lib/pleroma/emails/user_email.ex:81
+#, elixir-autogen, elixir-format
+msgctxt "password reset email body"
+msgid "Reset your password at %{instance_name} \nSomeone has requested password change for your account at %{instance_name}.
\nIf it was you, visit the following link to proceed: reset password .
\nIf it was someone else, nothing to worry about: your data is secure and your password has not been changed.
\n"
+msgstr ""
+"Restableix la teva contrasenya a %{instance_name} \n"
+"Algú ha sol·licitat un canvi de contrasenya per el teu compte a "
+"%{instance_name}.
\n"
+"Si has estat tu, visita el següent enllaç per a procedir: restablir contrasenya .
\n"
+"Si ha estat algú altre, no et preocupis: les teves dades estan segures i "
+"la teva contrasenya no s'ha canviat.
\n"
+
+#: lib/pleroma/emails/user_email.ex:98
+#, elixir-autogen, elixir-format
+msgctxt "password reset email subject"
+msgid "Password reset"
+msgstr "Restablir contrasenya"
+
+#: lib/pleroma/emails/user_email.ex:215
+#, elixir-autogen, elixir-format
+msgctxt "successful registration email body"
+msgid "Hello @%{nickname}, \nYour account at %{instance_name} has been registered successfully.
\nNo further action is required to activate your account.
\n"
+msgstr ""
+"Hola @%{nickname}, \n"
+"El teu compte a %{instance_name} ha estat registrar amb èxit.
\n"
+"No es requereix cap altre acció per a activar el teu compte.
\n"
+
+#: lib/pleroma/emails/user_email.ex:231
+#, elixir-autogen, elixir-format
+msgctxt "successful registration email subject"
+msgid "Account registered on %{instance_name}"
+msgstr "Compte registrat a %{instance_name}"
+
+#: lib/pleroma/emails/user_email.ex:119
+#, elixir-autogen, elixir-format
+msgctxt "user invitation email body"
+msgid "You are invited to %{instance_name} \n%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.
\nClick the following link to register: accept invitation .
\n"
+msgstr ""
+"Has estat invitat a %{instance_name} \n"
+"%{inviter_name} t'invita a unir-te a %{instance_name}, una instància de "
+"la plataforma de xarxa social federada Akkoma.
\n"
+"Clica el següent enllaç per a registrar-te: accepta invitació .
\n"
+
+#: lib/pleroma/emails/user_email.ex:136
+#, elixir-autogen, elixir-format
+msgctxt "user invitation email subject"
+msgid "Invitation to %{instance_name}"
+msgstr "Invitació per %{instance_name}"
+
+#: lib/pleroma/emails/user_email.ex:53
+#, elixir-autogen, elixir-format
+msgctxt "welcome email html body"
+msgid "Welcome to %{instance_name}!"
+msgstr "Benvingut a %{instance_name}!"
+
+#: lib/pleroma/emails/user_email.ex:41
+#, elixir-autogen, elixir-format
+msgctxt "welcome email subject"
+msgid "Welcome to %{instance_name}!"
+msgstr "Benvingut a %{instance_name}!"
+
+#: lib/pleroma/emails/user_email.ex:65
+#, elixir-autogen, elixir-format
+msgctxt "welcome email text body"
+msgid "Welcome to %{instance_name}!"
+msgstr "Benvingut a %{instance_name}!"
+
+#: lib/pleroma/emails/user_email.ex:368
+#, elixir-autogen, elixir-format
+msgctxt "account archive email body - admin requested"
+msgid "Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
+msgstr ""
+"L'Administrador @%{admin_nickname} ha sol·licitat una copia de seguretat "
+"completa del teu compte Akkoma. Està preparat per a descarrega:
\n"
+"%{download_url}
\n"
diff --git a/priv/gettext/config_descriptions.pot b/priv/gettext/config_descriptions.pot
new file mode 100644
index 000000000..9021fbfab
--- /dev/null
+++ b/priv/gettext/config_descriptions.pot
@@ -0,0 +1,6023 @@
+## This file is a PO Template file.
+##
+## "msgid"s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run "mix gettext.extract" to bring this file up to
+## date. Leave "msgstr"s empty as changing them here has no
+## effect: edit them in PO (.po) files instead.
+msgid ""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :esshd"
+msgid "Before enabling this you must add :esshd to mix.exs as one of the extra_applications and generate host keys in your priv dir with ssh-keygen -m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger"
+msgid "Logger-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :mime"
+msgid "Mime Types settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma"
+msgid "Allows setting a token that can be used to authenticate requests with admin privileges without a normal user account token. Append the `admin_token` parameter to requests to utilize it. (Please reconsider using HTTP Basic Auth or OAuth-based authentication if possible)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma"
+msgid "Authenticator"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :quack"
+msgid "Quack-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :cors_plug"
+msgid "CORS plug config"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :esshd"
+msgid "ESSHD"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger"
+msgid "Logger"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime"
+msgid "Mime Types"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma"
+msgid "Pleroma Admin Token"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma"
+msgid "Pleroma Authenticator"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :quack"
+msgid "Quack Logger"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:console"
+msgid "Console logger settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:ex_syslogger"
+msgid "ExSyslogger-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub"
+msgid "ActivityPub-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:assets"
+msgid "This section configures assets to be used with various frontends. Currently the only option relates to mascots on the mastodon frontend"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:auth"
+msgid "Authentication / authorization settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:connections_pool"
+msgid "Advanced settings for `Gun` connections pool"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:email_notifications"
+msgid "Email notifications settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:features"
+msgid "Customizable features"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:feed"
+msgid "Configure feed rendering"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations"
+msgid "This form can be used to configure a keyword list that keeps the configuration data for any kind of frontend. By default, settings for pleroma_fe are configured. If you want to add your own configuration your settings all fields must be complete."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends"
+msgid "Installed frontends management"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:gopher"
+msgid "Gopher settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools"
+msgid "Advanced settings for `Hackney` connections pools"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http"
+msgid "HTTP settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security"
+msgid "HTTP security settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance"
+msgid "Instance-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instances_favicons"
+msgid "Control favicons for instances"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap"
+msgid "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password will be verified by trying to authenticate (bind) to a LDAP server. If a user exists in the LDAP directory but there is no account with the same name yet on the Pleroma instance then a new Pleroma account will be created with the same name as the LDAP user name."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:majic_pool"
+msgid "Majic/libmagic configuration"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:manifest"
+msgid "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:modules"
+msgid "Custom Runtime Modules"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf"
+msgid "General MRF settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_activity_expiration"
+msgid "Adds automatic expiration to all local activities"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_follow_bot"
+msgid "Automatically follows newly discovered accounts."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_hashtag"
+msgid "Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags (without the leading #)\n\nNote: This MRF Policy is always enabled, if you want to disable it you have to set empty lists.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_hellthread"
+msgid "Block messages with excessive user mentions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_keyword"
+msgid "Reject or Word-Replace messages matching a keyword or [Regex](https://hexdocs.pm/elixir/Regex.html)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_mention"
+msgid "Block messages which mention a specific user"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_normalize_markup"
+msgid "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_object_age"
+msgid "Rejects or delists posts based on their timestamp deviance from your server's clock."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic"
+msgid "RejectNonPublic drops posts with non-public visibility settings."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple"
+msgid "Simple ingress policies"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_steal_emoji"
+msgid "Steals emojis from selected instances when it sees them."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_subchain"
+msgid "This policy processes messages through an alternate pipeline when a given message matches certain criteria. All criteria are configured as a map of regular expressions to lists of policy modules."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_vocabulary"
+msgid "Filter messages which belong to certain activity vocabularies"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:oauth2"
+msgid "Configure OAuth 2 provider capabilities"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools"
+msgid "Advanced settings for `Gun` workers pools"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:populate_hashtags_table"
+msgid "`populate_hashtags_table` background migration settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit"
+msgid "Rate limit settings. This is an advanced feature enabled only for :authentication by default."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated"
+msgid "Disallow viewing timelines, user profiles and statuses for unauthenticated users."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rich_media"
+msgid "If enabled the instance will parse metadata from attached links to generate link previews"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:shout"
+msgid "Pleroma shout settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:static_fe"
+msgid "Render profiles and posts using server-generated HTML that is viewable without using JavaScript"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:streamer"
+msgid "Settings for notifications streamer"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:uri_schemes"
+msgid "URI schemes related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:web_cache_ttl"
+msgid "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome"
+msgid "Welcome messages settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:workers"
+msgid "Includes custom worker options not interpretable directly by `Oban`"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-ConcurrentLimiter"
+msgid "Limits configuration for background tasks."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban"
+msgid "[Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Captcha"
+msgid "Captcha-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is here: https://github.com/koto-bank/kocaptcha. The default endpoint (https://captcha.kotobank.ch) is hosted by the developer."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer"
+msgid "Mailer-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "New users admin email digest"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Email template settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter"
+msgid "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity"
+msgid "Scheduled activities settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload"
+msgid "Upload general settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Filter replaces the filename of the upload"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Uploads mogrify filter settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local"
+msgid "Local uploader-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3"
+msgid "S3 uploader-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.User.Backup"
+msgid "Account Backup"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "HTTP invalidate settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Invalidation script settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata"
+msgid "Metadata-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.\n**If your instance is not behind at least one reverse proxy, you should not enable this plug.**\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Preload"
+msgid "Preload-related settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Expired activities settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Prometheus app metrics endpoint configuration"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :web_push_encryption-:vapid_details"
+msgid "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :ex_aws-:s3"
+msgid "S3"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:console"
+msgid "Console Logger"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:ex_syslogger"
+msgid "ExSyslogger"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub"
+msgid "ActivityPub"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:assets"
+msgid "Assets"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:auth"
+msgid "Auth"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:connections_pool"
+msgid "Connections pool"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:email_notifications"
+msgid "Email notifications"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:emoji"
+msgid "Emoji"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:features"
+msgid "Features"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:feed"
+msgid "Feed"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations"
+msgid "Frontend configurations"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends"
+msgid "Frontends"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:gopher"
+msgid "Gopher"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools"
+msgid "Hackney pools"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http"
+msgid "HTTP"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http_security"
+msgid "HTTP security"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance"
+msgid "Instance"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instances_favicons"
+msgid "Instances favicons"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap"
+msgid "LDAP"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:majic_pool"
+msgid "Majic pool"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:manifest"
+msgid "Manifest"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:markup"
+msgid "Markup Settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:modules"
+msgid "Modules"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf"
+msgid "MRF"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_activity_expiration"
+msgid "MRF Activity Expiration Policy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_follow_bot"
+msgid "MRF FollowBot Policy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_hashtag"
+msgid "MRF Hashtag"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_hellthread"
+msgid "MRF Hellthread"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_keyword"
+msgid "MRF Keyword"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_mention"
+msgid "MRF Mention"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_normalize_markup"
+msgid "MRF Normalize Markup"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_object_age"
+msgid "MRF Object Age"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic"
+msgid "MRF Reject Non Public"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple"
+msgid "MRF Simple"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_steal_emoji"
+msgid "MRF Emojis"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_subchain"
+msgid "MRF Subchain"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_vocabulary"
+msgid "MRF Vocabulary"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:oauth2"
+msgid "OAuth2"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools"
+msgid "Pools"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:populate_hashtags_table"
+msgid "Populate hashtags table"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit"
+msgid "Rate limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated"
+msgid "Restrict Unauthenticated"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rich_media"
+msgid "Rich media"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:shout"
+msgid "Shout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:static_fe"
+msgid "Static FE"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:streamer"
+msgid "Streamer"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:uri_schemes"
+msgid "URI Schemes"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:user"
+msgid "User"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:web_cache_ttl"
+msgid "Web cache TTL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome"
+msgid "Welcome"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:workers"
+msgid "Workers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-ConcurrentLimiter"
+msgid "ConcurrentLimiter"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban"
+msgid "Oban"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Captcha"
+msgid "Pleroma.Captcha"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Pleroma.Captcha.Kocaptcha"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer"
+msgid "Pleroma.Emails.Mailer"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "Pleroma.Emails.NewUsersDigestEmail"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Pleroma.Emails.UserEmail"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter"
+msgid "Linkify"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity"
+msgid "Pleroma.ScheduledActivity"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload"
+msgid "Pleroma.Upload"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Pleroma.Upload.Filter.AnonymizeFilename"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Pleroma.Upload.Filter.Mogrify"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local"
+msgid "Pleroma.Uploaders.Local"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3"
+msgid "Pleroma.Uploaders.S3"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.User"
+msgid "Pleroma.User"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.User.Backup"
+msgid "Pleroma.User.Backup"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate"
+msgid "Pleroma.Web.ApiSpec.CastAndValidate"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Http"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Script"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata"
+msgid "Pleroma.Web.Metadata"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "Pleroma.Web.Plugs.RemoteIp"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Preload"
+msgid "Pleroma.Web.Preload"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Pleroma.Workers.PurgeExpiredActivity"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Pleroma.Web.Endpoint.MetricsExporter"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :web_push_encryption-:vapid_details"
+msgid "Vapid Details"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :esshd > :enabled"
+msgid "Enables SSH"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :esshd > :handler"
+msgid "Handler module"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :esshd > :password_authenticator"
+msgid "Authenticator module"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :esshd > :port"
+msgid "Port to connect"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :esshd > :priv_dir"
+msgid "Dir with SSH keys"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :ex_aws-:s3 > :access_key_id"
+msgid "S3 access key ID"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :ex_aws-:s3 > :host"
+msgid "S3 host"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :ex_aws-:s3 > :region"
+msgid "S3 region (for AWS)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger > :backends"
+msgid "Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :ex_syslogger } - to syslog, Quack.Logger - to Slack."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:console > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:console > :level"
+msgid "Log level"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:ex_syslogger > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:ex_syslogger > :ident"
+msgid "A string that's prepended to every message, and is typically set to the app name"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :logger-:ex_syslogger > :level"
+msgid "Log level"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub > :blockers_visible"
+msgid "Whether a user can see someone who has blocked them"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Following handshake timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Whether to federate blocks to other instances"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches with HTTP signatures"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Whether blocks result in people getting unfollowed"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:assets > :default_mascot"
+msgid "This will be used as the default mascot on MastoFE. Default: `:pleroma_fox_tan`"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:assets > :default_user_avatar"
+msgid "URL of the default user avatar"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:assets > :mascots"
+msgid "Keyword of mascots, each element must contain both an URL and a mime_type key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:auth > :auth_template"
+msgid "Authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "OAuth admin scope requirement toggle. If enabled, admin actions explicitly demand admin OAuth scope(s) presence in OAuth token (client app must support admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` user flag grants access to admin-specific actions."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "The list of enabled OAuth consumer strategies. By default it's set by OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-delimited string should be of format \"strategy\" or \"strategy:dependency\" (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:connections_pool > :connect_timeout"
+msgid "Timeout while `gun` will wait until connection is up. Default: 5000ms."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_retries"
+msgid "Number of attempts to acquire the connection from the pool if it is overloaded. Default: 5"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_wait"
+msgid "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:connections_pool > :max_connections"
+msgid "Maximum number of connections in the pool. Default: 250 connections."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid "Multiplier for the number of idle connection to be reclaimed if the pool is full. For example if the pool maxes out at 250 connections and this setting is set to 0.3, the pool will reclaim at most 75 idle connections if it's overloaded. Default: 0.1"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:email_notifications > :digest"
+msgid "emails of \"what you've missed\" for users who have been inactive for a while"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:email_notifications > :digest > :active"
+msgid "Globally enable or disable digest emails"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Minimum user inactivity threshold"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:email_notifications > :digest > :interval"
+msgid "Minimum interval between digest emails to one user"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:email_notifications > :digest > :schedule"
+msgid "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\"."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:emoji > :default_manifest"
+msgid "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download. Currently only one manifest can be added (no arrays)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:emoji > :groups"
+msgid "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the group name and the value is the location or array of locations. * can be used as a wildcard."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:emoji > :pack_extensions"
+msgid "A list of file extensions for emojis, when no emoji.txt for a pack is present"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:emoji > :shortcode_globs"
+msgid "Location of custom emoji files. * can be used as a wildcard."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:feed > :post_title"
+msgid "Configure title rendering"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:feed > :post_title > :max_length"
+msgid "Maximum number of characters before truncating title"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:feed > :post_title > :omission"
+msgid "Replacement which will be used after truncating string"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Settings for Pleroma FE"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "When disabled, auto-hide the subject field if it's empty"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "URL of the background, unless viewing a user profile with a background that is set"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
+msgid "When a message has a subject (aka Content Warning), collapse it by default"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Enables green text on lines prefixed with the > character"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hides filtered statuses from timelines"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hides muted statuses from timelines"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide notices statistics (repeats, favorites, ...)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
+msgid "Hides instance name from PleromaFE banner"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide profile statistics (posts, posts per day, followers, followings, ...)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "URL of the logo, defaults to Pleroma's logo"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Allows you to adjust vertical margins between logo boundary and navbar borders. The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. If you want a colorful logo you must disable logoMask."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
+msgid "Limit scope selection to Direct, User default, and Scope of post replying to. Also prevents replying to a DM with a public post from PleromaFE."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
+msgid "URL of the image to use for hiding NSFW media attachments in the timeline"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Default post formatting option"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
+msgid "Relative URL which indicates where to redirect when a user is logged in"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
+msgid "Relative URL which indicates where to redirect when a user isn't logged in"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Copy the scope (private/unlisted/public) in replies to posts by default"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Enables panel displaying functionality of the instance on the About page"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Whether to show the instance's custom panel"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Change alignment of sidebar and panels to the right"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
+msgid "Allows changing the default behaviour of subject lines in replies.\n `email`: copy and preprend re:, as in email,\n `masto`: copy verbatim, as in Mastodon,\n `noop`: don't copy the subject."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Which theme to use. Available themes are defined in styles.json"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :admin"
+msgid "Admin frontend"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :admin > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :admin > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :available"
+msgid "A map containing available frontends and parameters for their installation."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :available > build_dir"
+msgid "The directory inside the zip file "
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :available > build_url"
+msgid "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :available > custom-http-headers"
+msgid "The custom HTTP headers for the frontend"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :available > git"
+msgid "URL of the git repository of the frontend"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :available > name"
+msgid "Name of the frontend."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :available > ref"
+msgid "Reference of the frontend to be used."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :primary"
+msgid "Primary frontend, the one that is served for all pages by default"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :primary > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:frontends > :primary > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:gopher > :dstport"
+msgid "Port advertised in URLs (optional, defaults to port)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:gopher > :enabled"
+msgid "Enables the gopher interface"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:gopher > :ip"
+msgid "IP address to bind to"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:gopher > :port"
+msgid "Port to bind to"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :federation"
+msgid "Settings for federation pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :federation > :max_connections"
+msgid "Number workers in the pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :media"
+msgid "Settings for media pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Number workers in the pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :upload"
+msgid "Settings for upload pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Number workers in the pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http > :adapter"
+msgid "Adapter specific options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL options for HTTP adapter"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "List of TLS version to use"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http > :user_agent"
+msgid "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security > :ct_max_age"
+msgid "The maximum age for the Expect-CT header if sent"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security > :enabled"
+msgid "Whether the managed content security policy is enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security > :referrer_policy"
+msgid "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security > :report_uri"
+msgid "Adds the specified URL to report-uri and report-to group in CSP header"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security > :sts"
+msgid "Whether to additionally send a Strict-Transport-Security header"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:http_security > :sts_max_age"
+msgid "The maximum age for the Strict-Transport-Security header if sent"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :account_activation_required"
+msgid "Require users to confirm their emails before signing in"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :account_approval_required"
+msgid "Require users to be manually approved by an admin before signing in"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :account_field_name_length"
+msgid "An account field name maximum length. Default: 512."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :account_field_value_length"
+msgid "An account field value maximum length. Default: 2048."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :allow_relay"
+msgid "Permits remote instances to subscribe to all public posts of your instance. (Important!) This may increase the visibility of your instance."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :allowed_post_formats"
+msgid "MIME-type list of formats allowed to be posted (transformed into HTML)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :attachment_links"
+msgid "Enable to automatically add attachment link text to statuses"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Set to nicknames of (local) users that every new user should automatically follow"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Set to nicknames of (local) users that automatically follows every newly registered user"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :avatar_upload_limit"
+msgid "File size limit of user's profile avatars"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :background_upload_limit"
+msgid "File size limit of user's profile backgrounds"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :banner_upload_limit"
+msgid "File size limit of user's profile banners"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :birthday_min_age"
+msgid "Minimum required age for users to create account. Only used if birthday is required."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :birthday_required"
+msgid "Require users to enter their birthday."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :cleanup_attachments"
+msgid "Enable to remove associated attachments when status is removed.\nThis will not affect duplicates and attachments without status.\nEnabling this will increase load to database when deleting statuses on larger instances.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :description"
+msgid "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :email"
+msgid "Email used to reach an Administrator/Moderator of the instance"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :extended_nickname_format"
+msgid "Enable to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :external_user_synchronization"
+msgid "Enabling following/followers counters synchronization for external users"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :federating"
+msgid "Enable federation with other instances"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Max. depth of reply-to and reply activities fetching on incoming federation, to prevent out-of-memory situations while fetching very long threads. If set to `nil`, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :healthcheck"
+msgid "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :instance_thumbnail"
+msgid "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :invites_enabled"
+msgid "Enable user invitations for admins (depends on `registrations_open` being disabled)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :limit"
+msgid "Posts character limit (CW/Subject included in the counter)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit unauthenticated users to search for local statutes and users only. Default: `:unauthenticated`."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :max_account_fields"
+msgid "The maximum number of custom fields in the user profile. Default: 10."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :max_endorsed_users"
+msgid "The maximum number of recommended accounts. 0 will disable the feature."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :max_media_attachments"
+msgid "Maximum number of post media attachments"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :max_pinned_statuses"
+msgid "The maximum number of pinned statuses. 0 will disable the feature."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :max_remote_account_fields"
+msgid "The maximum number of custom fields in the remote user profile. Default: 20."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :max_report_comment_size"
+msgid "The maximum size of the report comment. Default: 1000."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi-factor authentication settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "MFA backup codes settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
+msgid "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number of backup codes to generate."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
+msgid "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
+msgid "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :name"
+msgid "Name of the instance"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :notify_email"
+msgid "Envelope FROM address for mail sent via Pleroma"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :poll_limits"
+msgid "A map with poll limits for local polls"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Maximum expiration time (in seconds)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Maximum number of characters per option"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Maximum number of options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Minimum expiration time (in seconds)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :privileged_staff"
+msgid "Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :profile_directory"
+msgid "Enable profile directory."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :public"
+msgid "Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note: when setting to `false`, please also check `:restrict_unauthenticated` setting."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :quarantined_instances"
+msgid "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :registration_reason_length"
+msgid "Maximum registration reason length. Default: 500."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :registrations_open"
+msgid "Enable registrations for anyone. Invitations require this setting to be disabled."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :remote_limit"
+msgid "Hard character limit beyond which remote posts will be dropped"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :remote_post_retention_days"
+msgid "The default amount of days to retain remote posts when pruning the database"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :safe_dm_mentions"
+msgid "If enabled, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. \"@admin please keep an eye on @bad_actor\"). Default: disabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :show_reactions"
+msgid "Let favourites and emoji reactions be viewed through the API."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip filtering out broken threads. Default: enabled."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :static_dir"
+msgid "Instance static directory"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :upload_limit"
+msgid "File size limit of uploads (except for avatar, background, banner)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :user_bio_length"
+msgid "A user bio maximum length. Default: 5000."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :user_name_length"
+msgid "A user name maximum length. Default: 100."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instances_favicons > :enabled"
+msgid "Allow/disallow displaying and getting instances favicons"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :base"
+msgid "LDAP base, e.g. \"dc=example,dc=com\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :enabled"
+msgid "Enables LDAP authentication"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :host"
+msgid "LDAP server hostname"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :port"
+msgid "LDAP port, e.g. 389 or 636"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :ssl"
+msgid "Enable to use SSL, usually implies the port 636"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :sslopts"
+msgid "Additional SSL options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :sslopts > :verify"
+msgid "Type of cert verification"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :tls"
+msgid "Enable to use STARTTLS, usually implies the port 389"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :tlsopts"
+msgid "Additional TLS options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Type of cert verification"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:ldap > :uid"
+msgid "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:majic_pool > :size"
+msgid "Number of majic workers to start."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:manifest > :background_color"
+msgid "Describe the background color of the app"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:manifest > :icons"
+msgid "Describe the icons of the app"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:manifest > :theme_color"
+msgid "Describe the theme color of the app"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:markup > :scrub_policy"
+msgid "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length (in bytes) to perform preview. Media smaller in size will be served without thumbnailing."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Max height of preview thumbnail for images (video preview always has original dimensions)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Max width of preview thumbnail for images (video preview always has original dimensions)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :base_url"
+msgid "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :enabled"
+msgid "Enables proxying of remote media via the instance's proxy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enables media cache object invalidation."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Module which will be used to purge objects from the cache."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts"
+msgid "Internal Pleroma.ReverseProxy settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Timeout (in milliseconds) of GET request to the remote URI."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirects the client to the origin server upon encountering HTTP errors.\n\nNote that files larger than Max Body Length will trigger an error. (e.g., Peertube videos)\n\n\n**WARNING:** This setting will allow larger files to be accessed, but exposes the\n\nIP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:media_proxy > :whitelist"
+msgid "List of hosts with scheme to bypass the MediaProxy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:modules > :runtime_dir"
+msgid "A path to custom Elixir modules (such as MRF policies)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf > :policies"
+msgid "A list of MRF policies enabled. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf > :transparency"
+msgid "Make the content of your Message Rewrite Facility settings public (via nodeinfo)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf > :transparency_exclusions"
+msgid "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. You can also provide a reason for excluding these instance names. The instances and reasons won't be publicly disclosed."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_activity_expiration > :days"
+msgid "Default global expiration time for all local activities (in days)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "The name of the bot account to use for following newly discovered users."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "A list of hashtags which result in message being removed from federated timelines (a.k.a unlisted)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_hashtag > :reject"
+msgid "A list of hashtags which result in message being rejected."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_hashtag > :sensitive"
+msgid "A list of hashtags which result in message being set as sensitive (a.k.a NSFW/R-18)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Number of mentioned users after which the message gets removed from timelines anddisables notifications. Set to 0 to disable."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Number of mentioned users after which the messaged gets rejected. Set to 0 to disable."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid " A list of patterns which result in message being removed from federated timelines (a.k.a unlisted).\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_keyword > :reject"
+msgid " A list of patterns which result in message being rejected.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_keyword > :replace"
+msgid " **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n\n **Replacement**: a string. Leaving the field empty is permitted.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_mention > :actors"
+msgid "A list of actors for which any post mentioning them will be dropped"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_object_age > :actions"
+msgid "A list of actions to apply to the post. `:delist` removes the post from public timelines; `:strip_followers` removes followers from the ActivityPub recipient list ensuring they won't be delivered to home timelines; `:reject` rejects the message entirely"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_object_age > :threshold"
+msgid "Required age (in seconds) of a post before actions are taken."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Whether to allow direct messages"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Whether to allow followers-only posts"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :accept"
+msgid "List of instances to only accept activities from (except deletes) and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :avatar_removal"
+msgid "List of instances to strip avatars from and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :banner_removal"
+msgid "List of instances to strip banners from and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "List of instances to remove from the Federated (aka The Whole Known Network) Timeline and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :followers_only"
+msgid "Force posts from the given instances to be visible by followers only and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :media_nsfw"
+msgid "List of instances to tag all media as NSFW (sensitive) from and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :media_removal"
+msgid "List of instances to strip media attachments from and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :reject"
+msgid "List of instances to reject activities from (except deletes) and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :reject_deletes"
+msgid "List of instances to reject deletions from and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_simple > :report_removal"
+msgid "List of instances to reject reports from and the reason for doing so"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "List of hosts to steal emojis from"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid " A list of patterns or matches to reject shortcodes with.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "File size limit (in bytes), checked before an emoji is saved to the disk"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_subchain > :match_actor"
+msgid "Matches a series of regular expressions against the actor field"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_vocabulary > :accept"
+msgid "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:mrf_vocabulary > :reject"
+msgid "A list of ActivityStreams terms to reject. If empty, no messages are rejected."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Enable a background job to clean expired OAuth tokens. Default: disabled."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Keeps old refresh token or generate new refresh token when to obtain an access token"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:oauth2 > :token_expires_in"
+msgid "The lifetime in seconds of the access token"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :default"
+msgid "Settings for default pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :default > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :default > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :default > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :federation"
+msgid "Settings for federation pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :federation > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :federation > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :media"
+msgid "Settings for media pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :media > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :media > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :media > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :upload"
+msgid "Settings for upload pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :upload > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:pools > :upload > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if hashtags transfer failed for all records."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :app_account_creation"
+msgid "For registering user accounts from the same IP address"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :authentication"
+msgid "For authentication create / password check / user existence check requests"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :relation_id_action"
+msgid "For actions on relation with a specific user (follow, unfollow)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :relations_actions"
+msgid "For actions on relationships with all users (follow, unfollow)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :search"
+msgid "For the search requests (account & status search etc.)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :status_id_action"
+msgid "For fav / unfav or reblog / unreblog actions on the same status by the same user"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :statuses_actions"
+msgid "For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rate_limit > :timeline"
+msgid "For requests to timelines (each timeline has it's own limiter)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Settings for statuses."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Disallow view local statuses."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Disallow view remote statuses."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Settings for user profiles."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Disallow view local user profiles."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Disallow view remote user profiles."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Settings for public and federated timelines."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Disallow view federated timeline."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Disallow view public timeline."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rich_media > :enabled"
+msgid "Enables RichMedia parsing of URLs"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rich_media > :failure_backoff"
+msgid "Amount of milliseconds after request failure, during which the request will not be retried."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rich_media > :ignore_hosts"
+msgid "List of hosts which will be ignored by the metadata parser"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rich_media > :ignore_tld"
+msgid "List TLDs (top-level domains) which will ignore for parse metadata"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rich_media > :parsers"
+msgid "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:rich_media > :ttl_setters"
+msgid "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:shout > :enabled"
+msgid "Enables the backend Shoutbox chat feature."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:shout > :limit"
+msgid "Shout message character limit."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:static_fe > :enabled"
+msgid "Enables the rendering of static HTML. Default: disabled."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:streamer > :overflow_workers"
+msgid "Maximum number of workers created if pool is empty"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:streamer > :workers"
+msgid "Number of workers to send notifications"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:uri_schemes > :valid_schemes"
+msgid "List of the scheme part that is considered valid to be an URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub routes (except question activities). Default: `nil` (no expiration)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enables sending a chat message to newly registered users"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :chat_message > :message"
+msgid "A message that will be sent to newly registered users as a chat message"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome chat message"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enables sending a direct message to newly registered users"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :direct_message > :message"
+msgid "A message that will be sent to newly registered users"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome message"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :email > :enabled"
+msgid "Enables sending an email to newly registered users"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :email > :html"
+msgid "HTML content of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :email > :sender"
+msgid "Email address and/or nickname that will be used to send the welcome email."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :email > :subject"
+msgid "Subject of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:welcome > :email > :text"
+msgid "Text content of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:workers > :retries"
+msgid "Max retry attempts for failed jobs, per `Oban` queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Concurrent limits configuration for MediaProxyWarmingPolicy."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running concurrently jobs."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting jobs."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Concurrent limits configuration for getting RichMedia for activities."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running concurrently jobs."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting jobs."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :crontab"
+msgid "Settings for cron background jobs"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :log"
+msgid "Logs verbose mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues"
+msgid "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachment deletion queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :background"
+msgid "Background queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :backup"
+msgid "Backup queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Incoming federation queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Outgoing federation queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :mailer"
+msgid "Email sender queue, see Pleroma.Emails.Mailer"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities queue, see Pleroma.ScheduledActivities"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Oban > :queues > :web_push"
+msgid "Web push notifications queue"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Whether the captcha should be shown on registration"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Captcha > :method"
+msgid "The method/service to use for captcha"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "The time in seconds for which the captcha is valid"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "The kocaptcha endpoint to use"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/swoosh/Swoosh.html#module-adapters)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "SMTP AUTH enforcement mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "SMTP AUTH password"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "SMTP port"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Hostname or IP address"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "SMTP temporary (4xx) error retries"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use Implicit SSL/TLS. e.g. port 465"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "Explicit TLS (STARTTLS) enforcement mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "SMTP AUTH username"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enables new users admin digest email when `true`"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "A map with color settings for email templates."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter > :class"
+msgid "Specify the class to be added to the generated link. Disable to clear."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter > :extra"
+msgid "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter > :new_window"
+msgid "Link URLs will open in a new window/tab."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter > :rel"
+msgid "Override the rel attribute. Disable to clear."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip the scheme prefix."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "The number of scheduled activities a user is allowed to create in a single day. Default: 25."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Whether scheduled activities are sent to the job queue to be executed"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "The number of scheduled activities a user is allowed to create in total. Default: 300."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL for the uploads. Required if you use a CDN or host attachments under a different domain."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Set max length of a filename to display. 0 = no limit. Default: 30"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload > :filters"
+msgid "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload > :link_name"
+msgid "If enabled, a name parameter will be added to the URL of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy requests to the remote uploader.\n\nUseful if media upload endpoint is not internet accessible.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload > :uploader"
+msgid "Module which will be used for uploads"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original filename extension by using {extension}, for example custom-file-name.{extension}."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "List of actions for the mogrify command. It's possible to add self-written settings as string. For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Path where user's uploads will be saved"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "S3 bucket"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "S3 bucket namespace"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Enable streaming uploads, when enabled the file will be sent to the server in chunks as it's being read. This may be unsupported by some providers, try disabling this if you have upload problems."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc. For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in Upload base_url."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.User > :email_blacklist"
+msgid "List of email domains users may not register with."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "List of nicknames users may not register with."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit user to export not more often than once per N days"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Remove backup achives after N days"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Enables strict input validation (useful in development, not recommended in production)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "HTTP headers of request"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "HTTP method of request. Default: :purge"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Request options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Path to executable script which will purge cached items."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "Optional URL format preprocessing. Only required for Apache's htcacheclean."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "List of metadata providers to enable"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "When enabled NSFW attachments will be shown in previews"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enable/disable the plug. Default: disabled."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid " A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `[\"x-forwarded-for\"]`.\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid " A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", \"fc00::/7\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "List of preload providers to enable"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enables expired activities addition & deletion"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Minimum lifetime for ephemeral activity (in seconds)"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
+msgid "Enables HTTP Basic Auth for app metrics endpoint."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
+msgid "[Pleroma extension] Enables app metrics endpoint."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
+msgid "App metrics endpoint output format."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
+msgid "Restrict access of app metrics endpoint to the specified IP addresses."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
+msgid "App metrics endpoint URI path."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :quack > :level"
+msgid "Log level"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :quack > :meta"
+msgid "Configure which metadata you want to report on"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :quack > :webhook_url"
+msgid "Configure the Slack incoming webhook"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :web_push_encryption-:vapid_details > :private_key"
+msgid "VAPID private key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :web_push_encryption-:vapid_details > :public_key"
+msgid "VAPID public key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :web_push_encryption-:vapid_details > :subject"
+msgid "A mailto link for the administrative contact. It's best if this email is not a personal email address, but rather a group email to the instance moderation team."
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :cors_plug > :credentials"
+msgid "Credentials"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :cors_plug > :expose"
+msgid "Expose"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :cors_plug > :headers"
+msgid "Headers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :cors_plug > :max_age"
+msgid "Max age"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :cors_plug > :methods"
+msgid "Methods"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :esshd > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :esshd > :handler"
+msgid "Handler"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :esshd > :password_authenticator"
+msgid "Password authenticator"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :esshd > :port"
+msgid "Port"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :esshd > :priv_dir"
+msgid "Priv dir"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :ex_aws-:s3 > :access_key_id"
+msgid "Access key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :ex_aws-:s3 > :host"
+msgid "Host"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :ex_aws-:s3 > :region"
+msgid "Region"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger > :backends"
+msgid "Backends"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:console > :format"
+msgid "Format"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:console > :level"
+msgid "Level"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:console > :metadata"
+msgid "Metadata"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:ex_syslogger > :format"
+msgid "Format"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:ex_syslogger > :ident"
+msgid "Ident"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:ex_syslogger > :level"
+msgid "Level"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :logger-:ex_syslogger > :metadata"
+msgid "Metadata"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime > :types"
+msgid "Types"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime > :types > application/activity+json"
+msgid "\"application/activity+json\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime > :types > application/jrd+json"
+msgid "\"application/jrd+json\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime > :types > application/ld+json"
+msgid "\"application/ld+json\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime > :types > application/xml"
+msgid "\"application/xml\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :mime > :types > application/xrd+xml"
+msgid "\"application/xrd+xml\""
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma > Pleroma.Web.Auth.Authenticator"
+msgid "Pleroma.Web.Auth.Authenticator"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub > :blockers_visible"
+msgid "Blockers visible"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Follow handshake timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "Note replies output limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Outgoing blocks"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Unfollow blocked"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:assets > :default_mascot"
+msgid "Default mascot"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:assets > :default_user_avatar"
+msgid "Default user avatar"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:assets > :mascots"
+msgid "Mascots"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:auth > :auth_template"
+msgid "Auth template"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "Enforce OAuth admin scope usage"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "OAuth consumer strategies"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer template"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:connections_pool > :connect_timeout"
+msgid "Connect timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_retries"
+msgid "Connection acquisition retries"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_wait"
+msgid "Connection acquisition wait"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:connections_pool > :max_connections"
+msgid "Max connections"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid "Reclaim multiplier"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:email_notifications > :digest"
+msgid "Digest"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:email_notifications > :digest > :active"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Inactivity threshold"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:email_notifications > :digest > :interval"
+msgid "Interval"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:email_notifications > :digest > :schedule"
+msgid "Schedule"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:emoji > :default_manifest"
+msgid "Default manifest"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:emoji > :groups"
+msgid "Groups"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:emoji > :pack_extensions"
+msgid "Pack extensions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:emoji > :shared_pack_cache_seconds_per_file"
+msgid "Shared pack cache s/file"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:emoji > :shortcode_globs"
+msgid "Shortcode globs"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Improved hashtag timeline"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:feed > :post_title"
+msgid "Post title"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:feed > :post_title > :max_length"
+msgid "Max length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:feed > :post_title > :omission"
+msgid "Omission"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Pleroma FE"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "Always show subject input"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "Background"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
+msgid "Collapse message with subject"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Greentext"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hide Filtered Statuses"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hide Muted Posts"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide post stats"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
+msgid "Hide Sitename"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide user stats"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "Logo"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Logo margin"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "Logo mask"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
+msgid "Minimal scopes mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
+msgid "NSFW Censor Image"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Post Content Type"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
+msgid "Redirect root login"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
+msgid "Redirect root no login"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Scope copy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Show instance features panel"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Show instance specific panel"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Sidebar on Right"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
+msgid "Subject line behavior"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Theme"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :admin"
+msgid "Admin"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :admin > name"
+msgid "Name"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :admin > ref"
+msgid "Reference"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :available"
+msgid "Available"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :available > build_dir"
+msgid "Build directory"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :available > build_url"
+msgid "Build URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :available > custom-http-headers"
+msgid "Custom HTTP headers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :available > git"
+msgid "Git Repository URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :available > name"
+msgid "Name"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :available > ref"
+msgid "Reference"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :primary"
+msgid "Primary"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :primary > name"
+msgid "Name"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:frontends > :primary > ref"
+msgid "Reference"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:gopher > :dstport"
+msgid "Dstport"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:gopher > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:gopher > :ip"
+msgid "IP"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:gopher > :port"
+msgid "Port"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :federation"
+msgid "Federation"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :federation > :max_connections"
+msgid "Max connections"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :media"
+msgid "Media"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Max connections"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :upload"
+msgid "Upload"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Max connections"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http > :adapter"
+msgid "Adapter"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL Options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "Versions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http > :send_user_agent"
+msgid "Send user agent"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http > :user_agent"
+msgid "User agent"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http_security > :ct_max_age"
+msgid "CT max age"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http_security > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http_security > :referrer_policy"
+msgid "Referrer policy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http_security > :report_uri"
+msgid "Report URI"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http_security > :sts"
+msgid "STS"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:http_security > :sts_max_age"
+msgid "STS max age"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :account_activation_required"
+msgid "Account activation required"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :account_approval_required"
+msgid "Account approval required"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :account_field_name_length"
+msgid "Account field name length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :account_field_value_length"
+msgid "Account field value length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :allow_relay"
+msgid "Allow relay"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :allowed_post_formats"
+msgid "Allowed post formats"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :attachment_links"
+msgid "Attachment links"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Autofollowed nicknames"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Autofollowing nicknames"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :avatar_upload_limit"
+msgid "Avatar upload limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :background_upload_limit"
+msgid "Background upload limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :banner_upload_limit"
+msgid "Banner upload limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :birthday_min_age"
+msgid "Birthday min age"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :birthday_required"
+msgid "Birthday required"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :cleanup_attachments"
+msgid "Cleanup attachments"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :description"
+msgid "Description"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :email"
+msgid "Admin Email Address"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :extended_nickname_format"
+msgid "Extended nickname format"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :external_user_synchronization"
+msgid "External user synchronization"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :federating"
+msgid "Federating"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Fed. incoming replies max depth"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Fed. reachability timeout days"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :healthcheck"
+msgid "Healthcheck"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :instance_thumbnail"
+msgid "Instance thumbnail"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :invites_enabled"
+msgid "Invites enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :limit"
+msgid "Limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit to local content"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :max_account_fields"
+msgid "Max account fields"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :max_endorsed_users"
+msgid "Max endorsed users"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :max_media_attachments"
+msgid "Max media attachments"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :max_pinned_statuses"
+msgid "Max pinned statuses"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :max_remote_account_fields"
+msgid "Max remote account fields"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :max_report_comment_size"
+msgid "Max report comment size"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi factor authentication"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "Backup codes"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
+msgid "Length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
+msgid "Digits"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
+msgid "Period"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :name"
+msgid "Name"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :notify_email"
+msgid "Sender Email Address"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :poll_limits"
+msgid "Poll limits"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Max expiration"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Max option chars"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Max options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Min expiration"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :privileged_staff"
+msgid "Privileged staff"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :profile_directory"
+msgid "Profile directory"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :public"
+msgid "Public"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :quarantined_instances"
+msgid "Quarantined instances"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :registration_reason_length"
+msgid "Registration reason length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :registrations_open"
+msgid "Registrations open"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :remote_limit"
+msgid "Remote limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :remote_post_retention_days"
+msgid "Remote post retention days"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :safe_dm_mentions"
+msgid "Safe DM mentions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :show_reactions"
+msgid "Show reactions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip thread containment"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :static_dir"
+msgid "Static dir"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :upload_limit"
+msgid "Upload limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :user_bio_length"
+msgid "User bio length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :user_name_length"
+msgid "User name length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instances_favicons > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :base"
+msgid "Base"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :host"
+msgid "Host"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :port"
+msgid "Port"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :ssl"
+msgid "SSL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :sslopts"
+msgid "SSL options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Cacertfile"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :sslopts > :verify"
+msgid "Verify"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :tls"
+msgid "TLS"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :tlsopts"
+msgid "TLS options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Cacertfile"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Verify"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:ldap > :uid"
+msgid "UID"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:majic_pool > :size"
+msgid "Size"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:manifest > :background_color"
+msgid "Background color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:manifest > :icons"
+msgid "Icons"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:manifest > :theme_color"
+msgid "Theme color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:markup > :allow_fonts"
+msgid "Allow fonts"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:markup > :allow_headings"
+msgid "Allow headings"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:markup > :allow_inline_images"
+msgid "Allow inline images"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:markup > :allow_tables"
+msgid "Allow tables"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Image quality"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Thumbnail max height"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Thumbnail max width"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :base_url"
+msgid "Base URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :invalidation"
+msgid "Invalidation"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Provider"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts"
+msgid "Advanced MediaProxy Options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Max body length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Max read duration"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirect on failure"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:media_proxy > :whitelist"
+msgid "Whitelist"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:modules > :runtime_dir"
+msgid "Runtime dir"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf > :policies"
+msgid "Policies"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf > :transparency"
+msgid "MRF transparency"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf > :transparency_exclusions"
+msgid "MRF transparency exclusions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_activity_expiration > :days"
+msgid "Days"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "Follower nickname"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_hashtag > :reject"
+msgid "Reject"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_hashtag > :sensitive"
+msgid "Sensitive"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Delist threshold"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Reject threshold"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_keyword > :reject"
+msgid "Reject"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_keyword > :replace"
+msgid "Replace"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_mention > :actors"
+msgid "Actors"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_normalize_markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_object_age > :actions"
+msgid "Actions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_object_age > :threshold"
+msgid "Threshold"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Allow direct"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Allow followers-only"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :accept"
+msgid "Accept"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :avatar_removal"
+msgid "Avatar removal"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :banner_removal"
+msgid "Banner removal"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :followers_only"
+msgid "Followers only"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :media_nsfw"
+msgid "Media NSFW"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :media_removal"
+msgid "Media removal"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :reject"
+msgid "Reject"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :reject_deletes"
+msgid "Reject deletes"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_simple > :report_removal"
+msgid "Report removal"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "Hosts"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid "Rejected shortcodes"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "Size limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_subchain > :match_actor"
+msgid "Match actor"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_vocabulary > :accept"
+msgid "Accept"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:mrf_vocabulary > :reject"
+msgid "Reject"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Clean expired tokens"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Issue new refresh token"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:oauth2 > :token_expires_in"
+msgid "Token expires in"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :default"
+msgid "Default"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :default > :max_waiting"
+msgid "Max waiting"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :default > :recv_timeout"
+msgid "Recv timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :default > :size"
+msgid "Size"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :federation"
+msgid "Federation"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :federation > :max_waiting"
+msgid "Max waiting"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Recv timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :federation > :size"
+msgid "Size"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :media"
+msgid "Media"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :media > :max_waiting"
+msgid "Max waiting"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :media > :recv_timeout"
+msgid "Recv timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :media > :size"
+msgid "Size"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :upload"
+msgid "Upload"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :upload > :max_waiting"
+msgid "Max waiting"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Recv timeout"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:pools > :upload > :size"
+msgid "Size"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Fault rate allowance"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval ms"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :app_account_creation"
+msgid "App account creation"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :authentication"
+msgid "Authentication"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :relation_id_action"
+msgid "Relation ID action"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :relations_actions"
+msgid "Relations actions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :search"
+msgid "Search"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :status_id_action"
+msgid "Status ID action"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :statuses_actions"
+msgid "Statuses actions"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rate_limit > :timeline"
+msgid "Timeline"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Activities"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Local"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Remote"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Profiles"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Local"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Remote"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Timelines"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Federated"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Local"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rich_media > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rich_media > :failure_backoff"
+msgid "Failure backoff"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rich_media > :ignore_hosts"
+msgid "Ignore hosts"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rich_media > :ignore_tld"
+msgid "Ignore TLD"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rich_media > :parsers"
+msgid "Parsers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:rich_media > :ttl_setters"
+msgid "TTL setters"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:shout > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:shout > :limit"
+msgid "Limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:static_fe > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:streamer > :overflow_workers"
+msgid "Overflow workers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:streamer > :workers"
+msgid "Workers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:uri_schemes > :valid_schemes"
+msgid "Valid schemes"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:user > :deny_follow_blocked"
+msgid "Deny follow blocked"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub question"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :chat_message"
+msgid "Chat message"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :chat_message > :message"
+msgid "Message"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :direct_message"
+msgid "Direct message"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :direct_message > :message"
+msgid "Message"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :email"
+msgid "Email"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :email > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :email > :html"
+msgid "Html"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :email > :sender"
+msgid "Sender"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :email > :subject"
+msgid "Subject"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:welcome > :email > :text"
+msgid "Text"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:workers > :retries"
+msgid "Retries"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Pleroma.Web.RichMedia.Helpers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :crontab"
+msgid "Crontab"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :log"
+msgid "Log"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues"
+msgid "Queues"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachments cleanup"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :background"
+msgid "Background"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :backup"
+msgid "Backup"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Federator incoming"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Federator outgoing"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :mailer"
+msgid "Mailer"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Oban > :queues > :web_push"
+msgid "Web push"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Captcha > :method"
+msgid "Method"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "Seconds valid"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "Endpoint"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "Adapter"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :enabled"
+msgid "Mailer Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:access_key"
+msgid "AWS Access Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:region"
+msgid "AWS Region"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:secret"
+msgid "AWS Secret Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Dyn-:api_key"
+msgid "Dyn API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Gmail-:access_token"
+msgid "GMail API Access Token"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:api_key"
+msgid "Mailgun API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:domain"
+msgid "Domain"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:api_key"
+msgid "MailJet Public API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:secret"
+msgid "MailJet Private API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mandrill-:api_key"
+msgid "Mandrill API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Postmark-:api_key"
+msgid "Postmark API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "AUTH Mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "Password"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "Port"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Relay"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "Retries"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use SSL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "STARTTLS Mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "Username"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendgrid-:api_key"
+msgid "SendGrid API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_args"
+msgid "Cmd args"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_path"
+msgid "Cmd path"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:qmail"
+msgid "Qmail compat mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:api_key"
+msgid "SocketLabs API Key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:server_id"
+msgid "Server ID"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:api_key"
+msgid "SparkPost API key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:endpoint"
+msgid "Endpoint"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "Logo"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "Styling"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :background_color"
+msgid "Background color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :content_background_color"
+msgid "Content background color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :header_color"
+msgid "Header color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :link_color"
+msgid "Link color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_color"
+msgid "Text color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_muted_color"
+msgid "Text muted color"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter > :class"
+msgid "Class"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter > :extra"
+msgid "Extra"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter > :new_window"
+msgid "New window"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter > :rel"
+msgid "Rel"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip prefix"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Truncate"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Validate tld"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "Daily user limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "Total user limit"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Filename display max length"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload > :filters"
+msgid "Filters"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload > :link_name"
+msgid "Link name"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy remote"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload > :uploader"
+msgid "Uploader"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "Args"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Uploads"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "Bucket"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "Bucket namespace"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Streaming enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "Truncated namespace"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.User > :email_blacklist"
+msgid "Email blacklist"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "Restricted nicknames"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit days"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Purge after days"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Strict"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "Headers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "Method"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Options"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options > :params"
+msgid "Params"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Script path"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "URL Format"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "Providers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "Unfurl NSFW"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid "Headers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "Proxies"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid "Reserved"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "Providers"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Min lifetime"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
+msgid "Auth"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
+msgid "Enabled"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
+msgid "Format"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
+msgid "IP Whitelist"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
+msgid "Path"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :quack > :level"
+msgid "Level"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :quack > :meta"
+msgid "Meta"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :quack > :webhook_url"
+msgid "Webhook URL"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :web_push_encryption-:vapid_details > :private_key"
+msgid "Private key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :web_push_encryption-:vapid_details > :public_key"
+msgid "Public key"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :web_push_encryption-:vapid_details > :subject"
+msgid "Subject"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Require HTTP signatures for AP fetches"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config description at :pleroma-:instance > :short_description"
+msgid "Shorter version of instance description. It can be seen on `/api/v1/instance`"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Authorized fetch mode"
+msgstr ""
+
+#, elixir-autogen, elixir-format
+#: lib/pleroma/docs/translator.ex:5
+msgctxt "config label at :pleroma-:instance > :short_description"
+msgid "Short description"
+msgstr ""
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index fed111ccb..10a62d2a8 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -10,175 +10,175 @@
msgid ""
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:122
msgid "%{name} - %{count} is not a multiple of %{multiple}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:131
msgid "%{name} - %{value} is larger than exclusive maximum %{max}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:140
msgid "%{name} - %{value} is larger than inclusive maximum %{max}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:149
msgid "%{name} - %{value} is smaller than exclusive minimum %{min}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:158
msgid "%{name} - %{value} is smaller than inclusive minimum %{min}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:102
msgid "%{name} - Array items must be unique."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:114
msgid "%{name} - Array length %{length} is larger than maxItems: %{}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:106
msgid "%{name} - Array length %{length} is smaller than minItems: %{min}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:166
msgid "%{name} - Invalid %{type}. Got: %{value}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:174
msgid "%{name} - Invalid format. Expected %{format}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:51
msgid "%{name} - Invalid schema.type. Got: %{type}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:178
msgid "%{name} - Invalid value for enum."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:95
msgid "%{name} - String length is larger than maxLength: %{length}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:88
msgid "%{name} - String length is smaller than minLength: %{length}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:63
msgid "%{name} - null value where %{type} expected."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:60
msgid "%{name} - null value."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:182
msgid "Failed to cast to any schema in %{polymorphic_type}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:71
msgid "Failed to cast value as %{invalid_schema}. Value must be castable using `allOf` schemas listed."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:84
msgid "Failed to cast value to one of: %{failed_schemas}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:78
msgid "Failed to cast value using any of: %{failed_schemas}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:212
msgid "Invalid value for header: %{name}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:204
msgid "Missing field: %{name}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:208
msgid "Missing header: %{name}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:196
msgid "No value provided for required discriminator `%{field}`."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:216
msgid "Object property count %{property_count} is greater than maxProperties: %{max_properties}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:224
msgid "Object property count %{property_count} is less than minProperties: %{min_properties}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/static_fe/static_fe/error.html.eex:2
msgid "Oops"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:188
msgid "Unexpected field: %{name}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:200
msgid "Unknown schema: %{name}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:192
msgid "Value used as discriminator for `%{field}` matches no schemas."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:43
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:37
msgid "announces"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:44
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:38
msgid "likes"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:42
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:36
msgid "replies"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:27
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:22
msgid "sensitive media"
diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot
index 7644fc230..85854d23e 100644
--- a/priv/gettext/errors.pot
+++ b/priv/gettext/errors.pot
@@ -89,436 +89,483 @@ msgstr ""
msgid "must be equal to %{number}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:523
msgid "Account not found"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:316
msgid "Already voted"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:402
msgid "Bad request"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/controller_helper.ex:97
#: lib/pleroma/web/controller_helper.ex:103
msgid "Can't display this activity"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:324
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:325
msgid "Can't find user"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:80
msgid "Can't get favorites"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:482
msgid "Cannot post an empty status without attachments"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:441
msgid "Comment must be up to %{max_size} characters"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/config_db.ex:200
msgid "Config with params %{params} not found"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/common_api.ex:167 lib/pleroma/web/common_api.ex:171
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/common_api.ex:167
+#: lib/pleroma/web/common_api.ex:171
msgid "Could not delete"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:217
msgid "Could not favorite"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:254
msgid "Could not unfavorite"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:202
msgid "Could not unrepeat"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/common_api.ex:530 lib/pleroma/web/common_api.ex:539
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/common_api.ex:530
+#: lib/pleroma/web/common_api.ex:539
msgid "Could not update state"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:205
msgid "Error."
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/twitter_api/twitter_api.ex:99
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/twitter_api/twitter_api.ex:105
msgid "Invalid CAPTCHA"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:144
#: lib/pleroma/web/o_auth/o_auth_controller.ex:631
msgid "Invalid credentials"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:42
msgid "Invalid credentials."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:337
msgid "Invalid indices"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:29
msgid "Invalid parameters"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:349
msgid "Invalid password."
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:254
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:255
msgid "Invalid request"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/twitter_api/twitter_api.ex:102
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/twitter_api/twitter_api.ex:108
msgid "Kocaptcha service unavailable"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:140
msgid "Missing parameters"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:477
msgid "No such conversation"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:171
-#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:197 lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:239
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:197
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:239
msgid "No such permission_group"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:504
-#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:11 lib/pleroma/web/feed/tag_controller.ex:16
-#: lib/pleroma/web/feed/user_controller.ex:69 lib/pleroma/web/o_status/o_status_controller.ex:132
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:515
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:11
+#: lib/pleroma/web/feed/tag_controller.ex:16
+#: lib/pleroma/web/feed/user_controller.ex:69
+#: lib/pleroma/web/o_status/o_status_controller.ex:132
#: lib/pleroma/web/plugs/uploaded_media.ex:84
msgid "Not found"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:308
msgid "Poll's author can't vote"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20
-#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:39 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:51
-#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:52 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:326
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:39
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:51
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:52
+#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:326
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71
msgid "Record not found"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:35
-#: lib/pleroma/web/feed/user_controller.ex:78 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:42
+#: lib/pleroma/web/feed/user_controller.ex:78
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:42
#: lib/pleroma/web/o_status/o_status_controller.ex:138
msgid "Something went wrong"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/activity_draft.ex:143
msgid "The message visibility must be direct"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:492
msgid "The status is over the character limit"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_public_or_authenticated_plug.ex:36
msgid "This resource requires authentication."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/rate_limiter.ex:208
msgid "Throttled"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:338
msgid "Too many choices"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:268
msgid "You can't revoke your own admin status."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:243
#: lib/pleroma/web/o_auth/o_auth_controller.ex:333
msgid "Your account is currently disabled"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:205
#: lib/pleroma/web/o_auth/o_auth_controller.ex:356
msgid "Your login is missing a confirmed e-mail address"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:392
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:403
msgid "can't read inbox of %{nickname} as %{as_nickname}"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:491
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:502
msgid "can't update outbox of %{nickname} as %{as_nickname}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:475
msgid "conversation is already muted"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:510
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:521
msgid "error"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:34
msgid "mascots can only be images"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:63
msgid "not found"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:437
msgid "Bad OAuth request."
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/twitter_api/twitter_api.ex:108
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/twitter_api/twitter_api.ex:114
msgid "CAPTCHA already used"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/twitter_api/twitter_api.ex:105
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/twitter_api/twitter_api.ex:111
msgid "CAPTCHA expired"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/uploaded_media.ex:57
msgid "Failed"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:453
msgid "Failed to authenticate: %{message}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:484
msgid "Failed to set up user account."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/o_auth_scopes_plug.ex:37
msgid "Insufficient permissions: %{permissions}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/uploaded_media.ex:111
msgid "Internal Error"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/fallback_controller.ex:22
#: lib/pleroma/web/o_auth/fallback_controller.ex:29
msgid "Invalid Username/Password"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/twitter_api/twitter_api.ex:111
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/twitter_api/twitter_api.ex:117
msgid "Invalid answer data"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:33
msgid "Nodeinfo schema version not handled"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:194
msgid "This action is outside the authorized scopes"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/fallback_controller.ex:14
msgid "Unknown error, please check the details and try again."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:136
#: lib/pleroma/web/o_auth/o_auth_controller.ex:180
msgid "Unlisted redirect_uri."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:433
msgid "Unsupported OAuth provider: %{provider}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/uploaders/uploader.ex:74
msgid "Uploader callback timeout"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/uploader_controller.ex:23
msgid "bad request"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/twitter_api/twitter_api.ex:96
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/twitter_api/twitter_api.ex:102
msgid "CAPTCHA Error"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:266
msgid "Could not add reaction emoji"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:277
msgid "Could not remove reaction emoji"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/twitter_api/twitter_api.ex:122
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/twitter_api/twitter_api.ex:128
msgid "Invalid CAPTCHA (Missing parameter: %{name})"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:96
msgid "List not found"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:151
msgid "Missing parameter: %{name}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:232
#: lib/pleroma/web/o_auth/o_auth_controller.ex:346
msgid "Password reset is required"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/tests/auth_test_controller.ex:9
-#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:6
-#: lib/pleroma/web/admin_api/controllers/chat_controller.ex:6 lib/pleroma/web/admin_api/controllers/config_controller.ex:6
-#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:6 lib/pleroma/web/admin_api/controllers/frontend_controller.ex:6
-#: lib/pleroma/web/admin_api/controllers/instance_controller.ex:6 lib/pleroma/web/admin_api/controllers/instance_document_controller.ex:6
-#: lib/pleroma/web/admin_api/controllers/invite_controller.ex:6 lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex:6
-#: lib/pleroma/web/admin_api/controllers/o_auth_app_controller.ex:6 lib/pleroma/web/admin_api/controllers/relay_controller.ex:6
-#: lib/pleroma/web/admin_api/controllers/report_controller.ex:6 lib/pleroma/web/admin_api/controllers/status_controller.ex:6
-#: lib/pleroma/web/admin_api/controllers/user_controller.ex:6 lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/embed_controller.ex:6
-#: lib/pleroma/web/fallback/redirect_controller.ex:6 lib/pleroma/web/feed/tag_controller.ex:6
-#: lib/pleroma/web/feed/user_controller.ex:6 lib/pleroma/web/mailer/subscription_controller.ex:6
-#: lib/pleroma/web/manifest_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/app_controller.ex:11 lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/directory_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14 lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7 lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6
-#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6 lib/pleroma/web/media_proxy/media_proxy_controller.ex:6
-#: lib/pleroma/web/mongoose_im/mongoose_im_controller.ex:6 lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6
-#: lib/pleroma/web/o_auth/fallback_controller.ex:6 lib/pleroma/web/o_auth/mfa_controller.ex:10
-#: lib/pleroma/web/o_auth/o_auth_controller.ex:6 lib/pleroma/web/o_status/o_status_controller.ex:6
-#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/app_controller.ex:6
-#: lib/pleroma/web/pleroma_api/controllers/backup_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/chat_controller.ex:5
-#: lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex:6
-#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex:6
-#: lib/pleroma/web/pleroma_api/controllers/instances_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6
-#: lib/pleroma/web/pleroma_api/controllers/notification_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/announcement_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/chat_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/config_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/frontend_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/instance_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/instance_document_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/invite_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/o_auth_app_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/relay_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/status_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/user_controller.ex:6
+#: lib/pleroma/web/controller_helper.ex:6
+#: lib/pleroma/web/embed_controller.ex:6
+#: lib/pleroma/web/fallback/redirect_controller.ex:6
+#: lib/pleroma/web/feed/tag_controller.ex:6
+#: lib/pleroma/web/feed/user_controller.ex:6
+#: lib/pleroma/web/mailer/subscription_controller.ex:6
+#: lib/pleroma/web/manifest_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/app_controller.ex:11
+#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/directory_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14
+#: lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7
+#: lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6
+#: lib/pleroma/web/media_proxy/media_proxy_controller.ex:6
+#: lib/pleroma/web/mongoose_im/mongoose_im_controller.ex:6
+#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6
+#: lib/pleroma/web/o_auth/fallback_controller.ex:6
+#: lib/pleroma/web/o_auth/mfa_controller.ex:10
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:6
+#: lib/pleroma/web/o_status/o_status_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/app_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/backup_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/chat_controller.ex:5
+#: lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/instances_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/notification_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/report_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6
-#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7 lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex:6
-#: lib/pleroma/web/static_fe/static_fe_controller.ex:6 lib/pleroma/web/twitter_api/controller.ex:6
-#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10 lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6
-#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 lib/pleroma/web/uploader_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7
+#: lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex:6
+#: lib/pleroma/web/static_fe/static_fe_controller.ex:6
+#: lib/pleroma/web/twitter_api/controller.ex:6
+#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10
+#: lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6
+#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6
+#: lib/pleroma/web/uploader_controller.ex:6
#: lib/pleroma/web/web_finger/web_finger_controller.ex:6
msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:32
msgid "Two-factor authentication enabled, you must use a access token."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61
msgid "Web push subscription is disabled on this Pleroma instance"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:234
msgid "You can't revoke your own admin/moderator status."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:129
msgid "authorization required for timeline view"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:24
msgid "Access denied"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:321
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:322
msgid "This API requires an authenticated user"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:26
#: lib/pleroma/web/plugs/user_is_admin_plug.ex:21
msgid "User is not an admin."
@@ -531,33 +578,33 @@ msgid_plural "Last export was less than %{days} days ago"
msgstr[0] ""
msgstr[1] ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/user/backup.ex:93
msgid "Backups require enabled email"
msgstr ""
-#, elixir-format
-#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:423
+#, elixir-autogen, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:434
msgid "Character limit (%{limit} characters) exceeded, contains %{length} characters"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/user/backup.ex:98
msgid "Email is required"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:507
msgid "Too many attachments"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:33
#: lib/pleroma/web/plugs/user_is_staff_plug.ex:20
msgid "User is not a staff member."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:366
msgid "Your account is awaiting approval."
msgstr ""
diff --git a/priv/gettext/es/LC_MESSAGES/config_descriptions.po b/priv/gettext/es/LC_MESSAGES/config_descriptions.po
new file mode 100644
index 000000000..9c1acae20
--- /dev/null
+++ b/priv/gettext/es/LC_MESSAGES/config_descriptions.po
@@ -0,0 +1,6396 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-08-06 22:23+0000\n"
+"PO-Revision-Date: 2022-08-06 22:24+0000\n"
+"Last-Translator: Anonymous \n"
+"Language-Team: Spanish \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.13.1\n"
+
+## This file is a PO Template file.
+##
+## "msgid"s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run "mix gettext.extract" to bring this file up to
+## date. Leave "msgstr"s empty as changing them here has no
+## effect: edit them in PO (.po) files instead.
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd"
+msgid "Before enabling this you must add :esshd to mix.exs as one of the extra_applications and generate host keys in your priv dir with ssh-keygen -m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key"
+msgstr ""
+"Before enabling this you must add :esshd to mix.exs as one of the "
+"extra_applications and generate host keys in your priv dir with ssh-keygen -"
+"m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger"
+msgid "Logger-related settings"
+msgstr "Logger-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :mime"
+msgid "Mime Types settings"
+msgstr "Mime Types settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma"
+msgid "Allows setting a token that can be used to authenticate requests with admin privileges without a normal user account token. Append the `admin_token` parameter to requests to utilize it. (Please reconsider using HTTP Basic Auth or OAuth-based authentication if possible)"
+msgstr ""
+"Allows setting a token that can be used to authenticate requests with admin "
+"privileges without a normal user account token. Append the `admin_token` "
+"parameter to requests to utilize it. (Please reconsider using HTTP Basic "
+"Auth or OAuth-based authentication if possible)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma"
+msgid "Authenticator"
+msgstr "Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack"
+msgid "Quack-related settings"
+msgstr "Quack-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug"
+msgid "CORS plug config"
+msgstr "CORS plug config"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd"
+msgid "ESSHD"
+msgstr "ESSHD"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger"
+msgid "Logger"
+msgstr "Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime"
+msgid "Mime Types"
+msgstr "Mime Types"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma"
+msgid "Pleroma Admin Token"
+msgstr "Pleroma Admin Token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma"
+msgid "Pleroma Authenticator"
+msgstr "Pleroma Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack"
+msgid "Quack Logger"
+msgstr "Quack Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console"
+msgid "Console logger settings"
+msgstr "Console logger settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger"
+msgid "ExSyslogger-related settings"
+msgstr "ExSyslogger-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub"
+msgid "ActivityPub-related settings"
+msgstr "ActivityPub-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets"
+msgid "This section configures assets to be used with various frontends. Currently the only option relates to mascots on the mastodon frontend"
+msgstr ""
+"This section configures assets to be used with various frontends. Currently "
+"the only option relates to mascots on the mastodon frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth"
+msgid "Authentication / authorization settings"
+msgstr "Authentication / authorization settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool"
+msgid "Advanced settings for `Gun` connections pool"
+msgstr "Advanced settings for `Gun` connections pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications"
+msgid "Email notifications settings"
+msgstr "Email notifications settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:features"
+msgid "Customizable features"
+msgstr "Customizable features"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed"
+msgid "Configure feed rendering"
+msgstr "Configure feed rendering"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations"
+msgid "This form can be used to configure a keyword list that keeps the configuration data for any kind of frontend. By default, settings for pleroma_fe are configured. If you want to add your own configuration your settings all fields must be complete."
+msgstr ""
+"This form can be used to configure a keyword list that keeps the "
+"configuration data for any kind of frontend. By default, settings for "
+"pleroma_fe are configured. If you want to add your own configuration your "
+"settings all fields must be complete."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends"
+msgid "Installed frontends management"
+msgstr "Installed frontends management"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher"
+msgid "Gopher settings"
+msgstr "Gopher settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools"
+msgid "Advanced settings for `Hackney` connections pools"
+msgstr "Advanced settings for `Hackney` connections pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http"
+msgid "HTTP settings"
+msgstr "HTTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security"
+msgid "HTTP security settings"
+msgstr "HTTP security settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance"
+msgid "Instance-related settings"
+msgstr "Instance-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instances_favicons"
+msgid "Control favicons for instances"
+msgstr "Control favicons for instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap"
+msgid "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password will be verified by trying to authenticate (bind) to a LDAP server. If a user exists in the LDAP directory but there is no account with the same name yet on the Pleroma instance then a new Pleroma account will be created with the same name as the LDAP user name."
+msgstr ""
+"Use LDAP for user authentication. When a user logs in to the Pleroma "
+"instance, the name and password will be verified by trying to authenticate "
+"(bind) to a LDAP server. If a user exists in the LDAP directory but there is "
+"no account with the same name yet on the Pleroma instance then a new Pleroma "
+"account will be created with the same name as the LDAP user name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:majic_pool"
+msgid "Majic/libmagic configuration"
+msgstr "Majic/libmagic configuration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest"
+msgid "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE."
+msgstr ""
+"This section describe PWA manifest instance-specific values. Currently this "
+"option relate only for MastoFE."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Media preview proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Media proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:modules"
+msgid "Custom Runtime Modules"
+msgstr "Custom Runtime Modules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf"
+msgid "General MRF settings"
+msgstr "General MRF settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_activity_expiration"
+msgid "Adds automatic expiration to all local activities"
+msgstr "Adds automatic expiration to all local activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_follow_bot"
+msgid "Automatically follows newly discovered accounts."
+msgstr "Automatically follows newly discovered accounts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag"
+msgid "Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags (without the leading #)\n\nNote: This MRF Policy is always enabled, if you want to disable it you have to set empty lists.\n"
+msgstr ""
+"Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags ("
+"without the leading #)\n"
+"\n"
+"Note: This MRF Policy is always enabled, if you want to disable it you have "
+"to set empty lists.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread"
+msgid "Block messages with excessive user mentions"
+msgstr "Block messages with excessive user mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword"
+msgid "Reject or Word-Replace messages matching a keyword or [Regex](https://hexdocs.pm/elixir/Regex.html)."
+msgstr ""
+"Reject or Word-Replace messages matching a keyword or [Regex](https://hexdocs"
+".pm/elixir/Regex.html)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention"
+msgid "Block messages which mention a specific user"
+msgstr "Block messages which mention a specific user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_normalize_markup"
+msgid "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+msgstr "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age"
+msgid "Rejects or delists posts based on their timestamp deviance from your server's clock."
+msgstr ""
+"Rejects or delists posts based on their timestamp deviance from your "
+"server's clock."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic"
+msgid "RejectNonPublic drops posts with non-public visibility settings."
+msgstr "RejectNonPublic drops posts with non-public visibility settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple"
+msgid "Simple ingress policies"
+msgstr "Simple ingress policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji"
+msgid "Steals emojis from selected instances when it sees them."
+msgstr "Steals emojis from selected instances when it sees them."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_subchain"
+msgid "This policy processes messages through an alternate pipeline when a given message matches certain criteria. All criteria are configured as a map of regular expressions to lists of policy modules."
+msgstr ""
+"This policy processes messages through an alternate pipeline when a given "
+"message matches certain criteria. All criteria are configured as a map of "
+"regular expressions to lists of policy modules."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary"
+msgid "Filter messages which belong to certain activity vocabularies"
+msgstr "Filter messages which belong to certain activity vocabularies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2"
+msgid "Configure OAuth 2 provider capabilities"
+msgstr "Configure OAuth 2 provider capabilities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools"
+msgid "Advanced settings for `Gun` workers pools"
+msgstr "Advanced settings for `Gun` workers pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table"
+msgid "`populate_hashtags_table` background migration settings"
+msgstr "`populate_hashtags_table` background migration settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit"
+msgid "Rate limit settings. This is an advanced feature enabled only for :authentication by default."
+msgstr ""
+"Rate limit settings. This is an advanced feature enabled only for :"
+"authentication by default."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated"
+msgid "Disallow viewing timelines, user profiles and statuses for unauthenticated users."
+msgstr ""
+"Disallow viewing timelines, user profiles and statuses for unauthenticated "
+"users."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media"
+msgid "If enabled the instance will parse metadata from attached links to generate link previews"
+msgstr ""
+"If enabled the instance will parse metadata from attached links to generate "
+"link previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:shout"
+msgid "Pleroma shout settings"
+msgstr "Pleroma shout settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:static_fe"
+msgid "Render profiles and posts using server-generated HTML that is viewable without using JavaScript"
+msgstr ""
+"Render profiles and posts using server-generated HTML that is viewable "
+"without using JavaScript"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer"
+msgid "Settings for notifications streamer"
+msgstr "Settings for notifications streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes"
+msgid "URI schemes related settings"
+msgstr "URI schemes related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl"
+msgid "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration."
+msgstr ""
+"The expiration time for the web responses cache. Values should be in "
+"milliseconds or `nil` to disable expiration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome"
+msgid "Welcome messages settings"
+msgstr "Welcome messages settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:workers"
+msgid "Includes custom worker options not interpretable directly by `Oban`"
+msgstr "Includes custom worker options not interpretable directly by `Oban`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter"
+msgid "Limits configuration for background tasks."
+msgstr "Limits configuration for background tasks."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban"
+msgid "[Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration."
+msgstr ""
+"[Oban](https://github.com/sorentwo/oban) asynchronous job processor "
+"configuration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha"
+msgid "Captcha-related settings"
+msgstr "Captcha-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is here: https://github.com/koto-bank/kocaptcha. The default endpoint (https://captcha.kotobank.ch) is hosted by the developer."
+msgstr ""
+"Kocaptcha is a very simple captcha service with a single API endpoint, the "
+"source code is here: https://github.com/koto-bank/kocaptcha. The default "
+"endpoint (https://captcha.kotobank.ch) is hosted by the developer."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer"
+msgid "Mailer-related settings"
+msgstr "Mailer-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "New users admin email digest"
+msgstr "New users admin email digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Email template settings"
+msgstr "Email template settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter"
+msgid "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs."
+msgstr ""
+"Configuration for Pleroma's link formatter which parses mentions, hashtags, "
+"and URLs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity"
+msgid "Scheduled activities settings"
+msgstr "Scheduled activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload"
+msgid "Upload general settings"
+msgstr "Upload general settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Filter replaces the filename of the upload"
+msgstr "Filter replaces the filename of the upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Uploads mogrify filter settings"
+msgstr "Uploads mogrify filter settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local"
+msgid "Local uploader-related settings"
+msgstr "Local uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3"
+msgid "S3 uploader-related settings"
+msgstr "S3 uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup"
+msgid "Account Backup"
+msgstr "Account Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "HTTP invalidate settings"
+msgstr "HTTP invalidate settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Invalidation script settings"
+msgstr "Invalidation script settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata"
+msgid "Metadata-related settings"
+msgstr "Metadata-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.\n**If your instance is not behind at least one reverse proxy, you should not enable this plug.**\n"
+msgstr ""
+"`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git."
+"pleroma.social/pleroma/remote_ip) but with runtime configuration.\n"
+"**If your instance is not behind at least one reverse proxy, you should not "
+"enable this plug.**\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload"
+msgid "Preload-related settings"
+msgstr "Preload-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Expired activities settings"
+msgstr "Expired activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Prometheus app metrics endpoint configuration"
+msgstr "Prometheus app metrics endpoint configuration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details"
+msgid "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it."
+msgstr ""
+"Web Push Notifications configuration. You can use the mix task mix "
+"web_push.gen.keypair to generate it."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3"
+msgid "S3"
+msgstr "S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console"
+msgid "Console Logger"
+msgstr "Console Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger"
+msgid "ExSyslogger"
+msgstr "ExSyslogger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub"
+msgid "ActivityPub"
+msgstr "ActivityPub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets"
+msgid "Assets"
+msgstr "Assets"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth"
+msgid "Auth"
+msgstr "Auth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool"
+msgid "Connections pool"
+msgstr "Connections pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications"
+msgid "Email notifications"
+msgstr "Email notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji"
+msgid "Emoji"
+msgstr "Emoji"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:features"
+msgid "Features"
+msgstr "Features"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed"
+msgid "Feed"
+msgstr "Feed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations"
+msgid "Frontend configurations"
+msgstr "Frontend configurations"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends"
+msgid "Frontends"
+msgstr "Frontends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher"
+msgid "Gopher"
+msgstr "Gopher"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools"
+msgid "Hackney pools"
+msgstr "Hackney pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http"
+msgid "HTTP"
+msgstr "HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security"
+msgid "HTTP security"
+msgstr "HTTP security"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance"
+msgid "Instance"
+msgstr "Instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons"
+msgid "Instances favicons"
+msgstr "Instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap"
+msgid "LDAP"
+msgstr "LDAP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:majic_pool"
+msgid "Majic pool"
+msgstr "Majic pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest"
+msgid "Manifest"
+msgstr "Manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup"
+msgid "Markup Settings"
+msgstr "Markup Settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Media preview proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Media proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:modules"
+msgid "Modules"
+msgstr "Modules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf"
+msgid "MRF"
+msgstr "MRF"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration"
+msgid "MRF Activity Expiration Policy"
+msgstr "MRF Activity Expiration Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot"
+msgid "MRF FollowBot Policy"
+msgstr "MRF FollowBot Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag"
+msgid "MRF Hashtag"
+msgstr "MRF Hashtag"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread"
+msgid "MRF Hellthread"
+msgstr "MRF Hellthread"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword"
+msgid "MRF Keyword"
+msgstr "MRF Keyword"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention"
+msgid "MRF Mention"
+msgstr "MRF Mention"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup"
+msgid "MRF Normalize Markup"
+msgstr "MRF Normalize Markup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age"
+msgid "MRF Object Age"
+msgstr "MRF Object Age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic"
+msgid "MRF Reject Non Public"
+msgstr "MRF Reject Non Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple"
+msgid "MRF Simple"
+msgstr "MRF Simple"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji"
+msgid "MRF Emojis"
+msgstr "MRF Emojis"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain"
+msgid "MRF Subchain"
+msgstr "MRF Subchain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary"
+msgid "MRF Vocabulary"
+msgstr "MRF Vocabulary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2"
+msgid "OAuth2"
+msgstr "OAuth2"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools"
+msgid "Pools"
+msgstr "Pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table"
+msgid "Populate hashtags table"
+msgstr "Populate hashtags table"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit"
+msgid "Rate limit"
+msgstr "Rate limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated"
+msgid "Restrict Unauthenticated"
+msgstr "Restrict Unauthenticated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media"
+msgid "Rich media"
+msgstr "Rich media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:shout"
+msgid "Shout"
+msgstr "Shout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:static_fe"
+msgid "Static FE"
+msgstr "Static FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer"
+msgid "Streamer"
+msgstr "Streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes"
+msgid "URI Schemes"
+msgstr "URI Schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:user"
+msgid "User"
+msgstr "User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl"
+msgid "Web cache TTL"
+msgstr "Web cache TTL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome"
+msgid "Welcome"
+msgstr "Welcome"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter"
+msgid "ConcurrentLimiter"
+msgstr "ConcurrentLimiter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban"
+msgid "Oban"
+msgstr "Oban"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha"
+msgid "Pleroma.Captcha"
+msgstr "Pleroma.Captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Pleroma.Captcha.Kocaptcha"
+msgstr "Pleroma.Captcha.Kocaptcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer"
+msgid "Pleroma.Emails.Mailer"
+msgstr "Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "Pleroma.Emails.NewUsersDigestEmail"
+msgstr "Pleroma.Emails.NewUsersDigestEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Pleroma.Emails.UserEmail"
+msgstr "Pleroma.Emails.UserEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter"
+msgid "Linkify"
+msgstr "Linkify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity"
+msgid "Pleroma.ScheduledActivity"
+msgstr "Pleroma.ScheduledActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload"
+msgid "Pleroma.Upload"
+msgstr "Pleroma.Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Pleroma.Upload.Filter.AnonymizeFilename"
+msgstr "Pleroma.Upload.Filter.AnonymizeFilename"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Pleroma.Upload.Filter.Mogrify"
+msgstr "Pleroma.Upload.Filter.Mogrify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local"
+msgid "Pleroma.Uploaders.Local"
+msgstr "Pleroma.Uploaders.Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3"
+msgid "Pleroma.Uploaders.S3"
+msgstr "Pleroma.Uploaders.S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User"
+msgid "Pleroma.User"
+msgstr "Pleroma.User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup"
+msgid "Pleroma.User.Backup"
+msgstr "Pleroma.User.Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate"
+msgid "Pleroma.Web.ApiSpec.CastAndValidate"
+msgstr "Pleroma.Web.ApiSpec.CastAndValidate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Http"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Http"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Script"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Script"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata"
+msgid "Pleroma.Web.Metadata"
+msgstr "Pleroma.Web.Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "Pleroma.Web.Plugs.RemoteIp"
+msgstr "Pleroma.Web.Plugs.RemoteIp"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload"
+msgid "Pleroma.Web.Preload"
+msgstr "Pleroma.Web.Preload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Pleroma.Workers.PurgeExpiredActivity"
+msgstr "Pleroma.Workers.PurgeExpiredActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Pleroma.Web.Endpoint.MetricsExporter"
+msgstr "Pleroma.Web.Endpoint.MetricsExporter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details"
+msgid "Vapid Details"
+msgstr "Vapid Details"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :enabled"
+msgid "Enables SSH"
+msgstr "Enables SSH"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :handler"
+msgid "Handler module"
+msgstr "Handler module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :password_authenticator"
+msgid "Authenticator module"
+msgstr "Authenticator module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :port"
+msgid "Port to connect"
+msgstr "Port to connect"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :priv_dir"
+msgid "Dir with SSH keys"
+msgstr "Dir with SSH keys"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :access_key_id"
+msgid "S3 access key ID"
+msgstr "S3 access key ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :host"
+msgid "S3 host"
+msgstr "S3 host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :region"
+msgid "S3 region (for AWS)"
+msgstr "S3 region (for AWS)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger > :backends"
+msgid "Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :ex_syslogger } - to syslog, Quack.Logger - to Slack."
+msgstr ""
+"Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :"
+"ex_syslogger } - to syslog, Quack.Logger - to Slack."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :ident"
+msgid "A string that's prepended to every message, and is typically set to the app name"
+msgstr ""
+"A string that's prepended to every message, and is typically set to the app "
+"name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :blockers_visible"
+msgid "Whether a user can see someone who has blocked them"
+msgstr "Whether a user can see someone who has blocked them"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Following handshake timeout"
+msgstr "Following handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)"
+msgstr ""
+"The number of Note replies' URIs to be included with outgoing federation (`5`"
+" to match Mastodon hardcoded value, `0` to disable the output)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Whether to federate blocks to other instances"
+msgstr "Whether to federate blocks to other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches with HTTP signatures"
+msgstr "Sign object fetches with HTTP signatures"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Whether blocks result in people getting unfollowed"
+msgstr "Whether blocks result in people getting unfollowed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_mascot"
+msgid "This will be used as the default mascot on MastoFE. Default: `:pleroma_fox_tan`"
+msgstr ""
+"This will be used as the default mascot on MastoFE. Default: "
+"`:pleroma_fox_tan`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_user_avatar"
+msgid "URL of the default user avatar"
+msgstr "URL of the default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :mascots"
+msgid "Keyword of mascots, each element must contain both an URL and a mime_type key"
+msgstr ""
+"Keyword of mascots, each element must contain both an URL and a mime_type key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :auth_template"
+msgid "Authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+msgstr ""
+"Authentication form template. By default it's `show.html` which corresponds "
+"to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "OAuth admin scope requirement toggle. If enabled, admin actions explicitly demand admin OAuth scope(s) presence in OAuth token (client app must support admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` user flag grants access to admin-specific actions."
+msgstr ""
+"OAuth admin scope requirement toggle. If enabled, admin actions explicitly "
+"demand admin OAuth scope(s) presence in OAuth token (client app must support "
+"admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` "
+"user flag grants access to admin-specific actions."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "The list of enabled OAuth consumer strategies. By default it's set by OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-delimited string should be of format \"strategy\" or \"strategy:dependency\" (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_)."
+msgstr ""
+"The list of enabled OAuth consumer strategies. By default it's set by "
+"OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-"
+"delimited string should be of format \"strategy\" or \"strategy:dependency\" "
+"(e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is "
+"named differently than ueberauth_)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`."
+msgstr ""
+"OAuth consumer mode authentication form template. By default it's `consumer."
+"html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer."
+"html.eex`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :connect_timeout"
+msgid "Timeout while `gun` will wait until connection is up. Default: 5000ms."
+msgstr "Timeout while `gun` will wait until connection is up. Default: 5000ms."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_retries"
+msgid "Number of attempts to acquire the connection from the pool if it is overloaded. Default: 5"
+msgstr ""
+"Number of attempts to acquire the connection from the pool if it is "
+"overloaded. Default: 5"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_wait"
+msgid "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms."
+msgstr ""
+"Timeout to acquire a connection from pool. The total max time is this value "
+"multiplied by the number of retries. Default: 250ms."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :max_connections"
+msgid "Maximum number of connections in the pool. Default: 250 connections."
+msgstr "Maximum number of connections in the pool. Default: 250 connections."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid "Multiplier for the number of idle connection to be reclaimed if the pool is full. For example if the pool maxes out at 250 connections and this setting is set to 0.3, the pool will reclaim at most 75 idle connections if it's overloaded. Default: 0.1"
+msgstr ""
+"Multiplier for the number of idle connection to be reclaimed if the pool is "
+"full. For example if the pool maxes out at 250 connections and this setting "
+"is set to 0.3, the pool will reclaim at most 75 idle connections if it's "
+"overloaded. Default: 0.1"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest"
+msgid "emails of \"what you've missed\" for users who have been inactive for a while"
+msgstr ""
+"emails of \"what you've missed\" for users who have been inactive for a while"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :active"
+msgid "Globally enable or disable digest emails"
+msgstr "Globally enable or disable digest emails"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Minimum user inactivity threshold"
+msgstr "Minimum user inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :interval"
+msgid "Minimum interval between digest emails to one user"
+msgstr "Minimum interval between digest emails to one user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :schedule"
+msgid "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\"."
+msgstr ""
+"When to send digest email, in crontab format. \"0 0 0\" is the default, "
+"meaning \"once a week at midnight on Sunday morning\"."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :default_manifest"
+msgid "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download. Currently only one manifest can be added (no arrays)."
+msgstr ""
+"Location of the JSON-manifest. This manifest contains information about the "
+"emoji-packs you can download. Currently only one manifest can be added (no "
+"arrays)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :groups"
+msgid "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the group name and the value is the location or array of locations. * can be used as a wildcard."
+msgstr ""
+"Emojis are ordered in groups (tags). This is an array of key-value pairs "
+"where the key is the group name and the value is the location or array of "
+"locations. * can be used as a wildcard."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :pack_extensions"
+msgid "A list of file extensions for emojis, when no emoji.txt for a pack is present"
+msgstr ""
+"A list of file extensions for emojis, when no emoji.txt for a pack is present"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :shortcode_globs"
+msgid "Location of custom emoji files. * can be used as a wildcard."
+msgstr "Location of custom emoji files. * can be used as a wildcard."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes)."
+msgstr ""
+"Setting to force toggle / force disable improved hashtags timeline. "
+"`:enabled` forces hashtags to be fetched from `hashtags` table for hashtags "
+"timeline. `:disabled` forces object-embedded hashtags to be used (slower). "
+"Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` ["
+"unless overridden] when HashtagsTableMigrator completes)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title"
+msgid "Configure title rendering"
+msgstr "Configure title rendering"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :max_length"
+msgid "Maximum number of characters before truncating title"
+msgstr "Maximum number of characters before truncating title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :omission"
+msgid "Replacement which will be used after truncating string"
+msgstr "Replacement which will be used after truncating string"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Settings for Pleroma FE"
+msgstr "Settings for Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "When disabled, auto-hide the subject field if it's empty"
+msgstr "When disabled, auto-hide the subject field if it's empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "URL of the background, unless viewing a user profile with a background that is set"
+msgstr ""
+"URL of the background, unless viewing a user profile with a background that "
+"is set"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
+msgid "When a message has a subject (aka Content Warning), collapse it by default"
+msgstr ""
+"When a message has a subject (aka Content Warning), collapse it by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Enables green text on lines prefixed with the > character"
+msgstr "Enables green text on lines prefixed with the > character"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hides filtered statuses from timelines"
+msgstr "Hides filtered statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hides muted statuses from timelines"
+msgstr "Hides muted statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide notices statistics (repeats, favorites, ...)"
+msgstr "Hide notices statistics (repeats, favorites, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
+msgid "Hides instance name from PleromaFE banner"
+msgstr "Hides instance name from PleromaFE banner"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide profile statistics (posts, posts per day, followers, followings, ...)"
+msgstr ""
+"Hide profile statistics (posts, posts per day, followers, followings, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "URL of the logo, defaults to Pleroma's logo"
+msgstr "URL of the logo, defaults to Pleroma's logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Allows you to adjust vertical margins between logo boundary and navbar borders. The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout."
+msgstr ""
+"Allows you to adjust vertical margins between logo boundary and navbar "
+"borders. The idea is that to have logo's image without any extra margins and "
+"instead adjust them to your need in layout."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. If you want a colorful logo you must disable logoMask."
+msgstr ""
+"By default it assumes logo used will be monochrome with alpha channel to be "
+"compatible with both light and dark themes. If you want a colorful logo you "
+"must disable logoMask."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
+msgid "Limit scope selection to Direct, User default, and Scope of post replying to. Also prevents replying to a DM with a public post from PleromaFE."
+msgstr ""
+"Limit scope selection to Direct, User default, and Scope of post replying "
+"to. Also prevents replying to a DM with a public post from PleromaFE."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
+msgid "URL of the image to use for hiding NSFW media attachments in the timeline"
+msgstr ""
+"URL of the image to use for hiding NSFW media attachments in the timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Default post formatting option"
+msgstr "Default post formatting option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
+msgid "Relative URL which indicates where to redirect when a user is logged in"
+msgstr "Relative URL which indicates where to redirect when a user is logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
+msgid "Relative URL which indicates where to redirect when a user isn't logged in"
+msgstr ""
+"Relative URL which indicates where to redirect when a user isn't logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Copy the scope (private/unlisted/public) in replies to posts by default"
+msgstr "Copy the scope (private/unlisted/public) in replies to posts by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Enables panel displaying functionality of the instance on the About page"
+msgstr ""
+"Enables panel displaying functionality of the instance on the About page"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Whether to show the instance's custom panel"
+msgstr "Whether to show the instance's custom panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Change alignment of sidebar and panels to the right"
+msgstr "Change alignment of sidebar and panels to the right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
+msgid "Allows changing the default behaviour of subject lines in replies.\n `email`: copy and preprend re:, as in email,\n `masto`: copy verbatim, as in Mastodon,\n `noop`: don't copy the subject."
+msgstr ""
+"Allows changing the default behaviour of subject lines in replies.\n"
+" `email`: copy and preprend re:, as in email,\n"
+" `masto`: copy verbatim, as in Mastodon,\n"
+" `noop`: don't copy the subject."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Which theme to use. Available themes are defined in styles.json"
+msgstr "Which theme to use. Available themes are defined in styles.json"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin"
+msgid "Admin frontend"
+msgstr "Admin frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available"
+msgid "A map containing available frontends and parameters for their installation."
+msgstr ""
+"A map containing available frontends and parameters for their installation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > build_dir"
+msgid "The directory inside the zip file "
+msgstr "The directory inside the zip file "
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > build_url"
+msgid "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`."
+msgstr ""
+"Either an url to a zip file containing the frontend or a template to build "
+"it by inserting the `ref`. The string `${ref}` will be replaced by the "
+"configured `ref`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > custom-http-headers"
+msgid "The custom HTTP headers for the frontend"
+msgstr "The custom HTTP headers for the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > git"
+msgid "URL of the git repository of the frontend"
+msgstr "URL of the git repository of the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > name"
+msgid "Name of the frontend."
+msgstr "Name of the frontend."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > ref"
+msgid "Reference of the frontend to be used."
+msgstr "Reference of the frontend to be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary"
+msgid "Primary frontend, the one that is served for all pages by default"
+msgstr "Primary frontend, the one that is served for all pages by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :dstport"
+msgid "Port advertised in URLs (optional, defaults to port)"
+msgstr "Port advertised in URLs (optional, defaults to port)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :enabled"
+msgid "Enables the gopher interface"
+msgstr "Enables the gopher interface"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :ip"
+msgid "IP address to bind to"
+msgstr "IP address to bind to"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :port"
+msgid "Port to bind to"
+msgstr "Port to bind to"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :federation"
+msgid "Settings for federation pool."
+msgstr "Settings for federation pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :federation > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media"
+msgid "Settings for media pool."
+msgstr "Settings for media pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload"
+msgid "Settings for upload pool."
+msgstr "Settings for upload pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter"
+msgid "Adapter specific options"
+msgstr "Adapter specific options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL options for HTTP adapter"
+msgstr "SSL options for HTTP adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "List of TLS version to use"
+msgstr "List of TLS version to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :user_agent"
+msgid "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`."
+msgstr ""
+"What user agent to use. Must be a string or an atom `:default`. Default "
+"value is `:default`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :ct_max_age"
+msgid "The maximum age for the Expect-CT header if sent"
+msgstr "The maximum age for the Expect-CT header if sent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :enabled"
+msgid "Whether the managed content security policy is enabled"
+msgstr "Whether the managed content security policy is enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :referrer_policy"
+msgid "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+msgstr "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :report_uri"
+msgid "Adds the specified URL to report-uri and report-to group in CSP header"
+msgstr "Adds the specified URL to report-uri and report-to group in CSP header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts"
+msgid "Whether to additionally send a Strict-Transport-Security header"
+msgstr "Whether to additionally send a Strict-Transport-Security header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts_max_age"
+msgid "The maximum age for the Strict-Transport-Security header if sent"
+msgstr "The maximum age for the Strict-Transport-Security header if sent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_activation_required"
+msgid "Require users to confirm their emails before signing in"
+msgstr "Require users to confirm their emails before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_approval_required"
+msgid "Require users to be manually approved by an admin before signing in"
+msgstr "Require users to be manually approved by an admin before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_field_name_length"
+msgid "An account field name maximum length. Default: 512."
+msgstr "An account field name maximum length. Default: 512."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_field_value_length"
+msgid "An account field value maximum length. Default: 2048."
+msgstr "An account field value maximum length. Default: 2048."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :allow_relay"
+msgid "Permits remote instances to subscribe to all public posts of your instance. (Important!) This may increase the visibility of your instance."
+msgstr ""
+"Permits remote instances to subscribe to all public posts of your instance. "
+"(Important!) This may increase the visibility of your instance."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :allowed_post_formats"
+msgid "MIME-type list of formats allowed to be posted (transformed into HTML)"
+msgstr "MIME-type list of formats allowed to be posted (transformed into HTML)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :attachment_links"
+msgid "Enable to automatically add attachment link text to statuses"
+msgstr "Enable to automatically add attachment link text to statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Set to nicknames of (local) users that every new user should automatically follow"
+msgstr ""
+"Set to nicknames of (local) users that every new user should automatically "
+"follow"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Set to nicknames of (local) users that automatically follows every newly registered user"
+msgstr ""
+"Set to nicknames of (local) users that automatically follows every newly "
+"registered user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :avatar_upload_limit"
+msgid "File size limit of user's profile avatars"
+msgstr "File size limit of user's profile avatars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :background_upload_limit"
+msgid "File size limit of user's profile backgrounds"
+msgstr "File size limit of user's profile backgrounds"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :banner_upload_limit"
+msgid "File size limit of user's profile banners"
+msgstr "File size limit of user's profile banners"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :birthday_min_age"
+msgid "Minimum required age for users to create account. Only used if birthday is required."
+msgstr ""
+"Minimum required age for users to create account. Only used if birthday is "
+"required."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :birthday_required"
+msgid "Require users to enter their birthday."
+msgstr "Require users to enter their birthday."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :cleanup_attachments"
+msgid "Enable to remove associated attachments when status is removed.\nThis will not affect duplicates and attachments without status.\nEnabling this will increase load to database when deleting statuses on larger instances.\n"
+msgstr ""
+"Enable to remove associated attachments when status is removed.\n"
+"This will not affect duplicates and attachments without status.\n"
+"Enabling this will increase load to database when deleting statuses on "
+"larger instances.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :description"
+msgid "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+msgstr ""
+"The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :email"
+msgid "Email used to reach an Administrator/Moderator of the instance"
+msgstr "Email used to reach an Administrator/Moderator of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :extended_nickname_format"
+msgid "Enable to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames."
+msgstr ""
+"Enable to use extended local nicknames format (allows underscores/dashes). "
+"This will break federation with older software for theses nicknames."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :external_user_synchronization"
+msgid "Enabling following/followers counters synchronization for external users"
+msgstr ""
+"Enabling following/followers counters synchronization for external users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federating"
+msgid "Enable federation with other instances"
+msgstr "Enable federation with other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Max. depth of reply-to and reply activities fetching on incoming federation, to prevent out-of-memory situations while fetching very long threads. If set to `nil`, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes."
+msgstr ""
+"Max. depth of reply-to and reply activities fetching on incoming federation, "
+"to prevent out-of-memory situations while fetching very long threads. If set "
+"to `nil`, threads of any depth will be fetched. Lower this value if you "
+"experience out-of-memory crashes."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it"
+msgstr ""
+"Timeout (in days) of each external federation target being unreachable prior "
+"to pausing federating to it"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :healthcheck"
+msgid "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
+msgstr "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :instance_thumbnail"
+msgid "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance."
+msgstr ""
+"The instance thumbnail can be any image that represents your instance and is "
+"used by some apps or services when they display information about your "
+"instance."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :invites_enabled"
+msgid "Enable user invitations for admins (depends on `registrations_open` being disabled)"
+msgstr ""
+"Enable user invitations for admins (depends on `registrations_open` being "
+"disabled)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :limit"
+msgid "Posts character limit (CW/Subject included in the counter)"
+msgstr "Posts character limit (CW/Subject included in the counter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit unauthenticated users to search for local statutes and users only. Default: `:unauthenticated`."
+msgstr ""
+"Limit unauthenticated users to search for local statutes and users only. "
+"Default: `:unauthenticated`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_account_fields"
+msgid "The maximum number of custom fields in the user profile. Default: 10."
+msgstr "The maximum number of custom fields in the user profile. Default: 10."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_endorsed_users"
+msgid "The maximum number of recommended accounts. 0 will disable the feature."
+msgstr "The maximum number of recommended accounts. 0 will disable the feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_media_attachments"
+msgid "Maximum number of post media attachments"
+msgstr "Maximum number of post media attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_pinned_statuses"
+msgid "The maximum number of pinned statuses. 0 will disable the feature."
+msgstr "The maximum number of pinned statuses. 0 will disable the feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_remote_account_fields"
+msgid "The maximum number of custom fields in the remote user profile. Default: 20."
+msgstr ""
+"The maximum number of custom fields in the remote user profile. Default: 20."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_report_comment_size"
+msgid "The maximum size of the report comment. Default: 1000."
+msgstr "The maximum size of the report comment. Default: 1000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi-factor authentication settings"
+msgstr "Multi-factor authentication settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "MFA backup codes settings"
+msgstr "MFA backup codes settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
+msgid "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters."
+msgstr ""
+"Determines the length of backup one-time pass-codes, in characters. Defaults "
+"to 16 characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number of backup codes to generate."
+msgstr "Number of backup codes to generate."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
+msgid "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters."
+msgstr ""
+"Determines the length of a one-time pass-code, in characters. Defaults to 6 "
+"characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
+msgid "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds."
+msgstr ""
+"A period for which the TOTP code will be valid, in seconds. Defaults to 30 "
+"seconds."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :name"
+msgid "Name of the instance"
+msgstr "Name of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :notify_email"
+msgid "Envelope FROM address for mail sent via Pleroma"
+msgstr "Envelope FROM address for mail sent via Pleroma"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits"
+msgid "A map with poll limits for local polls"
+msgstr "A map with poll limits for local polls"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Maximum expiration time (in seconds)"
+msgstr "Maximum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Maximum number of characters per option"
+msgstr "Maximum number of characters per option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Maximum number of options"
+msgstr "Maximum number of options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Minimum expiration time (in seconds)"
+msgstr "Minimum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :privileged_staff"
+msgid "Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
+msgstr ""
+"Let moderators access sensitive data (e.g. updating user credentials, get "
+"password reset token, delete users, index and read private statuses and "
+"chats)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :profile_directory"
+msgid "Enable profile directory."
+msgstr "Enable profile directory."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :public"
+msgid "Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note: when setting to `false`, please also check `:restrict_unauthenticated` setting."
+msgstr ""
+"Makes the client API in authenticated mode-only except for user-profiles. "
+"Useful for disabling the Local Timeline and The Whole Known Network. Note: "
+"when setting to `false`, please also check `:restrict_unauthenticated` "
+"setting."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :quarantined_instances"
+msgid "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so"
+msgstr ""
+"List of ActivityPub instances where private (DMs, followers-only) activities "
+"will not be sent and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :registration_reason_length"
+msgid "Maximum registration reason length. Default: 500."
+msgstr "Maximum registration reason length. Default: 500."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :registrations_open"
+msgid "Enable registrations for anyone. Invitations require this setting to be disabled."
+msgstr ""
+"Enable registrations for anyone. Invitations require this setting to be "
+"disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :remote_limit"
+msgid "Hard character limit beyond which remote posts will be dropped"
+msgstr "Hard character limit beyond which remote posts will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :remote_post_retention_days"
+msgid "The default amount of days to retain remote posts when pruning the database"
+msgstr ""
+"The default amount of days to retain remote posts when pruning the database"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :safe_dm_mentions"
+msgid "If enabled, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. \"@admin please keep an eye on @bad_actor\"). Default: disabled"
+msgstr ""
+"If enabled, only mentions at the beginning of a post will be used to address "
+"people in direct messages. This is to prevent accidental mentioning of "
+"people when talking about them (e.g. \"@admin please keep an eye on @"
+"bad_actor\"). Default: disabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :show_reactions"
+msgid "Let favourites and emoji reactions be viewed through the API."
+msgstr "Let favourites and emoji reactions be viewed through the API."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip filtering out broken threads. Default: enabled."
+msgstr "Skip filtering out broken threads. Default: enabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :static_dir"
+msgid "Instance static directory"
+msgstr "Instance static directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :upload_limit"
+msgid "File size limit of uploads (except for avatar, background, banner)"
+msgstr "File size limit of uploads (except for avatar, background, banner)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_bio_length"
+msgid "A user bio maximum length. Default: 5000."
+msgstr "A user bio maximum length. Default: 5000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_name_length"
+msgid "A user name maximum length. Default: 100."
+msgstr "A user name maximum length. Default: 100."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instances_favicons > :enabled"
+msgid "Allow/disallow displaying and getting instances favicons"
+msgstr "Allow/disallow displaying and getting instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :base"
+msgid "LDAP base, e.g. \"dc=example,dc=com\""
+msgstr "LDAP base, e.g. \"dc=example,dc=com\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :enabled"
+msgid "Enables LDAP authentication"
+msgstr "Enables LDAP authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :host"
+msgid "LDAP server hostname"
+msgstr "LDAP server hostname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :port"
+msgid "LDAP port, e.g. 389 or 636"
+msgstr "LDAP port, e.g. 389 or 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :ssl"
+msgid "Enable to use SSL, usually implies the port 636"
+msgstr "Enable to use SSL, usually implies the port 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts"
+msgid "Additional SSL options"
+msgstr "Additional SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tls"
+msgid "Enable to use STARTTLS, usually implies the port 389"
+msgstr "Enable to use STARTTLS, usually implies the port 389"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts"
+msgid "Additional TLS options"
+msgstr "Additional TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :uid"
+msgid "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\""
+msgstr ""
+"LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter "
+"will be \"cn=username,base\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:majic_pool > :size"
+msgid "Number of majic workers to start."
+msgstr "Number of majic workers to start."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :background_color"
+msgid "Describe the background color of the app"
+msgstr "Describe the background color of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :icons"
+msgid "Describe the icons of the app"
+msgstr "Describe the icons of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :theme_color"
+msgid "Describe the theme color of the app"
+msgstr "Describe the theme color of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:markup > :scrub_policy"
+msgid "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name."
+msgstr ""
+"Module names are shortened (removed leading `Pleroma.HTML.` part), but on "
+"adding custom module you need to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy."
+msgstr ""
+"Enables proxying of remote media preview to the instance's proxy. Requires "
+"enabled media proxy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+msgstr ""
+"Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length (in bytes) to perform preview. Media smaller in size will be served without thumbnailing."
+msgstr ""
+"Min content length (in bytes) to perform preview. Media smaller in size will "
+"be served without thumbnailing."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Max height of preview thumbnail for images (video preview always has original dimensions)."
+msgstr ""
+"Max height of preview thumbnail for images (video preview always has "
+"original dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Max width of preview thumbnail for images (video preview always has original dimensions)."
+msgstr ""
+"Max width of preview thumbnail for images (video preview always has original "
+"dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :base_url"
+msgid "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts."
+msgstr ""
+"The base URL to access a user-uploaded file. Useful when you want to proxy "
+"the media files via another host/CDN fronts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :enabled"
+msgid "Enables proxying of remote media via the instance's proxy"
+msgstr "Enables proxying of remote media via the instance's proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enables media cache object invalidation."
+msgstr "Enables media cache object invalidation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Module which will be used to purge objects from the cache."
+msgstr "Module which will be used to purge objects from the cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts"
+msgid "Internal Pleroma.ReverseProxy settings"
+msgstr "Internal Pleroma.ReverseProxy settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+msgstr ""
+"Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Timeout (in milliseconds) of GET request to the remote URI."
+msgstr "Timeout (in milliseconds) of GET request to the remote URI."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirects the client to the origin server upon encountering HTTP errors.\n\nNote that files larger than Max Body Length will trigger an error. (e.g., Peertube videos)\n\n\n**WARNING:** This setting will allow larger files to be accessed, but exposes the\n\nIP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+msgstr ""
+"Redirects the client to the origin server upon encountering HTTP errors.\n"
+"\n"
+"Note that files larger than Max Body Length will trigger an error. (e.g., "
+"Peertube videos)\n"
+"\n"
+"\n"
+"**WARNING:** This setting will allow larger files to be accessed, but "
+"exposes the\n"
+"\n"
+"IP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :whitelist"
+msgid "List of hosts with scheme to bypass the MediaProxy"
+msgstr "List of hosts with scheme to bypass the MediaProxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:modules > :runtime_dir"
+msgid "A path to custom Elixir modules (such as MRF policies)."
+msgstr "A path to custom Elixir modules (such as MRF policies)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :policies"
+msgid "A list of MRF policies enabled. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name."
+msgstr ""
+"A list of MRF policies enabled. Module names are shortened (removed leading "
+"`Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency"
+msgid "Make the content of your Message Rewrite Facility settings public (via nodeinfo)"
+msgstr ""
+"Make the content of your Message Rewrite Facility settings public (via "
+"nodeinfo)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency_exclusions"
+msgid "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. You can also provide a reason for excluding these instance names. The instances and reasons won't be publicly disclosed."
+msgstr ""
+"Exclude specific instance names from MRF transparency. The use of the "
+"exclusions feature will be disclosed in nodeinfo as a boolean value. You can "
+"also provide a reason for excluding these instance names. The instances and "
+"reasons won't be publicly disclosed."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_activity_expiration > :days"
+msgid "Default global expiration time for all local activities (in days)"
+msgstr "Default global expiration time for all local activities (in days)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "The name of the bot account to use for following newly discovered users."
+msgstr ""
+"The name of the bot account to use for following newly discovered users."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "A list of hashtags which result in message being removed from federated timelines (a.k.a unlisted)."
+msgstr ""
+"A list of hashtags which result in message being removed from federated "
+"timelines (a.k.a unlisted)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :reject"
+msgid "A list of hashtags which result in message being rejected."
+msgstr "A list of hashtags which result in message being rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :sensitive"
+msgid "A list of hashtags which result in message being set as sensitive (a.k.a NSFW/R-18)"
+msgstr ""
+"A list of hashtags which result in message being set as sensitive (a.k.a "
+"NSFW/R-18)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Number of mentioned users after which the message gets removed from timelines anddisables notifications. Set to 0 to disable."
+msgstr ""
+"Number of mentioned users after which the message gets removed from "
+"timelines anddisables notifications. Set to 0 to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Number of mentioned users after which the messaged gets rejected. Set to 0 to disable."
+msgstr ""
+"Number of mentioned users after which the messaged gets rejected. Set to 0 "
+"to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid " A list of patterns which result in message being removed from federated timelines (a.k.a unlisted).\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns which result in message being removed from federated "
+"timelines (a.k.a unlisted).\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :reject"
+msgid " A list of patterns which result in message being rejected.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns which result in message being rejected.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :replace"
+msgid " **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n\n **Replacement**: a string. Leaving the field empty is permitted.\n"
+msgstr ""
+" **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in "
+"the format of `~r/PATTERN/`.\n"
+"\n"
+" **Replacement**: a string. Leaving the field empty is permitted.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention > :actors"
+msgid "A list of actors for which any post mentioning them will be dropped"
+msgstr "A list of actors for which any post mentioning them will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age > :actions"
+msgid "A list of actions to apply to the post. `:delist` removes the post from public timelines; `:strip_followers` removes followers from the ActivityPub recipient list ensuring they won't be delivered to home timelines; `:reject` rejects the message entirely"
+msgstr ""
+"A list of actions to apply to the post. `:delist` removes the post from "
+"public timelines; `:strip_followers` removes followers from the ActivityPub "
+"recipient list ensuring they won't be delivered to home timelines; `:reject` "
+"rejects the message entirely"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age > :threshold"
+msgid "Required age (in seconds) of a post before actions are taken."
+msgstr "Required age (in seconds) of a post before actions are taken."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Whether to allow direct messages"
+msgstr "Whether to allow direct messages"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Whether to allow followers-only posts"
+msgstr "Whether to allow followers-only posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :accept"
+msgid "List of instances to only accept activities from (except deletes) and the reason for doing so"
+msgstr ""
+"List of instances to only accept activities from (except deletes) and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :avatar_removal"
+msgid "List of instances to strip avatars from and the reason for doing so"
+msgstr "List of instances to strip avatars from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :banner_removal"
+msgid "List of instances to strip banners from and the reason for doing so"
+msgstr "List of instances to strip banners from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "List of instances to remove from the Federated (aka The Whole Known Network) Timeline and the reason for doing so"
+msgstr ""
+"List of instances to remove from the Federated (aka The Whole Known Network) "
+"Timeline and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :followers_only"
+msgid "Force posts from the given instances to be visible by followers only and the reason for doing so"
+msgstr ""
+"Force posts from the given instances to be visible by followers only and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :media_nsfw"
+msgid "List of instances to tag all media as NSFW (sensitive) from and the reason for doing so"
+msgstr ""
+"List of instances to tag all media as NSFW (sensitive) from and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :media_removal"
+msgid "List of instances to strip media attachments from and the reason for doing so"
+msgstr ""
+"List of instances to strip media attachments from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :reject"
+msgid "List of instances to reject activities from (except deletes) and the reason for doing so"
+msgstr ""
+"List of instances to reject activities from (except deletes) and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :reject_deletes"
+msgid "List of instances to reject deletions from and the reason for doing so"
+msgstr "List of instances to reject deletions from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :report_removal"
+msgid "List of instances to reject reports from and the reason for doing so"
+msgstr "List of instances to reject reports from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "List of hosts to steal emojis from"
+msgstr "List of hosts to steal emojis from"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid " A list of patterns or matches to reject shortcodes with.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns or matches to reject shortcodes with.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "File size limit (in bytes), checked before an emoji is saved to the disk"
+msgstr ""
+"File size limit (in bytes), checked before an emoji is saved to the disk"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_subchain > :match_actor"
+msgid "Matches a series of regular expressions against the actor field"
+msgstr "Matches a series of regular expressions against the actor field"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :accept"
+msgid "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted."
+msgstr ""
+"A list of ActivityStreams terms to accept. If empty, all supported messages "
+"are accepted."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :reject"
+msgid "A list of ActivityStreams terms to reject. If empty, no messages are rejected."
+msgstr ""
+"A list of ActivityStreams terms to reject. If empty, no messages are "
+"rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Enable a background job to clean expired OAuth tokens. Default: disabled."
+msgstr ""
+"Enable a background job to clean expired OAuth tokens. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Keeps old refresh token or generate new refresh token when to obtain an access token"
+msgstr ""
+"Keeps old refresh token or generate new refresh token when to obtain an "
+"access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :token_expires_in"
+msgid "The lifetime in seconds of the access token"
+msgstr "The lifetime in seconds of the access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default"
+msgid "Settings for default pool."
+msgstr "Settings for default pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation"
+msgid "Settings for federation pool."
+msgstr "Settings for federation pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media"
+msgid "Settings for media pool."
+msgstr "Settings for media pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload"
+msgid "Settings for upload pool."
+msgstr "Settings for upload pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if hashtags transfer failed for all records."
+msgstr ""
+"Max accepted rate of objects that failed in the migration. Any value from "
+"0.0 which tolerates no errors to 1.0 which will enable the feature even if "
+"hashtags transfer failed for all records."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)."
+msgstr ""
+"Sleep interval between each chunk of processed records in order to decrease "
+"the load on the system (defaults to 0 and should be keep default on most "
+"instances)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :app_account_creation"
+msgid "For registering user accounts from the same IP address"
+msgstr "For registering user accounts from the same IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :authentication"
+msgid "For authentication create / password check / user existence check requests"
+msgstr ""
+"For authentication create / password check / user existence check requests"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relation_id_action"
+msgid "For actions on relation with a specific user (follow, unfollow)"
+msgstr "For actions on relation with a specific user (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relations_actions"
+msgid "For actions on relationships with all users (follow, unfollow)"
+msgstr "For actions on relationships with all users (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :search"
+msgid "For the search requests (account & status search etc.)"
+msgstr "For the search requests (account & status search etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :status_id_action"
+msgid "For fav / unfav or reblog / unreblog actions on the same status by the same user"
+msgstr ""
+"For fav / unfav or reblog / unreblog actions on the same status by the same "
+"user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :statuses_actions"
+msgid "For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+msgstr ""
+"For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :timeline"
+msgid "For requests to timelines (each timeline has it's own limiter)"
+msgstr "For requests to timelines (each timeline has it's own limiter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Settings for statuses."
+msgstr "Settings for statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Disallow view local statuses."
+msgstr "Disallow view local statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Disallow view remote statuses."
+msgstr "Disallow view remote statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Settings for user profiles."
+msgstr "Settings for user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Disallow view local user profiles."
+msgstr "Disallow view local user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Disallow view remote user profiles."
+msgstr "Disallow view remote user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Settings for public and federated timelines."
+msgstr "Settings for public and federated timelines."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Disallow view federated timeline."
+msgstr "Disallow view federated timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Disallow view public timeline."
+msgstr "Disallow view public timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :enabled"
+msgid "Enables RichMedia parsing of URLs"
+msgstr "Enables RichMedia parsing of URLs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :failure_backoff"
+msgid "Amount of milliseconds after request failure, during which the request will not be retried."
+msgstr ""
+"Amount of milliseconds after request failure, during which the request will "
+"not be retried."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_hosts"
+msgid "List of hosts which will be ignored by the metadata parser"
+msgstr "List of hosts which will be ignored by the metadata parser"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_tld"
+msgid "List TLDs (top-level domains) which will ignore for parse metadata"
+msgstr "List TLDs (top-level domains) which will ignore for parse metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :parsers"
+msgid "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name."
+msgstr ""
+"List of Rich Media parsers. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ttl_setters"
+msgid "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name."
+msgstr ""
+"List of rich media TTL setters. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:shout > :enabled"
+msgid "Enables the backend Shoutbox chat feature."
+msgstr "Enables the backend Shoutbox chat feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:shout > :limit"
+msgid "Shout message character limit."
+msgstr "Shout message character limit."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:static_fe > :enabled"
+msgid "Enables the rendering of static HTML. Default: disabled."
+msgstr "Enables the rendering of static HTML. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer > :overflow_workers"
+msgid "Maximum number of workers created if pool is empty"
+msgstr "Maximum number of workers created if pool is empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer > :workers"
+msgid "Number of workers to send notifications"
+msgstr "Number of workers to send notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes > :valid_schemes"
+msgid "List of the scheme part that is considered valid to be an URL"
+msgstr "List of the scheme part that is considered valid to be an URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub routes (except question activities). Default: `nil` (no expiration)."
+msgstr ""
+"Activity pub routes (except question activities). Default: `nil` (no "
+"expiration)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+msgstr ""
+"Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enables sending a chat message to newly registered users"
+msgstr "Enables sending a chat message to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :message"
+msgid "A message that will be sent to newly registered users as a chat message"
+msgstr "A message that will be sent to newly registered users as a chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome chat message"
+msgstr "The nickname of the local user that sends a welcome chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enables sending a direct message to newly registered users"
+msgstr "Enables sending a direct message to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :message"
+msgid "A message that will be sent to newly registered users"
+msgstr "A message that will be sent to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome message"
+msgstr "The nickname of the local user that sends a welcome message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :enabled"
+msgid "Enables sending an email to newly registered users"
+msgstr "Enables sending an email to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :html"
+msgid "HTML content of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+"HTML content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :sender"
+msgid "Email address and/or nickname that will be used to send the welcome email."
+msgstr ""
+"Email address and/or nickname that will be used to send the welcome email."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :subject"
+msgid "Subject of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+"Subject of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :text"
+msgid "Text content of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+"Text content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:workers > :retries"
+msgid "Max retry attempts for failed jobs, per `Oban` queue"
+msgstr "Max retry attempts for failed jobs, per `Oban` queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Concurrent limits configuration for MediaProxyWarmingPolicy."
+msgstr "Concurrent limits configuration for MediaProxyWarmingPolicy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Concurrent limits configuration for getting RichMedia for activities."
+msgstr "Concurrent limits configuration for getting RichMedia for activities."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :crontab"
+msgid "Settings for cron background jobs"
+msgstr "Settings for cron background jobs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :log"
+msgid "Logs verbose mode"
+msgstr "Logs verbose mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues"
+msgid "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+msgstr ""
+"Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration queue"
+msgstr "Activity expiration queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachment deletion queue"
+msgstr "Attachment deletion queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :background"
+msgid "Background queue"
+msgstr "Background queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :backup"
+msgid "Backup queue"
+msgstr "Backup queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Incoming federation queue"
+msgstr "Incoming federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Outgoing federation queue"
+msgstr "Outgoing federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :mailer"
+msgid "Email sender queue, see Pleroma.Emails.Mailer"
+msgstr "Email sender queue, see Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities queue, see Pleroma.ScheduledActivities"
+msgstr "Scheduled activities queue, see Pleroma.ScheduledActivities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier queue"
+msgstr "Transmogrifier queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :web_push"
+msgid "Web push notifications queue"
+msgstr "Web push notifications queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Whether the captcha should be shown on registration"
+msgstr "Whether the captcha should be shown on registration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :method"
+msgid "The method/service to use for captcha"
+msgstr "The method/service to use for captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "The time in seconds for which the captcha is valid"
+msgstr "The time in seconds for which the captcha is valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "The kocaptcha endpoint to use"
+msgstr "The kocaptcha endpoint to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/swoosh/Swoosh.html#module-adapters)"
+msgstr ""
+"One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/"
+"swoosh/Swoosh.html#module-adapters)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "SMTP AUTH enforcement mode"
+msgstr "SMTP AUTH enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "SMTP AUTH password"
+msgstr "SMTP AUTH password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "SMTP port"
+msgstr "SMTP port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Hostname or IP address"
+msgstr "Hostname or IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "SMTP temporary (4xx) error retries"
+msgstr "SMTP temporary (4xx) error retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use Implicit SSL/TLS. e.g. port 465"
+msgstr "Use Implicit SSL/TLS. e.g. port 465"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "Explicit TLS (STARTTLS) enforcement mode"
+msgstr "Explicit TLS (STARTTLS) enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "SMTP AUTH username"
+msgstr "SMTP AUTH username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enables new users admin digest email when `true`"
+msgstr "Enables new users admin digest email when `true`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+msgstr ""
+"A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "A map with color settings for email templates."
+msgstr "A map with color settings for email templates."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :class"
+msgid "Specify the class to be added to the generated link. Disable to clear."
+msgstr "Specify the class to be added to the generated link. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :extra"
+msgid "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+msgstr "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :new_window"
+msgid "Link URLs will open in a new window/tab."
+msgstr "Link URLs will open in a new window/tab."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :rel"
+msgid "Override the rel attribute. Disable to clear."
+msgstr "Override the rel attribute. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip the scheme prefix."
+msgstr "Strip the scheme prefix."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`"
+msgstr ""
+"Set to a number to truncate URLs longer than the number. Truncated URLs will "
+"end in `...`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)"
+msgstr ""
+"Set to false to disable TLD validation for URLs/emails. Can be set to :"
+"no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` "
+"will be validated, but `http://example.loki` won't)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "The number of scheduled activities a user is allowed to create in a single day. Default: 25."
+msgstr ""
+"The number of scheduled activities a user is allowed to create in a single "
+"day. Default: 25."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Whether scheduled activities are sent to the job queue to be executed"
+msgstr "Whether scheduled activities are sent to the job queue to be executed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "The number of scheduled activities a user is allowed to create in total. Default: 300."
+msgstr ""
+"The number of scheduled activities a user is allowed to create in total. "
+"Default: 300."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL for the uploads. Required if you use a CDN or host attachments under a different domain."
+msgstr ""
+"Base URL for the uploads. Required if you use a CDN or host attachments "
+"under a different domain."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Set max length of a filename to display. 0 = no limit. Default: 30"
+msgstr "Set max length of a filename to display. 0 = no limit. Default: 30"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :filters"
+msgid "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name."
+msgstr ""
+"List of filter modules for uploads. Module names are shortened (removed "
+"leading `Pleroma.Upload.Filter.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :link_name"
+msgid "If enabled, a name parameter will be added to the URL of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`."
+msgstr ""
+"If enabled, a name parameter will be added to the URL of the upload. For "
+"example `https://instance.tld/media/imagehash.png?name=realname.png`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy requests to the remote uploader.\n\nUseful if media upload endpoint is not internet accessible.\n"
+msgstr ""
+"Proxy requests to the remote uploader.\n"
+"\n"
+"Useful if media upload endpoint is not internet accessible.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :uploader"
+msgid "Module which will be used for uploads"
+msgstr "Module which will be used for uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original filename extension by using {extension}, for example custom-file-name.{extension}."
+msgstr ""
+"Text to replace filenames in links. If no setting, {random}.extension will "
+"be used. You can get the original filename extension by using {extension}, "
+"for example custom-file-name.{extension}."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "List of actions for the mogrify command. It's possible to add self-written settings as string. For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings."
+msgstr ""
+"List of actions for the mogrify command. It's possible to add self-written "
+"settings as string. For example `auto-orient, strip, {\"resize\", \"3840x1080"
+">\"}` value will be parsed into valid list of the settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Path where user's uploads will be saved"
+msgstr "Path where user's uploads will be saved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "S3 bucket"
+msgstr "S3 bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "S3 bucket namespace"
+msgstr "S3 bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Enable streaming uploads, when enabled the file will be sent to the server in chunks as it's being read. This may be unsupported by some providers, try disabling this if you have upload problems."
+msgstr ""
+"Enable streaming uploads, when enabled the file will be sent to the server "
+"in chunks as it's being read. This may be unsupported by some providers, try "
+"disabling this if you have upload problems."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc. For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in Upload base_url."
+msgstr ""
+"If you use S3 compatible service such as Digital Ocean Spaces or CDN, set "
+"folder name or \"\" etc. For example, when using CDN to S3 virtual host "
+"format, set \"\". At this time, write CNAME to CDN in Upload base_url."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :email_blacklist"
+msgid "List of email domains users may not register with."
+msgstr "List of email domains users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "List of nicknames users may not register with."
+msgstr "List of nicknames users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit user to export not more often than once per N days"
+msgstr "Limit user to export not more often than once per N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Remove backup achives after N days"
+msgstr "Remove backup achives after N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Enables strict input validation (useful in development, not recommended in production)"
+msgstr ""
+"Enables strict input validation (useful in development, not recommended in "
+"production)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "HTTP headers of request"
+msgstr "HTTP headers of request"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "HTTP method of request. Default: :purge"
+msgstr "HTTP method of request. Default: :purge"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Request options"
+msgstr "Request options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Path to executable script which will purge cached items."
+msgstr "Path to executable script which will purge cached items."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "Optional URL format preprocessing. Only required for Apache's htcacheclean."
+msgstr ""
+"Optional URL format preprocessing. Only required for Apache's htcacheclean."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "List of metadata providers to enable"
+msgstr "List of metadata providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "When enabled NSFW attachments will be shown in previews"
+msgstr "When enabled NSFW attachments will be shown in previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enable/disable the plug. Default: disabled."
+msgstr "Enable/disable the plug. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid " A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `[\"x-forwarded-for\"]`.\n"
+msgstr ""
+" A list of strings naming the HTTP headers to use when deriving the true "
+"client IP. Default: `[\"x-forwarded-for\"]`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128."
+msgstr ""
+"A list of upstream proxy IP subnets in CIDR notation from which we will "
+"parse the content of `headers`. Defaults to `[]`. IPv4 entries without a "
+"bitmask will be assumed to be /32 and IPv6 /128."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid " A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", \"fc00::/7\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
+msgstr ""
+" A list of reserved IP subnets in CIDR notation which should be ignored if "
+"found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", \"fc00::/7\""
+", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "List of preload providers to enable"
+msgstr "List of preload providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enables expired activities addition & deletion"
+msgstr "Enables expired activities addition & deletion"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Minimum lifetime for ephemeral activity (in seconds)"
+msgstr "Minimum lifetime for ephemeral activity (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
+msgid "Enables HTTP Basic Auth for app metrics endpoint."
+msgstr "Enables HTTP Basic Auth for app metrics endpoint."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
+msgid "[Pleroma extension] Enables app metrics endpoint."
+msgstr "[Pleroma extension] Enables app metrics endpoint."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
+msgid "App metrics endpoint output format."
+msgstr "App metrics endpoint output format."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
+msgid "Restrict access of app metrics endpoint to the specified IP addresses."
+msgstr "Restrict access of app metrics endpoint to the specified IP addresses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
+msgid "App metrics endpoint URI path."
+msgstr "App metrics endpoint URI path."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack > :meta"
+msgid "Configure which metadata you want to report on"
+msgstr "Configure which metadata you want to report on"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack > :webhook_url"
+msgid "Configure the Slack incoming webhook"
+msgstr "Configure the Slack incoming webhook"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :private_key"
+msgid "VAPID private key"
+msgstr "VAPID private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :public_key"
+msgid "VAPID public key"
+msgstr "VAPID public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :subject"
+msgid "A mailto link for the administrative contact. It's best if this email is not a personal email address, but rather a group email to the instance moderation team."
+msgstr ""
+"A mailto link for the administrative contact. It's best if this email is not "
+"a personal email address, but rather a group email to the instance "
+"moderation team."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :credentials"
+msgid "Credentials"
+msgstr "Credentials"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :expose"
+msgid "Expose"
+msgstr "Expose"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :max_age"
+msgid "Max age"
+msgstr "Max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :methods"
+msgid "Methods"
+msgstr "Methods"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :handler"
+msgid "Handler"
+msgstr "Handler"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :password_authenticator"
+msgid "Password authenticator"
+msgstr "Password authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :priv_dir"
+msgid "Priv dir"
+msgstr "Priv dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :access_key_id"
+msgid "Access key"
+msgstr "Access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :region"
+msgid "Region"
+msgstr "Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger > :backends"
+msgid "Backends"
+msgstr "Backends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :ident"
+msgid "Ident"
+msgstr "Ident"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types"
+msgid "Types"
+msgstr "Types"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/activity+json"
+msgid "\"application/activity+json\""
+msgstr "\"application/activity+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/jrd+json"
+msgid "\"application/jrd+json\""
+msgstr "\"application/jrd+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/ld+json"
+msgid "\"application/ld+json\""
+msgstr "\"application/ld+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/xml"
+msgid "\"application/xml\""
+msgstr "\"application/xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/xrd+xml"
+msgid "\"application/xrd+xml\""
+msgstr "\"application/xrd+xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma > Pleroma.Web.Auth.Authenticator"
+msgid "Pleroma.Web.Auth.Authenticator"
+msgstr "Pleroma.Web.Auth.Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :blockers_visible"
+msgid "Blockers visible"
+msgstr "Blockers visible"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Follow handshake timeout"
+msgstr "Follow handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "Note replies output limit"
+msgstr "Note replies output limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Outgoing blocks"
+msgstr "Outgoing blocks"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches"
+msgstr "Sign object fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Unfollow blocked"
+msgstr "Unfollow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_mascot"
+msgid "Default mascot"
+msgstr "Default mascot"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_user_avatar"
+msgid "Default user avatar"
+msgstr "Default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :mascots"
+msgid "Mascots"
+msgstr "Mascots"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :auth_template"
+msgid "Auth template"
+msgstr "Auth template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "Enforce OAuth admin scope usage"
+msgstr "Enforce OAuth admin scope usage"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "OAuth consumer strategies"
+msgstr "OAuth consumer strategies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer template"
+msgstr "OAuth consumer template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :connect_timeout"
+msgid "Connect timeout"
+msgstr "Connect timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_retries"
+msgid "Connection acquisition retries"
+msgstr "Connection acquisition retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_wait"
+msgid "Connection acquisition wait"
+msgstr "Connection acquisition wait"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid "Reclaim multiplier"
+msgstr "Reclaim multiplier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest"
+msgid "Digest"
+msgstr "Digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :active"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Inactivity threshold"
+msgstr "Inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :interval"
+msgid "Interval"
+msgstr "Interval"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :schedule"
+msgid "Schedule"
+msgstr "Schedule"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :default_manifest"
+msgid "Default manifest"
+msgstr "Default manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :groups"
+msgid "Groups"
+msgstr "Groups"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :pack_extensions"
+msgid "Pack extensions"
+msgstr "Pack extensions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shared_pack_cache_seconds_per_file"
+msgid "Shared pack cache s/file"
+msgstr "Shared pack cache s/file"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shortcode_globs"
+msgid "Shortcode globs"
+msgstr "Shortcode globs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Improved hashtag timeline"
+msgstr "Improved hashtag timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title"
+msgid "Post title"
+msgstr "Post title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :max_length"
+msgid "Max length"
+msgstr "Max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :omission"
+msgid "Omission"
+msgstr "Omission"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Pleroma FE"
+msgstr "Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "Always show subject input"
+msgstr "Always show subject input"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
+msgid "Collapse message with subject"
+msgstr "Collapse message with subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Greentext"
+msgstr "Greentext"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hide Filtered Statuses"
+msgstr "Hide Filtered Statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hide Muted Posts"
+msgstr "Hide Muted Posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide post stats"
+msgstr "Hide post stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
+msgid "Hide Sitename"
+msgstr "Hide Sitename"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide user stats"
+msgstr "Hide user stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Logo margin"
+msgstr "Logo margin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "Logo mask"
+msgstr "Logo mask"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
+msgid "Minimal scopes mode"
+msgstr "Minimal scopes mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
+msgid "NSFW Censor Image"
+msgstr "NSFW Censor Image"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Post Content Type"
+msgstr "Post Content Type"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
+msgid "Redirect root login"
+msgstr "Redirect root login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
+msgid "Redirect root no login"
+msgstr "Redirect root no login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Scope copy"
+msgstr "Scope copy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Show instance features panel"
+msgstr "Show instance features panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Show instance specific panel"
+msgstr "Show instance specific panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Sidebar on Right"
+msgstr "Sidebar on Right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
+msgid "Subject line behavior"
+msgstr "Subject line behavior"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Theme"
+msgstr "Theme"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin"
+msgid "Admin"
+msgstr "Admin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available"
+msgid "Available"
+msgstr "Available"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_dir"
+msgid "Build directory"
+msgstr "Build directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_url"
+msgid "Build URL"
+msgstr "Build URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > custom-http-headers"
+msgid "Custom HTTP headers"
+msgstr "Custom HTTP headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > git"
+msgid "Git Repository URL"
+msgstr "Git Repository URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary"
+msgid "Primary"
+msgstr "Primary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :dstport"
+msgid "Dstport"
+msgstr "Dstport"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :ip"
+msgid "IP"
+msgstr "IP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation"
+msgid "Federation"
+msgstr "Federation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media"
+msgid "Media"
+msgstr "Media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload"
+msgid "Upload"
+msgstr "Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL Options"
+msgstr "SSL Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "Versions"
+msgstr "Versions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :send_user_agent"
+msgid "Send user agent"
+msgstr "Send user agent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :user_agent"
+msgid "User agent"
+msgstr "User agent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :ct_max_age"
+msgid "CT max age"
+msgstr "CT max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :referrer_policy"
+msgid "Referrer policy"
+msgstr "Referrer policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :report_uri"
+msgid "Report URI"
+msgstr "Report URI"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts"
+msgid "STS"
+msgstr "STS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts_max_age"
+msgid "STS max age"
+msgstr "STS max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_activation_required"
+msgid "Account activation required"
+msgstr "Account activation required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_approval_required"
+msgid "Account approval required"
+msgstr "Account approval required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_name_length"
+msgid "Account field name length"
+msgstr "Account field name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_value_length"
+msgid "Account field value length"
+msgstr "Account field value length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :allow_relay"
+msgid "Allow relay"
+msgstr "Allow relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :allowed_post_formats"
+msgid "Allowed post formats"
+msgstr "Allowed post formats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :attachment_links"
+msgid "Attachment links"
+msgstr "Attachment links"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Autofollowed nicknames"
+msgstr "Autofollowed nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Autofollowing nicknames"
+msgstr "Autofollowing nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :avatar_upload_limit"
+msgid "Avatar upload limit"
+msgstr "Avatar upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :background_upload_limit"
+msgid "Background upload limit"
+msgstr "Background upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :banner_upload_limit"
+msgid "Banner upload limit"
+msgstr "Banner upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :birthday_min_age"
+msgid "Birthday min age"
+msgstr "Birthday min age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :birthday_required"
+msgid "Birthday required"
+msgstr "Birthday required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :cleanup_attachments"
+msgid "Cleanup attachments"
+msgstr "Cleanup attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :description"
+msgid "Description"
+msgstr "Description"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :email"
+msgid "Admin Email Address"
+msgstr "Admin Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :extended_nickname_format"
+msgid "Extended nickname format"
+msgstr "Extended nickname format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :external_user_synchronization"
+msgid "External user synchronization"
+msgstr "External user synchronization"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federating"
+msgid "Federating"
+msgstr "Federating"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Fed. incoming replies max depth"
+msgstr "Fed. incoming replies max depth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Fed. reachability timeout days"
+msgstr "Fed. reachability timeout days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :healthcheck"
+msgid "Healthcheck"
+msgstr "Healthcheck"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :instance_thumbnail"
+msgid "Instance thumbnail"
+msgstr "Instance thumbnail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :invites_enabled"
+msgid "Invites enabled"
+msgstr "Invites enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit"
+msgid "Limit"
+msgstr "Limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit to local content"
+msgstr "Limit to local content"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_account_fields"
+msgid "Max account fields"
+msgstr "Max account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_endorsed_users"
+msgid "Max endorsed users"
+msgstr "Max endorsed users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_media_attachments"
+msgid "Max media attachments"
+msgstr "Max media attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_pinned_statuses"
+msgid "Max pinned statuses"
+msgstr "Max pinned statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_remote_account_fields"
+msgid "Max remote account fields"
+msgstr "Max remote account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_report_comment_size"
+msgid "Max report comment size"
+msgstr "Max report comment size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi factor authentication"
+msgstr "Multi factor authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "Backup codes"
+msgstr "Backup codes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
+msgid "Length"
+msgstr "Length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number"
+msgstr "Number"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
+msgid "Digits"
+msgstr "Digits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
+msgid "Period"
+msgstr "Period"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :notify_email"
+msgid "Sender Email Address"
+msgstr "Sender Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits"
+msgid "Poll limits"
+msgstr "Poll limits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Max expiration"
+msgstr "Max expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Max option chars"
+msgstr "Max option chars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Max options"
+msgstr "Max options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Min expiration"
+msgstr "Min expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :privileged_staff"
+msgid "Privileged staff"
+msgstr "Privileged staff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :profile_directory"
+msgid "Profile directory"
+msgstr "Profile directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :public"
+msgid "Public"
+msgstr "Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :quarantined_instances"
+msgid "Quarantined instances"
+msgstr "Quarantined instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :registration_reason_length"
+msgid "Registration reason length"
+msgstr "Registration reason length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :registrations_open"
+msgid "Registrations open"
+msgstr "Registrations open"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_limit"
+msgid "Remote limit"
+msgstr "Remote limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_post_retention_days"
+msgid "Remote post retention days"
+msgstr "Remote post retention days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :safe_dm_mentions"
+msgid "Safe DM mentions"
+msgstr "Safe DM mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :show_reactions"
+msgid "Show reactions"
+msgstr "Show reactions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip thread containment"
+msgstr "Skip thread containment"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :static_dir"
+msgid "Static dir"
+msgstr "Static dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :upload_limit"
+msgid "Upload limit"
+msgstr "Upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_bio_length"
+msgid "User bio length"
+msgstr "User bio length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_name_length"
+msgid "User name length"
+msgstr "User name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :base"
+msgid "Base"
+msgstr "Base"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :ssl"
+msgid "SSL"
+msgstr "SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts"
+msgid "SSL options"
+msgstr "SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tls"
+msgid "TLS"
+msgstr "TLS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts"
+msgid "TLS options"
+msgstr "TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :uid"
+msgid "UID"
+msgstr "UID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:majic_pool > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :icons"
+msgid "Icons"
+msgstr "Icons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :theme_color"
+msgid "Theme color"
+msgstr "Theme color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_fonts"
+msgid "Allow fonts"
+msgstr "Allow fonts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_headings"
+msgid "Allow headings"
+msgstr "Allow headings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_inline_images"
+msgid "Allow inline images"
+msgstr "Allow inline images"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_tables"
+msgid "Allow tables"
+msgstr "Allow tables"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Image quality"
+msgstr "Image quality"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length"
+msgstr "Min content length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Thumbnail max height"
+msgstr "Thumbnail max height"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Thumbnail max width"
+msgstr "Thumbnail max width"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation"
+msgid "Invalidation"
+msgstr "Invalidation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Provider"
+msgstr "Provider"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts"
+msgid "Advanced MediaProxy Options"
+msgstr "Advanced MediaProxy Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Max body length"
+msgstr "Max body length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Max read duration"
+msgstr "Max read duration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirect on failure"
+msgstr "Redirect on failure"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :whitelist"
+msgid "Whitelist"
+msgstr "Whitelist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:modules > :runtime_dir"
+msgid "Runtime dir"
+msgstr "Runtime dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :policies"
+msgid "Policies"
+msgstr "Policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency"
+msgid "MRF transparency"
+msgstr "MRF transparency"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency_exclusions"
+msgid "MRF transparency exclusions"
+msgstr "MRF transparency exclusions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration > :days"
+msgid "Days"
+msgstr "Days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "Follower nickname"
+msgstr "Follower nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :sensitive"
+msgid "Sensitive"
+msgstr "Sensitive"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Delist threshold"
+msgstr "Delist threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Reject threshold"
+msgstr "Reject threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :replace"
+msgid "Replace"
+msgstr "Replace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention > :actors"
+msgid "Actors"
+msgstr "Actors"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :actions"
+msgid "Actions"
+msgstr "Actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :threshold"
+msgid "Threshold"
+msgstr "Threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Allow direct"
+msgstr "Allow direct"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Allow followers-only"
+msgstr "Allow followers-only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :avatar_removal"
+msgid "Avatar removal"
+msgstr "Avatar removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :banner_removal"
+msgid "Banner removal"
+msgstr "Banner removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :followers_only"
+msgid "Followers only"
+msgstr "Followers only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_nsfw"
+msgid "Media NSFW"
+msgstr "Media NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_removal"
+msgid "Media removal"
+msgstr "Media removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject_deletes"
+msgid "Reject deletes"
+msgstr "Reject deletes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :report_removal"
+msgid "Report removal"
+msgstr "Report removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "Hosts"
+msgstr "Hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid "Rejected shortcodes"
+msgstr "Rejected shortcodes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "Size limit"
+msgstr "Size limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain > :match_actor"
+msgid "Match actor"
+msgstr "Match actor"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Clean expired tokens"
+msgstr "Clean expired tokens"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Issue new refresh token"
+msgstr "Issue new refresh token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :token_expires_in"
+msgid "Token expires in"
+msgstr "Token expires in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default"
+msgid "Default"
+msgstr "Default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation"
+msgid "Federation"
+msgstr "Federation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media"
+msgid "Media"
+msgstr "Media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload"
+msgid "Upload"
+msgstr "Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Fault rate allowance"
+msgstr "Fault rate allowance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval ms"
+msgstr "Sleep interval ms"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :app_account_creation"
+msgid "App account creation"
+msgstr "App account creation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :authentication"
+msgid "Authentication"
+msgstr "Authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relation_id_action"
+msgid "Relation ID action"
+msgstr "Relation ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relations_actions"
+msgid "Relations actions"
+msgstr "Relations actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :search"
+msgid "Search"
+msgstr "Search"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :status_id_action"
+msgid "Status ID action"
+msgstr "Status ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :statuses_actions"
+msgid "Statuses actions"
+msgstr "Statuses actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :timeline"
+msgid "Timeline"
+msgstr "Timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Activities"
+msgstr "Activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Profiles"
+msgstr "Profiles"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Timelines"
+msgstr "Timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Federated"
+msgstr "Federated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :failure_backoff"
+msgid "Failure backoff"
+msgstr "Failure backoff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_hosts"
+msgid "Ignore hosts"
+msgstr "Ignore hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_tld"
+msgid "Ignore TLD"
+msgstr "Ignore TLD"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :parsers"
+msgid "Parsers"
+msgstr "Parsers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ttl_setters"
+msgid "TTL setters"
+msgstr "TTL setters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:shout > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:shout > :limit"
+msgid "Limit"
+msgstr "Limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:static_fe > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer > :overflow_workers"
+msgid "Overflow workers"
+msgstr "Overflow workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer > :workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes > :valid_schemes"
+msgid "Valid schemes"
+msgstr "Valid schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:user > :deny_follow_blocked"
+msgid "Deny follow blocked"
+msgstr "Deny follow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub"
+msgstr "Activity pub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub question"
+msgstr "Activity pub question"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message"
+msgid "Chat message"
+msgstr "Chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :message"
+msgid "Message"
+msgstr "Message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr "Sender nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message"
+msgid "Direct message"
+msgstr "Direct message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :message"
+msgid "Message"
+msgstr "Message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr "Sender nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email"
+msgid "Email"
+msgstr "Email"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :html"
+msgid "Html"
+msgstr "Html"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :sender"
+msgid "Sender"
+msgstr "Sender"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:workers > :retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgstr "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Pleroma.Web.RichMedia.Helpers"
+msgstr "Pleroma.Web.RichMedia.Helpers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :crontab"
+msgid "Crontab"
+msgstr "Crontab"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :log"
+msgid "Log"
+msgstr "Log"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues"
+msgid "Queues"
+msgstr "Queues"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration"
+msgstr "Activity expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachments cleanup"
+msgstr "Attachments cleanup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :backup"
+msgid "Backup"
+msgstr "Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Federator incoming"
+msgstr "Federator incoming"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Federator outgoing"
+msgstr "Federator outgoing"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :mailer"
+msgid "Mailer"
+msgstr "Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities"
+msgstr "Scheduled activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier"
+msgstr "Transmogrifier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :web_push"
+msgid "Web push"
+msgstr "Web push"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "Seconds valid"
+msgstr "Seconds valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :enabled"
+msgid "Mailer Enabled"
+msgstr "Mailer Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:access_key"
+msgid "AWS Access Key"
+msgstr "AWS Access Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:region"
+msgid "AWS Region"
+msgstr "AWS Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:secret"
+msgid "AWS Secret Key"
+msgstr "AWS Secret Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Dyn-:api_key"
+msgid "Dyn API Key"
+msgstr "Dyn API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Gmail-:access_token"
+msgid "GMail API Access Token"
+msgstr "GMail API Access Token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:api_key"
+msgid "Mailgun API Key"
+msgstr "Mailgun API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:domain"
+msgid "Domain"
+msgstr "Domain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:api_key"
+msgid "MailJet Public API Key"
+msgstr "MailJet Public API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:secret"
+msgid "MailJet Private API Key"
+msgstr "MailJet Private API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mandrill-:api_key"
+msgid "Mandrill API Key"
+msgstr "Mandrill API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Postmark-:api_key"
+msgid "Postmark API Key"
+msgstr "Postmark API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "AUTH Mode"
+msgstr "AUTH Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "Password"
+msgstr "Password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Relay"
+msgstr "Relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use SSL"
+msgstr "Use SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "STARTTLS Mode"
+msgstr "STARTTLS Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "Username"
+msgstr "Username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendgrid-:api_key"
+msgid "SendGrid API Key"
+msgstr "SendGrid API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_args"
+msgid "Cmd args"
+msgstr "Cmd args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_path"
+msgid "Cmd path"
+msgstr "Cmd path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:qmail"
+msgid "Qmail compat mode"
+msgstr "Qmail compat mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:api_key"
+msgid "SocketLabs API Key"
+msgstr "SocketLabs API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:server_id"
+msgid "Server ID"
+msgstr "Server ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:api_key"
+msgid "SparkPost API key"
+msgstr "SparkPost API key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "Styling"
+msgstr "Styling"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :content_background_color"
+msgid "Content background color"
+msgstr "Content background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :header_color"
+msgid "Header color"
+msgstr "Header color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :link_color"
+msgid "Link color"
+msgstr "Link color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_color"
+msgid "Text color"
+msgstr "Text color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_muted_color"
+msgid "Text muted color"
+msgstr "Text muted color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :class"
+msgid "Class"
+msgstr "Class"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :extra"
+msgid "Extra"
+msgstr "Extra"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :new_window"
+msgid "New window"
+msgstr "New window"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :rel"
+msgid "Rel"
+msgstr "Rel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip prefix"
+msgstr "Strip prefix"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Truncate"
+msgstr "Truncate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Validate tld"
+msgstr "Validate tld"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "Daily user limit"
+msgstr "Daily user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "Total user limit"
+msgstr "Total user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Filename display max length"
+msgstr "Filename display max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :filters"
+msgid "Filters"
+msgstr "Filters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :link_name"
+msgid "Link name"
+msgstr "Link name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy remote"
+msgstr "Proxy remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :uploader"
+msgid "Uploader"
+msgstr "Uploader"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "Args"
+msgstr "Args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Uploads"
+msgstr "Uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "Bucket"
+msgstr "Bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "Bucket namespace"
+msgstr "Bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Streaming enabled"
+msgstr "Streaming enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "Truncated namespace"
+msgstr "Truncated namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :email_blacklist"
+msgid "Email blacklist"
+msgstr "Email blacklist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "Restricted nicknames"
+msgstr "Restricted nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit days"
+msgstr "Limit days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Purge after days"
+msgstr "Purge after days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Strict"
+msgstr "Strict"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Options"
+msgstr "Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options > :params"
+msgid "Params"
+msgstr "Params"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Script path"
+msgstr "Script path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "URL Format"
+msgstr "URL Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "Unfurl NSFW"
+msgstr "Unfurl NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "Proxies"
+msgstr "Proxies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid "Reserved"
+msgstr "Reserved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Min lifetime"
+msgstr "Min lifetime"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
+msgid "Auth"
+msgstr "Auth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
+msgid "IP Whitelist"
+msgstr "IP Whitelist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
+msgid "Path"
+msgstr "Path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack > :meta"
+msgid "Meta"
+msgstr "Meta"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack > :webhook_url"
+msgid "Webhook URL"
+msgstr "Webhook URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :private_key"
+msgid "Private key"
+msgstr "Private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :public_key"
+msgid "Public key"
+msgstr "Public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Require HTTP signatures for AP fetches"
+msgstr "Require HTTP signatures for AP fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :short_description"
+msgid "Shorter version of instance description. It can be seen on `/api/v1/instance`"
+msgstr ""
+"Shorter version of instance description. It can be seen on `/api/v1/instance`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Authorized fetch mode"
+msgstr "Authorized fetch mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :short_description"
+msgid "Short description"
+msgstr "Short description"
diff --git a/priv/gettext/es/LC_MESSAGES/posix_errors.po b/priv/gettext/es/LC_MESSAGES/posix_errors.po
new file mode 100644
index 000000000..4118c8ee1
--- /dev/null
+++ b/priv/gettext/es/LC_MESSAGES/posix_errors.po
@@ -0,0 +1,163 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-08-06 22:24+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 3.7.1\n"
+
+## This file is a PO Template file.
+##
+## `msgid`s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run `mix gettext.extract` to bring this file up to
+## date. Leave `msgstr`s empty as changing them here as no
+## effect: edit them in PO (`.po`) files instead.
+msgid "eperm"
+msgstr ""
+
+msgid "eacces"
+msgstr ""
+
+msgid "eagain"
+msgstr ""
+
+msgid "ebadf"
+msgstr ""
+
+msgid "ebadmsg"
+msgstr ""
+
+msgid "ebusy"
+msgstr ""
+
+msgid "edeadlk"
+msgstr ""
+
+msgid "edeadlock"
+msgstr ""
+
+msgid "edquot"
+msgstr ""
+
+msgid "eexist"
+msgstr ""
+
+msgid "efault"
+msgstr ""
+
+msgid "efbig"
+msgstr ""
+
+msgid "eftype"
+msgstr ""
+
+msgid "eintr"
+msgstr ""
+
+msgid "einval"
+msgstr ""
+
+msgid "eio"
+msgstr ""
+
+msgid "eisdir"
+msgstr ""
+
+msgid "eloop"
+msgstr ""
+
+msgid "emfile"
+msgstr ""
+
+msgid "emlink"
+msgstr ""
+
+msgid "emultihop"
+msgstr ""
+
+msgid "enametoolong"
+msgstr ""
+
+msgid "enfile"
+msgstr ""
+
+msgid "enobufs"
+msgstr ""
+
+msgid "enodev"
+msgstr ""
+
+msgid "enolck"
+msgstr ""
+
+msgid "enolink"
+msgstr ""
+
+msgid "enoent"
+msgstr ""
+
+msgid "enomem"
+msgstr ""
+
+msgid "enospc"
+msgstr ""
+
+msgid "enosr"
+msgstr ""
+
+msgid "enostr"
+msgstr ""
+
+msgid "enosys"
+msgstr ""
+
+msgid "enotblk"
+msgstr ""
+
+msgid "enotdir"
+msgstr ""
+
+msgid "enotsup"
+msgstr ""
+
+msgid "enxio"
+msgstr ""
+
+msgid "eopnotsupp"
+msgstr ""
+
+msgid "eoverflow"
+msgstr ""
+
+msgid "epipe"
+msgstr ""
+
+msgid "erange"
+msgstr ""
+
+msgid "erofs"
+msgstr ""
+
+msgid "espipe"
+msgstr ""
+
+msgid "esrch"
+msgstr ""
+
+msgid "estale"
+msgstr ""
+
+msgid "etxtbsy"
+msgstr ""
+
+msgid "exdev"
+msgstr ""
diff --git a/priv/gettext/nl/LC_MESSAGES/config_descriptions.po b/priv/gettext/nl/LC_MESSAGES/config_descriptions.po
new file mode 100644
index 000000000..4def37366
--- /dev/null
+++ b/priv/gettext/nl/LC_MESSAGES/config_descriptions.po
@@ -0,0 +1,6396 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-08-06 21:54+0000\n"
+"PO-Revision-Date: 2022-08-06 21:55+0000\n"
+"Last-Translator: Anonymous \n"
+"Language-Team: Dutch \n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.13.1\n"
+
+## This file is a PO Template file.
+##
+## "msgid"s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run "mix gettext.extract" to bring this file up to
+## date. Leave "msgstr"s empty as changing them here has no
+## effect: edit them in PO (.po) files instead.
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd"
+msgid "Before enabling this you must add :esshd to mix.exs as one of the extra_applications and generate host keys in your priv dir with ssh-keygen -m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key"
+msgstr ""
+"Before enabling this you must add :esshd to mix.exs as one of the "
+"extra_applications and generate host keys in your priv dir with ssh-keygen -"
+"m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger"
+msgid "Logger-related settings"
+msgstr "Logger-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :mime"
+msgid "Mime Types settings"
+msgstr "Mime Types settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma"
+msgid "Allows setting a token that can be used to authenticate requests with admin privileges without a normal user account token. Append the `admin_token` parameter to requests to utilize it. (Please reconsider using HTTP Basic Auth or OAuth-based authentication if possible)"
+msgstr ""
+"Allows setting a token that can be used to authenticate requests with admin "
+"privileges without a normal user account token. Append the `admin_token` "
+"parameter to requests to utilize it. (Please reconsider using HTTP Basic "
+"Auth or OAuth-based authentication if possible)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma"
+msgid "Authenticator"
+msgstr "Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack"
+msgid "Quack-related settings"
+msgstr "Quack-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug"
+msgid "CORS plug config"
+msgstr "CORS plug config"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd"
+msgid "ESSHD"
+msgstr "ESSHD"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger"
+msgid "Logger"
+msgstr "Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime"
+msgid "Mime Types"
+msgstr "Mime Types"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma"
+msgid "Pleroma Admin Token"
+msgstr "Pleroma Admin Token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma"
+msgid "Pleroma Authenticator"
+msgstr "Pleroma Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack"
+msgid "Quack Logger"
+msgstr "Quack Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console"
+msgid "Console logger settings"
+msgstr "Console logger settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger"
+msgid "ExSyslogger-related settings"
+msgstr "ExSyslogger-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub"
+msgid "ActivityPub-related settings"
+msgstr "ActivityPub-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets"
+msgid "This section configures assets to be used with various frontends. Currently the only option relates to mascots on the mastodon frontend"
+msgstr ""
+"This section configures assets to be used with various frontends. Currently "
+"the only option relates to mascots on the mastodon frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth"
+msgid "Authentication / authorization settings"
+msgstr "Authentication / authorization settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool"
+msgid "Advanced settings for `Gun` connections pool"
+msgstr "Advanced settings for `Gun` connections pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications"
+msgid "Email notifications settings"
+msgstr "Email notifications settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:features"
+msgid "Customizable features"
+msgstr "Customizable features"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed"
+msgid "Configure feed rendering"
+msgstr "Configure feed rendering"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations"
+msgid "This form can be used to configure a keyword list that keeps the configuration data for any kind of frontend. By default, settings for pleroma_fe are configured. If you want to add your own configuration your settings all fields must be complete."
+msgstr ""
+"This form can be used to configure a keyword list that keeps the "
+"configuration data for any kind of frontend. By default, settings for "
+"pleroma_fe are configured. If you want to add your own configuration your "
+"settings all fields must be complete."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends"
+msgid "Installed frontends management"
+msgstr "Installed frontends management"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher"
+msgid "Gopher settings"
+msgstr "Gopher settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools"
+msgid "Advanced settings for `Hackney` connections pools"
+msgstr "Advanced settings for `Hackney` connections pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http"
+msgid "HTTP settings"
+msgstr "HTTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security"
+msgid "HTTP security settings"
+msgstr "HTTP security settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance"
+msgid "Instance-related settings"
+msgstr "Instance-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instances_favicons"
+msgid "Control favicons for instances"
+msgstr "Control favicons for instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap"
+msgid "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password will be verified by trying to authenticate (bind) to a LDAP server. If a user exists in the LDAP directory but there is no account with the same name yet on the Pleroma instance then a new Pleroma account will be created with the same name as the LDAP user name."
+msgstr ""
+"Use LDAP for user authentication. When a user logs in to the Pleroma "
+"instance, the name and password will be verified by trying to authenticate "
+"(bind) to a LDAP server. If a user exists in the LDAP directory but there is "
+"no account with the same name yet on the Pleroma instance then a new Pleroma "
+"account will be created with the same name as the LDAP user name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:majic_pool"
+msgid "Majic/libmagic configuration"
+msgstr "Majic/libmagic configuration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest"
+msgid "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE."
+msgstr ""
+"This section describe PWA manifest instance-specific values. Currently this "
+"option relate only for MastoFE."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Media preview proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Media proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:modules"
+msgid "Custom Runtime Modules"
+msgstr "Custom Runtime Modules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf"
+msgid "General MRF settings"
+msgstr "General MRF settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_activity_expiration"
+msgid "Adds automatic expiration to all local activities"
+msgstr "Adds automatic expiration to all local activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_follow_bot"
+msgid "Automatically follows newly discovered accounts."
+msgstr "Automatically follows newly discovered accounts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag"
+msgid "Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags (without the leading #)\n\nNote: This MRF Policy is always enabled, if you want to disable it you have to set empty lists.\n"
+msgstr ""
+"Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags ("
+"without the leading #)\n"
+"\n"
+"Note: This MRF Policy is always enabled, if you want to disable it you have "
+"to set empty lists.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread"
+msgid "Block messages with excessive user mentions"
+msgstr "Block messages with excessive user mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword"
+msgid "Reject or Word-Replace messages matching a keyword or [Regex](https://hexdocs.pm/elixir/Regex.html)."
+msgstr ""
+"Reject or Word-Replace messages matching a keyword or [Regex](https://hexdocs"
+".pm/elixir/Regex.html)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention"
+msgid "Block messages which mention a specific user"
+msgstr "Block messages which mention a specific user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_normalize_markup"
+msgid "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+msgstr "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age"
+msgid "Rejects or delists posts based on their timestamp deviance from your server's clock."
+msgstr ""
+"Rejects or delists posts based on their timestamp deviance from your "
+"server's clock."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic"
+msgid "RejectNonPublic drops posts with non-public visibility settings."
+msgstr "RejectNonPublic drops posts with non-public visibility settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple"
+msgid "Simple ingress policies"
+msgstr "Simple ingress policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji"
+msgid "Steals emojis from selected instances when it sees them."
+msgstr "Steals emojis from selected instances when it sees them."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_subchain"
+msgid "This policy processes messages through an alternate pipeline when a given message matches certain criteria. All criteria are configured as a map of regular expressions to lists of policy modules."
+msgstr ""
+"This policy processes messages through an alternate pipeline when a given "
+"message matches certain criteria. All criteria are configured as a map of "
+"regular expressions to lists of policy modules."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary"
+msgid "Filter messages which belong to certain activity vocabularies"
+msgstr "Filter messages which belong to certain activity vocabularies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2"
+msgid "Configure OAuth 2 provider capabilities"
+msgstr "Configure OAuth 2 provider capabilities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools"
+msgid "Advanced settings for `Gun` workers pools"
+msgstr "Advanced settings for `Gun` workers pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table"
+msgid "`populate_hashtags_table` background migration settings"
+msgstr "`populate_hashtags_table` background migration settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit"
+msgid "Rate limit settings. This is an advanced feature enabled only for :authentication by default."
+msgstr ""
+"Rate limit settings. This is an advanced feature enabled only for :"
+"authentication by default."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated"
+msgid "Disallow viewing timelines, user profiles and statuses for unauthenticated users."
+msgstr ""
+"Disallow viewing timelines, user profiles and statuses for unauthenticated "
+"users."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media"
+msgid "If enabled the instance will parse metadata from attached links to generate link previews"
+msgstr ""
+"If enabled the instance will parse metadata from attached links to generate "
+"link previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:shout"
+msgid "Pleroma shout settings"
+msgstr "Pleroma shout settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:static_fe"
+msgid "Render profiles and posts using server-generated HTML that is viewable without using JavaScript"
+msgstr ""
+"Render profiles and posts using server-generated HTML that is viewable "
+"without using JavaScript"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer"
+msgid "Settings for notifications streamer"
+msgstr "Settings for notifications streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes"
+msgid "URI schemes related settings"
+msgstr "URI schemes related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl"
+msgid "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration."
+msgstr ""
+"The expiration time for the web responses cache. Values should be in "
+"milliseconds or `nil` to disable expiration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome"
+msgid "Welcome messages settings"
+msgstr "Welcome messages settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:workers"
+msgid "Includes custom worker options not interpretable directly by `Oban`"
+msgstr "Includes custom worker options not interpretable directly by `Oban`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter"
+msgid "Limits configuration for background tasks."
+msgstr "Limits configuration for background tasks."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban"
+msgid "[Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration."
+msgstr ""
+"[Oban](https://github.com/sorentwo/oban) asynchronous job processor "
+"configuration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha"
+msgid "Captcha-related settings"
+msgstr "Captcha-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is here: https://github.com/koto-bank/kocaptcha. The default endpoint (https://captcha.kotobank.ch) is hosted by the developer."
+msgstr ""
+"Kocaptcha is a very simple captcha service with a single API endpoint, the "
+"source code is here: https://github.com/koto-bank/kocaptcha. The default "
+"endpoint (https://captcha.kotobank.ch) is hosted by the developer."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer"
+msgid "Mailer-related settings"
+msgstr "Mailer-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "New users admin email digest"
+msgstr "New users admin email digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Email template settings"
+msgstr "Email template settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter"
+msgid "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs."
+msgstr ""
+"Configuration for Pleroma's link formatter which parses mentions, hashtags, "
+"and URLs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity"
+msgid "Scheduled activities settings"
+msgstr "Scheduled activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload"
+msgid "Upload general settings"
+msgstr "Upload general settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Filter replaces the filename of the upload"
+msgstr "Filter replaces the filename of the upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Uploads mogrify filter settings"
+msgstr "Uploads mogrify filter settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local"
+msgid "Local uploader-related settings"
+msgstr "Local uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3"
+msgid "S3 uploader-related settings"
+msgstr "S3 uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup"
+msgid "Account Backup"
+msgstr "Account Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "HTTP invalidate settings"
+msgstr "HTTP invalidate settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Invalidation script settings"
+msgstr "Invalidation script settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata"
+msgid "Metadata-related settings"
+msgstr "Metadata-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.\n**If your instance is not behind at least one reverse proxy, you should not enable this plug.**\n"
+msgstr ""
+"`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git."
+"pleroma.social/pleroma/remote_ip) but with runtime configuration.\n"
+"**If your instance is not behind at least one reverse proxy, you should not "
+"enable this plug.**\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload"
+msgid "Preload-related settings"
+msgstr "Preload-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Expired activities settings"
+msgstr "Expired activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Prometheus app metrics endpoint configuration"
+msgstr "Prometheus app metrics endpoint configuration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details"
+msgid "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it."
+msgstr ""
+"Web Push Notifications configuration. You can use the mix task mix "
+"web_push.gen.keypair to generate it."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3"
+msgid "S3"
+msgstr "S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console"
+msgid "Console Logger"
+msgstr "Console Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger"
+msgid "ExSyslogger"
+msgstr "ExSyslogger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub"
+msgid "ActivityPub"
+msgstr "ActivityPub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets"
+msgid "Assets"
+msgstr "Assets"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth"
+msgid "Auth"
+msgstr "Auth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool"
+msgid "Connections pool"
+msgstr "Connections pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications"
+msgid "Email notifications"
+msgstr "Email notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji"
+msgid "Emoji"
+msgstr "Emoji"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:features"
+msgid "Features"
+msgstr "Features"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed"
+msgid "Feed"
+msgstr "Feed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations"
+msgid "Frontend configurations"
+msgstr "Frontend configurations"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends"
+msgid "Frontends"
+msgstr "Frontends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher"
+msgid "Gopher"
+msgstr "Gopher"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools"
+msgid "Hackney pools"
+msgstr "Hackney pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http"
+msgid "HTTP"
+msgstr "HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security"
+msgid "HTTP security"
+msgstr "HTTP security"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance"
+msgid "Instance"
+msgstr "Instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons"
+msgid "Instances favicons"
+msgstr "Instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap"
+msgid "LDAP"
+msgstr "LDAP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:majic_pool"
+msgid "Majic pool"
+msgstr "Majic pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest"
+msgid "Manifest"
+msgstr "Manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup"
+msgid "Markup Settings"
+msgstr "Markup Settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Media preview proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Media proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:modules"
+msgid "Modules"
+msgstr "Modules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf"
+msgid "MRF"
+msgstr "MRF"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration"
+msgid "MRF Activity Expiration Policy"
+msgstr "MRF Activity Expiration Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot"
+msgid "MRF FollowBot Policy"
+msgstr "MRF FollowBot Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag"
+msgid "MRF Hashtag"
+msgstr "MRF Hashtag"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread"
+msgid "MRF Hellthread"
+msgstr "MRF Hellthread"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword"
+msgid "MRF Keyword"
+msgstr "MRF Keyword"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention"
+msgid "MRF Mention"
+msgstr "MRF Mention"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup"
+msgid "MRF Normalize Markup"
+msgstr "MRF Normalize Markup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age"
+msgid "MRF Object Age"
+msgstr "MRF Object Age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic"
+msgid "MRF Reject Non Public"
+msgstr "MRF Reject Non Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple"
+msgid "MRF Simple"
+msgstr "MRF Simple"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji"
+msgid "MRF Emojis"
+msgstr "MRF Emojis"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain"
+msgid "MRF Subchain"
+msgstr "MRF Subchain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary"
+msgid "MRF Vocabulary"
+msgstr "MRF Vocabulary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2"
+msgid "OAuth2"
+msgstr "OAuth2"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools"
+msgid "Pools"
+msgstr "Pools"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table"
+msgid "Populate hashtags table"
+msgstr "Populate hashtags table"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit"
+msgid "Rate limit"
+msgstr "Rate limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated"
+msgid "Restrict Unauthenticated"
+msgstr "Restrict Unauthenticated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media"
+msgid "Rich media"
+msgstr "Rich media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:shout"
+msgid "Shout"
+msgstr "Shout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:static_fe"
+msgid "Static FE"
+msgstr "Static FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer"
+msgid "Streamer"
+msgstr "Streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes"
+msgid "URI Schemes"
+msgstr "URI Schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:user"
+msgid "User"
+msgstr "User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl"
+msgid "Web cache TTL"
+msgstr "Web cache TTL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome"
+msgid "Welcome"
+msgstr "Welcome"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter"
+msgid "ConcurrentLimiter"
+msgstr "ConcurrentLimiter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban"
+msgid "Oban"
+msgstr "Oban"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha"
+msgid "Pleroma.Captcha"
+msgstr "Pleroma.Captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Pleroma.Captcha.Kocaptcha"
+msgstr "Pleroma.Captcha.Kocaptcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer"
+msgid "Pleroma.Emails.Mailer"
+msgstr "Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "Pleroma.Emails.NewUsersDigestEmail"
+msgstr "Pleroma.Emails.NewUsersDigestEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Pleroma.Emails.UserEmail"
+msgstr "Pleroma.Emails.UserEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter"
+msgid "Linkify"
+msgstr "Linkify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity"
+msgid "Pleroma.ScheduledActivity"
+msgstr "Pleroma.ScheduledActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload"
+msgid "Pleroma.Upload"
+msgstr "Pleroma.Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Pleroma.Upload.Filter.AnonymizeFilename"
+msgstr "Pleroma.Upload.Filter.AnonymizeFilename"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Pleroma.Upload.Filter.Mogrify"
+msgstr "Pleroma.Upload.Filter.Mogrify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local"
+msgid "Pleroma.Uploaders.Local"
+msgstr "Pleroma.Uploaders.Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3"
+msgid "Pleroma.Uploaders.S3"
+msgstr "Pleroma.Uploaders.S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User"
+msgid "Pleroma.User"
+msgstr "Pleroma.User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup"
+msgid "Pleroma.User.Backup"
+msgstr "Pleroma.User.Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate"
+msgid "Pleroma.Web.ApiSpec.CastAndValidate"
+msgstr "Pleroma.Web.ApiSpec.CastAndValidate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Http"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Http"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Script"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Script"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata"
+msgid "Pleroma.Web.Metadata"
+msgstr "Pleroma.Web.Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "Pleroma.Web.Plugs.RemoteIp"
+msgstr "Pleroma.Web.Plugs.RemoteIp"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload"
+msgid "Pleroma.Web.Preload"
+msgstr "Pleroma.Web.Preload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Pleroma.Workers.PurgeExpiredActivity"
+msgstr "Pleroma.Workers.PurgeExpiredActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter"
+msgid "Pleroma.Web.Endpoint.MetricsExporter"
+msgstr "Pleroma.Web.Endpoint.MetricsExporter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details"
+msgid "Vapid Details"
+msgstr "Vapid Details"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :enabled"
+msgid "Enables SSH"
+msgstr "Enables SSH"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :handler"
+msgid "Handler module"
+msgstr "Handler module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :password_authenticator"
+msgid "Authenticator module"
+msgstr "Authenticator module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :port"
+msgid "Port to connect"
+msgstr "Port to connect"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :esshd > :priv_dir"
+msgid "Dir with SSH keys"
+msgstr "Dir with SSH keys"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :access_key_id"
+msgid "S3 access key ID"
+msgstr "S3 access key ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :host"
+msgid "S3 host"
+msgstr "S3 host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :region"
+msgid "S3 region (for AWS)"
+msgstr "S3 region (for AWS)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger > :backends"
+msgid "Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :ex_syslogger } - to syslog, Quack.Logger - to Slack."
+msgstr ""
+"Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :"
+"ex_syslogger } - to syslog, Quack.Logger - to Slack."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :ident"
+msgid "A string that's prepended to every message, and is typically set to the app name"
+msgstr ""
+"A string that's prepended to every message, and is typically set to the app "
+"name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :blockers_visible"
+msgid "Whether a user can see someone who has blocked them"
+msgstr "Whether a user can see someone who has blocked them"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Following handshake timeout"
+msgstr "Following handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)"
+msgstr ""
+"The number of Note replies' URIs to be included with outgoing federation (`5`"
+" to match Mastodon hardcoded value, `0` to disable the output)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Whether to federate blocks to other instances"
+msgstr "Whether to federate blocks to other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches with HTTP signatures"
+msgstr "Sign object fetches with HTTP signatures"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Whether blocks result in people getting unfollowed"
+msgstr "Whether blocks result in people getting unfollowed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_mascot"
+msgid "This will be used as the default mascot on MastoFE. Default: `:pleroma_fox_tan`"
+msgstr ""
+"This will be used as the default mascot on MastoFE. Default: "
+"`:pleroma_fox_tan`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_user_avatar"
+msgid "URL of the default user avatar"
+msgstr "URL of the default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :mascots"
+msgid "Keyword of mascots, each element must contain both an URL and a mime_type key"
+msgstr ""
+"Keyword of mascots, each element must contain both an URL and a mime_type key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :auth_template"
+msgid "Authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+msgstr ""
+"Authentication form template. By default it's `show.html` which corresponds "
+"to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "OAuth admin scope requirement toggle. If enabled, admin actions explicitly demand admin OAuth scope(s) presence in OAuth token (client app must support admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` user flag grants access to admin-specific actions."
+msgstr ""
+"OAuth admin scope requirement toggle. If enabled, admin actions explicitly "
+"demand admin OAuth scope(s) presence in OAuth token (client app must support "
+"admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` "
+"user flag grants access to admin-specific actions."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "The list of enabled OAuth consumer strategies. By default it's set by OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-delimited string should be of format \"strategy\" or \"strategy:dependency\" (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_)."
+msgstr ""
+"The list of enabled OAuth consumer strategies. By default it's set by "
+"OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-"
+"delimited string should be of format \"strategy\" or \"strategy:dependency\" "
+"(e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is "
+"named differently than ueberauth_)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`."
+msgstr ""
+"OAuth consumer mode authentication form template. By default it's `consumer."
+"html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer."
+"html.eex`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :connect_timeout"
+msgid "Timeout while `gun` will wait until connection is up. Default: 5000ms."
+msgstr "Timeout while `gun` will wait until connection is up. Default: 5000ms."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_retries"
+msgid "Number of attempts to acquire the connection from the pool if it is overloaded. Default: 5"
+msgstr ""
+"Number of attempts to acquire the connection from the pool if it is "
+"overloaded. Default: 5"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_wait"
+msgid "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms."
+msgstr ""
+"Timeout to acquire a connection from pool. The total max time is this value "
+"multiplied by the number of retries. Default: 250ms."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :max_connections"
+msgid "Maximum number of connections in the pool. Default: 250 connections."
+msgstr "Maximum number of connections in the pool. Default: 250 connections."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid "Multiplier for the number of idle connection to be reclaimed if the pool is full. For example if the pool maxes out at 250 connections and this setting is set to 0.3, the pool will reclaim at most 75 idle connections if it's overloaded. Default: 0.1"
+msgstr ""
+"Multiplier for the number of idle connection to be reclaimed if the pool is "
+"full. For example if the pool maxes out at 250 connections and this setting "
+"is set to 0.3, the pool will reclaim at most 75 idle connections if it's "
+"overloaded. Default: 0.1"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest"
+msgid "emails of \"what you've missed\" for users who have been inactive for a while"
+msgstr ""
+"emails of \"what you've missed\" for users who have been inactive for a while"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :active"
+msgid "Globally enable or disable digest emails"
+msgstr "Globally enable or disable digest emails"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Minimum user inactivity threshold"
+msgstr "Minimum user inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :interval"
+msgid "Minimum interval between digest emails to one user"
+msgstr "Minimum interval between digest emails to one user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :schedule"
+msgid "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\"."
+msgstr ""
+"When to send digest email, in crontab format. \"0 0 0\" is the default, "
+"meaning \"once a week at midnight on Sunday morning\"."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :default_manifest"
+msgid "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download. Currently only one manifest can be added (no arrays)."
+msgstr ""
+"Location of the JSON-manifest. This manifest contains information about the "
+"emoji-packs you can download. Currently only one manifest can be added (no "
+"arrays)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :groups"
+msgid "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the group name and the value is the location or array of locations. * can be used as a wildcard."
+msgstr ""
+"Emojis are ordered in groups (tags). This is an array of key-value pairs "
+"where the key is the group name and the value is the location or array of "
+"locations. * can be used as a wildcard."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :pack_extensions"
+msgid "A list of file extensions for emojis, when no emoji.txt for a pack is present"
+msgstr ""
+"A list of file extensions for emojis, when no emoji.txt for a pack is present"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :shortcode_globs"
+msgid "Location of custom emoji files. * can be used as a wildcard."
+msgstr "Location of custom emoji files. * can be used as a wildcard."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes)."
+msgstr ""
+"Setting to force toggle / force disable improved hashtags timeline. "
+"`:enabled` forces hashtags to be fetched from `hashtags` table for hashtags "
+"timeline. `:disabled` forces object-embedded hashtags to be used (slower). "
+"Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` ["
+"unless overridden] when HashtagsTableMigrator completes)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title"
+msgid "Configure title rendering"
+msgstr "Configure title rendering"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :max_length"
+msgid "Maximum number of characters before truncating title"
+msgstr "Maximum number of characters before truncating title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :omission"
+msgid "Replacement which will be used after truncating string"
+msgstr "Replacement which will be used after truncating string"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Settings for Pleroma FE"
+msgstr "Settings for Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "When disabled, auto-hide the subject field if it's empty"
+msgstr "When disabled, auto-hide the subject field if it's empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "URL of the background, unless viewing a user profile with a background that is set"
+msgstr ""
+"URL of the background, unless viewing a user profile with a background that "
+"is set"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
+msgid "When a message has a subject (aka Content Warning), collapse it by default"
+msgstr ""
+"When a message has a subject (aka Content Warning), collapse it by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Enables green text on lines prefixed with the > character"
+msgstr "Enables green text on lines prefixed with the > character"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hides filtered statuses from timelines"
+msgstr "Hides filtered statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hides muted statuses from timelines"
+msgstr "Hides muted statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide notices statistics (repeats, favorites, ...)"
+msgstr "Hide notices statistics (repeats, favorites, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
+msgid "Hides instance name from PleromaFE banner"
+msgstr "Hides instance name from PleromaFE banner"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide profile statistics (posts, posts per day, followers, followings, ...)"
+msgstr ""
+"Hide profile statistics (posts, posts per day, followers, followings, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "URL of the logo, defaults to Pleroma's logo"
+msgstr "URL of the logo, defaults to Pleroma's logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Allows you to adjust vertical margins between logo boundary and navbar borders. The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout."
+msgstr ""
+"Allows you to adjust vertical margins between logo boundary and navbar "
+"borders. The idea is that to have logo's image without any extra margins and "
+"instead adjust them to your need in layout."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. If you want a colorful logo you must disable logoMask."
+msgstr ""
+"By default it assumes logo used will be monochrome with alpha channel to be "
+"compatible with both light and dark themes. If you want a colorful logo you "
+"must disable logoMask."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
+msgid "Limit scope selection to Direct, User default, and Scope of post replying to. Also prevents replying to a DM with a public post from PleromaFE."
+msgstr ""
+"Limit scope selection to Direct, User default, and Scope of post replying "
+"to. Also prevents replying to a DM with a public post from PleromaFE."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
+msgid "URL of the image to use for hiding NSFW media attachments in the timeline"
+msgstr ""
+"URL of the image to use for hiding NSFW media attachments in the timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Default post formatting option"
+msgstr "Default post formatting option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
+msgid "Relative URL which indicates where to redirect when a user is logged in"
+msgstr "Relative URL which indicates where to redirect when a user is logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
+msgid "Relative URL which indicates where to redirect when a user isn't logged in"
+msgstr ""
+"Relative URL which indicates where to redirect when a user isn't logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Copy the scope (private/unlisted/public) in replies to posts by default"
+msgstr "Copy the scope (private/unlisted/public) in replies to posts by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Enables panel displaying functionality of the instance on the About page"
+msgstr ""
+"Enables panel displaying functionality of the instance on the About page"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Whether to show the instance's custom panel"
+msgstr "Whether to show the instance's custom panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Change alignment of sidebar and panels to the right"
+msgstr "Change alignment of sidebar and panels to the right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
+msgid "Allows changing the default behaviour of subject lines in replies.\n `email`: copy and preprend re:, as in email,\n `masto`: copy verbatim, as in Mastodon,\n `noop`: don't copy the subject."
+msgstr ""
+"Allows changing the default behaviour of subject lines in replies.\n"
+" `email`: copy and preprend re:, as in email,\n"
+" `masto`: copy verbatim, as in Mastodon,\n"
+" `noop`: don't copy the subject."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Which theme to use. Available themes are defined in styles.json"
+msgstr "Which theme to use. Available themes are defined in styles.json"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin"
+msgid "Admin frontend"
+msgstr "Admin frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available"
+msgid "A map containing available frontends and parameters for their installation."
+msgstr ""
+"A map containing available frontends and parameters for their installation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > build_dir"
+msgid "The directory inside the zip file "
+msgstr "The directory inside the zip file "
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > build_url"
+msgid "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`."
+msgstr ""
+"Either an url to a zip file containing the frontend or a template to build "
+"it by inserting the `ref`. The string `${ref}` will be replaced by the "
+"configured `ref`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > custom-http-headers"
+msgid "The custom HTTP headers for the frontend"
+msgstr "The custom HTTP headers for the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > git"
+msgid "URL of the git repository of the frontend"
+msgstr "URL of the git repository of the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > name"
+msgid "Name of the frontend."
+msgstr "Name of the frontend."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > ref"
+msgid "Reference of the frontend to be used."
+msgstr "Reference of the frontend to be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary"
+msgid "Primary frontend, the one that is served for all pages by default"
+msgstr "Primary frontend, the one that is served for all pages by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :dstport"
+msgid "Port advertised in URLs (optional, defaults to port)"
+msgstr "Port advertised in URLs (optional, defaults to port)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :enabled"
+msgid "Enables the gopher interface"
+msgstr "Enables the gopher interface"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :ip"
+msgid "IP address to bind to"
+msgstr "IP address to bind to"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:gopher > :port"
+msgid "Port to bind to"
+msgstr "Port to bind to"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :federation"
+msgid "Settings for federation pool."
+msgstr "Settings for federation pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :federation > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media"
+msgid "Settings for media pool."
+msgstr "Settings for media pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload"
+msgid "Settings for upload pool."
+msgstr "Settings for upload pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Number workers in the pool."
+msgstr "Number workers in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout while `hackney` will wait for response."
+msgstr "Timeout while `hackney` will wait for response."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter"
+msgid "Adapter specific options"
+msgstr "Adapter specific options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL options for HTTP adapter"
+msgstr "SSL options for HTTP adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "List of TLS version to use"
+msgstr "List of TLS version to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :user_agent"
+msgid "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`."
+msgstr ""
+"What user agent to use. Must be a string or an atom `:default`. Default "
+"value is `:default`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :ct_max_age"
+msgid "The maximum age for the Expect-CT header if sent"
+msgstr "The maximum age for the Expect-CT header if sent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :enabled"
+msgid "Whether the managed content security policy is enabled"
+msgstr "Whether the managed content security policy is enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :referrer_policy"
+msgid "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+msgstr "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :report_uri"
+msgid "Adds the specified URL to report-uri and report-to group in CSP header"
+msgstr "Adds the specified URL to report-uri and report-to group in CSP header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts"
+msgid "Whether to additionally send a Strict-Transport-Security header"
+msgstr "Whether to additionally send a Strict-Transport-Security header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts_max_age"
+msgid "The maximum age for the Strict-Transport-Security header if sent"
+msgstr "The maximum age for the Strict-Transport-Security header if sent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_activation_required"
+msgid "Require users to confirm their emails before signing in"
+msgstr "Require users to confirm their emails before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_approval_required"
+msgid "Require users to be manually approved by an admin before signing in"
+msgstr "Require users to be manually approved by an admin before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_field_name_length"
+msgid "An account field name maximum length. Default: 512."
+msgstr "An account field name maximum length. Default: 512."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_field_value_length"
+msgid "An account field value maximum length. Default: 2048."
+msgstr "An account field value maximum length. Default: 2048."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :allow_relay"
+msgid "Permits remote instances to subscribe to all public posts of your instance. (Important!) This may increase the visibility of your instance."
+msgstr ""
+"Permits remote instances to subscribe to all public posts of your instance. "
+"(Important!) This may increase the visibility of your instance."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :allowed_post_formats"
+msgid "MIME-type list of formats allowed to be posted (transformed into HTML)"
+msgstr "MIME-type list of formats allowed to be posted (transformed into HTML)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :attachment_links"
+msgid "Enable to automatically add attachment link text to statuses"
+msgstr "Enable to automatically add attachment link text to statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Set to nicknames of (local) users that every new user should automatically follow"
+msgstr ""
+"Set to nicknames of (local) users that every new user should automatically "
+"follow"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Set to nicknames of (local) users that automatically follows every newly registered user"
+msgstr ""
+"Set to nicknames of (local) users that automatically follows every newly "
+"registered user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :avatar_upload_limit"
+msgid "File size limit of user's profile avatars"
+msgstr "File size limit of user's profile avatars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :background_upload_limit"
+msgid "File size limit of user's profile backgrounds"
+msgstr "File size limit of user's profile backgrounds"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :banner_upload_limit"
+msgid "File size limit of user's profile banners"
+msgstr "File size limit of user's profile banners"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :birthday_min_age"
+msgid "Minimum required age for users to create account. Only used if birthday is required."
+msgstr ""
+"Minimum required age for users to create account. Only used if birthday is "
+"required."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :birthday_required"
+msgid "Require users to enter their birthday."
+msgstr "Require users to enter their birthday."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :cleanup_attachments"
+msgid "Enable to remove associated attachments when status is removed.\nThis will not affect duplicates and attachments without status.\nEnabling this will increase load to database when deleting statuses on larger instances.\n"
+msgstr ""
+"Enable to remove associated attachments when status is removed.\n"
+"This will not affect duplicates and attachments without status.\n"
+"Enabling this will increase load to database when deleting statuses on "
+"larger instances.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :description"
+msgid "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+msgstr ""
+"The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :email"
+msgid "Email used to reach an Administrator/Moderator of the instance"
+msgstr "Email used to reach an Administrator/Moderator of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :extended_nickname_format"
+msgid "Enable to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames."
+msgstr ""
+"Enable to use extended local nicknames format (allows underscores/dashes). "
+"This will break federation with older software for theses nicknames."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :external_user_synchronization"
+msgid "Enabling following/followers counters synchronization for external users"
+msgstr ""
+"Enabling following/followers counters synchronization for external users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federating"
+msgid "Enable federation with other instances"
+msgstr "Enable federation with other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Max. depth of reply-to and reply activities fetching on incoming federation, to prevent out-of-memory situations while fetching very long threads. If set to `nil`, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes."
+msgstr ""
+"Max. depth of reply-to and reply activities fetching on incoming federation, "
+"to prevent out-of-memory situations while fetching very long threads. If set "
+"to `nil`, threads of any depth will be fetched. Lower this value if you "
+"experience out-of-memory crashes."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it"
+msgstr ""
+"Timeout (in days) of each external federation target being unreachable prior "
+"to pausing federating to it"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :healthcheck"
+msgid "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
+msgstr "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :instance_thumbnail"
+msgid "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance."
+msgstr ""
+"The instance thumbnail can be any image that represents your instance and is "
+"used by some apps or services when they display information about your "
+"instance."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :invites_enabled"
+msgid "Enable user invitations for admins (depends on `registrations_open` being disabled)"
+msgstr ""
+"Enable user invitations for admins (depends on `registrations_open` being "
+"disabled)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :limit"
+msgid "Posts character limit (CW/Subject included in the counter)"
+msgstr "Posts character limit (CW/Subject included in the counter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit unauthenticated users to search for local statutes and users only. Default: `:unauthenticated`."
+msgstr ""
+"Limit unauthenticated users to search for local statutes and users only. "
+"Default: `:unauthenticated`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_account_fields"
+msgid "The maximum number of custom fields in the user profile. Default: 10."
+msgstr "The maximum number of custom fields in the user profile. Default: 10."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_endorsed_users"
+msgid "The maximum number of recommended accounts. 0 will disable the feature."
+msgstr "The maximum number of recommended accounts. 0 will disable the feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_media_attachments"
+msgid "Maximum number of post media attachments"
+msgstr "Maximum number of post media attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_pinned_statuses"
+msgid "The maximum number of pinned statuses. 0 will disable the feature."
+msgstr "The maximum number of pinned statuses. 0 will disable the feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_remote_account_fields"
+msgid "The maximum number of custom fields in the remote user profile. Default: 20."
+msgstr ""
+"The maximum number of custom fields in the remote user profile. Default: 20."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_report_comment_size"
+msgid "The maximum size of the report comment. Default: 1000."
+msgstr "The maximum size of the report comment. Default: 1000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi-factor authentication settings"
+msgstr "Multi-factor authentication settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "MFA backup codes settings"
+msgstr "MFA backup codes settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
+msgid "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters."
+msgstr ""
+"Determines the length of backup one-time pass-codes, in characters. Defaults "
+"to 16 characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number of backup codes to generate."
+msgstr "Number of backup codes to generate."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
+msgid "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters."
+msgstr ""
+"Determines the length of a one-time pass-code, in characters. Defaults to 6 "
+"characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
+msgid "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds."
+msgstr ""
+"A period for which the TOTP code will be valid, in seconds. Defaults to 30 "
+"seconds."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :name"
+msgid "Name of the instance"
+msgstr "Name of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :notify_email"
+msgid "Envelope FROM address for mail sent via Pleroma"
+msgstr "Envelope FROM address for mail sent via Pleroma"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits"
+msgid "A map with poll limits for local polls"
+msgstr "A map with poll limits for local polls"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Maximum expiration time (in seconds)"
+msgstr "Maximum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Maximum number of characters per option"
+msgstr "Maximum number of characters per option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Maximum number of options"
+msgstr "Maximum number of options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Minimum expiration time (in seconds)"
+msgstr "Minimum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :privileged_staff"
+msgid "Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
+msgstr ""
+"Let moderators access sensitive data (e.g. updating user credentials, get "
+"password reset token, delete users, index and read private statuses and "
+"chats)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :profile_directory"
+msgid "Enable profile directory."
+msgstr "Enable profile directory."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :public"
+msgid "Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note: when setting to `false`, please also check `:restrict_unauthenticated` setting."
+msgstr ""
+"Makes the client API in authenticated mode-only except for user-profiles. "
+"Useful for disabling the Local Timeline and The Whole Known Network. Note: "
+"when setting to `false`, please also check `:restrict_unauthenticated` "
+"setting."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :quarantined_instances"
+msgid "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so"
+msgstr ""
+"List of ActivityPub instances where private (DMs, followers-only) activities "
+"will not be sent and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :registration_reason_length"
+msgid "Maximum registration reason length. Default: 500."
+msgstr "Maximum registration reason length. Default: 500."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :registrations_open"
+msgid "Enable registrations for anyone. Invitations require this setting to be disabled."
+msgstr ""
+"Enable registrations for anyone. Invitations require this setting to be "
+"disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :remote_limit"
+msgid "Hard character limit beyond which remote posts will be dropped"
+msgstr "Hard character limit beyond which remote posts will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :remote_post_retention_days"
+msgid "The default amount of days to retain remote posts when pruning the database"
+msgstr ""
+"The default amount of days to retain remote posts when pruning the database"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :safe_dm_mentions"
+msgid "If enabled, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. \"@admin please keep an eye on @bad_actor\"). Default: disabled"
+msgstr ""
+"If enabled, only mentions at the beginning of a post will be used to address "
+"people in direct messages. This is to prevent accidental mentioning of "
+"people when talking about them (e.g. \"@admin please keep an eye on @"
+"bad_actor\"). Default: disabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :show_reactions"
+msgid "Let favourites and emoji reactions be viewed through the API."
+msgstr "Let favourites and emoji reactions be viewed through the API."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip filtering out broken threads. Default: enabled."
+msgstr "Skip filtering out broken threads. Default: enabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :static_dir"
+msgid "Instance static directory"
+msgstr "Instance static directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :upload_limit"
+msgid "File size limit of uploads (except for avatar, background, banner)"
+msgstr "File size limit of uploads (except for avatar, background, banner)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_bio_length"
+msgid "A user bio maximum length. Default: 5000."
+msgstr "A user bio maximum length. Default: 5000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_name_length"
+msgid "A user name maximum length. Default: 100."
+msgstr "A user name maximum length. Default: 100."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instances_favicons > :enabled"
+msgid "Allow/disallow displaying and getting instances favicons"
+msgstr "Allow/disallow displaying and getting instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :base"
+msgid "LDAP base, e.g. \"dc=example,dc=com\""
+msgstr "LDAP base, e.g. \"dc=example,dc=com\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :enabled"
+msgid "Enables LDAP authentication"
+msgstr "Enables LDAP authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :host"
+msgid "LDAP server hostname"
+msgstr "LDAP server hostname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :port"
+msgid "LDAP port, e.g. 389 or 636"
+msgstr "LDAP port, e.g. 389 or 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :ssl"
+msgid "Enable to use SSL, usually implies the port 636"
+msgstr "Enable to use SSL, usually implies the port 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts"
+msgid "Additional SSL options"
+msgstr "Additional SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tls"
+msgid "Enable to use STARTTLS, usually implies the port 389"
+msgstr "Enable to use STARTTLS, usually implies the port 389"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts"
+msgid "Additional TLS options"
+msgstr "Additional TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :uid"
+msgid "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\""
+msgstr ""
+"LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter "
+"will be \"cn=username,base\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:majic_pool > :size"
+msgid "Number of majic workers to start."
+msgstr "Number of majic workers to start."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :background_color"
+msgid "Describe the background color of the app"
+msgstr "Describe the background color of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :icons"
+msgid "Describe the icons of the app"
+msgstr "Describe the icons of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :theme_color"
+msgid "Describe the theme color of the app"
+msgstr "Describe the theme color of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:markup > :scrub_policy"
+msgid "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name."
+msgstr ""
+"Module names are shortened (removed leading `Pleroma.HTML.` part), but on "
+"adding custom module you need to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy."
+msgstr ""
+"Enables proxying of remote media preview to the instance's proxy. Requires "
+"enabled media proxy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+msgstr ""
+"Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length (in bytes) to perform preview. Media smaller in size will be served without thumbnailing."
+msgstr ""
+"Min content length (in bytes) to perform preview. Media smaller in size will "
+"be served without thumbnailing."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Max height of preview thumbnail for images (video preview always has original dimensions)."
+msgstr ""
+"Max height of preview thumbnail for images (video preview always has "
+"original dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Max width of preview thumbnail for images (video preview always has original dimensions)."
+msgstr ""
+"Max width of preview thumbnail for images (video preview always has original "
+"dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :base_url"
+msgid "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts."
+msgstr ""
+"The base URL to access a user-uploaded file. Useful when you want to proxy "
+"the media files via another host/CDN fronts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :enabled"
+msgid "Enables proxying of remote media via the instance's proxy"
+msgstr "Enables proxying of remote media via the instance's proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enables media cache object invalidation."
+msgstr "Enables media cache object invalidation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Module which will be used to purge objects from the cache."
+msgstr "Module which will be used to purge objects from the cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts"
+msgid "Internal Pleroma.ReverseProxy settings"
+msgstr "Internal Pleroma.ReverseProxy settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+msgstr ""
+"Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Timeout (in milliseconds) of GET request to the remote URI."
+msgstr "Timeout (in milliseconds) of GET request to the remote URI."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirects the client to the origin server upon encountering HTTP errors.\n\nNote that files larger than Max Body Length will trigger an error. (e.g., Peertube videos)\n\n\n**WARNING:** This setting will allow larger files to be accessed, but exposes the\n\nIP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+msgstr ""
+"Redirects the client to the origin server upon encountering HTTP errors.\n"
+"\n"
+"Note that files larger than Max Body Length will trigger an error. (e.g., "
+"Peertube videos)\n"
+"\n"
+"\n"
+"**WARNING:** This setting will allow larger files to be accessed, but "
+"exposes the\n"
+"\n"
+"IP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :whitelist"
+msgid "List of hosts with scheme to bypass the MediaProxy"
+msgstr "List of hosts with scheme to bypass the MediaProxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:modules > :runtime_dir"
+msgid "A path to custom Elixir modules (such as MRF policies)."
+msgstr "A path to custom Elixir modules (such as MRF policies)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :policies"
+msgid "A list of MRF policies enabled. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name."
+msgstr ""
+"A list of MRF policies enabled. Module names are shortened (removed leading "
+"`Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency"
+msgid "Make the content of your Message Rewrite Facility settings public (via nodeinfo)"
+msgstr ""
+"Make the content of your Message Rewrite Facility settings public (via "
+"nodeinfo)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency_exclusions"
+msgid "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. You can also provide a reason for excluding these instance names. The instances and reasons won't be publicly disclosed."
+msgstr ""
+"Exclude specific instance names from MRF transparency. The use of the "
+"exclusions feature will be disclosed in nodeinfo as a boolean value. You can "
+"also provide a reason for excluding these instance names. The instances and "
+"reasons won't be publicly disclosed."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_activity_expiration > :days"
+msgid "Default global expiration time for all local activities (in days)"
+msgstr "Default global expiration time for all local activities (in days)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "The name of the bot account to use for following newly discovered users."
+msgstr ""
+"The name of the bot account to use for following newly discovered users."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "A list of hashtags which result in message being removed from federated timelines (a.k.a unlisted)."
+msgstr ""
+"A list of hashtags which result in message being removed from federated "
+"timelines (a.k.a unlisted)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :reject"
+msgid "A list of hashtags which result in message being rejected."
+msgstr "A list of hashtags which result in message being rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :sensitive"
+msgid "A list of hashtags which result in message being set as sensitive (a.k.a NSFW/R-18)"
+msgstr ""
+"A list of hashtags which result in message being set as sensitive (a.k.a "
+"NSFW/R-18)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Number of mentioned users after which the message gets removed from timelines anddisables notifications. Set to 0 to disable."
+msgstr ""
+"Number of mentioned users after which the message gets removed from "
+"timelines anddisables notifications. Set to 0 to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Number of mentioned users after which the messaged gets rejected. Set to 0 to disable."
+msgstr ""
+"Number of mentioned users after which the messaged gets rejected. Set to 0 "
+"to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid " A list of patterns which result in message being removed from federated timelines (a.k.a unlisted).\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns which result in message being removed from federated "
+"timelines (a.k.a unlisted).\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :reject"
+msgid " A list of patterns which result in message being rejected.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns which result in message being rejected.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_keyword > :replace"
+msgid " **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n\n **Replacement**: a string. Leaving the field empty is permitted.\n"
+msgstr ""
+" **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in "
+"the format of `~r/PATTERN/`.\n"
+"\n"
+" **Replacement**: a string. Leaving the field empty is permitted.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention > :actors"
+msgid "A list of actors for which any post mentioning them will be dropped"
+msgstr "A list of actors for which any post mentioning them will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age > :actions"
+msgid "A list of actions to apply to the post. `:delist` removes the post from public timelines; `:strip_followers` removes followers from the ActivityPub recipient list ensuring they won't be delivered to home timelines; `:reject` rejects the message entirely"
+msgstr ""
+"A list of actions to apply to the post. `:delist` removes the post from "
+"public timelines; `:strip_followers` removes followers from the ActivityPub "
+"recipient list ensuring they won't be delivered to home timelines; `:reject` "
+"rejects the message entirely"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age > :threshold"
+msgid "Required age (in seconds) of a post before actions are taken."
+msgstr "Required age (in seconds) of a post before actions are taken."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Whether to allow direct messages"
+msgstr "Whether to allow direct messages"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Whether to allow followers-only posts"
+msgstr "Whether to allow followers-only posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :accept"
+msgid "List of instances to only accept activities from (except deletes) and the reason for doing so"
+msgstr ""
+"List of instances to only accept activities from (except deletes) and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :avatar_removal"
+msgid "List of instances to strip avatars from and the reason for doing so"
+msgstr "List of instances to strip avatars from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :banner_removal"
+msgid "List of instances to strip banners from and the reason for doing so"
+msgstr "List of instances to strip banners from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "List of instances to remove from the Federated (aka The Whole Known Network) Timeline and the reason for doing so"
+msgstr ""
+"List of instances to remove from the Federated (aka The Whole Known Network) "
+"Timeline and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :followers_only"
+msgid "Force posts from the given instances to be visible by followers only and the reason for doing so"
+msgstr ""
+"Force posts from the given instances to be visible by followers only and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :media_nsfw"
+msgid "List of instances to tag all media as NSFW (sensitive) from and the reason for doing so"
+msgstr ""
+"List of instances to tag all media as NSFW (sensitive) from and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :media_removal"
+msgid "List of instances to strip media attachments from and the reason for doing so"
+msgstr ""
+"List of instances to strip media attachments from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :reject"
+msgid "List of instances to reject activities from (except deletes) and the reason for doing so"
+msgstr ""
+"List of instances to reject activities from (except deletes) and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :reject_deletes"
+msgid "List of instances to reject deletions from and the reason for doing so"
+msgstr "List of instances to reject deletions from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :report_removal"
+msgid "List of instances to reject reports from and the reason for doing so"
+msgstr "List of instances to reject reports from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "List of hosts to steal emojis from"
+msgstr "List of hosts to steal emojis from"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid " A list of patterns or matches to reject shortcodes with.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
+msgstr ""
+" A list of patterns or matches to reject shortcodes with.\n"
+"\n"
+" Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex."
+"html) in the format of `~r/PATTERN/`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "File size limit (in bytes), checked before an emoji is saved to the disk"
+msgstr ""
+"File size limit (in bytes), checked before an emoji is saved to the disk"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_subchain > :match_actor"
+msgid "Matches a series of regular expressions against the actor field"
+msgstr "Matches a series of regular expressions against the actor field"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :accept"
+msgid "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted."
+msgstr ""
+"A list of ActivityStreams terms to accept. If empty, all supported messages "
+"are accepted."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :reject"
+msgid "A list of ActivityStreams terms to reject. If empty, no messages are rejected."
+msgstr ""
+"A list of ActivityStreams terms to reject. If empty, no messages are "
+"rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Enable a background job to clean expired OAuth tokens. Default: disabled."
+msgstr ""
+"Enable a background job to clean expired OAuth tokens. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Keeps old refresh token or generate new refresh token when to obtain an access token"
+msgstr ""
+"Keeps old refresh token or generate new refresh token when to obtain an "
+"access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :token_expires_in"
+msgid "The lifetime in seconds of the access token"
+msgstr "The lifetime in seconds of the access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default"
+msgid "Settings for default pool."
+msgstr "Settings for default pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :default > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation"
+msgid "Settings for federation pool."
+msgstr "Settings for federation pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :federation > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media"
+msgid "Settings for media pool."
+msgstr "Settings for media pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :media > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload"
+msgid "Settings for upload pool."
+msgstr "Settings for upload pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :max_waiting"
+msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
+msgstr ""
+"Maximum number of requests waiting for other requests to finish. After this "
+"number is reached, the pool will start returning errrors when a new request "
+"is made"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Timeout for the pool while gun will wait for response"
+msgstr "Timeout for the pool while gun will wait for response"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:pools > :upload > :size"
+msgid "Maximum number of concurrent requests in the pool."
+msgstr "Maximum number of concurrent requests in the pool."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if hashtags transfer failed for all records."
+msgstr ""
+"Max accepted rate of objects that failed in the migration. Any value from "
+"0.0 which tolerates no errors to 1.0 which will enable the feature even if "
+"hashtags transfer failed for all records."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)."
+msgstr ""
+"Sleep interval between each chunk of processed records in order to decrease "
+"the load on the system (defaults to 0 and should be keep default on most "
+"instances)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :app_account_creation"
+msgid "For registering user accounts from the same IP address"
+msgstr "For registering user accounts from the same IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :authentication"
+msgid "For authentication create / password check / user existence check requests"
+msgstr ""
+"For authentication create / password check / user existence check requests"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relation_id_action"
+msgid "For actions on relation with a specific user (follow, unfollow)"
+msgstr "For actions on relation with a specific user (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relations_actions"
+msgid "For actions on relationships with all users (follow, unfollow)"
+msgstr "For actions on relationships with all users (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :search"
+msgid "For the search requests (account & status search etc.)"
+msgstr "For the search requests (account & status search etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :status_id_action"
+msgid "For fav / unfav or reblog / unreblog actions on the same status by the same user"
+msgstr ""
+"For fav / unfav or reblog / unreblog actions on the same status by the same "
+"user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :statuses_actions"
+msgid "For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+msgstr ""
+"For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :timeline"
+msgid "For requests to timelines (each timeline has it's own limiter)"
+msgstr "For requests to timelines (each timeline has it's own limiter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Settings for statuses."
+msgstr "Settings for statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Disallow view local statuses."
+msgstr "Disallow view local statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Disallow view remote statuses."
+msgstr "Disallow view remote statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Settings for user profiles."
+msgstr "Settings for user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Disallow view local user profiles."
+msgstr "Disallow view local user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Disallow view remote user profiles."
+msgstr "Disallow view remote user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Settings for public and federated timelines."
+msgstr "Settings for public and federated timelines."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Disallow view federated timeline."
+msgstr "Disallow view federated timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Disallow view public timeline."
+msgstr "Disallow view public timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :enabled"
+msgid "Enables RichMedia parsing of URLs"
+msgstr "Enables RichMedia parsing of URLs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :failure_backoff"
+msgid "Amount of milliseconds after request failure, during which the request will not be retried."
+msgstr ""
+"Amount of milliseconds after request failure, during which the request will "
+"not be retried."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_hosts"
+msgid "List of hosts which will be ignored by the metadata parser"
+msgstr "List of hosts which will be ignored by the metadata parser"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_tld"
+msgid "List TLDs (top-level domains) which will ignore for parse metadata"
+msgstr "List TLDs (top-level domains) which will ignore for parse metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :parsers"
+msgid "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name."
+msgstr ""
+"List of Rich Media parsers. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ttl_setters"
+msgid "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name."
+msgstr ""
+"List of rich media TTL setters. Module names are shortened (removed leading "
+"`Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:shout > :enabled"
+msgid "Enables the backend Shoutbox chat feature."
+msgstr "Enables the backend Shoutbox chat feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:shout > :limit"
+msgid "Shout message character limit."
+msgstr "Shout message character limit."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:static_fe > :enabled"
+msgid "Enables the rendering of static HTML. Default: disabled."
+msgstr "Enables the rendering of static HTML. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer > :overflow_workers"
+msgid "Maximum number of workers created if pool is empty"
+msgstr "Maximum number of workers created if pool is empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer > :workers"
+msgid "Number of workers to send notifications"
+msgstr "Number of workers to send notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes > :valid_schemes"
+msgid "List of the scheme part that is considered valid to be an URL"
+msgstr "List of the scheme part that is considered valid to be an URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub routes (except question activities). Default: `nil` (no expiration)."
+msgstr ""
+"Activity pub routes (except question activities). Default: `nil` (no "
+"expiration)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+msgstr ""
+"Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enables sending a chat message to newly registered users"
+msgstr "Enables sending a chat message to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :message"
+msgid "A message that will be sent to newly registered users as a chat message"
+msgstr "A message that will be sent to newly registered users as a chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome chat message"
+msgstr "The nickname of the local user that sends a welcome chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enables sending a direct message to newly registered users"
+msgstr "Enables sending a direct message to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :message"
+msgid "A message that will be sent to newly registered users"
+msgstr "A message that will be sent to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome message"
+msgstr "The nickname of the local user that sends a welcome message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :enabled"
+msgid "Enables sending an email to newly registered users"
+msgstr "Enables sending an email to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :html"
+msgid "HTML content of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+"HTML content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :sender"
+msgid "Email address and/or nickname that will be used to send the welcome email."
+msgstr ""
+"Email address and/or nickname that will be used to send the welcome email."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :subject"
+msgid "Subject of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+"Subject of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :text"
+msgid "Text content of the welcome email. EEX template with user and instance_name variables can be used."
+msgstr ""
+"Text content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:workers > :retries"
+msgid "Max retry attempts for failed jobs, per `Oban` queue"
+msgstr "Max retry attempts for failed jobs, per `Oban` queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Concurrent limits configuration for MediaProxyWarmingPolicy."
+msgstr "Concurrent limits configuration for MediaProxyWarmingPolicy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Concurrent limits configuration for getting RichMedia for activities."
+msgstr "Concurrent limits configuration for getting RichMedia for activities."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :crontab"
+msgid "Settings for cron background jobs"
+msgstr "Settings for cron background jobs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :log"
+msgid "Logs verbose mode"
+msgstr "Logs verbose mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues"
+msgid "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+msgstr ""
+"Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration queue"
+msgstr "Activity expiration queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachment deletion queue"
+msgstr "Attachment deletion queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :background"
+msgid "Background queue"
+msgstr "Background queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :backup"
+msgid "Backup queue"
+msgstr "Backup queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Incoming federation queue"
+msgstr "Incoming federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Outgoing federation queue"
+msgstr "Outgoing federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :mailer"
+msgid "Email sender queue, see Pleroma.Emails.Mailer"
+msgstr "Email sender queue, see Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities queue, see Pleroma.ScheduledActivities"
+msgstr "Scheduled activities queue, see Pleroma.ScheduledActivities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier queue"
+msgstr "Transmogrifier queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :web_push"
+msgid "Web push notifications queue"
+msgstr "Web push notifications queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Whether the captcha should be shown on registration"
+msgstr "Whether the captcha should be shown on registration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :method"
+msgid "The method/service to use for captcha"
+msgstr "The method/service to use for captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "The time in seconds for which the captcha is valid"
+msgstr "The time in seconds for which the captcha is valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "The kocaptcha endpoint to use"
+msgstr "The kocaptcha endpoint to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/swoosh/Swoosh.html#module-adapters)"
+msgstr ""
+"One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/"
+"swoosh/Swoosh.html#module-adapters)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "SMTP AUTH enforcement mode"
+msgstr "SMTP AUTH enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "SMTP AUTH password"
+msgstr "SMTP AUTH password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "SMTP port"
+msgstr "SMTP port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Hostname or IP address"
+msgstr "Hostname or IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "SMTP temporary (4xx) error retries"
+msgstr "SMTP temporary (4xx) error retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use Implicit SSL/TLS. e.g. port 465"
+msgstr "Use Implicit SSL/TLS. e.g. port 465"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "Explicit TLS (STARTTLS) enforcement mode"
+msgstr "Explicit TLS (STARTTLS) enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "SMTP AUTH username"
+msgstr "SMTP AUTH username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enables new users admin digest email when `true`"
+msgstr "Enables new users admin digest email when `true`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+msgstr ""
+"A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "A map with color settings for email templates."
+msgstr "A map with color settings for email templates."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :class"
+msgid "Specify the class to be added to the generated link. Disable to clear."
+msgstr "Specify the class to be added to the generated link. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :extra"
+msgid "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+msgstr "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :new_window"
+msgid "Link URLs will open in a new window/tab."
+msgstr "Link URLs will open in a new window/tab."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :rel"
+msgid "Override the rel attribute. Disable to clear."
+msgstr "Override the rel attribute. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip the scheme prefix."
+msgstr "Strip the scheme prefix."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`"
+msgstr ""
+"Set to a number to truncate URLs longer than the number. Truncated URLs will "
+"end in `...`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)"
+msgstr ""
+"Set to false to disable TLD validation for URLs/emails. Can be set to :"
+"no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` "
+"will be validated, but `http://example.loki` won't)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "The number of scheduled activities a user is allowed to create in a single day. Default: 25."
+msgstr ""
+"The number of scheduled activities a user is allowed to create in a single "
+"day. Default: 25."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Whether scheduled activities are sent to the job queue to be executed"
+msgstr "Whether scheduled activities are sent to the job queue to be executed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "The number of scheduled activities a user is allowed to create in total. Default: 300."
+msgstr ""
+"The number of scheduled activities a user is allowed to create in total. "
+"Default: 300."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL for the uploads. Required if you use a CDN or host attachments under a different domain."
+msgstr ""
+"Base URL for the uploads. Required if you use a CDN or host attachments "
+"under a different domain."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Set max length of a filename to display. 0 = no limit. Default: 30"
+msgstr "Set max length of a filename to display. 0 = no limit. Default: 30"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :filters"
+msgid "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name."
+msgstr ""
+"List of filter modules for uploads. Module names are shortened (removed "
+"leading `Pleroma.Upload.Filter.` part), but on adding custom module you need "
+"to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :link_name"
+msgid "If enabled, a name parameter will be added to the URL of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`."
+msgstr ""
+"If enabled, a name parameter will be added to the URL of the upload. For "
+"example `https://instance.tld/media/imagehash.png?name=realname.png`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy requests to the remote uploader.\n\nUseful if media upload endpoint is not internet accessible.\n"
+msgstr ""
+"Proxy requests to the remote uploader.\n"
+"\n"
+"Useful if media upload endpoint is not internet accessible.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :uploader"
+msgid "Module which will be used for uploads"
+msgstr "Module which will be used for uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original filename extension by using {extension}, for example custom-file-name.{extension}."
+msgstr ""
+"Text to replace filenames in links. If no setting, {random}.extension will "
+"be used. You can get the original filename extension by using {extension}, "
+"for example custom-file-name.{extension}."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "List of actions for the mogrify command. It's possible to add self-written settings as string. For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings."
+msgstr ""
+"List of actions for the mogrify command. It's possible to add self-written "
+"settings as string. For example `auto-orient, strip, {\"resize\", \"3840x1080"
+">\"}` value will be parsed into valid list of the settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Path where user's uploads will be saved"
+msgstr "Path where user's uploads will be saved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "S3 bucket"
+msgstr "S3 bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "S3 bucket namespace"
+msgstr "S3 bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Enable streaming uploads, when enabled the file will be sent to the server in chunks as it's being read. This may be unsupported by some providers, try disabling this if you have upload problems."
+msgstr ""
+"Enable streaming uploads, when enabled the file will be sent to the server "
+"in chunks as it's being read. This may be unsupported by some providers, try "
+"disabling this if you have upload problems."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc. For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in Upload base_url."
+msgstr ""
+"If you use S3 compatible service such as Digital Ocean Spaces or CDN, set "
+"folder name or \"\" etc. For example, when using CDN to S3 virtual host "
+"format, set \"\". At this time, write CNAME to CDN in Upload base_url."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :email_blacklist"
+msgid "List of email domains users may not register with."
+msgstr "List of email domains users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "List of nicknames users may not register with."
+msgstr "List of nicknames users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit user to export not more often than once per N days"
+msgstr "Limit user to export not more often than once per N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Remove backup achives after N days"
+msgstr "Remove backup achives after N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Enables strict input validation (useful in development, not recommended in production)"
+msgstr ""
+"Enables strict input validation (useful in development, not recommended in "
+"production)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "HTTP headers of request"
+msgstr "HTTP headers of request"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "HTTP method of request. Default: :purge"
+msgstr "HTTP method of request. Default: :purge"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Request options"
+msgstr "Request options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Path to executable script which will purge cached items."
+msgstr "Path to executable script which will purge cached items."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "Optional URL format preprocessing. Only required for Apache's htcacheclean."
+msgstr ""
+"Optional URL format preprocessing. Only required for Apache's htcacheclean."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "List of metadata providers to enable"
+msgstr "List of metadata providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "When enabled NSFW attachments will be shown in previews"
+msgstr "When enabled NSFW attachments will be shown in previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enable/disable the plug. Default: disabled."
+msgstr "Enable/disable the plug. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid " A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `[\"x-forwarded-for\"]`.\n"
+msgstr ""
+" A list of strings naming the HTTP headers to use when deriving the true "
+"client IP. Default: `[\"x-forwarded-for\"]`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128."
+msgstr ""
+"A list of upstream proxy IP subnets in CIDR notation from which we will "
+"parse the content of `headers`. Defaults to `[]`. IPv4 entries without a "
+"bitmask will be assumed to be /32 and IPv6 /128."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid " A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", \"fc00::/7\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
+msgstr ""
+" A list of reserved IP subnets in CIDR notation which should be ignored if "
+"found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", \"fc00::/7\""
+", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "List of preload providers to enable"
+msgstr "List of preload providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enables expired activities addition & deletion"
+msgstr "Enables expired activities addition & deletion"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Minimum lifetime for ephemeral activity (in seconds)"
+msgstr "Minimum lifetime for ephemeral activity (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
+msgid "Enables HTTP Basic Auth for app metrics endpoint."
+msgstr "Enables HTTP Basic Auth for app metrics endpoint."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
+msgid "[Pleroma extension] Enables app metrics endpoint."
+msgstr "[Pleroma extension] Enables app metrics endpoint."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
+msgid "App metrics endpoint output format."
+msgstr "App metrics endpoint output format."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
+msgid "Restrict access of app metrics endpoint to the specified IP addresses."
+msgstr "Restrict access of app metrics endpoint to the specified IP addresses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
+msgid "App metrics endpoint URI path."
+msgstr "App metrics endpoint URI path."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack > :meta"
+msgid "Configure which metadata you want to report on"
+msgstr "Configure which metadata you want to report on"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :quack > :webhook_url"
+msgid "Configure the Slack incoming webhook"
+msgstr "Configure the Slack incoming webhook"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :private_key"
+msgid "VAPID private key"
+msgstr "VAPID private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :public_key"
+msgid "VAPID public key"
+msgstr "VAPID public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :subject"
+msgid "A mailto link for the administrative contact. It's best if this email is not a personal email address, but rather a group email to the instance moderation team."
+msgstr ""
+"A mailto link for the administrative contact. It's best if this email is not "
+"a personal email address, but rather a group email to the instance "
+"moderation team."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :credentials"
+msgid "Credentials"
+msgstr "Credentials"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :expose"
+msgid "Expose"
+msgstr "Expose"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :max_age"
+msgid "Max age"
+msgstr "Max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :methods"
+msgid "Methods"
+msgstr "Methods"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :handler"
+msgid "Handler"
+msgstr "Handler"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :password_authenticator"
+msgid "Password authenticator"
+msgstr "Password authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :esshd > :priv_dir"
+msgid "Priv dir"
+msgstr "Priv dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :access_key_id"
+msgid "Access key"
+msgstr "Access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :region"
+msgid "Region"
+msgstr "Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger > :backends"
+msgid "Backends"
+msgstr "Backends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :ident"
+msgid "Ident"
+msgstr "Ident"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types"
+msgid "Types"
+msgstr "Types"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/activity+json"
+msgid "\"application/activity+json\""
+msgstr "\"application/activity+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/jrd+json"
+msgid "\"application/jrd+json\""
+msgstr "\"application/jrd+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/ld+json"
+msgid "\"application/ld+json\""
+msgstr "\"application/ld+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/xml"
+msgid "\"application/xml\""
+msgstr "\"application/xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/xrd+xml"
+msgid "\"application/xrd+xml\""
+msgstr "\"application/xrd+xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma > Pleroma.Web.Auth.Authenticator"
+msgid "Pleroma.Web.Auth.Authenticator"
+msgstr "Pleroma.Web.Auth.Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :blockers_visible"
+msgid "Blockers visible"
+msgstr "Blockers visible"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Follow handshake timeout"
+msgstr "Follow handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "Note replies output limit"
+msgstr "Note replies output limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Outgoing blocks"
+msgstr "Outgoing blocks"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches"
+msgstr "Sign object fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Unfollow blocked"
+msgstr "Unfollow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_mascot"
+msgid "Default mascot"
+msgstr "Default mascot"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_user_avatar"
+msgid "Default user avatar"
+msgstr "Default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :mascots"
+msgid "Mascots"
+msgstr "Mascots"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :auth_template"
+msgid "Auth template"
+msgstr "Auth template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "Enforce OAuth admin scope usage"
+msgstr "Enforce OAuth admin scope usage"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "OAuth consumer strategies"
+msgstr "OAuth consumer strategies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer template"
+msgstr "OAuth consumer template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :connect_timeout"
+msgid "Connect timeout"
+msgstr "Connect timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_retries"
+msgid "Connection acquisition retries"
+msgstr "Connection acquisition retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_wait"
+msgid "Connection acquisition wait"
+msgstr "Connection acquisition wait"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:connections_pool > :reclaim_multiplier"
+msgid "Reclaim multiplier"
+msgstr "Reclaim multiplier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest"
+msgid "Digest"
+msgstr "Digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :active"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Inactivity threshold"
+msgstr "Inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :interval"
+msgid "Interval"
+msgstr "Interval"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :schedule"
+msgid "Schedule"
+msgstr "Schedule"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :default_manifest"
+msgid "Default manifest"
+msgstr "Default manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :groups"
+msgid "Groups"
+msgstr "Groups"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :pack_extensions"
+msgid "Pack extensions"
+msgstr "Pack extensions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shared_pack_cache_seconds_per_file"
+msgid "Shared pack cache s/file"
+msgstr "Shared pack cache s/file"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shortcode_globs"
+msgid "Shortcode globs"
+msgstr "Shortcode globs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Improved hashtag timeline"
+msgstr "Improved hashtag timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title"
+msgid "Post title"
+msgstr "Post title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :max_length"
+msgid "Max length"
+msgstr "Max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :omission"
+msgid "Omission"
+msgstr "Omission"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Pleroma FE"
+msgstr "Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "Always show subject input"
+msgstr "Always show subject input"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
+msgid "Collapse message with subject"
+msgstr "Collapse message with subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Greentext"
+msgstr "Greentext"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hide Filtered Statuses"
+msgstr "Hide Filtered Statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hide Muted Posts"
+msgstr "Hide Muted Posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide post stats"
+msgstr "Hide post stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
+msgid "Hide Sitename"
+msgstr "Hide Sitename"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide user stats"
+msgstr "Hide user stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Logo margin"
+msgstr "Logo margin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "Logo mask"
+msgstr "Logo mask"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
+msgid "Minimal scopes mode"
+msgstr "Minimal scopes mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
+msgid "NSFW Censor Image"
+msgstr "NSFW Censor Image"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Post Content Type"
+msgstr "Post Content Type"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
+msgid "Redirect root login"
+msgstr "Redirect root login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
+msgid "Redirect root no login"
+msgstr "Redirect root no login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Scope copy"
+msgstr "Scope copy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Show instance features panel"
+msgstr "Show instance features panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Show instance specific panel"
+msgstr "Show instance specific panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Sidebar on Right"
+msgstr "Sidebar on Right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
+msgid "Subject line behavior"
+msgstr "Subject line behavior"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Theme"
+msgstr "Theme"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin"
+msgid "Admin"
+msgstr "Admin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available"
+msgid "Available"
+msgstr "Available"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_dir"
+msgid "Build directory"
+msgstr "Build directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_url"
+msgid "Build URL"
+msgstr "Build URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > custom-http-headers"
+msgid "Custom HTTP headers"
+msgstr "Custom HTTP headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > git"
+msgid "Git Repository URL"
+msgstr "Git Repository URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary"
+msgid "Primary"
+msgstr "Primary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :dstport"
+msgid "Dstport"
+msgstr "Dstport"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :ip"
+msgid "IP"
+msgstr "IP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:gopher > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation"
+msgid "Federation"
+msgstr "Federation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :federation > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media"
+msgid "Media"
+msgstr "Media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :media > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload"
+msgid "Upload"
+msgstr "Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :max_connections"
+msgid "Max connections"
+msgstr "Max connections"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:hackney_pools > :upload > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL Options"
+msgstr "SSL Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "Versions"
+msgstr "Versions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :send_user_agent"
+msgid "Send user agent"
+msgstr "Send user agent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :user_agent"
+msgid "User agent"
+msgstr "User agent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :ct_max_age"
+msgid "CT max age"
+msgstr "CT max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :referrer_policy"
+msgid "Referrer policy"
+msgstr "Referrer policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :report_uri"
+msgid "Report URI"
+msgstr "Report URI"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts"
+msgid "STS"
+msgstr "STS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts_max_age"
+msgid "STS max age"
+msgstr "STS max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_activation_required"
+msgid "Account activation required"
+msgstr "Account activation required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_approval_required"
+msgid "Account approval required"
+msgstr "Account approval required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_name_length"
+msgid "Account field name length"
+msgstr "Account field name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_value_length"
+msgid "Account field value length"
+msgstr "Account field value length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :allow_relay"
+msgid "Allow relay"
+msgstr "Allow relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :allowed_post_formats"
+msgid "Allowed post formats"
+msgstr "Allowed post formats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :attachment_links"
+msgid "Attachment links"
+msgstr "Attachment links"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Autofollowed nicknames"
+msgstr "Autofollowed nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Autofollowing nicknames"
+msgstr "Autofollowing nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :avatar_upload_limit"
+msgid "Avatar upload limit"
+msgstr "Avatar upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :background_upload_limit"
+msgid "Background upload limit"
+msgstr "Background upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :banner_upload_limit"
+msgid "Banner upload limit"
+msgstr "Banner upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :birthday_min_age"
+msgid "Birthday min age"
+msgstr "Birthday min age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :birthday_required"
+msgid "Birthday required"
+msgstr "Birthday required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :cleanup_attachments"
+msgid "Cleanup attachments"
+msgstr "Cleanup attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :description"
+msgid "Description"
+msgstr "Description"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :email"
+msgid "Admin Email Address"
+msgstr "Admin Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :extended_nickname_format"
+msgid "Extended nickname format"
+msgstr "Extended nickname format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :external_user_synchronization"
+msgid "External user synchronization"
+msgstr "External user synchronization"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federating"
+msgid "Federating"
+msgstr "Federating"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Fed. incoming replies max depth"
+msgstr "Fed. incoming replies max depth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Fed. reachability timeout days"
+msgstr "Fed. reachability timeout days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :healthcheck"
+msgid "Healthcheck"
+msgstr "Healthcheck"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :instance_thumbnail"
+msgid "Instance thumbnail"
+msgstr "Instance thumbnail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :invites_enabled"
+msgid "Invites enabled"
+msgstr "Invites enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit"
+msgid "Limit"
+msgstr "Limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit to local content"
+msgstr "Limit to local content"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_account_fields"
+msgid "Max account fields"
+msgstr "Max account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_endorsed_users"
+msgid "Max endorsed users"
+msgstr "Max endorsed users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_media_attachments"
+msgid "Max media attachments"
+msgstr "Max media attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_pinned_statuses"
+msgid "Max pinned statuses"
+msgstr "Max pinned statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_remote_account_fields"
+msgid "Max remote account fields"
+msgstr "Max remote account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_report_comment_size"
+msgid "Max report comment size"
+msgstr "Max report comment size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi factor authentication"
+msgstr "Multi factor authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "Backup codes"
+msgstr "Backup codes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
+msgid "Length"
+msgstr "Length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number"
+msgstr "Number"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
+msgid "Digits"
+msgstr "Digits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
+msgid "Period"
+msgstr "Period"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :notify_email"
+msgid "Sender Email Address"
+msgstr "Sender Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits"
+msgid "Poll limits"
+msgstr "Poll limits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Max expiration"
+msgstr "Max expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Max option chars"
+msgstr "Max option chars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Max options"
+msgstr "Max options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Min expiration"
+msgstr "Min expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :privileged_staff"
+msgid "Privileged staff"
+msgstr "Privileged staff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :profile_directory"
+msgid "Profile directory"
+msgstr "Profile directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :public"
+msgid "Public"
+msgstr "Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :quarantined_instances"
+msgid "Quarantined instances"
+msgstr "Quarantined instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :registration_reason_length"
+msgid "Registration reason length"
+msgstr "Registration reason length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :registrations_open"
+msgid "Registrations open"
+msgstr "Registrations open"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_limit"
+msgid "Remote limit"
+msgstr "Remote limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_post_retention_days"
+msgid "Remote post retention days"
+msgstr "Remote post retention days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :safe_dm_mentions"
+msgid "Safe DM mentions"
+msgstr "Safe DM mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :show_reactions"
+msgid "Show reactions"
+msgstr "Show reactions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip thread containment"
+msgstr "Skip thread containment"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :static_dir"
+msgid "Static dir"
+msgstr "Static dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :upload_limit"
+msgid "Upload limit"
+msgstr "Upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_bio_length"
+msgid "User bio length"
+msgstr "User bio length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_name_length"
+msgid "User name length"
+msgstr "User name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :base"
+msgid "Base"
+msgstr "Base"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :ssl"
+msgid "SSL"
+msgstr "SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts"
+msgid "SSL options"
+msgstr "SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tls"
+msgid "TLS"
+msgstr "TLS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts"
+msgid "TLS options"
+msgstr "TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :uid"
+msgid "UID"
+msgstr "UID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:majic_pool > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :icons"
+msgid "Icons"
+msgstr "Icons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :theme_color"
+msgid "Theme color"
+msgstr "Theme color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_fonts"
+msgid "Allow fonts"
+msgstr "Allow fonts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_headings"
+msgid "Allow headings"
+msgstr "Allow headings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_inline_images"
+msgid "Allow inline images"
+msgstr "Allow inline images"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_tables"
+msgid "Allow tables"
+msgstr "Allow tables"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Image quality"
+msgstr "Image quality"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length"
+msgstr "Min content length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Thumbnail max height"
+msgstr "Thumbnail max height"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Thumbnail max width"
+msgstr "Thumbnail max width"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation"
+msgid "Invalidation"
+msgstr "Invalidation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Provider"
+msgstr "Provider"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts"
+msgid "Advanced MediaProxy Options"
+msgstr "Advanced MediaProxy Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Max body length"
+msgstr "Max body length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Max read duration"
+msgstr "Max read duration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirect on failure"
+msgstr "Redirect on failure"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :whitelist"
+msgid "Whitelist"
+msgstr "Whitelist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:modules > :runtime_dir"
+msgid "Runtime dir"
+msgstr "Runtime dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :policies"
+msgid "Policies"
+msgstr "Policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency"
+msgid "MRF transparency"
+msgstr "MRF transparency"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency_exclusions"
+msgid "MRF transparency exclusions"
+msgstr "MRF transparency exclusions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration > :days"
+msgid "Days"
+msgstr "Days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "Follower nickname"
+msgstr "Follower nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :sensitive"
+msgid "Sensitive"
+msgstr "Sensitive"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Delist threshold"
+msgstr "Delist threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Reject threshold"
+msgstr "Reject threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :replace"
+msgid "Replace"
+msgstr "Replace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention > :actors"
+msgid "Actors"
+msgstr "Actors"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :actions"
+msgid "Actions"
+msgstr "Actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :threshold"
+msgid "Threshold"
+msgstr "Threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Allow direct"
+msgstr "Allow direct"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Allow followers-only"
+msgstr "Allow followers-only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :avatar_removal"
+msgid "Avatar removal"
+msgstr "Avatar removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :banner_removal"
+msgid "Banner removal"
+msgstr "Banner removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :followers_only"
+msgid "Followers only"
+msgstr "Followers only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_nsfw"
+msgid "Media NSFW"
+msgstr "Media NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_removal"
+msgid "Media removal"
+msgstr "Media removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject_deletes"
+msgid "Reject deletes"
+msgstr "Reject deletes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :report_removal"
+msgid "Report removal"
+msgstr "Report removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "Hosts"
+msgstr "Hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid "Rejected shortcodes"
+msgstr "Rejected shortcodes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "Size limit"
+msgstr "Size limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain > :match_actor"
+msgid "Match actor"
+msgstr "Match actor"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Clean expired tokens"
+msgstr "Clean expired tokens"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Issue new refresh token"
+msgstr "Issue new refresh token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :token_expires_in"
+msgid "Token expires in"
+msgstr "Token expires in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default"
+msgid "Default"
+msgstr "Default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :default > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation"
+msgid "Federation"
+msgstr "Federation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :federation > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media"
+msgid "Media"
+msgstr "Media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :media > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload"
+msgid "Upload"
+msgstr "Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :recv_timeout"
+msgid "Recv timeout"
+msgstr "Recv timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:pools > :upload > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Fault rate allowance"
+msgstr "Fault rate allowance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval ms"
+msgstr "Sleep interval ms"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :app_account_creation"
+msgid "App account creation"
+msgstr "App account creation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :authentication"
+msgid "Authentication"
+msgstr "Authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relation_id_action"
+msgid "Relation ID action"
+msgstr "Relation ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relations_actions"
+msgid "Relations actions"
+msgstr "Relations actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :search"
+msgid "Search"
+msgstr "Search"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :status_id_action"
+msgid "Status ID action"
+msgstr "Status ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :statuses_actions"
+msgid "Statuses actions"
+msgstr "Statuses actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :timeline"
+msgid "Timeline"
+msgstr "Timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Activities"
+msgstr "Activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Profiles"
+msgstr "Profiles"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Timelines"
+msgstr "Timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Federated"
+msgstr "Federated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :failure_backoff"
+msgid "Failure backoff"
+msgstr "Failure backoff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_hosts"
+msgid "Ignore hosts"
+msgstr "Ignore hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_tld"
+msgid "Ignore TLD"
+msgstr "Ignore TLD"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :parsers"
+msgid "Parsers"
+msgstr "Parsers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ttl_setters"
+msgid "TTL setters"
+msgstr "TTL setters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:shout > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:shout > :limit"
+msgid "Limit"
+msgstr "Limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:static_fe > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer > :overflow_workers"
+msgid "Overflow workers"
+msgstr "Overflow workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer > :workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes > :valid_schemes"
+msgid "Valid schemes"
+msgstr "Valid schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:user > :deny_follow_blocked"
+msgid "Deny follow blocked"
+msgstr "Deny follow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub"
+msgstr "Activity pub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub question"
+msgstr "Activity pub question"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message"
+msgid "Chat message"
+msgstr "Chat message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :message"
+msgid "Message"
+msgstr "Message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :chat_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr "Sender nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message"
+msgid "Direct message"
+msgstr "Direct message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :message"
+msgid "Message"
+msgstr "Message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr "Sender nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email"
+msgid "Email"
+msgstr "Email"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :html"
+msgid "Html"
+msgstr "Html"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :sender"
+msgid "Sender"
+msgstr "Sender"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:workers > :retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgstr "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Pleroma.Web.RichMedia.Helpers"
+msgstr "Pleroma.Web.RichMedia.Helpers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :crontab"
+msgid "Crontab"
+msgstr "Crontab"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :log"
+msgid "Log"
+msgstr "Log"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues"
+msgid "Queues"
+msgstr "Queues"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration"
+msgstr "Activity expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachments cleanup"
+msgstr "Attachments cleanup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :backup"
+msgid "Backup"
+msgstr "Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Federator incoming"
+msgstr "Federator incoming"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Federator outgoing"
+msgstr "Federator outgoing"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :mailer"
+msgid "Mailer"
+msgstr "Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities"
+msgstr "Scheduled activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier"
+msgstr "Transmogrifier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :web_push"
+msgid "Web push"
+msgstr "Web push"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "Seconds valid"
+msgstr "Seconds valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :enabled"
+msgid "Mailer Enabled"
+msgstr "Mailer Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:access_key"
+msgid "AWS Access Key"
+msgstr "AWS Access Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:region"
+msgid "AWS Region"
+msgstr "AWS Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:secret"
+msgid "AWS Secret Key"
+msgstr "AWS Secret Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Dyn-:api_key"
+msgid "Dyn API Key"
+msgstr "Dyn API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Gmail-:access_token"
+msgid "GMail API Access Token"
+msgstr "GMail API Access Token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:api_key"
+msgid "Mailgun API Key"
+msgstr "Mailgun API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:domain"
+msgid "Domain"
+msgstr "Domain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:api_key"
+msgid "MailJet Public API Key"
+msgstr "MailJet Public API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:secret"
+msgid "MailJet Private API Key"
+msgstr "MailJet Private API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mandrill-:api_key"
+msgid "Mandrill API Key"
+msgstr "Mandrill API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Postmark-:api_key"
+msgid "Postmark API Key"
+msgstr "Postmark API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "AUTH Mode"
+msgstr "AUTH Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "Password"
+msgstr "Password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Relay"
+msgstr "Relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use SSL"
+msgstr "Use SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "STARTTLS Mode"
+msgstr "STARTTLS Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "Username"
+msgstr "Username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendgrid-:api_key"
+msgid "SendGrid API Key"
+msgstr "SendGrid API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_args"
+msgid "Cmd args"
+msgstr "Cmd args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_path"
+msgid "Cmd path"
+msgstr "Cmd path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:qmail"
+msgid "Qmail compat mode"
+msgstr "Qmail compat mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:api_key"
+msgid "SocketLabs API Key"
+msgstr "SocketLabs API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:server_id"
+msgid "Server ID"
+msgstr "Server ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:api_key"
+msgid "SparkPost API key"
+msgstr "SparkPost API key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "Styling"
+msgstr "Styling"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :content_background_color"
+msgid "Content background color"
+msgstr "Content background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :header_color"
+msgid "Header color"
+msgstr "Header color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :link_color"
+msgid "Link color"
+msgstr "Link color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_color"
+msgid "Text color"
+msgstr "Text color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_muted_color"
+msgid "Text muted color"
+msgstr "Text muted color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :class"
+msgid "Class"
+msgstr "Class"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :extra"
+msgid "Extra"
+msgstr "Extra"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :new_window"
+msgid "New window"
+msgstr "New window"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :rel"
+msgid "Rel"
+msgstr "Rel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip prefix"
+msgstr "Strip prefix"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Truncate"
+msgstr "Truncate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Validate tld"
+msgstr "Validate tld"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "Daily user limit"
+msgstr "Daily user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "Total user limit"
+msgstr "Total user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Filename display max length"
+msgstr "Filename display max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :filters"
+msgid "Filters"
+msgstr "Filters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :link_name"
+msgid "Link name"
+msgstr "Link name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy remote"
+msgstr "Proxy remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :uploader"
+msgid "Uploader"
+msgstr "Uploader"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "Args"
+msgstr "Args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Uploads"
+msgstr "Uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "Bucket"
+msgstr "Bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "Bucket namespace"
+msgstr "Bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Streaming enabled"
+msgstr "Streaming enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "Truncated namespace"
+msgstr "Truncated namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :email_blacklist"
+msgid "Email blacklist"
+msgstr "Email blacklist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "Restricted nicknames"
+msgstr "Restricted nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit days"
+msgstr "Limit days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Purge after days"
+msgstr "Purge after days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Strict"
+msgstr "Strict"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Options"
+msgstr "Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options > :params"
+msgid "Params"
+msgstr "Params"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Script path"
+msgstr "Script path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "URL Format"
+msgstr "URL Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "Unfurl NSFW"
+msgstr "Unfurl NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "Proxies"
+msgstr "Proxies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid "Reserved"
+msgstr "Reserved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Min lifetime"
+msgstr "Min lifetime"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
+msgid "Auth"
+msgstr "Auth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
+msgid "IP Whitelist"
+msgstr "IP Whitelist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
+msgid "Path"
+msgstr "Path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack > :meta"
+msgid "Meta"
+msgstr "Meta"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :quack > :webhook_url"
+msgid "Webhook URL"
+msgstr "Webhook URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :private_key"
+msgid "Private key"
+msgstr "Private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :public_key"
+msgid "Public key"
+msgstr "Public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Require HTTP signatures for AP fetches"
+msgstr "Require HTTP signatures for AP fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :short_description"
+msgid "Shorter version of instance description. It can be seen on `/api/v1/instance`"
+msgstr ""
+"Shorter version of instance description. It can be seen on `/api/v1/instance`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Authorized fetch mode"
+msgstr "Authorized fetch mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :short_description"
+msgid "Short description"
+msgstr "Short description"
diff --git a/priv/gettext/nl/LC_MESSAGES/errors.po b/priv/gettext/nl/LC_MESSAGES/errors.po
index cfcb05fe6..fc7ea0324 100644
--- a/priv/gettext/nl/LC_MESSAGES/errors.po
+++ b/priv/gettext/nl/LC_MESSAGES/errors.po
@@ -3,16 +3,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-15 09:37+0000\n"
-"PO-Revision-Date: 2020-06-02 07:36+0000\n"
+"PO-Revision-Date: 2022-08-07 10:46+0000\n"
"Last-Translator: Fristi \n"
-"Language-Team: Dutch \n"
+"Language-Team: Dutch \n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.0.4\n"
+"X-Generator: Weblate 4.13.1\n"
## This file is a PO Template file.
##
@@ -118,7 +118,7 @@ msgstr "Al gestemd"
#: lib/pleroma/web/oauth/oauth_controller.ex:360
#, elixir-format
msgid "Bad request"
-msgstr "Bad request"
+msgstr "Ongeldig request"
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:425
#, elixir-format
@@ -155,7 +155,7 @@ msgstr "Object kan niet geliked worden"
#: lib/pleroma/web/common_api/utils.ex:556
#, elixir-format
msgid "Cannot post an empty status without attachments"
-msgstr "Status kan niet geplaatst worden zonder tekst of bijlagen"
+msgstr "Bericht kan niet geplaatst worden zonder tekst of bijlagen"
#: lib/pleroma/web/common_api/utils.ex:504
#, elixir-format
@@ -165,122 +165,122 @@ msgstr "Opmerking dient maximaal %{max_size} karakters te bevatten"
#: lib/pleroma/config/config_db.ex:222
#, elixir-format
msgid "Config with params %{params} not found"
-msgstr ""
+msgstr "Instelling met parameters %{params} kon niet gevonden worden"
#: lib/pleroma/web/common_api/common_api.ex:95
#, elixir-format
msgid "Could not delete"
-msgstr ""
+msgstr "Verwijderen mislukt"
#: lib/pleroma/web/common_api/common_api.ex:141
#, elixir-format
msgid "Could not favorite"
-msgstr ""
+msgstr "Favoriet maken mislukt"
#: lib/pleroma/web/common_api/common_api.ex:370
#, elixir-format
msgid "Could not pin"
-msgstr ""
+msgstr "Vastmaken mislukt"
#: lib/pleroma/web/common_api/common_api.ex:112
#, elixir-format
msgid "Could not repeat"
-msgstr ""
+msgstr "Herhalen mislukt"
#: lib/pleroma/web/common_api/common_api.ex:188
#, elixir-format
msgid "Could not unfavorite"
-msgstr ""
+msgstr "Favoriet ongedaan maken mislukt"
#: lib/pleroma/web/common_api/common_api.ex:380
#, elixir-format
msgid "Could not unpin"
-msgstr ""
+msgstr "Vastmaken ongedaan maken mislukt"
#: lib/pleroma/web/common_api/common_api.ex:126
#, elixir-format
msgid "Could not unrepeat"
-msgstr ""
+msgstr "Herhalen ongedaan maken mislukt"
#: lib/pleroma/web/common_api/common_api.ex:428
#: lib/pleroma/web/common_api/common_api.ex:437
#, elixir-format
msgid "Could not update state"
-msgstr ""
+msgstr "Status bijwerken mislukt"
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:202
#, elixir-format
msgid "Error."
-msgstr ""
+msgstr "Fout."
#: lib/pleroma/web/twitter_api/twitter_api.ex:106
#, elixir-format
msgid "Invalid CAPTCHA"
-msgstr ""
+msgstr "Ongeldige CAPTCHA"
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:117
#: lib/pleroma/web/oauth/oauth_controller.ex:569
#, elixir-format
msgid "Invalid credentials"
-msgstr ""
+msgstr "Ongeldige inloggegevens"
#: lib/pleroma/plugs/ensure_authenticated_plug.ex:38
#, elixir-format
msgid "Invalid credentials."
-msgstr ""
+msgstr "Ongeldige inloggegevens."
#: lib/pleroma/web/common_api/common_api.ex:265
#, elixir-format
msgid "Invalid indices"
-msgstr ""
+msgstr "Ongeldige indexen"
#: lib/pleroma/web/admin_api/admin_api_controller.ex:1147
#, elixir-format
msgid "Invalid parameters"
-msgstr ""
+msgstr "Ongeldige parameters"
#: lib/pleroma/web/common_api/utils.ex:411
#, elixir-format
msgid "Invalid password."
-msgstr ""
+msgstr "Ongeldig wachtwoord."
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:187
#, elixir-format
msgid "Invalid request"
-msgstr ""
+msgstr "Ongeldig request"
#: lib/pleroma/web/twitter_api/twitter_api.ex:109
#, elixir-format
msgid "Kocaptcha service unavailable"
-msgstr ""
+msgstr "Kocaptcha service niet beschikbaar"
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:113
#, elixir-format
msgid "Missing parameters"
-msgstr ""
+msgstr "Ontbrekende parameters"
#: lib/pleroma/web/common_api/utils.ex:540
#, elixir-format
msgid "No such conversation"
-msgstr ""
+msgstr "Gesprek niet gevonden"
#: lib/pleroma/web/admin_api/admin_api_controller.ex:439
#: lib/pleroma/web/admin_api/admin_api_controller.ex:465 lib/pleroma/web/admin_api/admin_api_controller.ex:507
#, elixir-format
msgid "No such permission_group"
-msgstr ""
+msgstr "Permission_group niet gevonden"
#: lib/pleroma/plugs/uploaded_media.ex:74
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:485 lib/pleroma/web/admin_api/admin_api_controller.ex:1135
#: lib/pleroma/web/feed/user_controller.ex:73 lib/pleroma/web/ostatus/ostatus_controller.ex:143
#, elixir-format
msgid "Not found"
-msgstr ""
+msgstr "Niet gevonden"
#: lib/pleroma/web/common_api/common_api.ex:241
#, elixir-format
msgid "Poll's author can't vote"
-msgstr ""
+msgstr "De peiling-auteur kan niet stemmen"
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20
#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:37 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:49
@@ -288,215 +288,215 @@ msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71
#, elixir-format
msgid "Record not found"
-msgstr ""
+msgstr "Record niet gevonden"
#: lib/pleroma/web/admin_api/admin_api_controller.ex:1153
#: lib/pleroma/web/feed/user_controller.ex:79 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:32
#: lib/pleroma/web/ostatus/ostatus_controller.ex:149
#, elixir-format
msgid "Something went wrong"
-msgstr ""
+msgstr "Er is iets misgegaan"
#: lib/pleroma/web/common_api/activity_draft.ex:107
#, elixir-format
msgid "The message visibility must be direct"
-msgstr ""
+msgstr "De zichtbaarheid van het bericht dient privé te zijn"
#: lib/pleroma/web/common_api/utils.ex:566
#, elixir-format
msgid "The status is over the character limit"
-msgstr ""
+msgstr "Het bericht is langer dan het karakter-limiet"
#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:31
#, elixir-format
msgid "This resource requires authentication."
-msgstr ""
+msgstr "Deze gegevens vereisen authenticatie."
#: lib/pleroma/plugs/rate_limiter/rate_limiter.ex:206
#, elixir-format
msgid "Throttled"
-msgstr ""
+msgstr "Geremd"
#: lib/pleroma/web/common_api/common_api.ex:266
#, elixir-format
msgid "Too many choices"
-msgstr ""
+msgstr "Teveel keuzes"
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:442
#, elixir-format
msgid "Unhandled activity type"
-msgstr ""
+msgstr "Niet-ondersteund activiteits-type"
#: lib/pleroma/web/admin_api/admin_api_controller.ex:536
#, elixir-format
msgid "You can't revoke your own admin status."
-msgstr ""
+msgstr "Je kan je eigen beheerdersrechten niet intrekken."
#: lib/pleroma/web/oauth/oauth_controller.ex:218
#: lib/pleroma/web/oauth/oauth_controller.ex:309
#, elixir-format
msgid "Your account is currently disabled"
-msgstr ""
+msgstr "Je account is momenteel uitgeschakeld"
#: lib/pleroma/web/oauth/oauth_controller.ex:180
#: lib/pleroma/web/oauth/oauth_controller.ex:332
#, elixir-format
msgid "Your login is missing a confirmed e-mail address"
-msgstr ""
+msgstr "Je login bevat geen bevestigd e-mailadres"
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:389
#, elixir-format
msgid "can't read inbox of %{nickname} as %{as_nickname}"
-msgstr ""
+msgstr "kan de inbox van %{nickname} niet lezen als %{as_nickname}"
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:472
#, elixir-format
msgid "can't update outbox of %{nickname} as %{as_nickname}"
-msgstr ""
+msgstr "kan de outbox van %{nickname} niet bijwerken als %{as_nickname}"
#: lib/pleroma/web/common_api/common_api.ex:388
#, elixir-format
msgid "conversation is already muted"
-msgstr ""
+msgstr "gesprek is al genegeerd"
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:316
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:491
#, elixir-format
msgid "error"
-msgstr ""
+msgstr "fout"
#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:29
#, elixir-format
msgid "mascots can only be images"
-msgstr ""
+msgstr "mascottes kunnen alleen afbeeldingen zijn"
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:60
#, elixir-format
msgid "not found"
-msgstr ""
+msgstr "niet gevonden"
#: lib/pleroma/web/oauth/oauth_controller.ex:395
#, elixir-format
msgid "Bad OAuth request."
-msgstr ""
+msgstr "Ongeldig OAuth request."
#: lib/pleroma/web/twitter_api/twitter_api.ex:115
#, elixir-format
msgid "CAPTCHA already used"
-msgstr ""
+msgstr "CAPTCHA is al gebruikt"
#: lib/pleroma/web/twitter_api/twitter_api.ex:112
#, elixir-format
msgid "CAPTCHA expired"
-msgstr ""
+msgstr "CAPTCHA is verlopen"
#: lib/pleroma/plugs/uploaded_media.ex:55
#, elixir-format
msgid "Failed"
-msgstr ""
+msgstr "Mislukt"
#: lib/pleroma/web/oauth/oauth_controller.ex:411
#, elixir-format
msgid "Failed to authenticate: %{message}."
-msgstr ""
+msgstr "Authenticatie mislukt: %{message}."
#: lib/pleroma/web/oauth/oauth_controller.ex:442
#, elixir-format
msgid "Failed to set up user account."
-msgstr ""
+msgstr "Aanmaken van gebruikersaccount is mislukt."
#: lib/pleroma/plugs/oauth_scopes_plug.ex:38
#, elixir-format
msgid "Insufficient permissions: %{permissions}."
-msgstr ""
+msgstr "Niet voldoende rechten: %{permissions}."
#: lib/pleroma/plugs/uploaded_media.ex:94
#, elixir-format
msgid "Internal Error"
-msgstr ""
+msgstr "Interne Fout"
#: lib/pleroma/web/oauth/fallback_controller.ex:22
#: lib/pleroma/web/oauth/fallback_controller.ex:29
#, elixir-format
msgid "Invalid Username/Password"
-msgstr ""
+msgstr "Ongeldige Gebruikersnaam/Wachtwoord"
#: lib/pleroma/web/twitter_api/twitter_api.ex:118
#, elixir-format
msgid "Invalid answer data"
-msgstr ""
+msgstr "Ongeldig antwoord"
#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:128
#, elixir-format
msgid "Nodeinfo schema version not handled"
-msgstr ""
+msgstr "Nodeinfo schema wordt niet ondersteund"
#: lib/pleroma/web/oauth/oauth_controller.ex:169
#, elixir-format
msgid "This action is outside the authorized scopes"
-msgstr ""
+msgstr "Deze actie bevindt zich buiten de gemachtigde scopes"
#: lib/pleroma/web/oauth/fallback_controller.ex:14
#, elixir-format
msgid "Unknown error, please check the details and try again."
-msgstr ""
+msgstr "Onbekende fout, controleer a.u.b. de details en probeer het opnieuw."
#: lib/pleroma/web/oauth/oauth_controller.ex:116
#: lib/pleroma/web/oauth/oauth_controller.ex:155
#, elixir-format
msgid "Unlisted redirect_uri."
-msgstr ""
+msgstr "Niet-vermelde redirect_uri."
#: lib/pleroma/web/oauth/oauth_controller.ex:391
#, elixir-format
msgid "Unsupported OAuth provider: %{provider}."
-msgstr ""
+msgstr "Niet ondersteunde OAuth provider: %{provider}."
#: lib/pleroma/uploaders/uploader.ex:72
#, elixir-format
msgid "Uploader callback timeout"
-msgstr ""
+msgstr "Uploader terugkoppeling timeout"
#: lib/pleroma/web/uploader_controller.ex:23
#, elixir-format
msgid "bad request"
-msgstr ""
+msgstr "ongeldig request"
#: lib/pleroma/web/twitter_api/twitter_api.ex:103
#, elixir-format
msgid "CAPTCHA Error"
-msgstr ""
+msgstr "CAPTCHA Fout"
#: lib/pleroma/web/common_api/common_api.ex:200
#, elixir-format
msgid "Could not add reaction emoji"
-msgstr ""
+msgstr "Reactie-emoji toevoegen mislukt"
#: lib/pleroma/web/common_api/common_api.ex:211
#, elixir-format
msgid "Could not remove reaction emoji"
-msgstr ""
+msgstr "Reactie-emoji verwijderen mislukt"
#: lib/pleroma/web/twitter_api/twitter_api.ex:129
#, elixir-format
msgid "Invalid CAPTCHA (Missing parameter: %{name})"
-msgstr ""
+msgstr "Ongeldige CAPTCHA (Ontbrekende parameter: %{name})"
#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:92
#, elixir-format
msgid "List not found"
-msgstr ""
+msgstr "Lijst niet gevonden"
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:124
#, elixir-format
msgid "Missing parameter: %{name}"
-msgstr ""
+msgstr "Ontbrekende parameter: %{name}"
#: lib/pleroma/web/oauth/oauth_controller.ex:207
#: lib/pleroma/web/oauth/oauth_controller.ex:322
#, elixir-format
msgid "Password reset is required"
-msgstr ""
+msgstr "Wachtwoordherstel is vereist"
#: lib/pleroma/tests/auth_test_controller.ex:9
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/admin_api_controller.ex:6
@@ -528,53 +528,63 @@ msgstr ""
#, elixir-format
msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped."
msgstr ""
+"Schending van beveiliging: OAuth scope-controle is niet uitgevoerd en niet "
+"expliciet overgeslagen."
#: lib/pleroma/plugs/ensure_authenticated_plug.ex:28
#, elixir-format
msgid "Two-factor authentication enabled, you must use a access token."
msgstr ""
+"Tweefactor authenticatie is ingeschakeld, een toegangssleutel is verplicht."
#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:210
#, elixir-format
msgid "Unexpected error occurred while adding file to pack."
msgstr ""
+"Er is een onverwachte fout opgetreden tijdens het toevoegen van het bestand."
#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:138
#, elixir-format
msgid "Unexpected error occurred while creating pack."
msgstr ""
+"Er is een onverwachte fout opgetreden tijdens het aanmaken van het pakket."
#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:278
#, elixir-format
msgid "Unexpected error occurred while removing file from pack."
msgstr ""
+"Er is een onverwachte fout opgetreden tijdens het verwijderen van het "
+"bestand."
#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:250
#, elixir-format
msgid "Unexpected error occurred while updating file in pack."
msgstr ""
+"Er is een onverwachte fout opgetreden tijdens het bijwerken van het bestand."
#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:179
#, elixir-format
msgid "Unexpected error occurred while updating pack metadata."
msgstr ""
+"Er is een onverwachte fout opgetreden tijdens het bijwerken van de pakket-"
+"metadata."
#: lib/pleroma/plugs/user_is_admin_plug.ex:21
#, elixir-format
msgid "User is not an admin."
-msgstr ""
+msgstr "Gebruiker is niet een beheerder."
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61
#, elixir-format
msgid "Web push subscription is disabled on this Pleroma instance"
-msgstr ""
+msgstr "Web push abbonement is uitgeschakeld op deze Pleroma instantie"
#: lib/pleroma/web/admin_api/admin_api_controller.ex:502
#, elixir-format
msgid "You can't revoke your own admin/moderator status."
-msgstr ""
+msgstr "Je kan je eigen beheerders- of moderatorrechten niet intrekken."
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:105
#, elixir-format
msgid "authorization required for timeline view"
-msgstr ""
+msgstr "machtiging is vereist voor de tijdlijn weergave"
diff --git a/priv/gettext/nl/LC_MESSAGES/static_pages.po b/priv/gettext/nl/LC_MESSAGES/static_pages.po
new file mode 100644
index 000000000..4c5ed0a7b
--- /dev/null
+++ b/priv/gettext/nl/LC_MESSAGES/static_pages.po
@@ -0,0 +1,567 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-08-07 10:48+0000\n"
+"PO-Revision-Date: 2022-08-07 19:52+0000\n"
+"Last-Translator: Fristi \n"
+"Language-Team: Dutch \n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.13.1\n"
+
+## This file is a PO Template file.
+##
+## "msgid"s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run "mix gettext.extract" to bring this file up to
+## date. Leave "msgstr"s empty as changing them here as no
+## effect: edit them in PO (.po) files instead.
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:9
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button"
+msgid "Authorize"
+msgstr "Machtigen"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "remote follow error"
+msgid "Error fetching user"
+msgstr "Fout bij ophalen gebruiker"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow header"
+msgid "Remote follow"
+msgstr "Extern volgen"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for auth code entry"
+msgid "Authentication code"
+msgstr "Authenticatiecode"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:10
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for password entry"
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for username entry"
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:13
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button for login"
+msgid "Authorize"
+msgstr "Machtigen"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button for mfa"
+msgid "Authorize"
+msgstr "Machtigen"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "remote follow error"
+msgid "Error following account"
+msgstr "Fout bij volgen van account"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow header, need login"
+msgid "Log in to follow"
+msgstr "Log in om te volgen"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow mfa header"
+msgid "Two-factor authentication"
+msgstr "Tweefactor authenticatie"
+
+#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow success"
+msgid "Account followed!"
+msgstr "Account gevolgd!"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:7
+#, elixir-autogen, elixir-format
+msgctxt "placeholder text for account id"
+msgid "Your account ID, e.g. lain@quitter.se"
+msgstr "Je account ID, b.v. gebruiker@instantie.net"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "remote follow authorization button for following with a remote account"
+msgid "Follow"
+msgstr "Volgen"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "remote follow error"
+msgid "Error: %{error}"
+msgstr "Fout: %{error}"
+
+#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "remote follow header"
+msgid "Remotely follow %{nickname}"
+msgstr "%{nickname} extern volgen"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "password reset button"
+msgid "Reset"
+msgstr "Herstellen"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "password reset failed homepage link"
+msgid "Homepage"
+msgstr "Homepagina"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "password reset failed message"
+msgid "Password reset failed"
+msgstr "Wachtwoordherstel mislukt"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "password reset form confirm password prompt"
+msgid "Confirmation"
+msgstr "Bevestiging"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:4
+#, elixir-autogen, elixir-format
+msgctxt "password reset form password prompt"
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: lib/pleroma/web/templates/twitter_api/password/invalid_token.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "password reset invalid token message"
+msgid "Invalid Token"
+msgstr "Ongeldige Token"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "password reset successful homepage link"
+msgid "Homepage"
+msgstr "Homepagina"
+
+#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "password reset successful message"
+msgid "Password changed!"
+msgstr "Wachtwoord gewijzigd!"
+
+#: lib/pleroma/web/templates/feed/feed/tag.atom.eex:15
+#: lib/pleroma/web/templates/feed/feed/tag.rss.eex:7
+#, elixir-autogen, elixir-format
+msgctxt "tag feed description"
+msgid "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse."
+msgstr ""
+"Dit zijn openbare berichten die getagd zijn met #%{tag}. Je kunt op deze "
+"reageren indien je een account hebt in de fediverse."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorization exists page title"
+msgid "Authorization exists"
+msgstr "Machtiging bestaat"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:32
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorize approve button"
+msgid "Approve"
+msgstr "Goedkeuren"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:30
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorize cancel button"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:23
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorize message"
+msgid "Application %{client_name} is requesting access to your account."
+msgstr ""
+"Applicatie %{client_name} vraagt om toegang tot je account."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "oauth authorized page title"
+msgid "Successfully authorized"
+msgstr "Machtiging is geslaagd"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "oauth external provider page title"
+msgid "Sign in with external provider"
+msgstr "Inloggen bij externe provider"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:13
+#, elixir-autogen, elixir-format
+msgctxt "oauth external provider sign in button"
+msgid "Sign in with %{strategy}"
+msgstr "Inloggen met %{strategy}"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:54
+#, elixir-autogen, elixir-format
+msgctxt "oauth login button"
+msgid "Log In"
+msgstr "Inloggen"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:51
+#, elixir-autogen, elixir-format
+msgctxt "oauth login password prompt"
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:47
+#, elixir-autogen, elixir-format
+msgctxt "oauth login username prompt"
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:39
+#, elixir-autogen, elixir-format
+msgctxt "oauth register nickname prompt"
+msgid "Pleroma Handle"
+msgstr "Pleroma Gebruiker"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:37
+#, elixir-autogen, elixir-format
+msgctxt "oauth register nickname unchangeable warning"
+msgid "Choose carefully! You won't be able to change this later. You will be able to change your display name, though."
+msgstr ""
+"Let op! Je kunt je accountnaam hierna niet meer wijzigen. Je kunt echter wel "
+"nog je weergavenaam wijzigen."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:18
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page email prompt"
+msgid "Email"
+msgstr "E-mail"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:10
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page fill form prompt"
+msgid "If you'd like to register a new account, please provide the details below."
+msgstr ""
+"Indien je graag een nieuw account wilt registreren, vul dan a.u.b de "
+"onderstaande details in."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:35
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login button"
+msgid "Proceed as existing user"
+msgstr "Doorgaan als bestaande gebruiker"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:31
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login password prompt"
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:24
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login prompt"
+msgid "Alternatively, sign in to connect to existing account."
+msgstr "Alternatief, log in om te verbinden met een bestaand account."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:27
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page login username prompt"
+msgid "Name or email"
+msgstr "Naam of e-mail"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:14
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page nickname prompt"
+msgid "Nickname"
+msgstr "Weergavenaam"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:22
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page register button"
+msgid "Proceed as new user"
+msgstr "Doorgaan als nieuwe gebruiker"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page title"
+msgid "Registration Details"
+msgstr "Registratiegegevens"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:36
+#, elixir-autogen, elixir-format
+msgctxt "oauth register page title"
+msgid "This is the first time you visit! Please enter your Pleroma handle."
+msgstr "Dit is je eerste bezoek! Vul a.u.b. je Pleroma gebruikersnaam in."
+
+#: lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "oauth scopes message"
+msgid "The following permissions will be granted"
+msgstr "De volgende rechten zullen worden toegekend"
+
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:2
+#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:2
+#, elixir-autogen, elixir-format
+msgctxt "oauth token code message"
+msgid "Token code is %{token}"
+msgstr "Token code is %{token}"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth code prompt"
+msgid "Authentication code"
+msgstr "Authenticatiecode"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth page title"
+msgid "Two-factor authentication"
+msgstr "Tweefactor authenticatie"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:23
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth page use recovery code link"
+msgid "Enter a two-factor recovery code"
+msgstr "Voer een tweefactor herstelcode in"
+
+#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:20
+#, elixir-autogen, elixir-format
+msgctxt "mfa auth verify code button"
+msgid "Verify"
+msgstr "Controleren"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover page title"
+msgid "Two-factor recovery"
+msgstr "Tweefactor herstel"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:12
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover recovery code prompt"
+msgid "Recovery code"
+msgstr "Herstelcode"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:23
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover use 2fa code link"
+msgid "Enter a two-factor code"
+msgstr "Voer een tweefactor code in"
+
+#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:20
+#, elixir-autogen, elixir-format
+msgctxt "mfa recover verify recovery code button"
+msgid "Verify"
+msgstr "Controleren"
+
+#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:8
+#, elixir-autogen, elixir-format
+msgctxt "static fe profile page remote follow button"
+msgid "Remote follow"
+msgstr "Extern volgen"
+
+#: lib/pleroma/web/templates/email/digest.html.eex:163
+#, elixir-autogen, elixir-format
+msgctxt "digest email header line"
+msgid "Hey %{nickname}, here is what you've missed!"
+msgstr "Hoi %{nickname}, dit is wat je hebt gemist!"
+
+#: lib/pleroma/web/templates/email/digest.html.eex:544
+#, elixir-autogen, elixir-format
+msgctxt "digest email receiver address"
+msgid "The email address you are subscribed as is %{email} . "
+msgstr ""
+"Het e-mailadres waarmee je bent ingeschreven is %{email} . "
+
+#: lib/pleroma/web/templates/email/digest.html.eex:538
+#, elixir-autogen, elixir-format
+msgctxt "digest email sending reason"
+msgid "You have received this email because you have signed up to receive digest emails from %{instance} Pleroma instance."
+msgstr ""
+"Je ontvangt deze e-mail omdat je bent ingeschreven voor overzichts-mails te "
+"ontvangen van %{instance} Pleroma instantie."
+
+#: lib/pleroma/web/templates/email/digest.html.eex:547
+#, elixir-autogen, elixir-format
+msgctxt "digest email unsubscribe action"
+msgid "To unsubscribe, please go %{here}."
+msgstr "Je kunt je %{here} uitschrijven voor deze e-mails."
+
+#: lib/pleroma/web/templates/email/digest.html.eex:547
+#, elixir-autogen, elixir-format
+msgctxt "digest email unsubscribe action link text"
+msgid "here"
+msgstr "hier"
+
+#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_failure.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "mailer unsubscribe failed message"
+msgid "UNSUBSCRIBE FAILURE"
+msgstr "UITSCHRIJVEN MISLUKT"
+
+#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_success.html.eex:1
+#, elixir-autogen, elixir-format
+msgctxt "mailer unsubscribe successful message"
+msgid "UNSUBSCRIBE SUCCESSFUL"
+msgstr "UITSCHRIJVEN GESLAAGD"
+
+#: lib/pleroma/web/templates/email/digest.html.eex:385
+#, elixir-format
+msgctxt "new followers count header"
+msgid "%{count} New Follower"
+msgid_plural "%{count} New Followers"
+msgstr[0] "%{count} Nieuwe Volger"
+msgstr[1] "%{count} Nieuwe Volgers"
+
+#: lib/pleroma/emails/user_email.ex:356
+#, elixir-autogen, elixir-format
+msgctxt "account archive email body - self-requested"
+msgid "You requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
+msgstr ""
+"Je hebt een verzoek ingediend voor een volledige back-up van je Pleroma "
+"account. Deze is gereed om te downloaden:
\n"
+"%{download_url}
\n"
+
+#: lib/pleroma/emails/user_email.ex:384
+#, elixir-autogen, elixir-format
+msgctxt "account archive email subject"
+msgid "Your account archive is ready"
+msgstr "Je account archief is gereed"
+
+#: lib/pleroma/emails/user_email.ex:188
+#, elixir-autogen, elixir-format
+msgctxt "approval pending email body"
+msgid "Awaiting Approval \nYour account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.
\n"
+msgstr ""
+"Goedkeuring in afwachting \n"
+"Je account bij %{instance_name} zal worden beoordeeld door de beheerders. "
+"Je zult een opvolgende e-mail ontvangen wanneer je account goed gekeurd "
+"is.
\n"
+
+#: lib/pleroma/emails/user_email.ex:202
+#, elixir-autogen, elixir-format
+msgctxt "approval pending email subject"
+msgid "Your account is awaiting approval"
+msgstr "Je account is in afwachting van goedkeuring"
+
+#: lib/pleroma/emails/user_email.ex:158
+#, elixir-autogen, elixir-format
+msgctxt "confirmation email body"
+msgid "Thank you for registering on %{instance_name} \nEmail confirmation is required to activate the account.
\nPlease click the following link to activate your account .
\n"
+msgstr ""
+"Bedankt voor het registreren bij %{instance_name} \n"
+"Bevestiging via e-mail is vereist om je account te activeren.
\n"
+"Je kunt je account activeren door op deze "
+"link te klikken .
\n"
+
+#: lib/pleroma/emails/user_email.ex:174
+#, elixir-autogen, elixir-format
+msgctxt "confirmation email subject"
+msgid "%{instance_name} account confirmation"
+msgstr "%{instance_name} account bevestiging"
+
+#: lib/pleroma/emails/user_email.ex:310
+#, elixir-autogen, elixir-format
+msgctxt "digest email subject"
+msgid "Your digest from %{instance_name}"
+msgstr "Je overzicht van %{instance_name}"
+
+#: lib/pleroma/emails/user_email.ex:81
+#, elixir-autogen, elixir-format
+msgctxt "password reset email body"
+msgid "Reset your password at %{instance_name} \nSomeone has requested password change for your account at %{instance_name}.
\nIf it was you, visit the following link to proceed: reset password .
\nIf it was someone else, nothing to worry about: your data is secure and your password has not been changed.
\n"
+msgstr ""
+"Herstel je wachtwoord bij %{instance_name} \n"
+"Iemand heeft een verzoek ingediend om het wachtwoord van je account bij "
+"%{instance_name} te herstellen.
\n"
+"Als je dit zelf geweest bent, volg dan de volgende link om door te gaan: "
+"wachtwoord herstellen .
\n"
+"Indien je dit niet geweest bent, hoef je geen verdere acties te "
+"ondernemen: je gegevens zijn veilig en je wachtwoord is niet gewijzigd.
\n"
+
+#: lib/pleroma/emails/user_email.ex:98
+#, elixir-autogen, elixir-format
+msgctxt "password reset email subject"
+msgid "Password reset"
+msgstr "Wachtwoord herstellen"
+
+#: lib/pleroma/emails/user_email.ex:215
+#, elixir-autogen, elixir-format
+msgctxt "successful registration email body"
+msgid "Hello @%{nickname}, \nYour account at %{instance_name} has been registered successfully.
\nNo further action is required to activate your account.
\n"
+msgstr ""
+"Hoi @%{nickname}, \n"
+"Het registreren van je account bij %{instance_name} is gelukt.
\n"
+"Er zijn geen verdere stappen vereist om je account te activeren.
\n"
+
+#: lib/pleroma/emails/user_email.ex:231
+#, elixir-autogen, elixir-format
+msgctxt "successful registration email subject"
+msgid "Account registered on %{instance_name}"
+msgstr "Account registratie bij %{instance_name}"
+
+#: lib/pleroma/emails/user_email.ex:119
+#, elixir-autogen, elixir-format
+msgctxt "user invitation email body"
+msgid "You are invited to %{instance_name} \n%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.
\nClick the following link to register: accept invitation .
\n"
+msgstr ""
+"Je bent uitgenodigd bij %{instance_name} \n"
+"%{inviter_name} nodigt je uit om je te registreren bij %{instance_name}, "
+"een instantie van het Pleroma gefedereerde sociale netwerk.
\n"
+"Om je te registreren, klink op de volgende link: uitnodiging accepteren .
\n"
+
+#: lib/pleroma/emails/user_email.ex:136
+#, elixir-autogen, elixir-format
+msgctxt "user invitation email subject"
+msgid "Invitation to %{instance_name}"
+msgstr "Uitnodiging van %{instance_name}"
+
+#: lib/pleroma/emails/user_email.ex:53
+#, elixir-autogen, elixir-format
+msgctxt "welcome email html body"
+msgid "Welcome to %{instance_name}!"
+msgstr "Welkom bij %{instance_name}!"
+
+#: lib/pleroma/emails/user_email.ex:41
+#, elixir-autogen, elixir-format
+msgctxt "welcome email subject"
+msgid "Welcome to %{instance_name}!"
+msgstr "Welkom bij %{instance_name}!"
+
+#: lib/pleroma/emails/user_email.ex:65
+#, elixir-autogen, elixir-format
+msgctxt "welcome email text body"
+msgid "Welcome to %{instance_name}!"
+msgstr "Welkom bij %{instance_name}!"
+
+#: lib/pleroma/emails/user_email.ex:368
+#, elixir-autogen, elixir-format
+msgctxt "account archive email body - admin requested"
+msgid "Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
+msgstr ""
+"Beheerder @%{admin_nickname} heeft een verzoek ingediend voor een "
+"volledige back-up van je Pleroma account. Deze is gereed om te "
+"downloaden:
\n"
+"%{download_url}
\n"
diff --git a/priv/gettext/static_pages.pot b/priv/gettext/static_pages.pot
index fbc3e61a3..8e1b1d9db 100644
--- a/priv/gettext/static_pages.pot
+++ b/priv/gettext/static_pages.pot
@@ -10,393 +10,393 @@
msgid ""
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:9
msgctxt "remote follow authorization button"
msgid "Authorize"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:2
msgctxt "remote follow error"
msgid "Error fetching user"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:4
msgctxt "remote follow header"
msgid "Remote follow"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:8
msgctxt "placeholder text for auth code entry"
msgid "Authentication code"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:10
msgctxt "placeholder text for password entry"
msgid "Password"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:8
msgctxt "placeholder text for username entry"
msgid "Username"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:13
msgctxt "remote follow authorization button for login"
msgid "Authorize"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:12
msgctxt "remote follow authorization button for mfa"
msgid "Authorize"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:2
msgctxt "remote follow error"
msgid "Error following account"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:4
msgctxt "remote follow header, need login"
msgid "Log in to follow"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:4
msgctxt "remote follow mfa header"
msgid "Two-factor authentication"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:4
msgctxt "remote follow success"
msgid "Account followed!"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:7
msgctxt "placeholder text for account id"
msgid "Your account ID, e.g. lain@quitter.se"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:8
msgctxt "remote follow authorization button for following with a remote account"
msgid "Follow"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:2
msgctxt "remote follow error"
msgid "Error: %{error}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:4
msgctxt "remote follow header"
msgid "Remotely follow %{nickname}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:12
msgctxt "password reset button"
msgid "Reset"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:4
msgctxt "password reset failed homepage link"
msgid "Homepage"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:1
msgctxt "password reset failed message"
msgid "Password reset failed"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:8
msgctxt "password reset form confirm password prompt"
msgid "Confirmation"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:4
msgctxt "password reset form password prompt"
msgid "Password"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/invalid_token.html.eex:1
msgctxt "password reset invalid token message"
msgid "Invalid Token"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:2
msgctxt "password reset successful homepage link"
msgid "Homepage"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:1
msgctxt "password reset successful message"
msgid "Password changed!"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/feed/feed/tag.atom.eex:15
#: lib/pleroma/web/templates/feed/feed/tag.rss.eex:7
msgctxt "tag feed description"
msgid "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:1
msgctxt "oauth authorization exists page title"
msgid "Authorization exists"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:32
msgctxt "oauth authorize approve button"
msgid "Approve"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:30
msgctxt "oauth authorize cancel button"
msgid "Cancel"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:23
msgctxt "oauth authorize message"
msgid "Application %{client_name} is requesting access to your account."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:1
msgctxt "oauth authorized page title"
msgid "Successfully authorized"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:1
msgctxt "oauth external provider page title"
msgid "Sign in with external provider"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:13
msgctxt "oauth external provider sign in button"
msgid "Sign in with %{strategy}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:54
msgctxt "oauth login button"
msgid "Log In"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:51
msgctxt "oauth login password prompt"
msgid "Password"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:47
msgctxt "oauth login username prompt"
msgid "Username"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:39
msgctxt "oauth register nickname prompt"
msgid "Pleroma Handle"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:37
msgctxt "oauth register nickname unchangeable warning"
msgid "Choose carefully! You won't be able to change this later. You will be able to change your display name, though."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:18
msgctxt "oauth register page email prompt"
msgid "Email"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:10
msgctxt "oauth register page fill form prompt"
msgid "If you'd like to register a new account, please provide the details below."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:35
msgctxt "oauth register page login button"
msgid "Proceed as existing user"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:31
msgctxt "oauth register page login password prompt"
msgid "Password"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:24
msgctxt "oauth register page login prompt"
msgid "Alternatively, sign in to connect to existing account."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:27
msgctxt "oauth register page login username prompt"
msgid "Name or email"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:14
msgctxt "oauth register page nickname prompt"
msgid "Nickname"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:22
msgctxt "oauth register page register button"
msgid "Proceed as new user"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:8
msgctxt "oauth register page title"
msgid "Registration Details"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:36
msgctxt "oauth register page title"
msgid "This is the first time you visit! Please enter your Pleroma handle."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex:2
msgctxt "oauth scopes message"
msgid "The following permissions will be granted"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:2
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:2
msgctxt "oauth token code message"
msgid "Token code is %{token}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:12
msgctxt "mfa auth code prompt"
msgid "Authentication code"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:8
msgctxt "mfa auth page title"
msgid "Two-factor authentication"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:23
msgctxt "mfa auth page use recovery code link"
msgid "Enter a two-factor recovery code"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:20
msgctxt "mfa auth verify code button"
msgid "Verify"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:8
msgctxt "mfa recover page title"
msgid "Two-factor recovery"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:12
msgctxt "mfa recover recovery code prompt"
msgid "Recovery code"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:23
msgctxt "mfa recover use 2fa code link"
msgid "Enter a two-factor code"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:20
msgctxt "mfa recover verify recovery code button"
msgid "Verify"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:8
msgctxt "static fe profile page remote follow button"
msgid "Remote follow"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:163
msgctxt "digest email header line"
msgid "Hey %{nickname}, here is what you've missed!"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:544
msgctxt "digest email receiver address"
msgid "The email address you are subscribed as is %{email} . "
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:538
msgctxt "digest email sending reason"
msgid "You have received this email because you have signed up to receive digest emails from %{instance} Pleroma instance."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:547
msgctxt "digest email unsubscribe action"
msgid "To unsubscribe, please go %{here}."
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:547
msgctxt "digest email unsubscribe action link text"
msgid "here"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_failure.html.eex:1
msgctxt "mailer unsubscribe failed message"
msgid "UNSUBSCRIBE FAILURE"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_success.html.eex:1
msgctxt "mailer unsubscribe successful message"
msgid "UNSUBSCRIBE SUCCESSFUL"
@@ -410,103 +410,103 @@ msgid_plural "%{count} New Followers"
msgstr[0] ""
msgstr[1] ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:356
msgctxt "account archive email body - self-requested"
msgid "You requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:384
msgctxt "account archive email subject"
msgid "Your account archive is ready"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:188
msgctxt "approval pending email body"
msgid "Awaiting Approval \nYour account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.
\n"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:202
msgctxt "approval pending email subject"
msgid "Your account is awaiting approval"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:158
msgctxt "confirmation email body"
msgid "Thank you for registering on %{instance_name} \nEmail confirmation is required to activate the account.
\nPlease click the following link to activate your account .
\n"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:174
msgctxt "confirmation email subject"
msgid "%{instance_name} account confirmation"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:310
msgctxt "digest email subject"
msgid "Your digest from %{instance_name}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:81
msgctxt "password reset email body"
msgid "Reset your password at %{instance_name} \nSomeone has requested password change for your account at %{instance_name}.
\nIf it was you, visit the following link to proceed: reset password .
\nIf it was someone else, nothing to worry about: your data is secure and your password has not been changed.
\n"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:98
msgctxt "password reset email subject"
msgid "Password reset"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:215
msgctxt "successful registration email body"
msgid "Hello @%{nickname}, \nYour account at %{instance_name} has been registered successfully.
\nNo further action is required to activate your account.
\n"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:231
msgctxt "successful registration email subject"
msgid "Account registered on %{instance_name}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:119
msgctxt "user invitation email body"
msgid "You are invited to %{instance_name} \n%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.
\nClick the following link to register: accept invitation .
\n"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:136
msgctxt "user invitation email subject"
msgid "Invitation to %{instance_name}"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:53
msgctxt "welcome email html body"
msgid "Welcome to %{instance_name}!"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:41
msgctxt "welcome email subject"
msgid "Welcome to %{instance_name}!"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:65
msgctxt "welcome email text body"
msgid "Welcome to %{instance_name}!"
msgstr ""
-#, elixir-format
+#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:368
msgctxt "account archive email body - admin requested"
msgid "Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
diff --git a/priv/repo/migrations/20220308012601_create_announcements.exs b/priv/repo/migrations/20220308012601_create_announcements.exs
new file mode 100644
index 000000000..01c9ce041
--- /dev/null
+++ b/priv/repo/migrations/20220308012601_create_announcements.exs
@@ -0,0 +1,26 @@
+defmodule Pleroma.Repo.Migrations.CreateAnnouncements do
+ use Ecto.Migration
+
+ def change do
+ create_if_not_exists table(:announcements, primary_key: false) do
+ add(:id, :uuid, primary_key: true)
+ add(:data, :map)
+ add(:starts_at, :naive_datetime)
+ add(:ends_at, :naive_datetime)
+ add(:rendered, :map)
+
+ timestamps()
+ end
+
+ create_if_not_exists table(:announcement_read_relationships) do
+ add(:user_id, references(:users, type: :uuid, on_delete: :delete_all))
+ add(:announcement_id, references(:announcements, type: :uuid, on_delete: :delete_all))
+
+ timestamps(updated_at: false)
+ end
+
+ create_if_not_exists(
+ unique_index(:announcement_read_relationships, [:user_id, :announcement_id])
+ )
+ end
+end
diff --git a/priv/repo/migrations/20220509180452_change_thread_visibility_to_be_local_only_aware.exs b/priv/repo/migrations/20220509180452_change_thread_visibility_to_be_local_only_aware.exs
new file mode 100644
index 000000000..ea6ae6c5c
--- /dev/null
+++ b/priv/repo/migrations/20220509180452_change_thread_visibility_to_be_local_only_aware.exs
@@ -0,0 +1,153 @@
+defmodule Pleroma.Repo.Migrations.ChangeThreadVisibilityToBeLocalOnlyAware do
+ use Ecto.Migration
+
+ def up do
+ execute("DROP FUNCTION IF EXISTS thread_visibility(actor varchar, activity_id varchar)")
+ execute(update_thread_visibility())
+ end
+
+ def down do
+ execute(
+ "DROP FUNCTION IF EXISTS thread_visibility(actor varchar, activity_id varchar, local_public varchar)"
+ )
+
+ execute(restore_thread_visibility())
+ end
+
+ def update_thread_visibility do
+ """
+ CREATE OR REPLACE FUNCTION thread_visibility(actor varchar, activity_id varchar, local_public varchar default '') RETURNS boolean AS $$
+ DECLARE
+ public varchar := 'https://www.w3.org/ns/activitystreams#Public';
+ child objects%ROWTYPE;
+ activity activities%ROWTYPE;
+ author_fa varchar;
+ valid_recipients varchar[];
+ actor_user_following varchar[];
+ BEGIN
+ --- Fetch actor following
+ SELECT array_agg(following.follower_address) INTO actor_user_following FROM following_relationships
+ JOIN users ON users.id = following_relationships.follower_id
+ JOIN users AS following ON following.id = following_relationships.following_id
+ WHERE users.ap_id = actor;
+
+ --- Fetch our initial activity.
+ SELECT * INTO activity FROM activities WHERE activities.data->>'id' = activity_id;
+
+ LOOP
+ --- Ensure that we have an activity before continuing.
+ --- If we don't, the thread is not satisfiable.
+ IF activity IS NULL THEN
+ RETURN false;
+ END IF;
+
+ --- We only care about Create activities.
+ IF activity.data->>'type' != 'Create' THEN
+ RETURN true;
+ END IF;
+
+ --- Normalize the child object into child.
+ SELECT * INTO child FROM objects
+ INNER JOIN activities ON COALESCE(activities.data->'object'->>'id', activities.data->>'object') = objects.data->>'id'
+ WHERE COALESCE(activity.data->'object'->>'id', activity.data->>'object') = objects.data->>'id';
+
+ --- Fetch the author's AS2 following collection.
+ SELECT COALESCE(users.follower_address, '') INTO author_fa FROM users WHERE users.ap_id = activity.actor;
+
+ --- Prepare valid recipients array.
+ valid_recipients := ARRAY[actor, public];
+ --- If we specified local public, add it.
+ IF local_public <> '' THEN
+ valid_recipients := valid_recipients || local_public;
+ END IF;
+ IF ARRAY[author_fa] && actor_user_following THEN
+ valid_recipients := valid_recipients || author_fa;
+ END IF;
+
+ --- Check visibility.
+ IF NOT valid_recipients && activity.recipients THEN
+ --- activity not visible, break out of the loop
+ RETURN false;
+ END IF;
+
+ --- If there's a parent, load it and do this all over again.
+ IF (child.data->'inReplyTo' IS NOT NULL) AND (child.data->'inReplyTo' != 'null'::jsonb) THEN
+ SELECT * INTO activity FROM activities
+ INNER JOIN objects ON COALESCE(activities.data->'object'->>'id', activities.data->>'object') = objects.data->>'id'
+ WHERE child.data->>'inReplyTo' = objects.data->>'id';
+ ELSE
+ RETURN true;
+ END IF;
+ END LOOP;
+ END;
+ $$ LANGUAGE plpgsql IMMUTABLE;
+ """
+ end
+
+ # priv/repo/migrations/20191007073319_create_following_relationships.exs
+ def restore_thread_visibility do
+ """
+ CREATE OR REPLACE FUNCTION thread_visibility(actor varchar, activity_id varchar) RETURNS boolean AS $$
+ DECLARE
+ public varchar := 'https://www.w3.org/ns/activitystreams#Public';
+ child objects%ROWTYPE;
+ activity activities%ROWTYPE;
+ author_fa varchar;
+ valid_recipients varchar[];
+ actor_user_following varchar[];
+ BEGIN
+ --- Fetch actor following
+ SELECT array_agg(following.follower_address) INTO actor_user_following FROM following_relationships
+ JOIN users ON users.id = following_relationships.follower_id
+ JOIN users AS following ON following.id = following_relationships.following_id
+ WHERE users.ap_id = actor;
+
+ --- Fetch our initial activity.
+ SELECT * INTO activity FROM activities WHERE activities.data->>'id' = activity_id;
+
+ LOOP
+ --- Ensure that we have an activity before continuing.
+ --- If we don't, the thread is not satisfiable.
+ IF activity IS NULL THEN
+ RETURN false;
+ END IF;
+
+ --- We only care about Create activities.
+ IF activity.data->>'type' != 'Create' THEN
+ RETURN true;
+ END IF;
+
+ --- Normalize the child object into child.
+ SELECT * INTO child FROM objects
+ INNER JOIN activities ON COALESCE(activities.data->'object'->>'id', activities.data->>'object') = objects.data->>'id'
+ WHERE COALESCE(activity.data->'object'->>'id', activity.data->>'object') = objects.data->>'id';
+
+ --- Fetch the author's AS2 following collection.
+ SELECT COALESCE(users.follower_address, '') INTO author_fa FROM users WHERE users.ap_id = activity.actor;
+
+ --- Prepare valid recipients array.
+ valid_recipients := ARRAY[actor, public];
+ IF ARRAY[author_fa] && actor_user_following THEN
+ valid_recipients := valid_recipients || author_fa;
+ END IF;
+
+ --- Check visibility.
+ IF NOT valid_recipients && activity.recipients THEN
+ --- activity not visible, break out of the loop
+ RETURN false;
+ END IF;
+
+ --- If there's a parent, load it and do this all over again.
+ IF (child.data->'inReplyTo' IS NOT NULL) AND (child.data->'inReplyTo' != 'null'::jsonb) THEN
+ SELECT * INTO activity FROM activities
+ INNER JOIN objects ON COALESCE(activities.data->'object'->>'id', activities.data->>'object') = objects.data->>'id'
+ WHERE child.data->>'inReplyTo' = objects.data->>'id';
+ ELSE
+ RETURN true;
+ END IF;
+ END LOOP;
+ END;
+ $$ LANGUAGE plpgsql IMMUTABLE;
+ """
+ end
+end
diff --git a/priv/repo/migrations/20220718102634_upgrade_oban_to_v11.exs b/priv/repo/migrations/20220718102634_upgrade_oban_to_v11.exs
new file mode 100644
index 000000000..eb9c4986c
--- /dev/null
+++ b/priv/repo/migrations/20220718102634_upgrade_oban_to_v11.exs
@@ -0,0 +1,7 @@
+defmodule Pleroma.Repo.Migrations.UpgradeObanToV11 do
+ use Ecto.Migration
+
+ def up, do: Oban.Migrations.up(version: 11)
+
+ def down, do: Oban.Migrations.down(version: 11)
+end
diff --git a/priv/repo/migrations/20220805123645_remove_remote_cancelled_follow_requests.exs b/priv/repo/migrations/20220805123645_remove_remote_cancelled_follow_requests.exs
new file mode 100644
index 000000000..3159843d1
--- /dev/null
+++ b/priv/repo/migrations/20220805123645_remove_remote_cancelled_follow_requests.exs
@@ -0,0 +1,35 @@
+defmodule Pleroma.Repo.Migrations.RemoveRemoteCancelledFollowRequests do
+ use Ecto.Migration
+
+ def up do
+ statement = """
+ DELETE FROM
+ activities
+ WHERE
+ (data->>'type') = 'Follow'
+ AND
+ (data->>'state') = 'cancelled'
+ AND
+ local = false;
+ """
+
+ execute(statement)
+
+ statement = """
+ DELETE FROM
+ activities
+ WHERE
+ (data->>'type') = 'Undo'
+ AND
+ (data->'object'->>'type') = 'Follow'
+ AND
+ local = false;
+ """
+
+ execute(statement)
+ end
+
+ def down do
+ :ok
+ end
+end
diff --git a/priv/repo/optional_migrations/destructive/remove_null_object_type_records/20220806014830_remove_null_objects.exs b/priv/repo/optional_migrations/destructive/remove_null_object_type_records/20220806014830_remove_null_objects.exs
new file mode 100644
index 000000000..308c3dbf0
--- /dev/null
+++ b/priv/repo/optional_migrations/destructive/remove_null_object_type_records/20220806014830_remove_null_objects.exs
@@ -0,0 +1,14 @@
+defmodule Pleroma.Repo.Migrations.RemoveNullObjects do
+ use Ecto.Migration
+
+ def up do
+ statement = """
+ DELETE FROM objects
+ WHERE (data->>'type') is null;
+ """
+
+ execute(statement)
+ end
+
+ def down, do: :ok
+end
diff --git a/priv/scrubbers/default.ex b/priv/scrubbers/default.ex
index 4694a92a5..153b0be45 100644
--- a/priv/scrubbers/default.ex
+++ b/priv/scrubbers/default.ex
@@ -56,7 +56,7 @@ defmodule Pleroma.HTML.Scrubber.Default do
Meta.allow_tag_with_these_attributes(:u, [])
Meta.allow_tag_with_these_attributes(:ul, [])
- Meta.allow_tag_with_this_attribute_values(:span, "class", ["h-card"])
+ Meta.allow_tag_with_this_attribute_values(:span, "class", ["h-card", "quote-inline"])
Meta.allow_tag_with_these_attributes(:span, [])
Meta.allow_tag_with_this_attribute_values(:code, "class", ["inline"])
@@ -97,5 +97,8 @@ defmodule Pleroma.HTML.Scrubber.Default do
Meta.allow_tag_with_these_attributes(:font, ["face"])
end
+ Meta.allow_tag_with_these_attributes(:center, [])
+ Meta.allow_tag_with_these_attributes(:small, [])
+
Meta.strip_everything_not_covered()
end
diff --git a/priv/static/images/avi.png b/priv/static/images/avi.png
new file mode 100644
index 000000000..bb1134b5f
Binary files /dev/null and b/priv/static/images/avi.png differ
diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld
index e7722cf72..d2b62ba77 100644
--- a/priv/static/schemas/litepub-0.1.jsonld
+++ b/priv/static/schemas/litepub-0.1.jsonld
@@ -17,6 +17,8 @@
"ostatus": "http://ostatus.org#",
"schema": "http://schema.org#",
"toot": "http://joinmastodon.org/ns#",
+ "misskey": "https://misskey-hub.net/ns#",
+ "fedibird": "http://fedibird.com/ns#",
"value": "schema:value",
"sensitive": "as:sensitive",
"litepub": "http://litepub.social/ns#",
@@ -26,6 +28,8 @@
"@id": "litepub:listMessage",
"@type": "@id"
},
+ "quoteUrl": "as:quoteUrl",
+ "quoteUri": "fedibird:quoteUri",
"oauthRegistrationEndpoint": {
"@id": "litepub:oauthRegistrationEndpoint",
"@type": "@id"
diff --git a/rel/files/bin/pleroma_ctl b/rel/files/bin/pleroma_ctl
index 5aebda2fb..d2949e8fe 100755
--- a/rel/files/bin/pleroma_ctl
+++ b/rel/files/bin/pleroma_ctl
@@ -101,6 +101,7 @@ update() {
echo "Restoring erlang cookie"
echo $erlang_cookie > $RELEASE_ROOT/releases/COOKIE
echo "Done! Please refer to the changelog/release notes for changes and update instructions"
+ echo "You probably also want to update your frontend!"
set +e
}
diff --git a/test/config/emoji.txt b/test/config/emoji.txt
index 14dd0c332..e14fc720d 100644
--- a/test/config/emoji.txt
+++ b/test/config/emoji.txt
@@ -1 +1,5 @@
external_emoji, https://example.com/emoji.png
+firefox, /emoji/Firefox.gif, Gif,Fun
+blank, /emoji/blank.png, Fun
+dinosaur, /emoji/dino walking.gif, Gif
+100a, /emoji/100a.png, Fun
diff --git a/test/fixtures/create-pleroma-reply-to-misskey-thread.json b/test/fixtures/create-pleroma-reply-to-misskey-thread.json
new file mode 100644
index 000000000..0c31efa76
--- /dev/null
+++ b/test/fixtures/create-pleroma-reply-to-misskey-thread.json
@@ -0,0 +1,61 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://p.helene.moe/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "actor": "https://p.helene.moe/users/helene",
+ "attachment": [],
+ "attributedTo": "https://p.helene.moe/users/helene",
+ "cc": [
+ "https://p.helene.moe/users/helene/followers"
+ ],
+ "context": "https://p.helene.moe/contexts/cc324643-5583-4c3f-91d2-c6ed37db159d",
+ "conversation": "https://p.helene.moe/contexts/cc324643-5583-4c3f-91d2-c6ed37db159d",
+ "directMessage": false,
+ "id": "https://p.helene.moe/activities/5f80db86-a9bb-4883-9845-fbdbd1478f3a",
+ "object": {
+ "actor": "https://p.helene.moe/users/helene",
+ "attachment": [],
+ "attributedTo": "https://p.helene.moe/users/helene",
+ "cc": [
+ "https://p.helene.moe/users/helene/followers"
+ ],
+ "content": "@mametsuko meow",
+ "context": "https://p.helene.moe/contexts/cc324643-5583-4c3f-91d2-c6ed37db159d",
+ "conversation": "https://p.helene.moe/contexts/cc324643-5583-4c3f-91d2-c6ed37db159d",
+ "id": "https://p.helene.moe/objects/fd5910ac-d9dc-412e-8d1d-914b203296c4",
+ "inReplyTo": "https://mk.absturztau.be/notes/93e7nm8wqg",
+ "published": "2022-08-02T13:46:58.403996Z",
+ "sensitive": null,
+ "source": "@mametsuko@mk.absturztau.be meow",
+ "summary": "",
+ "tag": [
+ {
+ "href": "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "name": "@mametsuko@mk.absturztau.be",
+ "type": "Mention"
+ }
+ ],
+ "to": [
+ "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "type": "Note"
+ },
+ "published": "2022-08-02T13:46:58.403883Z",
+ "tag": [
+ {
+ "href": "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "name": "@mametsuko@mk.absturztau.be",
+ "type": "Mention"
+ }
+ ],
+ "to": [
+ "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "type": "Create"
+}
\ No newline at end of file
diff --git a/test/fixtures/fedibird/quote.json b/test/fixtures/fedibird/quote.json
new file mode 100644
index 000000000..a43cc31e5
--- /dev/null
+++ b/test/fixtures/fedibird/quote.json
@@ -0,0 +1,73 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "fedibird": "http://fedibird.com/ns#",
+ "quoteUri": "fedibird:quoteUri",
+ "expiry": "fedibird:expiry",
+ "references": {
+ "@id": "fedibird:references",
+ "@type": "@id"
+ },
+ "emojiReactions": {
+ "@id": "fedibird:emojiReactions",
+ "@type": "@id"
+ }
+ }
+ ],
+ "id": "https://fedibird.com/users/akkoma_ap_integration_tester/statuses/108707679228362674",
+ "type": "Note",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2022-07-25T11:12:26Z",
+ "url": "https://fedibird.com/@akkoma_ap_integration_tester/108707679228362674",
+ "attributedTo": "https://fedibird.com/users/akkoma_ap_integration_tester",
+ "to": [
+ "https://fedibird.com/users/akkoma_ap_integration_tester/followers"
+ ],
+ "cc": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "sensitive": false,
+ "atomUri": "https://fedibird.com/users/akkoma_ap_integration_tester/statuses/108707679228362674",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:fedibird.com,2022-07-25:objectId=108707679228389900:objectType=Conversation",
+ "context": "https://fedibird.com/contexts/108707679228389900",
+ "quoteUri": "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924",
+ "_misskey_quote": "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924",
+ "_misskey_content": "public quote",
+ "content": "public quote QT: https:// example.com/objects/24d9f 2e1-32d2-4bd5-bdf2-8ea61d3fb5e8 [参照]
",
+ "contentMap": {
+ "ja": "public quote QT: https:// example.com/objects/24d9f 2e1-32d2-4bd5-bdf2-8ea61d3fb5e8 [参照]
"
+ },
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://fedibird.com/users/akkoma_ap_integration_tester/statuses/108707679228362674/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "next": "https://fedibird.com/users/akkoma_ap_integration_tester/statuses/108707679228362674/replies?only_other_accounts=true&page=true",
+ "partOf": "https://fedibird.com/users/akkoma_ap_integration_tester/statuses/108707679228362674/replies",
+ "items": []
+ }
+ },
+ "references": {
+ "id": "https://fedibird.com/users/akkoma_ap_integration_tester/statuses/108707679228362674/references",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "partOf": "https://fedibird.com/users/akkoma_ap_integration_tester/statuses/108707679228362674/references",
+ "items": [
+ "https://example.com/objects/24d9f2e1-32d2-4bd5-bdf2-8ea61d3fb5e8"
+ ]
+ }
+ }
+}
diff --git a/test/fixtures/mastodon/featured_collection.json b/test/fixtures/mastodon/featured_collection.json
new file mode 100644
index 000000000..32727dc05
--- /dev/null
+++ b/test/fixtures/mastodon/featured_collection.json
@@ -0,0 +1,20 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount"
+ }
+ ],
+ "id": "https://example.com/users/alisaie/collections/featured",
+ "type": "OrderedCollection",
+ "totalItems": 5,
+ "orderedItems": [
+ "https://example.com/users/alisaie/statuses/108311386746229284"
+ ]
+}
diff --git a/test/fixtures/mewmew_no_name.json b/test/fixtures/mewmew_no_name.json
index 532d4cf70..08e245254 100644
--- a/test/fixtures/mewmew_no_name.json
+++ b/test/fixtures/mewmew_no_name.json
@@ -8,7 +8,6 @@
],
"attachment" : [],
"capabilities" : {
- "acceptsChatMessages" : true
},
"discoverable" : false,
"endpoints" : {
diff --git a/test/fixtures/misskey/quote.json b/test/fixtures/misskey/quote.json
new file mode 100644
index 000000000..487461020
--- /dev/null
+++ b/test/fixtures/misskey/quote.json
@@ -0,0 +1,50 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey-hub.net/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://misskey.io/notes/934gok3482",
+ "type": "Note",
+ "attributedTo": "https://misskey.io/users/93492q0ip0",
+ "summary": null,
+ "content": "i quompt u RE: https://example.com/objects/30c543fb-a165-40dd-87fd-4e249ec5a40b
",
+ "_misskey_content": "i quompt u",
+ "source": {
+ "content": "i quompt u",
+ "mediaType": "text/x.misskeymarkdown"
+ },
+ "_misskey_quote": "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924",
+ "quoteUrl": "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924",
+ "published": "2022-07-25T15:21:48.208Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://misskey.io/users/93492q0ip0/followers"
+ ],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
diff --git a/test/fixtures/misskey/recursive_quote.json b/test/fixtures/misskey/recursive_quote.json
new file mode 100644
index 000000000..f2f66521a
--- /dev/null
+++ b/test/fixtures/misskey/recursive_quote.json
@@ -0,0 +1,48 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey-hub.net/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://misskey.io/notes/934gok3482",
+ "type": "Note",
+ "attributedTo": "https://misskey.io/users/93492q0ip0",
+ "summary": null,
+ "content": "i quompt u
",
+ "_misskey_content": "i quompt u",
+ "source": {
+ "content": "i quompt u",
+ "mediaType": "text/x.misskeymarkdown"
+ },
+ "_misskey_quote": "https://misskey.io/notes/934gok3482",
+ "quoteUrl": "https://misskey.io/notes/934gok3482",
+ "published": "2022-07-25T15:21:48.208Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
diff --git a/test/fixtures/quote_post/fedibird_quote_post.json b/test/fixtures/quote_post/fedibird_quote_post.json
new file mode 100644
index 000000000..ebf383356
--- /dev/null
+++ b/test/fixtures/quote_post/fedibird_quote_post.json
@@ -0,0 +1,52 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "expiry": "toot:expiry"
+ }
+ ],
+ "id": "https://fedibird.com/users/noellabo/statuses/107663670404015196",
+ "type": "Note",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2022-01-22T02:07:16Z",
+ "url": "https://fedibird.com/@noellabo/107663670404015196",
+ "attributedTo": "https://fedibird.com/users/noellabo",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://fedibird.com/users/noellabo/followers"
+ ],
+ "sensitive": false,
+ "atomUri": "https://fedibird.com/users/noellabo/statuses/107663670404015196",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:fedibird.com,2022-01-22:objectId=107663670404038002:objectType=Conversation",
+ "context": "https://fedibird.com/contexts/107663670404038002",
+ "quoteURL": "https://misskey.io/notes/8vsn2izjwh",
+ "_misskey_quote": "https://misskey.io/notes/8vsn2izjwh",
+ "_misskey_content": "いつの生まれだシトリン",
+ "content": "いつの生まれだシトリン QT: https:// misskey.io/notes/8vsn2izjwh
",
+ "contentMap": {
+ "ja": "いつの生まれだシトリン QT: https:// misskey.io/notes/8vsn2izjwh
"
+ },
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "next": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies?only_other_accounts=true&page=true",
+ "partOf": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies",
+ "items": []
+ }
+ }
+}
diff --git a/test/fixtures/quote_post/fedibird_quote_uri.json b/test/fixtures/quote_post/fedibird_quote_uri.json
new file mode 100644
index 000000000..7c328fdb9
--- /dev/null
+++ b/test/fixtures/quote_post/fedibird_quote_uri.json
@@ -0,0 +1,54 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "fedibird": "http://fedibird.com/ns#",
+ "quoteUri": "fedibird:quoteUri",
+ "expiry": "fedibird:expiry"
+ }
+ ],
+ "id": "https://fedibird.com/users/noellabo/statuses/107699335988346142",
+ "type": "Note",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2022-01-28T09:17:30Z",
+ "url": "https://fedibird.com/@noellabo/107699335988346142",
+ "attributedTo": "https://fedibird.com/users/noellabo",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://fedibird.com/users/noellabo/followers"
+ ],
+ "sensitive": false,
+ "atomUri": "https://fedibird.com/users/noellabo/statuses/107699335988346142",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:fedibird.com,2022-01-28:objectId=107699335988345290:objectType=Conversation",
+ "context": "https://fedibird.com/contexts/107699335988345290",
+ "quoteUri": "https://fedibird.com/users/yamako/statuses/107699333438289729",
+ "_misskey_quote": "https://fedibird.com/users/yamako/statuses/107699333438289729",
+ "_misskey_content": "美味しそう",
+ "content": "美味しそう QT: https:// fedibird.com/@yamako/107699333 438289729
",
+ "contentMap": {
+ "ja": "美味しそう QT: https:// fedibird.com/@yamako/107699333 438289729
"
+ },
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://fedibird.com/users/noellabo/statuses/107699335988346142/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "next": "https://fedibird.com/users/noellabo/statuses/107699335988346142/replies?only_other_accounts=true&page=true",
+ "partOf": "https://fedibird.com/users/noellabo/statuses/107699335988346142/replies",
+ "items": []
+ }
+ }
+}
diff --git a/test/fixtures/quote_post/misskey_quote_post.json b/test/fixtures/quote_post/misskey_quote_post.json
new file mode 100644
index 000000000..59f677ca9
--- /dev/null
+++ b/test/fixtures/quote_post/misskey_quote_post.json
@@ -0,0 +1,46 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey.io/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://misskey.io/notes/8vs6ylpfez",
+ "type": "Note",
+ "attributedTo": "https://misskey.io/users/7rkrarq81i",
+ "summary": null,
+ "content": "投稿者の設定によるね Fanboxについても投稿者によっては過去の投稿は高額なプランに移動してることがある RE: https://misskey.io/notes/8vs6wxufd0
",
+ "_misskey_content": "投稿者の設定によるね\nFanboxについても投稿者によっては過去の投稿は高額なプランに移動してることがある",
+ "_misskey_quote": "https://misskey.io/notes/8vs6wxufd0",
+ "quoteUrl": "https://misskey.io/notes/8vs6wxufd0",
+ "published": "2022-01-21T16:38:30.243Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://misskey.io/users/7rkrarq81i/followers"
+ ],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
diff --git a/test/fixtures/quoted_status.json b/test/fixtures/quoted_status.json
new file mode 100644
index 000000000..5030d1a2d
--- /dev/null
+++ b/test/fixtures/quoted_status.json
@@ -0,0 +1,38 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://example.com/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "actor": "https://example.com/users/user",
+ "attachment": [
+ {
+ "mediaType": "image/png",
+ "name": "",
+ "type": "Document",
+ "url": "https://example.com/media/4d6097ae20200ac371f51d24eae0a94cb4b424b6aff81dcc0f7411b1a74c796f.png"
+ }
+ ],
+ "attributedTo": "https://example.com/users/user",
+ "cc": [
+ "https://example.com/users/user/followers"
+ ],
+ "content": "",
+ "context": "https://example.com/contexts/c2c52511-977e-4168-996c-bcf006789dca",
+ "conversation": "https://example.com/contexts/c2c52511-977e-4168-996c-bcf006789dca",
+ "id": "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924",
+ "published": "2022-07-24T17:25:51.614495Z",
+ "sensitive": null,
+ "source": {
+ "content": "",
+ "mediaType": "text/plain"
+ },
+ "summary": "",
+ "tag": [],
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "type": "Note"
+}
diff --git a/test/fixtures/runtime_modules/first.ex b/test/fixtures/runtime_modules/first.ex
new file mode 100644
index 000000000..2b663a1b0
--- /dev/null
+++ b/test/fixtures/runtime_modules/first.ex
@@ -0,0 +1,2 @@
+defmodule DynamicModule.First do
+end
diff --git a/test/fixtures/runtime_modules/nope.exs b/test/fixtures/runtime_modules/nope.exs
new file mode 100644
index 000000000..8fe676af6
--- /dev/null
+++ b/test/fixtures/runtime_modules/nope.exs
@@ -0,0 +1 @@
+def thisisnotloaded
diff --git a/test/fixtures/runtime_modules/subdir/second.ex b/test/fixtures/runtime_modules/subdir/second.ex
new file mode 100644
index 000000000..22dc046c6
--- /dev/null
+++ b/test/fixtures/runtime_modules/subdir/second.ex
@@ -0,0 +1,2 @@
+defmodule DynamicModule.Second do
+end
diff --git a/test/fixtures/tesla_mock/framatube.org_host_meta b/test/fixtures/tesla_mock/framatube.org_host_meta
index 91516ff6d..02e25bd64 100644
--- a/test/fixtures/tesla_mock/framatube.org_host_meta
+++ b/test/fixtures/tesla_mock/framatube.org_host_meta
@@ -1,2 +1,2 @@
-framatube.org Resource Descriptor
+framatube.org Resource Descriptor
diff --git a/test/fixtures/tesla_mock/helene@p.helene.moe.json b/test/fixtures/tesla_mock/helene@p.helene.moe.json
new file mode 100644
index 000000000..d7444817f
--- /dev/null
+++ b/test/fixtures/tesla_mock/helene@p.helene.moe.json
@@ -0,0 +1,50 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://p.helene.moe/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "alsoKnownAs": [],
+ "attachment": [
+ {
+ "name": "Timezone",
+ "type": "PropertyValue",
+ "value": "UTC+2 (Paris/Berlin)"
+ }
+ ],
+ "capabilities": {
+ "acceptsChatMessages": true
+ },
+ "discoverable": true,
+ "endpoints": {
+ "oauthAuthorizationEndpoint": "https://p.helene.moe/oauth/authorize",
+ "oauthRegistrationEndpoint": "https://p.helene.moe/api/v1/apps",
+ "oauthTokenEndpoint": "https://p.helene.moe/oauth/token",
+ "sharedInbox": "https://p.helene.moe/inbox",
+ "uploadMedia": "https://p.helene.moe/api/ap/upload_media"
+ },
+ "featured": "https://p.helene.moe/users/helene/collections/featured",
+ "followers": "https://p.helene.moe/users/helene/followers",
+ "following": "https://p.helene.moe/users/helene/following",
+ "icon": {
+ "type": "Image",
+ "url": "https://p.helene.moe/media/9a39209daa5a66b7ebb0547b08bf8360aa9d8d65a4ffba2603c6ffbe6aecb432.jpg"
+ },
+ "id": "https://p.helene.moe/users/helene",
+ "inbox": "https://p.helene.moe/users/helene/inbox",
+ "manuallyApprovesFollowers": false,
+ "name": "Hélène",
+ "outbox": "https://p.helene.moe/users/helene/outbox",
+ "preferredUsername": "helene",
+ "publicKey": {
+ "id": "https://p.helene.moe/users/helene#main-key",
+ "owner": "https://p.helene.moe/users/helene",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtoSBPU/VS2Kx3f6ap3zv\nZVacJsgUfaoFb3c2ii/FRh9RmRVlarq8sJXcjsQt1e0oxWaWJaIDDwyKZPt6hXae\nrY/AiGGeNu+NA+BtY7l7+9Yu67HUyT62+1qAwYHKBXX3fLOPs/YmQI0Tt0c4wKAG\nKEkiYsRizghgpzUC6jqdKV71DJkUZ8yhckCGb2fLko1ajbWEssdaP51aLsyRMyC2\nuzeWrxtD4O/HG0ea4S6y5X6hnsAHIK4Y3nnyIQ6pn4tOsl3HgqkjXE9MmZSvMCFx\nBq89TfZrVXNa2gSZdZLdbbJstzEScQWNt1p6tA6rM+e4JXYGr+rMdF3G+jV7afI2\nFQIDAQAB\n-----END PUBLIC KEY-----\n\n"
+ },
+ "summary": "I can speak: Français, English, Deutsch (nicht sehr gut), 日本語 (not very well)",
+ "tag": [],
+ "type": "Person",
+ "url": "https://p.helene.moe/users/helene"
+}
\ No newline at end of file
diff --git a/test/fixtures/tesla_mock/mametsuko@mk.absturztau.be.json b/test/fixtures/tesla_mock/mametsuko@mk.absturztau.be.json
new file mode 100644
index 000000000..d8c13f775
--- /dev/null
+++ b/test/fixtures/tesla_mock/mametsuko@mk.absturztau.be.json
@@ -0,0 +1,65 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey-hub.net/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "type": "Person",
+ "id": "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "inbox": "https://mk.absturztau.be/users/8ozbzjs3o8/inbox",
+ "outbox": "https://mk.absturztau.be/users/8ozbzjs3o8/outbox",
+ "followers": "https://mk.absturztau.be/users/8ozbzjs3o8/followers",
+ "following": "https://mk.absturztau.be/users/8ozbzjs3o8/following",
+ "featured": "https://mk.absturztau.be/users/8ozbzjs3o8/collections/featured",
+ "sharedInbox": "https://mk.absturztau.be/inbox",
+ "endpoints": {
+ "sharedInbox": "https://mk.absturztau.be/inbox"
+ },
+ "url": "https://mk.absturztau.be/@mametsuko",
+ "preferredUsername": "mametsuko",
+ "name": "mametschko",
+ "summary": "nya, ich bin eine Brotperson
",
+ "icon": {
+ "type": "Image",
+ "url": "https://mk.absturztau.be/files/webpublic-3b5594f4-fa52-4548-b4e3-c379ae2143ed",
+ "sensitive": false,
+ "name": null
+ },
+ "image": {
+ "type": "Image",
+ "url": "https://mk.absturztau.be/files/webpublic-0d03b03d-b14b-4916-ac3d-8a137118ec84",
+ "sensitive": false,
+ "name": null
+ },
+ "tag": [],
+ "manuallyApprovesFollowers": true,
+ "discoverable": false,
+ "publicKey": {
+ "id": "https://mk.absturztau.be/users/8ozbzjs3o8#main-key",
+ "type": "Key",
+ "owner": "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuN/S1spBGmh8FXI1Bt16\nXB7Cc0QutBp7UPgmDNHjOfsq0zrF4g3L1UBxvrpU0XX77XPMCd9yPvGwAYURH2mv\ntIcYuE+R90VLDmBu5MTVthcG2D874eCZ2rD2YsEYmN5AjTX7QBIqCck+qDhVWkkM\nEZ6S5Ht6IJ5Of74eKffXElQI/C6QB+9uEDOmPk0jCzgI5gw7xvJqFj/DIF4kUUAu\nA89JqaFZzZlkrSrj4cr48bLN/YOmpdaHu0BKHaDSHct4+MqlixqovgdB6RboCEDw\ne4Aeav7+Q0Y9oGIvuggg0Q+nCubnVNnaPyzd817tpPVzyZmTts+DKyDuv90SX3nR\nsPaNa5Ty60eqplUk4b7X1gSvuzBJUFBxTVV84WnjwoeoydaS6rSyjCDPGLBjaByc\nFyWMMEb/zlQyhLZfBlvT7k96wRSsMszh2hDALWmgYIhq/jNwINvALJ1GKLNHHKZ4\nyz2LnxVpRm2rWrZzbvtcnSQOt3LaPSZn8Wgwv4buyHF02iuVuIamZVtKexsE1Ixl\nIi9qa3AKEc5gOzYXhRhvHaruzoCehUbb/UHC5c8Tto8L5G1xYzjLP3qj3PT9w/wM\n+k1Ra/4JhuAnVFROOoOmx9rIELLHH7juY2nhM7plGhyt1M5gysgqEloij8QzyQU2\nZK1YlAERG2XFO6br8omhcmECAwEAAQ==\n-----END PUBLIC KEY-----\n"
+ },
+ "isCat": true,
+ "vcard:Address": "Vienna, Austria"
+}
\ No newline at end of file
diff --git a/test/fixtures/tesla_mock/mk.absturztau.be-93e7nm8wqg.json b/test/fixtures/tesla_mock/mk.absturztau.be-93e7nm8wqg.json
new file mode 100644
index 000000000..1b931a9a4
--- /dev/null
+++ b/test/fixtures/tesla_mock/mk.absturztau.be-93e7nm8wqg.json
@@ -0,0 +1,44 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey-hub.net/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://mk.absturztau.be/notes/93e7nm8wqg",
+ "type": "Note",
+ "attributedTo": "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "summary": null,
+ "content": "meow
",
+ "_misskey_content": "meow",
+ "published": "2022-08-01T11:06:49.568Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://mk.absturztau.be/users/8ozbzjs3o8/followers"
+ ],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
\ No newline at end of file
diff --git a/test/fixtures/tesla_mock/p.helene.moe-AM7S6vZQmL6pI9TgPY.json b/test/fixtures/tesla_mock/p.helene.moe-AM7S6vZQmL6pI9TgPY.json
new file mode 100644
index 000000000..a1ef5e20b
--- /dev/null
+++ b/test/fixtures/tesla_mock/p.helene.moe-AM7S6vZQmL6pI9TgPY.json
@@ -0,0 +1,36 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://p.helene.moe/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "actor": "https://p.helene.moe/users/helene",
+ "attachment": [],
+ "attributedTo": "https://p.helene.moe/users/helene",
+ "cc": [
+ "https://p.helene.moe/users/helene/followers"
+ ],
+ "content": "@mametsuko meow",
+ "context": "https://p.helene.moe/contexts/cc324643-5583-4c3f-91d2-c6ed37db159d",
+ "conversation": "https://p.helene.moe/contexts/cc324643-5583-4c3f-91d2-c6ed37db159d",
+ "id": "https://p.helene.moe/objects/fd5910ac-d9dc-412e-8d1d-914b203296c4",
+ "inReplyTo": "https://mk.absturztau.be/notes/93e7nm8wqg",
+ "published": "2022-08-02T13:46:58.403996Z",
+ "sensitive": null,
+ "source": "@mametsuko@mk.absturztau.be meow",
+ "summary": "",
+ "tag": [
+ {
+ "href": "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "name": "@mametsuko@mk.absturztau.be",
+ "type": "Mention"
+ }
+ ],
+ "to": [
+ "https://mk.absturztau.be/users/8ozbzjs3o8",
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "type": "Note"
+}
\ No newline at end of file
diff --git a/test/fixtures/tesla_mock/status.alpicola.com_host_meta b/test/fixtures/tesla_mock/status.alpicola.com_host_meta
index 6948c30ea..78155f644 100644
--- a/test/fixtures/tesla_mock/status.alpicola.com_host_meta
+++ b/test/fixtures/tesla_mock/status.alpicola.com_host_meta
@@ -1,2 +1,2 @@
-status.alpicola.com Resource Descriptor
\ No newline at end of file
+status.alpicola.com Resource Descriptor
diff --git a/test/fixtures/webfinger/masto-host-meta.xml b/test/fixtures/webfinger/masto-host-meta.xml
new file mode 100644
index 000000000..f432a27c3
--- /dev/null
+++ b/test/fixtures/webfinger/masto-host-meta.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/test/fixtures/webfinger/masto-user.json b/test/fixtures/webfinger/masto-user.json
new file mode 100644
index 000000000..1702de011
--- /dev/null
+++ b/test/fixtures/webfinger/masto-user.json
@@ -0,0 +1,92 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "toot": "http://joinmastodon.org/ns#",
+ "featured": {
+ "@id": "toot:featured",
+ "@type": "@id"
+ },
+ "featuredTags": {
+ "@id": "toot:featuredTags",
+ "@type": "@id"
+ },
+ "alsoKnownAs": {
+ "@id": "as:alsoKnownAs",
+ "@type": "@id"
+ },
+ "movedTo": {
+ "@id": "as:movedTo",
+ "@type": "@id"
+ },
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "IdentityProof": "toot:IdentityProof",
+ "discoverable": "toot:discoverable",
+ "Device": "toot:Device",
+ "Ed25519Signature": "toot:Ed25519Signature",
+ "Ed25519Key": "toot:Ed25519Key",
+ "Curve25519Key": "toot:Curve25519Key",
+ "EncryptedMessage": "toot:EncryptedMessage",
+ "publicKeyBase64": "toot:publicKeyBase64",
+ "deviceId": "toot:deviceId",
+ "claim": {
+ "@type": "@id",
+ "@id": "toot:claim"
+ },
+ "fingerprintKey": {
+ "@type": "@id",
+ "@id": "toot:fingerprintKey"
+ },
+ "identityKey": {
+ "@type": "@id",
+ "@id": "toot:identityKey"
+ },
+ "devices": {
+ "@type": "@id",
+ "@id": "toot:devices"
+ },
+ "messageFranking": "toot:messageFranking",
+ "messageType": "toot:messageType",
+ "cipherText": "toot:cipherText",
+ "suspended": "toot:suspended",
+ "focalPoint": {
+ "@container": "@list",
+ "@id": "toot:focalPoint"
+ }
+ }
+ ],
+ "id": "https://{{domain}}/users/{{nickname}}",
+ "type": "Person",
+ "following": "https://{{domain}}/users/{{nickname}}/following",
+ "followers": "https://{{domain}}/users/{{nickname}}/followers",
+ "inbox": "https://{{domain}}/users/{{nickname}}/inbox",
+ "outbox": "https://{{domain}}/users/{{nickname}}/outbox",
+ "featured": "https://{{domain}}/users/{{nickname}}/collections/featured",
+ "featuredTags": "https://{{domain}}/users/{{nickname}}/collections/tags",
+ "preferredUsername": "{{nickname}}",
+ "name": "Name Name",
+ "summary": "Summary
",
+ "url": "https://{{domain}}/@{{nickname}}",
+ "manuallyApprovesFollowers": false,
+ "discoverable": false,
+ "devices": "https://{{domain}}/users/{{nickname}}/collections/devices",
+ "publicKey": {
+ "id": "https://{{domain}}/users/{{nickname}}#main-key",
+ "owner": "https://{{domain}}/users/{{nickname}}",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvwDujxmxoYHs64MyVB3L\nG5ZyBxV3ufaMRBFu42bkcTpISq1WwZ+3Zb6CI8zOO+nM+Q2llrVRYjZa4ZFnOLvM\nTq/Kf+Zf5wy2aCRer88gX+MsJOAtItSi412y0a/rKOuFaDYLOLeTkRvmGLgZWbsr\nZJOp+YWb3zQ5qsIOInkc5BwI172tMsGeFtsnbNApPV4lrmtTGaJ8RiM8MR7XANBO\nfOHggSt1+eAIKGIsCmINEMzs1mG9D75xKtC/sM8GfbvBclQcBstGkHAEj1VHPW0c\nh6Bok5/QQppicyb8UA1PAA9bznSFtKlYE4xCH8rlCDSDTBRtdnBWHKcj619Ujz4Q\nawIDAQAB\n-----END PUBLIC KEY-----\n"
+ },
+ "tag": [],
+ "attachment": [],
+ "endpoints": {
+ "sharedInbox": "https://{{domain}}/inbox"
+ },
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/jpeg",
+ "url": "https://s3.wasabisys.com/merp/accounts/avatars/000/000/001/original/6fdd3eee632af247.jpg"
+ }
+}
diff --git a/test/fixtures/webfinger/masto-webfinger.json b/test/fixtures/webfinger/masto-webfinger.json
new file mode 100644
index 000000000..561be3fff
--- /dev/null
+++ b/test/fixtures/webfinger/masto-webfinger.json
@@ -0,0 +1,23 @@
+{
+ "subject": "acct:{{nickname}}@{{domain}}",
+ "aliases": [
+ "https://{{subdomain}}/@{{nickname}}",
+ "https://{{subdomain}}/users/{{nickname}}"
+ ],
+ "links": [
+ {
+ "rel": "http://webfinger.net/rel/profile-page",
+ "type": "text/html",
+ "href": "https://{{subdomain}}/@{{nickname}}"
+ },
+ {
+ "rel": "self",
+ "type": "application/activity+json",
+ "href": "https://{{subdomain}}/users/{{nickname}}"
+ },
+ {
+ "rel": "http://ostatus.org/schema/1.0/subscribe",
+ "template": "https://{{subdomain}}/authorize_interaction?uri={uri}"
+ }
+ ]
+}
diff --git a/test/fixtures/webfinger/pleroma-host-meta.xml b/test/fixtures/webfinger/pleroma-host-meta.xml
new file mode 100644
index 000000000..88c274a1a
--- /dev/null
+++ b/test/fixtures/webfinger/pleroma-host-meta.xml
@@ -0,0 +1 @@
+
diff --git a/test/fixtures/webfinger/pleroma-user.json b/test/fixtures/webfinger/pleroma-user.json
new file mode 100644
index 000000000..b822db46c
--- /dev/null
+++ b/test/fixtures/webfinger/pleroma-user.json
@@ -0,0 +1,58 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://{{domain}}/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "alsoKnownAs": [],
+ "attachment": [],
+ "capabilities": {
+ "acceptsChatMessages": true
+ },
+ "discoverable": true,
+ "endpoints": {
+ "oauthAuthorizationEndpoint": "https://{{domain}}/oauth/authorize",
+ "oauthRegistrationEndpoint": "https://{{domain}}/api/v1/apps",
+ "oauthTokenEndpoint": "https://{{domain}}/oauth/token",
+ "sharedInbox": "https://{{domain}}/inbox",
+ "uploadMedia": "https://{{domain}}/api/ap/upload_media"
+ },
+ "followers": "https://{{domain}}/users/{{nickname}}/followers",
+ "following": "https://{{domain}}/users/{{nickname}}/following",
+ "icon": {
+ "type": "Image",
+ "url": "https://{{domain}}/media/a932a27f158b63c3a97e3a57d5384f714a82249274c6fc66c9eca581b4fd8af2.jpg"
+ },
+ "id": "https://{{domain}}/users/{{nickname}}",
+ "image": {
+ "type": "Image",
+ "url": "https://{{domain}}/media/db15f476d0ad14488db4762b7800479e6ef67b1824f8b9ea5c1fa05b7525c5b7.jpg"
+ },
+ "inbox": "https://{{domain}}/users/{{nickname}}/inbox",
+ "manuallyApprovesFollowers": false,
+ "name": "{{nickname}} :verified:",
+ "outbox": "https://{{domain}}/users/{{nickname}}/outbox",
+ "preferredUsername": "{{nickname}}",
+ "publicKey": {
+ "id": "https://{{domain}}/users/{{nickname}}#main-key",
+ "owner": "https://{{domain}}/users/{{nickname}}",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu4XOAopC4nRIxNlHlt60\n//nCicuedu5wvLGIoQ+KUM2u7/PhLrrTDEqr1A7yQL95S0X8ryYtALgFLI5A54ww\nqjMIbIGAs44lEmDLMEd+XI+XxREE8wdsFpb4QQzWug0DTyqlMouTU25k0tfKh1rF\n4PMJ3uBSjDTAGgFvLNyFWTiVVgChbTNgGOmrEBucRl4NmKzQ69/FIUwENV88oQSU\n3bWvQTEH9rWH1rCLpkmQwdRiWfnhFX/4EUqXukfgoskvenKR8ff3nYhElDqFoE0e\nqUnIW1OZceyl8JewVLcL6m0/wdKeosTsfrcWc8DKfnRYQcBGNoBEq9GrOHDU0q2v\nyQIDAQAB\n-----END PUBLIC KEY-----\n\n"
+ },
+ "summary": "Pleroma BE dev",
+ "tag": [
+ {
+ "icon": {
+ "type": "Image",
+ "url": "https://{{domain}}/emoji/mine/6143373a807b1ae7.png"
+ },
+ "id": "https://{{domain}}/emoji/mine/6143373a807b1ae7.png",
+ "name": ":verified:",
+ "type": "Emoji",
+ "updated": "1970-01-01T00:00:00Z"
+ }
+ ],
+ "type": "Person",
+ "url": "https://{{domain}}/users/{{nickname}}"
+}
diff --git a/test/fixtures/webfinger/pleroma-webfinger.json b/test/fixtures/webfinger/pleroma-webfinger.json
new file mode 100644
index 000000000..8f075eaaf
--- /dev/null
+++ b/test/fixtures/webfinger/pleroma-webfinger.json
@@ -0,0 +1,27 @@
+{
+ "aliases": [
+ "https://{{subdomain}}/users/{{nickname}}"
+ ],
+ "links": [
+ {
+ "href": "https://{{subdomain}}/users/{{nickname}}",
+ "rel": "http://webfinger.net/rel/profile-page",
+ "type": "text/html"
+ },
+ {
+ "href": "https://{{subdomain}}/users/{{nickname}}",
+ "rel": "self",
+ "type": "application/activity+json"
+ },
+ {
+ "href": "https://{{subdomain}}/users/{{nickname}}",
+ "rel": "self",
+ "type": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\""
+ },
+ {
+ "rel": "http://ostatus.org/schema/1.0/subscribe",
+ "template": "https://{{subdomain}}/ostatus_subscribe?acct={uri}"
+ }
+ ],
+ "subject": "acct:{{nickname}}@{{domain}}"
+}
diff --git a/test/mix/tasks/pleroma/config_test.exs b/test/mix/tasks/pleroma/config_test.exs
index 2b8252db7..d5e038bee 100644
--- a/test/mix/tasks/pleroma/config_test.exs
+++ b/test/mix/tasks/pleroma/config_test.exs
@@ -129,7 +129,6 @@ test "load a settings with large values and pass to file", %{temp_file: temp_fil
notify_email: "noreply@example.com",
description: "A Pleroma instance, an alternative fediverse server",
limit: 5_000,
- chat_limit: 5_000,
remote_limit: 100_000,
upload_limit: 16_000_000,
avatar_upload_limit: 2_000_000,
@@ -189,7 +188,7 @@ test "load a settings with large values and pass to file", %{temp_file: temp_fil
{:ok, file} = File.read(temp_file)
assert file ==
- "import Config\n\nconfig :pleroma, :instance,\n name: \"Pleroma\",\n email: \"example@example.com\",\n notify_email: \"noreply@example.com\",\n description: \"A Pleroma instance, an alternative fediverse server\",\n limit: 5000,\n chat_limit: 5000,\n remote_limit: 100_000,\n upload_limit: 16_000_000,\n avatar_upload_limit: 2_000_000,\n background_upload_limit: 4_000_000,\n banner_upload_limit: 4_000_000,\n poll_limits: %{\n max_expiration: 31_536_000,\n max_option_chars: 200,\n max_options: 20,\n min_expiration: 0\n },\n registrations_open: true,\n federating: true,\n federation_incoming_replies_max_depth: 100,\n federation_reachability_timeout_days: 7,\n federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher],\n allow_relay: true,\n public: true,\n quarantined_instances: [],\n managed_config: true,\n static_dir: \"instance/static/\",\n allowed_post_formats: [\"text/plain\", \"text/html\", \"text/markdown\", \"text/bbcode\"],\n autofollowed_nicknames: [],\n max_pinned_statuses: 1,\n attachment_links: false,\n max_report_comment_size: 1000,\n safe_dm_mentions: false,\n healthcheck: false,\n remote_post_retention_days: 90,\n skip_thread_containment: true,\n limit_to_local_content: :unauthenticated,\n user_bio_length: 5000,\n user_name_length: 100,\n max_account_fields: 10,\n max_remote_account_fields: 20,\n account_field_name_length: 512,\n account_field_value_length: 2048,\n external_user_synchronization: true,\n extended_nickname_format: true,\n multi_factor_authentication: [\n totp: [digits: 6, period: 30],\n backup_codes: [number: 2, length: 6]\n ]\n"
+ "import Config\n\nconfig :pleroma, :instance,\n name: \"Pleroma\",\n email: \"example@example.com\",\n notify_email: \"noreply@example.com\",\n description: \"A Pleroma instance, an alternative fediverse server\",\n limit: 5000,\n remote_limit: 100_000,\n upload_limit: 16_000_000,\n avatar_upload_limit: 2_000_000,\n background_upload_limit: 4_000_000,\n banner_upload_limit: 4_000_000,\n poll_limits: %{\n max_expiration: 31_536_000,\n max_option_chars: 200,\n max_options: 20,\n min_expiration: 0\n },\n registrations_open: true,\n federating: true,\n federation_incoming_replies_max_depth: 100,\n federation_reachability_timeout_days: 7,\n federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher],\n allow_relay: true,\n public: true,\n quarantined_instances: [],\n managed_config: true,\n static_dir: \"instance/static/\",\n allowed_post_formats: [\"text/plain\", \"text/html\", \"text/markdown\", \"text/bbcode\"],\n autofollowed_nicknames: [],\n max_pinned_statuses: 1,\n attachment_links: false,\n max_report_comment_size: 1000,\n safe_dm_mentions: false,\n healthcheck: false,\n remote_post_retention_days: 90,\n skip_thread_containment: true,\n limit_to_local_content: :unauthenticated,\n user_bio_length: 5000,\n user_name_length: 100,\n max_account_fields: 10,\n max_remote_account_fields: 20,\n account_field_name_length: 512,\n account_field_value_length: 2048,\n external_user_synchronization: true,\n extended_nickname_format: true,\n multi_factor_authentication: [\n totp: [digits: 6, period: 30],\n backup_codes: [number: 2, length: 6]\n ]\n"
end
end
diff --git a/test/pleroma/announcement_read_relationship_test.exs b/test/pleroma/announcement_read_relationship_test.exs
new file mode 100644
index 000000000..5fd4ffbef
--- /dev/null
+++ b/test/pleroma/announcement_read_relationship_test.exs
@@ -0,0 +1,40 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.AnnouncementReadRelationshipTest do
+ alias Pleroma.AnnouncementReadRelationship
+
+ use Pleroma.DataCase, async: true
+
+ import Pleroma.Factory
+
+ setup do
+ {:ok, user: insert(:user), announcement: insert(:announcement)}
+ end
+
+ describe "mark_read/2" do
+ test "should insert relationship", %{user: user, announcement: announcement} do
+ {:ok, _} = AnnouncementReadRelationship.mark_read(user, announcement)
+
+ assert AnnouncementReadRelationship.exists?(user, announcement)
+ end
+ end
+
+ describe "mark_unread/2" do
+ test "should delete relationship", %{user: user, announcement: announcement} do
+ {:ok, _} = AnnouncementReadRelationship.mark_read(user, announcement)
+
+ assert :ok = AnnouncementReadRelationship.mark_unread(user, announcement)
+ refute AnnouncementReadRelationship.exists?(user, announcement)
+ end
+
+ test "should not fail if relationship does not exist", %{
+ user: user,
+ announcement: announcement
+ } do
+ assert :ok = AnnouncementReadRelationship.mark_unread(user, announcement)
+ refute AnnouncementReadRelationship.exists?(user, announcement)
+ end
+ end
+end
diff --git a/test/pleroma/announcement_test.exs b/test/pleroma/announcement_test.exs
new file mode 100644
index 000000000..a007c3718
--- /dev/null
+++ b/test/pleroma/announcement_test.exs
@@ -0,0 +1,98 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.AnnouncementTest do
+ alias Pleroma.Announcement
+
+ use Pleroma.DataCase, async: true
+
+ import Pleroma.Factory
+
+ describe "list_all_visible_when/1" do
+ setup do: {:ok, time: NaiveDateTime.utc_now()}
+
+ test "with no start or end time", %{time: time} do
+ _announcement = insert(:announcement)
+
+ assert [_] = Announcement.list_all_visible_when(time)
+ end
+
+ test "with start time before current", %{time: time} do
+ before_now = NaiveDateTime.add(time, -10, :second)
+
+ _announcement = insert(:announcement, %{starts_at: before_now})
+
+ assert [_] = Announcement.list_all_visible_when(time)
+ end
+
+ test "with start time after current", %{time: time} do
+ after_now = NaiveDateTime.add(time, 10, :second)
+
+ _announcement = insert(:announcement, %{starts_at: after_now})
+
+ assert [] = Announcement.list_all_visible_when(time)
+ end
+
+ test "with end time after current", %{time: time} do
+ after_now = NaiveDateTime.add(time, 10, :second)
+
+ _announcement = insert(:announcement, %{ends_at: after_now})
+
+ assert [_] = Announcement.list_all_visible_when(time)
+ end
+
+ test "with end time before current", %{time: time} do
+ before_now = NaiveDateTime.add(time, -10, :second)
+
+ _announcement = insert(:announcement, %{ends_at: before_now})
+
+ assert [] = Announcement.list_all_visible_when(time)
+ end
+
+ test "with both start and end time", %{time: time} do
+ before_now = NaiveDateTime.add(time, -10, :second)
+ after_now = NaiveDateTime.add(time, 10, :second)
+
+ _announcement = insert(:announcement, %{starts_at: before_now, ends_at: after_now})
+
+ assert [_] = Announcement.list_all_visible_when(time)
+ end
+
+ test "with both start and end time, current not in the range", %{time: time} do
+ before_now = NaiveDateTime.add(time, -10, :second)
+ after_now = NaiveDateTime.add(time, 10, :second)
+
+ _announcement = insert(:announcement, %{starts_at: after_now, ends_at: before_now})
+
+ assert [] = Announcement.list_all_visible_when(time)
+ end
+ end
+
+ describe "announcements formatting" do
+ test "it formats links" do
+ raw = "something on https://pleroma.social ."
+ announcement = insert(:announcement, %{data: %{"content" => raw}})
+
+ assert announcement.rendered["content"] =~ ~r( raw}})
+
+ assert announcement.rendered["content"] =~ ~r( raw}})
+
+ assert announcement.rendered["content"] =~ ~r(
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Chat.MessageReferenceTest do
- use Pleroma.DataCase, async: true
-
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.Web.CommonAPI
-
- import Pleroma.Factory
-
- describe "messages" do
- test "it returns the last message in a chat" do
- user = insert(:user)
- recipient = insert(:user)
-
- {:ok, _message_1} = CommonAPI.post_chat_message(user, recipient, "hey")
- {:ok, _message_2} = CommonAPI.post_chat_message(recipient, user, "ho")
-
- {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id)
-
- message = MessageReference.last_message_for_chat(chat)
-
- assert message.object.data["content"] == "ho"
- end
- end
-end
diff --git a/test/pleroma/chat_test.exs b/test/pleroma/chat_test.exs
deleted file mode 100644
index a5fd1e02e..000000000
--- a/test/pleroma/chat_test.exs
+++ /dev/null
@@ -1,84 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.ChatTest do
- use Pleroma.DataCase, async: true
-
- alias Pleroma.Chat
-
- import Pleroma.Factory
-
- describe "creation and getting" do
- test "it only works if the recipient is a valid user (for now)" do
- user = insert(:user)
-
- assert {:error, _chat} = Chat.bump_or_create(user.id, "http://some/nonexisting/account")
- assert {:error, _chat} = Chat.get_or_create(user.id, "http://some/nonexisting/account")
- end
-
- test "it creates a chat for a user and recipient" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
-
- assert chat.id
- end
-
- test "deleting the user deletes the chat" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
-
- Repo.delete(user)
-
- refute Chat.get_by_id(chat.id)
- end
-
- test "deleting the recipient deletes the chat" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
-
- Repo.delete(other_user)
-
- refute Chat.get_by_id(chat.id)
- end
-
- test "it returns and bumps a chat for a user and recipient if it already exists" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
- {:ok, chat_two} = Chat.bump_or_create(user.id, other_user.ap_id)
-
- assert chat.id == chat_two.id
- end
-
- test "it returns a chat for a user and recipient if it already exists" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
- {:ok, chat_two} = Chat.get_or_create(user.id, other_user.ap_id)
-
- assert chat.id == chat_two.id
- end
-
- test "a returning chat will have an updated `update_at` field" do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
- {:ok, chat} = time_travel(chat, -2)
-
- {:ok, chat_two} = Chat.bump_or_create(user.id, other_user.ap_id)
-
- assert chat.id == chat_two.id
- assert chat.updated_at != chat_two.updated_at
- end
- end
-end
diff --git a/test/pleroma/config/deprecation_warnings_test.exs b/test/pleroma/config/deprecation_warnings_test.exs
index 12597506b..053e28207 100644
--- a/test/pleroma/config/deprecation_warnings_test.exs
+++ b/test/pleroma/config/deprecation_warnings_test.exs
@@ -279,14 +279,4 @@ test "check_uploders_s3_public_endpoint/0" do
end) =~
"Your config is using the old setting for controlling the URL of media uploaded to your S3 bucket."
end
-
- test "check_old_chat_shoutbox/0" do
- clear_config([:instance, :chat_limit], 1_000)
- clear_config([:chat, :enabled], true)
-
- assert capture_log(fn ->
- DeprecationWarnings.check_old_chat_shoutbox()
- end) =~
- "Your config is using the old namespace for the Shoutbox configuration."
- end
end
diff --git a/test/pleroma/config/transfer_task_test.exs b/test/pleroma/config/transfer_task_test.exs
index 9e3f11f1a..c56f20ec5 100644
--- a/test/pleroma/config/transfer_task_test.exs
+++ b/test/pleroma/config/transfer_task_test.exs
@@ -95,8 +95,8 @@ test "don't restart if no reboot time settings were changed" do
@tag :erratic
test "on reboot time key" do
- clear_config(:shout)
- insert(:config, key: :shout, value: [enabled: false])
+ clear_config([:pleroma, :rate_limit])
+ insert(:config, key: {:pleroma, :rate_limit}, value: [enabled: false])
assert capture_log(fn -> TransferTask.start_link([]) end) =~ "pleroma restarted"
end
@@ -109,10 +109,10 @@ test "on reboot time subkey" do
@tag :erratic
test "don't restart pleroma on reboot time key and subkey if there is false flag" do
- clear_config(:shout)
+ clear_config([:pleroma, :rate_limit])
clear_config(Pleroma.Captcha)
- insert(:config, key: :shout, value: [enabled: false])
+ insert(:config, key: {:pleroma, :rate_limit}, value: [enabled: false])
insert(:config, key: Pleroma.Captcha, value: [seconds_valid: 60])
refute String.contains?(
diff --git a/test/pleroma/docs/translator/compiler_test.exs b/test/pleroma/docs/translator/compiler_test.exs
new file mode 100644
index 000000000..d6c3cdd40
--- /dev/null
+++ b/test/pleroma/docs/translator/compiler_test.exs
@@ -0,0 +1,90 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Docs.Translator.CompilerTest do
+ use ExUnit.Case, async: true
+
+ alias Pleroma.Docs.Translator.Compiler
+
+ @descriptions [
+ %{
+ key: "1",
+ label: "1",
+ description: "2",
+ children: [
+ %{
+ key: "3",
+ label: "3",
+ description: "4"
+ },
+ %{
+ key: "5",
+ label: "5",
+ description: "6"
+ }
+ ]
+ },
+ %{
+ key: "7",
+ label: "7",
+ description: "8",
+ children: [
+ %{
+ key: "9",
+ description: "9",
+ children: [
+ %{
+ key: "10",
+ description: "10",
+ children: [
+ %{key: "11", description: "11"},
+ %{description: "12"}
+ ]
+ }
+ ]
+ },
+ %{
+ label: "13"
+ }
+ ]
+ },
+ %{
+ group: "14",
+ label: "14"
+ },
+ %{
+ group: "15",
+ key: "15",
+ label: "15"
+ },
+ %{
+ group: {":subgroup", "16"},
+ label: "16"
+ }
+ ]
+
+ describe "extract_strings/1" do
+ test "it extracts all labels and descriptions" do
+ strings = Compiler.extract_strings(@descriptions)
+ assert length(strings) == 16
+
+ assert {["1"], "label", "1"} in strings
+ assert {["1"], "description", "2"} in strings
+ assert {["1", "3"], "label", "3"} in strings
+ assert {["1", "3"], "description", "4"} in strings
+ assert {["1", "5"], "label", "5"} in strings
+ assert {["1", "5"], "description", "6"} in strings
+ assert {["7"], "label", "7"} in strings
+ assert {["7"], "description", "8"} in strings
+ assert {["7", "9"], "description", "9"} in strings
+ assert {["7", "9", "10"], "description", "10"} in strings
+ assert {["7", "9", "10", "11"], "description", "11"} in strings
+ assert {["7", "9", "10", nil], "description", "12"} in strings
+ assert {["7", nil], "label", "13"} in strings
+ assert {["14"], "label", "14"} in strings
+ assert {["15-15"], "label", "15"} in strings
+ assert {["16"], "label", "16"} in strings
+ end
+ end
+end
diff --git a/test/pleroma/emoji_test.exs b/test/pleroma/emoji_test.exs
index 978473b14..deaab1e8b 100644
--- a/test/pleroma/emoji_test.exs
+++ b/test/pleroma/emoji_test.exs
@@ -13,8 +13,8 @@ test "tells if a string is an unicode emoji" do
# Accept fully-qualified and unqualified emoji
# See http://www.unicode.org/reports/tr51/
- assert Emoji.is_unicode_emoji?("❤")
- assert Emoji.is_unicode_emoji?("☂")
+ refute Emoji.is_unicode_emoji?("❤")
+ refute Emoji.is_unicode_emoji?("☂")
assert Emoji.is_unicode_emoji?("🥺")
assert Emoji.is_unicode_emoji?("🤰")
diff --git a/test/pleroma/migration_helper/notification_backfill_test.exs b/test/pleroma/migration_helper/notification_backfill_test.exs
index fd253b530..eca060800 100644
--- a/test/pleroma/migration_helper/notification_backfill_test.exs
+++ b/test/pleroma/migration_helper/notification_backfill_test.exs
@@ -19,7 +19,6 @@ test "it fills in missing notification types" do
other_user = insert(:user)
{:ok, post} = CommonAPI.post(user, %{status: "yeah, @#{other_user.nickname}"})
- {:ok, chat} = CommonAPI.post_chat_message(user, other_user, "yo")
{:ok, react} = CommonAPI.react_with_emoji(post.id, other_user, "☕")
{:ok, like} = CommonAPI.favorite(other_user, post.id)
{:ok, react_2} = CommonAPI.react_with_emoji(post.id, other_user, "☕")
@@ -33,7 +32,7 @@ test "it fills in missing notification types" do
|> Activity.change(%{data: data})
|> Repo.update()
- assert {5, nil} = Repo.update_all(Notification, set: [type: nil])
+ assert {4, nil} = Repo.update_all(Notification, set: [type: nil])
NotificationBackfill.fill_in_notification_types()
@@ -48,9 +47,6 @@ test "it fills in missing notification types" do
assert %{type: "pleroma:emoji_reaction"} =
Repo.get_by(Notification, user_id: user.id, activity_id: react_2.id)
-
- assert %{type: "pleroma:chat_mention"} =
- Repo.get_by(Notification, user_id: other_user.id, activity_id: chat.id)
end
end
end
diff --git a/test/pleroma/repo/migrations/rename_instance_chat_test.exs b/test/pleroma/repo/migrations/rename_instance_chat_test.exs
deleted file mode 100644
index acd45600c..000000000
--- a/test/pleroma/repo/migrations/rename_instance_chat_test.exs
+++ /dev/null
@@ -1,52 +0,0 @@
-defmodule Pleroma.Repo.Migrations.RenameInstanceChatTest do
- use Pleroma.DataCase
- import Pleroma.Factory
- import Pleroma.Tests.Helpers
- alias Pleroma.ConfigDB
-
- setup do: clear_config([:instance])
- setup do: clear_config([:chat])
- setup_all do: require_migration("20200806175913_rename_instance_chat")
-
- describe "up/0" do
- test "migrates chat settings to shout", %{migration: migration} do
- insert(:config, group: :pleroma, key: :instance, value: [chat_limit: 6000])
- insert(:config, group: :pleroma, key: :chat, value: [enabled: true])
-
- assert migration.up() == :ok
-
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}) == nil
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :instance}) == nil
-
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}).value == [
- limit: 6000,
- enabled: true
- ]
- end
-
- test "does nothing when chat settings are not set", %{migration: migration} do
- assert migration.up() == :noop
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}) == nil
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}) == nil
- end
- end
-
- describe "down/0" do
- test "migrates shout settings back to instance and chat", %{migration: migration} do
- insert(:config, group: :pleroma, key: :shout, value: [limit: 42, enabled: true])
-
- assert migration.down() == :ok
-
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}).value == [enabled: true]
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :instance}).value == [chat_limit: 42]
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}) == nil
- end
-
- test "does nothing when shout settings are not set", %{migration: migration} do
- assert migration.down() == :noop
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :chat}) == nil
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :instance}) == nil
- assert ConfigDB.get_by_params(%{group: :pleroma, key: :shout}) == nil
- end
- end
-end
diff --git a/test/pleroma/signature_test.exs b/test/pleroma/signature_test.exs
index 047c537e0..e3ae36b46 100644
--- a/test/pleroma/signature_test.exs
+++ b/test/pleroma/signature_test.exs
@@ -109,6 +109,11 @@ test "it properly deduces the actor id for mastodon and pleroma" do
{:ok, "https://example.com/users/1234"}
end
+ test "it deduces the actor id for gotoSocial" do
+ assert Signature.key_id_to_actor_id("https://example.com/users/1234/main-key") ==
+ {:ok, "https://example.com/users/1234"}
+ end
+
test "it calls webfinger for 'acct:' accounts" do
with_mock(Pleroma.Web.WebFinger,
finger: fn _ -> %{"ap_id" => "https://gensokyo.2hu/users/raymoo"} end
diff --git a/test/pleroma/user/backup_test.exs b/test/pleroma/user/backup_test.exs
index b16152876..029bbbf56 100644
--- a/test/pleroma/user/backup_test.exs
+++ b/test/pleroma/user/backup_test.exs
@@ -22,15 +22,15 @@ defmodule Pleroma.User.BackupTest do
clear_config([Pleroma.Emails.Mailer, :enabled], true)
end
- test "it requries enabled email" do
+ test "it does not requrie enabled email" do
clear_config([Pleroma.Emails.Mailer, :enabled], false)
user = insert(:user)
- assert {:error, "Backups require enabled email"} == Backup.create(user)
+ assert {:ok, _} = Backup.create(user)
end
- test "it requries user's email" do
+ test "it does not require user's email" do
user = insert(:user, %{email: nil})
- assert {:error, "Email is required"} == Backup.create(user)
+ assert {:ok, _} = Backup.create(user)
end
test "it creates a backup record and an Oban job" do
@@ -75,6 +75,43 @@ test "it process a backup record" do
)
end
+ test "it does not send an email if the user does not have an email" do
+ clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ %{id: user_id} = user = insert(:user, %{email: nil})
+
+ assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user)
+ assert {:ok, backup} = perform_job(BackupWorker, args)
+ assert backup.file_size > 0
+ assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup
+
+ assert_no_email_sent()
+ end
+
+ test "it does not send an email if mailer is not on" do
+ clear_config([Pleroma.Emails.Mailer, :enabled], false)
+ clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ %{id: user_id} = user = insert(:user)
+
+ assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user)
+ assert {:ok, backup} = perform_job(BackupWorker, args)
+ assert backup.file_size > 0
+ assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup
+
+ assert_no_email_sent()
+ end
+
+ test "it does not send an email if the user has an empty email" do
+ clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ %{id: user_id} = user = insert(:user, %{email: ""})
+
+ assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user)
+ assert {:ok, backup} = perform_job(BackupWorker, args)
+ assert backup.file_size > 0
+ assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup
+
+ assert_no_email_sent()
+ end
+
test "it removes outdated backups after creating a fresh one" do
clear_config([Backup, :limit_days], -1)
clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
diff --git a/test/pleroma/user/welcome_chat_message_test.exs b/test/pleroma/user/welcome_chat_message_test.exs
deleted file mode 100644
index 42a45fa19..000000000
--- a/test/pleroma/user/welcome_chat_message_test.exs
+++ /dev/null
@@ -1,36 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.User.WelcomeChatMessageTest do
- use Pleroma.DataCase
-
- alias Pleroma.User.WelcomeChatMessage
-
- import Pleroma.Factory
-
- setup do: clear_config([:welcome])
-
- describe "post_message/1" do
- test "send a chat welcome message" do
- welcome_user = insert(:user, name: "mewmew")
- user = insert(:user)
-
- clear_config([:welcome, :chat_message, :enabled], true)
- clear_config([:welcome, :chat_message, :sender_nickname], welcome_user.nickname)
-
- clear_config(
- [:welcome, :chat_message, :message],
- "Hello, welcome to Blob/Cat!"
- )
-
- {:ok, %Pleroma.Activity{} = activity} = WelcomeChatMessage.post_message(user)
-
- assert user.ap_id in activity.recipients
- assert Pleroma.Object.normalize(activity, fetch: false).data["type"] == "ChatMessage"
-
- assert Pleroma.Object.normalize(activity, fetch: false).data["content"] ==
- "Hello, welcome to Blob/Cat!"
- end
- end
-end
diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs
index 8486987fd..67136e95b 100644
--- a/test/pleroma/user_test.exs
+++ b/test/pleroma/user_test.exs
@@ -443,22 +443,6 @@ test "it sends a welcome message if it is set" do
assert activity.actor == welcome_user.ap_id
end
- test "it sends a welcome chat message if it is set" do
- welcome_user = insert(:user)
- clear_config([:welcome, :chat_message, :enabled], true)
- clear_config([:welcome, :chat_message, :sender_nickname], welcome_user.nickname)
- clear_config([:welcome, :chat_message, :message], "Hello, this is a chat message")
-
- cng = User.register_changeset(%User{}, @full_user_data)
- {:ok, registered_user} = User.register(cng)
- ObanHelpers.perform_all()
-
- activity = Repo.one(Pleroma.Activity)
- assert registered_user.ap_id in activity.recipients
- assert Object.normalize(activity, fetch: false).data["content"] =~ "chat message"
- assert activity.actor == welcome_user.ap_id
- end
-
setup do:
clear_config(:mrf_simple,
media_removal: [],
@@ -480,24 +464,6 @@ test "it sends a welcome chat message if it is set" do
]
)
- test "it sends a welcome chat message when Simple policy applied to local instance" do
- clear_config([:mrf_simple, :media_nsfw], [{"localhost", ""}])
-
- welcome_user = insert(:user)
- clear_config([:welcome, :chat_message, :enabled], true)
- clear_config([:welcome, :chat_message, :sender_nickname], welcome_user.nickname)
- clear_config([:welcome, :chat_message, :message], "Hello, this is a chat message")
-
- cng = User.register_changeset(%User{}, @full_user_data)
- {:ok, registered_user} = User.register(cng)
- ObanHelpers.perform_all()
-
- activity = Repo.one(Pleroma.Activity)
- assert registered_user.ap_id in activity.recipients
- assert Object.normalize(activity, fetch: false).data["content"] =~ "chat message"
- assert activity.actor == welcome_user.ap_id
- end
-
test "it sends a welcome email message if it is set" do
welcome_user = insert(:user)
clear_config([:welcome, :email, :enabled], true)
@@ -665,15 +631,6 @@ test "it sets the password_hash and ap_id" do
assert changeset.changes.follower_address == "#{changeset.changes.ap_id}/followers"
end
- test "it sets the 'accepts_chat_messages' set to true" do
- changeset = User.register_changeset(%User{}, @full_user_data)
- assert changeset.valid?
-
- {:ok, user} = Repo.insert(changeset)
-
- assert user.accepts_chat_messages
- end
-
test "it creates a confirmed user" do
changeset = User.register_changeset(%User{}, @full_user_data)
assert changeset.valid?
@@ -781,6 +738,116 @@ test "gets an existing user by ap_id" do
end
end
+ describe "get_or_fetch/1 remote users with tld, while BE is runned on subdomain" do
+ setup do: clear_config([Pleroma.Web.WebFinger, :update_nickname_on_user_fetch], true)
+
+ test "for mastodon" do
+ Tesla.Mock.mock(fn
+ %{url: "https://example.com/.well-known/host-meta"} ->
+ %Tesla.Env{
+ status: 302,
+ headers: [{"location", "https://sub.example.com/.well-known/host-meta"}]
+ }
+
+ %{url: "https://sub.example.com/.well-known/host-meta"} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/masto-host-meta.xml"
+ |> File.read!()
+ |> String.replace("{{domain}}", "sub.example.com")
+ }
+
+ %{url: "https://sub.example.com/.well-known/webfinger?resource=acct:a@example.com"} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/masto-webfinger.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "example.com")
+ |> String.replace("{{subdomain}}", "sub.example.com"),
+ headers: [{"content-type", "application/jrd+json"}]
+ }
+
+ %{url: "https://sub.example.com/users/a"} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/masto-user.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "sub.example.com"),
+ headers: [{"content-type", "application/activity+json"}]
+ }
+
+ %{url: "https://sub.example.com/users/a/collections/featured"} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ File.read!("test/fixtures/users_mock/masto_featured.json")
+ |> String.replace("{{domain}}", "sub.example.com")
+ |> String.replace("{{nickname}}", "a"),
+ headers: [{"content-type", "application/activity+json"}]
+ }
+ end)
+
+ ap_id = "a@example.com"
+ {:ok, fetched_user} = User.get_or_fetch(ap_id)
+
+ assert fetched_user.ap_id == "https://sub.example.com/users/a"
+ assert fetched_user.nickname == "a@example.com"
+ end
+
+ test "for pleroma" do
+ Tesla.Mock.mock(fn
+ %{url: "https://example.com/.well-known/host-meta"} ->
+ %Tesla.Env{
+ status: 302,
+ headers: [{"location", "https://sub.example.com/.well-known/host-meta"}]
+ }
+
+ %{url: "https://sub.example.com/.well-known/host-meta"} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/pleroma-host-meta.xml"
+ |> File.read!()
+ |> String.replace("{{domain}}", "sub.example.com")
+ }
+
+ %{url: "https://sub.example.com/.well-known/webfinger?resource=acct:a@example.com"} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/pleroma-webfinger.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "example.com")
+ |> String.replace("{{subdomain}}", "sub.example.com"),
+ headers: [{"content-type", "application/jrd+json"}]
+ }
+
+ %{url: "https://sub.example.com/users/a"} ->
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/pleroma-user.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "sub.example.com"),
+ headers: [{"content-type", "application/activity+json"}]
+ }
+ end)
+
+ ap_id = "a@example.com"
+ {:ok, fetched_user} = User.get_or_fetch(ap_id)
+
+ assert fetched_user.ap_id == "https://sub.example.com/users/a"
+ assert fetched_user.nickname == "a@example.com"
+ end
+ end
+
describe "fetching a user from nickname or trying to build one" do
test "gets an existing user" do
user = insert(:user)
diff --git a/test/pleroma/utils_test.exs b/test/pleroma/utils_test.exs
index c593a9490..e21573679 100644
--- a/test/pleroma/utils_test.exs
+++ b/test/pleroma/utils_test.exs
@@ -12,4 +12,11 @@ test "returns unique temporary directory" do
File.rm_rf(path)
end
end
+
+ describe "compile_dir/1" do
+ test "recursively compiles directories" do
+ {:ok, [DynamicModule.First, DynamicModule.Second], []} =
+ Pleroma.Utils.compile_dir("test/fixtures/runtime_modules")
+ end
+ end
end
diff --git a/test/pleroma/web/activity_pub/activity_pub_controller_test.exs b/test/pleroma/web/activity_pub/activity_pub_controller_test.exs
index 511405624..da5c87bd8 100644
--- a/test/pleroma/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/pleroma/web/activity_pub/activity_pub_controller_test.exs
@@ -247,6 +247,27 @@ test "returns local-only objects when authenticated", %{conn: conn} do
assert json_response(response, 200) == ObjectView.render("object.json", %{object: object})
end
+ test "does not return local-only objects for remote users", %{conn: conn} do
+ user = insert(:user)
+ reader = insert(:user, local: false)
+
+ {:ok, post} =
+ CommonAPI.post(user, %{status: "test @#{reader.nickname}", visibility: "local"})
+
+ assert Pleroma.Web.ActivityPub.Visibility.is_local_public?(post)
+
+ object = Object.normalize(post, fetch: false)
+ uuid = String.split(object.data["id"], "/") |> List.last()
+
+ assert response =
+ conn
+ |> assign(:user, reader)
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/objects/#{uuid}")
+
+ json_response(response, 404)
+ end
+
test "it returns a json representation of the object with accept application/json", %{
conn: conn
} do
@@ -1297,6 +1318,35 @@ test "it returns 200 even if there're no activities", %{conn: conn} do
assert outbox_endpoint == result["id"]
end
+ test "it returns a local note activity when authenticated as local user", %{conn: conn} do
+ user = insert(:user)
+ reader = insert(:user)
+ {:ok, note_activity} = CommonAPI.post(user, %{status: "mew mew", visibility: "local"})
+ ap_id = note_activity.data["id"]
+
+ resp =
+ conn
+ |> assign(:user, reader)
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/#{user.nickname}/outbox?page=true")
+ |> json_response(200)
+
+ assert %{"orderedItems" => [%{"id" => ^ap_id}]} = resp
+ end
+
+ test "it does not return a local note activity when unauthenticated", %{conn: conn} do
+ user = insert(:user)
+ {:ok, _note_activity} = CommonAPI.post(user, %{status: "mew mew", visibility: "local"})
+
+ resp =
+ conn
+ |> put_req_header("accept", "application/activity+json")
+ |> get("/users/#{user.nickname}/outbox?page=true")
+ |> json_response(200)
+
+ assert %{"orderedItems" => []} = resp
+ end
+
test "it returns a note activity in a collection", %{conn: conn} do
note_activity = insert(:note_activity)
note_object = Object.normalize(note_activity, fetch: false)
diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs
index a38d8a3fb..50eff9431 100644
--- a/test/pleroma/web/activity_pub/activity_pub_test.exs
+++ b/test/pleroma/web/activity_pub/activity_pub_test.exs
@@ -23,6 +23,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
import Tesla.Mock
setup do
+ clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ clear_config([Pleroma.Uploaders.Local, :uploads], "uploads")
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
@@ -184,13 +186,6 @@ test "it returns a user that is invisible" do
assert User.invisible?(user)
end
- test "it returns a user that accepts chat messages" do
- user_id = "http://mastodon.example.org/users/admin"
- {:ok, user} = ActivityPub.make_user_from_ap_id(user_id)
-
- assert user.accepts_chat_messages
- end
-
test "works for guppe actors" do
user_id = "https://gup.pe/u/bernie2020"
@@ -352,6 +347,39 @@ test "fetches user featured collection using the first property" do
assert Map.has_key?(data, "http://inserted")
end
+ test "fetches user featured when it has string IDs" do
+ featured_url = "https://example.com/alisaie/collections/featured"
+ dead_url = "https://example.com/users/alisaie/statuses/108311386746229284"
+
+ featured_data =
+ "test/fixtures/mastodon/featured_collection.json"
+ |> File.read!()
+
+ Tesla.Mock.mock(fn
+ %{
+ method: :get,
+ url: ^featured_url
+ } ->
+ %Tesla.Env{
+ status: 200,
+ body: featured_data,
+ headers: [{"content-type", "application/activity+json"}]
+ }
+
+ %{
+ method: :get,
+ url: ^dead_url
+ } ->
+ %Tesla.Env{
+ status: 404,
+ body: "{}",
+ headers: [{"content-type", "application/activity+json"}]
+ }
+ end)
+
+ {:ok, %{}} = ActivityPub.fetch_and_prepare_featured_from_ap_id(featured_url)
+ end
+
test "it fetches the appropriate tag-restricted posts" do
user = insert(:user)
@@ -495,7 +523,6 @@ test "inserts a given map into the activity database, giving it an id if it has
assert activity.data["ok"] == data["ok"]
assert activity.data["id"] == given_id
assert activity.data["context"] == "blabla"
- assert activity.data["context_id"]
end
test "adds a context when none is there" do
@@ -517,8 +544,6 @@ test "adds a context when none is there" do
assert is_binary(activity.data["context"])
assert is_binary(object.data["context"])
- assert activity.data["context_id"]
- assert object.data["context_id"]
end
test "adds an id to a given object if it lacks one and is a note and inserts it to the object database" do
@@ -541,42 +566,6 @@ test "adds an id to a given object if it lacks one and is a note and inserts it
end
end
- describe "listen activities" do
- test "does not increase user note count" do
- user = insert(:user)
-
- {:ok, activity} =
- ActivityPub.listen(%{
- to: ["https://www.w3.org/ns/activitystreams#Public"],
- actor: user,
- context: "",
- object: %{
- "actor" => user.ap_id,
- "to" => ["https://www.w3.org/ns/activitystreams#Public"],
- "artist" => "lain",
- "title" => "lain radio episode 1",
- "length" => 180_000,
- "type" => "Audio"
- }
- })
-
- assert activity.actor == user.ap_id
-
- user = User.get_cached_by_id(user.id)
- assert user.note_count == 0
- end
-
- test "can be fetched into a timeline" do
- _listen_activity_1 = insert(:listen)
- _listen_activity_2 = insert(:listen)
- _listen_activity_3 = insert(:listen)
-
- timeline = ActivityPub.fetch_activities([], %{type: ["Listen"]})
-
- assert length(timeline) == 3
- end
- end
-
describe "create activities" do
setup do
[user: insert(:user)]
@@ -1383,6 +1372,21 @@ test "creates an undo activity for a pending follow request" do
assert embedded_object["object"] == followed.ap_id
assert embedded_object["id"] == follow_activity.data["id"]
end
+
+ test "it removes the follow activity if it was remote" do
+ follower = insert(:user, local: false)
+ followed = insert(:user)
+
+ {:ok, _, _, follow_activity} = CommonAPI.follow(follower, followed)
+ {:ok, activity} = ActivityPub.unfollow(follower, followed, nil, false)
+
+ assert activity.data["type"] == "Undo"
+ assert activity.data["actor"] == follower.ap_id
+
+ activity = Activity.get_by_id(follow_activity.id)
+ assert is_nil(activity)
+ assert is_nil(Utils.fetch_latest_follow(follower, followed))
+ end
end
describe "timeline post-processing" do
@@ -1553,7 +1557,7 @@ test "it can create a Flag activity",
})
assert Repo.aggregate(Activity, :count, :id) == 1
- assert Repo.aggregate(Object, :count, :id) == 2
+ assert Repo.aggregate(Object, :count, :id) == 1
assert Repo.aggregate(Notification, :count, :id) == 0
end
end
diff --git a/test/pleroma/web/activity_pub/builder_test.exs b/test/pleroma/web/activity_pub/builder_test.exs
index 3fe32bce5..640caa2b6 100644
--- a/test/pleroma/web/activity_pub/builder_test.exs
+++ b/test/pleroma/web/activity_pub/builder_test.exs
@@ -13,6 +13,7 @@ defmodule Pleroma.Web.ActivityPub.BuilderTest do
test "returns note data" do
user = insert(:user)
note = insert(:note)
+ quote = insert(:note)
user2 = insert(:user)
user3 = insert(:user)
@@ -25,7 +26,8 @@ test "returns note data" do
tags: [name: "jimm"],
summary: "test summary",
cc: [user3.ap_id],
- extra: %{"custom_tag" => "test"}
+ extra: %{"custom_tag" => "test"},
+ quote: quote
}
expected = %{
@@ -39,7 +41,8 @@ test "returns note data" do
"tag" => ["jimm"],
"to" => [user2.ap_id],
"type" => "Note",
- "custom_tag" => "test"
+ "custom_tag" => "test",
+ "quoteUri" => quote.data["id"]
}
assert {:ok, ^expected, []} = Builder.note(draft)
diff --git a/test/pleroma/web/activity_pub/mrf/hellthread_policy_test.exs b/test/pleroma/web/activity_pub/mrf/hellthread_policy_test.exs
index 439672479..a88e1fa2e 100644
--- a/test/pleroma/web/activity_pub/mrf/hellthread_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/hellthread_policy_test.exs
@@ -8,8 +8,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do
import Pleroma.Web.ActivityPub.MRF.HellthreadPolicy
- alias Pleroma.Web.CommonAPI
-
setup do
user = insert(:user)
@@ -33,17 +31,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do
setup do: clear_config(:mrf_hellthread)
- test "doesn't die on chat messages" do
- clear_config([:mrf_hellthread], %{delist_threshold: 2, reject_threshold: 0})
-
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, activity} = CommonAPI.post_chat_message(user, other_user, "moin")
-
- assert {:ok, _} = filter(activity.data)
- end
-
describe "reject" do
test "rejects the message if the recipient count is above reject_threshold", %{
message: message
diff --git a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
new file mode 100644
index 000000000..4e0910d3e
--- /dev/null
+++ b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
@@ -0,0 +1,56 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
+ alias Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy
+ use Pleroma.DataCase
+
+ test "adds quote URL to post content" do
+ quote_url = "https://example.com/objects/1234"
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://example.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post
",
+ "quoteUri" => quote_url
+ }
+ }
+
+ {:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
+
+ assert filtered ==
+ "Nice post RE: https://example.com/objects/1234
"
+ end
+
+ test "ignores Misskey quote posts" do
+ object = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://misskey.io/users/7rkrarq81i",
+ "object" => object
+ }
+
+ {:ok, filtered} = InlineQuotePolicy.filter(activity)
+ assert filtered == activity
+ end
+
+ test "ignores Fedibird quote posts" do
+ object = File.read!("test/fixtures/quote_post/fedibird_quote_post.json") |> Jason.decode!()
+
+ # Normally the ObjectValidator will fix this before it reaches MRF
+ object = Map.put(object, "quoteUrl", object["quoteURL"])
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://fedibird.com/users/noellabo",
+ "object" => object
+ }
+
+ {:ok, filtered} = InlineQuotePolicy.filter(activity)
+ assert filtered == activity
+ end
+end
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index 8b3982916..09cd1a964 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -130,18 +130,21 @@ test "a misskey MFM status with a _misskey_content field should work and be link
|> Jason.decode!()
expected_content =
- "@akkoma_user linkifylink #dancedance $[jelly mfm goes here] ## aaa"
+ "@akkoma_user linkifylink #dancedance $[jelly mfm goes here] ## aaa"
+
+ changes = ArticleNotePageValidator.cast_and_validate(note)
%{
valid?: true,
changes: %{
- content: ^expected_content,
source: %{
"content" => "@akkoma_user linkifylink #dancedance $[jelly mfm goes here] \n\n## aaa",
"mediaType" => "text/x.misskeymarkdown"
}
}
- } = ArticleNotePageValidator.cast_and_validate(note)
+ } = changes
+
+ assert changes.changes[:content] == expected_content
end
end
end
diff --git a/test/pleroma/web/activity_pub/object_validators/chat_validation_test.exs b/test/pleroma/web/activity_pub/object_validators/chat_validation_test.exs
deleted file mode 100644
index def2a10b4..000000000
--- a/test/pleroma/web/activity_pub/object_validators/chat_validation_test.exs
+++ /dev/null
@@ -1,212 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatValidationTest do
- use Pleroma.DataCase
- alias Pleroma.Object
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.ActivityPub.Builder
- alias Pleroma.Web.ActivityPub.ObjectValidator
- alias Pleroma.Web.CommonAPI
-
- import Pleroma.Factory
-
- describe "chat message create activities" do
- test "it is invalid if the object already exists" do
- user = insert(:user)
- recipient = insert(:user)
- {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "hey")
- object = Object.normalize(activity, fetch: false)
-
- {:ok, create_data, _} = Builder.create(user, object.data, [recipient.ap_id])
-
- {:error, cng} = ObjectValidator.validate(create_data, [])
-
- assert {:object, {"The object to create already exists", []}} in cng.errors
- end
-
- test "it is invalid if the object data has a different `to` or `actor` field" do
- user = insert(:user)
- recipient = insert(:user)
- {:ok, object_data, _} = Builder.chat_message(recipient, user.ap_id, "Hey")
-
- {:ok, create_data, _} = Builder.create(user, object_data, [recipient.ap_id])
-
- {:error, cng} = ObjectValidator.validate(create_data, [])
-
- assert {:to, {"Recipients don't match with object recipients", []}} in cng.errors
- assert {:actor, {"Actor doesn't match with object actor", []}} in cng.errors
- end
- end
-
- describe "chat messages" do
- setup do
- clear_config([:instance, :remote_limit])
- user = insert(:user)
- recipient = insert(:user, local: false)
-
- {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey :firefox:")
-
- %{user: user, recipient: recipient, valid_chat_message: valid_chat_message}
- end
-
- test "let's through some basic html", %{user: user, recipient: recipient} do
- {:ok, valid_chat_message, _} =
- Builder.chat_message(
- user,
- recipient.ap_id,
- "hey example "
- )
-
- assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
-
- assert object["content"] ==
- "hey example alert('uguu')"
- end
-
- test "validates for a basic object we build", %{valid_chat_message: valid_chat_message} do
- assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
-
- assert valid_chat_message == object
- assert match?(%{"firefox" => _}, object["emoji"])
- end
-
- test "validates for a basic object with an attachment", %{
- valid_chat_message: valid_chat_message,
- user: user
- } do
- file = %Plug.Upload{
- content_type: "image/jpeg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
-
- valid_chat_message =
- valid_chat_message
- |> Map.put("attachment", attachment.data)
-
- assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
-
- assert object["attachment"]
- end
-
- test "validates for a basic object with an attachment in an array", %{
- valid_chat_message: valid_chat_message,
- user: user
- } do
- file = %Plug.Upload{
- content_type: "image/jpeg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
-
- valid_chat_message =
- valid_chat_message
- |> Map.put("attachment", [attachment.data])
-
- assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
-
- assert object["attachment"]
- end
-
- test "validates for a basic object with an attachment but without content", %{
- valid_chat_message: valid_chat_message,
- user: user
- } do
- file = %Plug.Upload{
- content_type: "image/jpeg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id)
-
- valid_chat_message =
- valid_chat_message
- |> Map.put("attachment", attachment.data)
- |> Map.delete("content")
-
- assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, [])
-
- assert object["attachment"]
- end
-
- test "does not validate if the message has no content", %{
- valid_chat_message: valid_chat_message
- } do
- contentless =
- valid_chat_message
- |> Map.delete("content")
-
- refute match?({:ok, _object, _meta}, ObjectValidator.validate(contentless, []))
- end
-
- test "does not validate if the message is longer than the remote_limit", %{
- valid_chat_message: valid_chat_message
- } do
- clear_config([:instance, :remote_limit], 2)
- refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
- end
-
- test "does not validate if the recipient is blocking the actor", %{
- valid_chat_message: valid_chat_message,
- user: user,
- recipient: recipient
- } do
- Pleroma.User.block(recipient, user)
- refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
- end
-
- test "does not validate if the recipient is not accepting chat messages", %{
- valid_chat_message: valid_chat_message,
- recipient: recipient
- } do
- recipient
- |> Ecto.Changeset.change(%{accepts_chat_messages: false})
- |> Pleroma.Repo.update!()
-
- refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, []))
- end
-
- test "does not validate if the actor or the recipient is not in our system", %{
- valid_chat_message: valid_chat_message
- } do
- chat_message =
- valid_chat_message
- |> Map.put("actor", "https://raymoo.com/raymoo")
-
- {:error, _} = ObjectValidator.validate(chat_message, [])
-
- chat_message =
- valid_chat_message
- |> Map.put("to", ["https://raymoo.com/raymoo"])
-
- {:error, _} = ObjectValidator.validate(chat_message, [])
- end
-
- test "does not validate for a message with multiple recipients", %{
- valid_chat_message: valid_chat_message,
- user: user,
- recipient: recipient
- } do
- chat_message =
- valid_chat_message
- |> Map.put("to", [user.ap_id, recipient.ap_id])
-
- assert {:error, _} = ObjectValidator.validate(chat_message, [])
- end
-
- test "does not validate if it doesn't concern local users" do
- user = insert(:user, local: false)
- recipient = insert(:user, local: false)
-
- {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey")
- assert {:error, _} = ObjectValidator.validate(valid_chat_message, [])
- end
- end
-end
diff --git a/test/pleroma/web/activity_pub/publisher_test.exs b/test/pleroma/web/activity_pub/publisher_test.exs
index b50e22bbe..93bf5c345 100644
--- a/test/pleroma/web/activity_pub/publisher_test.exs
+++ b/test/pleroma/web/activity_pub/publisher_test.exs
@@ -23,7 +23,11 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
:ok
end
- setup_all do: clear_config([:instance, :federating], true)
+ setup_all do
+ clear_config([:instance, :federating], true)
+ clear_config([:instance, :quarantined_instances], [])
+ clear_config([:mrf_simple, :reject], [])
+ end
describe "gather_webfinger_links/1" do
test "it returns links" do
@@ -267,12 +271,14 @@ test "publish to url with with different ports" do
end
describe "publish/2" do
- test_with_mock "doesn't publish a non-public activity to quarantined instances.",
+ test_with_mock "doesn't publish any activity to quarantined or rejected instances.",
Pleroma.Web.Federator.Publisher,
[:passthrough],
[] do
Config.put([:instance, :quarantined_instances], [{"domain.com", "some reason"}])
+ Config.put([:mrf_simple, :reject], [{"rejected.com", "some reason"}])
+
follower =
insert(:user, %{
local: false,
@@ -280,9 +286,18 @@ test "publish to url with with different ports" do
ap_enabled: true
})
+ another_follower =
+ insert(:user, %{
+ local: false,
+ inbox: "https://rejected.com/users/nick2/inbox",
+ ap_enabled: true
+ })
+
actor = insert(:user, follower_address: follower.ap_id)
{:ok, follower, actor} = Pleroma.User.follow(follower, actor)
+ {:ok, _another_follower, actor} = Pleroma.User.follow(another_follower, actor)
+
actor = refresh_record(actor)
note_activity =
@@ -291,10 +306,18 @@ test "publish to url with with different ports" do
recipients: [follower.ap_id]
)
+ public_note_activity =
+ insert(:note_activity,
+ user: actor,
+ recipients: [follower.ap_id, @as_public]
+ )
+
res = Publisher.publish(actor, note_activity)
assert res == :ok
+ :ok = Publisher.publish(actor, public_note_activity)
+
assert not called(
Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
inbox: "https://domain.com/users/nick1/inbox",
@@ -302,6 +325,30 @@ test "publish to url with with different ports" do
id: note_activity.data["id"]
})
)
+
+ assert not called(
+ Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+ inbox: "https://domain.com/users/nick1/inbox",
+ actor_id: actor.id,
+ id: public_note_activity.data["id"]
+ })
+ )
+
+ assert not called(
+ Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+ inbox: "https://rejected.com/users/nick2/inbox",
+ actor_id: actor.id,
+ id: note_activity.data["id"]
+ })
+ )
+
+ assert not called(
+ Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+ inbox: "https://rejected.com/users/nick2/inbox",
+ actor_id: actor.id,
+ id: public_note_activity.data["id"]
+ })
+ )
end
test_with_mock "Publishes a non-public activity to non-quarantined instances.",
@@ -345,6 +392,8 @@ test "publish to url with with different ports" do
Pleroma.Web.Federator.Publisher,
[:passthrough],
[] do
+ Config.put([:instance, :quarantined_instances], [])
+
follower =
insert(:user, %{
local: false,
@@ -379,6 +428,8 @@ test "publish to url with with different ports" do
Pleroma.Web.Federator.Publisher,
[:passthrough],
[] do
+ clear_config([:instance, :quarantined_instances], [])
+
fetcher =
insert(:user,
local: false,
diff --git a/test/pleroma/web/activity_pub/side_effects_test.exs b/test/pleroma/web/activity_pub/side_effects_test.exs
index 82d43555f..e542c06f5 100644
--- a/test/pleroma/web/activity_pub/side_effects_test.exs
+++ b/test/pleroma/web/activity_pub/side_effects_test.exs
@@ -7,8 +7,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
use Pleroma.DataCase
alias Pleroma.Activity
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.Repo
@@ -17,6 +15,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Builder
alias Pleroma.Web.ActivityPub.SideEffects
+ alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.CommonAPI
import Mock
@@ -27,15 +26,22 @@ test "it streams out notifications and streams" do
author = insert(:user, local: true)
recipient = insert(:user, local: true)
- {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey")
+ {:ok, note_data, _meta} =
+ Builder.note(%Pleroma.Web.CommonAPI.ActivityDraft{
+ user: author,
+ to: [recipient.ap_id],
+ mentions: [recipient],
+ content_html: "hey",
+ extra: %{"id" => Utils.generate_object_id()}
+ })
{:ok, create_activity_data, _meta} =
- Builder.create(author, chat_message_data["id"], [recipient.ap_id])
+ Builder.create(author, note_data["id"], [recipient.ap_id])
{:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false)
{:ok, _create_activity, meta} =
- SideEffects.handle(create_activity, local: false, object_data: chat_message_data)
+ SideEffects.handle(create_activity, local: false, object_data: note_data)
assert [notification] = meta[:notifications]
@@ -58,7 +64,6 @@ test "it streams out notifications and streams" do
SideEffects.handle_after_transaction(meta)
assert called(Pleroma.Web.Streamer.stream(["user", "user:notification"], notification))
- assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], :_))
assert called(Pleroma.Web.Push.send(notification))
end
end
@@ -336,147 +341,6 @@ test "creates a notification", %{like: like, poster: poster} do
end
end
- describe "creation of ChatMessages" do
- test "notifies the recipient" do
- author = insert(:user, local: false)
- recipient = insert(:user, local: true)
-
- {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey")
-
- {:ok, create_activity_data, _meta} =
- Builder.create(author, chat_message_data["id"], [recipient.ap_id])
-
- {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false)
-
- {:ok, _create_activity, _meta} =
- SideEffects.handle(create_activity, local: false, object_data: chat_message_data)
-
- assert Repo.get_by(Notification, user_id: recipient.id, activity_id: create_activity.id)
- end
-
- test "it streams the created ChatMessage" do
- author = insert(:user, local: true)
- recipient = insert(:user, local: true)
-
- {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey")
-
- {:ok, create_activity_data, _meta} =
- Builder.create(author, chat_message_data["id"], [recipient.ap_id])
-
- {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false)
-
- {:ok, _create_activity, meta} =
- SideEffects.handle(create_activity, local: false, object_data: chat_message_data)
-
- assert [_, _] = meta[:streamables]
- end
-
- test "it creates a Chat and MessageReferences for the local users and bumps the unread count, except for the author" do
- author = insert(:user, local: true)
- recipient = insert(:user, local: true)
-
- {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey")
-
- {:ok, create_activity_data, _meta} =
- Builder.create(author, chat_message_data["id"], [recipient.ap_id])
-
- {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false)
-
- with_mocks([
- {
- Pleroma.Web.Streamer,
- [],
- [
- stream: fn _, _ -> nil end
- ]
- },
- {
- Pleroma.Web.Push,
- [],
- [
- send: fn _ -> nil end
- ]
- }
- ]) do
- {:ok, _create_activity, meta} =
- SideEffects.handle(create_activity, local: false, object_data: chat_message_data)
-
- # The notification gets created
- assert [notification] = meta[:notifications]
- assert notification.activity_id == create_activity.id
-
- # But it is not sent out
- refute called(Pleroma.Web.Streamer.stream(["user", "user:notification"], notification))
- refute called(Pleroma.Web.Push.send(notification))
-
- # Same for the user chat stream
- assert [{topics, _}, _] = meta[:streamables]
- assert topics == ["user", "user:pleroma_chat"]
- refute called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], :_))
-
- chat = Chat.get(author.id, recipient.ap_id)
-
- [cm_ref] = MessageReference.for_chat_query(chat) |> Repo.all()
-
- assert cm_ref.object.data["content"] == "hey"
- assert cm_ref.unread == false
-
- chat = Chat.get(recipient.id, author.ap_id)
-
- [cm_ref] = MessageReference.for_chat_query(chat) |> Repo.all()
-
- assert cm_ref.object.data["content"] == "hey"
- assert cm_ref.unread == true
- end
- end
-
- test "it creates a Chat for the local users and bumps the unread count" do
- author = insert(:user, local: false)
- recipient = insert(:user, local: true)
-
- {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey")
-
- {:ok, create_activity_data, _meta} =
- Builder.create(author, chat_message_data["id"], [recipient.ap_id])
-
- {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false)
-
- {:ok, _create_activity, _meta} =
- SideEffects.handle(create_activity, local: false, object_data: chat_message_data)
-
- # An object is created
- assert Object.get_by_ap_id(chat_message_data["id"])
-
- # The remote user won't get a chat
- chat = Chat.get(author.id, recipient.ap_id)
- refute chat
-
- # The local user will get a chat
- chat = Chat.get(recipient.id, author.ap_id)
- assert chat
-
- author = insert(:user, local: true)
- recipient = insert(:user, local: true)
-
- {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey")
-
- {:ok, create_activity_data, _meta} =
- Builder.create(author, chat_message_data["id"], [recipient.ap_id])
-
- {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false)
-
- {:ok, _create_activity, _meta} =
- SideEffects.handle(create_activity, local: false, object_data: chat_message_data)
-
- # Both users are local and get the chat
- chat = Chat.get(author.id, recipient.ap_id)
- assert chat
-
- chat = Chat.get(recipient.id, author.ap_id)
- assert chat
- end
- end
-
describe "announce objects" do
setup do
poster = insert(:user)
diff --git a/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs
index a0942ce8b..f8b56685b 100644
--- a/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier/audio_handling_test.exs
@@ -10,41 +10,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AudioHandlingTest do
alias Pleroma.Object
alias Pleroma.Web.ActivityPub.Transmogrifier
- import Pleroma.Factory
-
- test "it works for incoming listens" do
- _user = insert(:user, ap_id: "http://mastodon.example.org/users/admin")
-
- data = %{
- "@context" => "https://www.w3.org/ns/activitystreams",
- "to" => ["https://www.w3.org/ns/activitystreams#Public"],
- "cc" => [],
- "type" => "Listen",
- "id" => "http://mastodon.example.org/users/admin/listens/1234/activity",
- "actor" => "http://mastodon.example.org/users/admin",
- "object" => %{
- "type" => "Audio",
- "to" => ["https://www.w3.org/ns/activitystreams#Public"],
- "cc" => [],
- "id" => "http://mastodon.example.org/users/admin/listens/1234",
- "attributedTo" => "http://mastodon.example.org/users/admin",
- "title" => "lain radio episode 1",
- "artist" => "lain",
- "album" => "lain radio",
- "length" => 180_000
- }
- }
-
- {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
-
- object = Object.normalize(activity, fetch: false)
-
- assert object.data["title"] == "lain radio episode 1"
- assert object.data["artist"] == "lain"
- assert object.data["album"] == "lain radio"
- assert object.data["length"] == 180_000
- end
-
test "Funkwhale Audio object" do
Tesla.Mock.mock(fn
%{url: "https://channels.tests.funkwhale.audio/federation/actors/compositions"} ->
diff --git a/test/pleroma/web/activity_pub/transmogrifier/chat_message_test.exs b/test/pleroma/web/activity_pub/transmogrifier/chat_message_test.exs
deleted file mode 100644
index 958675835..000000000
--- a/test/pleroma/web/activity_pub/transmogrifier/chat_message_test.exs
+++ /dev/null
@@ -1,171 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageTest do
- use Pleroma.DataCase
-
- import Pleroma.Factory
-
- alias Pleroma.Activity
- alias Pleroma.Chat
- alias Pleroma.Object
- alias Pleroma.Web.ActivityPub.Transmogrifier
-
- describe "handle_incoming" do
- test "handles chonks with attachment" do
- data = %{
- "@context" => "https://www.w3.org/ns/activitystreams",
- "actor" => "https://honk.tedunangst.com/u/tedu",
- "id" => "https://honk.tedunangst.com/u/tedu/honk/x6gt8X8PcyGkQcXxzg1T",
- "object" => %{
- "attachment" => [
- %{
- "mediaType" => "image/jpeg",
- "name" => "298p3RG7j27tfsZ9RQ.jpg",
- "summary" => "298p3RG7j27tfsZ9RQ.jpg",
- "type" => "Document",
- "url" => "https://honk.tedunangst.com/d/298p3RG7j27tfsZ9RQ.jpg"
- }
- ],
- "attributedTo" => "https://honk.tedunangst.com/u/tedu",
- "content" => "",
- "id" => "https://honk.tedunangst.com/u/tedu/chonk/26L4wl5yCbn4dr4y1b",
- "published" => "2020-05-18T01:13:03Z",
- "to" => [
- "https://dontbulling.me/users/lain"
- ],
- "type" => "ChatMessage"
- },
- "published" => "2020-05-18T01:13:03Z",
- "to" => [
- "https://dontbulling.me/users/lain"
- ],
- "type" => "Create"
- }
-
- _user = insert(:user, ap_id: data["actor"])
- _user = insert(:user, ap_id: hd(data["to"]))
-
- assert {:ok, _activity} = Transmogrifier.handle_incoming(data)
- end
-
- test "it rejects messages that don't contain content" do
- data =
- File.read!("test/fixtures/create-chat-message.json")
- |> Jason.decode!()
-
- object =
- data["object"]
- |> Map.delete("content")
-
- data =
- data
- |> Map.put("object", object)
-
- _author =
- insert(:user, ap_id: data["actor"], local: false, last_refreshed_at: DateTime.utc_now())
-
- _recipient =
- insert(:user,
- ap_id: List.first(data["to"]),
- local: true,
- last_refreshed_at: DateTime.utc_now()
- )
-
- {:error, _} = Transmogrifier.handle_incoming(data)
- end
-
- test "it rejects messages that don't concern local users" do
- data =
- File.read!("test/fixtures/create-chat-message.json")
- |> Jason.decode!()
-
- _author =
- insert(:user, ap_id: data["actor"], local: false, last_refreshed_at: DateTime.utc_now())
-
- _recipient =
- insert(:user,
- ap_id: List.first(data["to"]),
- local: false,
- last_refreshed_at: DateTime.utc_now()
- )
-
- {:error, _} = Transmogrifier.handle_incoming(data)
- end
-
- test "it rejects messages where the `to` field of activity and object don't match" do
- data =
- File.read!("test/fixtures/create-chat-message.json")
- |> Jason.decode!()
-
- author = insert(:user, ap_id: data["actor"])
- _recipient = insert(:user, ap_id: List.first(data["to"]))
-
- data =
- data
- |> Map.put("to", author.ap_id)
-
- assert match?({:error, _}, Transmogrifier.handle_incoming(data))
- refute Object.get_by_ap_id(data["object"]["id"])
- end
-
- test "it fetches the actor if they aren't in our system" do
- Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
-
- data =
- File.read!("test/fixtures/create-chat-message.json")
- |> Jason.decode!()
- |> Map.put("actor", "http://mastodon.example.org/users/admin")
- |> put_in(["object", "actor"], "http://mastodon.example.org/users/admin")
-
- _recipient = insert(:user, ap_id: List.first(data["to"]), local: true)
-
- {:ok, %Activity{} = _activity} = Transmogrifier.handle_incoming(data)
- end
-
- test "it doesn't work for deactivated users" do
- data =
- File.read!("test/fixtures/create-chat-message.json")
- |> Jason.decode!()
-
- _author =
- insert(:user,
- ap_id: data["actor"],
- local: false,
- last_refreshed_at: DateTime.utc_now(),
- is_active: false
- )
-
- _recipient = insert(:user, ap_id: List.first(data["to"]), local: true)
-
- assert {:error, _} = Transmogrifier.handle_incoming(data)
- end
-
- test "it inserts it and creates a chat" do
- data =
- File.read!("test/fixtures/create-chat-message.json")
- |> Jason.decode!()
-
- author =
- insert(:user, ap_id: data["actor"], local: false, last_refreshed_at: DateTime.utc_now())
-
- recipient = insert(:user, ap_id: List.first(data["to"]), local: true)
-
- {:ok, %Activity{} = activity} = Transmogrifier.handle_incoming(data)
- assert activity.local == false
-
- assert activity.actor == author.ap_id
- assert activity.recipients == [recipient.ap_id, author.ap_id]
-
- %Object{} = object = Object.get_by_ap_id(activity.data["object"])
-
- assert object
- assert object.data["content"] == "You expected a cute girl? Too bad. alert('XSS')"
- assert match?(%{"firefox" => _}, object.data["emoji"])
-
- refute Chat.get(author.id, recipient.ap_id)
- assert Chat.get(recipient.id, author.ap_id)
- end
- end
-end
diff --git a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
index 4ab1d29e3..d6f9b0144 100644
--- a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
@@ -86,6 +86,37 @@ test "it works for incoming custom emoji reactions" do
)
end
+ test "it works for incoming unqualified emoji reactions" do
+ user = insert(:user)
+ other_user = insert(:user, local: false)
+ {:ok, activity} = CommonAPI.post(user, %{status: "hello"})
+
+ # woman detective emoji, unqualified
+ unqualified_emoji = [0x1F575, 0x200D, 0x2640] |> List.to_string()
+
+ data =
+ File.read!("test/fixtures/emoji-reaction.json")
+ |> Jason.decode!()
+ |> Map.put("object", activity.data["object"])
+ |> Map.put("actor", other_user.ap_id)
+ |> Map.put("content", unqualified_emoji)
+
+ {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
+
+ assert data["actor"] == other_user.ap_id
+ assert data["type"] == "EmojiReact"
+ assert data["id"] == "http://mastodon.example.org/users/admin#reactions/2"
+ assert data["object"] == activity.data["object"]
+ # woman detective emoji, fully qualified
+ emoji = [0x1F575, 0xFE0F, 0x200D, 0x2640, 0xFE0F] |> List.to_string()
+ assert data["content"] == emoji
+
+ object = Object.get_by_ap_id(data["object"])
+
+ assert object.data["reaction_count"] == 1
+ assert match?([[^emoji, _, _]], object.data["reactions"])
+ end
+
test "it reject invalid emoji reactions" do
user = insert(:user)
other_user = insert(:user, local: false)
diff --git a/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs
index 1846b2291..24df5ea61 100644
--- a/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier/note_handling_test.exs
@@ -707,4 +707,81 @@ test "take_emoji_tags/1" do
}
]
end
+
+ describe "fix_quote_url/1" do
+ test "a misskey quote should work", _ do
+ Tesla.Mock.mock(fn %{
+ method: :get,
+ url: "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924"
+ } ->
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/quoted_status.json"),
+ headers: HttpRequestMock.activitypub_object_headers()
+ }
+ end)
+
+ insert(:user, %{ap_id: "https://misskey.io/users/93492q0ip0"})
+ insert(:user, %{ap_id: "https://example.com/users/user"})
+
+ note =
+ "test/fixtures/misskey/quote.json"
+ |> File.read!()
+ |> Jason.decode!()
+
+ %{"quoteUri" => "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924"} =
+ Transmogrifier.fix_quote_url(note)
+ end
+
+ test "a fedibird quote should work", _ do
+ Tesla.Mock.mock(fn %{
+ method: :get,
+ url: "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924"
+ } ->
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/quoted_status.json"),
+ headers: HttpRequestMock.activitypub_object_headers()
+ }
+ end)
+
+ insert(:user, %{ap_id: "https://fedibird.com/users/akkoma_ap_integration_tester"})
+ insert(:user, %{ap_id: "https://example.com/users/user"})
+
+ note =
+ "test/fixtures/fedibird/quote.json"
+ |> File.read!()
+ |> Jason.decode!()
+
+ %{
+ "quoteUri" => "https://example.com/objects/43479e20-c0f8-4f49-bf7f-13fab8234924"
+ } = Transmogrifier.fix_quote_url(note)
+ end
+
+ test "quote fetching should stop after n levels", _ do
+ clear_config([:instance, :federation_incoming_replies_max_depth], 1)
+
+ Tesla.Mock.mock(fn %{
+ method: :get,
+ url: "https://misskey.io/notes/934gok3482"
+ } ->
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/misskey/recursive_quote.json"),
+ headers: HttpRequestMock.activitypub_object_headers()
+ }
+ end)
+
+ insert(:user, %{ap_id: "https://misskey.io/users/93492q0ip0"})
+
+ note =
+ "test/fixtures/misskey/recursive_quote.json"
+ |> File.read!()
+ |> Jason.decode!()
+
+ %{
+ "quoteUri" => "https://misskey.io/notes/934gok3482"
+ } = Transmogrifier.fix_quote_url(note)
+ end
+ end
end
diff --git a/test/pleroma/web/activity_pub/transmogrifier/question_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/question_handling_test.exs
index 32cf51e59..54cbb9c65 100644
--- a/test/pleroma/web/activity_pub/transmogrifier/question_handling_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier/question_handling_test.exs
@@ -33,8 +33,6 @@ test "Mastodon Question activity" do
assert object.data["context"] ==
"tag:mastodon.sdf.org,2019-05-10:objectId=15095122:objectType=Conversation"
- assert object.data["context_id"]
-
assert object.data["anyOf"] == []
assert Enum.sort(object.data["oneOf"]) ==
@@ -68,7 +66,6 @@ test "Mastodon Question activity" do
reply_object = Object.normalize(reply_activity, fetch: false)
assert reply_object.data["context"] == object.data["context"]
- assert reply_object.data["context_id"] == object.data["context_id"]
end
test "Mastodon Question activity with HTML tags in plaintext" do
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 06daf6a9f..ae2fc067a 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -107,6 +107,22 @@ test "it accepts Move activities" do
assert activity.data["target"] == new_user.ap_id
assert activity.data["type"] == "Move"
end
+
+ test "it fixes both the Create and object contexts in a reply" do
+ insert(:user, ap_id: "https://mk.absturztau.be/users/8ozbzjs3o8")
+ insert(:user, ap_id: "https://p.helene.moe/users/helene")
+
+ create_activity =
+ "test/fixtures/create-pleroma-reply-to-misskey-thread.json"
+ |> File.read!()
+ |> Jason.decode!()
+
+ assert {:ok, %Activity{} = activity} = Transmogrifier.handle_incoming(create_activity)
+
+ object = Object.normalize(activity, fetch: false)
+
+ assert activity.data["context"] == object.data["context"]
+ end
end
describe "prepare outgoing" do
@@ -216,7 +232,6 @@ test "it strips internal fields" do
assert is_nil(modified["object"]["like_count"])
assert is_nil(modified["object"]["announcements"])
assert is_nil(modified["object"]["announcement_count"])
- assert is_nil(modified["object"]["context_id"])
assert is_nil(modified["object"]["generator"])
end
@@ -231,7 +246,6 @@ test "it strips internal fields of article" do
assert is_nil(modified["object"]["like_count"])
assert is_nil(modified["object"]["announcements"])
assert is_nil(modified["object"]["announcement_count"])
- assert is_nil(modified["object"]["context_id"])
assert is_nil(modified["object"]["likes"])
end
@@ -273,20 +287,6 @@ test "it strips BCC field" do
assert is_nil(modified["bcc"])
end
- test "it can handle Listen activities" do
- listen_activity = insert(:listen)
-
- {:ok, modified} = Transmogrifier.prepare_outgoing(listen_activity.data)
-
- assert modified["type"] == "Listen"
-
- user = insert(:user)
-
- {:ok, activity} = CommonAPI.listen(user, %{"title" => "lain radio episode 1"})
-
- {:ok, _modified} = Transmogrifier.prepare_outgoing(activity.data)
- end
-
test "custom emoji urls are URI encoded" do
# :dinosaur: filename has a space -> dino walking.gif
user = insert(:user)
diff --git a/test/pleroma/web/activity_pub/utils_test.exs b/test/pleroma/web/activity_pub/utils_test.exs
index 62dc02f61..0d88303e3 100644
--- a/test/pleroma/web/activity_pub/utils_test.exs
+++ b/test/pleroma/web/activity_pub/utils_test.exs
@@ -429,7 +429,6 @@ test "returns map with id and published data" do
object = Object.normalize(note_activity, fetch: false)
res = Utils.lazy_put_activity_defaults(%{"context" => object.data["id"]})
assert res["context"] == object.data["id"]
- assert res["context_id"] == object.id
assert res["id"]
assert res["published"]
end
@@ -437,7 +436,6 @@ test "returns map with id and published data" do
test "returns map with fake id and published data" do
assert %{
"context" => "pleroma:fakecontext",
- "context_id" => -1,
"id" => "pleroma:fakeid",
"published" => _
} = Utils.lazy_put_activity_defaults(%{}, true)
@@ -454,13 +452,11 @@ test "returns activity data with object" do
})
assert res["context"] == object.data["id"]
- assert res["context_id"] == object.id
assert res["id"]
assert res["published"]
assert res["object"]["id"]
assert res["object"]["published"]
assert res["object"]["context"] == object.data["id"]
- assert res["object"]["context_id"] == object.id
end
end
diff --git a/test/pleroma/web/activity_pub/views/user_view_test.exs b/test/pleroma/web/activity_pub/views/user_view_test.exs
index f2de4d332..e49cb99d3 100644
--- a/test/pleroma/web/activity_pub/views/user_view_test.exs
+++ b/test/pleroma/web/activity_pub/views/user_view_test.exs
@@ -164,23 +164,4 @@ test "sets correct totalItems when follows are hidden but the follow counter is
assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user})
end
end
-
- describe "acceptsChatMessages" do
- test "it returns this value if it is set" do
- true_user = insert(:user, accepts_chat_messages: true)
- false_user = insert(:user, accepts_chat_messages: false)
- nil_user = insert(:user, accepts_chat_messages: nil)
-
- assert %{"capabilities" => %{"acceptsChatMessages" => true}} =
- UserView.render("user.json", user: true_user)
-
- assert %{"capabilities" => %{"acceptsChatMessages" => false}} =
- UserView.render("user.json", user: false_user)
-
- refute Map.has_key?(
- UserView.render("user.json", user: nil_user)["capabilities"],
- "acceptsChatMessages"
- )
- end
- end
end
diff --git a/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs b/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs
index f8cd103c6..d74e0281c 100644
--- a/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs
+++ b/test/pleroma/web/admin_api/controllers/admin_api_controller_test.exs
@@ -419,56 +419,6 @@ test "excludes reblogs by default", %{conn: conn, user: user} do
end
end
- describe "GET /api/pleroma/admin/users/:nickname/chats" do
- setup do
- user = insert(:user)
- recipients = insert_list(3, :user)
-
- Enum.each(recipients, fn recipient ->
- CommonAPI.post_chat_message(user, recipient, "yo")
- end)
-
- %{user: user}
- end
-
- test "renders user's chats", %{conn: conn, user: user} do
- conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/chats")
-
- assert json_response(conn, 200) |> length() == 3
- end
- end
-
- describe "GET /api/pleroma/admin/users/:nickname/chats unauthorized" do
- setup do
- user = insert(:user)
- recipient = insert(:user)
- CommonAPI.post_chat_message(user, recipient, "yo")
- %{conn: conn} = oauth_access(["read:chats"])
- %{conn: conn, user: user}
- end
-
- test "returns 403", %{conn: conn, user: user} do
- conn
- |> get("/api/pleroma/admin/users/#{user.nickname}/chats")
- |> json_response(403)
- end
- end
-
- describe "GET /api/pleroma/admin/users/:nickname/chats unauthenticated" do
- setup do
- user = insert(:user)
- recipient = insert(:user)
- CommonAPI.post_chat_message(user, recipient, "yo")
- %{conn: build_conn(), user: user}
- end
-
- test "returns 403", %{conn: conn, user: user} do
- conn
- |> get("/api/pleroma/admin/users/#{user.nickname}/chats")
- |> json_response(403)
- end
- end
-
describe "GET /api/pleroma/admin/moderation_log" do
setup do
moderator = insert(:user, is_moderator: true)
diff --git a/test/pleroma/web/admin_api/controllers/announcement_controller_test.exs b/test/pleroma/web/admin_api/controllers/announcement_controller_test.exs
new file mode 100644
index 000000000..5b8148c05
--- /dev/null
+++ b/test/pleroma/web/admin_api/controllers/announcement_controller_test.exs
@@ -0,0 +1,281 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.AdminAPI.AnnouncementControllerTest do
+ use Pleroma.Web.ConnCase
+
+ import Pleroma.Factory
+
+ setup do
+ admin = insert(:user, is_admin: true)
+ token = insert(:oauth_admin_token, user: admin)
+
+ conn =
+ build_conn()
+ |> assign(:user, admin)
+ |> assign(:token, token)
+
+ {:ok, %{admin: admin, token: token, conn: conn}}
+ end
+
+ describe "GET /api/v1/pleroma/admin/announcements" do
+ test "it lists all announcements", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ response =
+ conn
+ |> get("/api/v1/pleroma/admin/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert [%{"id" => ^id}] = response
+ end
+
+ test "it paginates announcements", %{conn: conn} do
+ _announcements = Enum.map(0..20, fn _ -> insert(:announcement) end)
+
+ response =
+ conn
+ |> get("/api/v1/pleroma/admin/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert length(response) == 20
+ end
+
+ test "it paginates announcements with custom params", %{conn: conn} do
+ announcements = Enum.map(0..20, fn _ -> insert(:announcement) end)
+
+ response =
+ conn
+ |> get("/api/v1/pleroma/admin/announcements", limit: 5, offset: 7)
+ |> json_response_and_validate_schema(:ok)
+
+ assert length(response) == 5
+ assert Enum.at(response, 0)["id"] == Enum.at(announcements, 7).id
+ end
+
+ test "it returns empty list with out-of-bounds offset", %{conn: conn} do
+ _announcements = Enum.map(0..20, fn _ -> insert(:announcement) end)
+
+ response =
+ conn
+ |> get("/api/v1/pleroma/admin/announcements", offset: 21)
+ |> json_response_and_validate_schema(:ok)
+
+ assert [] = response
+ end
+
+ test "it rejects invalid pagination params", %{conn: conn} do
+ conn
+ |> get("/api/v1/pleroma/admin/announcements", limit: 0)
+ |> json_response_and_validate_schema(400)
+
+ conn
+ |> get("/api/v1/pleroma/admin/announcements", limit: -1)
+ |> json_response_and_validate_schema(400)
+
+ conn
+ |> get("/api/v1/pleroma/admin/announcements", offset: -1)
+ |> json_response_and_validate_schema(400)
+ end
+ end
+
+ describe "GET /api/v1/pleroma/admin/announcements/:id" do
+ test "it displays one announcement", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ response =
+ conn
+ |> get("/api/v1/pleroma/admin/announcements/#{id}")
+ |> json_response_and_validate_schema(:ok)
+
+ assert %{"id" => ^id} = response
+ end
+
+ test "it returns not found for non-existent id", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ _response =
+ conn
+ |> get("/api/v1/pleroma/admin/announcements/#{id}xxx")
+ |> json_response_and_validate_schema(:not_found)
+ end
+ end
+
+ describe "DELETE /api/v1/pleroma/admin/announcements/:id" do
+ test "it deletes specified announcement", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ _response =
+ conn
+ |> delete("/api/v1/pleroma/admin/announcements/#{id}")
+ |> json_response_and_validate_schema(:ok)
+ end
+
+ test "it returns not found for non-existent id", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ _response =
+ conn
+ |> delete("/api/v1/pleroma/admin/announcements/#{id}xxx")
+ |> json_response_and_validate_schema(:not_found)
+
+ assert %{id: ^id} = Pleroma.Announcement.get_by_id(id)
+ end
+ end
+
+ describe "PATCH /api/v1/pleroma/admin/announcements/:id" do
+ test "it returns not found for non-existent id", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ _response =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> patch("/api/v1/pleroma/admin/announcements/#{id}xxx", %{})
+ |> json_response_and_validate_schema(:not_found)
+
+ assert %{id: ^id} = Pleroma.Announcement.get_by_id(id)
+ end
+
+ test "it updates a field", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
+ starts_at = NaiveDateTime.add(now, -10, :second)
+
+ _response =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
+ starts_at: NaiveDateTime.to_iso8601(starts_at)
+ })
+ |> json_response_and_validate_schema(:ok)
+
+ new = Pleroma.Announcement.get_by_id(id)
+
+ assert NaiveDateTime.compare(new.starts_at, starts_at) == :eq
+ end
+
+ test "it updates with time with utc timezone", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ now = DateTime.now("Etc/UTC") |> elem(1) |> DateTime.truncate(:second)
+ starts_at = DateTime.add(now, -10, :second)
+
+ _response =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
+ starts_at: DateTime.to_iso8601(starts_at)
+ })
+ |> json_response_and_validate_schema(:ok)
+
+ new = Pleroma.Announcement.get_by_id(id)
+
+ assert DateTime.compare(new.starts_at, starts_at) == :eq
+ end
+
+ test "it updates a data field", %{conn: conn} do
+ %{id: id} = announcement = insert(:announcement, data: %{"all_day" => true})
+
+ assert announcement.data["all_day"] == true
+
+ new_content = "new content"
+
+ response =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
+ content: new_content
+ })
+ |> json_response_and_validate_schema(:ok)
+
+ assert response["content"] == new_content
+ assert response["all_day"] == true
+
+ new = Pleroma.Announcement.get_by_id(id)
+
+ assert new.data["content"] == new_content
+ assert new.data["all_day"] == true
+ end
+
+ test "it nullifies a nullable field", %{conn: conn} do
+ now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
+ starts_at = NaiveDateTime.add(now, -10, :second)
+
+ %{id: id} = insert(:announcement, starts_at: starts_at)
+
+ response =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> patch("/api/v1/pleroma/admin/announcements/#{id}", %{
+ starts_at: nil
+ })
+ |> json_response_and_validate_schema(:ok)
+
+ assert response["starts_at"] == nil
+
+ new = Pleroma.Announcement.get_by_id(id)
+
+ assert new.starts_at == nil
+ end
+ end
+
+ describe "POST /api/v1/pleroma/admin/announcements" do
+ test "it creates an announcement", %{conn: conn} do
+ content = "test post announcement api"
+
+ now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second)
+ starts_at = NaiveDateTime.add(now, -10, :second)
+ ends_at = NaiveDateTime.add(now, 10, :second)
+
+ response =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/pleroma/admin/announcements", %{
+ "content" => content,
+ "starts_at" => NaiveDateTime.to_iso8601(starts_at),
+ "ends_at" => NaiveDateTime.to_iso8601(ends_at),
+ "all_day" => true
+ })
+ |> json_response_and_validate_schema(:ok)
+
+ assert %{"content" => ^content, "all_day" => true} = response
+
+ announcement = Pleroma.Announcement.get_by_id(response["id"])
+
+ assert not is_nil(announcement)
+
+ assert NaiveDateTime.compare(announcement.starts_at, starts_at) == :eq
+ assert NaiveDateTime.compare(announcement.ends_at, ends_at) == :eq
+ end
+
+ test "creating with time with utc timezones", %{conn: conn} do
+ content = "test post announcement api"
+
+ now = DateTime.now("Etc/UTC") |> elem(1) |> DateTime.truncate(:second)
+ starts_at = DateTime.add(now, -10, :second)
+ ends_at = DateTime.add(now, 10, :second)
+
+ response =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/pleroma/admin/announcements", %{
+ "content" => content,
+ "starts_at" => DateTime.to_iso8601(starts_at),
+ "ends_at" => DateTime.to_iso8601(ends_at),
+ "all_day" => true
+ })
+ |> json_response_and_validate_schema(:ok)
+
+ assert %{"content" => ^content, "all_day" => true} = response
+
+ announcement = Pleroma.Announcement.get_by_id(response["id"])
+
+ assert not is_nil(announcement)
+
+ assert DateTime.compare(announcement.starts_at, starts_at) == :eq
+ assert DateTime.compare(announcement.ends_at, ends_at) == :eq
+ end
+ end
+end
diff --git a/test/pleroma/web/admin_api/controllers/chat_controller_test.exs b/test/pleroma/web/admin_api/controllers/chat_controller_test.exs
deleted file mode 100644
index 0e8f7beef..000000000
--- a/test/pleroma/web/admin_api/controllers/chat_controller_test.exs
+++ /dev/null
@@ -1,218 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.AdminAPI.ChatControllerTest do
- use Pleroma.Web.ConnCase, async: true
-
- import Pleroma.Factory
-
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.ModerationLog
- alias Pleroma.Object
- alias Pleroma.Repo
- alias Pleroma.Web.CommonAPI
-
- defp admin_setup do
- admin = insert(:user, is_admin: true)
- token = insert(:oauth_admin_token, user: admin)
-
- conn =
- build_conn()
- |> assign(:user, admin)
- |> assign(:token, token)
-
- {:ok, %{admin: admin, token: token, conn: conn}}
- end
-
- describe "DELETE /api/pleroma/admin/chats/:id/messages/:message_id" do
- setup do: admin_setup()
-
- test "it deletes a message from the chat", %{conn: conn, admin: admin} do
- user = insert(:user)
- recipient = insert(:user)
-
- {:ok, message} =
- CommonAPI.post_chat_message(user, recipient, "Hello darkness my old friend")
-
- object = Object.normalize(message, fetch: false)
-
- chat = Chat.get(user.id, recipient.ap_id)
- recipient_chat = Chat.get(recipient.id, user.ap_id)
-
- cm_ref = MessageReference.for_chat_and_object(chat, object)
- recipient_cm_ref = MessageReference.for_chat_and_object(recipient_chat, object)
-
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}")
- |> json_response_and_validate_schema(200)
-
- log_entry = Repo.one(ModerationLog)
-
- assert ModerationLog.get_log_entry_message(log_entry) ==
- "@#{admin.nickname} deleted chat message ##{cm_ref.id}"
-
- assert result["id"] == cm_ref.id
- refute MessageReference.get_by_id(cm_ref.id)
- refute MessageReference.get_by_id(recipient_cm_ref.id)
- assert %{data: %{"type" => "Tombstone"}} = Object.get_by_id(object.id)
- end
- end
-
- describe "GET /api/pleroma/admin/chats/:id/messages" do
- setup do: admin_setup()
-
- test "it paginates", %{conn: conn} do
- user = insert(:user)
- recipient = insert(:user)
-
- Enum.each(1..30, fn _ ->
- {:ok, _} = CommonAPI.post_chat_message(user, recipient, "hey")
- end)
-
- chat = Chat.get(user.id, recipient.ap_id)
-
- result =
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}/messages")
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 20
-
- result =
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}")
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 10
- end
-
- test "it returns the messages for a given chat", %{conn: conn} do
- user = insert(:user)
- other_user = insert(:user)
- third_user = insert(:user)
-
- {:ok, _} = CommonAPI.post_chat_message(user, other_user, "hey")
- {:ok, _} = CommonAPI.post_chat_message(user, third_user, "hey")
- {:ok, _} = CommonAPI.post_chat_message(user, other_user, "how are you?")
- {:ok, _} = CommonAPI.post_chat_message(other_user, user, "fine, how about you?")
-
- chat = Chat.get(user.id, other_user.ap_id)
-
- result =
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}/messages")
- |> json_response_and_validate_schema(200)
-
- result
- |> Enum.each(fn message ->
- assert message["chat_id"] == chat.id |> to_string()
- end)
-
- assert length(result) == 3
- end
- end
-
- describe "GET /api/pleroma/admin/chats/:id" do
- setup do: admin_setup()
-
- test "it returns a chat", %{conn: conn} do
- user = insert(:user)
- other_user = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
-
- result =
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}")
- |> json_response_and_validate_schema(200)
-
- assert result["id"] == to_string(chat.id)
- assert %{} = result["sender"]
- assert %{} = result["receiver"]
- refute result["account"]
- end
- end
-
- describe "unauthorized chat moderation" do
- setup do
- user = insert(:user)
- recipient = insert(:user)
-
- {:ok, message} = CommonAPI.post_chat_message(user, recipient, "Yo")
- object = Object.normalize(message, fetch: false)
- chat = Chat.get(user.id, recipient.ap_id)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- %{conn: conn} = oauth_access(["read:chats", "write:chats"])
- %{conn: conn, chat: chat, cm_ref: cm_ref}
- end
-
- test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{
- conn: conn,
- chat: chat,
- cm_ref: cm_ref
- } do
- conn
- |> put_req_header("content-type", "application/json")
- |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}")
- |> json_response(403)
-
- assert MessageReference.get_by_id(cm_ref.id) == cm_ref
- end
-
- test "GET /api/pleroma/admin/chats/:id/messages", %{conn: conn, chat: chat} do
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}/messages")
- |> json_response(403)
- end
-
- test "GET /api/pleroma/admin/chats/:id", %{conn: conn, chat: chat} do
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}")
- |> json_response(403)
- end
- end
-
- describe "unauthenticated chat moderation" do
- setup do
- user = insert(:user)
- recipient = insert(:user)
-
- {:ok, message} = CommonAPI.post_chat_message(user, recipient, "Yo")
- object = Object.normalize(message, fetch: false)
- chat = Chat.get(user.id, recipient.ap_id)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- %{conn: build_conn(), chat: chat, cm_ref: cm_ref}
- end
-
- test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{
- conn: conn,
- chat: chat,
- cm_ref: cm_ref
- } do
- conn
- |> put_req_header("content-type", "application/json")
- |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}")
- |> json_response(403)
-
- assert MessageReference.get_by_id(cm_ref.id) == cm_ref
- end
-
- test "GET /api/pleroma/admin/chats/:id/messages", %{conn: conn, chat: chat} do
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}/messages")
- |> json_response(403)
- end
-
- test "GET /api/pleroma/admin/chats/:id", %{conn: conn, chat: chat} do
- conn
- |> get("/api/pleroma/admin/chats/#{chat.id}")
- |> json_response(403)
- end
- end
-end
diff --git a/test/pleroma/web/admin_api/controllers/config_controller_test.exs b/test/pleroma/web/admin_api/controllers/config_controller_test.exs
deleted file mode 100644
index 9c9e8513c..000000000
--- a/test/pleroma/web/admin_api/controllers/config_controller_test.exs
+++ /dev/null
@@ -1,1525 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do
- use Pleroma.Web.ConnCase
-
- import ExUnit.CaptureLog
- import Pleroma.Factory
-
- alias Pleroma.ConfigDB
-
- setup do
- admin = insert(:user, is_admin: true)
- token = insert(:oauth_admin_token, user: admin)
-
- conn =
- build_conn()
- |> assign(:user, admin)
- |> assign(:token, token)
-
- {:ok, %{admin: admin, token: token, conn: conn}}
- end
-
- describe "GET /api/pleroma/admin/config" do
- setup do: clear_config(:configurable_from_database, true)
-
- test "when configuration from database is off", %{conn: conn} do
- clear_config(:configurable_from_database, false)
- conn = get(conn, "/api/pleroma/admin/config")
-
- assert json_response_and_validate_schema(conn, 400) ==
- %{
- "error" => "You must enable configurable_from_database in your config file."
- }
- end
-
- test "with settings only in db", %{conn: conn} do
- config1 = insert(:config)
- config2 = insert(:config)
-
- conn = get(conn, "/api/pleroma/admin/config?only_db=true")
-
- %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => key1,
- "value" => _
- },
- %{
- "group" => ":pleroma",
- "key" => key2,
- "value" => _
- }
- ]
- } = json_response_and_validate_schema(conn, 200)
-
- assert key1 == inspect(config1.key)
- assert key2 == inspect(config2.key)
- end
-
- test "db is added to settings that are in db", %{conn: conn} do
- _config = insert(:config, key: ":instance", value: [name: "Some name"])
-
- %{"configs" => configs} =
- conn
- |> get("/api/pleroma/admin/config")
- |> json_response_and_validate_schema(200)
-
- [instance_config] =
- Enum.filter(configs, fn %{"group" => group, "key" => key} ->
- group == ":pleroma" and key == ":instance"
- end)
-
- assert instance_config["db"] == [":name"]
- end
-
- test "merged default setting with db settings", %{conn: conn} do
- config1 = insert(:config)
- config2 = insert(:config)
-
- config3 =
- insert(:config,
- value: [k1: :v1, k2: :v2]
- )
-
- %{"configs" => configs} =
- conn
- |> get("/api/pleroma/admin/config")
- |> json_response_and_validate_schema(200)
-
- assert length(configs) > 3
-
- saved_configs = [config1, config2, config3]
- keys = Enum.map(saved_configs, &inspect(&1.key))
-
- received_configs =
- Enum.filter(configs, fn %{"group" => group, "key" => key} ->
- group == ":pleroma" and key in keys
- end)
-
- assert length(received_configs) == 3
-
- db_keys =
- config3.value
- |> Keyword.keys()
- |> ConfigDB.to_json_types()
-
- keys = Enum.map(saved_configs -- [config3], &inspect(&1.key))
-
- values = Enum.map(saved_configs, &ConfigDB.to_json_types(&1.value))
-
- mapset_keys = MapSet.new(keys ++ db_keys)
-
- Enum.each(received_configs, fn %{"value" => value, "db" => db} ->
- db = MapSet.new(db)
- assert MapSet.subset?(db, mapset_keys)
-
- assert value in values
- end)
- end
-
- test "subkeys with full update right merge", %{conn: conn} do
- insert(:config,
- key: ":emoji",
- value: [groups: [a: 1, b: 2], key: [a: 1]]
- )
-
- insert(:config,
- key: ":assets",
- value: [mascots: [a: 1, b: 2], key: [a: 1]]
- )
-
- %{"configs" => configs} =
- conn
- |> get("/api/pleroma/admin/config")
- |> json_response_and_validate_schema(200)
-
- vals =
- Enum.filter(configs, fn %{"group" => group, "key" => key} ->
- group == ":pleroma" and key in [":emoji", ":assets"]
- end)
-
- emoji = Enum.find(vals, fn %{"key" => key} -> key == ":emoji" end)
- assets = Enum.find(vals, fn %{"key" => key} -> key == ":assets" end)
-
- emoji_val = ConfigDB.to_elixir_types(emoji["value"])
- assets_val = ConfigDB.to_elixir_types(assets["value"])
-
- assert emoji_val[:groups] == [a: 1, b: 2]
- assert assets_val[:mascots] == [a: 1, b: 2]
- end
-
- test "with valid `admin_token` query parameter, skips OAuth scopes check" do
- clear_config([:admin_token], "password123")
-
- build_conn()
- |> get("/api/pleroma/admin/config?admin_token=password123")
- |> json_response_and_validate_schema(200)
- end
- end
-
- test "POST /api/pleroma/admin/config with configdb disabled", %{conn: conn} do
- clear_config(:configurable_from_database, false)
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{"configs" => []})
-
- assert json_response_and_validate_schema(conn, 400) ==
- %{"error" => "You must enable configurable_from_database in your config file."}
- end
-
- describe "POST /api/pleroma/admin/config" do
- setup do
- http = Application.get_env(:pleroma, :http)
-
- on_exit(fn ->
- Application.delete_env(:pleroma, :key1)
- Application.delete_env(:pleroma, :key2)
- Application.delete_env(:pleroma, :key3)
- Application.delete_env(:pleroma, :key4)
- Application.delete_env(:pleroma, :keyaa1)
- Application.delete_env(:pleroma, :keyaa2)
- Application.delete_env(:pleroma, Pleroma.Web.Endpoint.NotReal)
- Application.delete_env(:pleroma, Pleroma.Captcha.NotReal)
- Application.put_env(:pleroma, :http, http)
- Application.put_env(:tesla, :adapter, Tesla.Mock)
- Restarter.Pleroma.refresh()
- end)
- end
-
- setup do: clear_config(:configurable_from_database, true)
-
- @tag capture_log: true
- test "create new config setting in db", %{conn: conn} do
- ueberauth = Application.get_env(:ueberauth, Ueberauth)
- on_exit(fn -> Application.put_env(:ueberauth, Ueberauth, ueberauth) end)
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{group: ":pleroma", key: ":key1", value: "value1"},
- %{
- group: ":ueberauth",
- key: "Ueberauth",
- value: [%{"tuple" => [":consumer_secret", "aaaa"]}]
- },
- %{
- group: ":pleroma",
- key: ":key2",
- value: %{
- ":nested_1" => "nested_value1",
- ":nested_2" => [
- %{":nested_22" => "nested_value222"},
- %{":nested_33" => %{":nested_44" => "nested_444"}}
- ]
- }
- },
- %{
- group: ":pleroma",
- key: ":key3",
- value: [
- %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
- %{"nested_4" => true}
- ]
- },
- %{
- group: ":pleroma",
- key: ":key4",
- value: %{":nested_5" => ":upload", "endpoint" => "https://example.com"}
- },
- %{
- group: ":idna",
- key: ":key5",
- value: %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => "value1",
- "db" => [":key1"]
- },
- %{
- "group" => ":ueberauth",
- "key" => "Ueberauth",
- "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}],
- "db" => [":consumer_secret"]
- },
- %{
- "group" => ":pleroma",
- "key" => ":key2",
- "value" => %{
- ":nested_1" => "nested_value1",
- ":nested_2" => [
- %{":nested_22" => "nested_value222"},
- %{":nested_33" => %{":nested_44" => "nested_444"}}
- ]
- },
- "db" => [":key2"]
- },
- %{
- "group" => ":pleroma",
- "key" => ":key3",
- "value" => [
- %{"nested_3" => ":nested_3", "nested_33" => "nested_33"},
- %{"nested_4" => true}
- ],
- "db" => [":key3"]
- },
- %{
- "group" => ":pleroma",
- "key" => ":key4",
- "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"},
- "db" => [":key4"]
- },
- %{
- "group" => ":idna",
- "key" => ":key5",
- "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]},
- "db" => [":key5"]
- }
- ],
- "need_reboot" => false
- }
-
- assert Application.get_env(:pleroma, :key1) == "value1"
-
- assert Application.get_env(:pleroma, :key2) == %{
- nested_1: "nested_value1",
- nested_2: [
- %{nested_22: "nested_value222"},
- %{nested_33: %{nested_44: "nested_444"}}
- ]
- }
-
- assert Application.get_env(:pleroma, :key3) == [
- %{"nested_3" => :nested_3, "nested_33" => "nested_33"},
- %{"nested_4" => true}
- ]
-
- assert Application.get_env(:pleroma, :key4) == %{
- "endpoint" => "https://example.com",
- nested_5: :upload
- }
-
- assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []}
- end
-
- test "save configs setting without explicit key", %{conn: conn} do
- level = Application.get_env(:quack, :level)
- meta = Application.get_env(:quack, :meta)
- webhook_url = Application.get_env(:quack, :webhook_url)
-
- on_exit(fn ->
- Application.put_env(:quack, :level, level)
- Application.put_env(:quack, :meta, meta)
- Application.put_env(:quack, :webhook_url, webhook_url)
- end)
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":quack",
- key: ":level",
- value: ":info"
- },
- %{
- group: ":quack",
- key: ":meta",
- value: [":none"]
- },
- %{
- group: ":quack",
- key: ":webhook_url",
- value: "https://hooks.slack.com/services/KEY"
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":quack",
- "key" => ":level",
- "value" => ":info",
- "db" => [":level"]
- },
- %{
- "group" => ":quack",
- "key" => ":meta",
- "value" => [":none"],
- "db" => [":meta"]
- },
- %{
- "group" => ":quack",
- "key" => ":webhook_url",
- "value" => "https://hooks.slack.com/services/KEY",
- "db" => [":webhook_url"]
- }
- ],
- "need_reboot" => false
- }
-
- assert Application.get_env(:quack, :level) == :info
- assert Application.get_env(:quack, :meta) == [:none]
- assert Application.get_env(:quack, :webhook_url) == "https://hooks.slack.com/services/KEY"
- end
-
- test "saving config with partial update", %{conn: conn} do
- insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: 2))
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]}
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => [
- %{"tuple" => [":key1", 1]},
- %{"tuple" => [":key2", 2]},
- %{"tuple" => [":key3", 3]}
- ],
- "db" => [":key1", ":key2", ":key3"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "saving config which need pleroma reboot", %{conn: conn} do
- clear_config([:shout, :enabled], true)
-
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post(
- "/api/pleroma/admin/config",
- %{
- configs: [
- %{group: ":pleroma", key: ":shout", value: [%{"tuple" => [":enabled", true]}]}
- ]
- }
- )
- |> json_response_and_validate_schema(200) == %{
- "configs" => [
- %{
- "db" => [":enabled"],
- "group" => ":pleroma",
- "key" => ":shout",
- "value" => [%{"tuple" => [":enabled", true]}]
- }
- ],
- "need_reboot" => true
- }
-
- configs =
- conn
- |> get("/api/pleroma/admin/config")
- |> json_response_and_validate_schema(200)
-
- assert configs["need_reboot"]
-
- capture_log(fn ->
- assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) ==
- %{}
- end) =~ "pleroma restarted"
-
- configs =
- conn
- |> get("/api/pleroma/admin/config")
- |> json_response_and_validate_schema(200)
-
- assert configs["need_reboot"] == false
- end
-
- test "update setting which need reboot, don't change reboot flag until reboot", %{conn: conn} do
- clear_config([:shout, :enabled], true)
-
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post(
- "/api/pleroma/admin/config",
- %{
- configs: [
- %{group: ":pleroma", key: ":shout", value: [%{"tuple" => [":enabled", true]}]}
- ]
- }
- )
- |> json_response_and_validate_schema(200) == %{
- "configs" => [
- %{
- "db" => [":enabled"],
- "group" => ":pleroma",
- "key" => ":shout",
- "value" => [%{"tuple" => [":enabled", true]}]
- }
- ],
- "need_reboot" => true
- }
-
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]}
- ]
- })
- |> json_response_and_validate_schema(200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => [
- %{"tuple" => [":key3", 3]}
- ],
- "db" => [":key3"]
- }
- ],
- "need_reboot" => true
- }
-
- capture_log(fn ->
- assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) ==
- %{}
- end) =~ "pleroma restarted"
-
- configs =
- conn
- |> get("/api/pleroma/admin/config")
- |> json_response_and_validate_schema(200)
-
- assert configs["need_reboot"] == false
- end
-
- test "saving config with nested merge", %{conn: conn} do
- insert(:config, key: :key1, value: [key1: 1, key2: [k1: 1, k2: 2]])
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":pleroma",
- key: ":key1",
- value: [
- %{"tuple" => [":key3", 3]},
- %{
- "tuple" => [
- ":key2",
- [
- %{"tuple" => [":k2", 1]},
- %{"tuple" => [":k3", 3]}
- ]
- ]
- }
- ]
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => [
- %{"tuple" => [":key1", 1]},
- %{"tuple" => [":key3", 3]},
- %{
- "tuple" => [
- ":key2",
- [
- %{"tuple" => [":k1", 1]},
- %{"tuple" => [":k2", 1]},
- %{"tuple" => [":k3", 3]}
- ]
- ]
- }
- ],
- "db" => [":key1", ":key3", ":key2"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "saving special atoms", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => [
- %{
- "tuple" => [
- ":ssl_options",
- [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}]
- ]
- }
- ]
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => [
- %{
- "tuple" => [
- ":ssl_options",
- [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}]
- ]
- }
- ],
- "db" => [":ssl_options"]
- }
- ],
- "need_reboot" => false
- }
-
- assert Application.get_env(:pleroma, :key1) == [
- ssl_options: [versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"]]
- ]
- end
-
- test "saving full setting if value is in full_key_update list", %{conn: conn} do
- backends = Application.get_env(:logger, :backends)
- on_exit(fn -> Application.put_env(:logger, :backends, backends) end)
-
- insert(:config,
- group: :logger,
- key: :backends,
- value: []
- )
-
- Pleroma.Config.TransferTask.load_and_update_env([], false)
-
- assert Application.get_env(:logger, :backends) == []
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":logger",
- key: ":backends",
- value: [":console"]
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":logger",
- "key" => ":backends",
- "value" => [
- ":console"
- ],
- "db" => [":backends"]
- }
- ],
- "need_reboot" => false
- }
-
- assert Application.get_env(:logger, :backends) == [
- :console
- ]
- end
-
- test "saving full setting if value is not keyword", %{conn: conn} do
- insert(:config,
- group: :tesla,
- key: :adapter,
- value: Tesla.Adapter.Hackey
- )
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{group: ":tesla", key: ":adapter", value: "Tesla.Adapter.Httpc"}
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":tesla",
- "key" => ":adapter",
- "value" => "Tesla.Adapter.Httpc",
- "db" => [":adapter"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "update config setting & delete with fallback to default value", %{
- conn: conn,
- admin: admin,
- token: token
- } do
- ueberauth = Application.get_env(:ueberauth, Ueberauth)
- insert(:config, key: :keyaa1)
- insert(:config, key: :keyaa2)
-
- config3 =
- insert(:config,
- group: :ueberauth,
- key: Ueberauth
- )
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{group: ":pleroma", key: ":keyaa1", value: "another_value"},
- %{group: ":pleroma", key: ":keyaa2", value: "another_value"}
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":keyaa1",
- "value" => "another_value",
- "db" => [":keyaa1"]
- },
- %{
- "group" => ":pleroma",
- "key" => ":keyaa2",
- "value" => "another_value",
- "db" => [":keyaa2"]
- }
- ],
- "need_reboot" => false
- }
-
- assert Application.get_env(:pleroma, :keyaa1) == "another_value"
- assert Application.get_env(:pleroma, :keyaa2) == "another_value"
- assert Application.get_env(:ueberauth, Ueberauth) == config3.value
-
- conn =
- build_conn()
- |> assign(:user, admin)
- |> assign(:token, token)
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{group: ":pleroma", key: ":keyaa2", delete: true},
- %{
- group: ":ueberauth",
- key: "Ueberauth",
- delete: true
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [],
- "need_reboot" => false
- }
-
- assert Application.get_env(:ueberauth, Ueberauth) == ueberauth
- refute Keyword.has_key?(Application.get_all_env(:pleroma), :keyaa2)
- end
-
- test "common config example", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- "group" => ":pleroma",
- "key" => "Pleroma.Captcha.NotReal",
- "value" => [
- %{"tuple" => [":enabled", false]},
- %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},
- %{"tuple" => [":seconds_valid", 60]},
- %{"tuple" => [":path", ""]},
- %{"tuple" => [":key1", nil]},
- %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},
- %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]},
- %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]},
- %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]},
- %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]},
- %{"tuple" => [":name", "Pleroma"]}
- ]
- }
- ]
- })
-
- assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma"
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => "Pleroma.Captcha.NotReal",
- "value" => [
- %{"tuple" => [":enabled", false]},
- %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]},
- %{"tuple" => [":seconds_valid", 60]},
- %{"tuple" => [":path", ""]},
- %{"tuple" => [":key1", nil]},
- %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},
- %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]},
- %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]},
- %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]},
- %{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]},
- %{"tuple" => [":name", "Pleroma"]}
- ],
- "db" => [
- ":enabled",
- ":method",
- ":seconds_valid",
- ":path",
- ":key1",
- ":partial_chain",
- ":regex1",
- ":regex2",
- ":regex3",
- ":regex4",
- ":name"
- ]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "tuples with more than two values", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- "group" => ":pleroma",
- "key" => "Pleroma.Web.Endpoint.NotReal",
- "value" => [
- %{
- "tuple" => [
- ":http",
- [
- %{
- "tuple" => [
- ":key2",
- [
- %{
- "tuple" => [
- ":_",
- [
- %{
- "tuple" => [
- "/api/v1/streaming",
- "Pleroma.Web.MastodonAPI.WebsocketHandler",
- []
- ]
- },
- %{
- "tuple" => [
- "/websocket",
- "Phoenix.Endpoint.CowboyWebSocket",
- %{
- "tuple" => [
- "Phoenix.Transports.WebSocket",
- %{
- "tuple" => [
- "Pleroma.Web.Endpoint",
- "Pleroma.Web.UserSocket",
- []
- ]
- }
- ]
- }
- ]
- },
- %{
- "tuple" => [
- ":_",
- "Phoenix.Endpoint.Cowboy2Handler",
- %{"tuple" => ["Pleroma.Web.Endpoint", []]}
- ]
- }
- ]
- ]
- }
- ]
- ]
- }
- ]
- ]
- }
- ]
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => "Pleroma.Web.Endpoint.NotReal",
- "value" => [
- %{
- "tuple" => [
- ":http",
- [
- %{
- "tuple" => [
- ":key2",
- [
- %{
- "tuple" => [
- ":_",
- [
- %{
- "tuple" => [
- "/api/v1/streaming",
- "Pleroma.Web.MastodonAPI.WebsocketHandler",
- []
- ]
- },
- %{
- "tuple" => [
- "/websocket",
- "Phoenix.Endpoint.CowboyWebSocket",
- %{
- "tuple" => [
- "Phoenix.Transports.WebSocket",
- %{
- "tuple" => [
- "Pleroma.Web.Endpoint",
- "Pleroma.Web.UserSocket",
- []
- ]
- }
- ]
- }
- ]
- },
- %{
- "tuple" => [
- ":_",
- "Phoenix.Endpoint.Cowboy2Handler",
- %{"tuple" => ["Pleroma.Web.Endpoint", []]}
- ]
- }
- ]
- ]
- }
- ]
- ]
- }
- ]
- ]
- }
- ],
- "db" => [":http"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "settings with nesting map", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => [
- %{"tuple" => [":key2", "some_val"]},
- %{
- "tuple" => [
- ":key3",
- %{
- ":max_options" => 20,
- ":max_option_chars" => 200,
- ":min_expiration" => 0,
- ":max_expiration" => 31_536_000,
- "nested" => %{
- ":max_options" => 20,
- ":max_option_chars" => 200,
- ":min_expiration" => 0,
- ":max_expiration" => 31_536_000
- }
- }
- ]
- }
- ]
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) ==
- %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => [
- %{"tuple" => [":key2", "some_val"]},
- %{
- "tuple" => [
- ":key3",
- %{
- ":max_expiration" => 31_536_000,
- ":max_option_chars" => 200,
- ":max_options" => 20,
- ":min_expiration" => 0,
- "nested" => %{
- ":max_expiration" => 31_536_000,
- ":max_option_chars" => 200,
- ":max_options" => 20,
- ":min_expiration" => 0
- }
- }
- ]
- }
- ],
- "db" => [":key2", ":key3"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "value as map", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => %{"key" => "some_val"}
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) ==
- %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":key1",
- "value" => %{"key" => "some_val"},
- "db" => [":key1"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "queues key as atom", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- "group" => ":oban",
- "key" => ":queues",
- "value" => [
- %{"tuple" => [":federator_incoming", 50]},
- %{"tuple" => [":federator_outgoing", 50]},
- %{"tuple" => [":web_push", 50]},
- %{"tuple" => [":mailer", 10]},
- %{"tuple" => [":transmogrifier", 20]},
- %{"tuple" => [":scheduled_activities", 10]},
- %{"tuple" => [":background", 5]}
- ]
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":oban",
- "key" => ":queues",
- "value" => [
- %{"tuple" => [":federator_incoming", 50]},
- %{"tuple" => [":federator_outgoing", 50]},
- %{"tuple" => [":web_push", 50]},
- %{"tuple" => [":mailer", 10]},
- %{"tuple" => [":transmogrifier", 20]},
- %{"tuple" => [":scheduled_activities", 10]},
- %{"tuple" => [":background", 5]}
- ],
- "db" => [
- ":federator_incoming",
- ":federator_outgoing",
- ":web_push",
- ":mailer",
- ":transmogrifier",
- ":scheduled_activities",
- ":background"
- ]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "delete part of settings by atom subkeys", %{conn: conn} do
- insert(:config,
- key: :keyaa1,
- value: [subkey1: "val1", subkey2: "val2", subkey3: "val3"]
- )
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":pleroma",
- key: ":keyaa1",
- subkeys: [":subkey1", ":subkey3"],
- delete: true
- }
- ]
- })
-
- assert json_response_and_validate_schema(conn, 200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":keyaa1",
- "value" => [%{"tuple" => [":subkey2", "val2"]}],
- "db" => [":subkey2"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "proxy tuple localhost", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":pleroma",
- key: ":http",
- value: [
- %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}
- ]
- }
- ]
- })
-
- assert %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":http",
- "value" => value,
- "db" => db
- }
- ]
- } = json_response_and_validate_schema(conn, 200)
-
- assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} in value
- assert ":proxy_url" in db
- end
-
- test "proxy tuple domain", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":pleroma",
- key: ":http",
- value: [
- %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}
- ]
- }
- ]
- })
-
- assert %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":http",
- "value" => value,
- "db" => db
- }
- ]
- } = json_response_and_validate_schema(conn, 200)
-
- assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} in value
- assert ":proxy_url" in db
- end
-
- test "proxy tuple ip", %{conn: conn} do
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":pleroma",
- key: ":http",
- value: [
- %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}
- ]
- }
- ]
- })
-
- assert %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => ":http",
- "value" => value,
- "db" => db
- }
- ]
- } = json_response_and_validate_schema(conn, 200)
-
- assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} in value
- assert ":proxy_url" in db
- end
-
- @tag capture_log: true
- test "doesn't set keys not in the whitelist", %{conn: conn} do
- clear_config(:database_config_whitelist, [
- {:pleroma, :key1},
- {:pleroma, :key2},
- {:pleroma, Pleroma.Captcha.NotReal},
- {:not_real}
- ])
-
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{group: ":pleroma", key: ":key1", value: "value1"},
- %{group: ":pleroma", key: ":key2", value: "value2"},
- %{group: ":pleroma", key: ":key3", value: "value3"},
- %{group: ":pleroma", key: "Pleroma.Web.Endpoint.NotReal", value: "value4"},
- %{group: ":pleroma", key: "Pleroma.Captcha.NotReal", value: "value5"},
- %{group: ":not_real", key: ":anything", value: "value6"}
- ]
- })
-
- assert Application.get_env(:pleroma, :key1) == "value1"
- assert Application.get_env(:pleroma, :key2) == "value2"
- assert Application.get_env(:pleroma, :key3) == nil
- assert Application.get_env(:pleroma, Pleroma.Web.Endpoint.NotReal) == nil
- assert Application.get_env(:pleroma, Pleroma.Captcha.NotReal) == "value5"
- assert Application.get_env(:not_real, :anything) == "value6"
- end
-
- test "args for Pleroma.Upload.Filter.Mogrify with custom tuples", %{conn: conn} do
- clear_config(Pleroma.Upload.Filter.Mogrify)
-
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":pleroma",
- key: "Pleroma.Upload.Filter.Mogrify",
- value: [
- %{"tuple" => [":args", ["auto-orient", "strip"]]}
- ]
- }
- ]
- })
- |> json_response_and_validate_schema(200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => "Pleroma.Upload.Filter.Mogrify",
- "value" => [
- %{"tuple" => [":args", ["auto-orient", "strip"]]}
- ],
- "db" => [":args"]
- }
- ],
- "need_reboot" => false
- }
-
- assert Config.get(Pleroma.Upload.Filter.Mogrify) == [args: ["auto-orient", "strip"]]
-
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{
- configs: [
- %{
- group: ":pleroma",
- key: "Pleroma.Upload.Filter.Mogrify",
- value: [
- %{
- "tuple" => [
- ":args",
- [
- "auto-orient",
- "strip",
- "{\"implode\", \"1\"}",
- "{\"resize\", \"3840x1080>\"}"
- ]
- ]
- }
- ]
- }
- ]
- })
- |> json_response(200) == %{
- "configs" => [
- %{
- "group" => ":pleroma",
- "key" => "Pleroma.Upload.Filter.Mogrify",
- "value" => [
- %{
- "tuple" => [
- ":args",
- [
- "auto-orient",
- "strip",
- "{\"implode\", \"1\"}",
- "{\"resize\", \"3840x1080>\"}"
- ]
- ]
- }
- ],
- "db" => [":args"]
- }
- ],
- "need_reboot" => false
- }
-
- assert Config.get(Pleroma.Upload.Filter.Mogrify) == [
- args: ["auto-orient", "strip", {"implode", "1"}, {"resize", "3840x1080>"}]
- ]
- end
-
- test "enables the welcome messages", %{conn: conn} do
- clear_config([:welcome])
-
- params = %{
- "group" => ":pleroma",
- "key" => ":welcome",
- "value" => [
- %{
- "tuple" => [
- ":direct_message",
- [
- %{"tuple" => [":enabled", true]},
- %{"tuple" => [":message", "Welcome to Pleroma!"]},
- %{"tuple" => [":sender_nickname", "pleroma"]}
- ]
- ]
- },
- %{
- "tuple" => [
- ":chat_message",
- [
- %{"tuple" => [":enabled", true]},
- %{"tuple" => [":message", "Welcome to Pleroma!"]},
- %{"tuple" => [":sender_nickname", "pleroma"]}
- ]
- ]
- },
- %{
- "tuple" => [
- ":email",
- [
- %{"tuple" => [":enabled", true]},
- %{"tuple" => [":sender", %{"tuple" => ["pleroma@dev.dev", "Pleroma"]}]},
- %{"tuple" => [":subject", "Welcome to <%= instance_name %>!"]},
- %{"tuple" => [":html", "Welcome to <%= instance_name %>!"]},
- %{"tuple" => [":text", "Welcome to <%= instance_name %>!"]}
- ]
- ]
- }
- ]
- }
-
- refute Pleroma.User.WelcomeEmail.enabled?()
- refute Pleroma.User.WelcomeMessage.enabled?()
- refute Pleroma.User.WelcomeChatMessage.enabled?()
-
- res =
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{"configs" => [params]})
- |> json_response_and_validate_schema(200)
-
- assert Pleroma.User.WelcomeEmail.enabled?()
- assert Pleroma.User.WelcomeMessage.enabled?()
- assert Pleroma.User.WelcomeChatMessage.enabled?()
-
- assert res == %{
- "configs" => [
- %{
- "db" => [":direct_message", ":chat_message", ":email"],
- "group" => ":pleroma",
- "key" => ":welcome",
- "value" => params["value"]
- }
- ],
- "need_reboot" => false
- }
- end
-
- test "custom instance thumbnail", %{conn: conn} do
- clear_config([:instance])
-
- params = %{
- "group" => ":pleroma",
- "key" => ":instance",
- "value" => [
- %{
- "tuple" => [
- ":instance_thumbnail",
- "https://example.com/media/new_thumbnail.jpg"
- ]
- }
- ]
- }
-
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{"configs" => [params]})
- |> json_response_and_validate_schema(200) ==
- %{
- "configs" => [
- %{
- "db" => [":instance_thumbnail"],
- "group" => ":pleroma",
- "key" => ":instance",
- "value" => params["value"]
- }
- ],
- "need_reboot" => false
- }
-
- assert conn
- |> get("/api/v1/instance")
- |> json_response_and_validate_schema(200)
- |> Map.take(["thumbnail"]) ==
- %{"thumbnail" => "https://example.com/media/new_thumbnail.jpg"}
- end
-
- test "Concurrent Limiter", %{conn: conn} do
- clear_config([ConcurrentLimiter])
-
- params = %{
- "group" => ":pleroma",
- "key" => "ConcurrentLimiter",
- "value" => [
- %{
- "tuple" => [
- "Pleroma.Web.RichMedia.Helpers",
- [
- %{"tuple" => [":max_running", 6]},
- %{"tuple" => [":max_waiting", 6]}
- ]
- ]
- },
- %{
- "tuple" => [
- "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy",
- [
- %{"tuple" => [":max_running", 7]},
- %{"tuple" => [":max_waiting", 7]}
- ]
- ]
- }
- ]
- }
-
- assert conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/pleroma/admin/config", %{"configs" => [params]})
- |> json_response_and_validate_schema(200)
- end
- end
-
- describe "GET /api/pleroma/admin/config/descriptions" do
- test "structure", %{conn: conn} do
- conn = get(conn, "/api/pleroma/admin/config/descriptions")
-
- assert [child | _others] = json_response_and_validate_schema(conn, 200)
-
- assert child["children"]
- assert child["key"]
- assert String.starts_with?(child["group"], ":")
- assert child["description"]
- end
-
- test "filters by database configuration whitelist", %{conn: conn} do
- clear_config(:database_config_whitelist, [
- {:pleroma, :instance},
- {:pleroma, :activitypub},
- {:pleroma, Pleroma.Upload}
- ])
-
- conn = get(conn, "/api/pleroma/admin/config/descriptions")
-
- children = json_response_and_validate_schema(conn, 200)
-
- assert length(children) == 3
-
- assert Enum.count(children, fn c -> c["group"] == ":pleroma" end) == 3
-
- instance = Enum.find(children, fn c -> c["key"] == ":instance" end)
- assert instance["children"]
-
- activitypub = Enum.find(children, fn c -> c["key"] == ":activitypub" end)
- assert activitypub["children"]
-
- web_endpoint = Enum.find(children, fn c -> c["key"] == "Pleroma.Upload" end)
- assert web_endpoint["children"]
- end
- end
-end
diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs
index c4f506fe3..a88d7681a 100644
--- a/test/pleroma/web/common_api/utils_test.exs
+++ b/test/pleroma/web/common_api/utils_test.exs
@@ -4,7 +4,6 @@
defmodule Pleroma.Web.CommonAPI.UtilsTest do
alias Pleroma.Builders.UserBuilder
- alias Pleroma.Object
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.CommonAPI.ActivityDraft
alias Pleroma.Web.CommonAPI.Utils
@@ -273,22 +272,6 @@ test "delegated renderers" do
end
end
- describe "context_to_conversation_id" do
- test "creates a mapping object" do
- conversation_id = Utils.context_to_conversation_id("random context")
- object = Object.get_by_ap_id("random context")
-
- assert conversation_id == object.id
- end
-
- test "returns an existing mapping for an existing object" do
- {:ok, object} = Object.context_mapping("random context") |> Repo.insert()
- conversation_id = Utils.context_to_conversation_id("random context")
-
- assert conversation_id == object.id
- end
- end
-
describe "formats date to asctime" do
test "when date is in ISO 8601 format" do
date = DateTime.utc_now() |> DateTime.to_iso8601()
@@ -517,17 +500,6 @@ test "returns empty string when date invalid" do
end
end
- describe "conversation_id_to_context/1" do
- test "returns id" do
- object = insert(:note)
- assert Utils.conversation_id_to_context(object.id) == object.data["id"]
- end
-
- test "returns error if object not found" do
- assert Utils.conversation_id_to_context("123") == {:error, "No such conversation"}
- end
- end
-
describe "maybe_notify_mentioned_recipients/2" do
test "returns recipients when activity is not `Create`" do
activity = insert(:like_activity)
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index c92c4ec88..fa751bf60 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -7,13 +7,11 @@ defmodule Pleroma.Web.CommonAPITest do
use Pleroma.DataCase
alias Pleroma.Activity
- alias Pleroma.Chat
alias Pleroma.Conversation.Participation
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Transmogrifier
alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.AdminAPI.AccountView
@@ -27,6 +25,8 @@ defmodule Pleroma.Web.CommonAPITest do
require Pleroma.Constants
setup_all do
+ clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ clear_config([Pleroma.Uploaders.Local, :uploads], "uploads")
Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
@@ -114,173 +114,6 @@ test "it blocks and does not federate if outgoing blocks are disabled", %{
end
end
- describe "posting chat messages" do
- setup do: clear_config([:instance, :chat_limit])
-
- test "it posts a self-chat" do
- author = insert(:user)
- recipient = author
-
- {:ok, activity} =
- CommonAPI.post_chat_message(
- author,
- recipient,
- "remember to buy milk when milk truk arive"
- )
-
- assert activity.data["type"] == "Create"
- end
-
- test "it posts a chat message without content but with an attachment" do
- author = insert(:user)
- recipient = insert(:user)
-
- file = %Plug.Upload{
- content_type: "image/jpeg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- {:ok, upload} = ActivityPub.upload(file, actor: author.ap_id)
-
- with_mocks([
- {
- Pleroma.Web.Streamer,
- [],
- [
- stream: fn _, _ ->
- nil
- end
- ]
- },
- {
- Pleroma.Web.Push,
- [],
- [
- send: fn _ -> nil end
- ]
- }
- ]) do
- {:ok, activity} =
- CommonAPI.post_chat_message(
- author,
- recipient,
- nil,
- media_id: upload.id
- )
-
- notification =
- Notification.for_user_and_activity(recipient, activity)
- |> Repo.preload(:activity)
-
- assert called(Pleroma.Web.Push.send(notification))
- assert called(Pleroma.Web.Streamer.stream(["user", "user:notification"], notification))
- assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], :_))
-
- assert activity
- end
- end
-
- test "it adds html newlines" do
- author = insert(:user)
- recipient = insert(:user)
-
- other_user = insert(:user)
-
- {:ok, activity} =
- CommonAPI.post_chat_message(
- author,
- recipient,
- "uguu\nuguuu"
- )
-
- assert other_user.ap_id not in activity.recipients
-
- object = Object.normalize(activity, fetch: false)
-
- assert object.data["content"] == "uguu uguuu"
- end
-
- test "it linkifies" do
- author = insert(:user)
- recipient = insert(:user)
-
- other_user = insert(:user)
-
- {:ok, activity} =
- CommonAPI.post_chat_message(
- author,
- recipient,
- "https://example.org is the site of @#{other_user.nickname} #2hu"
- )
-
- assert other_user.ap_id not in activity.recipients
-
- object = Object.normalize(activity, fetch: false)
-
- assert object.data["content"] ==
- "https://example.org is the site of @#{other_user.nickname} #2hu "
- end
-
- test "it posts a chat message" do
- author = insert(:user)
- recipient = insert(:user)
-
- {:ok, activity} =
- CommonAPI.post_chat_message(
- author,
- recipient,
- "a test message :firefox:"
- )
-
- assert activity.data["type"] == "Create"
- assert activity.local
- object = Object.normalize(activity, fetch: false)
-
- assert object.data["type"] == "ChatMessage"
- assert object.data["to"] == [recipient.ap_id]
-
- assert object.data["content"] ==
- "a test message <script>alert('uuu')</script> :firefox:"
-
- assert object.data["emoji"] == %{
- "firefox" => "http://localhost:4001/emoji/Firefox.gif"
- }
-
- assert Chat.get(author.id, recipient.ap_id)
- assert Chat.get(recipient.id, author.ap_id)
-
- assert :ok == Pleroma.Web.Federator.perform(:publish, activity)
- end
-
- test "it reject messages over the local limit" do
- clear_config([:instance, :chat_limit], 2)
-
- author = insert(:user)
- recipient = insert(:user)
-
- {:error, message} =
- CommonAPI.post_chat_message(
- author,
- recipient,
- "123"
- )
-
- assert message == :content_too_long
- end
-
- test "it reject messages via MRF" do
- clear_config([:mrf_keyword, :reject], ["GNO"])
- clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy])
-
- author = insert(:user)
- recipient = insert(:user)
-
- assert {:reject, "[KeywordPolicy] Matches with rejected keyword"} ==
- CommonAPI.post_chat_message(author, recipient, "GNO/Linux")
- end
- end
-
describe "unblocking" do
test "it works even without an existing block activity" do
blocked = insert(:user)
@@ -1339,45 +1172,6 @@ test "does not allow to vote twice" do
end
end
- describe "listen/2" do
- test "returns a valid activity" do
- user = insert(:user)
-
- {:ok, activity} =
- CommonAPI.listen(user, %{
- title: "lain radio episode 1",
- album: "lain radio",
- artist: "lain",
- length: 180_000
- })
-
- object = Object.normalize(activity, fetch: false)
-
- assert object.data["title"] == "lain radio episode 1"
-
- assert Visibility.get_visibility(activity) == "public"
- end
-
- test "respects visibility=private" do
- user = insert(:user)
-
- {:ok, activity} =
- CommonAPI.listen(user, %{
- title: "lain radio episode 1",
- album: "lain radio",
- artist: "lain",
- length: 180_000,
- visibility: "private"
- })
-
- object = Object.normalize(activity, fetch: false)
-
- assert object.data["title"] == "lain radio episode 1"
-
- assert Visibility.get_visibility(activity) == "private"
- end
- end
-
describe "get_user/1" do
test "gets user by ap_id" do
user = insert(:user)
diff --git a/test/pleroma/web/endpoint/metrics_exporter_test.exs b/test/pleroma/web/endpoint/metrics_exporter_test.exs
deleted file mode 100644
index 376e82149..000000000
--- a/test/pleroma/web/endpoint/metrics_exporter_test.exs
+++ /dev/null
@@ -1,69 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.Endpoint.MetricsExporterTest do
- # Modifies AppEnv, has to stay synchronous
- use Pleroma.Web.ConnCase
-
- alias Pleroma.Web.Endpoint.MetricsExporter
-
- defp config do
- Application.get_env(:prometheus, MetricsExporter)
- end
-
- describe "with default config" do
- test "does NOT expose app metrics", %{conn: conn} do
- conn
- |> get(config()[:path])
- |> json_response(404)
- end
- end
-
- describe "when enabled" do
- setup do
- initial_config = config()
- on_exit(fn -> Application.put_env(:prometheus, MetricsExporter, initial_config) end)
-
- Application.put_env(
- :prometheus,
- MetricsExporter,
- Keyword.put(initial_config, :enabled, true)
- )
- end
-
- test "serves app metrics", %{conn: conn} do
- conn = get(conn, config()[:path])
- assert response = response(conn, 200)
-
- for metric <- [
- "http_requests_total",
- "http_request_duration_microseconds",
- "phoenix_controller_call_duration",
- "telemetry_scrape_duration",
- "erlang_vm_memory_atom_bytes_total"
- ] do
- assert response =~ ~r/#{metric}/
- end
- end
-
- test "when IP whitelist configured, " <>
- "serves app metrics only if client IP is whitelisted",
- %{conn: conn} do
- Application.put_env(
- :prometheus,
- MetricsExporter,
- Keyword.put(config(), :ip_whitelist, ["127.127.127.127", {1, 1, 1, 1}, '255.255.255.255'])
- )
-
- conn
- |> get(config()[:path])
- |> json_response(404)
-
- conn
- |> Map.put(:remote_ip, {127, 127, 127, 127})
- |> get(config()[:path])
- |> response(200)
- end
- end
-end
diff --git a/test/pleroma/web/federator_test.exs b/test/pleroma/web/federator_test.exs
index 372b6a73a..c32972181 100644
--- a/test/pleroma/web/federator_test.exs
+++ b/test/pleroma/web/federator_test.exs
@@ -153,7 +153,7 @@ test "rejects incoming AP docs with incorrect origin" do
}
assert {:ok, job} = Federator.incoming_ap_doc(params)
- assert {:error, :origin_containment_failed} = ObanHelpers.perform(job)
+ assert {:discard, :origin_containment_failed} = ObanHelpers.perform(job)
end
test "it does not crash if MRF rejects the post" do
@@ -169,7 +169,7 @@ test "it does not crash if MRF rejects the post" do
|> Jason.decode!()
assert {:ok, job} = Federator.incoming_ap_doc(params)
- assert {:error, _} = ObanHelpers.perform(job)
+ assert {:discard, _} = ObanHelpers.perform(job)
end
end
end
diff --git a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs
index de38a9798..dcdff6c09 100644
--- a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs
@@ -414,6 +414,20 @@ test "unimplemented pinned statuses feature", %{conn: conn} do
assert json_response_and_validate_schema(conn, 200) == []
end
+ test "gets local-only statuses for authenticated users", %{user: _user, conn: conn} do
+ user_one = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user_one, %{status: "HI!!!", visibility: "local"})
+
+ resp =
+ conn
+ |> get("/api/v1/accounts/#{user_one.id}/statuses")
+ |> json_response_and_validate_schema(200)
+
+ assert [%{"id" => id}] = resp
+ assert id == to_string(activity.id)
+ end
+
test "gets an users media, excludes reblogs", %{conn: conn} do
note = insert(:note_activity)
user = User.get_cached_by_ap_id(note.data["actor"])
@@ -1683,7 +1697,6 @@ test "verify_credentials" do
response = json_response_and_validate_schema(conn, 200)
assert %{"id" => id, "source" => %{"privacy" => "public"}} = response
- assert response["pleroma"]["chat_token"]
assert response["pleroma"]["unread_notifications_count"] == 6
assert id == to_string(user.id)
end
diff --git a/test/pleroma/web/mastodon_api/controllers/announcement_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/announcement_controller_test.exs
new file mode 100644
index 000000000..60c9978c2
--- /dev/null
+++ b/test/pleroma/web/mastodon_api/controllers/announcement_controller_test.exs
@@ -0,0 +1,169 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.AnnouncementControllerTest do
+ use Pleroma.Web.ConnCase
+
+ import Pleroma.Factory
+
+ alias Pleroma.Announcement
+ alias Pleroma.AnnouncementReadRelationship
+
+ describe "GET /api/v1/announcements" do
+ setup do
+ %{conn: conn} = oauth_access([])
+ {:ok, conn: conn}
+ end
+
+ test "it does not allow guests", %{conn: conn} do
+ _response =
+ conn
+ |> assign(:token, nil)
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:forbidden)
+ end
+
+ test "it allows users with scopes" do
+ %{conn: conn} = oauth_access(["read:accounts"])
+
+ _response =
+ conn
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:ok)
+ end
+
+ test "it lists all announcements", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ response =
+ conn
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert [%{"id" => ^id}] = response
+ end
+
+ test "it returns time with utc timezone", %{conn: conn} do
+ start_time =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.add(-999_999, :second)
+ |> NaiveDateTime.truncate(:second)
+
+ end_time =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.add(999_999, :second)
+ |> NaiveDateTime.truncate(:second)
+
+ %{id: id} = insert(:announcement, %{starts_at: start_time, ends_at: end_time})
+
+ response =
+ conn
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert [%{"id" => ^id}] = [announcement] = response
+
+ assert String.ends_with?(announcement["starts_at"], "Z")
+ assert String.ends_with?(announcement["ends_at"], "Z")
+ end
+
+ test "it does not list announcements starting after current time", %{conn: conn} do
+ time = NaiveDateTime.utc_now() |> NaiveDateTime.add(999_999, :second)
+ insert(:announcement, starts_at: time)
+
+ response =
+ conn
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert [] = response
+ end
+
+ test "it does not list announcements ending before current time", %{conn: conn} do
+ time = NaiveDateTime.utc_now() |> NaiveDateTime.add(-999_999, :second)
+ insert(:announcement, ends_at: time)
+
+ response =
+ conn
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert [] = response
+ end
+
+ test "when authenticated, also expose read property", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ response =
+ conn
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert [%{"id" => ^id, "read" => false}] = response
+ end
+
+ test "when authenticated and announcement is read by user" do
+ %{id: id} = announcement = insert(:announcement)
+ user = insert(:user)
+
+ AnnouncementReadRelationship.mark_read(user, announcement)
+
+ %{conn: conn} = oauth_access(["read:accounts"], user: user)
+
+ response =
+ conn
+ |> get("/api/v1/announcements")
+ |> json_response_and_validate_schema(:ok)
+
+ assert [%{"id" => ^id, "read" => true}] = response
+ end
+ end
+
+ describe "POST /api/v1/announcements/:id/dismiss" do
+ setup do: oauth_access(["write:accounts"])
+
+ test "it requires auth", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ _response =
+ conn
+ |> assign(:token, nil)
+ |> post("/api/v1/announcements/#{id}/dismiss")
+ |> json_response_and_validate_schema(:forbidden)
+ end
+
+ test "it requires write:accounts oauth scope" do
+ %{id: id} = insert(:announcement)
+
+ %{conn: conn} = oauth_access(["read:accounts"])
+
+ _response =
+ conn
+ |> post("/api/v1/announcements/#{id}/dismiss")
+ |> json_response_and_validate_schema(:forbidden)
+ end
+
+ test "it gives 404 for non-existent announcements", %{conn: conn} do
+ %{id: id} = insert(:announcement)
+
+ _response =
+ conn
+ |> post("/api/v1/announcements/#{id}xxx/dismiss")
+ |> json_response_and_validate_schema(:not_found)
+ end
+
+ test "it marks announcement as read", %{user: user, conn: conn} do
+ %{id: id} = announcement = insert(:announcement)
+
+ refute Announcement.read_by?(announcement, user)
+
+ _response =
+ conn
+ |> post("/api/v1/announcements/#{id}/dismiss")
+ |> json_response_and_validate_schema(:ok)
+
+ assert Announcement.read_by?(announcement, user)
+ end
+ end
+end
diff --git a/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs
index 98ab9e717..66f7ed579 100644
--- a/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs
@@ -67,9 +67,11 @@ test "a filter with expires_in", %{conn: conn, user: user} do
expires_at =
NaiveDateTime.utc_now()
|> NaiveDateTime.add(in_seconds)
- |> Pleroma.Web.CommonAPI.Utils.to_masto_date()
- assert response["expires_at"] == expires_at
+ assert NaiveDateTime.diff(
+ NaiveDateTime.from_iso8601!(response["expires_at"]),
+ expires_at
+ ) < 5
filter = Filter.get(response["id"], user)
@@ -193,10 +195,14 @@ test "with adding expires_at", %{conn: conn, user: user} do
assert response["irreversible"] == true
- assert response["expires_at"] ==
- NaiveDateTime.utc_now()
- |> NaiveDateTime.add(in_seconds)
- |> Pleroma.Web.CommonAPI.Utils.to_masto_date()
+ expected_time =
+ NaiveDateTime.utc_now()
+ |> NaiveDateTime.add(in_seconds)
+
+ assert NaiveDateTime.diff(
+ NaiveDateTime.from_iso8601!(response["expires_at"]),
+ expected_time
+ ) < 5
filter = Filter.get(response["id"], user)
diff --git a/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs
index e76cbc75b..90801a90a 100644
--- a/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/instance_controller_test.exs
@@ -38,7 +38,6 @@ test "get instance information", %{conn: conn} do
"background_upload_limit" => _,
"banner_upload_limit" => _,
"background_image" => from_config_background,
- "shout_limit" => _,
"description_limit" => _
} = result
diff --git a/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs
index ff988a7fd..50b9febea 100644
--- a/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs
@@ -13,6 +13,8 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do
describe "Upload media" do
setup do: oauth_access(["write:media"])
+ setup do: clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ setup do: clear_config([Pleroma.Uploaders.Local, :uploads], "uploads")
setup do
image = %Plug.Upload{
diff --git a/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs
index d991f284f..f463bfae1 100644
--- a/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/notification_controller_test.exs
@@ -52,27 +52,6 @@ test "list of notifications" do
assert response == expected_response
end
- test "by default, does not contain pleroma:chat_mention" do
- %{user: user, conn: conn} = oauth_access(["read:notifications"])
- other_user = insert(:user)
-
- {:ok, _activity} = CommonAPI.post_chat_message(other_user, user, "hey")
-
- result =
- conn
- |> get("/api/v1/notifications")
- |> json_response_and_validate_schema(200)
-
- assert [] == result
-
- result =
- conn
- |> get("/api/v1/notifications?include_types[]=pleroma:chat_mention")
- |> json_response_and_validate_schema(200)
-
- assert [_] = result
- end
-
test "by default, does not contain pleroma:report" do
%{user: user, conn: conn} = oauth_access(["read:notifications"])
other_user = insert(:user)
@@ -137,23 +116,6 @@ test "getting a single notification" do
assert response == expected_response
end
- test "dismissing a single notification (deprecated endpoint)" do
- %{user: user, conn: conn} = oauth_access(["write:notifications"])
- other_user = insert(:user)
-
- {:ok, activity} = CommonAPI.post(other_user, %{status: "hi @#{user.nickname}"})
-
- {:ok, [notification]} = Notification.create_notifications(activity)
-
- conn =
- conn
- |> assign(:user, user)
- |> put_req_header("content-type", "application/json")
- |> post("/api/v1/notifications/dismiss", %{"id" => to_string(notification.id)})
-
- assert %{} = json_response_and_validate_schema(conn, 200)
- end
-
test "dismissing a single notification" do
%{user: user, conn: conn} = oauth_access(["write:notifications"])
other_user = insert(:user)
diff --git a/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs
index e31cd0291..fd2962196 100644
--- a/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/search_controller_test.exs
@@ -5,7 +5,6 @@
defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do
use Pleroma.Web.ConnCase
- alias Pleroma.Object
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Endpoint
import Pleroma.Factory
@@ -221,189 +220,4 @@ test "returns account if query contains a space", %{conn: conn} do
assert length(results) == 1
end
end
-
- describe ".search" do
- test "it returns empty result if user or status search return undefined error", %{conn: conn} do
- with_mocks [
- {Pleroma.User, [], [search: fn _q, _o -> raise "Oops" end]},
- {Pleroma.Activity, [], [search: fn _u, _q, _o -> raise "Oops" end]}
- ] do
- capture_log(fn ->
- results =
- conn
- |> get("/api/v1/search?q=2hu")
- |> json_response_and_validate_schema(200)
-
- assert results["accounts"] == []
- assert results["statuses"] == []
- end) =~
- "[error] Elixir.Pleroma.Web.MastodonAPI.SearchController search error: %RuntimeError{message: \"Oops\"}"
- end
- end
-
- test "search", %{conn: conn} do
- user = insert(:user)
- user_two = insert(:user, %{nickname: "shp@shitposter.club"})
- user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
-
- {:ok, activity} = CommonAPI.post(user, %{status: "This is about 2hu"})
-
- {:ok, _activity} =
- CommonAPI.post(user, %{
- status: "This is about 2hu, but private",
- visibility: "private"
- })
-
- {:ok, _} = CommonAPI.post(user_two, %{status: "This isn't"})
-
- results =
- conn
- |> get("/api/v1/search?q=2hu")
- |> json_response_and_validate_schema(200)
-
- [account | _] = results["accounts"]
- assert account["id"] == to_string(user_three.id)
-
- assert results["hashtags"] == ["2hu"]
-
- [status] = results["statuses"]
- assert status["id"] == to_string(activity.id)
- end
-
- test "search fetches remote statuses and prefers them over other results", %{conn: conn} do
- old_version = :persistent_term.get({Pleroma.Repo, :postgres_version})
- :persistent_term.put({Pleroma.Repo, :postgres_version}, 10.0)
- on_exit(fn -> :persistent_term.put({Pleroma.Repo, :postgres_version}, old_version) end)
-
- capture_log(fn ->
- {:ok, %{id: activity_id}} =
- CommonAPI.post(insert(:user), %{
- status: "check out http://mastodon.example.org/@admin/99541947525187367"
- })
-
- results =
- conn
- |> get("/api/v1/search?q=http://mastodon.example.org/@admin/99541947525187367")
- |> json_response_and_validate_schema(200)
-
- assert [
- %{"url" => "http://mastodon.example.org/@admin/99541947525187367"},
- %{"id" => ^activity_id}
- ] = results["statuses"]
- end)
- end
-
- test "search doesn't show statuses that it shouldn't", %{conn: conn} do
- {:ok, activity} =
- CommonAPI.post(insert(:user), %{
- status: "This is about 2hu, but private",
- visibility: "private"
- })
-
- capture_log(fn ->
- q = Object.normalize(activity, fetch: false).data["id"]
-
- results =
- conn
- |> get("/api/v1/search?q=#{q}")
- |> json_response_and_validate_schema(200)
-
- [] = results["statuses"]
- end)
- end
-
- test "search fetches remote accounts", %{conn: conn} do
- user = insert(:user)
-
- query = URI.encode_query(%{q: " mike@osada.macgirvin.com ", resolve: true})
-
- results =
- conn
- |> assign(:user, user)
- |> assign(:token, insert(:oauth_token, user: user, scopes: ["read"]))
- |> get("/api/v1/search?#{query}")
- |> json_response_and_validate_schema(200)
-
- [account] = results["accounts"]
- assert account["acct"] == "mike@osada.macgirvin.com"
- end
-
- test "search doesn't fetch remote accounts if resolve is false", %{conn: conn} do
- results =
- conn
- |> get("/api/v1/search?q=mike@osada.macgirvin.com&resolve=false")
- |> json_response_and_validate_schema(200)
-
- assert [] == results["accounts"]
- end
-
- test "search with limit and offset", %{conn: conn} do
- user = insert(:user)
- _user_two = insert(:user, %{nickname: "shp@shitposter.club"})
- _user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
-
- {:ok, _activity1} = CommonAPI.post(user, %{status: "This is about 2hu"})
- {:ok, _activity2} = CommonAPI.post(user, %{status: "This is also about 2hu"})
-
- result =
- conn
- |> get("/api/v1/search?q=2hu&limit=1")
-
- assert results = json_response_and_validate_schema(result, 200)
- assert [%{"id" => activity_id1}] = results["statuses"]
- assert [_] = results["accounts"]
-
- results =
- conn
- |> get("/api/v1/search?q=2hu&limit=1&offset=1")
- |> json_response_and_validate_schema(200)
-
- assert [%{"id" => activity_id2}] = results["statuses"]
- assert [] = results["accounts"]
-
- assert activity_id1 != activity_id2
- end
-
- test "search returns results only for the given type", %{conn: conn} do
- user = insert(:user)
- _user_two = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
-
- {:ok, _activity} = CommonAPI.post(user, %{status: "This is about 2hu"})
-
- assert %{"statuses" => [_activity], "accounts" => [], "hashtags" => []} =
- conn
- |> get("/api/v1/search?q=2hu&type=statuses")
- |> json_response_and_validate_schema(200)
-
- assert %{"statuses" => [], "accounts" => [_user_two], "hashtags" => []} =
- conn
- |> get("/api/v1/search?q=2hu&type=accounts")
- |> json_response_and_validate_schema(200)
- end
-
- test "search uses account_id to filter statuses by the author", %{conn: conn} do
- user = insert(:user, %{nickname: "shp@shitposter.club"})
- user_two = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"})
-
- {:ok, activity1} = CommonAPI.post(user, %{status: "This is about 2hu"})
- {:ok, activity2} = CommonAPI.post(user_two, %{status: "This is also about 2hu"})
-
- results =
- conn
- |> get("/api/v1/search?q=2hu&account_id=#{user.id}")
- |> json_response_and_validate_schema(200)
-
- assert [%{"id" => activity_id1}] = results["statuses"]
- assert activity_id1 == activity1.id
- assert [_] = results["accounts"]
-
- results =
- conn
- |> get("/api/v1/search?q=2hu&account_id=#{user_two.id}")
- |> json_response_and_validate_schema(200)
-
- assert [%{"id" => activity_id2}] = results["statuses"]
- assert activity_id2 == activity2.id
- end
- end
end
diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
index 3e0660031..ea168f6c5 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -25,6 +25,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
setup do: clear_config([:rich_media, :enabled])
setup do: clear_config([:mrf, :policies])
setup do: clear_config([:mrf_keyword, :reject])
+ setup do: clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+ setup do: clear_config([Pleroma.Uploaders.Local, :uploads], "uploads")
describe "posting statuses" do
setup do: oauth_access(["write:statuses"])
@@ -262,6 +264,7 @@ test "posting a fake status", %{conn: conn} do
|> Map.put("url", nil)
|> Map.put("uri", nil)
|> Map.put("created_at", nil)
+ |> Kernel.put_in(["pleroma", "context"], nil)
|> Kernel.put_in(["pleroma", "conversation_id"], nil)
fake_conn =
@@ -285,6 +288,7 @@ test "posting a fake status", %{conn: conn} do
|> Map.put("url", nil)
|> Map.put("uri", nil)
|> Map.put("created_at", nil)
+ |> Kernel.put_in(["pleroma", "context"], nil)
|> Kernel.put_in(["pleroma", "conversation_id"], nil)
assert real_status == fake_status
@@ -1347,87 +1351,6 @@ test "on pin removes deletion job, on unpin reschedule deletion" do
end
end
- describe "cards" do
- setup do
- clear_config([:rich_media, :enabled], true)
-
- oauth_access(["read:statuses"])
- end
-
- test "returns rich-media card", %{conn: conn, user: user} do
- Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
-
- {:ok, activity} = CommonAPI.post(user, %{status: "https://example.com/ogp"})
-
- card_data = %{
- "image" => "http://ia.media-imdb.com/images/rock.jpg",
- "provider_name" => "example.com",
- "provider_url" => "https://example.com",
- "title" => "The Rock",
- "type" => "link",
- "url" => "https://example.com/ogp",
- "description" =>
- "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",
- "pleroma" => %{
- "opengraph" => %{
- "image" => "http://ia.media-imdb.com/images/rock.jpg",
- "title" => "The Rock",
- "type" => "video.movie",
- "url" => "https://example.com/ogp",
- "description" =>
- "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer."
- }
- }
- }
-
- response =
- conn
- |> get("/api/v1/statuses/#{activity.id}/card")
- |> json_response_and_validate_schema(200)
-
- assert response == card_data
-
- # works with private posts
- {:ok, activity} =
- CommonAPI.post(user, %{status: "https://example.com/ogp", visibility: "direct"})
-
- response_two =
- conn
- |> get("/api/v1/statuses/#{activity.id}/card")
- |> json_response_and_validate_schema(200)
-
- assert response_two == card_data
- end
-
- test "replaces missing description with an empty string", %{conn: conn, user: user} do
- Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
-
- {:ok, activity} = CommonAPI.post(user, %{status: "https://example.com/ogp-missing-data"})
-
- response =
- conn
- |> get("/api/v1/statuses/#{activity.id}/card")
- |> json_response_and_validate_schema(:ok)
-
- assert response == %{
- "type" => "link",
- "title" => "Pleroma",
- "description" => "",
- "image" => nil,
- "provider_name" => "example.com",
- "provider_url" => "https://example.com",
- "url" => "https://example.com/ogp-missing-data",
- "pleroma" => %{
- "opengraph" => %{
- "title" => "Pleroma",
- "type" => "website",
- "url" => "https://example.com/ogp-missing-data"
- }
- }
- }
- end
- end
-
test "bookmarks" do
bookmarks_uri = "/api/v1/bookmarks"
@@ -1934,23 +1857,50 @@ test "expires_at is nil for another user" do
|> json_response_and_validate_schema(:ok)
end
- test "posting a local only status" do
- %{user: _user, conn: conn} = oauth_access(["write:statuses"])
+ describe "local-only statuses" do
+ test "posting a local only status" do
+ %{user: _user, conn: conn} = oauth_access(["write:statuses"])
- conn_one =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/v1/statuses", %{
- "status" => "cofe",
- "visibility" => "local"
- })
+ conn_one =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "cofe",
+ "visibility" => "local"
+ })
- local = Utils.as_local_public()
+ local = Utils.as_local_public()
- assert %{"content" => "cofe", "id" => id, "visibility" => "local"} =
- json_response_and_validate_schema(conn_one, 200)
+ assert %{"content" => "cofe", "id" => id, "visibility" => "local"} =
+ json_response_and_validate_schema(conn_one, 200)
- assert %Activity{id: ^id, data: %{"to" => [^local]}} = Activity.get_by_id(id)
+ assert %Activity{id: ^id, data: %{"to" => [^local]}} = Activity.get_by_id(id)
+ end
+
+ test "other users can read local-only posts" do
+ user = insert(:user)
+ %{user: _reader, conn: conn} = oauth_access(["read:statuses"])
+
+ {:ok, activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
+
+ received =
+ conn
+ |> get("/api/v1/statuses/#{activity.id}")
+ |> json_response_and_validate_schema(:ok)
+
+ assert received["id"] == activity.id
+ end
+
+ test "anonymous users cannot see local-only posts" do
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
+
+ _received =
+ build_conn()
+ |> get("/api/v1/statuses/#{activity.id}")
+ |> json_response_and_validate_schema(:not_found)
+ end
end
describe "muted reactions" do
@@ -2023,4 +1973,102 @@ test "show" do
} = result
end
end
+
+ describe "posting quotes" do
+ setup do: oauth_access(["write:statuses"])
+
+ test "posting a quote", %{conn: conn} do
+ user = insert(:user)
+ {:ok, quoted_status} = CommonAPI.post(user, %{status: "tell me, for whom do you fight?"})
+
+ conn =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "Hmph, how very glib",
+ "quote_id" => quoted_status.id
+ })
+
+ response = json_response_and_validate_schema(conn, 200)
+
+ assert response["quote_id"] == quoted_status.id
+ assert response["quote"]["id"] == quoted_status.id
+ assert response["quote"]["content"] == quoted_status.object.data["content"]
+ end
+
+ test "posting a quote, quoting a status that isn't public", %{conn: conn} do
+ user = insert(:user)
+
+ Enum.each(["private", "local", "direct"], fn visibility ->
+ {:ok, quoted_status} =
+ CommonAPI.post(user, %{
+ status: "tell me, for whom do you fight?",
+ visibility: visibility
+ })
+
+ assert %{"error" => "You can only quote public or unlisted statuses"} =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "Hmph, how very glib",
+ "quote_id" => quoted_status.id
+ })
+ |> json_response_and_validate_schema(422)
+ end)
+ end
+
+ test "posting a quote, after quote, the status gets deleted", %{conn: conn} do
+ user = insert(:user)
+
+ {:ok, quoted_status} =
+ CommonAPI.post(user, %{status: "tell me, for whom do you fight?", visibility: "public"})
+
+ resp =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "I fight for eorzea!",
+ "quote_id" => quoted_status.id
+ })
+ |> json_response_and_validate_schema(200)
+
+ {:ok, _} = CommonAPI.delete(quoted_status.id, user)
+
+ resp =
+ conn
+ |> get("/api/v1/statuses/#{resp["id"]}")
+ |> json_response_and_validate_schema(200)
+
+ assert is_nil(resp["quote"])
+ end
+
+ test "posting a quote of a deleted status", %{conn: conn} do
+ user = insert(:user)
+
+ {:ok, quoted_status} =
+ CommonAPI.post(user, %{status: "tell me, for whom do you fight?", visibility: "public"})
+
+ {:ok, _} = CommonAPI.delete(quoted_status.id, user)
+
+ assert %{"error" => _} =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "I fight for eorzea!",
+ "quote_id" => quoted_status.id
+ })
+ |> json_response_and_validate_schema(422)
+ end
+
+ test "posting a quote of a status that doesn't exist", %{conn: conn} do
+ assert %{"error" => "You can't quote a status that doesn't exist"} =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "I fight for eorzea!",
+ "quote_id" => "oops"
+ })
+ |> json_response_and_validate_schema(422)
+ end
+ end
end
diff --git a/test/pleroma/web/mastodon_api/controllers/subscription_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/subscription_controller_test.exs
index 5a3f93d2d..1335656b4 100644
--- a/test/pleroma/web/mastodon_api/controllers/subscription_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/subscription_controller_test.exs
@@ -113,7 +113,6 @@ test "successful creation", %{conn: conn} do
"favourite" => true,
"follow" => true,
"reblog" => true,
- "pleroma:chat_mention" => true,
"pleroma:emoji_reaction" => true
}
},
@@ -129,7 +128,6 @@ test "successful creation", %{conn: conn} do
"favourite" => true,
"follow" => true,
"reblog" => true,
- "pleroma:chat_mention" => true,
"pleroma:emoji_reaction" => true
},
"endpoint" => subscription.endpoint,
@@ -185,7 +183,6 @@ test "returns a user subsciption", %{conn: conn, user: user, token: token} do
"favourite" => true,
"follow" => true,
"reblog" => true,
- "pleroma:chat_mention" => true,
"pleroma:emoji_reaction" => true
}
}
@@ -204,7 +201,6 @@ test "returns updated subsciption", %{conn: conn, subscription: subscription} do
"favourite" => false,
"follow" => false,
"reblog" => false,
- "pleroma:chat_mention" => false,
"pleroma:emoji_reaction" => false
}
}
@@ -217,7 +213,6 @@ test "returns updated subsciption", %{conn: conn, subscription: subscription} do
"favourite" => false,
"follow" => false,
"reblog" => false,
- "pleroma:chat_mention" => false,
"pleroma:emoji_reaction" => false
},
"endpoint" => "https://example.com/example/1234",
diff --git a/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs
index 187982d92..cf60ba93e 100644
--- a/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/timeline_controller_test.exs
@@ -367,6 +367,47 @@ test "muted emotions", %{conn: conn} do
}
] = result
end
+
+ test "should return local-only posts for authenticated users" do
+ user = insert(:user)
+ %{user: _reader, conn: conn} = oauth_access(["read:statuses"])
+
+ {:ok, %{id: id}} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
+
+ result =
+ conn
+ |> get("/api/v1/timelines/public")
+ |> json_response_and_validate_schema(200)
+
+ assert [%{"id" => ^id}] = result
+ end
+
+ test "should not return local-only posts for users without read:statuses" do
+ user = insert(:user)
+ %{user: _reader, conn: conn} = oauth_access([])
+
+ {:ok, _activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
+
+ result =
+ conn
+ |> get("/api/v1/timelines/public")
+ |> json_response_and_validate_schema(200)
+
+ assert [] = result
+ end
+
+ test "should not return local-only posts for anonymous users" do
+ user = insert(:user)
+
+ {:ok, _activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
+
+ result =
+ build_conn()
+ |> get("/api/v1/timelines/public")
+ |> json_response_and_validate_schema(200)
+
+ assert [] = result
+ end
end
defp local_and_remote_activities do
@@ -994,6 +1035,45 @@ test "with `%{local: true, federated: false}`, forbids unauthenticated access to
end
end
+ describe "bubble" do
+ setup do: oauth_access(["read:statuses"])
+
+ test "filtering", %{conn: conn, user: user} do
+ clear_config([:instance, :local_bubble], [])
+ # our endpoint host has a port in it so let's set the AP ID
+ local_user = insert(:user, %{ap_id: "https://localhost/users/user"})
+ remote_user = insert(:user, %{ap_id: "https://example.com/users/remote_user"})
+ {:ok, user, local_user} = User.follow(user, local_user)
+ {:ok, _user, remote_user} = User.follow(user, remote_user)
+
+ {:ok, local_activity} = CommonAPI.post(local_user, %{status: "Status"})
+ remote_activity = create_remote_activity(remote_user)
+
+ # If nothing, only include ours
+ clear_config([:instance, :local_bubble], [])
+
+ one_instance =
+ conn
+ |> get("/api/v1/timelines/bubble")
+ |> json_response_and_validate_schema(200)
+ |> Enum.map(& &1["id"])
+
+ assert local_activity.id in one_instance
+
+ # If we have others, also include theirs
+ clear_config([:instance, :local_bubble], ["example.com"])
+
+ two_instances =
+ conn
+ |> get("/api/v1/timelines/bubble")
+ |> json_response_and_validate_schema(200)
+ |> Enum.map(& &1["id"])
+
+ assert local_activity.id in two_instances
+ assert remote_activity.id in two_instances
+ end
+ end
+
defp create_remote_activity(user) do
obj =
insert(:note, %{
diff --git a/test/pleroma/web/mastodon_api/update_credentials_test.exs b/test/pleroma/web/mastodon_api/update_credentials_test.exs
index 0f423cce8..606467fa9 100644
--- a/test/pleroma/web/mastodon_api/update_credentials_test.exs
+++ b/test/pleroma/web/mastodon_api/update_credentials_test.exs
@@ -104,13 +104,6 @@ test "updates the user's locking status", %{conn: conn} do
assert user_data["locked"] == true
end
- test "updates the user's chat acceptance status", %{conn: conn} do
- conn = patch(conn, "/api/v1/accounts/update_credentials", %{accepts_chat_messages: "false"})
-
- assert user_data = json_response_and_validate_schema(conn, 200)
- assert user_data["pleroma"]["accepts_chat_messages"] == false
- end
-
test "updates the user's allow_following_move", %{user: user, conn: conn} do
assert user.allow_following_move == true
diff --git a/test/pleroma/web/mastodon_api/views/account_view_test.exs b/test/pleroma/web/mastodon_api/views/account_view_test.exs
index c23ffb966..8db887137 100644
--- a/test/pleroma/web/mastodon_api/views/account_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/account_view_test.exs
@@ -91,8 +91,7 @@ test "Represent a user account" do
hide_followers_count: false,
hide_follows_count: false,
relationship: %{},
- skip_thread_containment: false,
- accepts_chat_messages: nil
+ skip_thread_containment: false
}
}
@@ -193,8 +192,7 @@ test "Represent a Service(bot) account" do
hide_followers_count: false,
hide_follows_count: false,
relationship: %{},
- skip_thread_containment: false,
- accepts_chat_messages: nil
+ skip_thread_containment: false
}
}
diff --git a/test/pleroma/web/mastodon_api/views/notification_view_test.exs b/test/pleroma/web/mastodon_api/views/notification_view_test.exs
index a22c9df1d..803b1f438 100644
--- a/test/pleroma/web/mastodon_api/views/notification_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/notification_view_test.exs
@@ -6,8 +6,6 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
use Pleroma.DataCase
alias Pleroma.Activity
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.Repo
@@ -22,7 +20,6 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
alias Pleroma.Web.MastodonAPI.NotificationView
alias Pleroma.Web.MastodonAPI.StatusView
alias Pleroma.Web.MediaProxy
- alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
import Pleroma.Factory
defp test_notifications_rendering(notifications, user, expected_result) do
@@ -40,30 +37,6 @@ defp test_notifications_rendering(notifications, user, expected_result) do
assert expected_result == result
end
- test "ChatMessage notification" do
- user = insert(:user)
- recipient = insert(:user)
- {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "what's up my dude")
-
- {:ok, [notification]} = Notification.create_notifications(activity)
-
- object = Object.normalize(activity, fetch: false)
- chat = Chat.get(recipient.id, user.ap_id)
-
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- expected = %{
- id: to_string(notification.id),
- pleroma: %{is_seen: false, is_muted: false},
- type: "pleroma:chat_mention",
- account: AccountView.render("show.json", %{user: user, for: recipient}),
- chat_message: MessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}),
- created_at: Utils.to_masto_date(notification.inserted_at)
- }
-
- test_notifications_rendering([notification], recipient, [expected])
- end
-
test "Mention notification" do
user = insert(:user)
mentioned_user = insert(:user)
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index caf2594c0..fb3255927 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -14,7 +14,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
alias Pleroma.User
alias Pleroma.UserRelationship
alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.MastodonAPI.StatusView
@@ -240,7 +239,7 @@ test "a note activity" do
object_data = Object.normalize(note, fetch: false).data
user = User.get_cached_by_ap_id(note.data["actor"])
- convo_id = Utils.context_to_conversation_id(object_data["context"])
+ convo_id = :erlang.crc32(object_data["context"]) |> Bitwise.band(Bitwise.bnot(0x8000_0000))
status = StatusView.render("show.json", %{activity: note})
@@ -293,6 +292,7 @@ test "a note activity" do
pleroma: %{
local: true,
conversation_id: convo_id,
+ context: object_data["context"],
in_reply_to_account_acct: nil,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
@@ -305,7 +305,9 @@ test "a note activity" do
},
akkoma: %{
source: HTML.filter_tags(object_data["content"])
- }
+ },
+ quote_id: nil,
+ quote: nil
}
assert status == expected
@@ -393,6 +395,30 @@ test "a reply" do
assert status.in_reply_to_id == to_string(note.id)
end
+ test "a quote" do
+ note = insert(:note_activity)
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{status: "hehe", quote_id: note.id})
+
+ status = StatusView.render("show.json", %{activity: activity})
+
+ assert status.quote_id == to_string(note.id)
+
+ [status] = StatusView.render("index.json", %{activities: [activity], as: :activity})
+
+ assert status.quote_id == to_string(note.id)
+ end
+
+ test "a quote that we can't resolve" do
+ note = insert(:note_activity, quoteUri: "oopsie")
+
+ status = StatusView.render("show.json", %{activity: note})
+
+ assert is_nil(status.quote_id)
+ assert is_nil(status.quote)
+ end
+
test "contains mentions" do
user = insert(:user)
mentioned = insert(:user)
diff --git a/test/pleroma/web/media_proxy/media_proxy_controller_test.exs b/test/pleroma/web/media_proxy/media_proxy_controller_test.exs
index 1f2e54194..e4b66c109 100644
--- a/test/pleroma/web/media_proxy/media_proxy_controller_test.exs
+++ b/test/pleroma/web/media_proxy/media_proxy_controller_test.exs
@@ -158,7 +158,7 @@ test "responds with 424 Failed Dependency if HEAD request to media proxy fails",
media_proxy_url: media_proxy_url
} do
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{status: 500, body: ""}
end)
@@ -173,7 +173,7 @@ test "redirects to media proxy URI on unsupported content type", %{
media_proxy_url: media_proxy_url
} do
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{status: 200, body: "", headers: [{"content-type", "application/pdf"}]}
end)
@@ -193,7 +193,7 @@ test "with `static=true` and GIF image preview requested, responds with JPEG ima
clear_config([:media_preview_proxy, :min_content_length], 1_000_000_000)
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{
status: 200,
body: "",
@@ -218,7 +218,7 @@ test "with GIF image preview requested and no `static` param, redirects to media
media_proxy_url: media_proxy_url
} do
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/gif"}]}
end)
@@ -236,7 +236,7 @@ test "with `static` param and non-GIF image preview requested, " <>
media_proxy_url: media_proxy_url
} do
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/jpeg"}]}
end)
@@ -256,7 +256,7 @@ test "with :min_content_length setting not matched by Content-Length header, " <
clear_config([:media_preview_proxy, :min_content_length], 100_000)
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{
status: 200,
body: "",
@@ -278,7 +278,7 @@ test "thumbnails PNG images into PNG", %{
assert_dependencies_installed()
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/png"}]}
%{method: :get, url: ^media_proxy_url} ->
@@ -300,7 +300,7 @@ test "thumbnails JPEG images into JPEG", %{
assert_dependencies_installed()
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/jpeg"}]}
%{method: :get, url: ^media_proxy_url} ->
@@ -320,7 +320,7 @@ test "redirects to media proxy URI in case of thumbnailing error", %{
media_proxy_url: media_proxy_url
} do
Tesla.Mock.mock(fn
- %{method: "head", url: ^media_proxy_url} ->
+ %{method: "HEAD", url: ^media_proxy_url} ->
%Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/jpeg"}]}
%{method: :get, url: ^media_proxy_url} ->
diff --git a/test/pleroma/web/node_info_test.exs b/test/pleroma/web/node_info_test.exs
index 9deceb1b5..05a078266 100644
--- a/test/pleroma/web/node_info_test.exs
+++ b/test/pleroma/web/node_info_test.exs
@@ -133,6 +133,7 @@ test "it shows default features flags", %{conn: conn} do
default_features = [
"pleroma_api",
+ "akkoma_api",
"mastodon_api",
"mastodon_api_streaming",
"polls",
@@ -140,8 +141,7 @@ test "it shows default features flags", %{conn: conn} do
"shareable_emoji_packs",
"multifetch",
"pleroma_emoji_reactions",
- "pleroma:api/v1/notifications:include_types_filter",
- "pleroma_chat_messages"
+ "pleroma:api/v1/notifications:include_types_filter"
]
assert MapSet.subset?(
@@ -188,6 +188,25 @@ test "shows extra information in the quarantined_info field for relevant entries
end
end
+ test "Bubble instances", %{conn: conn} do
+ clear_config([:instance, :local_bubble], [])
+
+ response =
+ conn
+ |> get("/nodeinfo/2.1.json")
+ |> json_response(:ok)
+
+ assert response["metadata"]["localBubbleInstances"] == []
+ clear_config([:instance, :local_bubble], ["example.com"])
+
+ response =
+ conn
+ |> get("/nodeinfo/2.1.json")
+ |> json_response(:ok)
+
+ assert response["metadata"]["localBubbleInstances"] == ["example.com"]
+ end
+
describe "MRF SimplePolicy" do
setup do
clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy])
diff --git a/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs
index 3ee660a05..ba17636da 100644
--- a/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs
+++ b/test/pleroma/web/pleroma_api/controllers/backup_controller_test.exs
@@ -82,4 +82,24 @@ test "POST /api/v1/pleroma/backups", %{user: _user, conn: conn} do
|> post("/api/v1/pleroma/backups")
|> json_response_and_validate_schema(400)
end
+
+ test "Backup without email address" do
+ user = Pleroma.Factory.insert(:user, email: nil)
+ %{conn: conn} = oauth_access(["read:accounts"], user: user)
+
+ assert is_nil(user.email)
+
+ assert [
+ %{
+ "content_type" => "application/zip",
+ "url" => _url,
+ "file_size" => 0,
+ "processed" => false,
+ "inserted_at" => _
+ }
+ ] =
+ conn
+ |> post("/api/v1/pleroma/backups")
+ |> json_response_and_validate_schema(:ok)
+ end
end
diff --git a/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs
deleted file mode 100644
index 99b0d43a7..000000000
--- a/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs
+++ /dev/null
@@ -1,468 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
- use Pleroma.Web.ConnCase
-
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.Object
- alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.CommonAPI
-
- import Pleroma.Factory
-
- describe "POST /api/v1/pleroma/chats/:id/messages/:message_id/read" do
- setup do: oauth_access(["write:chats"])
-
- test "it marks one message as read", %{conn: conn, user: user} do
- other_user = insert(:user)
-
- {:ok, create} = CommonAPI.post_chat_message(other_user, user, "sup")
- {:ok, _create} = CommonAPI.post_chat_message(other_user, user, "sup part 2")
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
- object = Object.normalize(create, fetch: false)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- assert cm_ref.unread == true
-
- result =
- conn
- |> post("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}/read")
- |> json_response_and_validate_schema(200)
-
- assert result["unread"] == false
-
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- assert cm_ref.unread == false
- end
- end
-
- describe "POST /api/v1/pleroma/chats/:id/read" do
- setup do: oauth_access(["write:chats"])
-
- test "given a `last_read_id`, it marks everything until then as read", %{
- conn: conn,
- user: user
- } do
- other_user = insert(:user)
-
- {:ok, create} = CommonAPI.post_chat_message(other_user, user, "sup")
- {:ok, _create} = CommonAPI.post_chat_message(other_user, user, "sup part 2")
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
- object = Object.normalize(create, fetch: false)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- assert cm_ref.unread == true
-
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/v1/pleroma/chats/#{chat.id}/read", %{"last_read_id" => cm_ref.id})
- |> json_response_and_validate_schema(200)
-
- assert result["unread"] == 1
-
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- assert cm_ref.unread == false
- end
- end
-
- describe "POST /api/v1/pleroma/chats/:id/messages" do
- setup do: oauth_access(["write:chats"])
-
- test "it posts a message to the chat", %{conn: conn, user: user} do
- other_user = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
-
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> put_req_header("idempotency-key", "123")
- |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"})
- |> json_response_and_validate_schema(200)
-
- assert result["content"] == "Hallo!!"
- assert result["chat_id"] == chat.id |> to_string()
- assert result["idempotency_key"] == "123"
- end
-
- test "it fails if there is no content", %{conn: conn, user: user} do
- other_user = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
-
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/v1/pleroma/chats/#{chat.id}/messages")
- |> json_response_and_validate_schema(400)
-
- assert %{"error" => "no_content"} == result
- end
-
- test "it works with an attachment", %{conn: conn, user: user} do
- file = %Plug.Upload{
- content_type: "image/jpeg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
-
- other_user = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
-
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{
- "media_id" => to_string(upload.id)
- })
- |> json_response_and_validate_schema(200)
-
- assert result["attachment"]
- end
-
- test "gets MRF reason when rejected", %{conn: conn, user: user} do
- clear_config([:mrf_keyword, :reject], ["GNO"])
- clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy])
-
- other_user = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
-
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "GNO/Linux"})
- |> json_response_and_validate_schema(422)
-
- assert %{"error" => "[KeywordPolicy] Matches with rejected keyword"} == result
- end
- end
-
- describe "DELETE /api/v1/pleroma/chats/:id/messages/:message_id" do
- setup do: oauth_access(["write:chats"])
-
- test "it deletes a message from the chat", %{conn: conn, user: user} do
- recipient = insert(:user)
-
- {:ok, message} =
- CommonAPI.post_chat_message(user, recipient, "Hello darkness my old friend")
-
- {:ok, other_message} = CommonAPI.post_chat_message(recipient, user, "nico nico ni")
-
- object = Object.normalize(message, fetch: false)
-
- chat = Chat.get(user.id, recipient.ap_id)
-
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- # Deleting your own message removes the message and the reference
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}")
- |> json_response_and_validate_schema(200)
-
- assert result["id"] == cm_ref.id
- refute MessageReference.get_by_id(cm_ref.id)
- assert %{data: %{"type" => "Tombstone"}} = Object.get_by_id(object.id)
-
- # Deleting other people's messages just removes the reference
- object = Object.normalize(other_message, fetch: false)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- result =
- conn
- |> put_req_header("content-type", "application/json")
- |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}")
- |> json_response_and_validate_schema(200)
-
- assert result["id"] == cm_ref.id
- refute MessageReference.get_by_id(cm_ref.id)
- assert Object.get_by_id(object.id)
- end
- end
-
- describe "GET /api/v1/pleroma/chats/:id/messages" do
- setup do: oauth_access(["read:chats"])
-
- test "it paginates", %{conn: conn, user: user} do
- recipient = insert(:user)
-
- Enum.each(1..30, fn _ ->
- {:ok, _} = CommonAPI.post_chat_message(user, recipient, "hey")
- end)
-
- chat = Chat.get(user.id, recipient.ap_id)
-
- response = get(conn, "/api/v1/pleroma/chats/#{chat.id}/messages")
- result = json_response_and_validate_schema(response, 200)
-
- [next, prev] = get_resp_header(response, "link") |> hd() |> String.split(", ")
- api_endpoint = "/api/v1/pleroma/chats/"
-
- assert String.match?(
- next,
- ~r(#{api_endpoint}.*/messages\?limit=\d+&max_id=.*; rel=\"next\"$)
- )
-
- assert String.match?(
- prev,
- ~r(#{api_endpoint}.*/messages\?limit=\d+&min_id=.*; rel=\"prev\"$)
- )
-
- assert length(result) == 20
-
- response =
- get(conn, "/api/v1/pleroma/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}")
-
- result = json_response_and_validate_schema(response, 200)
- [next, prev] = get_resp_header(response, "link") |> hd() |> String.split(", ")
-
- assert String.match?(
- next,
- ~r(#{api_endpoint}.*/messages\?limit=\d+&max_id=.*; rel=\"next\"$)
- )
-
- assert String.match?(
- prev,
- ~r(#{api_endpoint}.*/messages\?limit=\d+&max_id=.*&min_id=.*; rel=\"prev\"$)
- )
-
- assert length(result) == 10
- end
-
- test "it returns the messages for a given chat", %{conn: conn, user: user} do
- other_user = insert(:user)
- third_user = insert(:user)
-
- {:ok, _} = CommonAPI.post_chat_message(user, other_user, "hey")
- {:ok, _} = CommonAPI.post_chat_message(user, third_user, "hey")
- {:ok, _} = CommonAPI.post_chat_message(user, other_user, "how are you?")
- {:ok, _} = CommonAPI.post_chat_message(other_user, user, "fine, how about you?")
-
- chat = Chat.get(user.id, other_user.ap_id)
-
- result =
- conn
- |> get("/api/v1/pleroma/chats/#{chat.id}/messages")
- |> json_response_and_validate_schema(200)
-
- result
- |> Enum.each(fn message ->
- assert message["chat_id"] == chat.id |> to_string()
- end)
-
- assert length(result) == 3
-
- # Trying to get the chat of a different user
- other_user_chat = Chat.get(other_user.id, user.ap_id)
-
- conn
- |> get("/api/v1/pleroma/chats/#{other_user_chat.id}/messages")
- |> json_response_and_validate_schema(404)
- end
- end
-
- describe "POST /api/v1/pleroma/chats/by-account-id/:id" do
- setup do: oauth_access(["write:chats"])
-
- test "it creates or returns a chat", %{conn: conn} do
- other_user = insert(:user)
-
- result =
- conn
- |> post("/api/v1/pleroma/chats/by-account-id/#{other_user.id}")
- |> json_response_and_validate_schema(200)
-
- assert result["id"]
- end
- end
-
- describe "GET /api/v1/pleroma/chats/:id" do
- setup do: oauth_access(["read:chats"])
-
- test "it returns a chat", %{conn: conn, user: user} do
- other_user = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
-
- result =
- conn
- |> get("/api/v1/pleroma/chats/#{chat.id}")
- |> json_response_and_validate_schema(200)
-
- assert result["id"] == to_string(chat.id)
- end
- end
-
- for tested_endpoint <- ["/api/v1/pleroma/chats", "/api/v2/pleroma/chats"] do
- describe "GET #{tested_endpoint}" do
- setup do: oauth_access(["read:chats"])
-
- test "it does not return chats with deleted users", %{conn: conn, user: user} do
- recipient = insert(:user)
- {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id)
-
- Pleroma.Repo.delete(recipient)
- User.invalidate_cache(recipient)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 0
- end
-
- test "it does not return chats with users you blocked", %{conn: conn, user: user} do
- recipient = insert(:user)
-
- {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 1
-
- User.block(user, recipient)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 0
- end
-
- test "it does not return chats with users you muted", %{conn: conn, user: user} do
- recipient = insert(:user)
-
- {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 1
-
- User.mute(user, recipient)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 0
-
- result =
- conn
- |> get("#{unquote(tested_endpoint)}?with_muted=true")
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 1
- end
-
- if tested_endpoint == "/api/v1/pleroma/chats" do
- test "it returns all chats", %{conn: conn, user: user} do
- Enum.each(1..30, fn _ ->
- recipient = insert(:user)
- {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id)
- end)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 30
- end
- else
- test "it paginates chats", %{conn: conn, user: user} do
- Enum.each(1..30, fn _ ->
- recipient = insert(:user)
- {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id)
- end)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 20
- last_id = List.last(result)["id"]
-
- result =
- conn
- |> get(unquote(tested_endpoint) <> "?max_id=#{last_id}")
- |> json_response_and_validate_schema(200)
-
- assert length(result) == 10
- end
- end
-
- test "it return a list of chats the current user is participating in, in descending order of updates",
- %{conn: conn, user: user} do
- har = insert(:user)
- jafnhar = insert(:user)
- tridi = insert(:user)
-
- {:ok, chat_1} = Chat.get_or_create(user.id, har.ap_id)
- {:ok, chat_1} = time_travel(chat_1, -3)
- {:ok, chat_2} = Chat.get_or_create(user.id, jafnhar.ap_id)
- {:ok, _chat_2} = time_travel(chat_2, -2)
- {:ok, chat_3} = Chat.get_or_create(user.id, tridi.ap_id)
- {:ok, chat_3} = time_travel(chat_3, -1)
-
- # bump the second one
- {:ok, chat_2} = Chat.bump_or_create(user.id, jafnhar.ap_id)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- ids = Enum.map(result, & &1["id"])
-
- assert ids == [
- chat_2.id |> to_string(),
- chat_3.id |> to_string(),
- chat_1.id |> to_string()
- ]
- end
-
- test "it is not affected by :restrict_unauthenticated setting (issue #1973)", %{
- conn: conn,
- user: user
- } do
- clear_config([:restrict_unauthenticated, :profiles, :local], true)
- clear_config([:restrict_unauthenticated, :profiles, :remote], true)
-
- user2 = insert(:user)
- user3 = insert(:user, local: false)
-
- {:ok, _chat_12} = Chat.get_or_create(user.id, user2.ap_id)
- {:ok, _chat_13} = Chat.get_or_create(user.id, user3.ap_id)
-
- result =
- conn
- |> get(unquote(tested_endpoint))
- |> json_response_and_validate_schema(200)
-
- account_ids = Enum.map(result, &get_in(&1, ["account", "id"]))
- assert Enum.sort(account_ids) == Enum.sort([user2.id, user3.id])
- end
- end
- end
-end
diff --git a/test/pleroma/web/pleroma_api/controllers/scrobble_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/scrobble_controller_test.exs
deleted file mode 100644
index d4546f442..000000000
--- a/test/pleroma/web/pleroma_api/controllers/scrobble_controller_test.exs
+++ /dev/null
@@ -1,60 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.ScrobbleControllerTest do
- use Pleroma.Web.ConnCase, async: true
-
- alias Pleroma.Web.CommonAPI
-
- describe "POST /api/v1/pleroma/scrobble" do
- test "works correctly" do
- %{conn: conn} = oauth_access(["write"])
-
- conn =
- conn
- |> put_req_header("content-type", "application/json")
- |> post("/api/v1/pleroma/scrobble", %{
- "title" => "lain radio episode 1",
- "artist" => "lain",
- "album" => "lain radio",
- "length" => "180000"
- })
-
- assert %{"title" => "lain radio episode 1"} = json_response_and_validate_schema(conn, 200)
- end
- end
-
- describe "GET /api/v1/pleroma/accounts/:id/scrobbles" do
- test "works correctly" do
- %{user: user, conn: conn} = oauth_access(["read"])
-
- {:ok, _activity} =
- CommonAPI.listen(user, %{
- title: "lain radio episode 1",
- artist: "lain",
- album: "lain radio"
- })
-
- {:ok, _activity} =
- CommonAPI.listen(user, %{
- title: "lain radio episode 2",
- artist: "lain",
- album: "lain radio"
- })
-
- {:ok, _activity} =
- CommonAPI.listen(user, %{
- title: "lain radio episode 3",
- artist: "lain",
- album: "lain radio"
- })
-
- conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/scrobbles")
-
- result = json_response_and_validate_schema(conn, 200)
-
- assert length(result) == 3
- end
- end
-end
diff --git a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs b/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
deleted file mode 100644
index 6deaa2102..000000000
--- a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
+++ /dev/null
@@ -1,75 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do
- use Pleroma.DataCase
-
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.Object
- alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
-
- import Pleroma.Factory
-
- test "it displays a chat message" do
- user = insert(:user)
- recipient = insert(:user)
-
- file = %Plug.Upload{
- content_type: "image/jpeg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
-
- {:ok, activity} =
- CommonAPI.post_chat_message(user, recipient, "kippis :firefox:", idempotency_key: "123")
-
- chat = Chat.get(user.id, recipient.ap_id)
-
- object = Object.normalize(activity, fetch: false)
-
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- chat_message = MessageReferenceView.render("show.json", chat_message_reference: cm_ref)
-
- assert chat_message[:id] == cm_ref.id
- assert chat_message[:content] == "kippis :firefox:"
- assert chat_message[:account_id] == user.id
- assert chat_message[:chat_id]
- assert chat_message[:created_at]
- assert chat_message[:unread] == false
- assert match?([%{shortcode: "firefox"}], chat_message[:emojis])
- assert chat_message[:idempotency_key] == "123"
-
- clear_config([:rich_media, :enabled], true)
-
- Tesla.Mock.mock_global(fn
- %{url: "https://example.com/ogp"} ->
- %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")}
- end)
-
- {:ok, activity} =
- CommonAPI.post_chat_message(recipient, user, "gkgkgk https://example.com/ogp",
- media_id: upload.id
- )
-
- object = Object.normalize(activity, fetch: false)
-
- cm_ref = MessageReference.for_chat_and_object(chat, object)
-
- chat_message_two = MessageReferenceView.render("show.json", chat_message_reference: cm_ref)
-
- assert chat_message_two[:id] == cm_ref.id
- assert chat_message_two[:content] == object.data["content"]
- assert chat_message_two[:account_id] == recipient.id
- assert chat_message_two[:chat_id] == chat_message[:chat_id]
- assert chat_message_two[:attachment]
- assert chat_message_two[:unread] == true
- assert chat_message_two[:card]
- end
-end
diff --git a/test/pleroma/web/pleroma_api/views/chat_view_test.exs b/test/pleroma/web/pleroma_api/views/chat_view_test.exs
deleted file mode 100644
index 5456c2de0..000000000
--- a/test/pleroma/web/pleroma_api/views/chat_view_test.exs
+++ /dev/null
@@ -1,49 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.ChatViewTest do
- use Pleroma.DataCase, async: true
-
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
- alias Pleroma.Object
- alias Pleroma.Web.CommonAPI
- alias Pleroma.Web.CommonAPI.Utils
- alias Pleroma.Web.MastodonAPI.AccountView
- alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
- alias Pleroma.Web.PleromaAPI.ChatView
-
- import Pleroma.Factory
-
- test "it represents a chat" do
- user = insert(:user)
- recipient = insert(:user)
-
- {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id)
-
- represented_chat = ChatView.render("show.json", chat: chat)
-
- assert represented_chat == %{
- id: "#{chat.id}",
- account:
- AccountView.render("show.json", user: recipient, skip_visibility_check: true),
- unread: 0,
- last_message: nil,
- updated_at: Utils.to_masto_date(chat.updated_at)
- }
-
- {:ok, chat_message_creation} = CommonAPI.post_chat_message(user, recipient, "hello")
-
- chat_message = Object.normalize(chat_message_creation, fetch: false)
-
- {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id)
-
- represented_chat = ChatView.render("show.json", chat: chat)
-
- cm_ref = MessageReference.for_chat_and_object(chat, chat_message)
-
- assert represented_chat[:last_message] ==
- MessageReferenceView.render("show.json", chat_message_reference: cm_ref)
- end
-end
diff --git a/test/pleroma/web/pleroma_api/views/scrobble_view_test.exs b/test/pleroma/web/pleroma_api/views/scrobble_view_test.exs
deleted file mode 100644
index 382051f6f..000000000
--- a/test/pleroma/web/pleroma_api/views/scrobble_view_test.exs
+++ /dev/null
@@ -1,20 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.PleromaAPI.ScrobbleViewTest do
- use Pleroma.DataCase, async: true
-
- alias Pleroma.Web.PleromaAPI.ScrobbleView
-
- import Pleroma.Factory
-
- test "successfully renders a Listen activity (pleroma extension)" do
- listen_activity = insert(:listen)
-
- status = ScrobbleView.render("show.json", activity: listen_activity)
-
- assert status.length == listen_activity.data["object"]["length"]
- assert status.title == listen_activity.data["object"]["title"]
- end
-end
diff --git a/test/pleroma/web/plugs/http_signature_plug_test.exs b/test/pleroma/web/plugs/http_signature_plug_test.exs
index 56ef6b06f..02e8b3092 100644
--- a/test/pleroma/web/plugs/http_signature_plug_test.exs
+++ b/test/pleroma/web/plugs/http_signature_plug_test.exs
@@ -4,6 +4,7 @@
defmodule Pleroma.Web.Plugs.HTTPSignaturePlugTest do
use Pleroma.Web.ConnCase
+ import Pleroma.Factory
alias Pleroma.Web.Plugs.HTTPSignaturePlug
import Plug.Conn
@@ -81,5 +82,14 @@ test "halts the connection when `signature` header is not present", %{conn: conn
assert conn.state == :sent
assert conn.resp_body == "Request not signed"
end
+
+ test "aliases redirected /object endpoints", _ do
+ obj = insert(:note)
+ act = insert(:note_activity, note: obj)
+ params = %{"actor" => "http://mastodon.example.org/users/admin"}
+ path = URI.parse(obj.data["id"]).path
+ conn = build_conn(:get, path, params)
+ assert ["/notice/#{act.id}"] == HTTPSignaturePlug.route_aliases(conn)
+ end
end
end
diff --git a/test/pleroma/web/push/impl_test.exs b/test/pleroma/web/push/impl_test.exs
index b3ca1a337..9100433ae 100644
--- a/test/pleroma/web/push/impl_test.exs
+++ b/test/pleroma/web/push/impl_test.exs
@@ -7,10 +7,8 @@ defmodule Pleroma.Web.Push.ImplTest do
import Pleroma.Factory
- alias Pleroma.Notification
alias Pleroma.Object
alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Push.Impl
alias Pleroma.Web.Push.Subscription
@@ -216,46 +214,6 @@ test "renders title for create activity with direct visibility" do
end
describe "build_content/3" do
- test "builds content for chat messages" do
- user = insert(:user)
- recipient = insert(:user)
-
- {:ok, chat} = CommonAPI.post_chat_message(user, recipient, "hey")
- object = Object.normalize(chat, fetch: false)
- [notification] = Notification.for_user(recipient)
-
- res = Impl.build_content(notification, user, object)
-
- assert res == %{
- body: "@#{user.nickname}: hey",
- title: "New Chat Message"
- }
- end
-
- test "builds content for chat messages with no content" do
- user = insert(:user)
- recipient = insert(:user)
-
- file = %Plug.Upload{
- content_type: "image/jpeg",
- path: Path.absname("test/fixtures/image.jpg"),
- filename: "an_image.jpg"
- }
-
- {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
-
- {:ok, chat} = CommonAPI.post_chat_message(user, recipient, nil, media_id: upload.id)
- object = Object.normalize(chat, fetch: false)
- [notification] = Notification.for_user(recipient)
-
- res = Impl.build_content(notification, user, object)
-
- assert res == %{
- body: "@#{user.nickname}: (Attachment)",
- title: "New Chat Message"
- }
- end
-
test "hides contents of notifications when option enabled" do
user = insert(:user, nickname: "Bob")
diff --git a/test/pleroma/web/shout_channel_test.exs b/test/pleroma/web/shout_channel_test.exs
deleted file mode 100644
index 5c86efe9f..000000000
--- a/test/pleroma/web/shout_channel_test.exs
+++ /dev/null
@@ -1,41 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2021 Pleroma Authors
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ShoutChannelTest do
- use Pleroma.Web.ChannelCase
- alias Pleroma.Web.ShoutChannel
- alias Pleroma.Web.UserSocket
-
- import Pleroma.Factory
-
- setup do
- user = insert(:user)
-
- {:ok, _, socket} =
- socket(UserSocket, "", %{user_name: user.nickname})
- |> subscribe_and_join(ShoutChannel, "chat:public")
-
- {:ok, socket: socket}
- end
-
- test "it broadcasts a message", %{socket: socket} do
- push(socket, "new_msg", %{"text" => "why is tenshi eating a corndog so cute?"})
- assert_broadcast("new_msg", %{text: "why is tenshi eating a corndog so cute?"})
- end
-
- describe "message lengths" do
- setup do: clear_config([:shout, :limit])
-
- test "it ignores messages of length zero", %{socket: socket} do
- push(socket, "new_msg", %{"text" => ""})
- refute_broadcast("new_msg", %{text: ""})
- end
-
- test "it ignores messages above a certain length", %{socket: socket} do
- clear_config([:shout, :limit], 2)
- push(socket, "new_msg", %{"text" => "123"})
- refute_broadcast("new_msg", %{text: "123"})
- end
- end
-end
diff --git a/test/pleroma/web/streamer_test.exs b/test/pleroma/web/streamer_test.exs
index b2941a62c..841db0e91 100644
--- a/test/pleroma/web/streamer_test.exs
+++ b/test/pleroma/web/streamer_test.exs
@@ -7,15 +7,11 @@ defmodule Pleroma.Web.StreamerTest do
import Pleroma.Factory
- alias Pleroma.Chat
- alias Pleroma.Chat.MessageReference
alias Pleroma.Conversation.Participation
alias Pleroma.List
- alias Pleroma.Object
alias Pleroma.User
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Streamer
- alias Pleroma.Web.StreamerView
@moduletag needs_streamer: true, capture_log: true
@@ -80,20 +76,16 @@ test "allows user streams (with proper OAuth token scopes)", %{
expected_user_topic = "user:#{user.id}"
expected_notification_topic = "user:notification:#{user.id}"
expected_direct_topic = "direct:#{user.id}"
- expected_pleroma_chat_topic = "user:pleroma_chat:#{user.id}"
for valid_user_token <- [read_oauth_token, read_statuses_token] do
assert {:ok, ^expected_user_topic} = Streamer.get_topic("user", user, valid_user_token)
assert {:ok, ^expected_direct_topic} =
Streamer.get_topic("direct", user, valid_user_token)
-
- assert {:ok, ^expected_pleroma_chat_topic} =
- Streamer.get_topic("user:pleroma_chat", user, valid_user_token)
end
for invalid_user_token <- [read_notifications_token, badly_scoped_token],
- user_topic <- ["user", "direct", "user:pleroma_chat"] do
+ user_topic <- ["user", "direct"] do
assert {:error, :unauthorized} = Streamer.get_topic(user_topic, user, invalid_user_token)
end
@@ -257,66 +249,6 @@ test "it sends notify to in the 'user:notification' stream", %{
refute Streamer.filtered_by_user?(user, notify)
end
- test "it sends chat messages to the 'user:pleroma_chat' stream", %{
- user: user,
- token: oauth_token
- } do
- other_user = insert(:user)
-
- {:ok, create_activity} =
- CommonAPI.post_chat_message(other_user, user, "hey cirno", idempotency_key: "123")
-
- object = Object.normalize(create_activity, fetch: false)
- chat = Chat.get(user.id, other_user.ap_id)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
- cm_ref = %{cm_ref | chat: chat, object: object}
-
- Streamer.get_topic_and_add_socket("user:pleroma_chat", user, oauth_token)
- Streamer.stream("user:pleroma_chat", {user, cm_ref})
-
- text = StreamerView.render("chat_update.json", %{chat_message_reference: cm_ref})
-
- assert text =~ "hey cirno"
- assert_receive {:text, ^text}
- end
-
- test "it sends chat messages to the 'user' stream", %{user: user, token: oauth_token} do
- other_user = insert(:user)
-
- {:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey cirno")
- object = Object.normalize(create_activity, fetch: false)
- chat = Chat.get(user.id, other_user.ap_id)
- cm_ref = MessageReference.for_chat_and_object(chat, object)
- cm_ref = %{cm_ref | chat: chat, object: object}
-
- Streamer.get_topic_and_add_socket("user", user, oauth_token)
- Streamer.stream("user", {user, cm_ref})
-
- text = StreamerView.render("chat_update.json", %{chat_message_reference: cm_ref})
-
- assert text =~ "hey cirno"
- assert_receive {:text, ^text}
- end
-
- test "it sends chat message notifications to the 'user:notification' stream", %{
- user: user,
- token: oauth_token
- } do
- other_user = insert(:user)
-
- {:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey")
-
- notify =
- Repo.get_by(Pleroma.Notification, user_id: user.id, activity_id: create_activity.id)
- |> Repo.preload(:activity)
-
- Streamer.get_topic_and_add_socket("user:notification", user, oauth_token)
- Streamer.stream("user:notification", notify)
-
- assert_receive {:render_with_user, _, _, ^notify}
- refute Streamer.filtered_by_user?(user, notify)
- end
-
test "it doesn't send notify to the 'user:notification' stream when a user is blocked", %{
user: user,
token: oauth_token
diff --git a/test/pleroma/web/twitter_api/remote_follow_controller_test.exs b/test/pleroma/web/twitter_api/remote_follow_controller_test.exs
index 97c9c6b1d..15e9b5884 100644
--- a/test/pleroma/web/twitter_api/remote_follow_controller_test.exs
+++ b/test/pleroma/web/twitter_api/remote_follow_controller_test.exs
@@ -3,7 +3,7 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do
- use Pleroma.Web.ConnCase
+ use Pleroma.Web.ConnCase, async: true
alias Pleroma.MFA
alias Pleroma.MFA.TOTP
diff --git a/test/pleroma/web/web_finger/web_finger_controller_test.exs b/test/pleroma/web/web_finger/web_finger_controller_test.exs
index 66d79320f..29cb6e01b 100644
--- a/test/pleroma/web/web_finger/web_finger_controller_test.exs
+++ b/test/pleroma/web/web_finger/web_finger_controller_test.exs
@@ -48,6 +48,35 @@ test "Webfinger JRD" do
]
end
+ test "reach user on tld, while pleroma is runned on subdomain" do
+ Pleroma.Web.Endpoint.config_change(
+ [{Pleroma.Web.Endpoint, url: [host: "sub.example.com"]}],
+ []
+ )
+
+ clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")
+
+ clear_config([Pleroma.Web.WebFinger, :domain], "example.com")
+
+ user = insert(:user, ap_id: "https://sub.example.com/users/bobby", nickname: "bobby")
+
+ response =
+ build_conn()
+ |> put_req_header("accept", "application/jrd+json")
+ |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@example.com")
+ |> json_response(200)
+
+ assert response["subject"] == "acct:#{user.nickname}@example.com"
+ assert response["aliases"] == ["https://sub.example.com/users/#{user.nickname}"]
+
+ on_exit(fn ->
+ Pleroma.Web.Endpoint.config_change(
+ [{Pleroma.Web.Endpoint, url: [host: "localhost"]}],
+ []
+ )
+ end)
+ end
+
test "it returns 404 when user isn't found (JSON)" do
result =
build_conn()
diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs
index 0a36d57e6..d10238b1a 100644
--- a/test/pleroma/web/web_finger_test.exs
+++ b/test/pleroma/web/web_finger_test.exs
@@ -47,7 +47,7 @@ test "returns error for nonsensical input" do
test "returns error when there is no content-type header" do
Tesla.Mock.mock(fn
- %{url: "http://social.heldscal.la/.well-known/host-meta"} ->
+ %{url: "https://social.heldscal.la/.well-known/host-meta"} ->
{:ok,
%Tesla.Env{
status: 200,
@@ -120,7 +120,7 @@ test "it gets the xrd endpoint for hubzilla" do
test "it gets the xrd endpoint for statusnet" do
{:ok, template} = WebFinger.find_lrdd_template("status.alpicola.com")
- assert template == "http://status.alpicola.com/main/xrd?uri={uri}"
+ assert template == "https://status.alpicola.com/main/xrd?uri={uri}"
end
test "it works with idna domains as nickname" do
@@ -147,7 +147,7 @@ test "respects json content-type" do
headers: [{"content-type", "application/jrd+json"}]
}}
- %{url: "http://mastodon.social/.well-known/host-meta"} ->
+ %{url: "https://mastodon.social/.well-known/host-meta"} ->
{:ok,
%Tesla.Env{
status: 200,
@@ -170,7 +170,7 @@ test "respects xml content-type" do
headers: [{"content-type", "application/xrd+xml"}]
}}
- %{url: "http://pawoo.net/.well-known/host-meta"} ->
+ %{url: "https://pawoo.net/.well-known/host-meta"} ->
{:ok,
%Tesla.Env{
status: 200,
diff --git a/test/pleroma/workers/receiver_worker_test.exs b/test/pleroma/workers/receiver_worker_test.exs
new file mode 100644
index 000000000..e726e6308
--- /dev/null
+++ b/test/pleroma/workers/receiver_worker_test.exs
@@ -0,0 +1,25 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Workers.ReceiverWorkerTest do
+ use Pleroma.DataCase, async: true
+ use Oban.Testing, repo: Pleroma.Repo
+
+ import Mock
+ import Pleroma.Factory
+
+ alias Pleroma.Workers.ReceiverWorker
+
+ test "it ignores MRF reject" do
+ params = insert(:note).data
+
+ with_mock Pleroma.Web.ActivityPub.Transmogrifier,
+ handle_incoming: fn _ -> {:reject, "MRF"} end do
+ assert {:discard, "MRF"} =
+ ReceiverWorker.perform(%Oban.Job{
+ args: %{"op" => "incoming_ap_doc", "params" => params}
+ })
+ end
+ end
+end
diff --git a/test/support/factory.ex b/test/support/factory.ex
index 4a78425ce..64d983663 100644
--- a/test/support/factory.ex
+++ b/test/support/factory.ex
@@ -627,4 +627,16 @@ def filter_factory do
context: ["home"]
}
end
+
+ def announcement_factory(params \\ %{}) do
+ data = Map.get(params, :data, %{})
+
+ {_, params} = Map.pop(params, :data)
+
+ %Pleroma.Announcement{
+ data: Map.merge(%{"content" => "test announcement", "all_day" => false}, data)
+ }
+ |> Map.merge(params)
+ |> Pleroma.Announcement.add_rendered_properties()
+ end
end
diff --git a/test/support/helpers.ex b/test/support/helpers.ex
index 34f1505d0..01eb4ad7f 100644
--- a/test/support/helpers.ex
+++ b/test/support/helpers.ex
@@ -42,7 +42,7 @@ defmacro clear_config(config_path, temp_setting) do
# Displaying a warning to prevent unintentional clearing of all but one keys in section
if Keyword.keyword?(temp_setting) and length(temp_setting) == 1 do
Logger.warn(
- "Please change `clear_config([section], key: value)` to `clear_config([section, key], value)`"
+ "Please change `clear_config([section], key: value)` to `clear_config([section, key], value) (#{inspect(config_path)} = #{inspect(temp_setting)})`"
)
end
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index dfac773de..476e0ce04 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -424,14 +424,6 @@ def get("http://mastodon.example.org/users/gargron", _, _, [
{:error, :nxdomain}
end
- def get("http://osada.macgirvin.com/.well-known/host-meta", _, _, _) do
- {:ok,
- %Tesla.Env{
- status: 404,
- body: ""
- }}
- end
-
def get("https://osada.macgirvin.com/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{
@@ -765,7 +757,7 @@ def get(
{:ok, %Tesla.Env{status: 406, body: ""}}
end
- def get("http://squeet.me/.well-known/host-meta", _, _, _) do
+ def get("https://squeet.me/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/squeet.me_host_meta")}}
end
@@ -806,7 +798,7 @@ def get(
{:ok, %Tesla.Env{status: 200, body: "", headers: [{"content-type", "application/jrd+json"}]}}
end
- def get("http://framatube.org/.well-known/host-meta", _, _, _) do
+ def get("https://framatube.org/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{
status: 200,
@@ -815,7 +807,7 @@ def get("http://framatube.org/.well-known/host-meta", _, _, _) do
end
def get(
- "http://framatube.org/main/xrd?uri=acct:framasoft@framatube.org",
+ "https://framatube.org/main/xrd?uri=acct:framasoft@framatube.org",
_,
_,
[{"accept", "application/xrd+xml,application/jrd+json"}]
@@ -850,7 +842,7 @@ def get(
}}
end
- def get("http://status.alpicola.com/.well-known/host-meta", _, _, _) do
+ def get("https://status.alpicola.com/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{
status: 200,
@@ -858,7 +850,7 @@ def get("http://status.alpicola.com/.well-known/host-meta", _, _, _) do
}}
end
- def get("http://macgirvin.com/.well-known/host-meta", _, _, _) do
+ def get("https://macgirvin.com/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{
status: 200,
@@ -866,7 +858,7 @@ def get("http://macgirvin.com/.well-known/host-meta", _, _, _) do
}}
end
- def get("http://gerzilla.de/.well-known/host-meta", _, _, _) do
+ def get("https://gerzilla.de/.well-known/host-meta", _, _, _) do
{:ok,
%Tesla.Env{
status: 200,
@@ -1371,6 +1363,42 @@ def get("https://patch.cx/objects/a399c28e-c821-4820-bc3e-4afeb044c16f", _, _, _
}}
end
+ def get("https://mk.absturztau.be/users/8ozbzjs3o8", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/mametsuko@mk.absturztau.be.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
+ def get("https://p.helene.moe/users/helene", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/helene@p.helene.moe.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
+ def get("https://mk.absturztau.be/notes/93e7nm8wqg", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/mk.absturztau.be-93e7nm8wqg.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
+ def get("https://p.helene.moe/objects/fd5910ac-d9dc-412e-8d1d-914b203296c4", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/p.helene.moe-AM7S6vZQmL6pI9TgPY.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
def get(url, query, body, headers) do
{:error,
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}