From f775d6e04934e8bdf34f8aa9093b7b67b94e38a6 Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 10:41:37 +0000
Subject: [PATCH 001/178] install phpmd
---
composer.json | 1 +
composer.lock | 820 +++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 820 insertions(+), 1 deletion(-)
diff --git a/composer.json b/composer.json
index 23dc4d4992..5c673dbdfa 100644
--- a/composer.json
+++ b/composer.json
@@ -153,6 +153,7 @@
"mikey179/vfsstream": "^1.6",
"mockery/mockery": "^1.3",
"php-mock/php-mock-phpunit": "^2.10",
+ "phpmd/phpmd": "^2.15",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^9"
},
diff --git a/composer.lock b/composer.lock
index 11cc407661..e94662e123 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "64436f375561718bb857e3e1b0e503c9",
+ "content-hash": "1398ab5832571c32982984ffe9bd810f",
"packages": [
{
"name": "asika/simple-console",
@@ -4297,6 +4297,151 @@
}
],
"packages-dev": [
+ {
+ "name": "composer/pcre",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+ "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<1.11.10"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.12 || ^2",
+ "phpstan/phpstan-strict-rules": "^1 || ^2",
+ "phpunit/phpunit": "^8 || ^9"
+ },
+ "type": "library",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-12T16:29:46+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "shasum": ""
+ },
+ "require": {
+ "composer/pcre": "^1 || ^2 || ^3",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without Xdebug.",
+ "keywords": [
+ "Xdebug",
+ "performance"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-06T16:37:16+00:00"
+ },
{
"name": "dms/phpunit-arraysubset-asserts",
"version": "v0.3.1",
@@ -4682,6 +4827,69 @@
],
"time": "2024-03-05T20:51:40+00:00"
},
+ {
+ "name": "pdepend/pdepend",
+ "version": "2.16.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pdepend/pdepend.git",
+ "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58",
+ "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.7",
+ "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0",
+ "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0",
+ "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0",
+ "symfony/polyfill-mbstring": "^1.19"
+ },
+ "require-dev": {
+ "easy-doc/easy-doc": "0.0.0|^1.2.3",
+ "gregwar/rst": "^1.0",
+ "squizlabs/php_codesniffer": "^2.0.0"
+ },
+ "bin": [
+ "src/bin/pdepend"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PDepend\\": "src/main/php/PDepend"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Official version of pdepend to be handled with Composer",
+ "keywords": [
+ "PHP Depend",
+ "PHP_Depend",
+ "dev",
+ "pdepend"
+ ],
+ "support": {
+ "issues": "https://github.com/pdepend/pdepend/issues",
+ "source": "https://github.com/pdepend/pdepend/tree/2.16.2"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-12-17T18:09:59+00:00"
+ },
{
"name": "phar-io/manifest",
"version": "2.0.4",
@@ -4999,6 +5207,89 @@
],
"time": "2024-02-11T07:24:16+00:00"
},
+ {
+ "name": "phpmd/phpmd",
+ "version": "2.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpmd/phpmd.git",
+ "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0",
+ "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0",
+ "shasum": ""
+ },
+ "require": {
+ "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0",
+ "ext-xml": "*",
+ "pdepend/pdepend": "^2.16.1",
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "easy-doc/easy-doc": "0.0.0 || ^1.3.2",
+ "ext-json": "*",
+ "ext-simplexml": "*",
+ "gregwar/rst": "^1.0",
+ "mikey179/vfsstream": "^1.6.8",
+ "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2"
+ },
+ "bin": [
+ "src/bin/phpmd"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "PHPMD\\": "src/main/php"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Manuel Pichler",
+ "email": "github@manuel-pichler.de",
+ "homepage": "https://github.com/manuelpichler",
+ "role": "Project Founder"
+ },
+ {
+ "name": "Marc Würth",
+ "email": "ravage@bluewin.ch",
+ "homepage": "https://github.com/ravage84",
+ "role": "Project Maintainer"
+ },
+ {
+ "name": "Other contributors",
+ "homepage": "https://github.com/phpmd/phpmd/graphs/contributors",
+ "role": "Contributors"
+ }
+ ],
+ "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.",
+ "homepage": "https://phpmd.org/",
+ "keywords": [
+ "dev",
+ "mess detection",
+ "mess detector",
+ "pdepend",
+ "phpmd",
+ "pmd"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/phpmd",
+ "issues": "https://github.com/phpmd/phpmd/issues",
+ "source": "https://github.com/phpmd/phpmd/tree/2.15.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-12-11T08:22:20+00:00"
+ },
{
"name": "phpstan/phpstan",
"version": "2.0.1",
@@ -6353,6 +6644,533 @@
],
"time": "2020-09-28T06:39:44+00:00"
},
+ {
+ "name": "symfony/config",
+ "version": "v5.4.46",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "977c88a02d7d3f16904a81907531b19666a08e78"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/977c88a02d7d3f16904a81907531b19666a08e78",
+ "reference": "977c88a02d7d3f16904a81907531b19666a08e78",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/polyfill-php81": "^1.22"
+ },
+ "conflict": {
+ "symfony/finder": "<4.4"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/finder": "^4.4|^5.0|^6.0",
+ "symfony/messenger": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/yaml": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v5.4.46"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-30T07:58:02+00:00"
+ },
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v3.2.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "d9f2e62e1a93d52ad4e4f6faaf66f6eef723d761"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d9f2e62e1a93d52ad4e4f6faaf66f6eef723d761",
+ "reference": "d9f2e62e1a93d52ad4e4f6faaf66f6eef723d761",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "conflict": {
+ "symfony/yaml": "<3.2"
+ },
+ "require-dev": {
+ "symfony/config": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/yaml": "~3.2"
+ },
+ "suggest": {
+ "symfony/config": "",
+ "symfony/expression-language": "For using expressions in service container configuration",
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DependencyInjection Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/dependency-injection/tree/3.2"
+ },
+ "time": "2017-07-28T15:22:55+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v5.4.45",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "57c8294ed37d4a055b77057827c67f9558c95c54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54",
+ "reference": "57c8294ed37d4a055b77057827c67f9558c95c54",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "symfony/process": "^5.4|^6.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.45"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-22T13:05:35+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
{
"name": "theseer/tokenizer",
"version": "1.2.3",
From 5fe7af6489b4bfa873d7bb6ef1f246b97be6cbbe Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 15:19:31 +0000
Subject: [PATCH 002/178] Add very tolerant ruleset for friendica code
---
.phpmd.xml | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
create mode 100644 .phpmd.xml
diff --git a/.phpmd.xml b/.phpmd.xml
new file mode 100644
index 0000000000..c54077ad11
--- /dev/null
+++ b/.phpmd.xml
@@ -0,0 +1,26 @@
+
+
+
+ PHPMD ruleset for friendica code.
+
+
+
+ 3
+
+
+
+
+
+ 3
+
+
+
+
+
+
From 36dbae7642c56f061c1ca7c20dc55646ffea5f63 Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 15:25:34 +0000
Subject: [PATCH 003/178] Add script to run phpmd with composer
---
.phpmd.xml => .phpmd-ruleset.xml | 2 +-
composer.json | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
rename .phpmd.xml => .phpmd-ruleset.xml (95%)
diff --git a/.phpmd.xml b/.phpmd-ruleset.xml
similarity index 95%
rename from .phpmd.xml
rename to .phpmd-ruleset.xml
index c54077ad11..190f76e4f9 100644
--- a/.phpmd.xml
+++ b/.phpmd-ruleset.xml
@@ -1,5 +1,5 @@
-
Date: Wed, 25 Dec 2024 15:28:05 +0000
Subject: [PATCH 004/178] Add phpmd as code quality check in github actions
---
.github/workflows/code-quality.yml | 32 ++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml
index dad0aec9e1..385501c1a9 100644
--- a/.github/workflows/code-quality.yml
+++ b/.github/workflows/code-quality.yml
@@ -75,3 +75,35 @@ jobs:
- name: Run PHPStan
run: composer run phpstan
+
+ phpmd:
+ name: PHPMD (PHP ${{ matrix.php }})
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ operating-system: ['ubuntu-latest']
+ php: ['8.4']
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 2
+
+ - name: Setup PHP with composer and extensions
+ uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
+ with:
+ php-version: ${{ matrix.php }}
+ coverage: none
+ tools: none
+
+ - name: Clone addon repository
+ run: git clone -b develop --single-branch https://git.friendi.ca/friendica/friendica-addons.git addon
+
+ - name: Install Composer dependencies
+ uses: "ramsey/composer-install@v2"
+
+ - name: Run PHPMD
+ run: vendor/bin/phpmd src/ github .phpmd-ruleset.xml
From 19659296eb9fabd94d8687ab0739f1590f90cb10 Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 15:59:16 +0000
Subject: [PATCH 005/178] enable cache and colors in phpmd
---
.gitignore | 1 +
composer.json | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 3a673832bd..90dd712de5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -90,6 +90,7 @@ venv/
#Ignore cache files
.php_cs.cache
.php-cs-fixer.cache
+.phpmd.result-cache.php
#ignore avatar picture cache path
/avatar
diff --git a/composer.json b/composer.json
index 724592df45..c94a3e8aef 100644
--- a/composer.json
+++ b/composer.json
@@ -160,7 +160,7 @@
"scripts": {
"test": "phpunit",
"test:unit": "phpunit -c tests/phpunit.xml --testsuite unit",
- "phpmd": "phpmd src/ text .phpmd-ruleset.xml",
+ "phpmd": "phpmd src/ text .phpmd-ruleset.xml --color --cache",
"phpstan": "phpstan analyze --memory-limit 1024M --configuration .phpstan.neon",
"lint": "find . -name \\*.php -not -path './vendor/*' -not -path './view/asset/*' -print0 | xargs -0 -n1 php -l",
"docker:translate": "docker run --rm -v $PWD:/data -w /data friendicaci/transifex bin/run_xgettext.sh",
From c83099c8d0532a74cacc571397274cf02da0c618 Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 16:17:31 +0000
Subject: [PATCH 006/178] Change output format in Github
---
.github/workflows/code-quality.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml
index 385501c1a9..9c8e20ee5f 100644
--- a/.github/workflows/code-quality.yml
+++ b/.github/workflows/code-quality.yml
@@ -106,4 +106,4 @@ jobs:
uses: "ramsey/composer-install@v2"
- name: Run PHPMD
- run: vendor/bin/phpmd src/ github .phpmd-ruleset.xml
+ run: vendor/bin/phpmd src/ text .phpmd-ruleset.xml --color
From 6684f0d5c77ab257f3fcae450cdb4fe9aea312e7 Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 18:21:27 +0000
Subject: [PATCH 007/178] Reduce cyclomatic complexity in APContact::getByURL()
---
src/Model/APContact.php | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/Model/APContact.php b/src/Model/APContact.php
index 10534498ac..9042f3e319 100644
--- a/src/Model/APContact.php
+++ b/src/Model/APContact.php
@@ -207,6 +207,15 @@ class APContact
return $fetched_contact;
}
+ return self::compactProfile($apcontact, $compacted, $url, $fetched_contact, $webfinger, $local_owner);
+ }
+
+ /**
+ * @param array|bool $fetched_contact
+ * @param array|bool $local_owner
+ */
+ private static function compactProfile(array $apcontact, array $compacted, string $url, $fetched_contact, bool $webfinger, $local_owner): array
+ {
$apcontact['url'] = $compacted['@id'];
$apcontact['uuid'] = JsonLD::fetchElement($compacted, 'diaspora:guid', '@value');
$apcontact['type'] = str_replace('as:', '', JsonLD::fetchElement($compacted, '@type'));
From d55830902b029424f2082484e924231ca11b3b40 Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 18:33:04 +0000
Subject: [PATCH 008/178] Reduce cyclomatic complexity in GServer::detect()
---
src/Model/GServer.php | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/src/Model/GServer.php b/src/Model/GServer.php
index a0c1be7bfc..4d7743f0db 100644
--- a/src/Model/GServer.php
+++ b/src/Model/GServer.php
@@ -815,6 +815,25 @@ class GServer
}
// Count the number of known contacts from this server
+ self::countNumberOfKnownContacts((int) $id, $serverdata);
+
+ if (in_array($serverdata['network'], [Protocol::DFRN, Protocol::DIASPORA])) {
+ self::discoverRelay($url);
+ }
+
+ if (!empty($systemactor)) {
+ $contact = Contact::getByURL($systemactor, true, ['gsid', 'baseurl', 'id', 'network', 'url', 'name']);
+ Logger::debug('Fetched system actor', ['url' => $url, 'gsid' => $id, 'contact' => $contact]);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Count the number of known contacts from this server
+ */
+ private static function countNumberOfKnownContacts(int $id, array $serverdata): void
+ {
if (!empty($id) && !in_array($serverdata['network'], [Protocol::PHANTOM, Protocol::FEED])) {
$apcontacts = DBA::count('apcontact', ['gsid' => $id]);
$contacts = DBA::count('contact', ['uid' => 0, 'gsid' => $id, 'failed' => false]);
@@ -840,17 +859,6 @@ class GServer
}
}
}
-
- if (in_array($serverdata['network'], [Protocol::DFRN, Protocol::DIASPORA])) {
- self::discoverRelay($url);
- }
-
- if (!empty($systemactor)) {
- $contact = Contact::getByURL($systemactor, true, ['gsid', 'baseurl', 'id', 'network', 'url', 'name']);
- Logger::debug('Fetched system actor', ['url' => $url, 'gsid' => $id, 'contact' => $contact]);
- }
-
- return $ret;
}
/**
From 530a93794fcd7c436f1be5f3f674c2de3983d515 Mon Sep 17 00:00:00 2001
From: Art4
Date: Wed, 25 Dec 2024 18:37:13 +0000
Subject: [PATCH 009/178] Fix PHPStan error
---
src/Model/APContact.php | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Model/APContact.php b/src/Model/APContact.php
index 9042f3e319..bfb80686b4 100644
--- a/src/Model/APContact.php
+++ b/src/Model/APContact.php
@@ -164,6 +164,8 @@ class APContact
DI::cache()->set($cachekey, System::callstack(20), Duration::FIVE_MINUTES);
}
+ $local_owner = [];
+
if (DI::baseUrl()->isLocalUrl($url) && ($local_uid = User::getIdForURL($url))) {
try {
$data = Transmitter::getProfile($local_uid);
From 83a3bc44af87162cb71df3f8f5bfed9021c7ea38 Mon Sep 17 00:00:00 2001
From: Art4
Date: Fri, 27 Dec 2024 11:45:28 +0000
Subject: [PATCH 010/178] Split method Item::insert()
---
src/Model/Item.php | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index c9024c9cc6..7de856b2f6 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -1329,6 +1329,11 @@ class Item
Logger::notice('created item', ['post-id' => $post_user_id, 'uid' => $item['uid'], 'network' => $item['network'], 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]);
+ return self::handleCreatedItem($orig_item, $post_user_id, $uid, $notify, $copy_permissions, $parent_origin, $priority, $notify_type, $inserted);
+ }
+
+ private static function handleCreatedItem(array $orig_item, int $post_user_id, int $uid, int $notify, bool $copy_permissions, $parent_origin, int $priority, string $notify_type, bool $inserted): int
+ {
$posted_item = Post::selectFirst(self::ITEM_FIELDLIST, ['post-user-id' => $post_user_id]);
if (!DBA::isResult($posted_item)) {
// On failure store the data into a spool file so that the "SpoolPost" worker can try again later.
From 5315ec0c104981ed237e44bc43c714fa86d0e10a Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 14:16:33 +0000
Subject: [PATCH 011/178] Add license file for phpmd ruleset
---
.phpmd-ruleset.xml.license | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 .phpmd-ruleset.xml.license
diff --git a/.phpmd-ruleset.xml.license b/.phpmd-ruleset.xml.license
new file mode 100644
index 0000000000..985c307f25
--- /dev/null
+++ b/.phpmd-ruleset.xml.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2010-2024 the Friendica project
+
+SPDX-License-Identifier: CC0-1.0
From 92ae7484987a4e0de024a745d4fe2aa3e074f70e Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 15:24:13 +0000
Subject: [PATCH 012/178] Fix missing variable
---
src/Model/Item.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 3816074d9e..acf99b4f3d 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -1345,10 +1345,10 @@ class Item
Logger::notice('created item', ['post-id' => $post_user_id, 'uid' => $item['uid'], 'network' => $item['network'], 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]);
- return self::handleCreatedItem($orig_item, $post_user_id, $uid, $notify, $copy_permissions, $parent_origin, $priority, $notify_type, $inserted);
+ return self::handleCreatedItem($orig_item, $post_user_id, $uid, $notify, $copy_permissions, $parent_origin, $priority, $notify_type, $inserted, $source);
}
- private static function handleCreatedItem(array $orig_item, int $post_user_id, int $uid, int $notify, bool $copy_permissions, $parent_origin, int $priority, string $notify_type, bool $inserted): int
+ private static function handleCreatedItem(array $orig_item, int $post_user_id, int $uid, int $notify, bool $copy_permissions, $parent_origin, int $priority, string $notify_type, bool $inserted, $source): int
{
$posted_item = Post::selectFirst(self::ITEM_FIELDLIST, ['post-user-id' => $post_user_id]);
if (!DBA::isResult($posted_item)) {
@@ -4270,7 +4270,7 @@ class Item
/**
* Fetch the uri-id of a quoted post by searching for data in the body or attached media
*
- * @param string $body The body of the
+ * @param string $body The body of the
* @param int $uid The id of the user
* @return integer
*/
From 2a7f7af02caaa1c2e7bcdaa32603748b86195d6e Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 15:39:26 +0000
Subject: [PATCH 013/178] extract validating item data into separate method
---
src/Model/Item.php | 139 ++++++++++++++++++++++++---------------------
1 file changed, 73 insertions(+), 66 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index acf99b4f3d..89544fc716 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -928,45 +928,6 @@ class Item
$defined_permissions = isset($item['allow_cid']) && isset($item['allow_gid']) && isset($item['deny_cid']) && isset($item['deny_gid']) && isset($item['private']);
- $item['wall'] = intval($item['wall'] ?? 0);
- $item['extid'] = trim($item['extid'] ?? '');
- $item['author-name'] = trim($item['author-name'] ?? '');
- $item['author-link'] = trim($item['author-link'] ?? '');
- $item['author-avatar'] = trim($item['author-avatar'] ?? '');
- $item['owner-name'] = trim($item['owner-name'] ?? '');
- $item['owner-link'] = trim($item['owner-link'] ?? '');
- $item['owner-avatar'] = trim($item['owner-avatar'] ?? '');
- $item['received'] = (isset($item['received']) ? DateTimeFormat::utc($item['received']) : DateTimeFormat::utcNow());
- $item['created'] = (isset($item['created']) ? DateTimeFormat::utc($item['created']) : $item['received']);
- $item['edited'] = (isset($item['edited']) ? DateTimeFormat::utc($item['edited']) : $item['created']);
- $item['changed'] = (isset($item['changed']) ? DateTimeFormat::utc($item['changed']) : $item['created']);
- $item['commented'] = (isset($item['commented']) ? DateTimeFormat::utc($item['commented']) : $item['created']);
- $item['title'] = substr(trim($item['title'] ?? ''), 0, 255);
- $item['location'] = trim($item['location'] ?? '');
- $item['coord'] = trim($item['coord'] ?? '');
- $item['visible'] = (isset($item['visible']) ? intval($item['visible']) : 1);
- $item['deleted'] = 0;
- $item['verb'] = trim($item['verb'] ?? '');
- $item['object-type'] = trim($item['object-type'] ?? '');
- $item['object'] = trim($item['object'] ?? '');
- $item['target-type'] = trim($item['target-type'] ?? '');
- $item['target'] = trim($item['target'] ?? '');
- $item['plink'] = substr(trim($item['plink'] ?? ''), 0, 255);
- $item['allow_cid'] = trim($item['allow_cid'] ?? '');
- $item['allow_gid'] = trim($item['allow_gid'] ?? '');
- $item['deny_cid'] = trim($item['deny_cid'] ?? '');
- $item['deny_gid'] = trim($item['deny_gid'] ?? '');
- $item['private'] = intval($item['private'] ?? self::PUBLIC);
- $item['body'] = trim($item['body'] ?? '');
- $item['raw-body'] = trim($item['raw-body'] ?? $item['body']);
- $item['app'] = trim($item['app'] ?? '');
- $item['origin'] = intval($item['origin'] ?? 0);
- $item['postopts'] = trim($item['postopts'] ?? '');
- $item['resource-id'] = trim($item['resource-id'] ?? '');
- $item['event-id'] = intval($item['event-id'] ?? 0);
- $item['inform'] = trim($item['inform'] ?? '');
- $item['file'] = trim($item['file'] ?? '');
-
// Communities aren't working with the Diaspora protocol
if (($uid != 0) && ($item['network'] == Protocol::DIASPORA)) {
$user = User::getById($uid, ['account-type']);
@@ -976,33 +937,7 @@ class Item
}
}
- // Items cannot be stored before they happen ...
- if ($item['created'] > DateTimeFormat::utcNow()) {
- $item['created'] = DateTimeFormat::utcNow();
- }
-
- // We haven't invented time travel by now.
- if ($item['edited'] > DateTimeFormat::utcNow()) {
- $item['edited'] = DateTimeFormat::utcNow();
- }
-
- $item['plink'] = ($item['plink'] ?? '') ?: DI::baseUrl() . '/display/' . urlencode($item['guid']);
-
- $item['gravity'] = self::getGravity($item);
-
- $default = [
- 'url' => $item['author-link'], 'name' => $item['author-name'],
- 'photo' => $item['author-avatar'], 'network' => $item['network']
- ];
- $item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, null, $default);
-
- $default = [
- 'url' => $item['owner-link'], 'name' => $item['owner-name'],
- 'photo' => $item['owner-avatar'], 'network' => $item['network']
- ];
- $item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, null, $default);
-
- $item['post-reason'] = self::getPostReason($item);
+ $item = self::validateItemData($item);
// Ensure that there is an avatar cache
Contact::checkAvatarCache($item['author-id']);
@@ -1490,6 +1425,78 @@ class Item
return $post_user_id;
}
+ private static function validateItemData(array $item): array
+ {
+ $item['wall'] = intval($item['wall'] ?? 0);
+ $item['extid'] = trim($item['extid'] ?? '');
+ $item['author-name'] = trim($item['author-name'] ?? '');
+ $item['author-link'] = trim($item['author-link'] ?? '');
+ $item['author-avatar'] = trim($item['author-avatar'] ?? '');
+ $item['owner-name'] = trim($item['owner-name'] ?? '');
+ $item['owner-link'] = trim($item['owner-link'] ?? '');
+ $item['owner-avatar'] = trim($item['owner-avatar'] ?? '');
+ $item['received'] = (isset($item['received']) ? DateTimeFormat::utc($item['received']) : DateTimeFormat::utcNow());
+ $item['created'] = (isset($item['created']) ? DateTimeFormat::utc($item['created']) : $item['received']);
+ $item['edited'] = (isset($item['edited']) ? DateTimeFormat::utc($item['edited']) : $item['created']);
+ $item['changed'] = (isset($item['changed']) ? DateTimeFormat::utc($item['changed']) : $item['created']);
+ $item['commented'] = (isset($item['commented']) ? DateTimeFormat::utc($item['commented']) : $item['created']);
+ $item['title'] = substr(trim($item['title'] ?? ''), 0, 255);
+ $item['location'] = trim($item['location'] ?? '');
+ $item['coord'] = trim($item['coord'] ?? '');
+ $item['visible'] = (isset($item['visible']) ? intval($item['visible']) : 1);
+ $item['deleted'] = 0;
+ $item['verb'] = trim($item['verb'] ?? '');
+ $item['object-type'] = trim($item['object-type'] ?? '');
+ $item['object'] = trim($item['object'] ?? '');
+ $item['target-type'] = trim($item['target-type'] ?? '');
+ $item['target'] = trim($item['target'] ?? '');
+ $item['plink'] = substr(trim($item['plink'] ?? ''), 0, 255);
+ $item['allow_cid'] = trim($item['allow_cid'] ?? '');
+ $item['allow_gid'] = trim($item['allow_gid'] ?? '');
+ $item['deny_cid'] = trim($item['deny_cid'] ?? '');
+ $item['deny_gid'] = trim($item['deny_gid'] ?? '');
+ $item['private'] = intval($item['private'] ?? self::PUBLIC);
+ $item['body'] = trim($item['body'] ?? '');
+ $item['raw-body'] = trim($item['raw-body'] ?? $item['body']);
+ $item['app'] = trim($item['app'] ?? '');
+ $item['origin'] = intval($item['origin'] ?? 0);
+ $item['postopts'] = trim($item['postopts'] ?? '');
+ $item['resource-id'] = trim($item['resource-id'] ?? '');
+ $item['event-id'] = intval($item['event-id'] ?? 0);
+ $item['inform'] = trim($item['inform'] ?? '');
+ $item['file'] = trim($item['file'] ?? '');
+
+ // Items cannot be stored before they happen ...
+ if ($item['created'] > DateTimeFormat::utcNow()) {
+ $item['created'] = DateTimeFormat::utcNow();
+ }
+
+ // We haven't invented time travel by now.
+ if ($item['edited'] > DateTimeFormat::utcNow()) {
+ $item['edited'] = DateTimeFormat::utcNow();
+ }
+
+ $item['plink'] = ($item['plink'] ?? '') ?: DI::baseUrl() . '/display/' . urlencode($item['guid']);
+
+ $item['gravity'] = self::getGravity($item);
+
+ $default = [
+ 'url' => $item['author-link'], 'name' => $item['author-name'],
+ 'photo' => $item['author-avatar'], 'network' => $item['network']
+ ];
+ $item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, null, $default);
+
+ $default = [
+ 'url' => $item['owner-link'], 'name' => $item['owner-name'],
+ 'photo' => $item['owner-avatar'], 'network' => $item['network']
+ ];
+ $item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, null, $default);
+
+ $item['post-reason'] = self::getPostReason($item);
+
+ return $item;
+ }
+
private static function hasRestrictions(array $item, int $author_id, int $restrictions = null): bool
{
if (empty($restrictions) || ($author_id == $item['author-id'])) {
From e93ff4243f1db05f9bf12d0da23a33a0ddf9978a Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 20:19:35 +0000
Subject: [PATCH 014/178] extract Item::prepareItemD() into own method
---
src/Model/Item.php | 41 ++++++++++++++++++++++++-----------------
1 file changed, 24 insertions(+), 17 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 89544fc716..40fe7dbd42 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -882,23 +882,7 @@ class Item
$item['network'] = trim(($item['network'] ?? '') ?: Protocol::PHANTOM);
}
- $uid = intval($item['uid']);
-
- $item['guid'] = self::guid($item, $notify);
- $item['uri'] = substr(trim($item['uri'] ?? '') ?: self::newURI($item['guid']), 0, 255);
-
- // Store URI data
- $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
-
- // Backward compatibility: parent-uri used to be the direct parent uri.
- // If it is provided without a thr-parent, it probably is the old behavior.
- if (empty($item['thr-parent']) || empty($item['parent-uri'])) {
- $item['thr-parent'] = trim($item['thr-parent'] ?? $item['parent-uri'] ?? $item['uri']);
- $item['parent-uri'] = $item['thr-parent'];
- }
-
- $item['thr-parent-id'] = ItemURI::getIdByURI($item['thr-parent']);
- $item['parent-uri-id'] = ItemURI::getIdByURI($item['parent-uri']);
+ $item = self::prepareItemData($item, (bool) $notify);
// Store conversation data
$source = $item['source'] ?? '';
@@ -928,6 +912,8 @@ class Item
$defined_permissions = isset($item['allow_cid']) && isset($item['allow_gid']) && isset($item['deny_cid']) && isset($item['deny_gid']) && isset($item['private']);
+ $uid = intval($item['uid']);
+
// Communities aren't working with the Diaspora protocol
if (($uid != 0) && ($item['network'] == Protocol::DIASPORA)) {
$user = User::getById($uid, ['account-type']);
@@ -1425,6 +1411,27 @@ class Item
return $post_user_id;
}
+ private static function prepareItemData(array $item, bool $notify): array
+ {
+ $item['guid'] = self::guid($item, $notify);
+ $item['uri'] = substr(trim($item['uri'] ?? '') ?: self::newURI($item['guid']), 0, 255);
+
+ // Store URI data
+ $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
+
+ // Backward compatibility: parent-uri used to be the direct parent uri.
+ // If it is provided without a thr-parent, it probably is the old behavior.
+ if (empty($item['thr-parent']) || empty($item['parent-uri'])) {
+ $item['thr-parent'] = trim($item['thr-parent'] ?? $item['parent-uri'] ?? $item['uri']);
+ $item['parent-uri'] = $item['thr-parent'];
+ }
+
+ $item['thr-parent-id'] = ItemURI::getIdByURI($item['thr-parent']);
+ $item['parent-uri-id'] = ItemURI::getIdByURI($item['parent-uri']);
+
+ return $item;
+ }
+
private static function validateItemData(array $item): array
{
$item['wall'] = intval($item['wall'] ?? 0);
From 53f046a74db949ca77706597dd2793be433e497d Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 20:30:39 +0000
Subject: [PATCH 015/178] Extract handleToplevelParent into own method
---
src/Model/Item.php | 93 +++++++++++++++++++++++++---------------------
1 file changed, 50 insertions(+), 43 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 40fe7dbd42..fce67de4bf 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -949,50 +949,9 @@ class Item
return 0;
}
- $parent_id = $toplevel_parent['id'];
- $item['parent-uri'] = $toplevel_parent['uri'];
- $item['parent-uri-id'] = $toplevel_parent['uri-id'];
- $item['deleted'] = $toplevel_parent['deleted'];
- $item['wall'] = $toplevel_parent['wall'];
-
- // Reshares have to keep their permissions to allow groups to work
- if (!$defined_permissions && (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE))) {
- // Don't store the permissions on pure AP posts
- $store_permissions = ($item['network'] != Protocol::ACTIVITYPUB) || $item['origin'] || !empty($item['diaspora_signed_text']);
- $item['allow_cid'] = $store_permissions ? $toplevel_parent['allow_cid'] : '';
- $item['allow_gid'] = $store_permissions ? $toplevel_parent['allow_gid'] : '';
- $item['deny_cid'] = $store_permissions ? $toplevel_parent['deny_cid'] : '';
- $item['deny_gid'] = $store_permissions ? $toplevel_parent['deny_gid'] : '';
- }
-
+ $parent_id = (int) $toplevel_parent['id'];
+ $item = self::handleToplevelParent($item, $toplevel_parent, $defined_permissions);
$parent_origin = $toplevel_parent['origin'];
-
- // Don't federate received participation messages
- if ($item['verb'] != Activity::FOLLOW) {
- $item['wall'] = $toplevel_parent['wall'];
- } else {
- $item['wall'] = false;
- // Participations are technical messages, so they are set to "seen" automatically
- $item['unseen'] = false;
- }
-
- /*
- * If the parent is private, force privacy for the entire conversation
- * This differs from the above settings as it subtly allows comments from
- * email correspondents to be private even if the overall thread is not.
- */
- if (!$defined_permissions && $toplevel_parent['private']) {
- $item['private'] = $toplevel_parent['private'];
- }
-
- // If its a post that originated here then tag the thread as "mention"
- if ($item['origin'] && $item['uid']) {
- DBA::update('post-thread-user', ['mention' => true], ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
- Logger::info('tagged thread as mention', ['parent' => $parent_id, 'parent-uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
- }
-
- // Update the contact relations
- Contact\Relation::store($toplevel_parent['author-id'], $item['author-id'], $item['created']);
} else {
$parent_id = 0;
$parent_origin = $item['origin'];
@@ -1504,6 +1463,54 @@ class Item
return $item;
}
+ private static function handleToplevelParent(array $item, array $toplevel_parent, bool $defined_permissions): array
+ {
+ $parent_id = (int) $toplevel_parent['id'];
+ $item['parent-uri'] = $toplevel_parent['uri'];
+ $item['parent-uri-id'] = $toplevel_parent['uri-id'];
+ $item['deleted'] = $toplevel_parent['deleted'];
+ $item['wall'] = $toplevel_parent['wall'];
+
+ // Reshares have to keep their permissions to allow groups to work
+ if (!$defined_permissions && (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE))) {
+ // Don't store the permissions on pure AP posts
+ $store_permissions = ($item['network'] != Protocol::ACTIVITYPUB) || $item['origin'] || !empty($item['diaspora_signed_text']);
+ $item['allow_cid'] = $store_permissions ? $toplevel_parent['allow_cid'] : '';
+ $item['allow_gid'] = $store_permissions ? $toplevel_parent['allow_gid'] : '';
+ $item['deny_cid'] = $store_permissions ? $toplevel_parent['deny_cid'] : '';
+ $item['deny_gid'] = $store_permissions ? $toplevel_parent['deny_gid'] : '';
+ }
+
+ // Don't federate received participation messages
+ if ($item['verb'] != Activity::FOLLOW) {
+ $item['wall'] = $toplevel_parent['wall'];
+ } else {
+ $item['wall'] = false;
+ // Participations are technical messages, so they are set to "seen" automatically
+ $item['unseen'] = false;
+ }
+
+ /*
+ * If the parent is private, force privacy for the entire conversation
+ * This differs from the above settings as it subtly allows comments from
+ * email correspondents to be private even if the overall thread is not.
+ */
+ if (!$defined_permissions && $toplevel_parent['private']) {
+ $item['private'] = $toplevel_parent['private'];
+ }
+
+ // If its a post that originated here then tag the thread as "mention"
+ if ($item['origin'] && $item['uid']) {
+ DBA::update('post-thread-user', ['mention' => true], ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
+ Logger::info('tagged thread as mention', ['parent' => $parent_id, 'parent-uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
+ }
+
+ // Update the contact relations
+ Contact\Relation::store($toplevel_parent['author-id'], $item['author-id'], $item['created']);
+
+ return $item;
+ }
+
private static function hasRestrictions(array $item, int $author_id, int $restrictions = null): bool
{
if (empty($restrictions) || ($author_id == $item['author-id'])) {
From 9b9432090bad69807edb69091a447de245984fad Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 20:36:43 +0000
Subject: [PATCH 016/178] fix return type
---
src/Model/Item.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index fce67de4bf..7e0cbfcfe2 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -1917,7 +1917,7 @@ class Item
*
* @param int $uriid
* @param int $uid
- * @return int
+ * @return int|null
*/
private static function GetOriginUidForUriId(int $uriid, int $uid)
{
From 61a975bf362a61e51cf3c34e8a659b67ce55a99c Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 20:57:39 +0000
Subject: [PATCH 017/178] Extract Item::prepareOriginPost() into ItemInserter
---
src/Model/Item.php | 12 +++---------
src/Model/ItemInserter.php | 33 +++++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+), 9 deletions(-)
create mode 100644 src/Model/ItemInserter.php
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 7e0cbfcfe2..782c497ab2 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -843,14 +843,6 @@ class Item
return self::GRAVITY_UNKNOWN; // Should not happen
}
- private static function prepareOriginPost(array $item): array
- {
- $item = DI::contentItem()->initializePost($item);
- $item = DI::contentItem()->finalizePost($item, false);
-
- return $item;
- }
-
/**
* Inserts item record
*
@@ -861,6 +853,8 @@ class Item
*/
public static function insert(array $item, int $notify = 0, bool $post_local = true): int
{
+ $itemInserter = new ItemInserter(DI::contentItem());
+
$orig_item = $item;
$priority = Worker::PRIORITY_HIGH;
@@ -869,7 +863,7 @@ class Item
// If it is a posting where users should get notifications, then define it as wall posting
if ($notify) {
- $item = self::prepareOriginPost($item);
+ $item = $itemInserter->prepareOriginPost($item);
if (is_int($notify) && in_array($notify, Worker::PRIORITIES)) {
$priority = $notify;
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
new file mode 100644
index 0000000000..6db36f8ed5
--- /dev/null
+++ b/src/Model/ItemInserter.php
@@ -0,0 +1,33 @@
+itemContent = $itemContent;
+ }
+
+ public function prepareOriginPost(array $item): array
+ {
+ $item = $this->itemContent->initializePost($item);
+ $item = $this->itemContent->finalizePost($item, false);
+
+ return $item;
+ }
+}
\ No newline at end of file
From 27ba28237aa20aa72219c84c3af591c11b9091e6 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 21:04:12 +0000
Subject: [PATCH 018/178] Move Item::prepareItemData() into ItemInserter
---
src/Model/Item.php | 23 +----------------------
src/Model/ItemInserter.php | 35 ++++++++++++++++++++++++++++-------
2 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 782c497ab2..8035d89631 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -876,7 +876,7 @@ class Item
$item['network'] = trim(($item['network'] ?? '') ?: Protocol::PHANTOM);
}
- $item = self::prepareItemData($item, (bool) $notify);
+ $item = $itemInserter->prepareItemData($item, (bool) $notify);
// Store conversation data
$source = $item['source'] ?? '';
@@ -1364,27 +1364,6 @@ class Item
return $post_user_id;
}
- private static function prepareItemData(array $item, bool $notify): array
- {
- $item['guid'] = self::guid($item, $notify);
- $item['uri'] = substr(trim($item['uri'] ?? '') ?: self::newURI($item['guid']), 0, 255);
-
- // Store URI data
- $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
-
- // Backward compatibility: parent-uri used to be the direct parent uri.
- // If it is provided without a thr-parent, it probably is the old behavior.
- if (empty($item['thr-parent']) || empty($item['parent-uri'])) {
- $item['thr-parent'] = trim($item['thr-parent'] ?? $item['parent-uri'] ?? $item['uri']);
- $item['parent-uri'] = $item['thr-parent'];
- }
-
- $item['thr-parent-id'] = ItemURI::getIdByURI($item['thr-parent']);
- $item['parent-uri-id'] = ItemURI::getIdByURI($item['parent-uri']);
-
- return $item;
- }
-
private static function validateItemData(array $item): array
{
$item['wall'] = intval($item['wall'] ?? 0);
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index 6db36f8ed5..a19a5be46c 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -16,18 +16,39 @@ use Friendica\Content\Item as ItemContent;
*/
final class ItemInserter
{
- private ItemContent $itemContent;
+ private ItemContent $itemContent;
- public function __construct(ItemContent $itemContent)
- {
- $this->itemContent = $itemContent;
- }
+ public function __construct(ItemContent $itemContent)
+ {
+ $this->itemContent = $itemContent;
+ }
- public function prepareOriginPost(array $item): array
+ public function prepareOriginPost(array $item): array
{
$item = $this->itemContent->initializePost($item);
$item = $this->itemContent->finalizePost($item, false);
return $item;
}
-}
\ No newline at end of file
+
+ public function prepareItemData(array $item, bool $notify): array
+ {
+ $item['guid'] = Item::guid($item, $notify);
+ $item['uri'] = substr(trim($item['uri'] ?? '') ?: Item::newURI($item['guid']), 0, 255);
+
+ // Store URI data
+ $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
+
+ // Backward compatibility: parent-uri used to be the direct parent uri.
+ // If it is provided without a thr-parent, it probably is the old behavior.
+ if (empty($item['thr-parent']) || empty($item['parent-uri'])) {
+ $item['thr-parent'] = trim($item['thr-parent'] ?? $item['parent-uri'] ?? $item['uri']);
+ $item['parent-uri'] = $item['thr-parent'];
+ }
+
+ $item['thr-parent-id'] = ItemURI::getIdByURI($item['thr-parent']);
+ $item['parent-uri-id'] = ItemURI::getIdByURI($item['parent-uri']);
+
+ return $item;
+ }
+}
From b845524134964118af03976eb5f4a279e41ac3d2 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 9 Jan 2025 21:21:42 +0000
Subject: [PATCH 019/178] Move Item::getGravity() into ItemInserter
---
src/Model/Item.php | 38 ++++++++------------------------------
src/Model/ItemInserter.php | 28 +++++++++++++++++++++++++++-
2 files changed, 35 insertions(+), 31 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 8035d89631..6833597a7c 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -817,32 +817,6 @@ class Item
return $toplevel_parent;
}
- /**
- * Get the gravity for the given item array
- *
- * @param array $item
- * @return integer gravity
- */
- private static function getGravity(array $item): int
- {
- $activity = DI::activity();
-
- if (isset($item['gravity'])) {
- return intval($item['gravity']);
- } elseif ($item['parent-uri-id'] === $item['uri-id']) {
- return self::GRAVITY_PARENT;
- } elseif ($activity->match($item['verb'], Activity::POST)) {
- return self::GRAVITY_COMMENT;
- } elseif ($activity->match($item['verb'], Activity::FOLLOW)) {
- return self::GRAVITY_ACTIVITY;
- } elseif ($activity->match($item['verb'], Activity::ANNOUNCE)) {
- return self::GRAVITY_ACTIVITY;
- }
-
- Logger::info('Unknown gravity for verb', ['verb' => $item['verb']]);
- return self::GRAVITY_UNKNOWN; // Should not happen
- }
-
/**
* Inserts item record
*
@@ -853,7 +827,7 @@ class Item
*/
public static function insert(array $item, int $notify = 0, bool $post_local = true): int
{
- $itemInserter = new ItemInserter(DI::contentItem());
+ $itemInserter = new ItemInserter(DI::contentItem(), DI::activity());
$orig_item = $item;
@@ -917,7 +891,7 @@ class Item
}
}
- $item = self::validateItemData($item);
+ $item = self::validateItemData($item, $itemInserter);
// Ensure that there is an avatar cache
Contact::checkAvatarCache($item['author-id']);
@@ -1364,7 +1338,7 @@ class Item
return $post_user_id;
}
- private static function validateItemData(array $item): array
+ private static function validateItemData(array $item, ItemInserter $itemInserter): array
{
$item['wall'] = intval($item['wall'] ?? 0);
$item['extid'] = trim($item['extid'] ?? '');
@@ -1417,7 +1391,11 @@ class Item
$item['plink'] = ($item['plink'] ?? '') ?: DI::baseUrl() . '/display/' . urlencode($item['guid']);
- $item['gravity'] = self::getGravity($item);
+ $item['gravity'] = $itemInserter->getGravity($item);
+
+ if ($item['gravity'] === self::GRAVITY_UNKNOWN) {
+ Logger::info('Unknown gravity for verb', ['verb' => $item['verb']]);
+ }
$default = [
'url' => $item['author-link'], 'name' => $item['author-name'],
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index a19a5be46c..cf824190ca 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -8,6 +8,7 @@
namespace Friendica\Model;
use Friendica\Content\Item as ItemContent;
+use Friendica\Protocol\Activity;
/**
* A helper class for inserting an Item Model
@@ -18,9 +19,12 @@ final class ItemInserter
{
private ItemContent $itemContent;
- public function __construct(ItemContent $itemContent)
+ private Activity $activity;
+
+ public function __construct(ItemContent $itemContent, Activity $activity)
{
$this->itemContent = $itemContent;
+ $this->activity = $activity;
}
public function prepareOriginPost(array $item): array
@@ -51,4 +55,26 @@ final class ItemInserter
return $item;
}
+
+ /**
+ * Get the gravity for the given item array
+ *
+ * @return int gravity
+ */
+ public function getGravity(array $item): int
+ {
+ if (isset($item['gravity'])) {
+ return intval($item['gravity']);
+ } elseif ($item['parent-uri-id'] === $item['uri-id']) {
+ return Item::GRAVITY_PARENT;
+ } elseif ($this->activity->match($item['verb'], Activity::POST)) {
+ return Item::GRAVITY_COMMENT;
+ } elseif ($this->activity->match($item['verb'], Activity::FOLLOW)) {
+ return Item::GRAVITY_ACTIVITY;
+ } elseif ($this->activity->match($item['verb'], Activity::ANNOUNCE)) {
+ return Item::GRAVITY_ACTIVITY;
+ }
+
+ return Item::GRAVITY_UNKNOWN; // Should not happen
+ }
}
From a5d4475f4532acde53dc2fd0d5087ea4c74392af Mon Sep 17 00:00:00 2001
From: Art4
Date: Fri, 10 Jan 2025 07:27:21 +0000
Subject: [PATCH 020/178] Increase class complexity rule to 700
---
.phpmd-ruleset.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.phpmd-ruleset.xml b/.phpmd-ruleset.xml
index 190f76e4f9..1f295abbe2 100644
--- a/.phpmd-ruleset.xml
+++ b/.phpmd-ruleset.xml
@@ -13,7 +13,7 @@
3
-
+
From cfc07d7b0dc783cff254dd5b7030d0f5de544f2e Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 09:16:14 +0000
Subject: [PATCH 021/178] Mark ItemInserter as internal
---
src/Model/ItemInserter.php | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index 0db7ea1d0a..7576fce203 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -13,6 +13,8 @@ use Friendica\Protocol\Activity;
/**
* A helper class for inserting an Item Model
*
+ * @internal only for use in Friendica\Content\Item class
+ *
* @see Item::insert()
*/
final class ItemInserter
From 0732c6158a23ec75712cc30c8f3c686af5a6ba4e Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 09:26:58 +0000
Subject: [PATCH 022/178] Extract validateItemData() into ItemInserter
---
src/Model/Item.php | 85 +++-------------------------------
src/Model/ItemInserter.php | 95 ++++++++++++++++++++++++++++++++++++--
2 files changed, 99 insertions(+), 81 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 7d63188461..5fdc57647f 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -826,7 +826,12 @@ class Item
*/
public static function insert(array $item, int $notify = 0, bool $post_local = true): int
{
- $itemInserter = new ItemInserter(DI::contentItem(), DI::activity());
+ $itemInserter = new ItemInserter(
+ DI::contentItem(),
+ DI::activity(),
+ DI::logger(),
+ DI::baseUrl()
+ );
$orig_item = $item;
@@ -890,7 +895,7 @@ class Item
}
}
- $item = self::validateItemData($item, $itemInserter);
+ $item = $itemInserter->validateItemData($item);
// Ensure that there is an avatar cache
Contact::checkAvatarCache($item['author-id']);
@@ -1337,82 +1342,6 @@ class Item
return $post_user_id;
}
- private static function validateItemData(array $item, ItemInserter $itemInserter): array
- {
- $item['wall'] = intval($item['wall'] ?? 0);
- $item['extid'] = trim($item['extid'] ?? '');
- $item['author-name'] = trim($item['author-name'] ?? '');
- $item['author-link'] = trim($item['author-link'] ?? '');
- $item['author-avatar'] = trim($item['author-avatar'] ?? '');
- $item['owner-name'] = trim($item['owner-name'] ?? '');
- $item['owner-link'] = trim($item['owner-link'] ?? '');
- $item['owner-avatar'] = trim($item['owner-avatar'] ?? '');
- $item['received'] = (isset($item['received']) ? DateTimeFormat::utc($item['received']) : DateTimeFormat::utcNow());
- $item['created'] = (isset($item['created']) ? DateTimeFormat::utc($item['created']) : $item['received']);
- $item['edited'] = (isset($item['edited']) ? DateTimeFormat::utc($item['edited']) : $item['created']);
- $item['changed'] = (isset($item['changed']) ? DateTimeFormat::utc($item['changed']) : $item['created']);
- $item['commented'] = (isset($item['commented']) ? DateTimeFormat::utc($item['commented']) : $item['created']);
- $item['title'] = substr(trim($item['title'] ?? ''), 0, 255);
- $item['location'] = trim($item['location'] ?? '');
- $item['coord'] = trim($item['coord'] ?? '');
- $item['visible'] = (isset($item['visible']) ? intval($item['visible']) : 1);
- $item['deleted'] = 0;
- $item['verb'] = trim($item['verb'] ?? '');
- $item['object-type'] = trim($item['object-type'] ?? '');
- $item['object'] = trim($item['object'] ?? '');
- $item['target-type'] = trim($item['target-type'] ?? '');
- $item['target'] = trim($item['target'] ?? '');
- $item['plink'] = substr(trim($item['plink'] ?? ''), 0, 255);
- $item['allow_cid'] = trim($item['allow_cid'] ?? '');
- $item['allow_gid'] = trim($item['allow_gid'] ?? '');
- $item['deny_cid'] = trim($item['deny_cid'] ?? '');
- $item['deny_gid'] = trim($item['deny_gid'] ?? '');
- $item['private'] = intval($item['private'] ?? self::PUBLIC);
- $item['body'] = trim($item['body'] ?? '');
- $item['raw-body'] = trim($item['raw-body'] ?? $item['body']);
- $item['app'] = trim($item['app'] ?? '');
- $item['origin'] = intval($item['origin'] ?? 0);
- $item['postopts'] = trim($item['postopts'] ?? '');
- $item['resource-id'] = trim($item['resource-id'] ?? '');
- $item['event-id'] = intval($item['event-id'] ?? 0);
- $item['inform'] = trim($item['inform'] ?? '');
- $item['file'] = trim($item['file'] ?? '');
-
- // Items cannot be stored before they happen ...
- if ($item['created'] > DateTimeFormat::utcNow()) {
- $item['created'] = DateTimeFormat::utcNow();
- }
-
- // We haven't invented time travel by now.
- if ($item['edited'] > DateTimeFormat::utcNow()) {
- $item['edited'] = DateTimeFormat::utcNow();
- }
-
- $item['plink'] = ($item['plink'] ?? '') ?: DI::baseUrl() . '/display/' . urlencode($item['guid']);
-
- $item['gravity'] = $itemInserter->getGravity($item);
-
- if ($item['gravity'] === self::GRAVITY_UNKNOWN) {
- DI::logger()->info('Unknown gravity for verb', ['verb' => $item['verb']]);
- }
-
- $default = [
- 'url' => $item['author-link'], 'name' => $item['author-name'],
- 'photo' => $item['author-avatar'], 'network' => $item['network']
- ];
- $item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, null, $default);
-
- $default = [
- 'url' => $item['owner-link'], 'name' => $item['owner-name'],
- 'photo' => $item['owner-avatar'], 'network' => $item['network']
- ];
- $item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, null, $default);
-
- $item['post-reason'] = self::getPostReason($item);
-
- return $item;
- }
-
private static function handleToplevelParent(array $item, array $toplevel_parent, bool $defined_permissions): array
{
$parent_id = (int) $toplevel_parent['id'];
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index 7576fce203..77e58ee154 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -7,8 +7,11 @@
namespace Friendica\Model;
+use Friendica\App\BaseURL;
use Friendica\Content\Item as ItemContent;
use Friendica\Protocol\Activity;
+use Friendica\Util\DateTimeFormat;
+use Psr\Log\LoggerInterface;
/**
* A helper class for inserting an Item Model
@@ -23,10 +26,20 @@ final class ItemInserter
private Activity $activity;
- public function __construct(ItemContent $itemContent, Activity $activity)
- {
+ private LoggerInterface $logger;
+
+ private string $baseUrl;
+
+ public function __construct(
+ ItemContent $itemContent,
+ Activity $activity,
+ LoggerInterface $logger,
+ BaseURL $baseURL,
+ ) {
$this->itemContent = $itemContent;
$this->activity = $activity;
+ $this->logger = $logger;
+ $this->baseUrl = $baseURL->__toString();
}
public function prepareOriginPost(array $item): array
@@ -58,12 +71,88 @@ final class ItemInserter
return $item;
}
+ public function validateItemData(array $item): array
+ {
+ $item['wall'] = intval($item['wall'] ?? 0);
+ $item['extid'] = trim($item['extid'] ?? '');
+ $item['author-name'] = trim($item['author-name'] ?? '');
+ $item['author-link'] = trim($item['author-link'] ?? '');
+ $item['author-avatar'] = trim($item['author-avatar'] ?? '');
+ $item['owner-name'] = trim($item['owner-name'] ?? '');
+ $item['owner-link'] = trim($item['owner-link'] ?? '');
+ $item['owner-avatar'] = trim($item['owner-avatar'] ?? '');
+ $item['received'] = (isset($item['received']) ? DateTimeFormat::utc($item['received']) : DateTimeFormat::utcNow());
+ $item['created'] = (isset($item['created']) ? DateTimeFormat::utc($item['created']) : $item['received']);
+ $item['edited'] = (isset($item['edited']) ? DateTimeFormat::utc($item['edited']) : $item['created']);
+ $item['changed'] = (isset($item['changed']) ? DateTimeFormat::utc($item['changed']) : $item['created']);
+ $item['commented'] = (isset($item['commented']) ? DateTimeFormat::utc($item['commented']) : $item['created']);
+ $item['title'] = substr(trim($item['title'] ?? ''), 0, 255);
+ $item['location'] = trim($item['location'] ?? '');
+ $item['coord'] = trim($item['coord'] ?? '');
+ $item['visible'] = (isset($item['visible']) ? intval($item['visible']) : 1);
+ $item['deleted'] = 0;
+ $item['verb'] = trim($item['verb'] ?? '');
+ $item['object-type'] = trim($item['object-type'] ?? '');
+ $item['object'] = trim($item['object'] ?? '');
+ $item['target-type'] = trim($item['target-type'] ?? '');
+ $item['target'] = trim($item['target'] ?? '');
+ $item['plink'] = substr(trim($item['plink'] ?? ''), 0, 255);
+ $item['allow_cid'] = trim($item['allow_cid'] ?? '');
+ $item['allow_gid'] = trim($item['allow_gid'] ?? '');
+ $item['deny_cid'] = trim($item['deny_cid'] ?? '');
+ $item['deny_gid'] = trim($item['deny_gid'] ?? '');
+ $item['private'] = intval($item['private'] ?? Item::PUBLIC);
+ $item['body'] = trim($item['body'] ?? '');
+ $item['raw-body'] = trim($item['raw-body'] ?? $item['body']);
+ $item['app'] = trim($item['app'] ?? '');
+ $item['origin'] = intval($item['origin'] ?? 0);
+ $item['postopts'] = trim($item['postopts'] ?? '');
+ $item['resource-id'] = trim($item['resource-id'] ?? '');
+ $item['event-id'] = intval($item['event-id'] ?? 0);
+ $item['inform'] = trim($item['inform'] ?? '');
+ $item['file'] = trim($item['file'] ?? '');
+
+ // Items cannot be stored before they happen ...
+ if ($item['created'] > DateTimeFormat::utcNow()) {
+ $item['created'] = DateTimeFormat::utcNow();
+ }
+
+ // We haven't invented time travel by now.
+ if ($item['edited'] > DateTimeFormat::utcNow()) {
+ $item['edited'] = DateTimeFormat::utcNow();
+ }
+
+ $item['plink'] = ($item['plink'] ?? '') ?: $this->baseUrl . '/display/' . urlencode($item['guid']);
+
+ $item['gravity'] = $this->getGravity($item);
+
+ if ($item['gravity'] === Item::GRAVITY_UNKNOWN) {
+ $this->logger->info('Unknown gravity for verb', ['verb' => $item['verb']]);
+ }
+
+ $default = [
+ 'url' => $item['author-link'], 'name' => $item['author-name'],
+ 'photo' => $item['author-avatar'], 'network' => $item['network']
+ ];
+ $item['author-id'] = ($item['author-id'] ?? 0) ?: Contact::getIdForURL($item['author-link'], 0, null, $default);
+
+ $default = [
+ 'url' => $item['owner-link'], 'name' => $item['owner-name'],
+ 'photo' => $item['owner-avatar'], 'network' => $item['network']
+ ];
+ $item['owner-id'] = ($item['owner-id'] ?? 0) ?: Contact::getIdForURL($item['owner-link'], 0, null, $default);
+
+ $item['post-reason'] = Item::getPostReason($item);
+
+ return $item;
+ }
+
/**
* Get the gravity for the given item array
*
* @return int gravity
*/
- public function getGravity(array $item): int
+ private function getGravity(array $item): int
{
if (isset($item['gravity'])) {
return intval($item['gravity']);
From 3c51af78a277e865848b86e9b3048edcc9c6dbf7 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 09:35:46 +0000
Subject: [PATCH 023/178] Replace DBA class with DI::dba() in Item Model
---
src/Model/Item.php | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 5fdc57647f..f9ab920bf0 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -769,7 +769,7 @@ class Item
$params = ['order' => ['id' => false]];
$parent = Post::selectFirst($fields, $condition, $params);
- if (!DBA::isResult($parent) && Post::exists(['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => 0])) {
+ if (!DI::dba()->isResult($parent) && Post::exists(['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => 0])) {
$stored = Item::storeForUserByUriId($item['thr-parent-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
if (!$stored && ($item['thr-parent-id'] != $item['parent-uri-id'])) {
$stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
@@ -780,7 +780,7 @@ class Item
}
}
- if (!DBA::isResult($parent)) {
+ if (!DI::dba()->isResult($parent)) {
DI::logger()->notice('item parent was not found - ignoring item', ['uri-id' => $item['uri-id'], 'thr-parent-id' => $item['thr-parent-id'], 'uid' => $item['uid']]);
return [];
}
@@ -802,13 +802,13 @@ class Item
$params = ['order' => ['id' => false]];
$toplevel_parent = Post::selectFirst($fields, $condition, $params);
- if (!DBA::isResult($toplevel_parent) && $item['origin']) {
+ if (!DI::dba()->isResult($toplevel_parent) && $item['origin']) {
$stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
DI::logger()->info('Stored parent item for user', ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid'], 'stored' => $stored]);
$toplevel_parent = Post::selectFirst($fields, $condition, $params);
}
- if (!DBA::isResult($toplevel_parent)) {
+ if (!DI::dba()->isResult($toplevel_parent)) {
DI::logger()->notice('item top level parent was not found - ignoring item', ['parent-uri-id' => $parent['parent-uri-id'], 'uid' => $parent['uid']]);
return [];
}
From 0e054cd4a0820d4a68d7305d2132c4187f4900ad Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 09:50:27 +0000
Subject: [PATCH 024/178] Extract hasRestrictions() into ItemInserter
---
src/Model/Item.php | 33 +++------------------------------
src/Model/ItemInserter.php | 28 ++++++++++++++++++++++++++++
2 files changed, 31 insertions(+), 30 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index f9ab920bf0..556a8b4944 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -757,7 +757,7 @@ class Item
* @return array item array with parent data
* @throws \Exception
*/
- private static function getTopLevelParent(array $item): array
+ private static function getTopLevelParent(array $item, ItemInserter $itemInserter): array
{
$fields = [
'uid', 'uri', 'parent-uri', 'id', 'deleted',
@@ -785,7 +785,7 @@ class Item
return [];
}
- if (self::hasRestrictions($item, $parent['author-id'], $parent['restrictions'])) {
+ if ($itemInserter->hasRestrictions($item, $parent['author-id'], $parent['restrictions'])) {
DI::logger()->notice('Restrictions apply - ignoring item', ['restrictions' => $parent['restrictions'], 'verb' => $parent['verb'], 'uri-id' => $item['uri-id'], 'thr-parent-id' => $item['thr-parent-id'], 'uid' => $item['uid']]);
return [];
}
@@ -916,7 +916,7 @@ class Item
}
if ($item['gravity'] !== self::GRAVITY_PARENT) {
- $toplevel_parent = self::getTopLevelParent($item);
+ $toplevel_parent = self::getTopLevelParent($item, $itemInserter);
if (empty($toplevel_parent)) {
return 0;
}
@@ -1390,33 +1390,6 @@ class Item
return $item;
}
- private static function hasRestrictions(array $item, int $author_id, int $restrictions = null): bool
- {
- if (empty($restrictions) || ($author_id == $item['author-id'])) {
- return false;
- }
-
- // We only have to apply restrictions if the post originates from our server or is federated.
- // Every other time we can trust the remote system.
- if (!in_array($item['network'], Protocol::FEDERATED) && !$item['origin']) {
- return false;
- }
-
- if (($restrictions & self::CANT_REPLY) && ($item['verb'] == Activity::POST)) {
- return true;
- }
-
- if (($restrictions & self::CANT_ANNOUNCE) && ($item['verb'] == Activity::ANNOUNCE)) {
- return true;
- }
-
- if (($restrictions & self::CANT_LIKE) && in_array($item['verb'], [Activity::LIKE, Activity::DISLIKE, Activity::ATTEND, Activity::ATTENDMAYBE, Activity::ATTENDNO])) {
- return true;
- }
-
- return false;
- }
-
private static function reshareChannelPost(int $uri_id, int $reshare_id = 0)
{
if (!DI::config()->get('system', 'allow_relay_channels')) {
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index 77e58ee154..85b33e6dfc 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -9,6 +9,7 @@ namespace Friendica\Model;
use Friendica\App\BaseURL;
use Friendica\Content\Item as ItemContent;
+use Friendica\Core\Protocol;
use Friendica\Protocol\Activity;
use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface;
@@ -147,6 +148,33 @@ final class ItemInserter
return $item;
}
+ public function hasRestrictions(array $item, int $author_id, int $restrictions = null): bool
+ {
+ if (empty($restrictions) || ($author_id == $item['author-id'])) {
+ return false;
+ }
+
+ // We only have to apply restrictions if the post originates from our server or is federated.
+ // Every other time we can trust the remote system.
+ if (!in_array($item['network'], Protocol::FEDERATED) && !$item['origin']) {
+ return false;
+ }
+
+ if (($restrictions & Item::CANT_REPLY) && ($item['verb'] == Activity::POST)) {
+ return true;
+ }
+
+ if (($restrictions & Item::CANT_ANNOUNCE) && ($item['verb'] == Activity::ANNOUNCE)) {
+ return true;
+ }
+
+ if (($restrictions & Item::CANT_LIKE) && in_array($item['verb'], [Activity::LIKE, Activity::DISLIKE, Activity::ATTEND, Activity::ATTENDMAYBE, Activity::ATTENDNO])) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* Get the gravity for the given item array
*
From ddfdf02b34fbb74f70782ebfc3872847865aebd3 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 10:31:47 +0000
Subject: [PATCH 025/178] Fix support for PHP 7.4
---
src/Model/ItemInserter.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index 85b33e6dfc..a4afc7aa9f 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -35,7 +35,7 @@ final class ItemInserter
ItemContent $itemContent,
Activity $activity,
LoggerInterface $logger,
- BaseURL $baseURL,
+ BaseURL $baseURL
) {
$this->itemContent = $itemContent;
$this->activity = $activity;
From 9cd6c025d5d8b853bb758b9ec66a4efa71b45d64 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 10:42:43 +0000
Subject: [PATCH 026/178] Extract getTopLevelParent() into ItemInserter
---
src/Model/Item.php | 71 ++----------------------------------
src/Model/ItemInserter.php | 73 +++++++++++++++++++++++++++++++++++++-
2 files changed, 75 insertions(+), 69 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 556a8b4944..baad75fa9b 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -750,72 +750,6 @@ class Item
return self::getParent($thread_parent['thr-parent-id']);
}
- /**
- * Fetch top-level parent data for the given item array
- *
- * @param array $item
- * @return array item array with parent data
- * @throws \Exception
- */
- private static function getTopLevelParent(array $item, ItemInserter $itemInserter): array
- {
- $fields = [
- 'uid', 'uri', 'parent-uri', 'id', 'deleted',
- 'uri-id', 'parent-uri-id', 'restrictions', 'verb',
- 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
- 'wall', 'private', 'origin', 'author-id'
- ];
- $condition = ['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => $item['uid']];
- $params = ['order' => ['id' => false]];
- $parent = Post::selectFirst($fields, $condition, $params);
-
- if (!DI::dba()->isResult($parent) && Post::exists(['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => 0])) {
- $stored = Item::storeForUserByUriId($item['thr-parent-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
- if (!$stored && ($item['thr-parent-id'] != $item['parent-uri-id'])) {
- $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
- }
- if ($stored) {
- DI::logger()->info('Stored thread parent item for user', ['uri-id' => $item['thr-parent-id'], 'uid' => $item['uid'], 'stored' => $stored]);
- $parent = Post::selectFirst($fields, $condition, $params);
- }
- }
-
- if (!DI::dba()->isResult($parent)) {
- DI::logger()->notice('item parent was not found - ignoring item', ['uri-id' => $item['uri-id'], 'thr-parent-id' => $item['thr-parent-id'], 'uid' => $item['uid']]);
- return [];
- }
-
- if ($itemInserter->hasRestrictions($item, $parent['author-id'], $parent['restrictions'])) {
- DI::logger()->notice('Restrictions apply - ignoring item', ['restrictions' => $parent['restrictions'], 'verb' => $parent['verb'], 'uri-id' => $item['uri-id'], 'thr-parent-id' => $item['thr-parent-id'], 'uid' => $item['uid']]);
- return [];
- }
-
- if ($parent['uri-id'] == $parent['parent-uri-id']) {
- return $parent;
- }
-
- $condition = [
- 'uri-id' => $parent['parent-uri-id'],
- 'parent-uri-id' => $parent['parent-uri-id'],
- 'uid' => $parent['uid']
- ];
- $params = ['order' => ['id' => false]];
- $toplevel_parent = Post::selectFirst($fields, $condition, $params);
-
- if (!DI::dba()->isResult($toplevel_parent) && $item['origin']) {
- $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
- DI::logger()->info('Stored parent item for user', ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid'], 'stored' => $stored]);
- $toplevel_parent = Post::selectFirst($fields, $condition, $params);
- }
-
- if (!DI::dba()->isResult($toplevel_parent)) {
- DI::logger()->notice('item top level parent was not found - ignoring item', ['parent-uri-id' => $parent['parent-uri-id'], 'uid' => $parent['uid']]);
- return [];
- }
-
- return $toplevel_parent;
- }
-
/**
* Inserts item record
*
@@ -830,7 +764,8 @@ class Item
DI::contentItem(),
DI::activity(),
DI::logger(),
- DI::baseUrl()
+ DI::dba(),
+ DI::baseUrl(),
);
$orig_item = $item;
@@ -916,7 +851,7 @@ class Item
}
if ($item['gravity'] !== self::GRAVITY_PARENT) {
- $toplevel_parent = self::getTopLevelParent($item, $itemInserter);
+ $toplevel_parent = $itemInserter->getTopLevelParent($item);
if (empty($toplevel_parent)) {
return 0;
}
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index a4afc7aa9f..612665df15 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -10,6 +10,7 @@ namespace Friendica\Model;
use Friendica\App\BaseURL;
use Friendica\Content\Item as ItemContent;
use Friendica\Core\Protocol;
+use Friendica\Database\Database;
use Friendica\Protocol\Activity;
use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface;
@@ -29,17 +30,21 @@ final class ItemInserter
private LoggerInterface $logger;
+ private Database $database;
+
private string $baseUrl;
public function __construct(
ItemContent $itemContent,
Activity $activity,
LoggerInterface $logger,
+ Database $database,
BaseURL $baseURL
) {
$this->itemContent = $itemContent;
$this->activity = $activity;
$this->logger = $logger;
+ $this->database = $database;
$this->baseUrl = $baseURL->__toString();
}
@@ -148,7 +153,73 @@ final class ItemInserter
return $item;
}
- public function hasRestrictions(array $item, int $author_id, int $restrictions = null): bool
+ /**
+ * Fetch top-level parent data for the given item array
+ *
+ * @param array $item
+ * @return array item array with parent data
+ * @throws \Exception
+ */
+ public function getTopLevelParent(array $item): array
+ {
+ $fields = [
+ 'uid', 'uri', 'parent-uri', 'id', 'deleted',
+ 'uri-id', 'parent-uri-id', 'restrictions', 'verb',
+ 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
+ 'wall', 'private', 'origin', 'author-id'
+ ];
+ $condition = ['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => $item['uid']];
+ $params = ['order' => ['id' => false]];
+ $parent = Post::selectFirst($fields, $condition, $params);
+
+ if (!$this->database->isResult($parent) && Post::exists(['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => 0])) {
+ $stored = Item::storeForUserByUriId($item['thr-parent-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
+ if (!$stored && ($item['thr-parent-id'] != $item['parent-uri-id'])) {
+ $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
+ }
+ if ($stored) {
+ $this->logger->info('Stored thread parent item for user', ['uri-id' => $item['thr-parent-id'], 'uid' => $item['uid'], 'stored' => $stored]);
+ $parent = Post::selectFirst($fields, $condition, $params);
+ }
+ }
+
+ if (!$this->database->isResult($parent)) {
+ $this->logger->notice('item parent was not found - ignoring item', ['uri-id' => $item['uri-id'], 'thr-parent-id' => $item['thr-parent-id'], 'uid' => $item['uid']]);
+ return [];
+ }
+
+ if ($this->hasRestrictions($item, $parent['author-id'], $parent['restrictions'])) {
+ $this->logger->notice('Restrictions apply - ignoring item', ['restrictions' => $parent['restrictions'], 'verb' => $parent['verb'], 'uri-id' => $item['uri-id'], 'thr-parent-id' => $item['thr-parent-id'], 'uid' => $item['uid']]);
+ return [];
+ }
+
+ if ($parent['uri-id'] == $parent['parent-uri-id']) {
+ return $parent;
+ }
+
+ $condition = [
+ 'uri-id' => $parent['parent-uri-id'],
+ 'parent-uri-id' => $parent['parent-uri-id'],
+ 'uid' => $parent['uid']
+ ];
+ $params = ['order' => ['id' => false]];
+ $toplevel_parent = Post::selectFirst($fields, $condition, $params);
+
+ if (!$this->database->isResult($toplevel_parent) && $item['origin']) {
+ $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]);
+ $this->logger->info('Stored parent item for user', ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid'], 'stored' => $stored]);
+ $toplevel_parent = Post::selectFirst($fields, $condition, $params);
+ }
+
+ if (!$this->database->isResult($toplevel_parent)) {
+ $this->logger->notice('item top level parent was not found - ignoring item', ['parent-uri-id' => $parent['parent-uri-id'], 'uid' => $parent['uid']]);
+ return [];
+ }
+
+ return $toplevel_parent;
+ }
+
+ private function hasRestrictions(array $item, int $author_id, int $restrictions = null): bool
{
if (empty($restrictions) || ($author_id == $item['author-id'])) {
return false;
From 764a701610e90b6597b73ba28467ea12189158b9 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 10:50:04 +0000
Subject: [PATCH 027/178] Extract handleToplevelParent() into ItemInserter
---
src/Model/Item.php | 50 +-------------------------------------
src/Model/ItemInserter.php | 48 ++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 49 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index baad75fa9b..18015b700a 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -857,7 +857,7 @@ class Item
}
$parent_id = (int) $toplevel_parent['id'];
- $item = self::handleToplevelParent($item, $toplevel_parent, $defined_permissions);
+ $item = $itemInserter->handleToplevelParent($item, $toplevel_parent, $defined_permissions);
$parent_origin = $toplevel_parent['origin'];
} else {
$parent_id = 0;
@@ -1277,54 +1277,6 @@ class Item
return $post_user_id;
}
- private static function handleToplevelParent(array $item, array $toplevel_parent, bool $defined_permissions): array
- {
- $parent_id = (int) $toplevel_parent['id'];
- $item['parent-uri'] = $toplevel_parent['uri'];
- $item['parent-uri-id'] = $toplevel_parent['uri-id'];
- $item['deleted'] = $toplevel_parent['deleted'];
- $item['wall'] = $toplevel_parent['wall'];
-
- // Reshares have to keep their permissions to allow groups to work
- if (!$defined_permissions && (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE))) {
- // Don't store the permissions on pure AP posts
- $store_permissions = ($item['network'] != Protocol::ACTIVITYPUB) || $item['origin'] || !empty($item['diaspora_signed_text']);
- $item['allow_cid'] = $store_permissions ? $toplevel_parent['allow_cid'] : '';
- $item['allow_gid'] = $store_permissions ? $toplevel_parent['allow_gid'] : '';
- $item['deny_cid'] = $store_permissions ? $toplevel_parent['deny_cid'] : '';
- $item['deny_gid'] = $store_permissions ? $toplevel_parent['deny_gid'] : '';
- }
-
- // Don't federate received participation messages
- if ($item['verb'] != Activity::FOLLOW) {
- $item['wall'] = $toplevel_parent['wall'];
- } else {
- $item['wall'] = false;
- // Participations are technical messages, so they are set to "seen" automatically
- $item['unseen'] = false;
- }
-
- /*
- * If the parent is private, force privacy for the entire conversation
- * This differs from the above settings as it subtly allows comments from
- * email correspondents to be private even if the overall thread is not.
- */
- if (!$defined_permissions && $toplevel_parent['private']) {
- $item['private'] = $toplevel_parent['private'];
- }
-
- // If its a post that originated here then tag the thread as "mention"
- if ($item['origin'] && $item['uid']) {
- DBA::update('post-thread-user', ['mention' => true], ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
- DI::logger()->info('tagged thread as mention', ['parent' => $parent_id, 'parent-uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
- }
-
- // Update the contact relations
- Contact\Relation::store($toplevel_parent['author-id'], $item['author-id'], $item['created']);
-
- return $item;
- }
-
private static function reshareChannelPost(int $uri_id, int $reshare_id = 0)
{
if (!DI::config()->get('system', 'allow_relay_channels')) {
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemInserter.php
index 612665df15..fc042bb04b 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemInserter.php
@@ -219,6 +219,54 @@ final class ItemInserter
return $toplevel_parent;
}
+ public function handleToplevelParent(array $item, array $toplevel_parent, bool $defined_permissions): array
+ {
+ $parent_id = (int) $toplevel_parent['id'];
+ $item['parent-uri'] = $toplevel_parent['uri'];
+ $item['parent-uri-id'] = $toplevel_parent['uri-id'];
+ $item['deleted'] = $toplevel_parent['deleted'];
+ $item['wall'] = $toplevel_parent['wall'];
+
+ // Reshares have to keep their permissions to allow groups to work
+ if (!$defined_permissions && (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE))) {
+ // Don't store the permissions on pure AP posts
+ $store_permissions = ($item['network'] != Protocol::ACTIVITYPUB) || $item['origin'] || !empty($item['diaspora_signed_text']);
+ $item['allow_cid'] = $store_permissions ? $toplevel_parent['allow_cid'] : '';
+ $item['allow_gid'] = $store_permissions ? $toplevel_parent['allow_gid'] : '';
+ $item['deny_cid'] = $store_permissions ? $toplevel_parent['deny_cid'] : '';
+ $item['deny_gid'] = $store_permissions ? $toplevel_parent['deny_gid'] : '';
+ }
+
+ // Don't federate received participation messages
+ if ($item['verb'] != Activity::FOLLOW) {
+ $item['wall'] = $toplevel_parent['wall'];
+ } else {
+ $item['wall'] = false;
+ // Participations are technical messages, so they are set to "seen" automatically
+ $item['unseen'] = false;
+ }
+
+ /*
+ * If the parent is private, force privacy for the entire conversation
+ * This differs from the above settings as it subtly allows comments from
+ * email correspondents to be private even if the overall thread is not.
+ */
+ if (!$defined_permissions && $toplevel_parent['private']) {
+ $item['private'] = $toplevel_parent['private'];
+ }
+
+ // If its a post that originated here then tag the thread as "mention"
+ if ($item['origin'] && $item['uid']) {
+ $this->database->update('post-thread-user', ['mention' => true], ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
+ $this->logger->info('tagged thread as mention', ['parent' => $parent_id, 'parent-uri-id' => $item['parent-uri-id'], 'uid' => $item['uid']]);
+ }
+
+ // Update the contact relations
+ Contact\Relation::store($toplevel_parent['author-id'], $item['author-id'], $item['created']);
+
+ return $item;
+ }
+
private function hasRestrictions(array $item, int $author_id, int $restrictions = null): bool
{
if (empty($restrictions) || ($author_id == $item['author-id'])) {
From 7a2e1e0511893d07c17021971d20545b483aa6a4 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 12:11:18 +0000
Subject: [PATCH 028/178] Rename ItemInserter into ItemHelper
---
src/Model/Item.php | 12 ++++++------
src/Model/{ItemInserter.php => ItemHelper.php} | 4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
rename src/Model/{ItemInserter.php => ItemHelper.php} (99%)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 18015b700a..b0ec029563 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -760,7 +760,7 @@ class Item
*/
public static function insert(array $item, int $notify = 0, bool $post_local = true): int
{
- $itemInserter = new ItemInserter(
+ $itemHelper = new ItemHelper(
DI::contentItem(),
DI::activity(),
DI::logger(),
@@ -776,7 +776,7 @@ class Item
// If it is a posting where users should get notifications, then define it as wall posting
if ($notify) {
- $item = $itemInserter->prepareOriginPost($item);
+ $item = $itemHelper->prepareOriginPost($item);
if (is_int($notify) && in_array($notify, Worker::PRIORITIES)) {
$priority = $notify;
@@ -789,7 +789,7 @@ class Item
$item['network'] = trim(($item['network'] ?? '') ?: Protocol::PHANTOM);
}
- $item = $itemInserter->prepareItemData($item, (bool) $notify);
+ $item = $itemHelper->prepareItemData($item, (bool) $notify);
// Store conversation data
$source = $item['source'] ?? '';
@@ -830,7 +830,7 @@ class Item
}
}
- $item = $itemInserter->validateItemData($item);
+ $item = $itemHelper->validateItemData($item);
// Ensure that there is an avatar cache
Contact::checkAvatarCache($item['author-id']);
@@ -851,13 +851,13 @@ class Item
}
if ($item['gravity'] !== self::GRAVITY_PARENT) {
- $toplevel_parent = $itemInserter->getTopLevelParent($item);
+ $toplevel_parent = $itemHelper->getTopLevelParent($item);
if (empty($toplevel_parent)) {
return 0;
}
$parent_id = (int) $toplevel_parent['id'];
- $item = $itemInserter->handleToplevelParent($item, $toplevel_parent, $defined_permissions);
+ $item = $itemHelper->handleToplevelParent($item, $toplevel_parent, $defined_permissions);
$parent_origin = $toplevel_parent['origin'];
} else {
$parent_id = 0;
diff --git a/src/Model/ItemInserter.php b/src/Model/ItemHelper.php
similarity index 99%
rename from src/Model/ItemInserter.php
rename to src/Model/ItemHelper.php
index fc042bb04b..ab17b845a9 100644
--- a/src/Model/ItemInserter.php
+++ b/src/Model/ItemHelper.php
@@ -16,13 +16,13 @@ use Friendica\Util\DateTimeFormat;
use Psr\Log\LoggerInterface;
/**
- * A helper class for inserting an Item Model
+ * A helper class for handling an Item Model
*
* @internal only for use in Friendica\Content\Item class
*
* @see Item::insert()
*/
-final class ItemInserter
+final class ItemHelper
{
private ItemContent $itemContent;
From 118e59ac5cbbbad4e457a03171ec62fd16f393ce Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 13:17:04 +0000
Subject: [PATCH 029/178] Extract isDuplicate() into ItemHelper
---
src/Model/Item.php | 46 +-------------------------------------
src/Model/ItemHelper.php | 48 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 45 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index b0ec029563..ce62e86c4f 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -580,51 +580,7 @@ class Item
}
}
- /**
- * Check if the item array is a duplicate
- *
- * @param array $item Item record
- * @return boolean is it a duplicate?
- */
- private static function isDuplicate(array $item): bool
- {
- // Checking if there is already an item with the same guid
- $condition = ['guid' => $item['guid'], 'network' => $item['network'], 'uid' => $item['uid']];
- if (Post::exists($condition)) {
- DI::logger()->notice('Found already existing item', $condition);
- return true;
- }
- $condition = [
- 'uri-id' => $item['uri-id'], 'uid' => $item['uid'],
- 'network' => [$item['network'], Protocol::DFRN]
- ];
- if (Post::exists($condition)) {
- DI::logger()->notice('duplicated item with the same uri found.', $condition);
- return true;
- }
-
- // On Friendica and Diaspora the GUID is unique
- if (in_array($item['network'], [Protocol::DFRN, Protocol::DIASPORA])) {
- $condition = ['guid' => $item['guid'], 'uid' => $item['uid']];
- if (Post::exists($condition)) {
- DI::logger()->notice('duplicated item with the same guid found.', $condition);
- return true;
- }
- }
-
- /*
- * Check for already added items.
- * There is a timing issue here that sometimes creates double postings.
- * An unique index would help - but the limitations of MySQL (maximum size of index values) prevent this.
- */
- if (($item['uid'] == 0) && Post::exists(['uri-id' => $item['uri-id'], 'uid' => 0])) {
- DI::logger()->notice('Global item already stored.', ['uri-id' => $item['uri-id'], 'network' => $item['network']]);
- return true;
- }
-
- return false;
- }
/**
* Check if the item array is valid
@@ -809,7 +765,7 @@ class Item
// Additional duplicate checks
/// @todo Check why the first duplication check returns the item number and the second a 0
- if (self::isDuplicate($item)) {
+ if ($itemHelper->isDuplicate($item)) {
return 0;
}
diff --git a/src/Model/ItemHelper.php b/src/Model/ItemHelper.php
index ab17b845a9..000208d913 100644
--- a/src/Model/ItemHelper.php
+++ b/src/Model/ItemHelper.php
@@ -77,6 +77,54 @@ final class ItemHelper
return $item;
}
+ /**
+ * Check if the item array is a duplicate
+ *
+ * @private
+ *
+ * @param array $item Item record
+ * @return boolean is it a duplicate?
+ */
+ public function isDuplicate(array $item): bool
+ {
+ // Checking if there is already an item with the same guid
+ $condition = ['guid' => $item['guid'], 'network' => $item['network'], 'uid' => $item['uid']];
+ if (Post::exists($condition)) {
+ $this->logger->notice('Found already existing item', $condition);
+ return true;
+ }
+
+ $condition = [
+ 'uri-id' => $item['uri-id'], 'uid' => $item['uid'],
+ 'network' => [$item['network'], Protocol::DFRN]
+ ];
+ if (Post::exists($condition)) {
+ $this->logger->notice('duplicated item with the same uri found.', $condition);
+ return true;
+ }
+
+ // On Friendica and Diaspora the GUID is unique
+ if (in_array($item['network'], [Protocol::DFRN, Protocol::DIASPORA])) {
+ $condition = ['guid' => $item['guid'], 'uid' => $item['uid']];
+ if (Post::exists($condition)) {
+ $this->logger->notice('duplicated item with the same guid found.', $condition);
+ return true;
+ }
+ }
+
+ /*
+ * Check for already added items.
+ * There is a timing issue here that sometimes creates double postings.
+ * An unique index would help - but the limitations of MySQL (maximum size of index values) prevent this.
+ */
+ if (($item['uid'] == 0) && Post::exists(['uri-id' => $item['uri-id'], 'uid' => 0])) {
+ $this->logger->notice('Global item already stored.', ['uri-id' => $item['uri-id'], 'network' => $item['network']]);
+ return true;
+ }
+
+ return false;
+ }
+
public function validateItemData(array $item): array
{
$item['wall'] = intval($item['wall'] ?? 0);
From db949270f52dd5f254a105fc91d6b5bae5cdfa53 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 13:26:58 +0000
Subject: [PATCH 030/178] Extract getDuplicateID() into ItemHelper
---
src/Model/Item.php | 38 +-------------------------------------
src/Model/ItemHelper.php | 40 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 40 insertions(+), 38 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index ce62e86c4f..d78daf605d 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -650,42 +650,6 @@ class Item
return true;
}
- /**
- * Return the id of the given item array if it has been stored before
- *
- * @param array $item Item record
- * @return integer Item id or zero on error
- */
- private static function getDuplicateID(array $item): int
- {
- if (empty($item['network']) || in_array($item['network'], Protocol::FEDERATED)) {
- $condition = [
- '`uri-id` = ? AND `uid` = ? AND `network` IN (?, ?, ?)',
- $item['uri-id'],
- $item['uid'],
- Protocol::ACTIVITYPUB,
- Protocol::DIASPORA,
- Protocol::DFRN
- ];
- $existing = Post::selectFirst(['id', 'network'], $condition);
- if (DBA::isResult($existing)) {
- // We only log the entries with a different user id than 0. Otherwise we would have too many false positives
- if ($item['uid'] != 0) {
- DI::logger()->notice('Item already existed for user', [
- 'uri-id' => $item['uri-id'],
- 'uid' => $item['uid'],
- 'network' => $item['network'],
- 'existing_id' => $existing['id'],
- 'existing_network' => $existing['network']
- ]);
- }
-
- return $existing['id'];
- }
- }
- return 0;
- }
-
/**
* Fetch the uri-id of the parent for the given uri-id
*
@@ -758,7 +722,7 @@ class Item
* We have to check several networks since Friendica posts could be repeated
* via Diaspora.
*/
- $duplicate = self::getDuplicateID($item);
+ $duplicate = $itemHelper->getDuplicateID($item);
if ($duplicate) {
return $duplicate;
}
diff --git a/src/Model/ItemHelper.php b/src/Model/ItemHelper.php
index 000208d913..9b585fd544 100644
--- a/src/Model/ItemHelper.php
+++ b/src/Model/ItemHelper.php
@@ -18,7 +18,7 @@ use Psr\Log\LoggerInterface;
/**
* A helper class for handling an Item Model
*
- * @internal only for use in Friendica\Content\Item class
+ * @internal ONLY for use in Friendica\Content\Item class
*
* @see Item::insert()
*/
@@ -77,6 +77,44 @@ final class ItemHelper
return $item;
}
+ /**
+ * Return the id of the given item array if it has been stored before
+ *
+ * @param array $item Item record
+ * @return integer Item id or zero on error
+ */
+ public function getDuplicateID(array $item): int
+ {
+ if (empty($item['network']) || in_array($item['network'], Protocol::FEDERATED)) {
+ $condition = [
+ '`uri-id` = ? AND `uid` = ? AND `network` IN (?, ?, ?)',
+ $item['uri-id'],
+ $item['uid'],
+ Protocol::ACTIVITYPUB,
+ Protocol::DIASPORA,
+ Protocol::DFRN
+ ];
+
+ $existing = Post::selectFirst(['id', 'network'], $condition);
+
+ if ($this->database->isResult($existing)) {
+ // We only log the entries with a different user id than 0. Otherwise we would have too many false positives
+ if ($item['uid'] != 0) {
+ $this->logger->notice('Item already existed for user', [
+ 'uri-id' => $item['uri-id'],
+ 'uid' => $item['uid'],
+ 'network' => $item['network'],
+ 'existing_id' => $existing['id'],
+ 'existing_network' => $existing['network']
+ ]);
+ }
+
+ return $existing['id'];
+ }
+ }
+ return 0;
+ }
+
/**
* Check if the item array is a duplicate
*
From befb4796f914664f76a714519b70b84fc8fd01a3 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 13:36:57 +0000
Subject: [PATCH 031/178] Extract Transmitter::filterReceiverData() as own
method
---
src/Protocol/ActivityPub/Transmitter.php | 43 ++++++++++++++----------
1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php
index a4446e5978..82fb32174a 100644
--- a/src/Protocol/ActivityPub/Transmitter.php
+++ b/src/Protocol/ActivityPub/Transmitter.php
@@ -805,25 +805,45 @@ class Transmitter
}
}
+ $data = self::filterReceiverData($data, $item['author-link']);
+
+ $receivers = ['to' => array_values($data['to']), 'cc' => array_values($data['cc']), 'bto' => array_values($data['bto']), 'bcc' => array_values($data['bcc']), 'audience' => array_values($data['audience'])];
+
+ if (!$blindcopy) {
+ unset($receivers['bto']);
+ unset($receivers['bcc']);
+ }
+
+ if (!$blindcopy && count($receivers['audience']) == 1) {
+ $receivers['audience'] = $receivers['audience'][0];
+ } elseif (!$receivers['audience']) {
+ unset($receivers['audience']);
+ }
+
+ return $receivers;
+ }
+
+ private static function filterReceiverData(array $data, string $author_link): array
+ {
$data['to'] = array_unique($data['to']);
$data['cc'] = array_unique($data['cc']);
$data['bto'] = array_unique($data['bto']);
$data['bcc'] = array_unique($data['bcc']);
$data['audience'] = array_unique($data['audience']);
- if (($key = array_search($item['author-link'], $data['to'])) !== false) {
+ if (($key = array_search($author_link, $data['to'])) !== false) {
unset($data['to'][$key]);
}
- if (($key = array_search($item['author-link'], $data['cc'])) !== false) {
+ if (($key = array_search($author_link, $data['cc'])) !== false) {
unset($data['cc'][$key]);
}
- if (($key = array_search($item['author-link'], $data['bto'])) !== false) {
+ if (($key = array_search($author_link, $data['bto'])) !== false) {
unset($data['bto'][$key]);
}
- if (($key = array_search($item['author-link'], $data['bcc'])) !== false) {
+ if (($key = array_search($author_link, $data['bcc'])) !== false) {
unset($data['bcc'][$key]);
}
@@ -857,20 +877,7 @@ class Transmitter
}
}
- $receivers = ['to' => array_values($data['to']), 'cc' => array_values($data['cc']), 'bto' => array_values($data['bto']), 'bcc' => array_values($data['bcc']), 'audience' => array_values($data['audience'])];
-
- if (!$blindcopy) {
- unset($receivers['bto']);
- unset($receivers['bcc']);
- }
-
- if (!$blindcopy && count($receivers['audience']) == 1) {
- $receivers['audience'] = $receivers['audience'][0];
- } elseif (!$receivers['audience']) {
- unset($receivers['audience']);
- }
-
- return $receivers;
+ return $data;
}
/**
From f75b67de2f79611cb46f36334e2d281bc9b45d36 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 13:56:35 +0000
Subject: [PATCH 032/178] Extract method Fee::getTitleFromItemOrEntry()
---
src/Protocol/Feed.php | 44 ++++++++++++++++++++++++++-----------------
1 file changed, 27 insertions(+), 17 deletions(-)
diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php
index fa1ea3b302..11cac371d5 100644
--- a/src/Protocol/Feed.php
+++ b/src/Protocol/Feed.php
@@ -9,6 +9,7 @@ namespace Friendica\Protocol;
use DOMDocument;
use DOMElement;
+use DOMNode;
use DOMXPath;
use Friendica\App;
use Friendica\Contact\LocalRelationship\Entity\LocalRelationship;
@@ -386,23 +387,7 @@ class Feed
}
}
- if (empty($item['title'])) {
- $item['title'] = XML::getFirstNodeValue($xpath, $atomns . ':title/text()', $entry);
- }
-
- if (empty($item['title'])) {
- $item['title'] = XML::getFirstNodeValue($xpath, 'title/text()', $entry);
- }
-
- if (empty($item['title'])) {
- $item['title'] = XML::getFirstNodeValue($xpath, 'rss:title/text()', $entry);
- }
-
- if (empty($item['title'])) {
- $item['title'] = XML::getFirstNodeValue($xpath, 'itunes:title/text()', $entry);
- }
-
- $item['title'] = trim(html_entity_decode($item['title'], ENT_QUOTES, 'UTF-8'));
+ $item['title'] = static::getTitleFromItemOrEntry($item, $xpath, $atomns, $entry);
$published = XML::getFirstNodeValue($xpath, $atomns . ':published/text()', $entry);
@@ -747,6 +732,31 @@ class Feed
return ['header' => $author, 'items' => $items];
}
+ private static function getTitleFromItemOrEntry(array $item, DOMXPath $xpath, string $atomns, ?DOMNode $entry): string
+ {
+ $title = (string) $item['title'];
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, $atomns . ':title/text()', $entry);
+ }
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, 'title/text()', $entry);
+ }
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, 'rss:title/text()', $entry);
+ }
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, 'itunes:title/text()', $entry);
+ }
+
+ $title = trim(html_entity_decode($title, ENT_QUOTES, 'UTF-8'));
+
+ return $title;
+ }
+
/**
* Return the hostname out of a variety of provided URL
*
From 40f467fb72b4bf11c01867b5557b426f3d2e1c93 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:13:32 +0000
Subject: [PATCH 033/178] Extract Feed::importOlderEntries() into own method
---
src/Protocol/Feed.php | 148 ++++++++++++++++++++++--------------------
1 file changed, 78 insertions(+), 70 deletions(-)
diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php
index 11cac371d5..2f9be305f1 100644
--- a/src/Protocol/Feed.php
+++ b/src/Protocol/Feed.php
@@ -10,6 +10,7 @@ namespace Friendica\Protocol;
use DOMDocument;
use DOMElement;
use DOMNode;
+use DOMNodeList;
use DOMXPath;
use Friendica\App;
use Friendica\Contact\LocalRelationship\Entity\LocalRelationship;
@@ -68,12 +69,12 @@ class Feed
return [];
}
+ $basepath = '';
+
if (!empty($contact['poll'])) {
- $basepath = $contact['poll'];
+ $basepath = (string) $contact['poll'];
} elseif (!empty($contact['url'])) {
- $basepath = $contact['url'];
- } else {
- $basepath = '';
+ $basepath = (string) $contact['url'];
}
$doc = new DOMDocument();
@@ -288,6 +289,77 @@ class Feed
$total_items = $max_items;
}
+ $postings = self::importOlderEntries($entries, $total_items, $header, $author, $contact, $importer, $xpath, $atomns, $basepath, $dryRun);
+
+ if (!empty($postings)) {
+ $min_posting = DI::config()->get('system', 'minimum_posting_interval', 0);
+ $total = count($postings);
+ if ($total > 1) {
+ // Posts shouldn't be delayed more than a day
+ $interval = min(1440, self::getPollInterval($contact));
+ $delay = max(round(($interval * 60) / $total), 60 * $min_posting);
+ DI::logger()->info('Got posting delay', ['delay' => $delay, 'interval' => $interval, 'items' => $total, 'cid' => $contact['id'], 'url' => $contact['url']]);
+ } else {
+ $delay = 0;
+ }
+
+ $post_delay = 0;
+
+ foreach ($postings as $posting) {
+ if ($delay > 0) {
+ $publish_time = time() + $post_delay;
+ $post_delay += $delay;
+ } else {
+ $publish_time = time();
+ }
+
+ $last_publish = DI::pConfig()->get($posting['item']['uid'], 'system', 'last_publish', 0, true);
+ $next_publish = max($last_publish + (60 * $min_posting), time());
+ if ($publish_time < $next_publish) {
+ $publish_time = $next_publish;
+ }
+ $publish_at = date(DateTimeFormat::MYSQL, $publish_time);
+
+ if (Post\Delayed::add($posting['item']['uri'], $posting['item'], $posting['notify'], Post\Delayed::PREPARED, $publish_at, $posting['taglist'], $posting['attachments'])) {
+ DI::pConfig()->set($posting['item']['uid'], 'system', 'last_publish', $publish_time);
+ }
+ }
+ }
+
+ if (!$dryRun && DI::config()->get('system', 'adjust_poll_frequency')) {
+ self::adjustPollFrequency($contact, $creation_dates);
+ }
+
+ return ['header' => $author, 'items' => $items];
+ }
+
+ private static function getTitleFromItemOrEntry(array $item, DOMXPath $xpath, string $atomns, ?DOMNode $entry): string
+ {
+ $title = (string) $item['title'];
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, $atomns . ':title/text()', $entry);
+ }
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, 'title/text()', $entry);
+ }
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, 'rss:title/text()', $entry);
+ }
+
+ if (empty($title)) {
+ $title = XML::getFirstNodeValue($xpath, 'itunes:title/text()', $entry);
+ }
+
+ $title = trim(html_entity_decode($title, ENT_QUOTES, 'UTF-8'));
+
+ return $title;
+ }
+
+ private static function importOlderEntries(DOMNodeList $entries, int $total_items, array $header, array $author, array $contact, array $importer, DOMXPath $xpath, string $atomns, string $basepath, bool $dryRun): array
+ {
$postings = [];
// Importing older entries first
@@ -387,7 +459,7 @@ class Feed
}
}
- $item['title'] = static::getTitleFromItemOrEntry($item, $xpath, $atomns, $entry);
+ $item['title'] = self::getTitleFromItemOrEntry($item, $xpath, $atomns, $entry);
$published = XML::getFirstNodeValue($xpath, $atomns . ':published/text()', $entry);
@@ -690,71 +762,7 @@ class Feed
}
}
- if (!empty($postings)) {
- $min_posting = DI::config()->get('system', 'minimum_posting_interval', 0);
- $total = count($postings);
- if ($total > 1) {
- // Posts shouldn't be delayed more than a day
- $interval = min(1440, self::getPollInterval($contact));
- $delay = max(round(($interval * 60) / $total), 60 * $min_posting);
- DI::logger()->info('Got posting delay', ['delay' => $delay, 'interval' => $interval, 'items' => $total, 'cid' => $contact['id'], 'url' => $contact['url']]);
- } else {
- $delay = 0;
- }
-
- $post_delay = 0;
-
- foreach ($postings as $posting) {
- if ($delay > 0) {
- $publish_time = time() + $post_delay;
- $post_delay += $delay;
- } else {
- $publish_time = time();
- }
-
- $last_publish = DI::pConfig()->get($posting['item']['uid'], 'system', 'last_publish', 0, true);
- $next_publish = max($last_publish + (60 * $min_posting), time());
- if ($publish_time < $next_publish) {
- $publish_time = $next_publish;
- }
- $publish_at = date(DateTimeFormat::MYSQL, $publish_time);
-
- if (Post\Delayed::add($posting['item']['uri'], $posting['item'], $posting['notify'], Post\Delayed::PREPARED, $publish_at, $posting['taglist'], $posting['attachments'])) {
- DI::pConfig()->set($posting['item']['uid'], 'system', 'last_publish', $publish_time);
- }
- }
- }
-
- if (!$dryRun && DI::config()->get('system', 'adjust_poll_frequency')) {
- self::adjustPollFrequency($contact, $creation_dates);
- }
-
- return ['header' => $author, 'items' => $items];
- }
-
- private static function getTitleFromItemOrEntry(array $item, DOMXPath $xpath, string $atomns, ?DOMNode $entry): string
- {
- $title = (string) $item['title'];
-
- if (empty($title)) {
- $title = XML::getFirstNodeValue($xpath, $atomns . ':title/text()', $entry);
- }
-
- if (empty($title)) {
- $title = XML::getFirstNodeValue($xpath, 'title/text()', $entry);
- }
-
- if (empty($title)) {
- $title = XML::getFirstNodeValue($xpath, 'rss:title/text()', $entry);
- }
-
- if (empty($title)) {
- $title = XML::getFirstNodeValue($xpath, 'itunes:title/text()', $entry);
- }
-
- $title = trim(html_entity_decode($title, ENT_QUOTES, 'UTF-8'));
-
- return $title;
+ return $postings;
}
/**
From c64d80fef938ebfb1ded829c3552969dffee319c Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:16:56 +0000
Subject: [PATCH 034/178] Increate ExcessiveClassComplexity rule to 800
---
.phpmd-ruleset.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.phpmd-ruleset.xml b/.phpmd-ruleset.xml
index 1f295abbe2..3067bea712 100644
--- a/.phpmd-ruleset.xml
+++ b/.phpmd-ruleset.xml
@@ -13,7 +13,7 @@
3
-
+
From 0b36d4c9d6eb2bb4ff3c7172bd6973b3a5c89eee Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:18:23 +0000
Subject: [PATCH 035/178] Fix code style
---
src/Model/Item.php | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/Model/Item.php b/src/Model/Item.php
index d78daf605d..ed54098f59 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -580,8 +580,6 @@ class Item
}
}
-
-
/**
* Check if the item array is valid
*
From 9c7577c5c25c87231df344ca72ede4eb100aea0a Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:28:10 +0000
Subject: [PATCH 036/178] Recreate messages.po
---
view/lang/C/messages.po | 1861 +++++++++++++++++++--------------------
1 file changed, 929 insertions(+), 932 deletions(-)
diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po
index 971063d596..086ee806db 100644
--- a/view/lang/C/messages.po
+++ b/view/lang/C/messages.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2025.02-dev\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-01-15 07:37+0000\n"
+"POT-Creation-Date: 2025-01-23 14:27+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,35 +18,35 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
-#: mod/item.php:88 mod/item.php:91 mod/item.php:158 mod/item.php:161
+#: mod/item.php:87 mod/item.php:90 mod/item.php:157 mod/item.php:160
msgid "Unable to locate original post."
msgstr ""
-#: mod/item.php:126
+#: mod/item.php:125
msgid "Post updated."
msgstr ""
-#: mod/item.php:191 mod/item.php:195
+#: mod/item.php:190 mod/item.php:194
msgid "Item wasn't stored."
msgstr ""
-#: mod/item.php:205
+#: mod/item.php:204
msgid "Item couldn't be fetched."
msgstr ""
-#: mod/item.php:249 mod/item.php:253
+#: mod/item.php:248 mod/item.php:252
msgid "Empty post discarded."
msgstr ""
-#: mod/item.php:424 src/Module/Admin/Themes/Details.php:31
+#: mod/item.php:423 src/Module/Admin/Themes/Details.php:31
#: src/Module/Admin/Themes/Index.php:51 src/Module/Debug/ItemBody.php:34
#: src/Module/Debug/ItemBody.php:42 src/Module/Item/Feed.php:66
msgid "Item not found."
msgstr ""
-#: mod/item.php:448 mod/message.php:54 mod/message.php:100 mod/notes.php:34
-#: mod/photos.php:133 mod/photos.php:625 src/Model/Event.php:508
-#: src/Module/Attach.php:41 src/Module/BaseApi.php:91
+#: mod/item.php:447 mod/message.php:54 mod/message.php:100 mod/notes.php:34
+#: mod/photos.php:132 mod/photos.php:624 src/Model/Event.php:506
+#: src/Module/Attach.php:40 src/Module/BaseApi.php:90
#: src/Module/BaseNotifications.php:83 src/Module/BaseSettings.php:38
#: src/Module/Calendar/Event/API.php:75 src/Module/Calendar/Event/Form.php:70
#: src/Module/Calendar/Export.php:68 src/Module/Calendar/Show.php:71
@@ -62,9 +62,9 @@ msgstr ""
#: src/Module/OStatus/Subscribe.php:54 src/Module/Post/Edit.php:67
#: src/Module/Profile/Common.php:63 src/Module/Profile/Contacts.php:66
#: src/Module/Profile/Photos.php:81 src/Module/Profile/Schedule.php:25
-#: src/Module/Profile/Schedule.php:42 src/Module/Register.php:71
-#: src/Module/Register.php:84 src/Module/Register.php:200
-#: src/Module/Register.php:239 src/Module/Search/Directory.php:23
+#: src/Module/Profile/Schedule.php:42 src/Module/Register.php:70
+#: src/Module/Register.php:83 src/Module/Register.php:199
+#: src/Module/Register.php:238 src/Module/Search/Directory.php:23
#: src/Module/Settings/Account.php:34 src/Module/Settings/Account.php:337
#: src/Module/Settings/Channels.php:52 src/Module/Settings/Channels.php:127
#: src/Module/Settings/ContactImport.php:49
@@ -236,7 +236,7 @@ msgstr ""
msgid "Discard"
msgstr ""
-#: mod/message.php:122 src/Content/Nav.php:304 view/theme/frio/theme.php:232
+#: mod/message.php:122 src/Content/Nav.php:304 view/theme/frio/theme.php:230
msgid "Messages"
msgstr ""
@@ -282,16 +282,16 @@ msgstr ""
msgid "Insert web link"
msgstr ""
-#: mod/message.php:188 mod/message.php:344 mod/photos.php:1253
+#: mod/message.php:188 mod/message.php:344 mod/photos.php:1252
#: src/Content/Conversation.php:389 src/Content/Conversation.php:1565
#: src/Module/Item/Compose.php:202 src/Module/Post/Edit.php:136
-#: src/Object/Post.php:605
+#: src/Object/Post.php:604
msgid "Please wait"
msgstr ""
-#: mod/message.php:189 mod/message.php:343 mod/photos.php:656
-#: mod/photos.php:776 mod/photos.php:1053 mod/photos.php:1094
-#: mod/photos.php:1150 mod/photos.php:1230
+#: mod/message.php:189 mod/message.php:343 mod/photos.php:655
+#: mod/photos.php:775 mod/photos.php:1052 mod/photos.php:1093
+#: mod/photos.php:1149 mod/photos.php:1229
#: src/Module/Calendar/Event/Form.php:236 src/Module/Contact/Advanced.php:118
#: src/Module/Contact/Profile.php:376
#: src/Module/Debug/ActivityPubConversion.php:128
@@ -307,7 +307,7 @@ msgstr ""
#: src/Module/Moderation/Report/Create.php:249
#: src/Module/Profile/Profile.php:265 src/Module/Settings/Profile/Index.php:248
#: src/Module/Settings/Server/Action.php:65 src/Module/User/Delegation.php:177
-#: src/Object/Post.php:1146 view/theme/duepuntozero/config.php:73
+#: src/Object/Post.php:1145 view/theme/duepuntozero/config.php:73
#: view/theme/frio/config.php:155 view/theme/quattro/config.php:75
#: view/theme/vier/config.php:123
msgid "Submit"
@@ -377,112 +377,112 @@ msgstr ""
msgid "Save"
msgstr ""
-#: mod/photos.php:52 mod/photos.php:115 mod/photos.php:535
-#: src/Model/Event.php:500 src/Model/Profile.php:212
+#: mod/photos.php:51 mod/photos.php:114 mod/photos.php:534
+#: src/Model/Event.php:498 src/Model/Profile.php:211
#: src/Module/Calendar/Export.php:60 src/Module/Calendar/Show.php:63
#: src/Module/Feed.php:52 src/Module/HCard.php:37
#: src/Module/Profile/Common.php:50 src/Module/Profile/Common.php:59
#: src/Module/Profile/Contacts.php:52 src/Module/Profile/Contacts.php:60
#: src/Module/Profile/Conversations.php:81 src/Module/Profile/Media.php:58
#: src/Module/Profile/Photos.php:72 src/Module/Profile/RemoteFollow.php:57
-#: src/Module/Register.php:261
+#: src/Module/Register.php:260
msgid "User not found."
msgstr ""
-#: mod/photos.php:89 src/Module/BaseProfile.php:53
+#: mod/photos.php:88 src/Module/BaseProfile.php:53
#: src/Module/Profile/Photos.php:372
msgid "Photo Albums"
msgstr ""
-#: mod/photos.php:90 src/Module/Profile/Photos.php:373
+#: mod/photos.php:89 src/Module/Profile/Photos.php:373
#: src/Module/Profile/Photos.php:393
msgid "Recent Photos"
msgstr ""
-#: mod/photos.php:92 mod/photos.php:824 src/Module/Profile/Photos.php:375
+#: mod/photos.php:91 mod/photos.php:823 src/Module/Profile/Photos.php:375
#: src/Module/Profile/Photos.php:395
msgid "Upload New Photos"
msgstr ""
-#: mod/photos.php:104 src/Module/BaseSettings.php:60
+#: mod/photos.php:103 src/Module/BaseSettings.php:60
#: src/Module/Profile/Photos.php:356
msgid "everybody"
msgstr ""
-#: mod/photos.php:140
+#: mod/photos.php:139
msgid "Contact information unavailable"
msgstr ""
-#: mod/photos.php:169
+#: mod/photos.php:168
msgid "Album not found."
msgstr ""
-#: mod/photos.php:225
+#: mod/photos.php:224
msgid "Album successfully deleted"
msgstr ""
-#: mod/photos.php:227
+#: mod/photos.php:226
msgid "Album was empty."
msgstr ""
-#: mod/photos.php:258
+#: mod/photos.php:257
msgid "Failed to delete the photo."
msgstr ""
-#: mod/photos.php:502
+#: mod/photos.php:501
msgid "a photo"
msgstr ""
-#: mod/photos.php:502
+#: mod/photos.php:501
#, php-format
msgid "%1$s was tagged in %2$s by %3$s"
msgstr ""
-#: mod/photos.php:539 src/Module/Conversation/Community.php:148
+#: mod/photos.php:538 src/Module/Conversation/Community.php:148
#: src/Module/Directory.php:34 src/Module/Profile/Photos.php:290
-#: src/Module/Search/Index.php:51
+#: src/Module/Search/Index.php:50
msgid "Public access denied."
msgstr ""
-#: mod/photos.php:544
+#: mod/photos.php:543
msgid "No photos selected"
msgstr ""
-#: mod/photos.php:672
+#: mod/photos.php:671
#, php-format
msgid "The maximum accepted image size is %s"
msgstr ""
-#: mod/photos.php:679
+#: mod/photos.php:678
msgid "Upload Photos"
msgstr ""
-#: mod/photos.php:683 mod/photos.php:772
+#: mod/photos.php:682 mod/photos.php:771
msgid "New album name: "
msgstr ""
-#: mod/photos.php:684
+#: mod/photos.php:683
msgid "or select existing album:"
msgstr ""
-#: mod/photos.php:685
+#: mod/photos.php:684
msgid "Do not show a status post for this upload"
msgstr ""
-#: mod/photos.php:688 mod/photos.php:1049 src/Content/Conversation.php:391
+#: mod/photos.php:687 mod/photos.php:1048 src/Content/Conversation.php:391
#: src/Module/Calendar/Event/Form.php:239 src/Module/Post/Edit.php:174
msgid "Permissions"
msgstr ""
-#: mod/photos.php:753
+#: mod/photos.php:752
msgid "Do you really want to delete this photo album and all its photos?"
msgstr ""
-#: mod/photos.php:754 mod/photos.php:777
+#: mod/photos.php:753 mod/photos.php:776
msgid "Delete Album"
msgstr ""
-#: mod/photos.php:755 mod/photos.php:855 src/Content/Conversation.php:406
+#: mod/photos.php:754 mod/photos.php:854 src/Content/Conversation.php:406
#: src/Module/Contact/Follow.php:158 src/Module/Contact/Revoke.php:92
#: src/Module/Contact/Unfollow.php:112
#: src/Module/Media/Attachment/Browser.php:64
@@ -492,161 +492,161 @@ msgstr ""
msgid "Cancel"
msgstr ""
-#: mod/photos.php:781
+#: mod/photos.php:780
msgid "Edit Album"
msgstr ""
-#: mod/photos.php:782
+#: mod/photos.php:781
msgid "Drop Album"
msgstr ""
-#: mod/photos.php:786
+#: mod/photos.php:785
msgid "Show Newest First"
msgstr ""
-#: mod/photos.php:788
+#: mod/photos.php:787
msgid "Show Oldest First"
msgstr ""
-#: mod/photos.php:809 src/Module/Profile/Photos.php:343
+#: mod/photos.php:808 src/Module/Profile/Photos.php:343
msgid "View Photo"
msgstr ""
-#: mod/photos.php:841
+#: mod/photos.php:840
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: mod/photos.php:843
+#: mod/photos.php:842
msgid "Photo not available"
msgstr ""
-#: mod/photos.php:853
+#: mod/photos.php:852
msgid "Do you really want to delete this photo?"
msgstr ""
-#: mod/photos.php:854 mod/photos.php:1054
+#: mod/photos.php:853 mod/photos.php:1053
msgid "Delete Photo"
msgstr ""
-#: mod/photos.php:952
+#: mod/photos.php:951
msgid "View photo"
msgstr ""
-#: mod/photos.php:954
+#: mod/photos.php:953
msgid "Edit photo"
msgstr ""
-#: mod/photos.php:955
+#: mod/photos.php:954
msgid "Delete photo"
msgstr ""
-#: mod/photos.php:956
+#: mod/photos.php:955
msgid "Use as profile photo"
msgstr ""
-#: mod/photos.php:963
+#: mod/photos.php:962
msgid "Private Photo"
msgstr ""
-#: mod/photos.php:969
+#: mod/photos.php:968
msgid "View Full Size"
msgstr ""
-#: mod/photos.php:1022
+#: mod/photos.php:1021
msgid "Tags: "
msgstr ""
-#: mod/photos.php:1025
+#: mod/photos.php:1024
msgid "[Select tags to remove]"
msgstr ""
-#: mod/photos.php:1040
+#: mod/photos.php:1039
msgid "New album name"
msgstr ""
-#: mod/photos.php:1041
+#: mod/photos.php:1040
msgid "Caption"
msgstr ""
-#: mod/photos.php:1042
+#: mod/photos.php:1041
msgid "Add a Tag"
msgstr ""
-#: mod/photos.php:1042
+#: mod/photos.php:1041
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
-#: mod/photos.php:1043
+#: mod/photos.php:1042
msgid "Do not rotate"
msgstr ""
-#: mod/photos.php:1044
+#: mod/photos.php:1043
msgid "Rotate CW (right)"
msgstr ""
-#: mod/photos.php:1045
+#: mod/photos.php:1044
msgid "Rotate CCW (left)"
msgstr ""
-#: mod/photos.php:1091 mod/photos.php:1147 mod/photos.php:1227
-#: src/Module/Contact.php:600 src/Module/Item/Compose.php:184
-#: src/Object/Post.php:1143
+#: mod/photos.php:1090 mod/photos.php:1146 mod/photos.php:1226
+#: src/Module/Contact.php:599 src/Module/Item/Compose.php:184
+#: src/Object/Post.php:1142
msgid "This is you"
msgstr ""
-#: mod/photos.php:1093 mod/photos.php:1149 mod/photos.php:1229
-#: src/Module/Moderation/Reports.php:105 src/Object/Post.php:599
-#: src/Object/Post.php:1145
+#: mod/photos.php:1092 mod/photos.php:1148 mod/photos.php:1228
+#: src/Module/Moderation/Reports.php:105 src/Object/Post.php:598
+#: src/Object/Post.php:1144
msgid "Comment"
msgstr ""
-#: mod/photos.php:1095 mod/photos.php:1151 mod/photos.php:1231
+#: mod/photos.php:1094 mod/photos.php:1150 mod/photos.php:1230
#: src/Content/Conversation.php:403 src/Module/Calendar/Event/Form.php:234
#: src/Module/Item/Compose.php:197 src/Module/Post/Edit.php:156
-#: src/Object/Post.php:1159
+#: src/Object/Post.php:1158
msgid "Preview"
msgstr ""
-#: mod/photos.php:1096 src/Content/Conversation.php:357
-#: src/Module/Post/Edit.php:121 src/Object/Post.php:1147
+#: mod/photos.php:1095 src/Content/Conversation.php:357
+#: src/Module/Post/Edit.php:121 src/Object/Post.php:1146
msgid "Loading..."
msgstr ""
-#: mod/photos.php:1188 src/Content/Conversation.php:1487
-#: src/Object/Post.php:261
+#: mod/photos.php:1187 src/Content/Conversation.php:1487
+#: src/Object/Post.php:260
msgid "Select"
msgstr ""
-#: mod/photos.php:1189 src/Content/Conversation.php:1488
-#: src/Module/Moderation/Users/Active.php:125
-#: src/Module/Moderation/Users/Blocked.php:125
-#: src/Module/Moderation/Users/Index.php:140
+#: mod/photos.php:1188 src/Content/Conversation.php:1488
+#: src/Module/Moderation/Users/Active.php:92
+#: src/Module/Moderation/Users/Blocked.php:92
+#: src/Module/Moderation/Users/Index.php:100
#: src/Module/Settings/Connectors.php:226
#: src/Module/Settings/Server/Index.php:95
msgid "Delete"
msgstr ""
-#: mod/photos.php:1250 src/Object/Post.php:427
+#: mod/photos.php:1249 src/Object/Post.php:426
msgid "Like"
msgstr ""
-#: mod/photos.php:1251 src/Object/Post.php:427
+#: mod/photos.php:1250 src/Object/Post.php:426
msgid "I like this (toggle)"
msgstr ""
-#: mod/photos.php:1252 src/Object/Post.php:428
+#: mod/photos.php:1251 src/Object/Post.php:427
msgid "Dislike"
msgstr ""
-#: mod/photos.php:1254 src/Object/Post.php:428
+#: mod/photos.php:1253 src/Object/Post.php:427
msgid "I don't like this (toggle)"
msgstr ""
-#: mod/photos.php:1276
+#: mod/photos.php:1275
msgid "Map"
msgstr ""
-#: src/App.php:369
+#: src/App.php:415
msgid "Apologies but the website is unavailable at the moment."
msgstr ""
@@ -761,36 +761,36 @@ msgstr ""
msgid "You must be logged in to use addons. "
msgstr ""
-#: src/AppLegacy.php:317
+#: src/AppLegacy.php:318
msgid "No system theme config value set."
msgstr ""
-#: src/BaseModule.php:409
+#: src/BaseModule.php:408
msgid "The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."
msgstr ""
-#: src/BaseModule.php:436
+#: src/BaseModule.php:435
msgid "All contacts"
msgstr ""
-#: src/BaseModule.php:441 src/Content/Conversation/Factory/Channel.php:32
-#: src/Content/Widget.php:254 src/Core/ACL.php:182 src/Module/Contact.php:395
+#: src/BaseModule.php:440 src/Content/Conversation/Factory/Channel.php:32
+#: src/Content/Widget.php:254 src/Core/ACL.php:182 src/Module/Contact.php:394
#: src/Module/Privacy/PermissionTooltip.php:150
#: src/Module/Privacy/PermissionTooltip.php:172
#: src/Module/Settings/Channels.php:146
msgid "Followers"
msgstr ""
-#: src/BaseModule.php:446 src/Content/Widget.php:255 src/Module/Contact.php:398
+#: src/BaseModule.php:445 src/Content/Widget.php:255 src/Module/Contact.php:397
#: src/Module/Settings/Channels.php:145
msgid "Following"
msgstr ""
-#: src/BaseModule.php:451 src/Content/Widget.php:256 src/Module/Contact.php:401
+#: src/BaseModule.php:450 src/Content/Widget.php:256 src/Module/Contact.php:400
msgid "Mutual friends"
msgstr ""
-#: src/BaseModule.php:459
+#: src/BaseModule.php:458
msgid "Common"
msgstr ""
@@ -944,14 +944,11 @@ msgstr ""
msgid "Enter user nickname: "
msgstr ""
-#: src/Console/User.php:168 src/Model/User.php:834
+#: src/Console/User.php:168 src/Model/User.php:833
#: src/Module/Api/Twitter/ContactEndpoint.php:62
-#: src/Module/Moderation/Users/Active.php:55
-#: src/Module/Moderation/Users/Active.php:61
-#: src/Module/Moderation/Users/Blocked.php:55
-#: src/Module/Moderation/Users/Blocked.php:61
-#: src/Module/Moderation/Users/Index.php:62
-#: src/Module/Moderation/Users/Index.php:68
+#: src/Module/Moderation/Users/Active.php:136
+#: src/Module/Moderation/Users/Blocked.php:135
+#: src/Module/Moderation/Users/Index.php:147
#: src/Module/Moderation/Users/Pending.php:53
msgid "User not found"
msgstr ""
@@ -1060,12 +1057,12 @@ msgid "RSS/Atom"
msgstr ""
#: src/Content/ContactSelector.php:120
-#: src/Module/Moderation/Users/Active.php:115
-#: src/Module/Moderation/Users/Blocked.php:115
+#: src/Module/Moderation/Users/Active.php:82
+#: src/Module/Moderation/Users/Blocked.php:82
#: src/Module/Moderation/Users/Create.php:58
#: src/Module/Moderation/Users/Deleted.php:69
-#: src/Module/Moderation/Users/Index.php:129
-#: src/Module/Moderation/Users/Index.php:149
+#: src/Module/Moderation/Users/Index.php:89
+#: src/Module/Moderation/Users/Index.php:109
#: src/Module/Moderation/Users/Pending.php:85
msgid "Email"
msgstr ""
@@ -1233,7 +1230,7 @@ msgid "Visible to everybody"
msgstr ""
#: src/Content/Conversation.php:327 src/Module/Item/Compose.php:196
-#: src/Object/Post.php:1158
+#: src/Object/Post.php:1157
msgid "Please enter a image/video/audio/webpage URL:"
msgstr ""
@@ -1278,52 +1275,52 @@ msgid "attach file"
msgstr ""
#: src/Content/Conversation.php:362 src/Module/Item/Compose.php:186
-#: src/Module/Post/Edit.php:162 src/Object/Post.php:1148
+#: src/Module/Post/Edit.php:162 src/Object/Post.php:1147
msgid "Bold"
msgstr ""
#: src/Content/Conversation.php:363 src/Module/Item/Compose.php:187
-#: src/Module/Post/Edit.php:163 src/Object/Post.php:1149
+#: src/Module/Post/Edit.php:163 src/Object/Post.php:1148
msgid "Italic"
msgstr ""
#: src/Content/Conversation.php:364 src/Module/Item/Compose.php:188
-#: src/Module/Post/Edit.php:164 src/Object/Post.php:1150
+#: src/Module/Post/Edit.php:164 src/Object/Post.php:1149
msgid "Underline"
msgstr ""
#: src/Content/Conversation.php:365 src/Module/Item/Compose.php:189
-#: src/Module/Post/Edit.php:165 src/Object/Post.php:1152
+#: src/Module/Post/Edit.php:165 src/Object/Post.php:1151
msgid "Quote"
msgstr ""
#: src/Content/Conversation.php:366 src/Module/Item/Compose.php:190
-#: src/Module/Post/Edit.php:166 src/Object/Post.php:1153
+#: src/Module/Post/Edit.php:166 src/Object/Post.php:1152
msgid "Add emojis"
msgstr ""
#: src/Content/Conversation.php:367 src/Module/Item/Compose.php:191
-#: src/Object/Post.php:1151
+#: src/Object/Post.php:1150
msgid "Content Warning"
msgstr ""
#: src/Content/Conversation.php:368 src/Module/Item/Compose.php:192
-#: src/Module/Post/Edit.php:167 src/Object/Post.php:1154
+#: src/Module/Post/Edit.php:167 src/Object/Post.php:1153
msgid "Code"
msgstr ""
#: src/Content/Conversation.php:369 src/Module/Item/Compose.php:193
-#: src/Object/Post.php:1155
+#: src/Object/Post.php:1154
msgid "Image"
msgstr ""
#: src/Content/Conversation.php:370 src/Module/Item/Compose.php:194
-#: src/Module/Post/Edit.php:168 src/Object/Post.php:1156
+#: src/Module/Post/Edit.php:168 src/Object/Post.php:1155
msgid "Link"
msgstr ""
#: src/Content/Conversation.php:371 src/Module/Item/Compose.php:195
-#: src/Module/Post/Edit.php:169 src/Object/Post.php:1157
+#: src/Module/Post/Edit.php:169 src/Object/Post.php:1156
msgid "Link or Media"
msgstr ""
@@ -1370,8 +1367,8 @@ msgstr ""
msgid "Public post"
msgstr ""
-#: src/Content/Conversation.php:413 src/Content/Widget/VCard.php:121
-#: src/Model/Profile.php:461 src/Module/Admin/Logs/View.php:80
+#: src/Content/Conversation.php:413 src/Content/Widget/VCard.php:120
+#: src/Model/Profile.php:458 src/Module/Admin/Logs/View.php:80
#: src/Module/Post/Edit.php:172
msgid "Message"
msgstr ""
@@ -1479,25 +1476,25 @@ msgstr ""
msgid "Pushed to us"
msgstr ""
-#: src/Content/Conversation.php:1507 src/Object/Post.php:248
+#: src/Content/Conversation.php:1507 src/Object/Post.php:247
msgid "Pinned item"
msgstr ""
-#: src/Content/Conversation.php:1524 src/Object/Post.php:542
-#: src/Object/Post.php:543
+#: src/Content/Conversation.php:1524 src/Object/Post.php:541
+#: src/Object/Post.php:542
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
-#: src/Content/Conversation.php:1538 src/Object/Post.php:530
+#: src/Content/Conversation.php:1538 src/Object/Post.php:529
msgid "Categories:"
msgstr ""
-#: src/Content/Conversation.php:1539 src/Object/Post.php:531
+#: src/Content/Conversation.php:1539 src/Object/Post.php:530
msgid "Filed under:"
msgstr ""
-#: src/Content/Conversation.php:1547 src/Object/Post.php:557
+#: src/Content/Conversation.php:1547 src/Object/Post.php:556
#, php-format
msgid "%s from %s"
msgstr ""
@@ -1635,7 +1632,7 @@ msgstr ""
msgid "Posts that mention or involve you"
msgstr ""
-#: src/Content/Conversation/Factory/Network.php:28 src/Object/Post.php:398
+#: src/Content/Conversation/Factory/Network.php:28 src/Object/Post.php:397
msgid "Starred"
msgstr ""
@@ -1700,7 +1697,7 @@ msgid "Network Widgets"
msgstr ""
#: src/Content/Feature.php:115 src/Content/Widget.php:230
-#: src/Model/Circle.php:587 src/Module/Contact.php:381
+#: src/Model/Circle.php:587 src/Module/Contact.php:380
#: src/Module/Welcome.php:62
msgid "Circles"
msgstr ""
@@ -1709,9 +1706,9 @@ msgstr ""
msgid "Display posts that have been created by accounts of the selected circle."
msgstr ""
-#: src/Content/Feature.php:116 src/Content/GroupManager.php:133
+#: src/Content/Feature.php:116 src/Content/GroupManager.php:130
#: src/Content/Nav.php:264 src/Content/Text/HTML.php:868
-#: src/Content/Widget.php:555 src/Model/User.php:1394
+#: src/Content/Widget.php:555 src/Model/User.php:1393
msgid "Groups"
msgstr ""
@@ -1745,7 +1742,7 @@ msgid "Display posts done by accounts with the selected account type."
msgstr ""
#: src/Content/Feature.php:120 src/Content/Widget.php:610
-#: src/Module/Admin/Site.php:466 src/Module/BaseSettings.php:113
+#: src/Module/Admin/Site.php:463 src/Module/BaseSettings.php:113
#: src/Module/Settings/Channels.php:211 src/Module/Settings/Display.php:323
msgid "Channels"
msgstr ""
@@ -1818,82 +1815,82 @@ msgstr ""
msgid "Allows anonymous visitors to consult your calendar and your public events. Contact birthday events are private to you."
msgstr ""
-#: src/Content/GroupManager.php:135
+#: src/Content/GroupManager.php:132
msgid "External link to group"
msgstr ""
-#: src/Content/GroupManager.php:139 src/Content/Widget.php:530
+#: src/Content/GroupManager.php:136 src/Content/Widget.php:530
msgid "show less"
msgstr ""
-#: src/Content/GroupManager.php:140 src/Content/Widget.php:425
+#: src/Content/GroupManager.php:137 src/Content/Widget.php:425
#: src/Content/Widget.php:531
msgid "show more"
msgstr ""
-#: src/Content/GroupManager.php:141
+#: src/Content/GroupManager.php:138
msgid "Create new group"
msgstr ""
-#: src/Content/Item.php:322 src/Model/Item.php:3297
+#: src/Content/Item.php:321 src/Model/Item.php:2980
msgid "event"
msgstr ""
-#: src/Content/Item.php:325 src/Content/Item.php:335
+#: src/Content/Item.php:324 src/Content/Item.php:334
msgid "status"
msgstr ""
-#: src/Content/Item.php:331 src/Model/Item.php:3299
+#: src/Content/Item.php:330 src/Model/Item.php:2982
#: src/Module/Post/Tag/Add.php:109
msgid "photo"
msgstr ""
-#: src/Content/Item.php:345 src/Module/Post/Tag/Add.php:127
+#: src/Content/Item.php:344 src/Module/Post/Tag/Add.php:127
#, php-format
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: src/Content/Item.php:419 view/theme/frio/theme.php:253
+#: src/Content/Item.php:418 view/theme/frio/theme.php:251
msgid "Follow Thread"
msgstr ""
-#: src/Content/Item.php:420 src/Model/Contact.php:1254
+#: src/Content/Item.php:419 src/Model/Contact.php:1253
msgid "View Status"
msgstr ""
-#: src/Content/Item.php:421 src/Content/Item.php:444 src/Model/Contact.php:1189
-#: src/Model/Contact.php:1245 src/Model/Contact.php:1255
+#: src/Content/Item.php:420 src/Content/Item.php:443 src/Model/Contact.php:1188
+#: src/Model/Contact.php:1244 src/Model/Contact.php:1254
#: src/Module/Directory.php:143 src/Module/Settings/Profile/Index.php:250
msgid "View Profile"
msgstr ""
-#: src/Content/Item.php:422 src/Model/Contact.php:1256
+#: src/Content/Item.php:421 src/Model/Contact.php:1255
msgid "View Photos"
msgstr ""
-#: src/Content/Item.php:423 src/Model/Contact.php:1223
-#: src/Model/Profile.php:446
+#: src/Content/Item.php:422 src/Model/Contact.php:1222
+#: src/Model/Profile.php:443
msgid "Network Posts"
msgstr ""
-#: src/Content/Item.php:424 src/Model/Contact.php:1247
-#: src/Model/Contact.php:1258
+#: src/Content/Item.php:423 src/Model/Contact.php:1246
+#: src/Model/Contact.php:1257
msgid "View Contact"
msgstr ""
-#: src/Content/Item.php:425 src/Model/Contact.php:1259
+#: src/Content/Item.php:424 src/Model/Contact.php:1258
msgid "Send PM"
msgstr ""
-#: src/Content/Item.php:426 src/Module/Contact.php:449
+#: src/Content/Item.php:425 src/Module/Contact.php:448
#: src/Module/Contact/Profile.php:524
#: src/Module/Moderation/Blocklist/Contact.php:104
-#: src/Module/Moderation/Users/Active.php:126
-#: src/Module/Moderation/Users/Index.php:141
+#: src/Module/Moderation/Users/Active.php:93
+#: src/Module/Moderation/Users/Index.php:101
msgid "Block"
msgstr ""
-#: src/Content/Item.php:427 src/Module/Contact.php:450
+#: src/Content/Item.php:426 src/Module/Contact.php:449
#: src/Module/Contact/Profile.php:532
#: src/Module/Notifications/Introductions.php:126
#: src/Module/Notifications/Introductions.php:199
@@ -1901,32 +1898,32 @@ msgstr ""
msgid "Ignore"
msgstr ""
-#: src/Content/Item.php:428 src/Module/Contact.php:451
+#: src/Content/Item.php:427 src/Module/Contact.php:450
#: src/Module/Contact/Profile.php:540
msgid "Collapse"
msgstr ""
-#: src/Content/Item.php:429 src/Object/Post.php:289
+#: src/Content/Item.php:428 src/Object/Post.php:288
#, php-format
msgid "Ignore %s server"
msgstr ""
-#: src/Content/Item.php:433 src/Module/Settings/Channels.php:188
-#: src/Module/Settings/Channels.php:209 src/Object/Post.php:503
+#: src/Content/Item.php:432 src/Module/Settings/Channels.php:188
+#: src/Module/Settings/Channels.php:209 src/Object/Post.php:502
msgid "Languages"
msgstr ""
-#: src/Content/Item.php:436 src/Object/Post.php:583
+#: src/Content/Item.php:435 src/Object/Post.php:582
msgid "Search Text"
msgstr ""
-#: src/Content/Item.php:441 src/Content/Widget.php:66
-#: src/Model/Contact.php:1248 src/Model/Contact.php:1260
+#: src/Content/Item.php:440 src/Content/Widget.php:66
+#: src/Model/Contact.php:1247 src/Model/Contact.php:1259
#: src/Module/Contact/Follow.php:152 view/theme/vier/theme.php:183
msgid "Connect/Follow"
msgstr ""
-#: src/Content/Item.php:870
+#: src/Content/Item.php:869
msgid "Unable to fetch user."
msgstr ""
@@ -1964,7 +1961,7 @@ msgid "Sign in"
msgstr ""
#: src/Content/Nav.php:215 src/Module/BaseProfile.php:42
-#: src/Module/Contact.php:493
+#: src/Module/Contact.php:492
msgid "Conversations"
msgstr ""
@@ -1973,44 +1970,44 @@ msgid "Conversations you started"
msgstr ""
#: src/Content/Nav.php:216 src/Module/BaseProfile.php:34
-#: src/Module/BaseSettings.php:86 src/Module/Contact.php:485
+#: src/Module/BaseSettings.php:86 src/Module/Contact.php:484
#: src/Module/Contact/Profile.php:431 src/Module/Profile/Profile.php:259
-#: src/Module/Welcome.php:43 view/theme/frio/theme.php:221
+#: src/Module/Welcome.php:43 view/theme/frio/theme.php:219
msgid "Profile"
msgstr ""
-#: src/Content/Nav.php:216 view/theme/frio/theme.php:221
+#: src/Content/Nav.php:216 view/theme/frio/theme.php:219
msgid "Your profile page"
msgstr ""
#: src/Content/Nav.php:217 src/Module/BaseProfile.php:50
-#: src/Module/Media/Photo/Browser.php:62 view/theme/frio/theme.php:225
+#: src/Module/Media/Photo/Browser.php:62 view/theme/frio/theme.php:223
msgid "Photos"
msgstr ""
-#: src/Content/Nav.php:217 view/theme/frio/theme.php:225
+#: src/Content/Nav.php:217 view/theme/frio/theme.php:223
msgid "Your photos"
msgstr ""
#: src/Content/Nav.php:218 src/Module/BaseProfile.php:58
-#: src/Module/BaseProfile.php:61 src/Module/Contact.php:509
-#: view/theme/frio/theme.php:226
+#: src/Module/BaseProfile.php:61 src/Module/Contact.php:508
+#: view/theme/frio/theme.php:224
msgid "Media"
msgstr ""
-#: src/Content/Nav.php:218 view/theme/frio/theme.php:226
+#: src/Content/Nav.php:218 view/theme/frio/theme.php:224
msgid "Your postings with media"
msgstr ""
#: src/Content/Nav.php:219 src/Content/Nav.php:279
#: src/Module/BaseProfile.php:70 src/Module/BaseProfile.php:73
#: src/Module/BaseProfile.php:81 src/Module/BaseProfile.php:84
-#: src/Module/Settings/Display.php:324 view/theme/frio/theme.php:227
-#: view/theme/frio/theme.php:231
+#: src/Module/Settings/Display.php:324 view/theme/frio/theme.php:225
+#: view/theme/frio/theme.php:229
msgid "Calendar"
msgstr ""
-#: src/Content/Nav.php:219 view/theme/frio/theme.php:227
+#: src/Content/Nav.php:219 view/theme/frio/theme.php:225
msgid "Your calendar"
msgstr ""
@@ -2030,7 +2027,7 @@ msgstr ""
msgid "Home Page"
msgstr ""
-#: src/Content/Nav.php:241 src/Module/Register.php:162
+#: src/Content/Nav.php:241 src/Module/Register.php:161
#: src/Module/Security/Login.php:113
msgid "Register"
msgstr ""
@@ -2060,7 +2057,7 @@ msgid "Addon applications, utilities, games"
msgstr ""
#: src/Content/Nav.php:255 src/Content/Text/HTML.php:853
-#: src/Module/Admin/Logs/View.php:74 src/Module/Search/Index.php:98
+#: src/Module/Admin/Logs/View.php:74 src/Module/Search/Index.php:99
msgid "Search"
msgstr ""
@@ -2079,8 +2076,8 @@ msgstr ""
#: src/Content/Nav.php:260 src/Content/Nav.php:315
#: src/Content/Text/HTML.php:864 src/Module/BaseProfile.php:112
-#: src/Module/BaseProfile.php:115 src/Module/Contact.php:407
-#: src/Module/Contact.php:517 view/theme/frio/theme.php:234
+#: src/Module/BaseProfile.php:115 src/Module/Contact.php:406
+#: src/Module/Contact.php:516 view/theme/frio/theme.php:232
msgid "Contacts"
msgstr ""
@@ -2110,7 +2107,7 @@ msgid "Information about this friendica instance"
msgstr ""
#: src/Content/Nav.php:287 src/Module/Admin/Tos.php:64
-#: src/Module/BaseAdmin.php:81 src/Module/Register.php:170
+#: src/Module/BaseAdmin.php:81 src/Module/Register.php:169
#: src/Module/Tos.php:87
msgid "Terms of Service"
msgstr ""
@@ -2119,15 +2116,15 @@ msgstr ""
msgid "Terms of Service of this Friendica instance"
msgstr ""
-#: src/Content/Nav.php:292 view/theme/frio/theme.php:230
+#: src/Content/Nav.php:292 view/theme/frio/theme.php:228
msgid "Network"
msgstr ""
-#: src/Content/Nav.php:292 view/theme/frio/theme.php:230
+#: src/Content/Nav.php:292 view/theme/frio/theme.php:228
msgid "Conversations from your friends"
msgstr ""
-#: src/Content/Nav.php:294 view/theme/frio/theme.php:220
+#: src/Content/Nav.php:294 view/theme/frio/theme.php:218
msgid "Your posts and conversations"
msgstr ""
@@ -2156,7 +2153,7 @@ msgstr ""
msgid "Mark all system notifications as seen"
msgstr ""
-#: src/Content/Nav.php:304 view/theme/frio/theme.php:232
+#: src/Content/Nav.php:304 view/theme/frio/theme.php:230
msgid "Private mail"
msgstr ""
@@ -2178,15 +2175,15 @@ msgstr ""
#: src/Content/Nav.php:313 src/Module/Admin/Addons/Details.php:98
#: src/Module/Admin/Themes/Details.php:85 src/Module/BaseSettings.php:177
-#: src/Module/Welcome.php:38 view/theme/frio/theme.php:233
+#: src/Module/Welcome.php:38 view/theme/frio/theme.php:231
msgid "Settings"
msgstr ""
-#: src/Content/Nav.php:313 view/theme/frio/theme.php:233
+#: src/Content/Nav.php:313 view/theme/frio/theme.php:231
msgid "Account settings"
msgstr ""
-#: src/Content/Nav.php:315 view/theme/frio/theme.php:234
+#: src/Content/Nav.php:315 view/theme/frio/theme.php:232
msgid "Manage/edit friends and contacts"
msgstr ""
@@ -2205,10 +2202,10 @@ msgstr ""
#: src/Module/Moderation/Blocklist/Server/Index.php:84
#: src/Module/Moderation/Item/Delete.php:47
#: src/Module/Moderation/Reports.php:99 src/Module/Moderation/Summary.php:64
-#: src/Module/Moderation/Users/Active.php:122
-#: src/Module/Moderation/Users/Blocked.php:122
+#: src/Module/Moderation/Users/Active.php:89
+#: src/Module/Moderation/Users/Blocked.php:89
#: src/Module/Moderation/Users/Deleted.php:66
-#: src/Module/Moderation/Users/Index.php:136
+#: src/Module/Moderation/Users/Index.php:96
msgid "Moderation"
msgstr ""
@@ -2245,8 +2242,8 @@ msgstr ""
msgid "%2$s %3$s"
msgstr ""
-#: src/Content/Text/BBCode.php:926 src/Model/Item.php:4096
-#: src/Model/Item.php:4102 src/Model/Item.php:4103
+#: src/Content/Text/BBCode.php:926 src/Model/Item.php:3779
+#: src/Model/Item.php:3785 src/Model/Item.php:3786
msgid "Link to source"
msgstr ""
@@ -2278,8 +2275,8 @@ msgstr ""
msgid "The end"
msgstr ""
-#: src/Content/Text/HTML.php:847 src/Content/Widget/VCard.php:117
-#: src/Model/Profile.php:455 src/Module/Contact/Profile.php:484
+#: src/Content/Text/HTML.php:847 src/Content/Widget/VCard.php:116
+#: src/Model/Profile.php:452 src/Module/Contact/Profile.php:484
msgid "Follow"
msgstr ""
@@ -2318,7 +2315,7 @@ msgstr ""
msgid "Examples: Robert Morgenstein, Fishing"
msgstr ""
-#: src/Content/Widget.php:68 src/Module/Contact.php:441
+#: src/Content/Widget.php:68 src/Module/Contact.php:440
#: src/Module/Directory.php:82 view/theme/vier/theme.php:185
msgid "Find"
msgstr ""
@@ -2353,7 +2350,7 @@ msgstr ""
msgid "Everyone"
msgstr ""
-#: src/Content/Widget.php:257 src/Module/Contact.php:404
+#: src/Content/Widget.php:257 src/Module/Contact.php:403
msgid "No relationship"
msgstr ""
@@ -2362,7 +2359,7 @@ msgid "Relationships"
msgstr ""
#: src/Content/Widget.php:264 src/Module/Circle.php:281
-#: src/Module/Contact.php:325
+#: src/Module/Contact.php:324
msgid "All Contacts"
msgstr ""
@@ -2397,7 +2394,7 @@ msgstr ""
msgid "Organisations"
msgstr ""
-#: src/Content/Widget.php:554 src/Model/Contact.php:1758
+#: src/Content/Widget.php:554 src/Model/Contact.php:1757
msgid "News"
msgstr ""
@@ -2451,47 +2448,47 @@ msgstr[1] ""
msgid "More Trending Tags"
msgstr ""
-#: src/Content/Widget/VCard.php:95 src/Model/Contact.php:1217
-#: src/Model/Profile.php:440
+#: src/Content/Widget/VCard.php:94 src/Model/Contact.php:1216
+#: src/Model/Profile.php:437
msgid "Post to group"
msgstr ""
-#: src/Content/Widget/VCard.php:100 src/Model/Contact.php:1221
-#: src/Model/Profile.php:444 src/Module/Moderation/Item/Source.php:80
+#: src/Content/Widget/VCard.php:99 src/Model/Contact.php:1220
+#: src/Model/Profile.php:441 src/Module/Moderation/Item/Source.php:80
msgid "Mention"
msgstr ""
-#: src/Content/Widget/VCard.php:110 src/Model/Profile.php:359
+#: src/Content/Widget/VCard.php:109 src/Model/Profile.php:356
#: src/Module/Contact/Profile.php:420 src/Module/Profile/Profile.php:190
msgid "XMPP:"
msgstr ""
-#: src/Content/Widget/VCard.php:111 src/Model/Profile.php:360
+#: src/Content/Widget/VCard.php:110 src/Model/Profile.php:357
#: src/Module/Contact/Profile.php:422 src/Module/Profile/Profile.php:194
msgid "Matrix:"
msgstr ""
-#: src/Content/Widget/VCard.php:112 src/Model/Event.php:70
-#: src/Model/Event.php:97 src/Model/Event.php:459 src/Model/Event.php:947
-#: src/Model/Profile.php:354 src/Module/Contact/Profile.php:418
+#: src/Content/Widget/VCard.php:111 src/Model/Event.php:68
+#: src/Model/Event.php:95 src/Model/Event.php:457 src/Model/Event.php:945
+#: src/Model/Profile.php:351 src/Module/Contact/Profile.php:418
#: src/Module/Directory.php:133 src/Module/Notifications/Introductions.php:180
#: src/Module/Profile/Profile.php:212
msgid "Location:"
msgstr ""
-#: src/Content/Widget/VCard.php:115 src/Model/Profile.php:468
+#: src/Content/Widget/VCard.php:114 src/Model/Profile.php:465
#: src/Module/Notifications/Introductions.php:194
msgid "Network:"
msgstr ""
-#: src/Content/Widget/VCard.php:119 src/Model/Contact.php:1249
-#: src/Model/Contact.php:1261 src/Model/Profile.php:457
+#: src/Content/Widget/VCard.php:118 src/Model/Contact.php:1248
+#: src/Model/Contact.php:1260 src/Model/Profile.php:454
#: src/Module/Contact/Profile.php:476
msgid "Unfollow"
msgstr ""
-#: src/Content/Widget/VCard.php:125 src/Model/Contact.php:1219
-#: src/Model/Profile.php:442
+#: src/Content/Widget/VCard.php:124 src/Model/Contact.php:1218
+#: src/Model/Profile.php:439
msgid "View group"
msgstr ""
@@ -2834,7 +2831,7 @@ msgstr ""
msgid "Could not connect to database."
msgstr ""
-#: src/Core/L10n.php:426 src/Model/Item.php:2340
+#: src/Core/L10n.php:426 src/Model/Item.php:2023
msgid "Undetermined"
msgstr ""
@@ -2843,142 +2840,142 @@ msgstr ""
msgid "%s (%s)"
msgstr ""
-#: src/Core/L10n.php:481 src/Model/Event.php:418
+#: src/Core/L10n.php:481 src/Model/Event.php:416
#: src/Module/Settings/Display.php:292
msgid "Monday"
msgstr ""
-#: src/Core/L10n.php:481 src/Model/Event.php:419
+#: src/Core/L10n.php:481 src/Model/Event.php:417
#: src/Module/Settings/Display.php:293
msgid "Tuesday"
msgstr ""
-#: src/Core/L10n.php:481 src/Model/Event.php:420
+#: src/Core/L10n.php:481 src/Model/Event.php:418
#: src/Module/Settings/Display.php:294
msgid "Wednesday"
msgstr ""
-#: src/Core/L10n.php:481 src/Model/Event.php:421
+#: src/Core/L10n.php:481 src/Model/Event.php:419
#: src/Module/Settings/Display.php:295
msgid "Thursday"
msgstr ""
-#: src/Core/L10n.php:481 src/Model/Event.php:422
+#: src/Core/L10n.php:481 src/Model/Event.php:420
#: src/Module/Settings/Display.php:296
msgid "Friday"
msgstr ""
-#: src/Core/L10n.php:481 src/Model/Event.php:423
+#: src/Core/L10n.php:481 src/Model/Event.php:421
#: src/Module/Settings/Display.php:297
msgid "Saturday"
msgstr ""
-#: src/Core/L10n.php:481 src/Model/Event.php:417
+#: src/Core/L10n.php:481 src/Model/Event.php:415
#: src/Module/Settings/Display.php:291
msgid "Sunday"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:438
+#: src/Core/L10n.php:485 src/Model/Event.php:436
msgid "January"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:439
+#: src/Core/L10n.php:485 src/Model/Event.php:437
msgid "February"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:440
+#: src/Core/L10n.php:485 src/Model/Event.php:438
msgid "March"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:441
+#: src/Core/L10n.php:485 src/Model/Event.php:439
msgid "April"
msgstr ""
-#: src/Core/L10n.php:485 src/Core/L10n.php:504 src/Model/Event.php:429
+#: src/Core/L10n.php:485 src/Core/L10n.php:504 src/Model/Event.php:427
msgid "May"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:442
+#: src/Core/L10n.php:485 src/Model/Event.php:440
msgid "June"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:443
+#: src/Core/L10n.php:485 src/Model/Event.php:441
msgid "July"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:444
+#: src/Core/L10n.php:485 src/Model/Event.php:442
msgid "August"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:445
+#: src/Core/L10n.php:485 src/Model/Event.php:443
msgid "September"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:446
+#: src/Core/L10n.php:485 src/Model/Event.php:444
msgid "October"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:447
+#: src/Core/L10n.php:485 src/Model/Event.php:445
msgid "November"
msgstr ""
-#: src/Core/L10n.php:485 src/Model/Event.php:448
+#: src/Core/L10n.php:485 src/Model/Event.php:446
msgid "December"
msgstr ""
-#: src/Core/L10n.php:500 src/Model/Event.php:410
+#: src/Core/L10n.php:500 src/Model/Event.php:408
msgid "Mon"
msgstr ""
-#: src/Core/L10n.php:500 src/Model/Event.php:411
+#: src/Core/L10n.php:500 src/Model/Event.php:409
msgid "Tue"
msgstr ""
-#: src/Core/L10n.php:500 src/Model/Event.php:412
+#: src/Core/L10n.php:500 src/Model/Event.php:410
msgid "Wed"
msgstr ""
-#: src/Core/L10n.php:500 src/Model/Event.php:413
+#: src/Core/L10n.php:500 src/Model/Event.php:411
msgid "Thu"
msgstr ""
-#: src/Core/L10n.php:500 src/Model/Event.php:414
+#: src/Core/L10n.php:500 src/Model/Event.php:412
msgid "Fri"
msgstr ""
-#: src/Core/L10n.php:500 src/Model/Event.php:415
+#: src/Core/L10n.php:500 src/Model/Event.php:413
msgid "Sat"
msgstr ""
-#: src/Core/L10n.php:500 src/Model/Event.php:409
+#: src/Core/L10n.php:500 src/Model/Event.php:407
msgid "Sun"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:425
+#: src/Core/L10n.php:504 src/Model/Event.php:423
msgid "Jan"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:426
+#: src/Core/L10n.php:504 src/Model/Event.php:424
msgid "Feb"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:427
+#: src/Core/L10n.php:504 src/Model/Event.php:425
msgid "Mar"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:428
+#: src/Core/L10n.php:504 src/Model/Event.php:426
msgid "Apr"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:430
+#: src/Core/L10n.php:504 src/Model/Event.php:428
msgid "Jun"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:431
+#: src/Core/L10n.php:504 src/Model/Event.php:429
msgid "Jul"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:432
+#: src/Core/L10n.php:504 src/Model/Event.php:430
msgid "Aug"
msgstr ""
@@ -2986,15 +2983,15 @@ msgstr ""
msgid "Sep"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:434
+#: src/Core/L10n.php:504 src/Model/Event.php:432
msgid "Oct"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:435
+#: src/Core/L10n.php:504 src/Model/Event.php:433
msgid "Nov"
msgstr ""
-#: src/Core/L10n.php:504 src/Model/Event.php:436
+#: src/Core/L10n.php:504 src/Model/Event.php:434
msgid "Dec"
msgstr ""
@@ -3043,22 +3040,22 @@ msgstr ""
msgid "Updates from postupdate version %s are not supported. Please update at least to version 2021.01 and wait until the postupdate finished version 1383."
msgstr ""
-#: src/Core/Update.php:206
+#: src/Core/Update.php:207
#, php-format
msgid "%s: executing pre update %d"
msgstr ""
-#: src/Core/Update.php:248
+#: src/Core/Update.php:252
#, php-format
msgid "%s: executing post update %d"
msgstr ""
-#: src/Core/Update.php:322
+#: src/Core/Update.php:328
#, php-format
msgid "Update %s failed. See error logs."
msgstr ""
-#: src/Core/Update.php:362
+#: src/Core/Update.php:369
#, php-format
msgid ""
"\n"
@@ -3068,45 +3065,45 @@ msgid ""
"\t\t\t\tfriendica developer if you can not help me on your own. My database might be invalid."
msgstr ""
-#: src/Core/Update.php:368
+#: src/Core/Update.php:376
#, php-format
msgid "The error message is\\n[pre]%s[/pre]"
msgstr ""
-#: src/Core/Update.php:372 src/Core/Update.php:400
+#: src/Core/Update.php:380 src/Core/Update.php:411
msgid "[Friendica Notify] Database update"
msgstr ""
-#: src/Core/Update.php:394
+#: src/Core/Update.php:403
#, php-format
msgid ""
"\n"
"\t\t\t\tThe friendica database was successfully updated from %s to %s."
msgstr ""
-#: src/Database/DBStructure.php:43
+#: src/Database/DBStructure.php:42
#, php-format
msgid "The database version had been set to %s."
msgstr ""
-#: src/Database/DBStructure.php:68
+#: src/Database/DBStructure.php:67
#, php-format
msgid "The post update is at version %d, it has to be at %d to safely drop the tables."
msgstr ""
-#: src/Database/DBStructure.php:81
+#: src/Database/DBStructure.php:83
msgid "No unused tables found."
msgstr ""
-#: src/Database/DBStructure.php:86
+#: src/Database/DBStructure.php:88
msgid "These tables are not used for friendica and will be deleted when you execute \"dbstructure drop -e\":"
msgstr ""
-#: src/Database/DBStructure.php:123
+#: src/Database/DBStructure.php:125
msgid "There are no tables on MyISAM or InnoDB with the Antelope file format."
msgstr ""
-#: src/Database/DBStructure.php:147
+#: src/Database/DBStructure.php:150
#, php-format
msgid ""
"\n"
@@ -3114,20 +3111,20 @@ msgid ""
"%s\n"
msgstr ""
-#: src/Database/DBStructure.php:150
+#: src/Database/DBStructure.php:155
msgid "Errors encountered performing database changes: "
msgstr ""
-#: src/Database/DBStructure.php:228
+#: src/Database/DBStructure.php:233
msgid "Another database update is currently running."
msgstr ""
-#: src/Database/DBStructure.php:232
+#: src/Database/DBStructure.php:237
#, php-format
msgid "%s: Database update"
msgstr ""
-#: src/Database/DBStructure.php:489
+#: src/Database/DBStructure.php:494
#, php-format
msgid "%s: updating %s table."
msgstr ""
@@ -3157,7 +3154,7 @@ msgstr ""
msgid "Legacy module file not found: %s"
msgstr ""
-#: src/Model/Circle.php:92
+#: src/Model/Circle.php:91
msgid "A deleted circle with this name was revived. Existing item permissions may apply to this circle and any future members. If this is not what you intended, please create another circle with a different name."
msgstr ""
@@ -3194,563 +3191,563 @@ msgstr ""
msgid "Edit circles"
msgstr ""
-#: src/Model/Contact.php:1268 src/Module/Moderation/Users/Pending.php:88
+#: src/Model/Contact.php:1267 src/Module/Moderation/Users/Pending.php:88
#: src/Module/Notifications/Introductions.php:124
#: src/Module/Notifications/Introductions.php:197
msgid "Approve"
msgstr ""
-#: src/Model/Contact.php:1602 src/Model/Contact.php:1674
+#: src/Model/Contact.php:1601 src/Model/Contact.php:1673
#: src/Module/Contact/Profile.php:360
#, php-format
msgid "%s has blocked you"
msgstr ""
-#: src/Model/Contact.php:1754
+#: src/Model/Contact.php:1753
msgid "Organisation"
msgstr ""
-#: src/Model/Contact.php:1762
+#: src/Model/Contact.php:1761
msgid "Group"
msgstr ""
-#: src/Model/Contact.php:1766 src/Module/Moderation/BaseUsers.php:122
+#: src/Model/Contact.php:1765 src/Module/Moderation/BaseUsers.php:122
msgid "Relay"
msgstr ""
-#: src/Model/Contact.php:3092
+#: src/Model/Contact.php:3091
msgid "Disallowed profile URL."
msgstr ""
-#: src/Model/Contact.php:3097 src/Module/Friendica.php:88
+#: src/Model/Contact.php:3096 src/Module/Friendica.php:88
msgid "Blocked domain"
msgstr ""
-#: src/Model/Contact.php:3102
+#: src/Model/Contact.php:3101
msgid "Connect URL missing."
msgstr ""
-#: src/Model/Contact.php:3111
+#: src/Model/Contact.php:3110
msgid "The contact could not be added. Please check the relevant network credentials in your Settings -> Social Networks page."
msgstr ""
-#: src/Model/Contact.php:3129
+#: src/Model/Contact.php:3128
#, php-format
msgid "Expected network %s does not match actual network %s"
msgstr ""
-#: src/Model/Contact.php:3146
+#: src/Model/Contact.php:3145
msgid "This seems to be a relay account. They can't be followed by users."
msgstr ""
-#: src/Model/Contact.php:3153
+#: src/Model/Contact.php:3152
msgid "The profile address specified does not provide adequate information."
msgstr ""
-#: src/Model/Contact.php:3155
+#: src/Model/Contact.php:3154
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
-#: src/Model/Contact.php:3158
+#: src/Model/Contact.php:3157
msgid "An author or name was not found."
msgstr ""
-#: src/Model/Contact.php:3161
+#: src/Model/Contact.php:3160
msgid "No browser URL could be matched to this address."
msgstr ""
-#: src/Model/Contact.php:3164
+#: src/Model/Contact.php:3163
msgid "Unable to match @-style Identity Address with a known protocol or email contact."
msgstr ""
-#: src/Model/Contact.php:3165
+#: src/Model/Contact.php:3164
msgid "Use mailto: in front of address to force email check."
msgstr ""
-#: src/Model/Contact.php:3171
+#: src/Model/Contact.php:3170
msgid "Limited profile. This person will be unable to receive direct/personal notifications from you."
msgstr ""
-#: src/Model/Contact.php:3230
+#: src/Model/Contact.php:3229
msgid "Unable to retrieve contact information."
msgstr ""
-#: src/Model/Event.php:42
+#: src/Model/Event.php:40
msgid "l F d, Y \\@ g:i A \\G\\M\\TP (e)"
msgstr ""
-#: src/Model/Event.php:63 src/Model/Event.php:80 src/Model/Event.php:457
-#: src/Model/Event.php:929
+#: src/Model/Event.php:61 src/Model/Event.php:78 src/Model/Event.php:455
+#: src/Model/Event.php:927
msgid "Starts:"
msgstr ""
-#: src/Model/Event.php:66 src/Model/Event.php:86 src/Model/Event.php:458
-#: src/Model/Event.php:933
+#: src/Model/Event.php:64 src/Model/Event.php:84 src/Model/Event.php:456
+#: src/Model/Event.php:931
msgid "Finishes:"
msgstr ""
-#: src/Model/Event.php:407
+#: src/Model/Event.php:405
msgid "all-day"
msgstr ""
-#: src/Model/Event.php:433
+#: src/Model/Event.php:431
msgid "Sept"
msgstr ""
-#: src/Model/Event.php:450 src/Module/Calendar/Show.php:117
+#: src/Model/Event.php:448 src/Module/Calendar/Show.php:117
#: src/Util/Temporal.php:329
msgid "today"
msgstr ""
-#: src/Model/Event.php:451 src/Module/Calendar/Show.php:118
+#: src/Model/Event.php:449 src/Module/Calendar/Show.php:118
#: src/Module/Settings/Display.php:302 src/Util/Temporal.php:339
msgid "month"
msgstr ""
-#: src/Model/Event.php:452 src/Module/Calendar/Show.php:119
+#: src/Model/Event.php:450 src/Module/Calendar/Show.php:119
#: src/Module/Settings/Display.php:303 src/Util/Temporal.php:340
msgid "week"
msgstr ""
-#: src/Model/Event.php:453 src/Module/Calendar/Show.php:120
+#: src/Model/Event.php:451 src/Module/Calendar/Show.php:120
#: src/Module/Settings/Display.php:304 src/Util/Temporal.php:341
msgid "day"
msgstr ""
-#: src/Model/Event.php:455
+#: src/Model/Event.php:453
msgid "No events to display"
msgstr ""
-#: src/Model/Event.php:504 src/Module/Feed.php:56
+#: src/Model/Event.php:502 src/Module/Feed.php:56
#: src/Module/Update/Profile.php:42
msgid "Access to this profile has been restricted."
msgstr ""
-#: src/Model/Event.php:545 src/Module/Calendar/Event/Show.php:52
+#: src/Model/Event.php:543 src/Module/Calendar/Event/Show.php:52
msgid "Event not found."
msgstr ""
-#: src/Model/Event.php:624
+#: src/Model/Event.php:622
msgid "l, F j"
msgstr ""
-#: src/Model/Event.php:651
+#: src/Model/Event.php:649
msgid "Edit event"
msgstr ""
-#: src/Model/Event.php:652
+#: src/Model/Event.php:650
msgid "Duplicate event"
msgstr ""
-#: src/Model/Event.php:653
+#: src/Model/Event.php:651
msgid "Delete event"
msgstr ""
-#: src/Model/Event.php:883 src/Module/Debug/Localtime.php:24
+#: src/Model/Event.php:881 src/Module/Debug/Localtime.php:24
msgid "l F d, Y \\@ g:i A"
msgstr ""
-#: src/Model/Event.php:884
+#: src/Model/Event.php:882
msgid "D g:i A"
msgstr ""
-#: src/Model/Event.php:885
+#: src/Model/Event.php:883
msgid "g:i A"
msgstr ""
-#: src/Model/Event.php:948 src/Model/Event.php:950
+#: src/Model/Event.php:946 src/Model/Event.php:948
msgid "Show map"
msgstr ""
-#: src/Model/Event.php:949
+#: src/Model/Event.php:947
msgid "Hide map"
msgstr ""
-#: src/Model/Event.php:1042
+#: src/Model/Event.php:1040
#, php-format
msgid "%s's birthday"
msgstr ""
-#: src/Model/Event.php:1043
+#: src/Model/Event.php:1041
#, php-format
msgid "Happy Birthday %s"
msgstr ""
-#: src/Model/Item.php:2347
+#: src/Model/Item.php:2030
#, php-format
msgid "%s (%s - %s): %s"
msgstr ""
-#: src/Model/Item.php:2349
+#: src/Model/Item.php:2032
#, php-format
msgid "%s (%s): %s"
msgstr ""
-#: src/Model/Item.php:2352
+#: src/Model/Item.php:2035
#, php-format
msgid ""
"Detected languages in this post:\n"
"%s"
msgstr ""
-#: src/Model/Item.php:3301
+#: src/Model/Item.php:2984
msgid "activity"
msgstr ""
-#: src/Model/Item.php:3303
+#: src/Model/Item.php:2986
msgid "comment"
msgstr ""
-#: src/Model/Item.php:3306 src/Module/Post/Tag/Add.php:109
+#: src/Model/Item.php:2989 src/Module/Post/Tag/Add.php:109
msgid "post"
msgstr ""
-#: src/Model/Item.php:3479
+#: src/Model/Item.php:3162
#, php-format
msgid "%s is blocked"
msgstr ""
-#: src/Model/Item.php:3481
+#: src/Model/Item.php:3164
#, php-format
msgid "%s is ignored"
msgstr ""
-#: src/Model/Item.php:3483
+#: src/Model/Item.php:3166
#, php-format
msgid "Content from %s is collapsed"
msgstr ""
-#: src/Model/Item.php:3487
+#: src/Model/Item.php:3170
msgid "Sensitive content"
msgstr ""
-#: src/Model/Item.php:3996
+#: src/Model/Item.php:3679
msgid "bytes"
msgstr ""
-#: src/Model/Item.php:4027
+#: src/Model/Item.php:3710
#, php-format
msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] ""
msgstr[1] ""
-#: src/Model/Item.php:4029
+#: src/Model/Item.php:3712
#, php-format
msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)"
msgstr[0] ""
msgstr[1] ""
-#: src/Model/Item.php:4034
+#: src/Model/Item.php:3717
#, php-format
msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s"
msgstr[0] ""
msgstr[1] ""
-#: src/Model/Item.php:4036
+#: src/Model/Item.php:3719
#, php-format
msgid "%d voter."
msgid_plural "%d voters."
msgstr[0] ""
msgstr[1] ""
-#: src/Model/Item.php:4038
+#: src/Model/Item.php:3721
#, php-format
msgid "Poll end: %s"
msgstr ""
-#: src/Model/Item.php:4079 src/Model/Item.php:4080
+#: src/Model/Item.php:3762 src/Model/Item.php:3763
msgid "View on separate page"
msgstr ""
-#: src/Model/Mail.php:121
+#: src/Model/Mail.php:120
msgid "[no subject]"
msgstr ""
-#: src/Model/Photo.php:1195 src/Module/Media/Photo/Upload.php:154
+#: src/Model/Photo.php:1194 src/Module/Media/Photo/Upload.php:154
msgid "Wall Photos"
msgstr ""
-#: src/Model/Profile.php:342 src/Module/Profile/Profile.php:274
+#: src/Model/Profile.php:339 src/Module/Profile/Profile.php:274
#: src/Module/Profile/Profile.php:276
msgid "Edit profile"
msgstr ""
-#: src/Model/Profile.php:344
+#: src/Model/Profile.php:341
msgid "Change profile photo"
msgstr ""
-#: src/Model/Profile.php:357 src/Module/Directory.php:138
+#: src/Model/Profile.php:354 src/Module/Directory.php:138
#: src/Module/Profile/Profile.php:200
msgid "Homepage:"
msgstr ""
-#: src/Model/Profile.php:358 src/Module/Contact/Profile.php:424
+#: src/Model/Profile.php:355 src/Module/Contact/Profile.php:424
#: src/Module/Notifications/Introductions.php:182
msgid "About:"
msgstr ""
-#: src/Model/Profile.php:459
+#: src/Model/Profile.php:456
msgid "Atom feed"
msgstr ""
-#: src/Model/Profile.php:466
+#: src/Model/Profile.php:463
msgid "This website has been verified to belong to the same person."
msgstr ""
-#: src/Model/Profile.php:517
+#: src/Model/Profile.php:514
msgid "F d"
msgstr ""
-#: src/Model/Profile.php:581 src/Model/Profile.php:662
+#: src/Model/Profile.php:578 src/Model/Profile.php:659
msgid "[today]"
msgstr ""
-#: src/Model/Profile.php:590
+#: src/Model/Profile.php:587
msgid "Birthday Reminders"
msgstr ""
-#: src/Model/Profile.php:591
+#: src/Model/Profile.php:588
msgid "Birthdays this week:"
msgstr ""
-#: src/Model/Profile.php:607
+#: src/Model/Profile.php:604
msgid "g A l F d"
msgstr ""
-#: src/Model/Profile.php:649
+#: src/Model/Profile.php:646
msgid "[No description]"
msgstr ""
-#: src/Model/Profile.php:675
+#: src/Model/Profile.php:672
msgid "Event Reminders"
msgstr ""
-#: src/Model/Profile.php:676
+#: src/Model/Profile.php:673
msgid "Upcoming events the next 7 days:"
msgstr ""
-#: src/Model/Profile.php:786
+#: src/Model/Profile.php:783
msgid "Hometown:"
msgstr ""
-#: src/Model/Profile.php:787
+#: src/Model/Profile.php:784
msgid "Marital Status:"
msgstr ""
-#: src/Model/Profile.php:788
+#: src/Model/Profile.php:785
msgid "With:"
msgstr ""
-#: src/Model/Profile.php:789
+#: src/Model/Profile.php:786
msgid "Since:"
msgstr ""
-#: src/Model/Profile.php:790
+#: src/Model/Profile.php:787
msgid "Sexual Preference:"
msgstr ""
-#: src/Model/Profile.php:791
+#: src/Model/Profile.php:788
msgid "Political Views:"
msgstr ""
-#: src/Model/Profile.php:792
+#: src/Model/Profile.php:789
msgid "Religious Views:"
msgstr ""
-#: src/Model/Profile.php:793
+#: src/Model/Profile.php:790
msgid "Likes:"
msgstr ""
-#: src/Model/Profile.php:794
+#: src/Model/Profile.php:791
msgid "Dislikes:"
msgstr ""
-#: src/Model/Profile.php:795
+#: src/Model/Profile.php:792
msgid "Title/Description:"
msgstr ""
-#: src/Model/Profile.php:796 src/Module/Admin/Summary.php:174
+#: src/Model/Profile.php:793 src/Module/Admin/Summary.php:174
#: src/Module/Moderation/Report/Create.php:266
#: src/Module/Moderation/Summary.php:65
msgid "Summary"
msgstr ""
-#: src/Model/Profile.php:797
+#: src/Model/Profile.php:794
msgid "Musical interests"
msgstr ""
-#: src/Model/Profile.php:798
+#: src/Model/Profile.php:795
msgid "Books, literature"
msgstr ""
-#: src/Model/Profile.php:799
+#: src/Model/Profile.php:796
msgid "Television"
msgstr ""
-#: src/Model/Profile.php:800
+#: src/Model/Profile.php:797
msgid "Film/dance/culture/entertainment"
msgstr ""
-#: src/Model/Profile.php:801
+#: src/Model/Profile.php:798
msgid "Hobbies/Interests"
msgstr ""
-#: src/Model/Profile.php:802
+#: src/Model/Profile.php:799
msgid "Love/romance"
msgstr ""
-#: src/Model/Profile.php:803
+#: src/Model/Profile.php:800
msgid "Work/employment"
msgstr ""
-#: src/Model/Profile.php:804
+#: src/Model/Profile.php:801
msgid "School/education"
msgstr ""
-#: src/Model/Profile.php:805
+#: src/Model/Profile.php:802
msgid "Contact information and Social Networks"
msgstr ""
-#: src/Model/Profile.php:853
+#: src/Model/Profile.php:850
#, php-format
msgid "Responsible account: %s"
msgstr ""
-#: src/Model/User.php:217 src/Model/User.php:1314
+#: src/Model/User.php:216 src/Model/User.php:1313
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr ""
-#: src/Model/User.php:740 src/Model/User.php:773
+#: src/Model/User.php:739 src/Model/User.php:772
msgid "Login failed"
msgstr ""
-#: src/Model/User.php:806
+#: src/Model/User.php:805
msgid "Not enough information to authenticate"
msgstr ""
-#: src/Model/User.php:933
+#: src/Model/User.php:932
msgid "Password can't be empty"
msgstr ""
-#: src/Model/User.php:975
+#: src/Model/User.php:974
msgid "Empty passwords are not allowed."
msgstr ""
-#: src/Model/User.php:979
+#: src/Model/User.php:978
msgid "The new password has been exposed in a public data dump, please choose another."
msgstr ""
-#: src/Model/User.php:983
+#: src/Model/User.php:982
msgid "The password length is limited to 72 characters."
msgstr ""
-#: src/Model/User.php:987
+#: src/Model/User.php:986
msgid "The password can't contain white spaces nor accentuated letters"
msgstr ""
-#: src/Model/User.php:1196
+#: src/Model/User.php:1195
msgid "Passwords do not match. Password unchanged."
msgstr ""
-#: src/Model/User.php:1203
+#: src/Model/User.php:1202
msgid "An invitation is required."
msgstr ""
-#: src/Model/User.php:1207
+#: src/Model/User.php:1206
msgid "Invitation could not be verified."
msgstr ""
-#: src/Model/User.php:1215
+#: src/Model/User.php:1214
msgid "Invalid OpenID url"
msgstr ""
-#: src/Model/User.php:1229 src/Security/Authentication.php:231
+#: src/Model/User.php:1228 src/Security/Authentication.php:231
msgid "We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."
msgstr ""
-#: src/Model/User.php:1229 src/Security/Authentication.php:231
+#: src/Model/User.php:1228 src/Security/Authentication.php:231
msgid "The error message was:"
msgstr ""
-#: src/Model/User.php:1235
+#: src/Model/User.php:1234
msgid "Please enter the required information."
msgstr ""
-#: src/Model/User.php:1249
+#: src/Model/User.php:1248
#, php-format
msgid "system.username_min_length (%s) and system.username_max_length (%s) are excluding each other, swapping values."
msgstr ""
-#: src/Model/User.php:1256
+#: src/Model/User.php:1255
#, php-format
msgid "Username should be at least %s character."
msgid_plural "Username should be at least %s characters."
msgstr[0] ""
msgstr[1] ""
-#: src/Model/User.php:1260
+#: src/Model/User.php:1259
#, php-format
msgid "Username should be at most %s character."
msgid_plural "Username should be at most %s characters."
msgstr[0] ""
msgstr[1] ""
-#: src/Model/User.php:1268
+#: src/Model/User.php:1267
msgid "That doesn't appear to be your full (First Last) name."
msgstr ""
-#: src/Model/User.php:1273
+#: src/Model/User.php:1272
msgid "Your email domain is not among those allowed on this site."
msgstr ""
-#: src/Model/User.php:1277
+#: src/Model/User.php:1276
msgid "Not a valid email address."
msgstr ""
-#: src/Model/User.php:1280
+#: src/Model/User.php:1279
msgid "The nickname was blocked from registration by the nodes admin."
msgstr ""
-#: src/Model/User.php:1284 src/Model/User.php:1290
+#: src/Model/User.php:1283 src/Model/User.php:1289
msgid "Cannot use that email."
msgstr ""
-#: src/Model/User.php:1296
+#: src/Model/User.php:1295
msgid "Your nickname can only contain a-z, 0-9 and _."
msgstr ""
-#: src/Model/User.php:1304 src/Model/User.php:1354
+#: src/Model/User.php:1303 src/Model/User.php:1353
msgid "Nickname is already registered. Please choose another."
msgstr ""
-#: src/Model/User.php:1341 src/Model/User.php:1345
+#: src/Model/User.php:1340 src/Model/User.php:1344
msgid "An error occurred during registration. Please try again."
msgstr ""
-#: src/Model/User.php:1368
+#: src/Model/User.php:1367
msgid "An error occurred creating your default profile. Please try again."
msgstr ""
-#: src/Model/User.php:1375
+#: src/Model/User.php:1374
msgid "An error occurred creating your self contact. Please try again."
msgstr ""
-#: src/Model/User.php:1380
+#: src/Model/User.php:1379
msgid "Friends"
msgstr ""
-#: src/Model/User.php:1384
+#: src/Model/User.php:1383
msgid "An error occurred creating your default contact circle. Please try again."
msgstr ""
-#: src/Model/User.php:1432
+#: src/Model/User.php:1431
msgid "Profile Photos"
msgstr ""
-#: src/Model/User.php:1620
+#: src/Model/User.php:1619
#, php-format
msgid ""
"\n"
@@ -3758,7 +3755,7 @@ msgid ""
"\t\t\tthe administrator of %2$s has set up an account for you."
msgstr ""
-#: src/Model/User.php:1623
+#: src/Model/User.php:1622
#, php-format
msgid ""
"\n"
@@ -3789,12 +3786,12 @@ msgid ""
"\t\tThank you and welcome to %4$s."
msgstr ""
-#: src/Model/User.php:1655 src/Model/User.php:1761
+#: src/Model/User.php:1654 src/Model/User.php:1760
#, php-format
msgid "Registration details for %s"
msgstr ""
-#: src/Model/User.php:1675
+#: src/Model/User.php:1674
#, php-format
msgid ""
"\n"
@@ -3809,12 +3806,12 @@ msgid ""
"\t\t"
msgstr ""
-#: src/Model/User.php:1694
+#: src/Model/User.php:1693
#, php-format
msgid "Registration at %s"
msgstr ""
-#: src/Model/User.php:1718
+#: src/Model/User.php:1717
#, php-format
msgid ""
"\n"
@@ -3823,7 +3820,7 @@ msgid ""
"\t\t\t"
msgstr ""
-#: src/Model/User.php:1726
+#: src/Model/User.php:1725
#, php-format
msgid ""
"\n"
@@ -3854,7 +3851,7 @@ msgid ""
"\t\t\tThank you and welcome to %2$s."
msgstr ""
-#: src/Model/User.php:1788
+#: src/Model/User.php:1787
msgid "User with delegates can't be removed, please remove delegate users first"
msgstr ""
@@ -3885,7 +3882,7 @@ msgstr ""
#: src/Module/Admin/Addons/Details.php:95 src/Module/Admin/Addons/Index.php:59
#: src/Module/Admin/Federation.php:213 src/Module/Admin/Logs/Settings.php:74
#: src/Module/Admin/Logs/View.php:71 src/Module/Admin/Queue.php:59
-#: src/Module/Admin/Site.php:449 src/Module/Admin/Storage.php:124
+#: src/Module/Admin/Site.php:446 src/Module/Admin/Storage.php:124
#: src/Module/Admin/Summary.php:173 src/Module/Admin/Themes/Details.php:82
#: src/Module/Admin/Themes/Index.php:103 src/Module/Admin/Tos.php:63
#: src/Module/Moderation/Users/Create.php:47
@@ -3923,7 +3920,7 @@ msgid "Addon %s failed to install."
msgstr ""
#: src/Module/Admin/Addons/Index.php:61 src/Module/Admin/Features.php:69
-#: src/Module/Admin/Logs/Settings.php:76 src/Module/Admin/Site.php:452
+#: src/Module/Admin/Logs/Settings.php:76 src/Module/Admin/Site.php:449
#: src/Module/Admin/Themes/Index.php:105 src/Module/Admin/Tos.php:72
#: src/Module/Settings/Account.php:507 src/Module/Settings/Addons.php:64
#: src/Module/Settings/Connectors.php:143
@@ -4003,14 +4000,14 @@ msgstr ""
#: src/Module/Admin/Features.php:53
#: src/Module/Notifications/Introductions.php:136
-#: src/Module/OAuth/Acknowledge.php:41 src/Module/Register.php:125
+#: src/Module/OAuth/Acknowledge.php:41 src/Module/Register.php:124
#: src/Module/Settings/TwoFactor/Trusted.php:115
msgid "No"
msgstr ""
#: src/Module/Admin/Features.php:53 src/Module/Contact/Revoke.php:91
#: src/Module/Notifications/Introductions.php:136
-#: src/Module/OAuth/Acknowledge.php:40 src/Module/Register.php:124
+#: src/Module/OAuth/Acknowledge.php:40 src/Module/Register.php:123
#: src/Module/Settings/TwoFactor/Trusted.php:115
msgid "Yes"
msgstr ""
@@ -4124,8 +4121,8 @@ msgid "Enable Debugging"
msgstr ""
#: src/Module/Admin/Logs/Settings.php:80 src/Module/Admin/Logs/Settings.php:81
-#: src/Module/Admin/Logs/Settings.php:82 src/Module/Admin/Site.php:472
-#: src/Module/Admin/Site.php:480
+#: src/Module/Admin/Logs/Settings.php:82 src/Module/Admin/Site.php:469
+#: src/Module/Admin/Site.php:477
msgid "Read-only because it is set by an environment variable"
msgstr ""
@@ -4274,257 +4271,257 @@ msgstr ""
msgid "Priority"
msgstr ""
-#: src/Module/Admin/Site.php:232
+#: src/Module/Admin/Site.php:229
#, php-format
msgid "%s is no valid input for maximum media size"
msgstr ""
-#: src/Module/Admin/Site.php:237
+#: src/Module/Admin/Site.php:234
#, php-format
msgid "%s is no valid input for maximum image size"
msgstr ""
-#: src/Module/Admin/Site.php:364 src/Module/Settings/Display.php:212
+#: src/Module/Admin/Site.php:361 src/Module/Settings/Display.php:212
msgid "No special theme for mobile devices"
msgstr ""
-#: src/Module/Admin/Site.php:381 src/Module/Settings/Display.php:222
+#: src/Module/Admin/Site.php:378 src/Module/Settings/Display.php:222
#, php-format
msgid "%s - (Experimental)"
msgstr ""
-#: src/Module/Admin/Site.php:393
+#: src/Module/Admin/Site.php:390
msgid "No community page"
msgstr ""
-#: src/Module/Admin/Site.php:394
+#: src/Module/Admin/Site.php:391
msgid "No community page for visitors"
msgstr ""
-#: src/Module/Admin/Site.php:395
+#: src/Module/Admin/Site.php:392
msgid "Public postings from users of this site"
msgstr ""
-#: src/Module/Admin/Site.php:396
+#: src/Module/Admin/Site.php:393
msgid "Public postings from the federated network"
msgstr ""
-#: src/Module/Admin/Site.php:397
+#: src/Module/Admin/Site.php:394
msgid "Public postings from local users and the federated network"
msgstr ""
-#: src/Module/Admin/Site.php:403
+#: src/Module/Admin/Site.php:400
msgid "Multi user instance"
msgstr ""
-#: src/Module/Admin/Site.php:426
+#: src/Module/Admin/Site.php:423
msgid "Closed"
msgstr ""
-#: src/Module/Admin/Site.php:427
+#: src/Module/Admin/Site.php:424
msgid "Requires approval"
msgstr ""
-#: src/Module/Admin/Site.php:428
+#: src/Module/Admin/Site.php:425
msgid "Open"
msgstr ""
-#: src/Module/Admin/Site.php:432
+#: src/Module/Admin/Site.php:429
msgid "Don't check"
msgstr ""
-#: src/Module/Admin/Site.php:433
+#: src/Module/Admin/Site.php:430
msgid "check the stable version"
msgstr ""
-#: src/Module/Admin/Site.php:434
+#: src/Module/Admin/Site.php:431
msgid "check the development version"
msgstr ""
-#: src/Module/Admin/Site.php:438
+#: src/Module/Admin/Site.php:435
msgid "none"
msgstr ""
-#: src/Module/Admin/Site.php:439
+#: src/Module/Admin/Site.php:436
msgid "Local contacts"
msgstr ""
-#: src/Module/Admin/Site.php:440
+#: src/Module/Admin/Site.php:437
msgid "Interactors"
msgstr ""
-#: src/Module/Admin/Site.php:450 src/Module/BaseAdmin.php:76
+#: src/Module/Admin/Site.php:447 src/Module/BaseAdmin.php:76
msgid "Site"
msgstr ""
-#: src/Module/Admin/Site.php:451
+#: src/Module/Admin/Site.php:448
msgid "General Information"
msgstr ""
-#: src/Module/Admin/Site.php:453
+#: src/Module/Admin/Site.php:450
msgid "Republish users to directory"
msgstr ""
-#: src/Module/Admin/Site.php:454 src/Module/Register.php:146
+#: src/Module/Admin/Site.php:451 src/Module/Register.php:145
msgid "Registration"
msgstr ""
-#: src/Module/Admin/Site.php:455
+#: src/Module/Admin/Site.php:452
msgid "File upload"
msgstr ""
-#: src/Module/Admin/Site.php:456
+#: src/Module/Admin/Site.php:453
msgid "Policies"
msgstr ""
-#: src/Module/Admin/Site.php:457 src/Module/Calendar/Event/Form.php:238
-#: src/Module/Contact.php:528 src/Module/Profile/Profile.php:267
+#: src/Module/Admin/Site.php:454 src/Module/Calendar/Event/Form.php:238
+#: src/Module/Contact.php:527 src/Module/Profile/Profile.php:267
msgid "Advanced"
msgstr ""
-#: src/Module/Admin/Site.php:458
+#: src/Module/Admin/Site.php:455
msgid "Auto Discovered Contact Directory"
msgstr ""
-#: src/Module/Admin/Site.php:459
+#: src/Module/Admin/Site.php:456
msgid "Performance"
msgstr ""
-#: src/Module/Admin/Site.php:460
+#: src/Module/Admin/Site.php:457
msgid "Worker"
msgstr ""
-#: src/Module/Admin/Site.php:461
+#: src/Module/Admin/Site.php:458
msgid "Message Relay"
msgstr ""
-#: src/Module/Admin/Site.php:462
+#: src/Module/Admin/Site.php:459
msgid "Use the command \"console relay\" in the command line to add or remove relays."
msgstr ""
-#: src/Module/Admin/Site.php:463
+#: src/Module/Admin/Site.php:460
msgid "The system is not subscribed to any relays at the moment."
msgstr ""
-#: src/Module/Admin/Site.php:464
+#: src/Module/Admin/Site.php:461
msgid "The system is currently subscribed to the following relays:"
msgstr ""
-#: src/Module/Admin/Site.php:467
+#: src/Module/Admin/Site.php:464
msgid "Relocate Node"
msgstr ""
-#: src/Module/Admin/Site.php:468
+#: src/Module/Admin/Site.php:465
msgid "Relocating your node enables you to change the DNS domain of this node and keep all the existing users and posts. This process takes a while and can only be started from the relocate console command like this:"
msgstr ""
-#: src/Module/Admin/Site.php:469
+#: src/Module/Admin/Site.php:466
msgid "(Friendica directory)# bin/console relocate https://newdomain.com"
msgstr ""
-#: src/Module/Admin/Site.php:472
+#: src/Module/Admin/Site.php:469
msgid "Site name"
msgstr ""
-#: src/Module/Admin/Site.php:473
+#: src/Module/Admin/Site.php:470
msgid "Sender Email"
msgstr ""
-#: src/Module/Admin/Site.php:473
+#: src/Module/Admin/Site.php:470
msgid "The email address your server shall use to send notification emails from."
msgstr ""
-#: src/Module/Admin/Site.php:474
+#: src/Module/Admin/Site.php:471
msgid "Name of the system actor"
msgstr ""
-#: src/Module/Admin/Site.php:474
+#: src/Module/Admin/Site.php:471
msgid "Name of the internal system account that is used to perform ActivityPub requests. This must be an unused username. If set, this can't be changed again."
msgstr ""
-#: src/Module/Admin/Site.php:475
+#: src/Module/Admin/Site.php:472
msgid "Banner/Logo"
msgstr ""
-#: src/Module/Admin/Site.php:476
+#: src/Module/Admin/Site.php:473
msgid "Email Banner/Logo"
msgstr ""
-#: src/Module/Admin/Site.php:477
+#: src/Module/Admin/Site.php:474
msgid "Shortcut icon"
msgstr ""
-#: src/Module/Admin/Site.php:477
+#: src/Module/Admin/Site.php:474
msgid "Link to an icon that will be used for browsers."
msgstr ""
-#: src/Module/Admin/Site.php:478
+#: src/Module/Admin/Site.php:475
msgid "Touch icon"
msgstr ""
-#: src/Module/Admin/Site.php:478
+#: src/Module/Admin/Site.php:475
msgid "Link to an icon that will be used for tablets and mobiles."
msgstr ""
-#: src/Module/Admin/Site.php:479
+#: src/Module/Admin/Site.php:476
msgid "Additional Info"
msgstr ""
-#: src/Module/Admin/Site.php:479
+#: src/Module/Admin/Site.php:476
#, php-format
msgid "For public servers: you can add additional information here that will be listed at %s/servers."
msgstr ""
-#: src/Module/Admin/Site.php:480
+#: src/Module/Admin/Site.php:477
msgid "System language"
msgstr ""
-#: src/Module/Admin/Site.php:481
+#: src/Module/Admin/Site.php:478
msgid "System theme"
msgstr ""
-#: src/Module/Admin/Site.php:481
+#: src/Module/Admin/Site.php:478
#, php-format
msgid "Default system theme - may be over-ridden by user profiles - Change default theme settings"
msgstr ""
-#: src/Module/Admin/Site.php:482
+#: src/Module/Admin/Site.php:479
msgid "Mobile system theme"
msgstr ""
-#: src/Module/Admin/Site.php:482
+#: src/Module/Admin/Site.php:479
msgid "Theme for mobile devices"
msgstr ""
-#: src/Module/Admin/Site.php:483
+#: src/Module/Admin/Site.php:480
msgid "Force SSL"
msgstr ""
-#: src/Module/Admin/Site.php:483
+#: src/Module/Admin/Site.php:480
msgid "Force all Non-SSL requests to SSL - Attention: on some systems it could lead to endless loops."
msgstr ""
-#: src/Module/Admin/Site.php:484
+#: src/Module/Admin/Site.php:481
msgid "Show help entry from navigation menu"
msgstr ""
-#: src/Module/Admin/Site.php:484
+#: src/Module/Admin/Site.php:481
msgid "Displays the menu entry for the Help pages from the navigation menu. It is always accessible by calling /help directly."
msgstr ""
-#: src/Module/Admin/Site.php:485
+#: src/Module/Admin/Site.php:482
msgid "Single user instance"
msgstr ""
-#: src/Module/Admin/Site.php:485
+#: src/Module/Admin/Site.php:482
msgid "Make this instance multi-user or single-user for the named user"
msgstr ""
-#: src/Module/Admin/Site.php:487
+#: src/Module/Admin/Site.php:484
msgid "Maximum image size"
msgstr ""
-#: src/Module/Admin/Site.php:487
+#: src/Module/Admin/Site.php:484
#, php-format
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no limits. You can put k, m, or g behind the desired value for KiB, MiB, GiB, respectively.\n"
@@ -4532,27 +4529,27 @@ msgid ""
"\t\t\t\t\t\t\t\t\t\t\t\t\tCurrently upload_max_filesize
is set to %s (%s byte)"
msgstr ""
-#: src/Module/Admin/Site.php:491
+#: src/Module/Admin/Site.php:488
msgid "Maximum image length"
msgstr ""
-#: src/Module/Admin/Site.php:491
+#: src/Module/Admin/Site.php:488
msgid "Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits."
msgstr ""
-#: src/Module/Admin/Site.php:492
+#: src/Module/Admin/Site.php:489
msgid "JPEG image quality"
msgstr ""
-#: src/Module/Admin/Site.php:492
+#: src/Module/Admin/Site.php:489
msgid "Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality."
msgstr ""
-#: src/Module/Admin/Site.php:493
+#: src/Module/Admin/Site.php:490
msgid "Maximum media file size"
msgstr ""
-#: src/Module/Admin/Site.php:493
+#: src/Module/Admin/Site.php:490
#, php-format
msgid ""
"Maximum size in bytes of uploaded media files. Default is 0, which means no limits. You can put k, m, or g behind the desired value for KiB, MiB, GiB, respectively.\n"
@@ -4560,747 +4557,747 @@ msgid ""
"\t\t\t\t\t\t\t\t\t\t\t\t\tCurrently upload_max_filesize
is set to %s (%s byte)"
msgstr ""
-#: src/Module/Admin/Site.php:498
+#: src/Module/Admin/Site.php:495
msgid "Register policy"
msgstr ""
-#: src/Module/Admin/Site.php:499
+#: src/Module/Admin/Site.php:496
msgid "Maximum Users"
msgstr ""
-#: src/Module/Admin/Site.php:499
+#: src/Module/Admin/Site.php:496
msgid "If defined, the register policy is automatically closed when the given number of users is reached and reopens the registry when the number drops below the limit. It only works when the policy is set to open or close, but not when the policy is set to approval."
msgstr ""
-#: src/Module/Admin/Site.php:500
+#: src/Module/Admin/Site.php:497
msgid "Maximum Daily Registrations"
msgstr ""
-#: src/Module/Admin/Site.php:500
+#: src/Module/Admin/Site.php:497
msgid "If registration is permitted above, this sets the maximum number of new user registrations to accept per day. If register is set to closed, this setting has no effect."
msgstr ""
-#: src/Module/Admin/Site.php:501
+#: src/Module/Admin/Site.php:498
msgid "Register text"
msgstr ""
-#: src/Module/Admin/Site.php:501
+#: src/Module/Admin/Site.php:498
msgid "Will be displayed prominently on the registration page. You can use BBCode here."
msgstr ""
-#: src/Module/Admin/Site.php:502
+#: src/Module/Admin/Site.php:499
msgid "Forbidden Nicknames"
msgstr ""
-#: src/Module/Admin/Site.php:502
+#: src/Module/Admin/Site.php:499
msgid "Comma separated list of nicknames that are forbidden from registration. Preset is a list of role names according RFC 2142."
msgstr ""
-#: src/Module/Admin/Site.php:503
+#: src/Module/Admin/Site.php:500
msgid "Accounts abandoned after x days"
msgstr ""
-#: src/Module/Admin/Site.php:503
+#: src/Module/Admin/Site.php:500
msgid "Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."
msgstr ""
-#: src/Module/Admin/Site.php:504
+#: src/Module/Admin/Site.php:501
msgid "Allowed friend domains"
msgstr ""
-#: src/Module/Admin/Site.php:504
+#: src/Module/Admin/Site.php:501
msgid "Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: src/Module/Admin/Site.php:505
+#: src/Module/Admin/Site.php:502
msgid "Allowed email domains"
msgstr ""
-#: src/Module/Admin/Site.php:505
+#: src/Module/Admin/Site.php:502
msgid "Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: src/Module/Admin/Site.php:506
+#: src/Module/Admin/Site.php:503
msgid "Disallowed email domains"
msgstr ""
-#: src/Module/Admin/Site.php:506
+#: src/Module/Admin/Site.php:503
msgid "Comma separated list of domains which are rejected as email addresses for registrations to this site. Wildcards are accepted."
msgstr ""
-#: src/Module/Admin/Site.php:507
+#: src/Module/Admin/Site.php:504
msgid "No OEmbed rich content"
msgstr ""
-#: src/Module/Admin/Site.php:507
+#: src/Module/Admin/Site.php:504
msgid "Don't show the rich content (e.g. embedded PDF), except from the domains listed below."
msgstr ""
-#: src/Module/Admin/Site.php:508
+#: src/Module/Admin/Site.php:505
msgid "Trusted third-party domains"
msgstr ""
-#: src/Module/Admin/Site.php:508
+#: src/Module/Admin/Site.php:505
msgid "Comma separated list of domains from which content is allowed to be embedded in posts like with OEmbed. All sub-domains of the listed domains are allowed as well."
msgstr ""
-#: src/Module/Admin/Site.php:509
+#: src/Module/Admin/Site.php:506
msgid "Block public"
msgstr ""
-#: src/Module/Admin/Site.php:509
+#: src/Module/Admin/Site.php:506
msgid "Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."
msgstr ""
-#: src/Module/Admin/Site.php:510
+#: src/Module/Admin/Site.php:507
msgid "Force publish"
msgstr ""
-#: src/Module/Admin/Site.php:510
+#: src/Module/Admin/Site.php:507
msgid "Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: src/Module/Admin/Site.php:510
+#: src/Module/Admin/Site.php:507
msgid "Enabling this may violate privacy laws like the GDPR"
msgstr ""
-#: src/Module/Admin/Site.php:511
+#: src/Module/Admin/Site.php:508
msgid "Global directory URL"
msgstr ""
-#: src/Module/Admin/Site.php:511
+#: src/Module/Admin/Site.php:508
msgid "URL to the global directory. If this is not set, the global directory is completely unavailable to the application."
msgstr ""
-#: src/Module/Admin/Site.php:512
+#: src/Module/Admin/Site.php:509
msgid "Private posts by default for new users"
msgstr ""
-#: src/Module/Admin/Site.php:512
+#: src/Module/Admin/Site.php:509
msgid "Set default post permissions for all new members to the default privacy circle rather than public."
msgstr ""
-#: src/Module/Admin/Site.php:513
+#: src/Module/Admin/Site.php:510
msgid "Don't include post content in email notifications"
msgstr ""
-#: src/Module/Admin/Site.php:513
+#: src/Module/Admin/Site.php:510
msgid "Don't include the content of a post/comment/private message/etc. in the email notifications that are sent out from this site, as a privacy measure."
msgstr ""
-#: src/Module/Admin/Site.php:514
+#: src/Module/Admin/Site.php:511
msgid "Disallow public access to addons listed in the apps menu."
msgstr ""
-#: src/Module/Admin/Site.php:514
+#: src/Module/Admin/Site.php:511
msgid "Checking this box will restrict addons listed in the apps menu to members only."
msgstr ""
-#: src/Module/Admin/Site.php:515
+#: src/Module/Admin/Site.php:512
msgid "Don't embed private images in posts"
msgstr ""
-#: src/Module/Admin/Site.php:515
+#: src/Module/Admin/Site.php:512
msgid "Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while."
msgstr ""
-#: src/Module/Admin/Site.php:516
+#: src/Module/Admin/Site.php:513
msgid "Explicit Content"
msgstr ""
-#: src/Module/Admin/Site.php:516
+#: src/Module/Admin/Site.php:513
msgid "Set this to announce that your node is used mostly for explicit content that might not be suited for minors. This information will be published in the node information and might be used, e.g. by the global directory, to filter your node from listings of nodes to join. Additionally a note about this will be shown at the user registration page."
msgstr ""
-#: src/Module/Admin/Site.php:517
+#: src/Module/Admin/Site.php:514
msgid "Only local search"
msgstr ""
-#: src/Module/Admin/Site.php:517
+#: src/Module/Admin/Site.php:514
msgid "Blocks search for users who are not logged in to prevent crawlers from blocking your system."
msgstr ""
-#: src/Module/Admin/Site.php:518
+#: src/Module/Admin/Site.php:515
msgid "Blocked tags for trending tags"
msgstr ""
-#: src/Module/Admin/Site.php:518
+#: src/Module/Admin/Site.php:515
msgid "Comma separated list of hashtags that shouldn't be displayed in the trending tags."
msgstr ""
-#: src/Module/Admin/Site.php:519
+#: src/Module/Admin/Site.php:516
msgid "Cache contact avatars"
msgstr ""
-#: src/Module/Admin/Site.php:519
+#: src/Module/Admin/Site.php:516
msgid "Locally store the avatar pictures of the contacts. This uses a lot of storage space but it increases the performance."
msgstr ""
-#: src/Module/Admin/Site.php:520
+#: src/Module/Admin/Site.php:517
msgid "Allow Users to set remote_self"
msgstr ""
-#: src/Module/Admin/Site.php:520
+#: src/Module/Admin/Site.php:517
msgid "With checking this, every user is allowed to mark every contact as a remote_self in the repair contact dialog. Setting this flag on a contact causes mirroring every posting of that contact in the users stream."
msgstr ""
-#: src/Module/Admin/Site.php:521
+#: src/Module/Admin/Site.php:518
msgid "Allow Users to set up relay channels"
msgstr ""
-#: src/Module/Admin/Site.php:521
+#: src/Module/Admin/Site.php:518
msgid "If enabled, it is possible to create relay users that are used to reshare content based on user defined channels."
msgstr ""
-#: src/Module/Admin/Site.php:522
+#: src/Module/Admin/Site.php:519
msgid "Adjust the feed poll frequency"
msgstr ""
-#: src/Module/Admin/Site.php:522
+#: src/Module/Admin/Site.php:519
msgid "Automatically detect and set the best feed poll frequency."
msgstr ""
-#: src/Module/Admin/Site.php:523
+#: src/Module/Admin/Site.php:520
msgid "Minimum poll interval"
msgstr ""
-#: src/Module/Admin/Site.php:523
+#: src/Module/Admin/Site.php:520
msgid "Minimal distance in minutes between two polls for mail and feed contacts. Reasonable values are between 1 and 59."
msgstr ""
-#: src/Module/Admin/Site.php:524
+#: src/Module/Admin/Site.php:521
msgid "Enable multiple registrations"
msgstr ""
-#: src/Module/Admin/Site.php:524
+#: src/Module/Admin/Site.php:521
msgid "Enable users to register additional accounts for use as pages."
msgstr ""
-#: src/Module/Admin/Site.php:525
+#: src/Module/Admin/Site.php:522
msgid "Enable OpenID"
msgstr ""
-#: src/Module/Admin/Site.php:525
+#: src/Module/Admin/Site.php:522
msgid "Enable OpenID support for registration and logins."
msgstr ""
-#: src/Module/Admin/Site.php:526
+#: src/Module/Admin/Site.php:523
msgid "Enable full name check"
msgstr ""
-#: src/Module/Admin/Site.php:526
+#: src/Module/Admin/Site.php:523
msgid "Prevents users from registering with a display name with fewer than two parts separated by spaces."
msgstr ""
-#: src/Module/Admin/Site.php:527
+#: src/Module/Admin/Site.php:524
msgid "Email administrators on new registration"
msgstr ""
-#: src/Module/Admin/Site.php:527
+#: src/Module/Admin/Site.php:524
msgid "If enabled and the system is set to an open registration, an email for each new registration is sent to the administrators."
msgstr ""
-#: src/Module/Admin/Site.php:528
+#: src/Module/Admin/Site.php:525
msgid "Community pages for visitors"
msgstr ""
-#: src/Module/Admin/Site.php:528
+#: src/Module/Admin/Site.php:525
msgid "Which community pages should be available for visitors. Local users always see both pages."
msgstr ""
-#: src/Module/Admin/Site.php:529
+#: src/Module/Admin/Site.php:526
msgid "Posts per user on community page"
msgstr ""
-#: src/Module/Admin/Site.php:529
+#: src/Module/Admin/Site.php:526
msgid "The maximum number of posts per user on the local community page. This is useful, when a single user floods the local community page."
msgstr ""
-#: src/Module/Admin/Site.php:530
+#: src/Module/Admin/Site.php:527
msgid "Posts per server on community page"
msgstr ""
-#: src/Module/Admin/Site.php:530
+#: src/Module/Admin/Site.php:527
msgid "The maximum number of posts per server on the global community page. This is useful, when posts from a single server flood the global community page."
msgstr ""
-#: src/Module/Admin/Site.php:532
+#: src/Module/Admin/Site.php:529
msgid "Enable Mail support"
msgstr ""
-#: src/Module/Admin/Site.php:532
+#: src/Module/Admin/Site.php:529
msgid "Enable built-in mail support to poll IMAP folders and to reply via mail."
msgstr ""
-#: src/Module/Admin/Site.php:533
+#: src/Module/Admin/Site.php:530
msgid "Mail support can't be enabled because the PHP IMAP module is not installed."
msgstr ""
-#: src/Module/Admin/Site.php:535
+#: src/Module/Admin/Site.php:532
msgid "Diaspora support can't be enabled because Friendica was installed into a sub directory."
msgstr ""
-#: src/Module/Admin/Site.php:536
+#: src/Module/Admin/Site.php:533
msgid "Enable Diaspora support"
msgstr ""
-#: src/Module/Admin/Site.php:536
+#: src/Module/Admin/Site.php:533
msgid "Enable built-in Diaspora network compatibility for communicating with diaspora servers."
msgstr ""
-#: src/Module/Admin/Site.php:537
+#: src/Module/Admin/Site.php:534
msgid "Verify SSL"
msgstr ""
-#: src/Module/Admin/Site.php:537
+#: src/Module/Admin/Site.php:534
msgid "If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."
msgstr ""
-#: src/Module/Admin/Site.php:538
+#: src/Module/Admin/Site.php:535
msgid "Proxy user"
msgstr ""
-#: src/Module/Admin/Site.php:538
+#: src/Module/Admin/Site.php:535
msgid "User name for the proxy server."
msgstr ""
-#: src/Module/Admin/Site.php:539
+#: src/Module/Admin/Site.php:536
msgid "Proxy URL"
msgstr ""
-#: src/Module/Admin/Site.php:539
+#: src/Module/Admin/Site.php:536
msgid "If you want to use a proxy server that Friendica should use to connect to the network, put the URL of the proxy here."
msgstr ""
-#: src/Module/Admin/Site.php:540
+#: src/Module/Admin/Site.php:537
msgid "Network timeout"
msgstr ""
-#: src/Module/Admin/Site.php:540
+#: src/Module/Admin/Site.php:537
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: src/Module/Admin/Site.php:541
+#: src/Module/Admin/Site.php:538
msgid "Maximum Load Average"
msgstr ""
-#: src/Module/Admin/Site.php:541
+#: src/Module/Admin/Site.php:538
#, php-format
msgid "Maximum system load before delivery and poll processes are deferred - default %d."
msgstr ""
-#: src/Module/Admin/Site.php:542
+#: src/Module/Admin/Site.php:539
msgid "Minimal Memory"
msgstr ""
-#: src/Module/Admin/Site.php:542
+#: src/Module/Admin/Site.php:539
msgid "Minimal free memory in MB for the worker. Needs access to /proc/meminfo - default 0 (deactivated)."
msgstr ""
-#: src/Module/Admin/Site.php:543
+#: src/Module/Admin/Site.php:540
msgid "Periodically optimize tables"
msgstr ""
-#: src/Module/Admin/Site.php:543
+#: src/Module/Admin/Site.php:540
msgid "Periodically optimize tables like the cache and the workerqueue"
msgstr ""
-#: src/Module/Admin/Site.php:545
+#: src/Module/Admin/Site.php:542
msgid "Discover followers/followings from contacts"
msgstr ""
-#: src/Module/Admin/Site.php:545
+#: src/Module/Admin/Site.php:542
msgid "If enabled, contacts are checked for their followers and following contacts."
msgstr ""
-#: src/Module/Admin/Site.php:546
+#: src/Module/Admin/Site.php:543
msgid "None - deactivated"
msgstr ""
-#: src/Module/Admin/Site.php:547
+#: src/Module/Admin/Site.php:544
msgid "Local contacts - contacts of our local contacts are discovered for their followers/followings."
msgstr ""
-#: src/Module/Admin/Site.php:548
+#: src/Module/Admin/Site.php:545
msgid "Interactors - contacts of our local contacts and contacts who interacted on locally visible postings are discovered for their followers/followings."
msgstr ""
-#: src/Module/Admin/Site.php:550
+#: src/Module/Admin/Site.php:547
msgid "Only update contacts/servers with local data"
msgstr ""
-#: src/Module/Admin/Site.php:550
+#: src/Module/Admin/Site.php:547
msgid "If enabled, the system will only look for changes in contacts and servers that engaged on this system by either being in a contact list of a user or when posts or comments exists from the contact on this system."
msgstr ""
-#: src/Module/Admin/Site.php:551
+#: src/Module/Admin/Site.php:548
msgid "Only update contacts with relations"
msgstr ""
-#: src/Module/Admin/Site.php:551
+#: src/Module/Admin/Site.php:548
msgid "If enabled, the system will only look for changes in contacts that are in a contact list of a user on this system."
msgstr ""
-#: src/Module/Admin/Site.php:552
+#: src/Module/Admin/Site.php:549
msgid "Synchronize the contacts with the directory server"
msgstr ""
-#: src/Module/Admin/Site.php:552
+#: src/Module/Admin/Site.php:549
msgid "if enabled, the system will check periodically for new contacts on the defined directory server."
msgstr ""
-#: src/Module/Admin/Site.php:554
+#: src/Module/Admin/Site.php:551
msgid "Discover contacts from other servers"
msgstr ""
-#: src/Module/Admin/Site.php:554
+#: src/Module/Admin/Site.php:551
msgid "Periodically query other servers for contacts and servers that they know of. The system queries Friendica, Mastodon and Hubzilla servers. Keep it deactivated on small machines to decrease the database size and load."
msgstr ""
-#: src/Module/Admin/Site.php:555
+#: src/Module/Admin/Site.php:552
msgid "Days between requery"
msgstr ""
-#: src/Module/Admin/Site.php:555
+#: src/Module/Admin/Site.php:552
msgid "Number of days after which a server is requeried for their contacts and servers it knows of. This is only used when the discovery is activated."
msgstr ""
-#: src/Module/Admin/Site.php:556
+#: src/Module/Admin/Site.php:553
msgid "Search the local directory"
msgstr ""
-#: src/Module/Admin/Site.php:556
+#: src/Module/Admin/Site.php:553
msgid "Search the local directory instead of the global directory. When searching locally, every search will be executed on the global directory in the background. This improves the search results when the search is repeated."
msgstr ""
-#: src/Module/Admin/Site.php:558
+#: src/Module/Admin/Site.php:555
msgid "Publish server information"
msgstr ""
-#: src/Module/Admin/Site.php:558
+#: src/Module/Admin/Site.php:555
msgid "If enabled, general server and usage data will be published. The data contains the name and version of the server, number of users with public profiles, number of posts and the activated protocols and connectors. See the-federation.info for details."
msgstr ""
-#: src/Module/Admin/Site.php:560
+#: src/Module/Admin/Site.php:557
msgid "Check upstream version"
msgstr ""
-#: src/Module/Admin/Site.php:560
+#: src/Module/Admin/Site.php:557
msgid "Enables checking for new Friendica versions at github. If there is a new version, you will be informed in the admin panel overview."
msgstr ""
-#: src/Module/Admin/Site.php:561
+#: src/Module/Admin/Site.php:558
msgid "Suppress Tags"
msgstr ""
-#: src/Module/Admin/Site.php:561
+#: src/Module/Admin/Site.php:558
msgid "Suppress showing a list of hashtags at the end of the posting."
msgstr ""
-#: src/Module/Admin/Site.php:562
+#: src/Module/Admin/Site.php:559
msgid "Clean database"
msgstr ""
-#: src/Module/Admin/Site.php:562
+#: src/Module/Admin/Site.php:559
msgid "Remove old remote items, orphaned database records and old content from some other helper tables."
msgstr ""
-#: src/Module/Admin/Site.php:563
+#: src/Module/Admin/Site.php:560
msgid "Lifespan of remote items"
msgstr ""
-#: src/Module/Admin/Site.php:563
+#: src/Module/Admin/Site.php:560
msgid "When the database cleanup is enabled, this defines the days after which remote items will be deleted. Own items, and marked or filed items are always kept. 0 disables this behaviour."
msgstr ""
-#: src/Module/Admin/Site.php:564
+#: src/Module/Admin/Site.php:561
msgid "Lifespan of unclaimed items"
msgstr ""
-#: src/Module/Admin/Site.php:564
+#: src/Module/Admin/Site.php:561
msgid "When the database cleanup is enabled, this defines the days after which unclaimed remote items (mostly content from the relay) will be deleted. Default value is 90 days. Defaults to the general lifespan value of remote items if set to 0."
msgstr ""
-#: src/Module/Admin/Site.php:565
+#: src/Module/Admin/Site.php:562
msgid "Lifespan of raw conversation data"
msgstr ""
-#: src/Module/Admin/Site.php:565
+#: src/Module/Admin/Site.php:562
msgid "The conversation data is used for ActivityPub, as well as for debug purposes. It should be safe to remove it after 14 days, default is 90 days."
msgstr ""
-#: src/Module/Admin/Site.php:566
+#: src/Module/Admin/Site.php:563
msgid "Maximum numbers of comments per post"
msgstr ""
-#: src/Module/Admin/Site.php:566
+#: src/Module/Admin/Site.php:563
msgid "How much comments should be shown for each post? Default value is 100."
msgstr ""
-#: src/Module/Admin/Site.php:567
+#: src/Module/Admin/Site.php:564
msgid "Maximum numbers of comments per post on the display page"
msgstr ""
-#: src/Module/Admin/Site.php:567
+#: src/Module/Admin/Site.php:564
msgid "How many comments should be shown on the single view for each post? Default value is 1000."
msgstr ""
-#: src/Module/Admin/Site.php:568
+#: src/Module/Admin/Site.php:565
msgid "Items per page"
msgstr ""
-#: src/Module/Admin/Site.php:568
+#: src/Module/Admin/Site.php:565
msgid "Number of items per page in stream pages (network, community, profile/contact statuses, search)."
msgstr ""
-#: src/Module/Admin/Site.php:569
+#: src/Module/Admin/Site.php:566
msgid "Items per page for mobile devices"
msgstr ""
-#: src/Module/Admin/Site.php:569
+#: src/Module/Admin/Site.php:566
msgid "Number of items per page in stream pages (network, community, profile/contact statuses, search) for mobile devices."
msgstr ""
-#: src/Module/Admin/Site.php:570
+#: src/Module/Admin/Site.php:567
msgid "Temp path"
msgstr ""
-#: src/Module/Admin/Site.php:570
+#: src/Module/Admin/Site.php:567
msgid "If you have a restricted system where the webserver can't access the system temp path, enter another path here."
msgstr ""
-#: src/Module/Admin/Site.php:571
+#: src/Module/Admin/Site.php:568
msgid "Only search in tags"
msgstr ""
-#: src/Module/Admin/Site.php:571
+#: src/Module/Admin/Site.php:568
msgid "On large systems the text search can slow down the system extremely."
msgstr ""
-#: src/Module/Admin/Site.php:572
+#: src/Module/Admin/Site.php:569
msgid "Limited search scope"
msgstr ""
-#: src/Module/Admin/Site.php:572
+#: src/Module/Admin/Site.php:569
msgid "If enabled, searches will only be performed in the data used for the channels and not in all posts."
msgstr ""
-#: src/Module/Admin/Site.php:573
+#: src/Module/Admin/Site.php:570
msgid "Maximum age of items in the search table"
msgstr ""
-#: src/Module/Admin/Site.php:573
+#: src/Module/Admin/Site.php:570
msgid "Maximum age of items in the search table in days. Lower values will increase the performance and reduce disk usage. 0 means no age restriction."
msgstr ""
-#: src/Module/Admin/Site.php:574
+#: src/Module/Admin/Site.php:571
msgid "Generate counts per contact circle when calculating network count"
msgstr ""
-#: src/Module/Admin/Site.php:574
+#: src/Module/Admin/Site.php:571
msgid "On systems with users that heavily use contact circles the query can be very expensive."
msgstr ""
-#: src/Module/Admin/Site.php:575
+#: src/Module/Admin/Site.php:572
msgid "Process \"view\" activities"
msgstr ""
-#: src/Module/Admin/Site.php:575
+#: src/Module/Admin/Site.php:572
msgid "\"view\" activities are mostly geberated by Peertube systems. Per default they are not processed for performance reasons. Only activate this option on performant system."
msgstr ""
-#: src/Module/Admin/Site.php:576
+#: src/Module/Admin/Site.php:573
msgid "Days, after which a contact is archived"
msgstr ""
-#: src/Module/Admin/Site.php:576
+#: src/Module/Admin/Site.php:573
msgid "Number of days that we try to deliver content or to update the contact data before we archive a contact."
msgstr ""
-#: src/Module/Admin/Site.php:578
+#: src/Module/Admin/Site.php:575
msgid "Maximum number of parallel workers"
msgstr ""
-#: src/Module/Admin/Site.php:578
+#: src/Module/Admin/Site.php:575
#, php-format
msgid "On shared hosters set this to %d. On larger systems, values of %d are great. Default value is %d."
msgstr ""
-#: src/Module/Admin/Site.php:579
+#: src/Module/Admin/Site.php:576
msgid "Maximum load for workers"
msgstr ""
-#: src/Module/Admin/Site.php:579
+#: src/Module/Admin/Site.php:576
msgid "Maximum load that causes a cooldown before each worker function call."
msgstr ""
-#: src/Module/Admin/Site.php:580
+#: src/Module/Admin/Site.php:577
msgid "Enable fastlane"
msgstr ""
-#: src/Module/Admin/Site.php:580
+#: src/Module/Admin/Site.php:577
msgid "When enabed, the fastlane mechanism starts an additional worker if processes with higher priority are blocked by processes of lower priority."
msgstr ""
-#: src/Module/Admin/Site.php:581
+#: src/Module/Admin/Site.php:578
msgid "Decoupled receiver"
msgstr ""
-#: src/Module/Admin/Site.php:581
+#: src/Module/Admin/Site.php:578
msgid "Decouple incoming ActivityPub posts by processing them in the background via a worker process. Only enable this on fast systems."
msgstr ""
-#: src/Module/Admin/Site.php:582
+#: src/Module/Admin/Site.php:579
msgid "Cron interval"
msgstr ""
-#: src/Module/Admin/Site.php:582
+#: src/Module/Admin/Site.php:579
msgid "Minimal period in minutes between two calls of the \"Cron\" worker job."
msgstr ""
-#: src/Module/Admin/Site.php:583
+#: src/Module/Admin/Site.php:580
msgid "Worker defer limit"
msgstr ""
-#: src/Module/Admin/Site.php:583
+#: src/Module/Admin/Site.php:580
msgid "Per default the systems tries delivering for 15 times before dropping it."
msgstr ""
-#: src/Module/Admin/Site.php:584
+#: src/Module/Admin/Site.php:581
msgid "Worker fetch limit"
msgstr ""
-#: src/Module/Admin/Site.php:584
+#: src/Module/Admin/Site.php:581
msgid "Number of worker tasks that are fetched in a single query. Higher values should increase the performance, too high values will mostly likely decrease it. Only change it, when you know how to measure the performance of your system."
msgstr ""
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:583
msgid "Direct relay transfer"
msgstr ""
-#: src/Module/Admin/Site.php:586
+#: src/Module/Admin/Site.php:583
msgid "Enables the direct transfer to other servers without using the relay servers"
msgstr ""
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:584
msgid "Relay scope"
msgstr ""
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:584
msgid "Can be \"all\" or \"tags\". \"all\" means that every public post should be received. \"tags\" means that only posts with selected tags should be received."
msgstr ""
-#: src/Module/Admin/Site.php:587 src/Module/Contact/Profile.php:315
+#: src/Module/Admin/Site.php:584 src/Module/Contact/Profile.php:315
#: src/Module/Settings/Display.php:259
#: src/Module/Settings/TwoFactor/Index.php:132
msgid "Disabled"
msgstr ""
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:584
msgid "all"
msgstr ""
-#: src/Module/Admin/Site.php:587
+#: src/Module/Admin/Site.php:584
msgid "tags"
msgstr ""
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:585
msgid "Server tags"
msgstr ""
-#: src/Module/Admin/Site.php:588
+#: src/Module/Admin/Site.php:585
msgid "Comma separated list of tags for the \"tags\" subscription."
msgstr ""
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:586
msgid "Deny Server tags"
msgstr ""
-#: src/Module/Admin/Site.php:589
+#: src/Module/Admin/Site.php:586
msgid "Comma separated list of tags that are rejected."
msgstr ""
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:587
msgid "Maximum amount of tags"
msgstr ""
-#: src/Module/Admin/Site.php:590
+#: src/Module/Admin/Site.php:587
msgid "Maximum amount of tags in a post before it is rejected as spam. The post has to contain at least one link. Posts from subscribed accounts will not be rejected."
msgstr ""
-#: src/Module/Admin/Site.php:591
+#: src/Module/Admin/Site.php:588
msgid "Allow user tags"
msgstr ""
-#: src/Module/Admin/Site.php:591
+#: src/Module/Admin/Site.php:588
msgid "If enabled, the tags from the saved searches will used for the \"tags\" subscription in addition to the \"relay_server_tags\"."
msgstr ""
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:589
msgid "Deny undetected languages"
msgstr ""
-#: src/Module/Admin/Site.php:592
+#: src/Module/Admin/Site.php:589
msgid "If enabled, posts with undetected languages will be rejected."
msgstr ""
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:590
msgid "Language Quality"
msgstr ""
-#: src/Module/Admin/Site.php:593
+#: src/Module/Admin/Site.php:590
msgid "The minimum language quality that is required to accept the post."
msgstr ""
-#: src/Module/Admin/Site.php:594
+#: src/Module/Admin/Site.php:591
msgid "Number of languages for the language detection"
msgstr ""
-#: src/Module/Admin/Site.php:594
+#: src/Module/Admin/Site.php:591
msgid "The system detects a list of languages per post. Only if the desired languages are in the list, the message will be accepted. The higher the number, the more posts will be falsely detected."
msgstr ""
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:593
msgid "Maximum age of channel"
msgstr ""
-#: src/Module/Admin/Site.php:596
+#: src/Module/Admin/Site.php:593
msgid "This defines the maximum age in hours of items that should be displayed in channels. This affects the channel performance."
msgstr ""
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:594
msgid "Maximum number of channel posts"
msgstr ""
-#: src/Module/Admin/Site.php:597
+#: src/Module/Admin/Site.php:594
msgid "For performance reasons, the channels use a dedicated table to store content. The higher the value the slower the channels."
msgstr ""
-#: src/Module/Admin/Site.php:598
+#: src/Module/Admin/Site.php:595
msgid "Interaction score days"
msgstr ""
-#: src/Module/Admin/Site.php:598
+#: src/Module/Admin/Site.php:595
msgid "Number of days that are used to calculate the interaction score."
msgstr ""
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:596
msgid "Maximum number of posts per author"
msgstr ""
-#: src/Module/Admin/Site.php:599
+#: src/Module/Admin/Site.php:596
msgid "Maximum number of posts per page by author if the contact frequency is set to \"Display only few posts\". If there are more posts, then the post with the most interactions will be displayed."
msgstr ""
-#: src/Module/Admin/Site.php:600
+#: src/Module/Admin/Site.php:597
msgid "Sharer interaction days"
msgstr ""
-#: src/Module/Admin/Site.php:600
+#: src/Module/Admin/Site.php:597
msgid "Number of days of the last interaction that are used to define which sharers are used for the \"sharers of sharers\" channel."
msgstr ""
-#: src/Module/Admin/Site.php:603
+#: src/Module/Admin/Site.php:600
msgid "Start Relocation"
msgstr ""
@@ -5579,7 +5576,7 @@ msgstr ""
msgid "Applications"
msgstr ""
-#: src/Module/Attach.php:35 src/Module/Attach.php:47
+#: src/Module/Attach.php:34 src/Module/Attach.php:46
msgid "Item was not found."
msgstr ""
@@ -5656,26 +5653,26 @@ msgstr ""
msgid "User registrations waiting for confirmation"
msgstr ""
-#: src/Module/BaseApi.php:443 src/Module/BaseApi.php:459
-#: src/Module/BaseApi.php:475
+#: src/Module/BaseApi.php:442 src/Module/BaseApi.php:458
+#: src/Module/BaseApi.php:474
msgid "Too Many Requests"
msgstr ""
-#: src/Module/BaseApi.php:444
+#: src/Module/BaseApi.php:443
#, php-format
msgid "Daily posting limit of %d post reached. The post was rejected."
msgid_plural "Daily posting limit of %d posts reached. The post was rejected."
msgstr[0] ""
msgstr[1] ""
-#: src/Module/BaseApi.php:460
+#: src/Module/BaseApi.php:459
#, php-format
msgid "Weekly posting limit of %d post reached. The post was rejected."
msgid_plural "Weekly posting limit of %d posts reached. The post was rejected."
msgstr[0] ""
msgstr[1] ""
-#: src/Module/BaseApi.php:476
+#: src/Module/BaseApi.php:475
#, php-format
msgid "Monthly posting limit of %d post reached. The post was rejected."
msgid_plural "Monthly posting limit of %d posts reached. The post was rejected."
@@ -5694,8 +5691,8 @@ msgstr ""
msgid "Reports"
msgstr ""
-#: src/Module/BaseModeration.php:102 src/Module/Moderation/Users/Index.php:137
-#: src/Module/Moderation/Users/Index.php:147
+#: src/Module/BaseModeration.php:102 src/Module/Moderation/Users/Index.php:97
+#: src/Module/Moderation/Users/Index.php:107
msgid "Users"
msgstr ""
@@ -5719,7 +5716,7 @@ msgstr ""
msgid "Item Source"
msgstr ""
-#: src/Module/BaseProfile.php:37 src/Module/Contact.php:488
+#: src/Module/BaseProfile.php:37 src/Module/Contact.php:487
msgid "Profile Details"
msgstr ""
@@ -5743,21 +5740,21 @@ msgstr ""
msgid "Tips for New Members"
msgstr ""
-#: src/Module/BaseSearch.php:57
+#: src/Module/BaseSearch.php:56
#, php-format
msgid "People Search - %s"
msgstr ""
-#: src/Module/BaseSearch.php:61
+#: src/Module/BaseSearch.php:60
#, php-format
msgid "Group Search - %s"
msgstr ""
-#: src/Module/BaseSearch.php:107 src/Module/Contact/MatchInterests.php:136
+#: src/Module/BaseSearch.php:114 src/Module/Contact/MatchInterests.php:136
msgid "No matches"
msgstr ""
-#: src/Module/BaseSearch.php:133
+#: src/Module/BaseSearch.php:140
#, php-format
msgid "%d result was filtered out because your node blocks the domain it is registered on. You can review the list of domains your node is currently blocking in the About page."
msgid_plural "%d results were filtered out because your node blocks the domain they are registered on. You can review the list of domains your node is currently blocking in the About page."
@@ -5858,7 +5855,7 @@ msgstr ""
#: src/Module/Moderation/Blocklist/Server/Index.php:76
#: src/Module/Moderation/Blocklist/Server/Index.php:104
#: src/Module/Moderation/Blocklist/Server/Index.php:105
-#: src/Module/Moderation/Item/Delete.php:53 src/Module/Register.php:142
+#: src/Module/Moderation/Item/Delete.php:53 src/Module/Register.php:141
#: src/Module/Security/TwoFactor/Verify.php:87
#: src/Module/Settings/Channels.php:176 src/Module/Settings/Channels.php:197
#: src/Module/Settings/TwoFactor/Index.php:147
@@ -6027,149 +6024,149 @@ msgstr ""
msgid "Add contact to circle"
msgstr ""
-#: src/Module/Contact.php:88
+#: src/Module/Contact.php:87
#, php-format
msgid "%d contact edited."
msgid_plural "%d contacts edited."
msgstr[0] ""
msgstr[1] ""
-#: src/Module/Contact.php:328
+#: src/Module/Contact.php:327
msgid "Show all contacts"
msgstr ""
-#: src/Module/Contact.php:333 src/Module/Contact.php:412
+#: src/Module/Contact.php:332 src/Module/Contact.php:411
#: src/Module/Moderation/BaseUsers.php:74
msgid "Pending"
msgstr ""
-#: src/Module/Contact.php:336
+#: src/Module/Contact.php:335
msgid "Only show pending contacts"
msgstr ""
-#: src/Module/Contact.php:341 src/Module/Contact.php:415
+#: src/Module/Contact.php:340 src/Module/Contact.php:414
#: src/Module/Moderation/BaseUsers.php:82
msgid "Blocked"
msgstr ""
-#: src/Module/Contact.php:344
+#: src/Module/Contact.php:343
msgid "Only show blocked contacts"
msgstr ""
-#: src/Module/Contact.php:349 src/Module/Contact.php:421
-#: src/Module/Settings/Server/Index.php:93 src/Object/Post.php:386
+#: src/Module/Contact.php:348 src/Module/Contact.php:420
+#: src/Module/Settings/Server/Index.php:93 src/Object/Post.php:385
msgid "Ignored"
msgstr ""
-#: src/Module/Contact.php:352
+#: src/Module/Contact.php:351
msgid "Only show ignored contacts"
msgstr ""
-#: src/Module/Contact.php:357 src/Module/Contact.php:424
+#: src/Module/Contact.php:356 src/Module/Contact.php:423
msgid "Collapsed"
msgstr ""
-#: src/Module/Contact.php:360
+#: src/Module/Contact.php:359
msgid "Only show collapsed contacts"
msgstr ""
-#: src/Module/Contact.php:365 src/Module/Contact.php:427
+#: src/Module/Contact.php:364 src/Module/Contact.php:426
msgid "Archived"
msgstr ""
-#: src/Module/Contact.php:368
+#: src/Module/Contact.php:367
msgid "Only show archived contacts"
msgstr ""
-#: src/Module/Contact.php:373 src/Module/Contact.php:418
+#: src/Module/Contact.php:372 src/Module/Contact.php:417
msgid "Hidden"
msgstr ""
-#: src/Module/Contact.php:376
+#: src/Module/Contact.php:375
msgid "Only show hidden contacts"
msgstr ""
-#: src/Module/Contact.php:384
+#: src/Module/Contact.php:383
msgid "Organize your contact circles"
msgstr ""
-#: src/Module/Contact.php:439
+#: src/Module/Contact.php:438
msgid "Search your contacts"
msgstr ""
-#: src/Module/Contact.php:440 src/Module/Search/Index.php:193
+#: src/Module/Contact.php:439 src/Module/Search/Index.php:202
#, php-format
msgid "Results for: %s"
msgstr ""
-#: src/Module/Contact.php:448
+#: src/Module/Contact.php:447
msgid "Update"
msgstr ""
-#: src/Module/Contact.php:449 src/Module/Contact/Profile.php:524
+#: src/Module/Contact.php:448 src/Module/Contact/Profile.php:524
#: src/Module/Moderation/Blocklist/Contact.php:105
-#: src/Module/Moderation/Users/Blocked.php:127
-#: src/Module/Moderation/Users/Index.php:143
+#: src/Module/Moderation/Users/Blocked.php:94
+#: src/Module/Moderation/Users/Index.php:103
msgid "Unblock"
msgstr ""
-#: src/Module/Contact.php:450 src/Module/Contact/Profile.php:532
+#: src/Module/Contact.php:449 src/Module/Contact/Profile.php:532
msgid "Unignore"
msgstr ""
-#: src/Module/Contact.php:451 src/Module/Contact/Profile.php:540
+#: src/Module/Contact.php:450 src/Module/Contact/Profile.php:540
msgid "Uncollapse"
msgstr ""
-#: src/Module/Contact.php:453
+#: src/Module/Contact.php:452
msgid "Batch Actions"
msgstr ""
-#: src/Module/Contact.php:496
+#: src/Module/Contact.php:495
msgid "Conversations started by this contact"
msgstr ""
-#: src/Module/Contact.php:501
+#: src/Module/Contact.php:500
msgid "Posts and Comments"
msgstr ""
-#: src/Module/Contact.php:504
+#: src/Module/Contact.php:503
msgid "Individual Posts and Replies"
msgstr ""
-#: src/Module/Contact.php:512
+#: src/Module/Contact.php:511
msgid "Posts containing media objects"
msgstr ""
-#: src/Module/Contact.php:520
+#: src/Module/Contact.php:519
msgid "View all known contacts"
msgstr ""
-#: src/Module/Contact.php:531
+#: src/Module/Contact.php:530
msgid "Advanced Contact Settings"
msgstr ""
-#: src/Module/Contact.php:567
+#: src/Module/Contact.php:566
msgid "Mutual Friendship"
msgstr ""
-#: src/Module/Contact.php:571
+#: src/Module/Contact.php:570
msgid "is a fan of yours"
msgstr ""
-#: src/Module/Contact.php:575
+#: src/Module/Contact.php:574
msgid "you are a fan of"
msgstr ""
-#: src/Module/Contact.php:593
+#: src/Module/Contact.php:592
msgid "Pending outgoing contact request"
msgstr ""
-#: src/Module/Contact.php:595
+#: src/Module/Contact.php:594
msgid "Pending incoming contact request"
msgstr ""
-#: src/Module/Contact.php:608 src/Module/Contact/Profile.php:383
+#: src/Module/Contact.php:607 src/Module/Contact/Profile.php:383
#, php-format
msgid "Visit %s's profile [%s]"
msgstr ""
@@ -6185,12 +6182,12 @@ msgstr ""
#: src/Module/Contact/Advanced.php:120
#: src/Module/Moderation/Blocklist/Contact.php:110
#: src/Module/Moderation/Reports.php:105
-#: src/Module/Moderation/Users/Active.php:115
-#: src/Module/Moderation/Users/Blocked.php:115
+#: src/Module/Moderation/Users/Active.php:82
+#: src/Module/Moderation/Users/Blocked.php:82
#: src/Module/Moderation/Users/Create.php:56
#: src/Module/Moderation/Users/Deleted.php:69
-#: src/Module/Moderation/Users/Index.php:129
-#: src/Module/Moderation/Users/Index.php:149
+#: src/Module/Moderation/Users/Index.php:89
+#: src/Module/Moderation/Users/Index.php:109
#: src/Module/Moderation/Users/Pending.php:85 src/Module/Settings/OAuth.php:58
msgid "Name"
msgstr ""
@@ -6558,7 +6555,7 @@ msgid "Actions"
msgstr ""
#: src/Module/Contact/Profile.php:429
-#: src/Module/Settings/TwoFactor/Index.php:126 view/theme/frio/theme.php:220
+#: src/Module/Settings/TwoFactor/Index.php:126 view/theme/frio/theme.php:218
msgid "Status"
msgstr ""
@@ -6687,8 +6684,8 @@ msgid "Unable to unfollow this contact, please contact your administrator"
msgstr ""
#: src/Module/Conversation/Channel.php:125
-#: src/Module/Conversation/Community.php:114 src/Module/Search/Index.php:138
-#: src/Module/Search/Index.php:180
+#: src/Module/Conversation/Community.php:114 src/Module/Search/Index.php:139
+#: src/Module/Search/Index.php:189
msgid "No results."
msgstr ""
@@ -7515,9 +7512,9 @@ msgid "Block Remote Contact"
msgstr ""
#: src/Module/Moderation/Blocklist/Contact.php:102
-#: src/Module/Moderation/Users/Active.php:124
-#: src/Module/Moderation/Users/Blocked.php:124
-#: src/Module/Moderation/Users/Index.php:138
+#: src/Module/Moderation/Users/Active.php:91
+#: src/Module/Moderation/Users/Blocked.php:91
+#: src/Module/Moderation/Users/Index.php:98
#: src/Module/Moderation/Users/Pending.php:84
msgid "select all"
msgstr ""
@@ -7831,9 +7828,9 @@ msgid "Tag"
msgstr ""
#: src/Module/Moderation/Item/Source.php:77
-#: src/Module/Moderation/Users/Active.php:115
-#: src/Module/Moderation/Users/Blocked.php:115
-#: src/Module/Moderation/Users/Index.php:129
+#: src/Module/Moderation/Users/Active.php:82
+#: src/Module/Moderation/Users/Blocked.php:82
+#: src/Module/Moderation/Users/Index.php:89
msgid "Type"
msgstr ""
@@ -8086,11 +8083,11 @@ msgstr[0] ""
msgstr[1] ""
#: src/Module/Moderation/Users/Active.php:37
-#: src/Module/Moderation/Users/Active.php:74
+#: src/Module/Moderation/Users/Active.php:149
#: src/Module/Moderation/Users/Blocked.php:37
-#: src/Module/Moderation/Users/Blocked.php:74
+#: src/Module/Moderation/Users/Blocked.php:148
#: src/Module/Moderation/Users/Index.php:44
-#: src/Module/Moderation/Users/Index.php:81
+#: src/Module/Moderation/Users/Index.php:160
msgid "You can't remove yourself"
msgstr ""
@@ -8103,82 +8100,82 @@ msgid_plural "%s users deleted"
msgstr[0] ""
msgstr[1] ""
-#: src/Module/Moderation/Users/Active.php:72
-#: src/Module/Moderation/Users/Blocked.php:72
-#: src/Module/Moderation/Users/Index.php:79
+#: src/Module/Moderation/Users/Active.php:82
+#: src/Module/Moderation/Users/Blocked.php:82
+#: src/Module/Moderation/Users/Deleted.php:69
+#: src/Module/Moderation/Users/Index.php:89
+#: src/Module/Moderation/Users/Index.php:109
+msgid "Register date"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:82
+#: src/Module/Moderation/Users/Blocked.php:82
+#: src/Module/Moderation/Users/Deleted.php:69
+#: src/Module/Moderation/Users/Index.php:89
+#: src/Module/Moderation/Users/Index.php:109
+msgid "Last login"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:82
+#: src/Module/Moderation/Users/Blocked.php:82
+#: src/Module/Moderation/Users/Deleted.php:69
+#: src/Module/Moderation/Users/Index.php:89
+#: src/Module/Moderation/Users/Index.php:109
+msgid "Last public item"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:90
+msgid "Active Accounts"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:94
+#: src/Module/Moderation/Users/Blocked.php:93
+#: src/Module/Moderation/Users/Index.php:102
+msgid "User blocked"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:95
+#: src/Module/Moderation/Users/Blocked.php:95
+#: src/Module/Moderation/Users/Index.php:104
+msgid "Site admin"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:96
+#: src/Module/Moderation/Users/Blocked.php:96
+#: src/Module/Moderation/Users/Index.php:105
+msgid "Account expired"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:97
+#: src/Module/Moderation/Users/Index.php:108
+msgid "Create a new user"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:103
+#: src/Module/Moderation/Users/Blocked.php:102
+#: src/Module/Moderation/Users/Index.php:114
+msgid "Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:104
+#: src/Module/Moderation/Users/Blocked.php:103
+#: src/Module/Moderation/Users/Index.php:115
+msgid "The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr ""
+
+#: src/Module/Moderation/Users/Active.php:147
+#: src/Module/Moderation/Users/Blocked.php:146
+#: src/Module/Moderation/Users/Index.php:158
#, php-format
msgid "User \"%s\" deleted"
msgstr ""
-#: src/Module/Moderation/Users/Active.php:82
-#: src/Module/Moderation/Users/Index.php:89
+#: src/Module/Moderation/Users/Active.php:156
+#: src/Module/Moderation/Users/Index.php:167
#, php-format
msgid "User \"%s\" blocked"
msgstr ""
-#: src/Module/Moderation/Users/Active.php:115
-#: src/Module/Moderation/Users/Blocked.php:115
-#: src/Module/Moderation/Users/Deleted.php:69
-#: src/Module/Moderation/Users/Index.php:129
-#: src/Module/Moderation/Users/Index.php:149
-msgid "Register date"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:115
-#: src/Module/Moderation/Users/Blocked.php:115
-#: src/Module/Moderation/Users/Deleted.php:69
-#: src/Module/Moderation/Users/Index.php:129
-#: src/Module/Moderation/Users/Index.php:149
-msgid "Last login"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:115
-#: src/Module/Moderation/Users/Blocked.php:115
-#: src/Module/Moderation/Users/Deleted.php:69
-#: src/Module/Moderation/Users/Index.php:129
-#: src/Module/Moderation/Users/Index.php:149
-msgid "Last public item"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:123
-msgid "Active Accounts"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:127
-#: src/Module/Moderation/Users/Blocked.php:126
-#: src/Module/Moderation/Users/Index.php:142
-msgid "User blocked"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:128
-#: src/Module/Moderation/Users/Blocked.php:128
-#: src/Module/Moderation/Users/Index.php:144
-msgid "Site admin"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:129
-#: src/Module/Moderation/Users/Blocked.php:129
-#: src/Module/Moderation/Users/Index.php:145
-msgid "Account expired"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:130
-#: src/Module/Moderation/Users/Index.php:148
-msgid "Create a new user"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:136
-#: src/Module/Moderation/Users/Blocked.php:135
-#: src/Module/Moderation/Users/Index.php:154
-msgid "Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-
-#: src/Module/Moderation/Users/Active.php:137
-#: src/Module/Moderation/Users/Blocked.php:136
-#: src/Module/Moderation/Users/Index.php:155
-msgid "The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-
#: src/Module/Moderation/Users/Blocked.php:29
#: src/Module/Moderation/Users/Index.php:36
#, php-format
@@ -8187,14 +8184,14 @@ msgid_plural "%s users unblocked"
msgstr[0] ""
msgstr[1] ""
-#: src/Module/Moderation/Users/Blocked.php:81
-#: src/Module/Moderation/Users/Index.php:95
-#, php-format
-msgid "User \"%s\" unblocked"
+#: src/Module/Moderation/Users/Blocked.php:90
+msgid "Blocked Users"
msgstr ""
-#: src/Module/Moderation/Users/Blocked.php:123
-msgid "Blocked Users"
+#: src/Module/Moderation/Users/Blocked.php:154
+#: src/Module/Moderation/Users/Index.php:172
+#, php-format
+msgid "User \"%s\" unblocked"
msgstr ""
#: src/Module/Moderation/Users/Create.php:48
@@ -8226,11 +8223,11 @@ msgid "Users awaiting permanent deletion"
msgstr ""
#: src/Module/Moderation/Users/Deleted.php:69
-#: src/Module/Moderation/Users/Index.php:149
+#: src/Module/Moderation/Users/Index.php:109
msgid "Permanent deletion"
msgstr ""
-#: src/Module/Moderation/Users/Index.php:139
+#: src/Module/Moderation/Users/Index.php:99
msgid "User waiting for permanent deletion"
msgstr ""
@@ -8370,15 +8367,15 @@ msgstr ""
msgid "Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"
msgstr ""
-#: src/Module/OAuth/Authorize.php:40
+#: src/Module/OAuth/Authorize.php:39
msgid "Unsupported or missing response type"
msgstr ""
-#: src/Module/OAuth/Authorize.php:45 src/Module/OAuth/Token.php:61
+#: src/Module/OAuth/Authorize.php:44 src/Module/OAuth/Token.php:60
msgid "Incomplete request data"
msgstr ""
-#: src/Module/OAuth/Authorize.php:93
+#: src/Module/OAuth/Authorize.php:92
#, php-format
msgid "Please copy the following authentication code into your application and close this window: %s"
msgstr ""
@@ -8444,21 +8441,21 @@ msgstr ""
msgid "Search in Friendica %s"
msgstr ""
-#: src/Module/Photo.php:109
+#: src/Module/Photo.php:108
msgid "The Photo is not available."
msgstr ""
-#: src/Module/Photo.php:134
+#: src/Module/Photo.php:133
#, php-format
msgid "The Photo with id %s is not available."
msgstr ""
-#: src/Module/Photo.php:179
+#: src/Module/Photo.php:178
#, php-format
msgid "Invalid external resource with url %s."
msgstr ""
-#: src/Module/Photo.php:181
+#: src/Module/Photo.php:180
#, php-format
msgid "Invalid photo with id %s."
msgstr ""
@@ -8561,19 +8558,19 @@ msgid "No contacts."
msgstr ""
#: src/Module/Profile/Conversations.php:96 src/Module/Profile/Profile.php:342
-#: src/Protocol/Feed.php:1097
+#: src/Protocol/Feed.php:1114
#, php-format
msgid "%s's posts"
msgstr ""
#: src/Module/Profile/Conversations.php:97 src/Module/Profile/Profile.php:343
-#: src/Protocol/Feed.php:1100
+#: src/Protocol/Feed.php:1117
#, php-format
msgid "%s's comments"
msgstr ""
#: src/Module/Profile/Conversations.php:98 src/Module/Profile/Profile.php:344
-#: src/Protocol/Feed.php:1093
+#: src/Protocol/Feed.php:1110
#, php-format
msgid "%s's timeline"
msgstr ""
@@ -8717,130 +8714,130 @@ msgstr ""
msgid "Remove post"
msgstr ""
-#: src/Module/Register.php:78
+#: src/Module/Register.php:77
msgid "Only parent users can create additional accounts."
msgstr ""
-#: src/Module/Register.php:93 src/Module/User/Import.php:98
+#: src/Module/Register.php:92 src/Module/User/Import.php:98
msgid "This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."
msgstr ""
-#: src/Module/Register.php:110
+#: src/Module/Register.php:109
msgid "You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking \"Register\"."
msgstr ""
-#: src/Module/Register.php:111
+#: src/Module/Register.php:110
msgid "If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."
msgstr ""
-#: src/Module/Register.php:112
+#: src/Module/Register.php:111
msgid "Your OpenID (optional): "
msgstr ""
-#: src/Module/Register.php:121
+#: src/Module/Register.php:120
msgid "Include your profile in member directory?"
msgstr ""
-#: src/Module/Register.php:142
+#: src/Module/Register.php:141
msgid "Note for the admin"
msgstr ""
-#: src/Module/Register.php:142
+#: src/Module/Register.php:141
msgid "Leave a message for the admin, why you want to join this node"
msgstr ""
-#: src/Module/Register.php:143
+#: src/Module/Register.php:142
msgid "Membership on this site is by invitation only."
msgstr ""
-#: src/Module/Register.php:144
+#: src/Module/Register.php:143
msgid "Your invitation code: "
msgstr ""
-#: src/Module/Register.php:152
+#: src/Module/Register.php:151
msgid "Your Display Name (as you would like it to be displayed on this system"
msgstr ""
-#: src/Module/Register.php:153
+#: src/Module/Register.php:152
msgid "Your Email Address: (Initial information will be send there, so this has to be an existing address.)"
msgstr ""
-#: src/Module/Register.php:154
+#: src/Module/Register.php:153
msgid "Please repeat your e-mail address:"
msgstr ""
-#: src/Module/Register.php:156 src/Module/Security/PasswordTooLong.php:86
+#: src/Module/Register.php:155 src/Module/Security/PasswordTooLong.php:86
#: src/Module/Settings/Account.php:513
msgid "New Password:"
msgstr ""
-#: src/Module/Register.php:156
+#: src/Module/Register.php:155
msgid "Leave empty for an auto generated password."
msgstr ""
-#: src/Module/Register.php:157 src/Module/Security/PasswordTooLong.php:87
+#: src/Module/Register.php:156 src/Module/Security/PasswordTooLong.php:87
#: src/Module/Settings/Account.php:514
msgid "Confirm:"
msgstr ""
-#: src/Module/Register.php:158
+#: src/Module/Register.php:157
#, php-format
msgid "Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \"nickname@%s\"."
msgstr ""
-#: src/Module/Register.php:159
+#: src/Module/Register.php:158
msgid "Choose a nickname: "
msgstr ""
-#: src/Module/Register.php:167 src/Module/User/Import.php:104
+#: src/Module/Register.php:166 src/Module/User/Import.php:104
msgid "Import"
msgstr ""
-#: src/Module/Register.php:168
+#: src/Module/Register.php:167
msgid "Import your profile to this friendica instance"
msgstr ""
-#: src/Module/Register.php:175
+#: src/Module/Register.php:174
msgid "Note: This node explicitly contains adult content"
msgstr ""
-#: src/Module/Register.php:177 src/Module/Settings/Delegation.php:167
+#: src/Module/Register.php:176 src/Module/Settings/Delegation.php:167
msgid "Parent Password:"
msgstr ""
-#: src/Module/Register.php:177 src/Module/Settings/Delegation.php:167
+#: src/Module/Register.php:176 src/Module/Settings/Delegation.php:167
msgid "Please enter the password of the parent account to legitimize your request."
msgstr ""
-#: src/Module/Register.php:206
+#: src/Module/Register.php:205
msgid "Password doesn't match."
msgstr ""
-#: src/Module/Register.php:212
+#: src/Module/Register.php:211
msgid "Please enter your password."
msgstr ""
-#: src/Module/Register.php:254
+#: src/Module/Register.php:253
msgid "You have entered too much information."
msgstr ""
-#: src/Module/Register.php:277
+#: src/Module/Register.php:276
msgid "Please enter the identical mail address in the second field."
msgstr ""
-#: src/Module/Register.php:285
+#: src/Module/Register.php:284
msgid "Nickname cannot start with a digit."
msgstr ""
-#: src/Module/Register.php:287
+#: src/Module/Register.php:286
msgid "Nickname can only contain US-ASCII characters."
msgstr ""
-#: src/Module/Register.php:316
+#: src/Module/Register.php:315
msgid "The additional account was created."
msgstr ""
-#: src/Module/Register.php:341
+#: src/Module/Register.php:340
msgid "Registration successful. Please check your email for further instructions."
msgstr ""
@@ -8849,24 +8846,24 @@ msgstr ""
msgid "Failed to send email message. Here your accout details:
login: %s
password: %s
You can change your password after login."
msgstr ""
-#: src/Module/Register.php:354
+#: src/Module/Register.php:355
msgid "Registration successful."
msgstr ""
-#: src/Module/Register.php:363 src/Module/Register.php:370
-#: src/Module/Register.php:380
+#: src/Module/Register.php:364 src/Module/Register.php:371
+#: src/Module/Register.php:381
msgid "Your registration can not be processed."
msgstr ""
-#: src/Module/Register.php:369
+#: src/Module/Register.php:370
msgid "You have to leave a request note for the admin."
msgstr ""
-#: src/Module/Register.php:379
+#: src/Module/Register.php:380
msgid "An internal error occured."
msgstr ""
-#: src/Module/Register.php:401
+#: src/Module/Register.php:402
msgid "Your registration is pending approval by the site owner."
msgstr ""
@@ -8874,15 +8871,15 @@ msgstr ""
msgid "You must be logged in to use this module."
msgstr ""
-#: src/Module/Search/Index.php:55
+#: src/Module/Search/Index.php:54
msgid "Only logged in users are permitted to perform a search."
msgstr ""
-#: src/Module/Search/Index.php:75
+#: src/Module/Search/Index.php:76
msgid "Only one search per minute is permitted for not logged in users."
msgstr ""
-#: src/Module/Search/Index.php:191
+#: src/Module/Search/Index.php:200
#, php-format
msgid "Items tagged with: %s"
msgstr ""
@@ -11452,295 +11449,295 @@ msgstr ""
msgid "%s posted an update."
msgstr ""
-#: src/Object/Post.php:125
+#: src/Object/Post.php:124
msgid "Private Message"
msgstr ""
-#: src/Object/Post.php:129
+#: src/Object/Post.php:128
msgid "Public Message"
msgstr ""
-#: src/Object/Post.php:133
+#: src/Object/Post.php:132
msgid "Unlisted Message"
msgstr ""
-#: src/Object/Post.php:169
+#: src/Object/Post.php:168
msgid "This entry was edited"
msgstr ""
-#: src/Object/Post.php:197
+#: src/Object/Post.php:196
msgid "Connector Message"
msgstr ""
-#: src/Object/Post.php:226 src/Object/Post.php:228
+#: src/Object/Post.php:225 src/Object/Post.php:227
msgid "Edit"
msgstr ""
-#: src/Object/Post.php:262
+#: src/Object/Post.php:261
msgid "Delete globally"
msgstr ""
-#: src/Object/Post.php:262
+#: src/Object/Post.php:261
msgid "Remove locally"
msgstr ""
-#: src/Object/Post.php:269
+#: src/Object/Post.php:268
#, php-format
msgid "Block %s"
msgstr ""
-#: src/Object/Post.php:274
+#: src/Object/Post.php:273
#, php-format
msgid "Ignore %s"
msgstr ""
-#: src/Object/Post.php:279
+#: src/Object/Post.php:278
#, php-format
msgid "Collapse %s"
msgstr ""
-#: src/Object/Post.php:283
+#: src/Object/Post.php:282
msgid "Report post"
msgstr ""
-#: src/Object/Post.php:294
+#: src/Object/Post.php:293
msgid "Save to folder"
msgstr ""
-#: src/Object/Post.php:334
+#: src/Object/Post.php:333
msgid "I will attend"
msgstr ""
-#: src/Object/Post.php:334
+#: src/Object/Post.php:333
msgid "I will not attend"
msgstr ""
-#: src/Object/Post.php:334
+#: src/Object/Post.php:333
msgid "I might attend"
msgstr ""
-#: src/Object/Post.php:381
+#: src/Object/Post.php:380
msgid "Ignore thread"
msgstr ""
-#: src/Object/Post.php:382
+#: src/Object/Post.php:381
msgid "Unignore thread"
msgstr ""
-#: src/Object/Post.php:383
+#: src/Object/Post.php:382
msgid "Toggle ignore status"
msgstr ""
-#: src/Object/Post.php:393
+#: src/Object/Post.php:392
msgid "Add star"
msgstr ""
-#: src/Object/Post.php:394
+#: src/Object/Post.php:393
msgid "Remove star"
msgstr ""
-#: src/Object/Post.php:395
+#: src/Object/Post.php:394
msgid "Toggle star status"
msgstr ""
-#: src/Object/Post.php:406
+#: src/Object/Post.php:405
msgid "Pin"
msgstr ""
-#: src/Object/Post.php:407
+#: src/Object/Post.php:406
msgid "Unpin"
msgstr ""
-#: src/Object/Post.php:408
+#: src/Object/Post.php:407
msgid "Toggle pin status"
msgstr ""
-#: src/Object/Post.php:411
+#: src/Object/Post.php:410
msgid "Pinned"
msgstr ""
-#: src/Object/Post.php:416
+#: src/Object/Post.php:415
msgid "Add tag"
msgstr ""
-#: src/Object/Post.php:431
+#: src/Object/Post.php:430
msgid "Quote share this"
msgstr ""
-#: src/Object/Post.php:431
+#: src/Object/Post.php:430
msgid "Quote Share"
msgstr ""
-#: src/Object/Post.php:434
+#: src/Object/Post.php:433
msgid "Reshare this"
msgstr ""
-#: src/Object/Post.php:434
+#: src/Object/Post.php:433
msgid "Reshare"
msgstr ""
-#: src/Object/Post.php:435
+#: src/Object/Post.php:434
msgid "Cancel your Reshare"
msgstr ""
-#: src/Object/Post.php:435
+#: src/Object/Post.php:434
msgid "Unshare"
msgstr ""
-#: src/Object/Post.php:479
+#: src/Object/Post.php:478
#, php-format
msgid "%s (Received %s)"
msgstr ""
-#: src/Object/Post.php:485
+#: src/Object/Post.php:484
msgid "Comment this item on your system"
msgstr ""
-#: src/Object/Post.php:485
+#: src/Object/Post.php:484
msgid "Remote comment"
msgstr ""
-#: src/Object/Post.php:507
+#: src/Object/Post.php:506
msgid "Share via ..."
msgstr ""
-#: src/Object/Post.php:507
+#: src/Object/Post.php:506
msgid "Share via external services"
msgstr ""
-#: src/Object/Post.php:514
+#: src/Object/Post.php:513
msgid "Unknown parent"
msgstr ""
-#: src/Object/Post.php:518
+#: src/Object/Post.php:517
#, php-format
msgid "in reply to %s"
msgstr ""
-#: src/Object/Post.php:520
+#: src/Object/Post.php:519
msgid "Parent is probably private or not federated."
msgstr ""
-#: src/Object/Post.php:544
+#: src/Object/Post.php:543
msgid "to"
msgstr ""
-#: src/Object/Post.php:545
+#: src/Object/Post.php:544
msgid "via"
msgstr ""
-#: src/Object/Post.php:546
+#: src/Object/Post.php:545
msgid "Wall-to-Wall"
msgstr ""
-#: src/Object/Post.php:547
+#: src/Object/Post.php:546
msgid "via Wall-To-Wall:"
msgstr ""
-#: src/Object/Post.php:600
+#: src/Object/Post.php:599
#, php-format
msgid "Reply to %s"
msgstr ""
-#: src/Object/Post.php:603
+#: src/Object/Post.php:602
msgid "More"
msgstr ""
-#: src/Object/Post.php:622
+#: src/Object/Post.php:621
msgid "Notifier task is pending"
msgstr ""
-#: src/Object/Post.php:623
+#: src/Object/Post.php:622
msgid "Delivery to remote servers is pending"
msgstr ""
-#: src/Object/Post.php:624
+#: src/Object/Post.php:623
msgid "Delivery to remote servers is underway"
msgstr ""
-#: src/Object/Post.php:625
+#: src/Object/Post.php:624
msgid "Delivery to remote servers is mostly done"
msgstr ""
-#: src/Object/Post.php:626
+#: src/Object/Post.php:625
msgid "Delivery to remote servers is done"
msgstr ""
-#: src/Object/Post.php:648
+#: src/Object/Post.php:647
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
-#: src/Object/Post.php:649
+#: src/Object/Post.php:648
msgid "Show more"
msgstr ""
-#: src/Object/Post.php:650
+#: src/Object/Post.php:649
msgid "Show fewer"
msgstr ""
-#: src/Object/Post.php:687
+#: src/Object/Post.php:686
#, php-format
msgid "Reshared by: %s"
msgstr ""
-#: src/Object/Post.php:692
+#: src/Object/Post.php:691
#, php-format
msgid "Viewed by: %s"
msgstr ""
-#: src/Object/Post.php:697
+#: src/Object/Post.php:696
#, php-format
msgid "Read by: %s"
msgstr ""
-#: src/Object/Post.php:702
+#: src/Object/Post.php:701
#, php-format
msgid "Liked by: %s"
msgstr ""
-#: src/Object/Post.php:707
+#: src/Object/Post.php:706
#, php-format
msgid "Disliked by: %s"
msgstr ""
-#: src/Object/Post.php:712
+#: src/Object/Post.php:711
#, php-format
msgid "Attended by: %s"
msgstr ""
-#: src/Object/Post.php:717
+#: src/Object/Post.php:716
#, php-format
msgid "Maybe attended by: %s"
msgstr ""
-#: src/Object/Post.php:722
+#: src/Object/Post.php:721
#, php-format
msgid "Not attended by: %s"
msgstr ""
-#: src/Object/Post.php:727
+#: src/Object/Post.php:726
#, php-format
msgid "Commented by: %s"
msgstr ""
-#: src/Object/Post.php:732
+#: src/Object/Post.php:731
#, php-format
msgid "Reacted with %s by: %s"
msgstr ""
-#: src/Object/Post.php:755
+#: src/Object/Post.php:754
#, php-format
msgid "Quote shared by: %s"
msgstr ""
-#: src/Protocol/ActivityPub/Receiver.php:566
+#: src/Protocol/ActivityPub/Receiver.php:565
msgid "Chat"
msgstr ""
-#: src/Protocol/Delivery.php:531
+#: src/Protocol/Delivery.php:532
msgid "(no subject)"
msgstr ""
@@ -11770,7 +11767,7 @@ msgstr ""
msgid "Please upload a profile photo."
msgstr ""
-#: src/Security/OpenWebAuth.php:150
+#: src/Security/OpenWebAuth.php:149
#, php-format
msgid "OpenWebAuth: %1$s welcomes %2$s"
msgstr ""
@@ -11869,11 +11866,11 @@ msgstr ""
msgid "%1$d %2$s ago"
msgstr ""
-#: src/Worker/PushSubscription.php:96
+#: src/Worker/PushSubscription.php:95
msgid "Notification from Friendica"
msgstr ""
-#: src/Worker/PushSubscription.php:97
+#: src/Worker/PushSubscription.php:96
msgid "Empty Post"
msgstr ""
@@ -12053,11 +12050,11 @@ msgstr ""
msgid "Custom"
msgstr ""
-#: view/theme/frio/theme.php:202
+#: view/theme/frio/theme.php:200
msgid "Guest"
msgstr ""
-#: view/theme/frio/theme.php:205
+#: view/theme/frio/theme.php:203
msgid "Visitor"
msgstr ""
From f3aa937ce2be223d97ac40ce6a9bb8c4e043b2b4 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:28:50 +0000
Subject: [PATCH 037/178] Check phpmd with woodpecker
---
.woodpecker/.code_standards_check.yml | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/.woodpecker/.code_standards_check.yml b/.woodpecker/.code_standards_check.yml
index 1217ea3f0b..6ec1b720f2 100644
--- a/.woodpecker/.code_standards_check.yml
+++ b/.woodpecker/.code_standards_check.yml
@@ -36,7 +36,7 @@ steps:
- '.composer'
volumes:
- /tmp/drone-cache:/tmp/cache
- check:
+ code_style:
image: php:8.3
commands:
- echo "**** Use bin/dev/fix-codestyle.sh in case of errors ****"
@@ -54,3 +54,7 @@ steps:
EXTRA_ARGS='';
fi
- ./bin/dev/php-cs-fixer/vendor/bin/php-cs-fixer check --config=.php-cs-fixer.dist.php -v --diff --using-cache=no $${EXTRA_ARGS}
+ phpmd:
+ image: php:8.3
+ commands:
+ - ./bin/composer.phar run phpmd
From 6aadb63b8261cfb29a80147d67eaaa59521ff82c Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:33:41 +0000
Subject: [PATCH 038/178] run phpmd before php-cs-fixer
---
.woodpecker/.code_standards_check.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/.woodpecker/.code_standards_check.yml b/.woodpecker/.code_standards_check.yml
index 6ec1b720f2..54fc9f9894 100644
--- a/.woodpecker/.code_standards_check.yml
+++ b/.woodpecker/.code_standards_check.yml
@@ -36,6 +36,10 @@ steps:
- '.composer'
volumes:
- /tmp/drone-cache:/tmp/cache
+ phpmd:
+ image: php:8.3
+ commands:
+ - ./bin/composer.phar run phpmd
code_style:
image: php:8.3
commands:
@@ -54,7 +58,3 @@ steps:
EXTRA_ARGS='';
fi
- ./bin/dev/php-cs-fixer/vendor/bin/php-cs-fixer check --config=.php-cs-fixer.dist.php -v --diff --using-cache=no $${EXTRA_ARGS}
- phpmd:
- image: php:8.3
- commands:
- - ./bin/composer.phar run phpmd
From e364d254ed409496ea4ba05e7be4ecdca91c1601 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:42:51 +0000
Subject: [PATCH 039/178] run phpmd in own woodpecker job
---
.woodpecker/.code_standards_check.yml | 6 +-----
.woodpecker/.phpmd_check.yml | 22 ++++++++++++++++++++++
2 files changed, 23 insertions(+), 5 deletions(-)
create mode 100644 .woodpecker/.phpmd_check.yml
diff --git a/.woodpecker/.code_standards_check.yml b/.woodpecker/.code_standards_check.yml
index 54fc9f9894..1217ea3f0b 100644
--- a/.woodpecker/.code_standards_check.yml
+++ b/.woodpecker/.code_standards_check.yml
@@ -36,11 +36,7 @@ steps:
- '.composer'
volumes:
- /tmp/drone-cache:/tmp/cache
- phpmd:
- image: php:8.3
- commands:
- - ./bin/composer.phar run phpmd
- code_style:
+ check:
image: php:8.3
commands:
- echo "**** Use bin/dev/fix-codestyle.sh in case of errors ****"
diff --git a/.woodpecker/.phpmd_check.yml b/.woodpecker/.phpmd_check.yml
new file mode 100644
index 0000000000..d079dd630e
--- /dev/null
+++ b/.woodpecker/.phpmd_check.yml
@@ -0,0 +1,22 @@
+# SPDX-FileCopyrightText: 2010 - 2024 the Friendica project
+#
+# SPDX-License-Identifier: CC0-1.0
+
+# The phpmd check is just triggered for PRs and pushes to non-stable branches of Friendica
+when:
+ branch:
+ exclude: [ stable ]
+ event: [ pull_request, push ]
+
+steps:
+ composer_install:
+ image: composer
+ commands:
+ - mkdir addon
+ - export COMPOSER_HOME=.composer
+ - ./bin/composer.phar install
+
+ phpmd:
+ image: php:8.3
+ commands:
+ - ./bin/composer.phar run phpmd
From 379272efa33e582a9d37dbcea0200c548d006fe5 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:48:16 +0000
Subject: [PATCH 040/178] Run woodpecker with image: php:8.3
---
.woodpecker/.phpmd_check.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.woodpecker/.phpmd_check.yml b/.woodpecker/.phpmd_check.yml
index d079dd630e..a7b601e333 100644
--- a/.woodpecker/.phpmd_check.yml
+++ b/.woodpecker/.phpmd_check.yml
@@ -10,7 +10,7 @@ when:
steps:
composer_install:
- image: composer
+ image: php:8.3
commands:
- mkdir addon
- export COMPOSER_HOME=.composer
From 9b9627e4b6353c8bc4f0ba20a7748fa39258e6ed Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 14:51:05 +0000
Subject: [PATCH 041/178] simplify ci job, use image:
friendicaci/php8.3:php8.3.3
---
.woodpecker/.phpmd_check.yml | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/.woodpecker/.phpmd_check.yml b/.woodpecker/.phpmd_check.yml
index a7b601e333..1707aa5895 100644
--- a/.woodpecker/.phpmd_check.yml
+++ b/.woodpecker/.phpmd_check.yml
@@ -9,14 +9,9 @@ when:
event: [ pull_request, push ]
steps:
- composer_install:
- image: php:8.3
+ phpmd:
+ image: friendicaci/php8.3:php8.3.3
commands:
- mkdir addon
- - export COMPOSER_HOME=.composer
- ./bin/composer.phar install
-
- phpmd:
- image: php:8.3
- commands:
- ./bin/composer.phar run phpmd
From a6ea5202246de53fccd1f0445849ca83e37bade7 Mon Sep 17 00:00:00 2001
From: Art4
Date: Thu, 23 Jan 2025 15:11:59 +0000
Subject: [PATCH 042/178] Add cache in phpmd workflow
---
.woodpecker/.phpmd_check.yml | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
diff --git a/.woodpecker/.phpmd_check.yml b/.woodpecker/.phpmd_check.yml
index 1707aa5895..f03e44eec9 100644
--- a/.woodpecker/.phpmd_check.yml
+++ b/.woodpecker/.phpmd_check.yml
@@ -9,9 +9,38 @@ when:
event: [ pull_request, push ]
steps:
+ restore_cache:
+ image: meltwater/drone-cache:dev
+ settings:
+ backend: "filesystem"
+ restore: true
+ cache_key: "{{ .Repo.Name }}_php${PHP_MAJOR_VERSION}_{{ arch }}_{{ os }}"
+ archive_format: "gzip"
+ mount:
+ - '.composer'
+ volumes:
+ - /tmp/drone-cache:/tmp/cache
+
+ composer_install:
+ image: friendicaci/php8.3:php8.3.3
+ commands:
+ - mkdir addon # create empty addon folder to appease composer
+ - export COMPOSER_HOME=.composer
+ - ./bin/composer.phar install --prefer-dist
+
+ rebuild_cache:
+ image: meltwater/drone-cache:dev
+ settings:
+ backend: "filesystem"
+ rebuild: true
+ cache_key: "{{ .Repo.Name }}_php${PHP_MAJOR_VERSION}_{{ arch }}_{{ os }}"
+ archive_format: "gzip"
+ mount:
+ - '.composer'
+ volumes:
+ - /tmp/drone-cache:/tmp/cache
+
phpmd:
image: friendicaci/php8.3:php8.3.3
commands:
- - mkdir addon
- - ./bin/composer.phar install
- ./bin/composer.phar run phpmd
From d45cd932783d14b7a24bdf2f4753126723ae7906 Mon Sep 17 00:00:00 2001
From: Michael
Date: Sun, 12 Jan 2025 19:43:34 +0000
Subject: [PATCH 043/178] Improved performance on relation discovery
---
src/Model/Contact/Relation.php | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/src/Model/Contact/Relation.php b/src/Model/Contact/Relation.php
index 5172d87c70..736c4361dd 100644
--- a/src/Model/Contact/Relation.php
+++ b/src/Model/Contact/Relation.php
@@ -10,6 +10,7 @@ namespace Friendica\Model\Contact;
use Exception;
use Friendica\Content\Widget;
use Friendica\Core\Protocol;
+use Friendica\Core\Worker;
use Friendica\Database\Database;
use Friendica\Database\DBA;
use Friendica\DI;
@@ -21,6 +22,7 @@ use Friendica\Model\Verb;
use Friendica\Protocol\Activity;
use Friendica\Protocol\ActivityPub;
use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
use Friendica\Util\Strings;
/**
@@ -162,20 +164,22 @@ class Relation
$following_counter = 0;
DI::logger()->info('Discover contacts', ['id' => $target, 'url' => $url, 'contacts' => count($contacts)]);
- foreach ($contacts as $contact) {
- $actor = Contact::getIdForURL($contact);
- if (!empty($actor)) {
- if (in_array($contact, $followers)) {
- $fields = ['cid' => $target, 'relation-cid' => $actor, 'follows' => true, 'follow-updated' => DateTimeFormat::utcNow()];
+ foreach ($contacts as $contact_url) {
+ $contact = Contact::getByURL($contact_url, false, ['id']);
+ if (!empty($contact['id'])) {
+ if (in_array($contact_url, $followers)) {
+ $fields = ['cid' => $target, 'relation-cid' => $contact['id'], 'follows' => true, 'follow-updated' => DateTimeFormat::utcNow()];
DBA::insert('contact-relation', $fields, Database::INSERT_UPDATE);
$follower_counter++;
}
- if (in_array($contact, $followings)) {
- $fields = ['cid' => $actor, 'relation-cid' => $target, 'follows' => true, 'follow-updated' => DateTimeFormat::utcNow()];
+ if (in_array($contact_url, $followings)) {
+ $fields = ['cid' => $contact['id'], 'relation-cid' => $target, 'follows' => true, 'follow-updated' => DateTimeFormat::utcNow()];
DBA::insert('contact-relation', $fields, Database::INSERT_UPDATE);
$following_counter++;
}
+ } elseif (!Network::isUrlBlocked($contact_url)) {
+ Worker::add(Worker::PRIORITY_LOW, 'AddContact', 0, $contact_url);
}
}
From e5bf1b976ae07ce2a5bf26e86de96f56222db3ff Mon Sep 17 00:00:00 2001
From: Michael
Date: Thu, 23 Jan 2025 21:42:11 +0000
Subject: [PATCH 044/178] New function "add"
---
src/Model/Contact/Relation.php | 3 ++-
src/Worker/AddContact.php | 18 ++++++++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/Model/Contact/Relation.php b/src/Model/Contact/Relation.php
index 736c4361dd..b5c6680f3e 100644
--- a/src/Model/Contact/Relation.php
+++ b/src/Model/Contact/Relation.php
@@ -24,6 +24,7 @@ use Friendica\Protocol\ActivityPub;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
use Friendica\Util\Strings;
+use Friendica\Worker\AddContact;
/**
* This class provides relationship information based on the `contact-relation` table.
@@ -179,7 +180,7 @@ class Relation
$following_counter++;
}
} elseif (!Network::isUrlBlocked($contact_url)) {
- Worker::add(Worker::PRIORITY_LOW, 'AddContact', 0, $contact_url);
+ AddContact::add(Worker::PRIORITY_LOW, 0, $contact_url);
}
}
diff --git a/src/Worker/AddContact.php b/src/Worker/AddContact.php
index 3b27c7e78d..658a1ebcd1 100644
--- a/src/Worker/AddContact.php
+++ b/src/Worker/AddContact.php
@@ -7,10 +7,12 @@
namespace Friendica\Worker;
+use Friendica\Core\Worker;
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Network\HTTPException\NotFoundException;
+use Friendica\Util\Network;
class AddContact
{
@@ -39,4 +41,20 @@ class AddContact
DI::logger()->notice('Imagick not found.', ['exception' => $e, 'uid' => $uid, 'url' => $url]);
}
}
+
+ /**
+ * @param array|int $run_parameters Priority constant or array of options described in Worker::add
+ * @param int $uid User ID
+ * @param string $url Contact link
+ * @return int
+ */
+ public static function add($run_parameters, int $uid, string $url): int
+ {
+ if (Network::isUrlBlocked($url)) {
+ return 0;
+ }
+
+ DI::logger()->debug('Add contact', ['uid' => $uid, 'url' => $url]);
+ return Worker::add($run_parameters, 'AddContact', 0, $url);
+ }
}
From 80fe8f837e14b9d3fc5eb2ebe594ff86cb08a85b Mon Sep 17 00:00:00 2001
From: Michael
Date: Fri, 24 Jan 2025 06:53:48 +0000
Subject: [PATCH 045/178] Unneeded check removed
---
src/Model/Contact/Relation.php | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/Model/Contact/Relation.php b/src/Model/Contact/Relation.php
index b5c6680f3e..b32f8e964c 100644
--- a/src/Model/Contact/Relation.php
+++ b/src/Model/Contact/Relation.php
@@ -22,7 +22,6 @@ use Friendica\Model\Verb;
use Friendica\Protocol\Activity;
use Friendica\Protocol\ActivityPub;
use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Network;
use Friendica\Util\Strings;
use Friendica\Worker\AddContact;
@@ -179,7 +178,7 @@ class Relation
DBA::insert('contact-relation', $fields, Database::INSERT_UPDATE);
$following_counter++;
}
- } elseif (!Network::isUrlBlocked($contact_url)) {
+ } else {
AddContact::add(Worker::PRIORITY_LOW, 0, $contact_url);
}
}
From 5cd6d9a0f1dcdc8c35ae128501fd60f0d0b4d65d Mon Sep 17 00:00:00 2001
From: Hypolite Petovan
Date: Sat, 25 Jan 2025 12:45:47 -0500
Subject: [PATCH 046/178] Remove test code from GroupManager::widget
Oops.
---
src/Content/GroupManager.php | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/Content/GroupManager.php b/src/Content/GroupManager.php
index a484ba73ce..4e364b9053 100644
--- a/src/Content/GroupManager.php
+++ b/src/Content/GroupManager.php
@@ -108,8 +108,6 @@ class GroupManager
$entries = [];
- $contacts = [];
-
foreach ($contacts as $contact) {
$entry = [
'url' => 'contact/' . $contact['id'] . '/conversations',
From f3a160598f6b7b58914e8c18647cf96016797524 Mon Sep 17 00:00:00 2001
From: Marek Bachmann
Date: Sat, 25 Jan 2025 22:40:23 +0000
Subject: [PATCH 047/178] Refactor view.tpl for admin/logs: Use class variable
for log rows to eliminate whitespace from indentation in tr class attribute"
---
view/theme/frio/templates/admin/logs/view.tpl | 22 +++++++++----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/view/theme/frio/templates/admin/logs/view.tpl b/view/theme/frio/templates/admin/logs/view.tpl
index 8f43a6b7e2..650cee9bc0 100644
--- a/view/theme/frio/templates/admin/logs/view.tpl
+++ b/view/theme/frio/templates/admin/logs/view.tpl
@@ -70,17 +70,17 @@
aria-label="{{$l10n.View_details}}" aria-haspopup="true" aria-expanded="false"
data-data="{{$row->data}}" data-source="{{$row->source}}">
{{$row->date}} |
- level == "ALERT"}}bg-danger
- {{elseif $row->level == "CRITICAL"}}bg-danger
- {{elseif $row->level == "ERROR"}}bg-danger
- {{elseif $row->level == "WARNING"}}bg-warning
- {{elseif $row->level == "NOTICE"}}bg-info
- {{elseif $row->level == "INFO"}}bg-info
- {{else}}text-muted
- {{/if}}
- ">{{$row->level}} |
+ {{assign var="class" value="bg-info"}}
+ {{if $row->level == "EMERGENCY" || $row->level == "ALERT" || $row->level == "CRITICAL" || $row->level == "ERROR"}}
+ {{assign var="class" value="bg-danger"}}
+ {{elseif $row->level == "WARNING"}}
+ {{assign var="class" value="bg-warning"}}
+ {{elseif $row->level == "NOTICE" || $row->level == "INFO"}}
+ {{assign var="class" value="bg-info"}}
+ {{else}}
+ {{ assign var="class" value="text-muted"}}
+ {{/if}}
+ {{$row->level}} |
{{$row->context}} |
{{$row->message}} |
From 2e472f84a77e9624aa95bcd31b57b00e9893f5c4 Mon Sep 17 00:00:00 2001
From: Marek Bachmann
Date: Sat, 25 Jan 2025 22:53:42 +0000
Subject: [PATCH 048/178] Refactor view.tpl for admin/logs: Assign
bootstrap.css bg and text classes dynamically for log rows
---
view/theme/frio/templates/admin/logs/view.tpl | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/view/theme/frio/templates/admin/logs/view.tpl b/view/theme/frio/templates/admin/logs/view.tpl
index 650cee9bc0..2e27ce025e 100644
--- a/view/theme/frio/templates/admin/logs/view.tpl
+++ b/view/theme/frio/templates/admin/logs/view.tpl
@@ -70,13 +70,13 @@
aria-label="{{$l10n.View_details}}" aria-haspopup="true" aria-expanded="false"
data-data="{{$row->data}}" data-source="{{$row->source}}">
{{$row->date}} |
- {{assign var="class" value="bg-info"}}
+ {{assign var="class" value="bg-info text-info"}}
{{if $row->level == "EMERGENCY" || $row->level == "ALERT" || $row->level == "CRITICAL" || $row->level == "ERROR"}}
- {{assign var="class" value="bg-danger"}}
+ {{assign var="class" value="bg-danger text-danger"}}
{{elseif $row->level == "WARNING"}}
- {{assign var="class" value="bg-warning"}}
+ {{assign var="class" value="bg-warning text-warning"}}
{{elseif $row->level == "NOTICE" || $row->level == "INFO"}}
- {{assign var="class" value="bg-info"}}
+ {{assign var="class" value="bg-info text-info"}}
{{else}}
{{ assign var="class" value="text-muted"}}
{{/if}}
From dc0d0946109dca7ab7fb01d7a0a7c02db553f700 Mon Sep 17 00:00:00 2001
From: Marek Bachmann
Date: Sat, 25 Jan 2025 23:07:17 +0000
Subject: [PATCH 049/178] Refactor view.tpl for admin/logs: Assign
bootstrap.css text classes only (no bg adjustment)
---
view/theme/frio/templates/admin/logs/view.tpl | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/view/theme/frio/templates/admin/logs/view.tpl b/view/theme/frio/templates/admin/logs/view.tpl
index 2e27ce025e..ce0babdb04 100644
--- a/view/theme/frio/templates/admin/logs/view.tpl
+++ b/view/theme/frio/templates/admin/logs/view.tpl
@@ -70,13 +70,13 @@
aria-label="{{$l10n.View_details}}" aria-haspopup="true" aria-expanded="false"
data-data="{{$row->data}}" data-source="{{$row->source}}">
{{$row->date}} |
- {{assign var="class" value="bg-info text-info"}}
+ {{assign var="class" value="text-info"}}
{{if $row->level == "EMERGENCY" || $row->level == "ALERT" || $row->level == "CRITICAL" || $row->level == "ERROR"}}
- {{assign var="class" value="bg-danger text-danger"}}
+ {{assign var="class" value="text-danger"}}
{{elseif $row->level == "WARNING"}}
- {{assign var="class" value="bg-warning text-warning"}}
+ {{assign var="class" value="text-warning"}}
{{elseif $row->level == "NOTICE" || $row->level == "INFO"}}
- {{assign var="class" value="bg-info text-info"}}
+ {{assign var="class" value="text-info"}}
{{else}}
{{ assign var="class" value="text-muted"}}
{{/if}}
From c978c8e02728e322d79b059d054c06aad098f83f Mon Sep 17 00:00:00 2001
From: Michael
Date: Sun, 26 Jan 2025 12:35:26 +0000
Subject: [PATCH 050/178] Several accessibility improvements
---
src/App/Page.php | 1 +
src/Content/Text/BBCode.php | 4 ++--
src/Module/BaseProfile.php | 2 +-
src/Module/Calendar/Show.php | 2 ++
src/Module/Contact.php | 4 ++--
src/Module/Conversation/Channel.php | 2 +-
src/Module/Conversation/Community.php | 2 +-
src/Module/Conversation/Network.php | 2 +-
src/Module/Moderation/BaseUsers.php | 2 +-
src/Object/Post.php | 3 +++
tests/src/Content/Text/BBCodeTest.php | 4 ++--
view/theme/frio/css/style.css | 9 +++++----
view/theme/frio/php/default.php | 2 +-
view/theme/frio/php/minimal.php | 5 ++++-
view/theme/frio/php/standard.php | 4 ++--
view/theme/frio/templates/calendar/calendar.tpl | 4 ++--
view/theme/frio/templates/common_tabs.tpl | 4 ++--
view/theme/frio/templates/footer.tpl | 2 +-
view/theme/frio/templates/search_item.tpl | 6 +++---
view/theme/frio/templates/wall_thread.tpl | 16 ++++++++--------
20 files changed, 45 insertions(+), 35 deletions(-)
diff --git a/src/App/Page.php b/src/App/Page.php
index 87493a67e4..ca83173184 100644
--- a/src/App/Page.php
+++ b/src/App/Page.php
@@ -356,6 +356,7 @@ class Page implements ArrayAccess
$tpl = Renderer::getMarkupTemplate('footer.tpl');
$this->page['footer'] = Renderer::replaceMacros($tpl, [
'$footerScripts' => array_unique($this->footerScripts),
+ '$close' => $l10n->t('Close'),
]) . $this->page['footer'];
}
diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php
index f03dfa84be..2102b43a32 100644
--- a/src/Content/Text/BBCode.php
+++ b/src/Content/Text/BBCode.php
@@ -1583,7 +1583,7 @@ class BBCode
// Check for headers
if ($simple_html == self::INTERNAL) {
- //Ensure to always start with if possible
+ //Ensure to always start with if possible
$heading_count = 0;
for ($level = 6; $level > 0; $level--) {
if (preg_match("(\[h$level\].*?\[\/h$level\])ism", $text)) {
@@ -1591,7 +1591,7 @@ class BBCode
}
}
if ($heading_count > 0) {
- $heading = min($heading_count + 3, 6);
+ $heading = min($heading_count + 2, 6);
for ($level = 6; $level > 0; $level--) {
if (preg_match("(\[h$level\].*?\[\/h$level\])ism", $text)) {
$text = preg_replace("(\[h$level\](.*?)\[\/h$level\])ism", "
$1", $text);
diff --git a/src/Module/BaseProfile.php b/src/Module/BaseProfile.php
index 2fab793152..c034287469 100644
--- a/src/Module/BaseProfile.php
+++ b/src/Module/BaseProfile.php
@@ -134,6 +134,6 @@ class BaseProfile extends BaseModule
$tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- return Renderer::replaceMacros($tpl, ['$tabs' => $arr['tabs']]);
+ return Renderer::replaceMacros($tpl, ['$tabs' => $arr['tabs'], '$more' => DI::l10n()->t('More')]);
}
}
diff --git a/src/Module/Calendar/Show.php b/src/Module/Calendar/Show.php
index 0a55f7ada7..f808c9d50a 100644
--- a/src/Module/Calendar/Show.php
+++ b/src/Module/Calendar/Show.php
@@ -119,6 +119,8 @@ class Show extends BaseModule
'$week' => $this->t('week'),
'$day' => $this->t('day'),
'$list' => $this->t('list'),
+ '$prev' => $this->t('prev'),
+ '$next' => $this->t('next'),
]);
return $o;
diff --git a/src/Module/Contact.php b/src/Module/Contact.php
index b352648df7..e998160845 100644
--- a/src/Module/Contact.php
+++ b/src/Module/Contact.php
@@ -387,7 +387,7 @@ class Contact extends BaseModule
];
$tabs_tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- $tabs_html = Renderer::replaceMacros($tabs_tpl, ['$tabs' => $tabs]);
+ $tabs_html = Renderer::replaceMacros($tabs_tpl, ['$tabs' => $tabs, '$more' => DI::l10n()->t('More')]);
switch ($rel) {
case 'followers':
@@ -534,7 +534,7 @@ class Contact extends BaseModule
}
$tab_tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- $tab_str = Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs]);
+ $tab_str = Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs, '$more' => DI::l10n()->t('More')]);
return $tab_str;
}
diff --git a/src/Module/Conversation/Channel.php b/src/Module/Conversation/Channel.php
index b711a58f4e..4c060b65d7 100644
--- a/src/Module/Conversation/Channel.php
+++ b/src/Module/Conversation/Channel.php
@@ -95,7 +95,7 @@ class Channel extends Timeline
$tabs = array_merge($tabs, $this->getTabArray($this->community->getTimelines(true), 'channel'));
$tab_tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- $o .= Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs]);
+ $o .= Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs, '$more' => $this->l10n->t('More')]);
Nav::setSelected('channel');
diff --git a/src/Module/Conversation/Community.php b/src/Module/Conversation/Community.php
index 375c86ee61..e3f75ddeaf 100644
--- a/src/Module/Conversation/Community.php
+++ b/src/Module/Conversation/Community.php
@@ -88,7 +88,7 @@ class Community extends Timeline
if (!$this->raw) {
$tabs = $this->getTabArray($this->community->getTimelines($this->session->isAuthenticated()), 'community');
$tab_tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- $o .= Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs]);
+ $o .= Renderer::replaceMacros($tab_tpl, ['$tabs' => $tabs, '$more' => $this->l10n->t('More')]);
Nav::setSelected('community');
diff --git a/src/Module/Conversation/Network.php b/src/Module/Conversation/Network.php
index bf8b0614a9..d94aeb6cde 100644
--- a/src/Module/Conversation/Network.php
+++ b/src/Module/Conversation/Network.php
@@ -292,7 +292,7 @@ class Network extends Timeline
$tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- return Renderer::replaceMacros($tpl, ['$tabs' => $tabs]);
+ return Renderer::replaceMacros($tpl, ['$tabs' => $tabs, '$more' => $this->l10n->t('More')]);
}
protected function parseRequest(array $request)
diff --git a/src/Module/Moderation/BaseUsers.php b/src/Module/Moderation/BaseUsers.php
index 0123ce5bc8..fcf4b4aa16 100644
--- a/src/Module/Moderation/BaseUsers.php
+++ b/src/Module/Moderation/BaseUsers.php
@@ -99,7 +99,7 @@ abstract class BaseUsers extends BaseModeration
Hook::callAll('moderation_users_tabs', $tabs_arr);
$tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- return Renderer::replaceMacros($tpl, ['$tabs' => $tabs_arr['tabs']]);
+ return Renderer::replaceMacros($tpl, ['$tabs' => $tabs_arr['tabs'], '$more' => $this->t('More')]);
}
protected function setupUserCallback(): \Closure
diff --git a/src/Object/Post.php b/src/Object/Post.php
index aafe1b305b..363ad5e7a9 100644
--- a/src/Object/Post.php
+++ b/src/Object/Post.php
@@ -498,8 +498,10 @@ class Post
}
$languages = [];
+ $language = '';
if (!empty($item['language'])) {
$languages = DI::l10n()->t('Languages');
+ $language = array_key_first(json_decode($item['language'], true));
}
if (in_array($item['private'], [Item::PUBLIC, Item::UNLISTED]) && in_array($item['network'], Protocol::FEDERATED)) {
@@ -579,6 +581,7 @@ class Post
'tagger' => $tagger,
'filer' => $filer,
'language' => $languages,
+ 'lang' => $language,
'searchtext' => DI::l10n()->t('Search Text'),
'drop' => $drop,
'block' => $block,
diff --git a/tests/src/Content/Text/BBCodeTest.php b/tests/src/Content/Text/BBCodeTest.php
index 6d6c610762..4757200000 100644
--- a/tests/src/Content/Text/BBCodeTest.php
+++ b/tests/src/Content/Text/BBCodeTest.php
@@ -248,11 +248,11 @@ Karl Marx - Die ursprüngliche Akkumulation
'text' => '[emoji=https://fedi.underscore.world/emoji/custom/custom/heart_nb.png]:heart_nb:[/emoji]',
],
'task-12900-multiple-paragraphs' => [
- 'expectedHTML' => '
Header
This is a paragraph
with a line feed.
Second Chapter
',
+ 'expectedHTML' => 'Header
This is a paragraph
with a line feed.
Second Chapter
',
'text' => "[h4]Header[/h4][ul][li]One[li]Two[/ul]\n\nThis is a paragraph\nwith a line feed.\n\nSecond Chapter",
],
'task-12900-header-with-paragraphs' => [
- 'expectedHTML' => 'Header
Some Chapter
',
+ 'expectedHTML' => 'Header
Some Chapter
',
'text' => '[h4]Header[/h4]Some Chapter',
],
'bug-12842-ul-newlines' => [
diff --git a/view/theme/frio/css/style.css b/view/theme/frio/css/style.css
index ddcb9abef6..811f9afc4f 100644
--- a/view/theme/frio/css/style.css
+++ b/view/theme/frio/css/style.css
@@ -1806,7 +1806,8 @@ blockquote.shared_content {
}
/* wall items contact info */
-.media .media-body h4.media-heading {
+.media .media-body h1.media-heading,
+.media .media-body h2.media-heading {
font-size: 14px;
font-weight: 500;
color: $font_color_darker;
@@ -2604,7 +2605,7 @@ ul.viewcontact_wrapper > li {
.contact-entry-checkbox {
margin-top: -20px;
}
-.contact-wrapper .media-body .contact-entry-name h4.media-heading a {
+.contact-wrapper .media-body .contact-entry-name h1.media-heading a {
font-weight: bold !important;
color: $link_color;
font-size: 15px !important;
@@ -2706,10 +2707,10 @@ ul li:hover .contact-wrapper .contact-action-link:hover {
#circle-update-wrapper .shortmode .contact-entry-desc {
font-size: 12px !important;
}
-#circle-update-wrapper .shortmode .contact-entry-desc h4.media-heading {
+#circle-update-wrapper .shortmode .contact-entry-desc h1.media-heading {
margin: 0;
}
-#circle-update-wrapper .shortmode .contact-entry-desc h4.media-heading a {
+#circle-update-wrapper .shortmode .contact-entry-desc h1.media-heading a {
font-size: 13px !important;
white-space: nowrap;
}
diff --git a/view/theme/frio/php/default.php b/view/theme/frio/php/default.php
index 0f79ca718e..a0d67b474f 100644
--- a/view/theme/frio/php/default.php
+++ b/view/theme/frio/php/default.php
@@ -67,7 +67,7 @@ $is_singleuser_class = $is_singleuser ? "is-singleuser" : "is-not-singleuser";
">
- t('Skip to main content'); ?>
+ t('Skip to main content'); ?>
@@ -27,7 +30,7 @@