Merge pull request #11549 from annando/move-to-avatar-cache

Console command to move avatars to the avatar cache
This commit is contained in:
Hypolite Petovan 2022-05-25 09:03:12 -04:00 committed by GitHub
commit ae3acba231
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 347 additions and 134 deletions

View File

@ -0,0 +1,162 @@
<?php
/**
* @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Console;
use Friendica\App\BaseURL;
use Friendica\Contact\Avatar;
use Friendica\Core\L10n;
use Friendica\Model\Contact;
use Friendica\Model\Photo;
use Friendica\Util\Images;
use Friendica\Object\Image;
/**
* tool to move cached avatars to the avatar file cache.
*/
class MoveToAvatarCache extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
/**
* @var $dba Friendica\Database\Database
*/
private $dba;
/**
* @var $baseurl Friendica\App\BaseURL
*/
private $baseurl;
/**
* @var L10n
*/
private $l10n;
protected function getHelp()
{
$help = <<<HELP
console movetoavatarcache - Move all cached avatars to the file based avatar cache
Synopsis
bin/console movetoavatarcache
Description
bin/console movetoavatarcache
Move all cached avatars to the file based avatar cache
Options
-h|--help|-? Show help information
HELP;
return $help;
}
public function __construct(\Friendica\Database\Database $dba, BaseURL $baseurl, L10n $l10n, array $argv = null)
{
parent::__construct($argv);
$this->dba = $dba;
$this->baseurl = $baseurl;
$this->l10n = $l10n;
}
protected function doExecute()
{
$condition = ["`avatar` != ? AND `photo` LIKE ? AND `uid` = ? AND `uri-id` != ? AND NOT `uri-id` IS NULL",
'', $this->baseurl->get() . '/photo/%', 0, 0];
$count = 0;
$total = $this->dba->count('contact', $condition);
$contacts = $this->dba->select('contact', ['id', 'avatar', 'photo', 'uri-id', 'url', 'avatar'], $condition, ['order' => ['id']]);
while ($contact = $this->dba->fetch($contacts)) {
$this->out(++$count . '/' . $total . "\t" . $contact['id'] . "\t" . $contact['url'] . "\t", false);
$resourceid = Photo::ridFromURI($contact['photo']);
if (empty($resourceid)) {
$this->out($this->l10n->t('no resource in photo %s', $contact['photo']) . ' ', false);
}
$this->storeAvatar($resourceid, $contact, false);
}
$count = 0;
$totals = $this->dba->p("SELECT COUNT(DISTINCT(`resource-id`)) AS `total` FROM `photo` WHERE `contact-id` != ? AND `photo-type` = ?;", 0, Photo::CONTACT_AVATAR);
$total = $this->dba->fetch($totals)['total'] ?? 0;
$photos = $this->dba->p("SELECT `resource-id`, MAX(`contact-id`) AS `contact-id` FROM `photo` WHERE `contact-id` != ? AND `photo-type` = ? GROUP BY `resource-id`;", 0, Photo::CONTACT_AVATAR);
while ($photo = $this->dba->fetch($photos)) {
$contact = Contact::getById($photo['contact-id'], ['id', 'avatar', 'photo', 'uri-id', 'url', 'avatar']);
if (empty($contact)) {
continue;
}
$this->out(++$count . '/' . $total . "\t" . $contact['id'] . "\t" . $contact['url'] . "\t", false);
$this->storeAvatar($photo['resource-id'], $contact, true);
}
return 0;
}
private function storeAvatar(string $resourceid, array $contact, bool $quit_on_invalid)
{
$valid = !empty($resourceid);
if ($valid) {
$this->out('1', false);
$photo = Photo::selectFirst([], ['resource-id' => $resourceid], ['order' => ['scale']]);
if (empty($photo)) {
$this->out(' ' . $this->l10n->t('no photo with id %s', $resourceid) . ' ', false);
$valid = false;
}
}
if ($valid) {
$this->out('2', false);
$imgdata = Photo::getImageDataForPhoto($photo);
if (empty($imgdata)) {
$this->out(' ' . $this->l10n->t('no image data for photo with id %s', $resourceid) . ' ', false);
$valid = false;
}
}
if ($valid) {
$this->out('3', false);
$image = new Image($imgdata, Images::getMimeTypeByData($imgdata));
if (!$image->isValid()) {
$this->out(' ' . $this->l10n->t('invalid image for id %s', $resourceid) . ' ', false);
$valid = false;
}
}
if ($valid) {
$this->out('4', false);
$fields = Avatar::storeAvatarByImage($contact, $image);
} else {
$fields = ['photo' => '', 'thumb' => '', 'micro' => ''];
}
if ($quit_on_invalid && $fields['photo'] == '') {
$this->out(' ' . $this->l10n->t('Quit on invalid photo %s', $contact['avatar']));
Photo::delete(['resource-id' => $resourceid]);
return;
}
$this->out('5', false);
Contact::update($fields, ['uri-id' => $contact['uri-id']]);
$this->out('6', false);
Photo::delete(['resource-id' => $resourceid]);
$this->out(' ' . $fields['photo']);
}
}

View File

@ -72,11 +72,6 @@ class Avatar
return $fields;
}
$guid = Item::guidFromUri($contact['url'], parse_url($contact['url'], PHP_URL_HOST));
$filename = substr($guid, 0, 2) . '/' . substr($guid, 3, 2) . '/' . substr($guid, 5, 3) . '/' .
substr($guid, 9, 2) .'/' . substr($guid, 11, 2) . '/' . substr($guid, 13, 4). '/' . substr($guid, 18) . '-';
$fetchResult = HTTPSignature::fetchRaw($avatar, 0, [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::IMAGE]]);
$img_str = $fetchResult->getBody();
@ -91,6 +86,8 @@ class Avatar
return $fields;
}
$filename = self::getFilename($contact['url']);
$fields['photo'] = self::storeAvatarCache($image, $filename, Proxy::PIXEL_SMALL);
$fields['thumb'] = self::storeAvatarCache($image, $filename, Proxy::PIXEL_THUMB);
$fields['micro'] = self::storeAvatarCache($image, $filename, Proxy::PIXEL_MICRO);
@ -100,6 +97,36 @@ class Avatar
return $fields;
}
public static function storeAvatarByImage(array $contact, Image $image): array
{
$fields = ['photo' => '', 'thumb' => '', 'micro' => ''];
if (!DI::config()->get('system', 'avatar_cache')) {
self::deleteCache($contact);
return $fields;
}
if (Network::isLocalLink($contact['avatar'])) {
return $fields;
}
$filename = self::getFilename($contact['url']);
$fields['photo'] = self::storeAvatarCache($image, $filename, Proxy::PIXEL_SMALL);
$fields['thumb'] = self::storeAvatarCache($image, $filename, Proxy::PIXEL_THUMB);
$fields['micro'] = self::storeAvatarCache($image, $filename, Proxy::PIXEL_MICRO);
return $fields;
}
private static function getFilename(string $url)
{
$guid = Item::guidFromUri($url, parse_url($url, PHP_URL_HOST));
return substr($guid, 0, 2) . '/' . substr($guid, 3, 2) . '/' . substr($guid, 5, 3) . '/' .
substr($guid, 9, 2) .'/' . substr($guid, 11, 2) . '/' . substr($guid, 13, 4). '/' . substr($guid, 18) . '-';
}
private static function storeAvatarCache(Image $image, string $filename, int $size): string
{
$image->scaleDown($size);

View File

@ -59,6 +59,7 @@ Commands:
autoinstall Starts automatic installation of friendica based on values from htconfig.php
lock Edit site locks
maintenance Set maintenance mode for this node
movetoavatarcache Move cached avatars to the file based avatar cache
user User management
php2po Generate a messages.po file from a strings.php file
po2php Generate a strings.php file from a messages.po file
@ -91,6 +92,7 @@ HELP;
'globalcommunitysilence' => Friendica\Console\GlobalCommunitySilence::class,
'lock' => Friendica\Console\Lock::class,
'maintenance' => Friendica\Console\Maintenance::class,
'movetoavatarcache' => Friendica\Console\MoveToAvatarCache::class,
'php2po' => Friendica\Console\PhpToPo::class,
'postupdate' => Friendica\Console\PostUpdate::class,
'po2php' => Friendica\Console\PoToPhp::class,

View File

@ -704,10 +704,7 @@ class Photo
}
$image_uri = substr($image_uri, strrpos($image_uri, '/') + 1);
$image_uri = substr($image_uri, 0, strpos($image_uri, '-'));
if (!strlen($image_uri)) {
return '';
}
return $image_uri;
return trim($image_uri);
}
/**

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2022.05-rc\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-16 06:01+0000\n"
"POT-Creation-Date: 2022-05-24 20:12+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -20,7 +20,7 @@ msgstr ""
#: mod/cal.php:46 mod/cal.php:50 mod/follow.php:39 mod/redir.php:36
#: mod/redir.php:177 src/Module/Conversation/Community.php:181
#: src/Module/Debug/ItemBody.php:37 src/Module/Diaspora/Receive.php:57
#: src/Module/Debug/ItemBody.php:38 src/Module/Diaspora/Receive.php:57
#: src/Module/Item/Follow.php:42 src/Module/Item/Ignore.php:41
#: src/Module/Item/Pin.php:42 src/Module/Item/Pin.php:57
#: src/Module/Item/Star.php:43
@ -119,7 +119,7 @@ msgid "The feed for this item is unavailable."
msgstr ""
#: mod/editpost.php:38 mod/events.php:217 mod/follow.php:56 mod/follow.php:130
#: mod/item.php:181 mod/item.php:186 mod/item.php:873 mod/message.php:69
#: mod/item.php:181 mod/item.php:186 mod/item.php:875 mod/message.php:69
#: mod/message.php:111 mod/notes.php:44 mod/ostatus_subscribe.php:33
#: mod/photos.php:160 mod/photos.php:897 mod/repair_ostatus.php:31
#: mod/settings.php:49 mod/settings.php:59 mod/settings.php:165
@ -127,7 +127,7 @@ msgstr ""
#: mod/unfollow.php:50 mod/unfollow.php:82 mod/wall_attach.php:67
#: mod/wall_attach.php:69 mod/wall_upload.php:89 mod/wall_upload.php:91
#: mod/wallmessage.php:37 mod/wallmessage.php:56 mod/wallmessage.php:90
#: mod/wallmessage.php:110 src/Module/Attach.php:55 src/Module/BaseApi.php:93
#: mod/wallmessage.php:110 src/Module/Attach.php:56 src/Module/BaseApi.php:93
#: src/Module/BaseNotifications.php:97 src/Module/Contact/Advanced.php:60
#: src/Module/Delegation.php:119 src/Module/FollowConfirm.php:38
#: src/Module/FriendSuggest.php:56 src/Module/Group.php:42
@ -144,7 +144,7 @@ msgstr ""
#: src/Module/Settings/Display.php:120
#: src/Module/Settings/Profile/Photo/Crop.php:166
#: src/Module/Settings/Profile/Photo/Index.php:112
#: src/Module/Settings/UserExport.php:57 src/Module/Settings/UserExport.php:91
#: src/Module/Settings/UserExport.php:58 src/Module/Settings/UserExport.php:92
#: src/Module/Settings/UserExport.php:196
#: src/Module/Settings/UserExport.php:216
#: src/Module/Settings/UserExport.php:281
@ -467,7 +467,7 @@ msgid "OStatus support is disabled. Contact can't be added."
msgstr ""
#: mod/follow.php:138 src/Content/Item.php:443 src/Content/Widget.php:78
#: src/Model/Contact.php:1088 src/Model/Contact.php:1100
#: src/Model/Contact.php:1101 src/Model/Contact.php:1113
#: view/theme/vier/theme.php:172
msgid "Connect/Follow"
msgstr ""
@ -520,21 +520,21 @@ msgstr ""
msgid "Empty post discarded."
msgstr ""
#: mod/item.php:685
#: mod/item.php:687
msgid "Post updated."
msgstr ""
#: mod/item.php:695 mod/item.php:700
#: mod/item.php:697 mod/item.php:702
msgid "Item wasn't stored."
msgstr ""
#: mod/item.php:711
#: mod/item.php:713
msgid "Item couldn't be fetched."
msgstr ""
#: mod/item.php:851 src/Module/Admin/Themes/Details.php:39
#: src/Module/Admin/Themes/Index.php:59 src/Module/Debug/ItemBody.php:41
#: src/Module/Debug/ItemBody.php:56
#: mod/item.php:853 src/Module/Admin/Themes/Details.php:39
#: src/Module/Admin/Themes/Index.php:59 src/Module/Debug/ItemBody.php:42
#: src/Module/Debug/ItemBody.php:57
msgid "Item not found."
msgstr ""
@ -1408,7 +1408,7 @@ msgstr ""
msgid "Friend Suggestions"
msgstr ""
#: mod/tagger.php:78 src/Content/Item.php:342 src/Model/Item.php:2694
#: mod/tagger.php:78 src/Content/Item.php:342 src/Model/Item.php:2699
msgid "photo"
msgstr ""
@ -1522,7 +1522,7 @@ msgstr ""
msgid "File upload failed."
msgstr ""
#: mod/wall_upload.php:218 src/Model/Photo.php:1064
#: mod/wall_upload.php:218 src/Model/Photo.php:1061
msgid "Wall Photos"
msgstr ""
@ -1550,21 +1550,21 @@ msgstr ""
msgid "No system theme config value set."
msgstr ""
#: src/App.php:583
#: src/App.php:584
msgid "Apologies but the website is unavailable at the moment."
msgstr ""
#: src/App/Page.php:252
#: src/App/Page.php:276
msgid "Delete this item?"
msgstr ""
#: src/App/Page.php:253
#: src/App/Page.php:277
msgid ""
"Block this author? They won't be able to follow you nor see your public "
"posts, and you won't be able to see their posts and their notifications."
msgstr ""
#: src/App/Page.php:323
#: src/App/Page.php:347
msgid "toggle mobile"
msgstr ""
@ -1573,7 +1573,7 @@ msgstr ""
msgid "Method not allowed for this module. Allowed method(s): %s"
msgstr ""
#: src/App/Router.php:277 src/Module/HTTPException/PageNotFound.php:33
#: src/App/Router.php:277 src/Module/HTTPException/PageNotFound.php:34
msgid "Page not found."
msgstr ""
@ -1592,8 +1592,8 @@ msgid "All contacts"
msgstr ""
#: src/BaseModule.php:409 src/Content/Widget.php:233 src/Core/ACL.php:194
#: src/Module/Contact.php:367 src/Module/PermissionTooltip.php:121
#: src/Module/PermissionTooltip.php:143
#: src/Module/Contact.php:367 src/Module/PermissionTooltip.php:122
#: src/Module/PermissionTooltip.php:144
msgid "Followers"
msgstr ""
@ -1641,6 +1641,31 @@ msgstr ""
msgid "The contact has been blocked from the node"
msgstr ""
#: src/Console/MoveToAvatarCache.php:92
#, php-format
msgid "no resource in photo %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:118
#, php-format
msgid "no photo with id %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:127
#, php-format
msgid "no image data for photo with id %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:136
#, php-format
msgid "invalid image for id %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:149
#, php-format
msgid "Quit on invalid photo %s"
msgstr ""
#: src/Console/PostUpdate.php:87
#, php-format
msgid "Post update version number has been set to %s."
@ -2183,7 +2208,7 @@ msgstr ""
msgid "%1$s poked %2$s"
msgstr ""
#: src/Content/Item.php:334 src/Model/Item.php:2692
#: src/Content/Item.php:334 src/Model/Item.php:2697
msgid "event"
msgstr ""
@ -2191,31 +2216,31 @@ msgstr ""
msgid "Follow Thread"
msgstr ""
#: src/Content/Item.php:423 src/Model/Contact.php:1093
#: src/Content/Item.php:423 src/Model/Contact.php:1106
msgid "View Status"
msgstr ""
#: src/Content/Item.php:424 src/Content/Item.php:446 src/Model/Contact.php:1027
#: src/Model/Contact.php:1085 src/Model/Contact.php:1094
#: src/Content/Item.php:424 src/Content/Item.php:446 src/Model/Contact.php:1040
#: src/Model/Contact.php:1098 src/Model/Contact.php:1107
#: src/Module/Directory.php:158 src/Module/Settings/Profile/Index.php:225
msgid "View Profile"
msgstr ""
#: src/Content/Item.php:425 src/Model/Contact.php:1095
#: src/Content/Item.php:425 src/Model/Contact.php:1108
msgid "View Photos"
msgstr ""
#: src/Content/Item.php:426 src/Model/Contact.php:1086
#: src/Model/Contact.php:1096
#: src/Content/Item.php:426 src/Model/Contact.php:1099
#: src/Model/Contact.php:1109
msgid "Network Posts"
msgstr ""
#: src/Content/Item.php:427 src/Model/Contact.php:1087
#: src/Model/Contact.php:1097
#: src/Content/Item.php:427 src/Model/Contact.php:1100
#: src/Model/Contact.php:1110
msgid "View Contact"
msgstr ""
#: src/Content/Item.php:428 src/Model/Contact.php:1098
#: src/Content/Item.php:428 src/Model/Contact.php:1111
msgid "Send PM"
msgstr ""
@ -2238,7 +2263,7 @@ msgstr ""
msgid "Languages"
msgstr ""
#: src/Content/Item.php:438 src/Model/Contact.php:1099
#: src/Content/Item.php:438 src/Model/Contact.php:1112
msgid "Poke"
msgstr ""
@ -2534,8 +2559,8 @@ msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:1188 src/Model/Item.php:3258
#: src/Model/Item.php:3264 src/Model/Item.php:3265
#: src/Content/Text/BBCode.php:1188 src/Model/Item.php:3271
#: src/Model/Item.php:3277 src/Model/Item.php:3278
msgid "Link to source"
msgstr ""
@ -2551,11 +2576,11 @@ msgstr ""
msgid "Encrypted content"
msgstr ""
#: src/Content/Text/BBCode.php:2005
#: src/Content/Text/BBCode.php:2008
msgid "Invalid source protocol"
msgstr ""
#: src/Content/Text/BBCode.php:2020
#: src/Content/Text/BBCode.php:2023
msgid "Invalid link protocol"
msgstr ""
@ -2690,7 +2715,7 @@ msgstr ""
msgid "Organisations"
msgstr ""
#: src/Content/Widget.php:521 src/Model/Contact.php:1523
#: src/Content/Widget.php:521 src/Model/Contact.php:1536
msgid "News"
msgstr ""
@ -2771,8 +2796,8 @@ msgstr ""
msgid "Yourself"
msgstr ""
#: src/Core/ACL.php:201 src/Module/PermissionTooltip.php:127
#: src/Module/PermissionTooltip.php:149
#: src/Core/ACL.php:201 src/Module/PermissionTooltip.php:128
#: src/Module/PermissionTooltip.php:150
msgid "Mutuals"
msgstr ""
@ -2780,7 +2805,7 @@ msgstr ""
msgid "Post to Email"
msgstr ""
#: src/Core/ACL.php:320 src/Module/PermissionTooltip.php:84
#: src/Core/ACL.php:320 src/Module/PermissionTooltip.php:85
#: src/Module/PermissionTooltip.php:197
msgid "Public"
msgstr ""
@ -2791,7 +2816,7 @@ msgid ""
"community pages and by anyone with its link."
msgstr ""
#: src/Core/ACL.php:322 src/Module/PermissionTooltip.php:92
#: src/Core/ACL.php:322 src/Module/PermissionTooltip.php:93
msgid "Limited/Private"
msgstr ""
@ -3518,81 +3543,81 @@ msgstr ""
msgid "Legacy module file not found: %s"
msgstr ""
#: src/Model/Contact.php:1089 src/Model/Contact.php:1101
#: src/Model/Contact.php:1102 src/Model/Contact.php:1114
msgid "UnFollow"
msgstr ""
#: src/Model/Contact.php:1107 src/Module/Admin/Users/Pending.php:107
#: src/Model/Contact.php:1120 src/Module/Admin/Users/Pending.php:107
#: src/Module/Notifications/Introductions.php:130
#: src/Module/Notifications/Introductions.php:202
msgid "Approve"
msgstr ""
#: src/Model/Contact.php:1519
#: src/Model/Contact.php:1532
msgid "Organisation"
msgstr ""
#: src/Model/Contact.php:1527
#: src/Model/Contact.php:1540
msgid "Forum"
msgstr ""
#: src/Model/Contact.php:2503
#: src/Model/Contact.php:2516
msgid "Disallowed profile URL."
msgstr ""
#: src/Model/Contact.php:2508 src/Module/Friendica.php:81
#: src/Model/Contact.php:2521 src/Module/Friendica.php:81
msgid "Blocked domain"
msgstr ""
#: src/Model/Contact.php:2513
#: src/Model/Contact.php:2526
msgid "Connect URL missing."
msgstr ""
#: src/Model/Contact.php:2522
#: src/Model/Contact.php:2535
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr ""
#: src/Model/Contact.php:2559
#: src/Model/Contact.php:2572
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: src/Model/Contact.php:2561
#: src/Model/Contact.php:2574
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: src/Model/Contact.php:2564
#: src/Model/Contact.php:2577
msgid "An author or name was not found."
msgstr ""
#: src/Model/Contact.php:2567
#: src/Model/Contact.php:2580
msgid "No browser URL could be matched to this address."
msgstr ""
#: src/Model/Contact.php:2570
#: src/Model/Contact.php:2583
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr ""
#: src/Model/Contact.php:2571
#: src/Model/Contact.php:2584
msgid "Use mailto: in front of address to force email check."
msgstr ""
#: src/Model/Contact.php:2577
#: src/Model/Contact.php:2590
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: src/Model/Contact.php:2582
#: src/Model/Contact.php:2595
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: src/Model/Contact.php:2641
#: src/Model/Contact.php:2654
msgid "Unable to retrieve contact information."
msgstr ""
@ -3712,58 +3737,58 @@ msgstr ""
msgid "Edit groups"
msgstr ""
#: src/Model/Item.php:1790
#: src/Model/Item.php:1795
#, php-format
msgid "Detected languages in this post:\\n%s"
msgstr ""
#: src/Model/Item.php:2696
#: src/Model/Item.php:2701
msgid "activity"
msgstr ""
#: src/Model/Item.php:2698
#: src/Model/Item.php:2703
msgid "comment"
msgstr ""
#: src/Model/Item.php:2701
#: src/Model/Item.php:2706
msgid "post"
msgstr ""
#: src/Model/Item.php:2816
#: src/Model/Item.php:2821
#, php-format
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3167
#: src/Model/Item.php:3180
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3201
#: src/Model/Item.php:3214
#, php-format
msgid "%s (%d%s, %d votes)"
msgstr ""
#: src/Model/Item.php:3203
#: src/Model/Item.php:3216
#, php-format
msgid "%s (%d votes)"
msgstr ""
#: src/Model/Item.php:3208
#: src/Model/Item.php:3221
#, php-format
msgid "%d voters. Poll end: %s"
msgstr ""
#: src/Model/Item.php:3210
#: src/Model/Item.php:3223
#, php-format
msgid "%d voters."
msgstr ""
#: src/Model/Item.php:3212
#: src/Model/Item.php:3225
#, php-format
msgid "Poll end: %s"
msgstr ""
#: src/Model/Item.php:3246 src/Model/Item.php:3247
#: src/Model/Item.php:3259 src/Model/Item.php:3260
msgid "View on separate page"
msgstr ""
@ -6414,7 +6439,7 @@ msgstr ""
msgid "Applications"
msgstr ""
#: src/Module/Attach.php:49 src/Module/Attach.php:61
#: src/Module/Attach.php:50 src/Module/Attach.php:62
msgid "Item was not found."
msgstr ""
@ -6579,7 +6604,7 @@ msgstr ""
msgid "Connected apps"
msgstr ""
#: src/Module/BaseSettings.php:106 src/Module/Settings/UserExport.php:75
#: src/Module/BaseSettings.php:106 src/Module/Settings/UserExport.php:76
msgid "Export personal data"
msgstr ""
@ -8085,24 +8110,24 @@ msgstr ""
msgid "Unsupported or missing grant type"
msgstr ""
#: src/Module/PermissionTooltip.php:48
#: src/Module/PermissionTooltip.php:49
#, php-format
msgid "Wrong type \"%s\", expected one of: %s"
msgstr ""
#: src/Module/PermissionTooltip.php:65
#: src/Module/PermissionTooltip.php:66
msgid "Model not found"
msgstr ""
#: src/Module/PermissionTooltip.php:88
#: src/Module/PermissionTooltip.php:89
msgid "Unlisted"
msgstr ""
#: src/Module/PermissionTooltip.php:106
#: src/Module/PermissionTooltip.php:107
msgid "Remote privacy information not available."
msgstr ""
#: src/Module/PermissionTooltip.php:115
#: src/Module/PermissionTooltip.php:116
msgid "Visible to:"
msgstr ""
@ -8136,21 +8161,21 @@ msgstr ""
msgid "<b>BCC:</b> %s<br>"
msgstr ""
#: src/Module/Photo.php:127
#: src/Module/Photo.php:128
msgid "The Photo is not available."
msgstr ""
#: src/Module/Photo.php:140
#: src/Module/Photo.php:141
#, php-format
msgid "The Photo with id %s is not available."
msgstr ""
#: src/Module/Photo.php:173
#: src/Module/Photo.php:174
#, php-format
msgid "Invalid external resource with url %s."
msgstr ""
#: src/Module/Photo.php:175
#: src/Module/Photo.php:176
#, php-format
msgid "Invalid photo with id %s."
msgstr ""
@ -9761,32 +9786,32 @@ msgstr ""
msgid "Verify code and enable two-factor authentication"
msgstr ""
#: src/Module/Settings/UserExport.php:67
#: src/Module/Settings/UserExport.php:68
msgid "Export account"
msgstr ""
#: src/Module/Settings/UserExport.php:67
#: src/Module/Settings/UserExport.php:68
msgid ""
"Export your account info and contacts. Use this to make a backup of your "
"account and/or to move it to another server."
msgstr ""
#: src/Module/Settings/UserExport.php:68
#: src/Module/Settings/UserExport.php:69
msgid "Export all"
msgstr ""
#: src/Module/Settings/UserExport.php:68
#: src/Module/Settings/UserExport.php:69
msgid ""
"Export your account info, contacts and all your items as json. Could be a "
"very big file, and could take a lot of time. Use this to make a full backup "
"of your account (photos are not exported)"
msgstr ""
#: src/Module/Settings/UserExport.php:69
#: src/Module/Settings/UserExport.php:70
msgid "Export Contacts to CSV"
msgstr ""
#: src/Module/Settings/UserExport.php:69
#: src/Module/Settings/UserExport.php:70
msgid ""
"Export the list of the accounts you are following as CSV file. Compatible to "
"e.g. Mastodon."
@ -10057,155 +10082,155 @@ msgstr ""
msgid "New Follower"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:119
#: src/Navigation/Notifications/Factory/Notification.php:131
#, php-format
msgid "%1$s wants to follow you"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:121
#: src/Navigation/Notifications/Factory/Notification.php:133
#, php-format
msgid "%1$s has started following you"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:186
#: src/Navigation/Notifications/Factory/Notification.php:197
#, php-format
msgid "%1$s liked your comment on %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:189
#: src/Navigation/Notifications/Factory/Notification.php:200
#, php-format
msgid "%1$s liked your post %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:196
#: src/Navigation/Notifications/Factory/Notification.php:207
#, php-format
msgid "%1$s disliked your comment on %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:199
#: src/Navigation/Notifications/Factory/Notification.php:210
#, php-format
msgid "%1$s disliked your post %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:206
#: src/Navigation/Notifications/Factory/Notification.php:217
#, php-format
msgid "%1$s shared your comment %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:209
#: src/Navigation/Notifications/Factory/Notification.php:220
#, php-format
msgid "%1$s shared your post %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:213
#: src/Navigation/Notifications/Factory/Notification.php:282
#: src/Navigation/Notifications/Factory/Notification.php:224
#: src/Navigation/Notifications/Factory/Notification.php:293
#, php-format
msgid "%1$s shared the post %2$s from %3$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:215
#: src/Navigation/Notifications/Factory/Notification.php:284
#: src/Navigation/Notifications/Factory/Notification.php:226
#: src/Navigation/Notifications/Factory/Notification.php:295
#, php-format
msgid "%1$s shared a post from %3$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:217
#: src/Navigation/Notifications/Factory/Notification.php:286
#: src/Navigation/Notifications/Factory/Notification.php:228
#: src/Navigation/Notifications/Factory/Notification.php:297
#, php-format
msgid "%1$s shared the post %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:219
#: src/Navigation/Notifications/Factory/Notification.php:288
#: src/Navigation/Notifications/Factory/Notification.php:230
#: src/Navigation/Notifications/Factory/Notification.php:299
#, php-format
msgid "%1$s shared a post"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:227
#: src/Navigation/Notifications/Factory/Notification.php:238
#, php-format
msgid "%1$s wants to attend your event %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:234
#: src/Navigation/Notifications/Factory/Notification.php:245
#, php-format
msgid "%1$s does not want to attend your event %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:241
#: src/Navigation/Notifications/Factory/Notification.php:252
#, php-format
msgid "%1$s maybe wants to attend your event %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:248
#: src/Navigation/Notifications/Factory/Notification.php:259
#, php-format
msgid "%1$s tagged you on %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:252
#: src/Navigation/Notifications/Factory/Notification.php:263
#, php-format
msgid "%1$s replied to you on %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:256
#: src/Navigation/Notifications/Factory/Notification.php:267
#, php-format
msgid "%1$s commented in your thread %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:260
#: src/Navigation/Notifications/Factory/Notification.php:271
#, php-format
msgid "%1$s commented on your comment %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:266
#: src/Navigation/Notifications/Factory/Notification.php:277
#, php-format
msgid "%1$s commented in their thread %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:268
#: src/Navigation/Notifications/Factory/Notification.php:279
#, php-format
msgid "%1$s commented in their thread"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:270
#: src/Navigation/Notifications/Factory/Notification.php:281
#, php-format
msgid "%1$s commented in the thread %2$s from %3$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:272
#: src/Navigation/Notifications/Factory/Notification.php:283
#, php-format
msgid "%1$s commented in the thread from %3$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:277
#: src/Navigation/Notifications/Factory/Notification.php:288
#, php-format
msgid "%1$s commented on your thread %2$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:214
#: src/Navigation/Notifications/Repository/Notify.php:215
#: src/Navigation/Notifications/Repository/Notify.php:697
msgid "[Friendica:Notify]"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:278
#: src/Navigation/Notifications/Repository/Notify.php:279
#, php-format
msgid "%s New mail received at %s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:280
#: src/Navigation/Notifications/Repository/Notify.php:281
#, php-format
msgid "%1$s sent you a new private message at %2$s."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:281
#: src/Navigation/Notifications/Repository/Notify.php:282
msgid "a private message"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:281
#: src/Navigation/Notifications/Repository/Notify.php:282
#, php-format
msgid "%1$s sent you %2$s."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:283
#: src/Navigation/Notifications/Repository/Notify.php:284
#, php-format
msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
@ -10226,7 +10251,7 @@ msgid "%1$s commented on their %2$s %3$s"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:327
#: src/Navigation/Notifications/Repository/Notify.php:732
#: src/Navigation/Notifications/Repository/Notify.php:731
#, php-format
msgid "%1$s Comment to conversation #%2$d by %3$s"
msgstr ""
@ -10239,7 +10264,7 @@ msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:333
#: src/Navigation/Notifications/Repository/Notify.php:348
#: src/Navigation/Notifications/Repository/Notify.php:367
#: src/Navigation/Notifications/Repository/Notify.php:747
#: src/Navigation/Notifications/Repository/Notify.php:746
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
@ -10427,12 +10452,12 @@ msgstr ""
msgid "Please visit %s to approve or reject the request."
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:726
#: src/Navigation/Notifications/Repository/Notify.php:725
#, php-format
msgid "%s %s tagged you"
msgstr ""
#: src/Navigation/Notifications/Repository/Notify.php:729
#: src/Navigation/Notifications/Repository/Notify.php:728
#, php-format
msgid "%s %s shared a new post"
msgstr ""