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
/bin/phpunit
#Ignore cache file
#Ignore cache files
.php_cs.cache
.php-cs-fixer.cache
#ignore avatar picture cache path
/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()
->in(__DIR__)
->notPath('addon')
->notPath('bin/dev')
->notPath('config')
->notPath('doc')

View File

@ -135,7 +135,8 @@
"mockery/mockery": "^1.3",
"mikey179/vfsstream": "^1.6",
"phpunit/phpunit": "^9",
"dms/phpunit-arraysubset-asserts": "^0.3.1"
"dms/phpunit-arraysubset-asserts": "^0.3.1",
"friendsofphp/php-cs-fixer": "^3.46"
},
"scripts": {
"test": "phpunit",
@ -149,6 +150,8 @@
"cs:fix": [
"@cs:install",
"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
if ($visitor) {
$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,
$page_owner_uid,
$album
));
} else {
$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(),
$album
));
@ -762,7 +762,7 @@ function photos_content(App $a)
$total = 0;
$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`",
$owner_uid,
$album
@ -782,9 +782,9 @@ function photos_content(App $a)
}
$r = DBA::toArray(DBA::p(
"SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`,
ANY_VALUE(`type`) AS `type`, max(`scale`) AS `scale`, ANY_VALUE(`desc`) as `desc`,
ANY_VALUE(`created`) as `created`
"SELECT `resource-id`, MIN(`id`) AS `id`, MIN(`filename`) AS `filename`,
MIN(`type`) AS `type`, MAX(`scale`) AS `scale`, MIN(`desc`) AS `desc`,
MIN(`created`) AS `created`
FROM `photo` WHERE `uid` = ? AND `album` = ?
AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` $order LIMIT ? , ?",
intval($owner_uid),
@ -1167,11 +1167,11 @@ function photos_content(App $a)
}
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']])) {
$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))) {

View File

@ -132,22 +132,6 @@ class DBA
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"
*

View File

@ -439,28 +439,6 @@ class Database
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
*
@ -532,7 +510,6 @@ class Database
}
$sql = DBA::cleanQuery($sql);
$sql = $this->anyValueFallback($sql);
$orig_sql = $sql;
@ -1440,7 +1417,7 @@ class Database
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.
// 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.
if (!empty($options['group_by']) && !empty($options['order'])) {
foreach ($options['order'] as $key => $field) {
@ -1461,7 +1438,7 @@ class Database
$value = DBA::quoteIdentifier($field);
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
{
$a = DI::app();
if (!$recipient) {
return -1;
}
@ -246,77 +244,4 @@ class Mail
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(
DBA::p(
"SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`, ANY_VALUE(`type`) AS `type`,
min(`scale`) AS `hiq`, max(`scale`) AS `loq`, ANY_VALUE(`desc`) AS `desc`, ANY_VALUE(`created`) AS `created`
"SELECT `resource-id`, MIN(`id`) AS `id`, MIN(`filename`) AS `filename`, MIN(`type`) AS `type`,
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
GROUP BY `resource-id` $sqlExtra2",
$values
@ -751,7 +751,7 @@ class Photo
if (!DI::config()->get('system', 'no_count', false)) {
/// @todo This query needs to be renewed. It is really slow
// 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`
WHERE `uid` = ? AND `photo-type` IN (?, ?, ?) $sql_extra
GROUP BY `album` ORDER BY `created` DESC",
@ -762,9 +762,10 @@ class Photo
));
} else {
// 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`)
WHERE `uid` = ? AND `photo-type` IN (?, ?, ?) $sql_extra",
WHERE `uid` = ? AND `photo-type` IN (?, ?, ?) $sql_extra
GROUP BY `album` ORDER BY `created` DESC",
$uid,
self::DEFAULT,
$banner_type,

View File

@ -874,7 +874,7 @@ class User
try {
$passwordExposedChecker = new PasswordExposed\PasswordExposedChecker(null, $cache);
return $passwordExposedChecker->passwordExposed($password) === PasswordExposed\PasswordStatus::EXPOSED;
return $passwordExposedChecker->passwordExposed($password) === PasswordExposed\Enums\PasswordStatus::EXPOSED;
} catch (Exception $e) {
Logger::error('Password Exposed Exception: ' . $e->getMessage(), [
'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(`active-month-users`, `active-week-users`)) AS `month`,
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`",
'', GServer::DETECT_MANUAL, Protocol::PHANTOM, Protocol::FEED);
while ($gserver = DBA::fetch($gservers)) {

View File

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

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2024.03-dev\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -1770,7 +1770,7 @@ msgstr ""
msgid "Create new group"
msgstr ""
#: src/Content/Item.php:332 src/Model/Item.php:3234
#: src/Content/Item.php:332 src/Model/Item.php:3235
msgid "event"
msgstr ""
@ -1778,7 +1778,7 @@ msgstr ""
msgid "status"
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
msgid "photo"
msgstr ""
@ -2191,8 +2191,8 @@ msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:998 src/Model/Item.php:3967
#: src/Model/Item.php:3973 src/Model/Item.php:3974
#: src/Content/Text/BBCode.php:998 src/Model/Item.php:3968
#: src/Model/Item.php:3974 src/Model/Item.php:3975
msgid "Link to source"
msgstr ""
@ -2855,167 +2855,167 @@ msgstr ""
msgid "Could not connect to database."
msgstr ""
#: src/Core/L10n.php:441 src/Model/Item.php:2278
#: src/Core/L10n.php:444 src/Model/Item.php:2279
msgid "Undetermined"
msgstr ""
#: src/Core/L10n.php:448
#: src/Core/L10n.php:451
#, php-format
msgid "%s (%s)"
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
msgid "Monday"
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
msgid "Tuesday"
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
msgid "Wednesday"
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
msgid "Thursday"
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
msgid "Friday"
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
msgid "Saturday"
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
msgid "Sunday"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:450
#: src/Core/L10n.php:503 src/Model/Event.php:450
msgid "January"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:451
#: src/Core/L10n.php:503 src/Model/Event.php:451
msgid "February"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:452
#: src/Core/L10n.php:503 src/Model/Event.php:452
msgid "March"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:453
#: src/Core/L10n.php:503 src/Model/Event.php:453
msgid "April"
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"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:454
#: src/Core/L10n.php:503 src/Model/Event.php:454
msgid "June"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:455
#: src/Core/L10n.php:503 src/Model/Event.php:455
msgid "July"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:456
#: src/Core/L10n.php:503 src/Model/Event.php:456
msgid "August"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:457
#: src/Core/L10n.php:503 src/Model/Event.php:457
msgid "September"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:458
#: src/Core/L10n.php:503 src/Model/Event.php:458
msgid "October"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:459
#: src/Core/L10n.php:503 src/Model/Event.php:459
msgid "November"
msgstr ""
#: src/Core/L10n.php:500 src/Model/Event.php:460
#: src/Core/L10n.php:503 src/Model/Event.php:460
msgid "December"
msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:422
#: src/Core/L10n.php:518 src/Model/Event.php:422
msgid "Mon"
msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:423
#: src/Core/L10n.php:518 src/Model/Event.php:423
msgid "Tue"
msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:424
#: src/Core/L10n.php:518 src/Model/Event.php:424
msgid "Wed"
msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:425
#: src/Core/L10n.php:518 src/Model/Event.php:425
msgid "Thu"
msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:426
#: src/Core/L10n.php:518 src/Model/Event.php:426
msgid "Fri"
msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:427
#: src/Core/L10n.php:518 src/Model/Event.php:427
msgid "Sat"
msgstr ""
#: src/Core/L10n.php:515 src/Model/Event.php:421
#: src/Core/L10n.php:518 src/Model/Event.php:421
msgid "Sun"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:437
#: src/Core/L10n.php:522 src/Model/Event.php:437
msgid "Jan"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:438
#: src/Core/L10n.php:522 src/Model/Event.php:438
msgid "Feb"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:439
#: src/Core/L10n.php:522 src/Model/Event.php:439
msgid "Mar"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:440
#: src/Core/L10n.php:522 src/Model/Event.php:440
msgid "Apr"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:442
#: src/Core/L10n.php:522 src/Model/Event.php:442
msgid "Jun"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:443
#: src/Core/L10n.php:522 src/Model/Event.php:443
msgid "Jul"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:444
#: src/Core/L10n.php:522 src/Model/Event.php:444
msgid "Aug"
msgstr ""
#: src/Core/L10n.php:519
#: src/Core/L10n.php:522
msgid "Sep"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:446
#: src/Core/L10n.php:522 src/Model/Event.php:446
msgid "Oct"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:447
#: src/Core/L10n.php:522 src/Model/Event.php:447
msgid "Nov"
msgstr ""
#: src/Core/L10n.php:519 src/Model/Event.php:448
#: src/Core/L10n.php:522 src/Model/Event.php:448
msgid "Dec"
msgstr ""
@ -3413,99 +3413,99 @@ msgstr ""
msgid "Happy Birthday %s"
msgstr ""
#: src/Model/Item.php:2285
#: src/Model/Item.php:2286
#, php-format
msgid "%s (%s - %s): %s"
msgstr ""
#: src/Model/Item.php:2287
#: src/Model/Item.php:2288
#, php-format
msgid "%s (%s): %s"
msgstr ""
#: src/Model/Item.php:2290
#: src/Model/Item.php:2291
#, php-format
msgid "Detected languages in this post:\\n%s"
msgstr ""
#: src/Model/Item.php:3238
#: src/Model/Item.php:3239
msgid "activity"
msgstr ""
#: src/Model/Item.php:3240
#: src/Model/Item.php:3241
msgid "comment"
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"
msgstr ""
#: src/Model/Item.php:3413
#: src/Model/Item.php:3414
#, php-format
msgid "%s is blocked"
msgstr ""
#: src/Model/Item.php:3415
#: src/Model/Item.php:3416
#, php-format
msgid "%s is ignored"
msgstr ""
#: src/Model/Item.php:3417
#: src/Model/Item.php:3418
#, php-format
msgid "Content from %s is collapsed"
msgstr ""
#: src/Model/Item.php:3421
#: src/Model/Item.php:3422
#, php-format
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3874
#: src/Model/Item.php:3875
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3905
#: src/Model/Item.php:3906
#, 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:3907
#: src/Model/Item.php:3908
#, php-format
msgid "%2$s (%1$d vote)"
msgid_plural "%2$s (%1$d votes)"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3912
#: src/Model/Item.php:3913
#, php-format
msgid "%d voter. Poll end: %s"
msgid_plural "%d voters. Poll end: %s"
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3914
#: src/Model/Item.php:3915
#, php-format
msgid "%d voter."
msgid_plural "%d voters."
msgstr[0] ""
msgstr[1] ""
#: src/Model/Item.php:3916
#: src/Model/Item.php:3917
#, php-format
msgid "Poll end: %s"
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"
msgstr ""
#: src/Model/Mail.php:137 src/Model/Mail.php:266
#: src/Model/Mail.php:135
msgid "[no subject]"
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"
msgstr ""