Merge remote-tracking branch 'upstream/develop' into channel-relay

This commit is contained in:
Michael 2024-01-15 19:41:26 +00:00
commit 23b247d1c3
14 changed files with 1776 additions and 204 deletions

3
.gitignore vendored
View File

@ -83,8 +83,9 @@ venv/
#Ignore temporary installed phpunit #Ignore temporary installed phpunit
/bin/phpunit /bin/phpunit
#Ignore cache file #Ignore cache files
.php_cs.cache .php_cs.cache
.php-cs-fixer.cache
#ignore avatar picture cache path #ignore avatar picture cache path
/avatar /avatar

93
.php-cs-fixer.dist.php Normal file
View File

@ -0,0 +1,93 @@
<?php
/**
* @copyright Copyright (C) 2010-2024, 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/>.
*/
declare(strict_types=1);
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->notPath('addon')
->notPath('bin/dev')
->notPath('config')
->notPath('doc')
->notPath('images')
->notPath('mods')
->notPath('spec')
->notPath('vendor')
->notPath('view/asset')
->notPath('lang')
->notPath('view/smarty3/compiled');
$config = new PhpCsFixer\Config();
return $config
->setRules([
'@PSR1' => true,
'@PSR2' => true,
'@PSR12' => true,
'align_multiline_comment' => true,
'array_indentation' => true,
'array_syntax' => [
'syntax' => 'short',
],
'binary_operator_spaces' => [
'default' => 'single_space',
'operators' => [
'=>' => 'align_single_space_minimal',
'=' => 'align_single_space_minimal',
'??' => 'align_single_space_minimal',
],
],
'blank_line_after_namespace' => true,
'braces' => [
'position_after_anonymous_constructs' => 'same',
'position_after_control_structures' => 'same',
'position_after_functions_and_oop_constructs' => 'next',
],
'elseif' => true,
'encoding' => true,
'full_opening_tag' => true,
'function_declaration' => [
'closure_function_spacing' => 'one',
],
'indentation_type' => true,
'line_ending' => true,
'list_syntax' => [
'syntax' => 'long',
],
'lowercase_keywords' => true,
'method_argument_space' => [],
'no_closing_tag' => true,
'no_spaces_after_function_name' => true,
'no_spaces_inside_parenthesis' => true,
'no_trailing_whitespace' => true,
'no_trailing_whitespace_in_comment' => true,
'no_unused_imports' => true,
'single_blank_line_at_eof' => true,
'single_class_element_per_statement' => true,
'single_import_per_statement' => true,
'single_line_after_imports' => true,
'switch_case_space' => true,
'ternary_operator_spaces' => false,
'visibility_required' => [
'elements' => ['property', 'method']
],
'new_with_braces' => true,
])
->setFinder($finder)
->setIndent("\t");

View File

@ -6,6 +6,7 @@ require_once __DIR__ . '/bin/dev/php-cs-fixer/vendor/autoload.php';
$finder = PhpCsFixer\Finder::create() $finder = PhpCsFixer\Finder::create()
->in(__DIR__) ->in(__DIR__)
->notPath('addon')
->notPath('bin/dev') ->notPath('bin/dev')
->notPath('config') ->notPath('config')
->notPath('doc') ->notPath('doc')

View File

@ -135,7 +135,8 @@
"mockery/mockery": "^1.3", "mockery/mockery": "^1.3",
"mikey179/vfsstream": "^1.6", "mikey179/vfsstream": "^1.6",
"phpunit/phpunit": "^9", "phpunit/phpunit": "^9",
"dms/phpunit-arraysubset-asserts": "^0.3.1" "dms/phpunit-arraysubset-asserts": "^0.3.1",
"friendsofphp/php-cs-fixer": "^3.46"
}, },
"scripts": { "scripts": {
"test": "phpunit", "test": "phpunit",
@ -149,6 +150,8 @@
"cs:fix": [ "cs:fix": [
"@cs:install", "@cs:install",
"bin/dev/php-cs-fixer/vendor/bin/php-cs-fixer fix" "bin/dev/php-cs-fixer/vendor/bin/php-cs-fixer fix"
] ],
"cs:check-v3": "vendor/bin/php-cs-fixer check --diff",
"cs:fix-v3": "vendor/bin/php-cs-fixer fix"
} }
} }

1589
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -215,14 +215,14 @@ function photos_post(App $a)
// get the list of photos we are about to delete // get the list of photos we are about to delete
if ($visitor) { if ($visitor) {
$r = DBA::toArray(DBA::p( $r = DBA::toArray(DBA::p(
"SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `contact-id` = ? AND `uid` = ? AND `album` = ?", "SELECT distinct(`resource-id`) AS `rid` FROM `photo` WHERE `contact-id` = ? AND `uid` = ? AND `album` = ?",
$visitor, $visitor,
$page_owner_uid, $page_owner_uid,
$album $album
)); ));
} else { } else {
$r = DBA::toArray(DBA::p( $r = DBA::toArray(DBA::p(
"SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `uid` = ? AND `album` = ?", "SELECT distinct(`resource-id`) AS `rid` FROM `photo` WHERE `uid` = ? AND `album` = ?",
DI::userSession()->getLocalUserId(), DI::userSession()->getLocalUserId(),
$album $album
)); ));
@ -762,7 +762,7 @@ function photos_content(App $a)
$total = 0; $total = 0;
$r = DBA::toArray(DBA::p( $r = DBA::toArray(DBA::p(
"SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND `album` = ? "SELECT `resource-id`, MAX(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND `album` = ?
AND `scale` <= 4 $sql_extra GROUP BY `resource-id`", AND `scale` <= 4 $sql_extra GROUP BY `resource-id`",
$owner_uid, $owner_uid,
$album $album
@ -782,9 +782,9 @@ function photos_content(App $a)
} }
$r = DBA::toArray(DBA::p( $r = DBA::toArray(DBA::p(
"SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`, "SELECT `resource-id`, MIN(`id`) AS `id`, MIN(`filename`) AS `filename`,
ANY_VALUE(`type`) AS `type`, max(`scale`) AS `scale`, ANY_VALUE(`desc`) as `desc`, MIN(`type`) AS `type`, MAX(`scale`) AS `scale`, MIN(`desc`) AS `desc`,
ANY_VALUE(`created`) as `created` MIN(`created`) AS `created`
FROM `photo` WHERE `uid` = ? AND `album` = ? FROM `photo` WHERE `uid` = ? AND `album` = ?
AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` $order LIMIT ? , ?", AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` $order LIMIT ? , ?",
intval($owner_uid), intval($owner_uid),
@ -1167,11 +1167,11 @@ function photos_content(App $a)
} }
if (!empty($conv_responses['like'][$link_item['uri']])) { if (!empty($conv_responses['like'][$link_item['uri']])) {
$like = DI::conversation()->formatActivity($conv_responses['like'][$link_item['uri']]['links'], 'like', $link_item['id']); $like = DI::conversation()->formatActivity($conv_responses['like'][$link_item['uri']]['links'], 'like', $link_item['id'], '', []);
} }
if (!empty($conv_responses['dislike'][$link_item['uri']])) { if (!empty($conv_responses['dislike'][$link_item['uri']])) {
$dislike = DI::conversation()->formatActivity($conv_responses['dislike'][$link_item['uri']]['links'], 'dislike', $link_item['id']); $dislike = DI::conversation()->formatActivity($conv_responses['dislike'][$link_item['uri']]['links'], 'dislike', $link_item['id'], '', []);
} }
if (($can_post || Security::canWriteToUserWall($owner_uid))) { if (($can_post || Security::canWriteToUserWall($owner_uid))) {

View File

@ -132,22 +132,6 @@ class DBA
return DI::dba()->connected(); return DI::dba()->connected();
} }
/**
* Replaces ANY_VALUE() function by MIN() function,
* if the database server does not support ANY_VALUE().
*
* Considerations for Standard SQL, or MySQL with ONLY_FULL_GROUP_BY (default since 5.7.5).
* ANY_VALUE() is available from MySQL 5.7.5 https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html
* A standard fall-back is to use MIN().
*
* @param string $sql An SQL string without the values
* @return string The input SQL string modified if necessary.
*/
public static function anyValueFallback(string $sql): string
{
return DI::dba()->anyValueFallback($sql);
}
/** /**
* beautifies the query - useful for "SHOW PROCESSLIST" * beautifies the query - useful for "SHOW PROCESSLIST"
* *

View File

@ -439,28 +439,6 @@ class Database
return $connected; return $connected;
} }
/**
* Replaces ANY_VALUE() function by MIN() function,
* if the database server does not support ANY_VALUE().
*
* Considerations for Standard SQL, or MySQL with ONLY_FULL_GROUP_BY (default since 5.7.5).
* ANY_VALUE() is available from MySQL 5.7.5 https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html
* A standard fall-back is to use MIN().
*
* @param string $sql An SQL string without the values
*
* @return string The input SQL string modified if necessary.
*/
public function anyValueFallback(string $sql): string
{
$server_info = $this->serverInfo();
if (version_compare($server_info, '5.7.5', '<') ||
(stripos($server_info, 'MariaDB') !== false)) {
$sql = str_ireplace('ANY_VALUE(', 'MIN(', $sql);
}
return $sql;
}
/** /**
* Replaces the ? placeholders with the parameters in the $args array * Replaces the ? placeholders with the parameters in the $args array
* *
@ -532,7 +510,6 @@ class Database
} }
$sql = DBA::cleanQuery($sql); $sql = DBA::cleanQuery($sql);
$sql = $this->anyValueFallback($sql);
$orig_sql = $sql; $orig_sql = $sql;
@ -1440,7 +1417,7 @@ class Database
private function escapeFields(array $fields, array $options): array private function escapeFields(array $fields, array $options): array
{ {
// In the case of a "GROUP BY" we have to add all the ORDER fields to the fieldlist. // In the case of a "GROUP BY" we have to add all the ORDER fields to the fieldlist.
// This needs to done to apply the "ANY_VALUE(...)" treatment from below to them. // This needs to done to apply the "MIN(...)" treatment from below to them.
// Otherwise MySQL would report errors. // Otherwise MySQL would report errors.
if (!empty($options['group_by']) && !empty($options['order'])) { if (!empty($options['group_by']) && !empty($options['order'])) {
foreach ($options['order'] as $key => $field) { foreach ($options['order'] as $key => $field) {
@ -1461,7 +1438,7 @@ class Database
$value = DBA::quoteIdentifier($field); $value = DBA::quoteIdentifier($field);
if (!empty($options['group_by']) && !in_array($field, $options['group_by'])) { if (!empty($options['group_by']) && !in_array($field, $options['group_by'])) {
$value = 'ANY_VALUE(' . $value . ') AS ' . $value; $value = 'MIN(' . $value . ') AS ' . $value;
} }
}); });

View File

@ -127,8 +127,6 @@ class Mail
*/ */
public static function send(int $sender_uid, int $recipient = 0, string $body = '', string $subject = '', string $replyto = ''): int public static function send(int $sender_uid, int $recipient = 0, string $body = '', string $subject = '', string $replyto = ''): int
{ {
$a = DI::app();
if (!$recipient) { if (!$recipient) {
return -1; return -1;
} }
@ -246,77 +244,4 @@ class Mail
return -3; return -3;
} }
} }
/**
* @param array $recipient recipient, default empty
* @param string $body message body, default empty
* @param string $subject message subject, default empty
* @param string $replyto reply to, default empty
* @return int
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function sendWall(array $recipient = [], string $body = '', string $subject = '', string $replyto = ''): int
{
if (!$recipient) {
return -1;
}
if (!strlen($subject)) {
$subject = DI::l10n()->t('[no subject]');
}
$guid = System::createUUID();
$uri = Item::newURI($guid);
$me = Contact::getByURL($replyto);
if (!$me['name']) {
return -2;
}
$conv_guid = System::createUUID();
$recip_handle = $recipient['nickname'] . '@' . substr(DI::baseUrl(), strpos(DI::baseUrl(), '://') + 3);
$sender_handle = $me['addr'];
$handles = $recip_handle . ';' . $sender_handle;
$convid = null;
$fields = ['uid' => $recipient['uid'], 'guid' => $conv_guid, 'creator' => $sender_handle,
'created' => DateTimeFormat::utcNow(), 'updated' => DateTimeFormat::utcNow(),
'subject' => $subject, 'recips' => $handles];
if (DBA::insert('conv', $fields)) {
$convid = DBA::lastInsertId();
}
if (!$convid) {
Logger::warning('conversation not found.');
return -4;
}
self::insert(
[
'uid' => $recipient['uid'],
'guid' => $guid,
'convid' => $convid,
'from-name' => $me['name'],
'from-photo' => $me['photo'],
'from-url' => $me['url'],
'contact-id' => 0,
'title' => $subject,
'body' => $body,
'seen' => 0,
'reply' => 0,
'replied' => 0,
'uri' => $uri,
'parent-uri' => $me['url'],
'created' => DateTimeFormat::utcNow(),
'unknown' => 1
],
false
);
return 0;
}
} }

View File

@ -229,8 +229,8 @@ class Photo
return DBA::toArray( return DBA::toArray(
DBA::p( DBA::p(
"SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`, ANY_VALUE(`type`) AS `type`, "SELECT `resource-id`, MIN(`id`) AS `id`, MIN(`filename`) AS `filename`, MIN(`type`) AS `type`,
min(`scale`) AS `hiq`, max(`scale`) AS `loq`, ANY_VALUE(`desc`) AS `desc`, ANY_VALUE(`created`) AS `created` min(`scale`) AS `hiq`, max(`scale`) AS `loq`, MIN(`desc`) AS `desc`, MIN(`created`) AS `created`
FROM `photo` WHERE `uid` = ? AND NOT `photo-type` IN (?, ?) $sqlExtra FROM `photo` WHERE `uid` = ? AND NOT `photo-type` IN (?, ?) $sqlExtra
GROUP BY `resource-id` $sqlExtra2", GROUP BY `resource-id` $sqlExtra2",
$values $values
@ -751,7 +751,7 @@ class Photo
if (!DI::config()->get('system', 'no_count', false)) { if (!DI::config()->get('system', 'no_count', false)) {
/// @todo This query needs to be renewed. It is really slow /// @todo This query needs to be renewed. It is really slow
// At this time we just store the data in the cache // At this time we just store the data in the cache
$albums = DBA::toArray(DBA::p("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created` $albums = DBA::toArray(DBA::p("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, MIN(`created`) AS `created`
FROM `photo` FROM `photo`
WHERE `uid` = ? AND `photo-type` IN (?, ?, ?) $sql_extra WHERE `uid` = ? AND `photo-type` IN (?, ?, ?) $sql_extra
GROUP BY `album` ORDER BY `created` DESC", GROUP BY `album` ORDER BY `created` DESC",
@ -762,9 +762,10 @@ class Photo
)); ));
} else { } else {
// This query doesn't do the count and is much faster // This query doesn't do the count and is much faster
$albums = DBA::toArray(DBA::p("SELECT DISTINCT(`album`), '' AS `total` $albums = DBA::toArray(DBA::p("SELECT '' AS `total`, `album`, MIN(`created`) AS `created`
FROM `photo` USE INDEX (`uid_album_scale_created`) FROM `photo` USE INDEX (`uid_album_scale_created`)
WHERE `uid` = ? AND `photo-type` IN (?, ?, ?) $sql_extra", WHERE `uid` = ? AND `photo-type` IN (?, ?, ?) $sql_extra
GROUP BY `album` ORDER BY `created` DESC",
$uid, $uid,
self::DEFAULT, self::DEFAULT,
$banner_type, $banner_type,

View File

@ -874,7 +874,7 @@ class User
try { try {
$passwordExposedChecker = new PasswordExposed\PasswordExposedChecker(null, $cache); $passwordExposedChecker = new PasswordExposed\PasswordExposedChecker(null, $cache);
return $passwordExposedChecker->passwordExposed($password) === PasswordExposed\PasswordStatus::EXPOSED; return $passwordExposedChecker->passwordExposed($password) === PasswordExposed\Enums\PasswordStatus::EXPOSED;
} catch (Exception $e) { } catch (Exception $e) {
Logger::error('Password Exposed Exception: ' . $e->getMessage(), [ Logger::error('Password Exposed Exception: ' . $e->getMessage(), [
'code' => $e->getCode(), 'code' => $e->getCode(),

View File

@ -97,7 +97,7 @@ class Federation extends BaseAdmin
SUM(IFNULL(`local-posts`, 0) + IFNULL(`local-comments`, 0)) AS `posts`, SUM(IFNULL(`local-posts`, 0) + IFNULL(`local-comments`, 0)) AS `posts`,
SUM(IFNULL(`active-month-users`, `active-week-users`)) AS `month`, SUM(IFNULL(`active-month-users`, `active-week-users`)) AS `month`,
SUM(IFNULL(`active-halfyear-users`, `active-week-users`)) AS `halfyear`, `platform`, SUM(IFNULL(`active-halfyear-users`, `active-week-users`)) AS `halfyear`, `platform`,
ANY_VALUE(`network`) AS `network`, MAX(`version`) AS `version` MIN(`network`) AS `network`, MAX(`version`) AS `version`
FROM `gserver` WHERE NOT `failed` AND `platform` != ? AND `detection-method` != ? AND NOT `network` IN (?, ?) GROUP BY `platform`", FROM `gserver` WHERE NOT `failed` AND `platform` != ? AND `detection-method` != ? AND NOT `network` IN (?, ?) GROUP BY `platform`",
'', GServer::DETECT_MANUAL, Protocol::PHANTOM, Protocol::FEED); '', GServer::DETECT_MANUAL, Protocol::PHANTOM, Protocol::FEED);
while ($gserver = DBA::fetch($gservers)) { while ($gserver = DBA::fetch($gservers)) {

View File

@ -322,12 +322,12 @@ class Photos extends \Friendica\Module\BaseProfile
$photos = $this->database->toArray($this->database->p( $photos = $this->database->toArray($this->database->p(
"SELECT "SELECT
`resource-id`, `resource-id`,
ANY_VALUE(`id`) AS `id`, MIN(`id`) AS `id`,
ANY_VALUE(`filename`) AS `filename`, MIN(`filename`) AS `filename`,
ANY_VALUE(`type`) AS `type`, MIN(`type`) AS `type`,
ANY_VALUE(`album`) AS `album`, MIN(`album`) AS `album`,
max(`scale`) AS `scale`, MAX(`scale`) AS `scale`,
ANY_VALUE(`created`) AS `created` MIN(`created`) AS `created`
FROM `photo` FROM `photo`
WHERE `uid` = ? WHERE `uid` = ?
AND `photo-type` = ? AND `photo-type` = ?

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2024.03-dev\n" "Project-Id-Version: 2024.03-dev\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-01-15 06:14+0000\n" "POT-Creation-Date: 2024-01-15 19:41+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -1770,7 +1770,7 @@ msgstr ""
msgid "Create new group" msgid "Create new group"
msgstr "" msgstr ""
#: src/Content/Item.php:332 src/Model/Item.php:3234 #: src/Content/Item.php:332 src/Model/Item.php:3235
msgid "event" msgid "event"
msgstr "" msgstr ""
@ -1778,7 +1778,7 @@ msgstr ""
msgid "status" msgid "status"
msgstr "" msgstr ""
#: src/Content/Item.php:341 src/Model/Item.php:3236 #: src/Content/Item.php:341 src/Model/Item.php:3237
#: src/Module/Post/Tag/Add.php:123 #: src/Module/Post/Tag/Add.php:123
msgid "photo" msgid "photo"
msgstr "" msgstr ""
@ -2191,8 +2191,8 @@ msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s" "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr "" msgstr ""
#: src/Content/Text/BBCode.php:998 src/Model/Item.php:3967 #: src/Content/Text/BBCode.php:998 src/Model/Item.php:3968
#: src/Model/Item.php:3973 src/Model/Item.php:3974 #: src/Model/Item.php:3974 src/Model/Item.php:3975
msgid "Link to source" msgid "Link to source"
msgstr "" msgstr ""
@ -2855,167 +2855,167 @@ msgstr ""
msgid "Could not connect to database." msgid "Could not connect to database."
msgstr "" msgstr ""
#: src/Core/L10n.php:441 src/Model/Item.php:2278 #: src/Core/L10n.php:444 src/Model/Item.php:2279
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/Core/L10n.php:448 #: src/Core/L10n.php:451
#, php-format #, php-format
msgid "%s (%s)" msgid "%s (%s)"
msgstr "" msgstr ""
#: src/Core/L10n.php:496 src/Model/Event.php:430 #: src/Core/L10n.php:499 src/Model/Event.php:430
#: src/Module/Settings/Display.php:284 #: src/Module/Settings/Display.php:284
msgid "Monday" msgid "Monday"
msgstr "" msgstr ""
#: src/Core/L10n.php:496 src/Model/Event.php:431 #: src/Core/L10n.php:499 src/Model/Event.php:431
#: src/Module/Settings/Display.php:285 #: src/Module/Settings/Display.php:285
msgid "Tuesday" msgid "Tuesday"
msgstr "" msgstr ""
#: src/Core/L10n.php:496 src/Model/Event.php:432 #: src/Core/L10n.php:499 src/Model/Event.php:432
#: src/Module/Settings/Display.php:286 #: src/Module/Settings/Display.php:286
msgid "Wednesday" msgid "Wednesday"
msgstr "" msgstr ""
#: src/Core/L10n.php:496 src/Model/Event.php:433 #: src/Core/L10n.php:499 src/Model/Event.php:433
#: src/Module/Settings/Display.php:287 #: src/Module/Settings/Display.php:287
msgid "Thursday" msgid "Thursday"
msgstr "" msgstr ""
#: src/Core/L10n.php:496 src/Model/Event.php:434 #: src/Core/L10n.php:499 src/Model/Event.php:434
#: src/Module/Settings/Display.php:288 #: src/Module/Settings/Display.php:288
msgid "Friday" msgid "Friday"
msgstr "" msgstr ""
#: src/Core/L10n.php:496 src/Model/Event.php:435 #: src/Core/L10n.php:499 src/Model/Event.php:435
#: src/Module/Settings/Display.php:289 #: src/Module/Settings/Display.php:289
msgid "Saturday" msgid "Saturday"
msgstr "" msgstr ""
#: src/Core/L10n.php:496 src/Model/Event.php:429 #: src/Core/L10n.php:499 src/Model/Event.php:429
#: src/Module/Settings/Display.php:283 #: src/Module/Settings/Display.php:283
msgid "Sunday" msgid "Sunday"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:450 #: src/Core/L10n.php:503 src/Model/Event.php:450
msgid "January" msgid "January"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:451 #: src/Core/L10n.php:503 src/Model/Event.php:451
msgid "February" msgid "February"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:452 #: src/Core/L10n.php:503 src/Model/Event.php:452
msgid "March" msgid "March"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:453 #: src/Core/L10n.php:503 src/Model/Event.php:453
msgid "April" msgid "April"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Core/L10n.php:519 src/Model/Event.php:441 #: src/Core/L10n.php:503 src/Core/L10n.php:522 src/Model/Event.php:441
msgid "May" msgid "May"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:454 #: src/Core/L10n.php:503 src/Model/Event.php:454
msgid "June" msgid "June"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:455 #: src/Core/L10n.php:503 src/Model/Event.php:455
msgid "July" msgid "July"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:456 #: src/Core/L10n.php:503 src/Model/Event.php:456
msgid "August" msgid "August"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:457 #: src/Core/L10n.php:503 src/Model/Event.php:457
msgid "September" msgid "September"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:458 #: src/Core/L10n.php:503 src/Model/Event.php:458
msgid "October" msgid "October"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:459 #: src/Core/L10n.php:503 src/Model/Event.php:459
msgid "November" msgid "November"
msgstr "" msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:460 #: src/Core/L10n.php:503 src/Model/Event.php:460
msgid "December" msgid "December"
msgstr "" msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:422 #: src/Core/L10n.php:518 src/Model/Event.php:422
msgid "Mon" msgid "Mon"
msgstr "" msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:423 #: src/Core/L10n.php:518 src/Model/Event.php:423
msgid "Tue" msgid "Tue"
msgstr "" msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:424 #: src/Core/L10n.php:518 src/Model/Event.php:424
msgid "Wed" msgid "Wed"
msgstr "" msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:425 #: src/Core/L10n.php:518 src/Model/Event.php:425
msgid "Thu" msgid "Thu"
msgstr "" msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:426 #: src/Core/L10n.php:518 src/Model/Event.php:426
msgid "Fri" msgid "Fri"
msgstr "" msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:427 #: src/Core/L10n.php:518 src/Model/Event.php:427
msgid "Sat" msgid "Sat"
msgstr "" msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:421 #: src/Core/L10n.php:518 src/Model/Event.php:421
msgid "Sun" msgid "Sun"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:437 #: src/Core/L10n.php:522 src/Model/Event.php:437
msgid "Jan" msgid "Jan"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:438 #: src/Core/L10n.php:522 src/Model/Event.php:438
msgid "Feb" msgid "Feb"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:439 #: src/Core/L10n.php:522 src/Model/Event.php:439
msgid "Mar" msgid "Mar"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:440 #: src/Core/L10n.php:522 src/Model/Event.php:440
msgid "Apr" msgid "Apr"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:442 #: src/Core/L10n.php:522 src/Model/Event.php:442
msgid "Jun" msgid "Jun"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:443 #: src/Core/L10n.php:522 src/Model/Event.php:443
msgid "Jul" msgid "Jul"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:444 #: src/Core/L10n.php:522 src/Model/Event.php:444
msgid "Aug" msgid "Aug"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 #: src/Core/L10n.php:522
msgid "Sep" msgid "Sep"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:446 #: src/Core/L10n.php:522 src/Model/Event.php:446
msgid "Oct" msgid "Oct"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:447 #: src/Core/L10n.php:522 src/Model/Event.php:447
msgid "Nov" msgid "Nov"
msgstr "" msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:448 #: src/Core/L10n.php:522 src/Model/Event.php:448
msgid "Dec" msgid "Dec"
msgstr "" msgstr ""
@ -3413,99 +3413,99 @@ msgstr ""
msgid "Happy Birthday %s" msgid "Happy Birthday %s"
msgstr "" msgstr ""
#: src/Model/Item.php:2285 #: src/Model/Item.php:2286
#, php-format #, php-format
msgid "%s (%s - %s): %s" msgid "%s (%s - %s): %s"
msgstr "" msgstr ""
#: src/Model/Item.php:2287 #: src/Model/Item.php:2288
#, php-format #, php-format
msgid "%s (%s): %s" msgid "%s (%s): %s"
msgstr "" msgstr ""
#: src/Model/Item.php:2290 #: src/Model/Item.php:2291
#, php-format #, php-format
msgid "Detected languages in this post:\\n%s" msgid "Detected languages in this post:\\n%s"
msgstr "" msgstr ""
#: src/Model/Item.php:3238 #: src/Model/Item.php:3239
msgid "activity" msgid "activity"
msgstr "" msgstr ""
#: src/Model/Item.php:3240 #: src/Model/Item.php:3241
msgid "comment" msgid "comment"
msgstr "" msgstr ""
#: src/Model/Item.php:3243 src/Module/Post/Tag/Add.php:123 #: src/Model/Item.php:3244 src/Module/Post/Tag/Add.php:123
msgid "post" msgid "post"
msgstr "" msgstr ""
#: src/Model/Item.php:3413 #: src/Model/Item.php:3414
#, php-format #, php-format
msgid "%s is blocked" msgid "%s is blocked"
msgstr "" msgstr ""
#: src/Model/Item.php:3415 #: src/Model/Item.php:3416
#, php-format #, php-format
msgid "%s is ignored" msgid "%s is ignored"
msgstr "" msgstr ""
#: src/Model/Item.php:3417 #: src/Model/Item.php:3418
#, php-format #, php-format
msgid "Content from %s is collapsed" msgid "Content from %s is collapsed"
msgstr "" msgstr ""
#: src/Model/Item.php:3421 #: src/Model/Item.php:3422
#, php-format #, php-format
msgid "Content warning: %s" msgid "Content warning: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:3874 #: src/Model/Item.php:3875
msgid "bytes" msgid "bytes"
msgstr "" msgstr ""
#: src/Model/Item.php:3905 #: src/Model/Item.php:3906
#, php-format #, php-format
msgid "%2$s (%3$d%%, %1$d vote)" msgid "%2$s (%3$d%%, %1$d vote)"
msgid_plural "%2$s (%3$d%%, %1$d votes)" msgid_plural "%2$s (%3$d%%, %1$d votes)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3907 #: src/Model/Item.php:3908
#, php-format #, php-format
msgid "%2$s (%1$d vote)" msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)" msgid_plural "%2$s (%1$d votes)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3912 #: src/Model/Item.php:3913
#, php-format #, php-format
msgid "%d voter. Poll end: %s" msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s" msgid_plural "%d voters. Poll end: %s"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3914 #: src/Model/Item.php:3915
#, php-format #, php-format
msgid "%d voter." msgid "%d voter."
msgid_plural "%d voters." msgid_plural "%d voters."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/Model/Item.php:3916 #: src/Model/Item.php:3917
#, php-format #, php-format
msgid "Poll end: %s" msgid "Poll end: %s"
msgstr "" msgstr ""
#: src/Model/Item.php:3950 src/Model/Item.php:3951 #: src/Model/Item.php:3951 src/Model/Item.php:3952
msgid "View on separate page" msgid "View on separate page"
msgstr "" msgstr ""
#: src/Model/Mail.php:137 src/Model/Mail.php:266 #: src/Model/Mail.php:135
msgid "[no subject]" msgid "[no subject]"
msgstr "" msgstr ""
#: src/Model/Photo.php:1190 src/Module/Media/Photo/Upload.php:170 #: src/Model/Photo.php:1191 src/Module/Media/Photo/Upload.php:170
msgid "Wall Photos" msgid "Wall Photos"
msgstr "" msgstr ""