From f775d6e04934e8bdf34f8aa9093b7b67b94e38a6 Mon Sep 17 00:00:00 2001 From: Art4 Date: Wed, 25 Dec 2024 10:41:37 +0000 Subject: [PATCH 01/42] 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 02/42] 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 03/42] 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 04/42] 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 05/42] 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 06/42] 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 07/42] 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 08/42] 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 09/42] 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 10/42] 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 11/42] 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 12/42] 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 13/42] 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 14/42] 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 15/42] 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 16/42] 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 17/42] 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 18/42] 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 19/42] 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 20/42] 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 21/42] 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 22/42] 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 23/42] 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 24/42] 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 25/42] 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 26/42] 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 27/42] 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 28/42] 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 29/42] 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 30/42] 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 31/42] 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 32/42] 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 33/42] 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 34/42] 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 35/42] 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 36/42] 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 37/42] 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 38/42] 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 39/42] 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 40/42] 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 41/42] 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 42/42] 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