Compare commits

..

114 commits

Author SHA1 Message Date
622b978a84
Merge pull request #11655 from Quix0r/fixes/more-type-hints-002
More type-hints and documentation added
2022-06-19 09:27:29 -04:00
5a553df7d8
Incremented database version 2022-06-19 14:41:36 +02:00
ed3c53a5f8
Ops, not here wanted. :-( 2022-06-19 14:06:32 +02:00
bff57bb030
Changes:
- added type-hints
- added returned type-hints in interface (I checked all)
2022-06-19 14:00:31 +02:00
777872e6fa
Merge pull request #11658 from tobiasd/20220619-accesskey
Accesskey was used twice
2022-06-19 07:09:20 -04:00
c0d7f8944d
Some calls saved 2022-06-19 11:26:10 +02:00
60f8c2d795
Changes:
- added missing type-hints
- added documentation for a method
2022-06-19 10:50:09 +02:00
5f6943b008
Changes:
- MySQL index on BLOB/TEXT can only be partial (e.g.: `column`(length))
2022-06-19 10:50:06 +02:00
5792a01a01
Contact::getAccountType()'s parameter is never a string, ops 2022-06-19 09:36:24 +02:00
f3599fa3e9
Changes:
- dbstructure(null) is no longer possible, an empty string does it
2022-06-19 09:13:10 +02:00
065dad79ca
updated the Accesskey documentation accordingly 2022-06-19 06:33:21 +02:00
a063a89c57
Accesskey was used twice
The accesskey on the User Settings pages for the _account settings_ and the _two factor authentication_ were the same. This PR is assinging a new one to the 2FA.
2022-06-19 06:30:00 +02:00
b6bfe72083
Wrong returned type, has to be array 2022-06-19 02:40:07 +02:00
7bb0cb5323
Changes:
- added more type-hints
- DBStructure::existsTable() does no longer need array support for table name
  because this is no longer used (good work!)
2022-06-19 02:11:12 +02:00
2c5685c89c
Changes:
- changed to proper "use Foo\Bar;"
- added doctag
- added return type as this is fixed
2022-06-19 01:11:30 +02:00
d7d2ad77ff
Ops, also this! 2022-06-18 23:31:52 +02:00
39f2d197ea
Changed to suggestings (back to original) + fixed typo in scalar type 2022-06-18 23:30:37 +02:00
6f1d52cf71
Changed back to suggestions by @MrPetovan 2022-06-18 23:24:08 +02:00
2f961b11bf
Naming-convention:
- variables should start lower-case: $image
2022-06-18 23:16:34 +02:00
fa14a02a19
Changes:
- added type-hints
- added documentation
- changed double-quotes to single
2022-06-18 23:12:52 +02:00
f3b57008b5
Proper type is string 2022-06-18 18:41:16 +02:00
41f34c4261
Maybe fix for:
"Argument 1 passed to Friendica\Model\ItemURI::getIdByURI() must be of the type string, null given, called in Processor.php line 1219"
2022-06-18 18:30:50 +02:00
9691bb06fb
Changes:
- added more type-hints
- added missing documentation
2022-06-18 18:21:29 +02:00
94eb426151
Nodeinfo::getOrganization() doesn't need configuration object being inserted
when you have DI::config() around.
2022-06-18 17:56:33 +02:00
c29c49797a
Added missing type-hints 2022-06-18 17:52:46 +02:00
4e437190c5
Renamed variable, no need for "orig_" prefix 2022-06-18 17:50:11 +02:00
a1a81cdc6b
Continued:
- changed some double-quotes to single
- added missing type-hints
- added missing documentation
- fixed indenting a bit
2022-06-18 17:46:34 +02:00
8fc710f82a
Continued:
- added more type-hints
- added some missing documentation
- Return the result from DBA::delete() to let other methods know about it
2022-06-18 17:22:50 +02:00
8ba3f13fae
Changes:
- added more type-hints
- added missing documentation
2022-06-18 17:09:46 +02:00
7ec07178c8
Changes:
- added missing type-hints
- added missing documentation
2022-06-18 16:59:23 +02:00
e90ad0c1cd
Merge pull request #11653 from Quix0r/fixes/more-type-hints
More type-hints added
2022-06-18 10:33:33 -04:00
b2e5993314
Merge pull request #11654 from Quix0r/fixes/post-media-url-size
post-media has too small sizes for video files
2022-06-18 10:28:00 -04:00
92a1d14e5e
Updated documentation and SQL dump, according to woodpecker tests 2022-06-18 16:02:33 +02:00
8756d92316
Continued:
- prevents a "Return value of Friendica\Core\Worker::workerProcess() must be of the type array, bool returned"
2022-06-18 15:57:31 +02:00
8aaf99c61d
Sizes increased for:
- video files that have sizes var being int allowes
- URLs that might be longer (e.g. magnet: URLs) than varbinary(511) allows
2022-06-18 15:31:47 +02:00
bd3a7b9877
Ops, needs to be a variable:
Error: "Cannot pass parameter 2 by reference" at /var/www/.../src/Module/DFRN/Poll.php line 36
2022-06-18 09:59:19 +02:00
69cda4f760
Fixed TypeError: "Argument 1 passed to Friendica\Core\System::httpExit() must be
of the type string, null given, called in /var/www/.../src/Module/DFRN/Poll.php
on line 37"
2022-06-18 05:42:02 +02:00
7cbb818c93
Set type-hint for parameter $data to SimpleXMLElement as $fields in dispatch()
is the same and being handled over.
2022-06-18 05:19:24 +02:00
89302d0843
Some outside code relies on returned "false" 2022-06-18 05:06:18 +02:00
aaf5c323b6
Fixed indenting 2022-06-18 05:04:14 +02:00
adb4aea6ad
Changes:
- added some type-hints
- replaced most double-quotes (only Diaspora.php, later more) with single
- added some documentation
- normalized indenting in Diaspora.php (I hope I got all?)
2022-06-18 05:03:10 +02:00
51f43278d6
Fixed incompatible types 2022-06-17 18:00:36 +02:00
88c40f3336 Ops, wrong type again 2022-06-17 17:18:31 +02:00
a770634b95 Ops, wrong type 2022-06-17 17:18:31 +02:00
36d56a4041 Continued:
- changed back to 'return false;' as other methods heavily rely on false instead
  of an empty array as pointed out by @heluecht@pirati.ca
- $fetched_contact should be initialized as an empty array, let's not make this
  code more crazier than it already is (see APContact::getByURL())
2022-06-17 17:18:31 +02:00
c467bff79f Some more type-hints added 2022-06-17 17:18:31 +02:00
4f3321cc9f Nore fixes 2022-06-17 17:18:31 +02:00
10bb7d5625 Possible fix for
Uncaught Exception TypeError: "Return value of
Friendica\Model\APContact::getByURL() must be of the type array, bool returned"
2022-06-17 17:18:31 +02:00
fdd237a090 Fix for "Uncaught Exception TypeError: "Argument 1 passed to
Friendica\Model\APContact::unarchiveInbox() must be of the type string, null
given" error message
2022-06-17 17:18:31 +02:00
605e7d55b3 Continued:
- added more type-hints
- some methods in Diaspora returned void but integer was documented so I
  changed it to -1 to have a proper type-hint
2022-06-17 17:18:31 +02:00
0c9aff8a09 Also need to declare $profile or otherwise an invocation of
Receiver::getReceiverForActor() will fail.
2022-06-17 17:18:31 +02:00
af8cd5ca86 Worker::getWaitingJobForPID() can also return FALSE on failure ... :-( 2022-06-17 17:18:31 +02:00
227bab43a8 Ops, wrong type-hint here, must be string ($nickname can never be an integer). 2022-06-17 17:18:31 +02:00
f7c1eaa858 Continued:
- added type-hints
- removed out-dated documentation
- added some missing documentation
2022-06-17 17:18:31 +02:00
e484b6d6dc Continued:
- added more type-hints
- added some documentation
- Contact::getAccountType() should only process string, not null
2022-06-17 17:18:31 +02:00
45b5f67bca Fix for non-existing record system.mobile_theme in config table 2022-06-17 17:18:31 +02:00
5c9ce790bf Fixed:
- $object_data['actor'] can be null, but Receiver::getReceivers()'s 2nd
  parameter expect it to be string
2022-06-17 17:18:31 +02:00
33768ea1c6 Some fixes:
- $gsid's default value cannot sadly be 0, it now must be null to allow some
  code work
- added some more type-hints
- documented a bit more
2022-06-17 17:18:31 +02:00
4e53666c70 Added more type-hints 2022-06-17 17:18:31 +02:00
7560dccc08 Added again more type-hints 2022-06-17 17:18:31 +02:00
2766c7d9cf Continued:
- added more type-hints
- added some missing documentation
2022-06-17 17:18:31 +02:00
a587217f47 Fixed "Argument 4 passed to Friendica\Protocol\DFRN::processVerbs() must be of the type bool" 2022-06-17 17:18:31 +02:00
dd54e52575 MrPetovan brought the right one up:
> Since this is depending on remote systems, the log can quickly fill with unactionable messages.
2022-06-17 17:18:31 +02:00
c351099c5a Ops, bad type-hint here 2022-06-17 17:18:31 +02:00
2c5595c358 Another incompatible method declaration fixed + type-hints added 2022-06-17 17:18:31 +02:00
40d7f29a11 Continued:
- more type-hints
- fixed incompatible method declarations
2022-06-17 17:18:31 +02:00
1edc6b3c3b Added more type-hints for "App" classes 2022-06-17 17:18:31 +02:00
42b04f397b Added more type-hints 2022-06-17 17:18:31 +02:00
aa5f0d5ec1 Added more type-hints and documented a few methods 2022-06-17 17:18:31 +02:00
97e27cb523 Added more type-hints 2022-06-17 17:18:31 +02:00
c2e889cfae Added more type-hints 2022-06-17 17:18:31 +02:00
a8a21c7fb6
Merge pull request #11652 from Quix0r/fixes/causer-id
Misspelled braces causing "undefined index 'causer-id'" message
2022-06-17 10:12:22 -04:00
5106bb2881
Added parenthesis 2022-06-17 09:41:11 +02:00
a903dbd77e
Wrong braces causing 'undefined index causer-id'. See #11632 2022-06-16 23:00:16 +02:00
51b31a846f
Merge pull request #11649 from Quix0r/fixes/return-type-fetch-content
Fixes incompatible returned type from HTTPSignature::fetch() method
2022-06-16 13:16:06 -04:00
6035de6883
Continued:
- added more type-hints
- also cannot return FALSE when array is set
2022-06-16 19:06:41 +02:00
341d8860d1
Merge pull request #11647 from Quix0r/fixes/type-error-exception
Followup PR for bad #11624 PR
2022-06-16 11:53:15 -04:00
51a7b5c584
Made also this one sweeter (null-coalscing) 2022-06-16 17:36:47 +02:00
0e1f734b03
Also make this null-coalscing 2022-06-16 17:35:01 +02:00
e8fee5644b
Ops, syntax errors get unnoticed with a simple editor. :-( 2022-06-16 17:10:02 +02:00
624e4c192c
Changed to null-coalscing style (??) as sugguested by @MrPetovan 2022-06-16 16:59:54 +02:00
962b06bf41
Added check as suggested by @MrPetovan for empty $message. 2022-06-16 16:54:51 +02:00
f2b7326650
This will 2 things:
1) The first change prevents "expensive" code in HTML::toBBcode() to be executed
   just for an empty string which makes no sense.
2) The above change was maybe flawed as $apcontact['about'] would have never
   been created, not even empty which could have side effects

Thanks to @annando to make me rethink this part of code.
2022-06-16 16:54:50 +02:00
7814ba4fc4
Fixes for bad invocations of HTML::toBBCode() (1st parameter is now string) 2022-06-16 16:54:50 +02:00
b200874f17
Ops:
- wrong way around (!empty($foo)) is proper
- also needed to be checked on $acitivty['content']
2022-06-16 16:54:50 +02:00
b1e4c0931a
Fixes and type-hints:
- added more checked type-hints as they prevent bad method invocations
- fixed TypeError for HTML::toBBCode() invocations with NULL as first (wrong)
  argument, thanks to @tobias@social.diekershoff.de pointing this out.
2022-06-16 16:54:49 +02:00
bb57d45237
Merge pull request #11645 from Quix0r/fixes/e-notice_use
Fixed possible "Trying to access array offset on value of type bool" E_NOTICE
2022-06-16 08:45:50 -04:00
e9af4b5bb9
Shorter code, thanks to @annando pointing this out 2022-06-16 13:29:30 +02:00
65da5246ca
Fixed possibble "Trying to access array offset on value of type bool" E_NOTICE
Signed-off-by: Roland Häder <roland@mxchange.org>
2022-06-16 10:07:41 +02:00
13ef86d4a3
Merge pull request #11644 from Quix0r/fixes/file-permissions
Fixed file permissions
2022-06-16 10:02:31 +02:00
58c48977ec
These files should never have executable files 2022-06-16 09:14:23 +02:00
fd0d4aedee
Font files should NEVER be executable
Signed-off-by: Roland Häder <roland@mxchange.org>
2022-06-16 09:13:48 +02:00
207bf58801
Merge pull request #11624 from Quix0r/fixes/type-hints
Added more known type-hints
2022-06-15 16:32:25 -04:00
5fa954208a
Changes:
- ops, wasn't actually fixing `return;` to proper `return '';`
- added more type-hints
- added TODO ($uid is unused)
2022-06-15 22:28:33 +02:00
a3fa95e8e4
Changes:
- added more type-hints
- changed `return;` to `return '';` when `string` was requested as returned type-hint
  (thanks to @MrPetovan)
2022-06-15 22:05:38 +02:00
34aee64349
Added more type-hints
Signed-off-by: Roland Häder <roland@mxchange.org>
2022-06-15 21:52:51 +02:00
143e4c4a18
Added more known type-hints
Signed-off-by: Roland Häder <roland@mxchange.org>
2022-06-15 21:52:50 +02:00
98954dd14e
Merge pull request #11643 from annando/avatar-path
You can now store the avatar in a separate folder and host
2022-06-15 06:25:31 +02:00
726c4dff7d You can now store the avatar in a separate folder and host 2022-06-15 03:59:26 +00:00
f839cd3826
Merge pull request #11642 from annando/platform-default
Some more default avatars
2022-06-13 16:31:34 -04:00
b816ae4db5 Some more default avatars 2022-06-13 20:07:54 +00:00
Michael Vogel
1eadcb4855
Merge pull request #11641 from tobiasd/20220613-lng
AR, FR and HU translation updates
2022-06-13 17:42:10 +02:00
6d6f356446
AR translation updates THX ButterflyOfFire 2022-06-13 14:27:14 +02:00
7614ace843
added HU translation THX Balázs Úr 2022-06-13 14:27:14 +02:00
cc77052817
update FR translations THX kalon33 2022-06-13 14:27:06 +02:00
663296b107
Merge pull request #11639 from annando/platform-default
Use platform specific default avatar pictures
2022-06-13 07:59:49 -04:00
70b9a8114d Improve license comment 2022-06-13 10:30:21 +00:00
d9fb081db9 Using separate avatars for different peertube account types 2022-06-13 10:27:46 +00:00
a47f1efec3 use correct image for Pleroma 2022-06-13 10:18:17 +00:00
c1a64b77c0 Improved license text 2022-06-13 10:03:34 +00:00
a5b5f9316d Updated database.sql and messages.po 2022-06-13 05:46:37 +00:00
e0a0c57c44 Use platform specific default avatar pictures 2022-06-13 05:18:54 +00:00
05a76a3dc2
initial CHANGELOG for the 2022.09 release 2022-06-11 10:07:04 +02:00
13d7242463
pump version to 2022.09-dev 2022-06-11 10:06:02 +02:00
141 changed files with 4258 additions and 3558 deletions

View file

@ -1,3 +1,11 @@
Version 2022.09 (unreleased)
Friendica Core
Friendica Addons
Closed Issues
Version 2022.06 (2022-06-11)
Friendica Core
Added DA DK translation, updates to the translations DE, FR, HU, PL, RU, ZH CN [translation teams]

View file

@ -1 +1 @@
2022.06
2022.09-dev

View file

@ -31,7 +31,7 @@ use Friendica\Model\Contact;
define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Giant Rhubarb');
define('FRIENDICA_VERSION', '2022.06');
define('FRIENDICA_VERSION', '2022.09-dev');
define('DFRN_PROTOCOL_VERSION', '2.23');
define('NEW_TABLE_STRUCTURE_VERSION', 1288);

View file

@ -1,6 +1,6 @@
-- ------------------------------------------
-- Friendica 2022.06 (Giant Rhubarb)
-- DB_UPDATE_VERSION 1469
-- Friendica 2022.09-dev (Giant Rhubarb)
-- DB_UPDATE_VERSION 1470
-- ------------------------------------------
@ -1216,12 +1216,12 @@ CREATE TABLE IF NOT EXISTS `post-link` (
CREATE TABLE IF NOT EXISTS `post-media` (
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
`url` varbinary(511) NOT NULL COMMENT 'Media URL',
`url` text NOT NULL COMMENT 'Media URL',
`type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Media type',
`mimetype` varchar(60) COMMENT '',
`height` smallint unsigned COMMENT 'Height of the media',
`width` smallint unsigned COMMENT 'Width of the media',
`size` int unsigned COMMENT 'Media size',
`size` mediumint unsigned COMMENT 'Media size',
`preview` varbinary(255) COMMENT 'Preview URL',
`preview-height` smallint unsigned COMMENT 'Height of the preview picture',
`preview-width` smallint unsigned COMMENT 'Width of the preview picture',
@ -1234,7 +1234,7 @@ CREATE TABLE IF NOT EXISTS `post-media` (
`publisher-name` varchar(255) COMMENT 'Name of the publisher of the media',
`publisher-image` varbinary(255) COMMENT 'Image of the publisher of the media',
PRIMARY KEY(`id`),
UNIQUE INDEX `uri-id-url` (`uri-id`,`url`),
UNIQUE INDEX `uri-id-url` (`uri-id`,`url`(512)),
INDEX `uri-id-id` (`uri-id`,`id`),
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Attached media';

View file

@ -82,6 +82,7 @@ General
../settings
---------
* o - Account
* 2 - Two-factor authentication
* p - Profiles
* t - Additional features
* w - Social Networks

View file

@ -6,36 +6,36 @@ Attached media
Fields
------
| Field | Description | Type | Null | Key | Default | Extra |
| --------------- | --------------------------------------------------------- | ----------------- | ---- | --- | ------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | | NULL | |
| url | Media URL | varbinary(511) | NO | | NULL | |
| type | Media type | tinyint unsigned | NO | | 0 | |
| mimetype | | varchar(60) | YES | | NULL | |
| height | Height of the media | smallint unsigned | YES | | NULL | |
| width | Width of the media | smallint unsigned | YES | | NULL | |
| size | Media size | int unsigned | YES | | NULL | |
| preview | Preview URL | varbinary(255) | YES | | NULL | |
| preview-height | Height of the preview picture | smallint unsigned | YES | | NULL | |
| preview-width | Width of the preview picture | smallint unsigned | YES | | NULL | |
| description | | text | YES | | NULL | |
| name | Name of the media | varchar(255) | YES | | NULL | |
| author-url | URL of the author of the media | varbinary(255) | YES | | NULL | |
| author-name | Name of the author of the media | varchar(255) | YES | | NULL | |
| author-image | Image of the author of the media | varbinary(255) | YES | | NULL | |
| publisher-url | URL of the publisher of the media | varbinary(255) | YES | | NULL | |
| publisher-name | Name of the publisher of the media | varchar(255) | YES | | NULL | |
| publisher-image | Image of the publisher of the media | varbinary(255) | YES | | NULL | |
| Field | Description | Type | Null | Key | Default | Extra |
| --------------- | --------------------------------------------------------- | ------------------ | ---- | --- | ------- | -------------- |
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | | NULL | |
| url | Media URL | text | NO | | NULL | |
| type | Media type | tinyint unsigned | NO | | 0 | |
| mimetype | | varchar(60) | YES | | NULL | |
| height | Height of the media | smallint unsigned | YES | | NULL | |
| width | Width of the media | smallint unsigned | YES | | NULL | |
| size | Media size | mediumint unsigned | YES | | NULL | |
| preview | Preview URL | varbinary(255) | YES | | NULL | |
| preview-height | Height of the preview picture | smallint unsigned | YES | | NULL | |
| preview-width | Width of the preview picture | smallint unsigned | YES | | NULL | |
| description | | text | YES | | NULL | |
| name | Name of the media | varchar(255) | YES | | NULL | |
| author-url | URL of the author of the media | varbinary(255) | YES | | NULL | |
| author-name | Name of the author of the media | varchar(255) | YES | | NULL | |
| author-image | Image of the author of the media | varbinary(255) | YES | | NULL | |
| publisher-url | URL of the publisher of the media | varbinary(255) | YES | | NULL | |
| publisher-name | Name of the publisher of the media | varchar(255) | YES | | NULL | |
| publisher-image | Image of the publisher of the media | varbinary(255) | YES | | NULL | |
Indexes
------------
| Name | Fields |
| ---------- | ------------------- |
| PRIMARY | id |
| uri-id-url | UNIQUE, uri-id, url |
| uri-id-id | uri-id, id |
| Name | Fields |
| ---------- | ------------------------ |
| PRIMARY | id |
| uri-id-url | UNIQUE, uri-id, url(512) |
| uri-id-id | uri-id, id |
Foreign Keys
------------

BIN
images/default/corgidon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
images/default/diaspora.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1000px"
height="1000px"
viewBox="0 0 1000 1000"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="GoToSocial_icon1.svg"
inkscape:export-xdpi="95.999992"
inkscape:export-ydpi="95.999992">
<defs
id="defs5117">
<inkscape:path-effect
effect="spiro"
id="path-effect5760"
is_visible="true" />
<inkscape:path-effect
effect="spiro"
id="path-effect5756"
is_visible="true" />
<inkscape:path-effect
effect="spiro"
id="path-effect5752"
is_visible="true" />
<inkscape:path-effect
effect="spiro"
id="path-effect5748"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710678"
inkscape:cx="460.72691"
inkscape:cy="522.20279"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata5120">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="background"
inkscape:groupmode="layer"
id="layer1"
style="display:inline">
<rect
style="fill:#d0d0d0;fill-opacity:1;stroke:none;stroke-width:1.51092136;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="rect5876"
width="1000.0042"
height="1000"
x="0"
y="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="sloth"
style="display:inline">
<g
id="g5890"
transform="translate(-10)">
<path
sodipodi:nodetypes="ssscccs"
inkscape:connector-curvature="0"
id="path5762"
d="M 861.29285,497.07031 C 861.65556,665.3247 774.21642,807.40548 511.60027,807.86794 270.63622,808.29226 154.54309,691.2756 155.19024,504.19228 155.7289,348.47535 251.17288,227.4551 422.3176,205.3802 c -35.32036,-75.85452 52.24232,-96.94648 73.77615,-32.00508 13.73451,-37.63439 108.24345,-49.1716 62.21106,24.77055 147.95052,3.75658 302.58353,111.28061 302.98804,298.92464 z"
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:2.57058167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<path
sodipodi:nodetypes="sssssss"
inkscape:connector-curvature="0"
id="path5780"
d="m 809.15213,517.31679 c -4.83374,150.52526 -109.85544,235.22815 -297.81171,235.31839 -179.6675,0.0863 -290.56109,-70.98245 -298.50223,-235.31839 -4.6366,-95.95095 54.62861,-181.84442 144.83016,-194.18834 80.92123,-11.07393 99.7402,21.01802 153.67207,21.01802 59.21658,0 83.64871,-35.09608 162.84221,-21.85479 87.78391,14.67763 137.90533,103.6017 134.9695,195.02511 z"
style="display:inline;fill:#e8e8e8;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<path
sodipodi:nodetypes="scssscs"
inkscape:connector-curvature="0"
id="path5780-9"
d="m 809.15213,517.31679 c -1.32872,41.37724 -10.22787,77.78081 -26.33906,108.8204 -46.60931,-39.48031 -99.53509,-10.7281 -171.50115,-39.43334 -44.77145,-17.85808 -51.41659,-56.56453 -51.21999,-81.3542 0.54836,-69.14384 48.17003,-93.45758 95.53601,-97.60875 55.74677,-4.88566 124.5246,36.1482 151.01547,66.79433 2.11531,14.01083 2.97167,28.36512 2.50872,42.78156 z"
style="display:inline;fill:#a1a1a1;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<ellipse
ry="50.575684"
rx="37.800804"
cy="502.64291"
cx="646.85773"
id="path5816"
style="fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.51185882;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<path
sodipodi:nodetypes="scssscs"
inkscape:connector-curvature="0"
id="path5780-9-1"
d="m 212.51463,517.3246 c 1.32872,41.37724 10.22787,77.78081 26.33906,108.8204 46.60931,-39.48031 99.57415,-10.73591 171.54021,-39.44115 44.77145,-17.85808 51.41659,-56.56453 51.21999,-81.3542 -0.54836,-69.14384 -48.20909,-93.44977 -95.57507,-97.60094 -55.74677,-4.88566 -124.5246,36.1482 -151.01547,66.79433 -2.11531,14.01083 -2.97167,28.36512 -2.50872,42.78156 z"
style="display:inline;fill:#a1a1a1;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<ellipse
transform="scale(-1,1)"
ry="50.575684"
rx="37.800804"
cy="502.64294"
cx="-374.84808"
id="path5816-0"
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.51185882;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<path
sodipodi:nodetypes="sssss"
inkscape:connector-curvature="0"
id="path5862"
d="m 543.96613,556.96185 c 0,11.0622 -14.51648,20.02988 -32.42347,20.02988 -17.90698,0 -32.42347,-8.96769 -32.42347,-20.02988 0,-11.0622 14.14619,-15.58638 32.05318,-15.58638 17.90698,0 32.79376,4.52417 32.79376,15.58638 z"
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.60515046;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<path
sodipodi:nodetypes="sssss"
inkscape:connector-curvature="0"
id="path5865"
d="m 552.00195,620.36132 c 7.06643,13.89391 -19.38375,21.24024 -40.2832,21.24024 -20.89945,0 -47.71708,-7.02219 -41.50391,-21.24024 5.71775,-13.08435 20.11619,0.73243 41.01563,0.73243 20.89944,0 34.43888,-13.1835 40.77148,-0.73243 z"
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<ellipse
transform="rotate(-6.669407)"
ry="24.882849"
rx="19.511755"
cy="560.95673"
cx="600.24731"
id="path5818"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.53898752;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<ellipse
transform="rotate(-6.6694071)"
ry="24.882849"
rx="19.511755"
cy="529.32086"
cx="329.69714"
id="path5818-8"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.53898752;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
images/default/hometown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/default/mastodon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
images/default/pleroma.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

BIN
images/default/plume.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -157,9 +157,9 @@ function wall_upload_post(App $a, $desktopmode = true)
" - size: " . $filesize . " - type: " . $filetype);
$imagedata = @file_get_contents($src);
$Image = new Image($imagedata, $filetype);
$image = new Image($imagedata, $filetype);
if (!$Image->isValid()) {
if (!$image->isValid()) {
$msg = DI::l10n()->t('Unable to process image.');
@unlink($src);
if ($r_json) {
@ -170,18 +170,18 @@ function wall_upload_post(App $a, $desktopmode = true)
System::exit();
}
$Image->orient($src);
$image->orient($src);
@unlink($src);
$max_length = DI::config()->get('system', 'max_image_length');
if ($max_length > 0) {
$Image->scaleDown($max_length);
$filesize = strlen($Image->asString());
$image->scaleDown($max_length);
$filesize = strlen($image->asString());
Logger::info("File upload: Scaling picture to new size " . $max_length);
}
$width = $Image->getWidth();
$height = $Image->getHeight();
$width = $image->getWidth();
$height = $image->getHeight();
$maximagesize = DI::config()->get('system', 'maximagesize');
@ -190,10 +190,10 @@ function wall_upload_post(App $a, $desktopmode = true)
foreach ([5120, 2560, 1280, 640] as $pixels) {
if (($filesize > $maximagesize) && (max($width, $height) > $pixels)) {
Logger::info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]);
$Image->scaleDown($pixels);
$filesize = strlen($Image->asString());
$width = $Image->getWidth();
$height = $Image->getHeight();
$image->scaleDown($pixels);
$filesize = strlen($image->asString());
$width = $image->getWidth();
$height = $image->getHeight();
}
}
if ($filesize > $maximagesize) {
@ -220,7 +220,7 @@ function wall_upload_post(App $a, $desktopmode = true)
$defperm = '<' . $default_cid . '>';
$r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 0, Photo::DEFAULT, $defperm);
$r = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 0, Photo::DEFAULT, $defperm);
if (!$r) {
$msg = DI::l10n()->t('Image upload failed.');
@ -233,16 +233,16 @@ function wall_upload_post(App $a, $desktopmode = true)
}
if ($width > 640 || $height > 640) {
$Image->scaleDown(640);
$r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 1, Photo::DEFAULT, $defperm);
$image->scaleDown(640);
$r = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 1, Photo::DEFAULT, $defperm);
if ($r) {
$smallest = 1;
}
}
if ($width > 320 || $height > 320) {
$Image->scaleDown(320);
$r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 2, Photo::DEFAULT, $defperm);
$image->scaleDown(320);
$r = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 2, Photo::DEFAULT, $defperm);
if ($r && ($smallest == 0)) {
$smallest = 2;
}
@ -264,8 +264,8 @@ function wall_upload_post(App $a, $desktopmode = true)
$picture["height"] = $photo["height"];
$picture["type"] = $photo["type"];
$picture["albumpage"] = DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id;
$picture["picture"] = DI::baseUrl() . "/photo/{$resource_id}-0." . $Image->getExt();
$picture["preview"] = DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $Image->getExt();
$picture["picture"] = DI::baseUrl() . "/photo/{$resource_id}-0." . $image->getExt();
$picture["preview"] = DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $image->getExt();
if ($r_json) {
System::jsonExit(['picture' => $picture]);
@ -280,7 +280,7 @@ function wall_upload_post(App $a, $desktopmode = true)
System::jsonExit(['ok' => true]);
}
echo "\n\n" . '[url=' . DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id . '][img]' . DI::baseUrl() . "/photo/{$resource_id}-{$smallest}.".$Image->getExt()."[/img][/url]\n\n";
echo "\n\n" . '[url=' . DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id . '][img]' . DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $image->getExt() . "[/img][/url]\n\n";
System::exit();
// NOTREACHED
}

View file

@ -145,7 +145,7 @@ class App
$this->nickname = $nickname;
}
public function isLoggedIn()
public function isLoggedIn(): bool
{
return local_user() && $this->user_id && ($this->user_id == local_user());
}
@ -155,7 +155,7 @@ class App
*
* @return bool true if user is an admin
*/
public function isSiteAdmin()
public function isSiteAdmin(): bool
{
$admin_email = $this->config->get('config', 'admin_email');
@ -166,18 +166,18 @@ class App
/**
* Fetch the user id
* @return int
* @return int User id
*/
public function getLoggedInUserId()
public function getLoggedInUserId(): int
{
return $this->user_id;
}
/**
* Fetch the user nick name
* @return string
* @return string User's nickname
*/
public function getLoggedInUserNickname()
public function getLoggedInUserNickname(): string
{
return $this->nickname;
}
@ -198,7 +198,7 @@ class App
*
* @return int
*/
public function getProfileOwner():int
public function getProfileOwner(): int
{
return $this->profile_owner;
}
@ -219,7 +219,7 @@ class App
*
* @return int
*/
public function getContactId():int
public function getContactId(): int
{
return $this->contact_id;
}
@ -241,7 +241,7 @@ class App
*
* @return int
*/
public function getTimeZone():string
public function getTimeZone(): string
{
return $this->timezone;
}
@ -260,9 +260,9 @@ class App
/**
* Fetch workerqueue information
*
* @return array
* @return array Worker queue
*/
public function getQueue()
public function getQueue(): array
{
return $this->queue ?? [];
}
@ -270,8 +270,8 @@ class App
/**
* Fetch a specific workerqueue field
*
* @param string $index
* @return mixed
* @param string $index Work queue record to fetch
* @return mixed Work queue item or NULL if not found
*/
public function getQueueValue(string $index)
{
@ -306,9 +306,9 @@ class App
/**
* The basepath of this app
*
* @return string
* @return string Base path from configuration
*/
public function getBasePath()
public function getBasePath(): string
{
// Don't use the basepath of the config table for basepath (it should always be the config-file one)
return $this->config->getCache()->get('system', 'basepath');
@ -396,10 +396,10 @@ class App
/**
* Returns the current theme name. May be overriden by the mobile theme name.
*
* @return string
* @return string Current theme name or empty string in installation phase
* @throws Exception
*/
public function getCurrentTheme()
public function getCurrentTheme(): string
{
if ($this->mode->isInstall()) {
return '';
@ -425,10 +425,10 @@ class App
/**
* Returns the current mobile theme name.
*
* @return string
* @return string Mobile theme name or empty string if installer
* @throws Exception
*/
public function getCurrentMobileTheme()
public function getCurrentMobileTheme(): string
{
if ($this->mode->isInstall()) {
return '';
@ -441,12 +441,22 @@ class App
return $this->currentMobileTheme;
}
public function setCurrentTheme($theme)
/**
* Setter for current theme name
*
* @param string $theme Name of current theme
*/
public function setCurrentTheme(string $theme)
{
$this->currentTheme = $theme;
}
public function setCurrentMobileTheme($theme)
/**
* Setter for current mobile theme name
*
* @param string $theme Name of current mobile theme
*/
public function setCurrentMobileTheme(string $theme)
{
$this->currentMobileTheme = $theme;
}
@ -525,10 +535,10 @@ class App
/**
* Provide a sane default if nothing is chosen or the specified theme does not exist.
*
* @return string
* @return string Current theme's stylsheet path
* @throws Exception
*/
public function getCurrentThemeStylesheetPath()
public function getCurrentThemeStylesheetPath(): string
{
return Core\Theme::getStylesheetPath($this->getCurrentTheme());
}
@ -730,7 +740,7 @@ class App
*
* @throws HTTPException\InternalServerErrorException
*/
public function redirect($toUrl)
public function redirect(string $toUrl)
{
if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) {
Core\System::externalRedirect($toUrl);

View file

@ -78,7 +78,7 @@ class Arguments
/**
* @return string The whole command of this call
*/
public function getCommand()
public function getCommand(): string
{
return $this->command;
}
@ -94,7 +94,7 @@ class Arguments
/**
* @return array All arguments of this call
*/
public function getArgv()
public function getArgv(): array
{
return $this->argv;
}
@ -102,7 +102,7 @@ class Arguments
/**
* @return string The used HTTP method
*/
public function getMethod()
public function getMethod(): string
{
return $this->method;
}
@ -110,7 +110,7 @@ class Arguments
/**
* @return int The count of arguments of this call
*/
public function getArgc()
public function getArgc(): int
{
return $this->argc;
}
@ -145,7 +145,7 @@ class Arguments
*
* @return bool if the argument position exists
*/
public function has(int $position)
public function has(int $position): bool
{
return array_key_exists($position, $this->argv);
}
@ -158,7 +158,7 @@ class Arguments
*
* @return Arguments The determined arguments
*/
public function determine(array $server, array $get)
public function determine(array $server, array $get): Arguments
{
// removing leading / - maybe a nginx problem
$server['QUERY_STRING'] = ltrim($server['QUERY_STRING'] ?? '', '/');

View file

@ -107,7 +107,7 @@ class BaseURL
*
* @return string
*/
public function getHostname()
public function getHostname(): string
{
return $this->hostname;
}
@ -117,7 +117,7 @@ class BaseURL
*
* @return string
*/
public function getScheme()
public function getScheme(): string
{
return $this->scheme;
}
@ -127,7 +127,7 @@ class BaseURL
*
* @return int
*/
public function getSSLPolicy()
public function getSSLPolicy(): int
{
return $this->sslPolicy;
}
@ -137,7 +137,7 @@ class BaseURL
*
* @return string
*/
public function getUrlPath()
public function getUrlPath(): string
{
return $this->urlPath;
}
@ -151,7 +151,7 @@ class BaseURL
*
* @return string
*/
public function get($ssl = false)
public function get(bool $ssl = false): string
{
if ($this->sslPolicy === self::SSL_POLICY_SELFSIGN && $ssl) {
return Network::switchScheme($this->url);
@ -168,8 +168,9 @@ class BaseURL
* @param string? $urlPath
*
* @return bool true, if successful
* @TODO Find proper types
*/
public function save($hostname = null, $sslPolicy = null, $urlPath = null)
public function save($hostname = null, $sslPolicy = null, $urlPath = null): bool
{
$currHostname = $this->hostname;
$currSSLPolicy = $this->sslPolicy;
@ -224,11 +225,11 @@ class BaseURL
/**
* Save the current url as base URL
*
* @param $url
* @param string $url
*
* @return bool true, if the save was successful
*/
public function saveByURL($url)
public function saveByURL(string $url): bool
{
$parsed = @parse_url($url);
@ -421,7 +422,7 @@ class BaseURL
*
* @return string The cleaned url
*/
public function remove(string $origURL)
public function remove(string $origURL): string
{
// Remove the hostname from the url if it is an internal link
$nurl = Strings::normaliseLink($origURL);
@ -445,7 +446,7 @@ class BaseURL
*
* @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node
*/
public function redirect($toUrl = '', $ssl = false)
public function redirect(string $toUrl = '', bool $ssl = false)
{
if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) {
throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo");
@ -458,8 +459,8 @@ class BaseURL
/**
* Returns the base url as string
*/
public function __toString()
public function __toString(): string
{
return $this->get();
return (string) $this->get();
}
}

View file

@ -130,7 +130,7 @@ class Mode
*
* @throws \Exception
*/
public function determine(BasePath $basepath, Database $database, Cache $configCache)
public function determine(BasePath $basepath, Database $database, Cache $configCache): Mode
{
$mode = 0;
@ -178,7 +178,7 @@ class Mode
*
* @return Mode returns the determined mode
*/
public function determineRunMode(bool $isBackend, array $server, Arguments $args, MobileDetect $mobileDetect)
public function determineRunMode(bool $isBackend, array $server, Arguments $args, MobileDetect $mobileDetect): Mode
{
foreach (self::BACKEND_CONTENT_TYPES as $type) {
if (strpos(strtolower($server['HTTP_ACCEPT'] ?? ''), $type) !== false) {
@ -201,7 +201,7 @@ class Mode
*
* @return bool returns true, if the mode is set
*/
public function has($mode)
public function has(int $mode): bool
{
return ($this->mode & $mode) > 0;
}
@ -227,7 +227,7 @@ class Mode
*
* @return int Execution Mode
*/
public function getExecutor()
public function getExecutor(): int
{
return $this->executor;
}
@ -235,9 +235,9 @@ class Mode
/**
* Install mode is when the local config file is missing or the DB schema hasn't been installed yet.
*
* @return bool
* @return bool Whether installation mode is active (local/database configuration files present or not)
*/
public function isInstall()
public function isInstall(): bool
{
return !$this->has(Mode::LOCALCONFIGPRESENT) ||
!$this->has(MODE::DBCONFIGAVAILABLE);
@ -248,7 +248,7 @@ class Mode
*
* @return bool
*/
public function isNormal()
public function isNormal(): bool
{
return $this->has(Mode::LOCALCONFIGPRESENT) &&
$this->has(Mode::DBAVAILABLE) &&
@ -261,7 +261,7 @@ class Mode
*
* @return bool Is it a backend call
*/
public function isBackend()
public function isBackend(): bool
{
return $this->isBackend;
}
@ -271,7 +271,7 @@ class Mode
*
* @return bool true if it was an AJAX request
*/
public function isAjax()
public function isAjax(): bool
{
return $this->isAjax;
}
@ -281,7 +281,7 @@ class Mode
*
* @return bool true if it was an mobile request
*/
public function isMobile()
public function isMobile(): bool
{
return $this->isMobile;
}
@ -291,7 +291,7 @@ class Mode
*
* @return bool true if it was an tablet request
*/
public function isTablet()
public function isTablet(): bool
{
return $this->isTablet;
}

View file

@ -195,7 +195,7 @@ class Page implements ArrayAccess
* @param string $media
* @see Page::initHead()
*/
public function registerStylesheet($path, string $media = 'screen')
public function registerStylesheet(string $path, string $media = 'screen')
{
$path = Network::appendQueryParam($path, ['v' => FRIENDICA_VERSION]);
@ -288,7 +288,7 @@ class Page implements ArrayAccess
*
* Taken from http://webcheatsheet.com/php/get_current_page_url.php
*/
private function curPageURL()
private function curPageURL(): string
{
$pageURL = 'http';
if (!empty($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on")) {

View file

@ -152,7 +152,7 @@ class Router
*
* @throws HTTPException\InternalServerErrorException In case of invalid configs
*/
public function loadRoutes(array $routes)
public function loadRoutes(array $routes): Router
{
$routeCollector = ($this->routeCollector ?? new RouteCollector(new Std(), new GroupCountBased()));
@ -166,6 +166,13 @@ class Router
return $this;
}
/**
* Adds multiple routes to a route collector
*
* @param RouteCollector $routeCollector Route collector instance
* @param array $routes Multiple routes to be added
* @throws HTTPException\InternalServerErrorException If route was wrong (somehow)
*/
private function addRoutes(RouteCollector $routeCollector, array $routes)
{
foreach ($routes as $route => $config) {
@ -221,7 +228,7 @@ class Router
*
* @return bool
*/
private function isRoute(array $config)
private function isRoute(array $config): bool
{
return
// The config array should at least have one entry
@ -253,7 +260,7 @@ class Router
* @throws HTTPException\MethodNotAllowedException If a rule matched but the method didn't
* @throws HTTPException\NotFoundException If no rule matched
*/
private function getModuleClass()
private function getModuleClass(): string
{
$cmd = $this->args->getCommand();
$cmd = '/' . ltrim($cmd, '/');

View file

@ -70,9 +70,11 @@ class BaseCollection extends \ArrayIterator
}
/**
* @return int
* Getter for total count
*
* @return int Total count
*/
public function getTotalCount()
public function getTotalCount(): int
{
return $this->totalCount;
}
@ -85,7 +87,7 @@ class BaseCollection extends \ArrayIterator
* @return array
* @see array_column()
*/
public function column($column, $index_key = null)
public function column(string $column, $index_key = null): array
{
return array_column($this->getArrayCopy(true), $column, $index_key);
}
@ -97,7 +99,7 @@ class BaseCollection extends \ArrayIterator
* @return BaseCollection
* @see array_map()
*/
public function map(callable $callback)
public function map(callable $callback): BaseCollection
{
return new static(array_map($callback, $this->getArrayCopy()), $this->getTotalCount());
}
@ -110,7 +112,7 @@ class BaseCollection extends \ArrayIterator
* @return BaseCollection
* @see array_filter()
*/
public function filter(callable $callback = null, int $flag = 0)
public function filter(callable $callback = null, int $flag = 0): BaseCollection
{
return new static(array_filter($this->getArrayCopy(), $callback, $flag));
}

View file

@ -55,14 +55,14 @@ abstract class BaseEntity extends BaseDataTransferObject
}
/**
* @param $name
* @param mixed $name
* @return bool
* @throws HTTPException\InternalServerErrorException
*/
public function __isset($name)
public function __isset($name): bool
{
if (!property_exists($this, $name)) {
throw new HTTPException\InternalServerErrorException('Unknown property ' . $name . ' in Entity ' . static::class);
throw new HTTPException\InternalServerErrorException('Unknown property ' . $name . ' of type ' . gettype($name) . ' in Entity ' . static::class);
}
return !empty($this->$name);

View file

@ -110,11 +110,11 @@ abstract class BaseModel extends BaseDataTransferObject
* - $model->field (outside of class)
* - $this->field (inside of class)
*
* @param $name
* @param string $name Name of data to fetch
* @return mixed
* @throws HTTPException\InternalServerErrorException
*/
public function __get($name)
public function __get(string $name)
{
$this->checkValid();

View file

@ -331,7 +331,7 @@ abstract class BaseModule implements ICanHandleRequests
* Actually, important actions should not be triggered by Links / GET-Requests at all, but sometimes they still are,
* so this mechanism brings in some damage control (the attacker would be able to forge a request to a form of this type, but not to forms of other types).
*/
public static function getFormSecurityToken($typename = '')
public static function getFormSecurityToken(string $typename = '')
{
$user = User::getById(DI::app()->getLoggedInUserId(), ['guid', 'prvkey']);
$timestamp = time();
@ -340,7 +340,14 @@ abstract class BaseModule implements ICanHandleRequests
return $timestamp . '.' . $sec_hash;
}
public static function checkFormSecurityToken($typename = '', $formname = 'form_security_token')
/**
* Checks if form's security (CSRF) token is valid.
*
* @param string $typename ???
* @param string $formname Name of form/field (???)
* @return bool Whether it is valid
*/
public static function checkFormSecurityToken(string $typename = '', string $formname = 'form_security_token'): bool
{
$hash = null;
@ -372,12 +379,12 @@ abstract class BaseModule implements ICanHandleRequests
return ($sec_hash == $x[1]);
}
public static function getFormSecurityStandardErrorMessage()
public static function getFormSecurityStandardErrorMessage(): string
{
return DI::l10n()->t("The form security token was not correct. This probably happened because the form has been opened for too long \x28>3 hours\x29 before submitting it.") . EOL;
}
public static function checkFormSecurityTokenRedirectOnError($err_redirect, $typename = '', $formname = 'form_security_token')
public static function checkFormSecurityTokenRedirectOnError(string $err_redirect, string $typename = '', string $formname = 'form_security_token')
{
if (!self::checkFormSecurityToken($typename, $formname)) {
Logger::notice('checkFormSecurityToken failed: user ' . DI::app()->getLoggedInUserNickname() . ' - form element ' . $typename);
@ -387,7 +394,7 @@ abstract class BaseModule implements ICanHandleRequests
}
}
public static function checkFormSecurityTokenForbiddenOnError($typename = '', $formname = 'form_security_token')
public static function checkFormSecurityTokenForbiddenOnError(string $typename = '', string $formname = 'form_security_token')
{
if (!self::checkFormSecurityToken($typename, $formname)) {
Logger::notice('checkFormSecurityToken failed: user ' . DI::app()->getLoggedInUserNickname() . ' - form element ' . $typename);

View file

@ -32,7 +32,6 @@ use Friendica\Util\HTTPSignature;
use Friendica\Util\Images;
use Friendica\Util\Network;
use Friendica\Util\Proxy;
use Friendica\Util\Strings;
/**
* functions for handling contact avatar caching
@ -124,7 +123,7 @@ class Avatar
return $fields;
}
private static function getFilename(string $url)
private static function getFilename(string $url): string
{
$guid = Item::guidFromUri($url, parse_url($url, PHP_URL_HOST));
@ -139,21 +138,19 @@ class Avatar
return '';
}
$path = self::BASE_PATH . $filename . $size . '.' . $image->getExt();
$path = $filename . $size . '.' . $image->getExt();
$filepath = DI::basePath() . $path;
$basepath = self::basePath();
if (empty($basepath)) {
return '';
}
$dirpath = DI::basePath() . self::BASE_PATH;
$filepath = $basepath . $path;
$dirpath = $basepath;
DI::profiler()->startRecording('file');
if (!file_exists($dirpath)) {
if (!mkdir($dirpath, 0775)) {
Logger::warning('Base directory could not be created', ['directory' => $dirpath]);
return '';
}
}
// Fetch the permission and group ownership of the "avatar" path and apply to all files
$dir_perm = fileperms($dirpath) & 0777;
$file_perm = fileperms($dirpath) & 0666;
@ -198,7 +195,7 @@ class Avatar
return '';
}
return DI::baseUrl() . $path . '?ts=' . $timestamp;
return self::baseUrl() . $path . '?ts=' . $timestamp;
}
/**
@ -221,16 +218,17 @@ class Avatar
private static function getCacheFile(string $avatar): string
{
$parts = parse_url($avatar);
if (empty($parts['host']) || ($parts['host'] != DI::baseUrl()->getHostname())) {
if (empty($parts['host']) || ($parts['host'] != parse_url(self::baseUrl(), PHP_URL_HOST))) {
return '';
}
$pos = strpos($parts['path'], DI::baseUrl()->getUrlPath() . self::BASE_PATH);
$avatarpath = parse_url(self::baseUrl(), PHP_URL_PATH);
$pos = strpos($parts['path'], $avatarpath);
if ($pos !== 0) {
return '';
}
$filename = DI::basePath() . $parts['path'];
$filename = self::basePath() . substr($parts['path'], strlen($avatarpath));
DI::profiler()->startRecording('file');
$exists = file_exists($filename);
@ -269,4 +267,47 @@ class Avatar
Logger::debug('Unlink avatar', ['avatar' => $avatar]);
}
}
/**
* Fetch the avatar base path
*
* @return string
*/
private static function basePath(): string
{
$basepath = DI::config()->get('system', 'avatar_cache_path');
if (empty($basepath)) {
$basepath = DI::basePath() . self::BASE_PATH;
}
$basepath = rtrim($basepath, '/') . '/';
if (!file_exists($basepath)) {
// We only automatically create the folder when it is in the web root
if (strpos($basepath, DI::basePath()) !== 0) {
Logger::warning('Base directory does not exist', ['directory' => $basepath]);
return '';
}
if (!mkdir($basepath, 0775)) {
Logger::warning('Base directory could not be created', ['directory' => $basepath]);
return '';
}
}
return $basepath;
}
/**
* Fetch the avatar base url
*
* @return string
*/
private static function baseUrl(): string
{
$baseurl = DI::config()->get('system', 'avatar_cache_url');
if (!empty($baseurl)) {
return rtrim($baseurl, '/') . '/';
}
return DI::baseUrl() . self::BASE_PATH;
}
}

View file

@ -49,7 +49,7 @@ class BoundariesPager extends Pager
* @param string $last_item_id The id† of the last item in the displayed item list
* @param integer $itemsPerPage An optional number of items per page to override the default value
*/
public function __construct(L10n $l10n, $queryString, $first_item_id = null, $last_item_id = null, $itemsPerPage = 50)
public function __construct(L10n $l10n, string $queryString, string $first_item_id = null, string $last_item_id = null, int $itemsPerPage = 50)
{
parent::__construct($l10n, $queryString, $itemsPerPage);
@ -102,7 +102,7 @@ class BoundariesPager extends Pager
* @return string HTML string of the pager
* @throws \Exception
*/
public function renderMinimal(int $itemCount)
public function renderMinimal(int $itemCount): string
{
$displayedItemCount = max(0, intval($itemCount));

View file

@ -41,7 +41,7 @@ class ContactSelector
* @param boolean $disabled optional, default false
* @return string
*/
public static function pollInterval($current, $disabled = false)
public static function pollInterval(string $current, bool $disabled = false): string
{
$dis = (($disabled) ? ' disabled="disabled" ' : '');
$o = '';
@ -84,7 +84,7 @@ class ContactSelector
* @return string Server URL
* @throws \Exception
*/
private static function getServerURLForProfile($profile)
private static function getServerURLForProfile(string $profile): string
{
if (!empty(self::$server_url[$profile])) {
return self::$server_url[$profile];
@ -111,13 +111,16 @@ class ContactSelector
}
/**
* Determines network name
*
* @param string $network network of the contact
* @param string $profile optional, default empty
* @param string $protocol (Optional) Protocol that is used for the transmission
* @param int $gsid Server id
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function networkToName($network, $profile = '', $protocol = '', $gsid = 0)
public static function networkToName(string $network, string $profile = '', string $protocol = '', int $gsid = null): string
{
$nets = [
Protocol::DFRN => DI::l10n()->t('DFRN'),
@ -179,12 +182,15 @@ class ContactSelector
}
/**
* Determines network's icon name
*
* @param string $network network
* @param string $profile optional, default empty
* @return string
* @param int $gsid Server id
* @return string Name for network icon
* @throws \Exception
*/
public static function networkToIcon($network, $profile = "", $gsid = 0)
public static function networkToIcon(string $network, string $profile = "", int $gsid = null): string
{
$nets = [
Protocol::DFRN => 'friendica',

View file

@ -154,7 +154,7 @@ class Conversation
}
// Skip when the causer of the parent is the same as the author of the announce
if (($verb == Activity::ANNOUNCE) && !empty($thread_parent['causer-id'] && ($thread_parent['causer-id'] == $activity['author-id']))) {
if (($verb == Activity::ANNOUNCE) && !empty($thread_parent['causer-id']) && ($thread_parent['causer-id'] == $activity['author-id'])) {
continue;
}
@ -189,7 +189,7 @@ class Conversation
* @return string formatted text
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public function formatActivity(array $links, $verb, $id)
public function formatActivity(array $links, string $verb, int $id): string
{
$this->profiler->startRecording('rendering');
$o = '';
@ -275,7 +275,7 @@ class Conversation
return $o;
}
public function statusEditor(array $x = [], $notes_cid = 0, $popup = false)
public function statusEditor(array $x = [], int $notes_cid = 0, bool $popup = false): string
{
$user = User::getById($this->app->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']);
if (empty($user['uid'])) {
@ -414,8 +414,8 @@ class Conversation
* figures out how to determine page owner and other contextual items
* that are based on unique features of the calling module.
* @param array $items
* @param $mode
* @param $update
* @param string $mode
* @param $update @TODO Which type?
* @param bool $preview
* @param string $order
* @param int $uid
@ -423,7 +423,7 @@ class Conversation
* @throws ImagickException
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public function create(array $items, $mode, $update, $preview = false, $order = 'commented', $uid = 0)
public function create(array $items, string $mode, $update, bool $preview = false, string $order = 'commented', int $uid = 0): string
{
$this->profiler->startRecording('rendering');
@ -784,7 +784,7 @@ class Conversation
return $o;
}
private function getBlocklist()
private function getBlocklist(): array
{
if (!local_user()) {
return [];
@ -816,7 +816,7 @@ class Conversation
*
* @return array items with parents and comments
*/
private function addRowInformation(array $row, array $activity, array $thr_parent)
private function addRowInformation(array $row, array $activity, array $thr_parent): array
{
$this->profiler->startRecording('rendering');
@ -911,7 +911,7 @@ class Conversation
* @return array items with parents and comments
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private function addChildren(array $parents, bool $block_authors, string $order, int $uid, string $mode)
private function addChildren(array $parents, bool $block_authors, string $order, int $uid, string $mode): array
{
$this->profiler->startRecording('rendering');
if (count($parents) > 1) {
@ -1005,7 +1005,7 @@ class Conversation
* @param bool $recursive
* @return array
*/
private function getItemChildren(array &$item_list, array $parent, $recursive = true)
private function getItemChildren(array &$item_list, array $parent, bool $recursive = true): array
{
$this->profiler->startRecording('rendering');
$children = [];
@ -1040,7 +1040,7 @@ class Conversation
* @param array $items
* @return array
*/
private function sortItemChildren(array $items)
private function sortItemChildren(array $items): array
{
$this->profiler->startRecording('rendering');
$result = $items;
@ -1086,7 +1086,7 @@ class Conversation
* @param array $parent A tree-like array of items
* @return array
*/
private function smartFlattenConversation(array $parent)
private function smartFlattenConversation(array $parent): array
{
$this->profiler->startRecording('rendering');
if (!isset($parent['children']) || count($parent['children']) == 0) {
@ -1142,7 +1142,7 @@ class Conversation
* @return array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private function convSort(array $item_list, $order)
private function convSort(array $item_list, string $order): array
{
$this->profiler->startRecording('rendering');
$parents = [];
@ -1222,7 +1222,7 @@ class Conversation
* @param array $b
* @return int
*/
private function sortThrFeaturedReceived(array $a, array $b)
private function sortThrFeaturedReceived(array $a, array $b): int
{
if ($b['featured'] && !$a['featured']) {
return 1;
@ -1240,7 +1240,7 @@ class Conversation
* @param array $b
* @return int
*/
private function sortThrFeaturedCommented(array $a, array $b)
private function sortThrFeaturedCommented(array $a, array $b): int
{
if ($b['featured'] && !$a['featured']) {
return 1;
@ -1258,7 +1258,7 @@ class Conversation
* @param array $b
* @return int
*/
private function sortThrReceived(array $a, array $b)
private function sortThrReceived(array $a, array $b): int
{
return strcmp($b['received'], $a['received']);
}
@ -1270,7 +1270,7 @@ class Conversation
* @param array $b
* @return int
*/
private function sortThrReceivedRev(array $a, array $b)
private function sortThrReceivedRev(array $a, array $b): int
{
return strcmp($a['received'], $b['received']);
}
@ -1282,7 +1282,7 @@ class Conversation
* @param array $b
* @return int
*/
private function sortThrCommented(array $a, array $b)
private function sortThrCommented(array $a, array $b): int
{
return strcmp($b['commented'], $a['commented']);
}
@ -1294,7 +1294,7 @@ class Conversation
* @param array $b
* @return int
*/
private function sortThrCreated(array $a, array $b)
private function sortThrCreated(array $a, array $b): int
{
return strcmp($b['created'], $a['created']);
}

View file

@ -61,7 +61,7 @@ class HTML
* inner value from an attribute value and disregard the tag children.
* @return bool Whether a replacement was done
*/
private static function tagToBBCodeSub(DOMDocument $doc, string $tag, array $attributes, string $startbb, string $endbb, bool $ignoreChildren = false)
private static function tagToBBCodeSub(DOMDocument $doc, string $tag, array $attributes, string $startbb, string $endbb, bool $ignoreChildren = false): bool
{
$savestart = str_replace('$', '\x01', $startbb);
$replace = false;
@ -141,8 +141,16 @@ class HTML
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function toBBCode($message, $basepath = '')
public static function toBBCode(string $message, string $basepath = ''): string
{
/*
* Check if message is empty to prevent a lot code below being executed
* for just an empty message.
*/
if (empty($message)) {
return '';
}
DI::profiler()->startRecording('rendering');
$message = str_replace("\r", "", $message);
@ -409,7 +417,7 @@ class HTML
*
* @return string The expanded URL
*/
private static function qualifyURLsSub($matches, $basepath)
private static function qualifyURLsSub(array $matches, string $basepath): string
{
$base = parse_url($basepath);
unset($base['query']);
@ -436,7 +444,7 @@ class HTML
*
* @return string Body with expanded URLs
*/
private static function qualifyURLs($body, $basepath)
private static function qualifyURLs(string $body, string $basepath): string
{
$URLSearchString = "^\[\]";
@ -462,7 +470,7 @@ class HTML
return $body;
}
private static function breakLines($line, $level, $wraplength = 75)
private static function breakLines(string $line, int $level, int $wraplength = 75): string
{
if ($wraplength == 0) {
$wraplength = 2000000;
@ -503,7 +511,7 @@ class HTML
return implode("\n", $newlines);
}
private static function quoteLevel($message, $wraplength = 75)
private static function quoteLevel(string $message, int $wraplength = 75): string
{
$lines = explode("\n", $message);
@ -539,7 +547,7 @@ class HTML
return implode("\n", $newlines);
}
private static function collectURLs($message)
private static function collectURLs(string $message): array
{
$pattern = '/<a.*?href="(.*?)".*?>(.*?)<\/a>/is';
preg_match_all($pattern, $message, $result, PREG_SET_ORDER);
@ -585,7 +593,7 @@ class HTML
* @param bool $compact True: Completely strips image tags; False: Keeps image URLs
* @return string
*/
public static function toPlaintext(string $html, $wraplength = 75, $compact = false)
public static function toPlaintext(string $html, int $wraplength = 75, bool $compact = false): string
{
DI::profiler()->startRecording('rendering');
$message = str_replace("\r", "", $html);
@ -705,7 +713,7 @@ class HTML
* @param string $html
* @return string
*/
public static function toMarkdown($html)
public static function toMarkdown(string $html): string
{
DI::profiler()->startRecording('rendering');
$converter = new HtmlConverter(['hard_break' => true]);
@ -721,7 +729,7 @@ class HTML
* @param string $s
* @return string
*/
public static function toBBCodeVideo($s)
public static function toBBCodeVideo(string $s): string
{
$s = preg_replace(
'#<object[^>]+>(.*?)https?://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+)(.*?)</object>#ism',
@ -751,7 +759,7 @@ class HTML
* @param string $base base url
* @return string
*/
public static function relToAbs($text, $base)
public static function relToAbs(string $text, string $base): string
{
if (empty($base)) {
return $text;
@ -790,7 +798,7 @@ class HTML
* @return string html for loader
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function scrollLoader()
public static function scrollLoader(): string
{
$tpl = Renderer::getMarkupTemplate("scroll_loader.tpl");
return Renderer::replaceMacros($tpl, [
@ -819,7 +827,7 @@ class HTML
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function micropro($contact, $redirect = false, $class = '', $textmode = false)
public static function micropro(array $contact, bool $redirect = false, string $class = '', bool $textmode = false): string
{
// Use the contact URL if no address is available
if (empty($contact['addr'])) {
@ -859,13 +867,12 @@ class HTML
*
* @param string $s Search query.
* @param string $id HTML id
* @param string $url Search url.
* @param bool $aside Display the search widgit aside.
*
* @return string Formatted HTML.
* @throws \Exception
*/
public static function search($s, $id = 'search-box', $aside = true)
public static function search(string $s, string $id = 'search-box', bool $aside = true): string
{
$mode = 'text';
@ -906,7 +913,7 @@ class HTML
* @param string $s
* @return string
*/
public static function toLink($s)
public static function toLink(string $s): string
{
$s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="_blank" rel="noopener noreferrer">$1</a>', $s);
$s = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism", '<$1$2=$3&$4>', $s);
@ -923,7 +930,7 @@ class HTML
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function applyContentFilter($html, array $reasons)
public static function applyContentFilter(string $html, array $reasons): string
{
if (count($reasons)) {
$tpl = Renderer::getMarkupTemplate('wall/content_filter.tpl');
@ -943,7 +950,7 @@ class HTML
* @param string $s
* @return string
*/
public static function unamp($s)
public static function unamp(string $s): string
{
return str_replace('&amp;', '&', $s);
}

View file

@ -45,7 +45,7 @@ class Widget
* @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function follow($value = "")
public static function follow(string $value = ''): string
{
return Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/follow.tpl'), array(
'$connect' => DI::l10n()->t('Add New Contact'),
@ -58,8 +58,10 @@ class Widget
/**
* Return Find People widget
*
* @return string HTML code respresenting "People Widget"
*/
public static function findPeople()
public static function findPeople(): string
{
$global_dir = Search::getGlobalDirectory();
@ -97,7 +99,7 @@ class Widget
*
* @return array Unsupported networks
*/
public static function unavailableNetworks()
public static function unavailableNetworks(): array
{
// Always hide content from these networks
$networks = [Protocol::PHANTOM, Protocol::FACEBOOK, Protocol::APPNET, Protocol::ZOT];
@ -154,7 +156,7 @@ class Widget
* @return string
* @throws \Exception
*/
private static function filter($type, $title, $desc, $all, $baseUrl, array $options, $selected = null)
private static function filter(string $type, string $title, string $desc, string $all, string $baseUrl, array $options, string $selected = null): string
{
$queryString = parse_url($baseUrl, PHP_URL_QUERY);
$queryArray = [];
@ -191,7 +193,7 @@ class Widget
* @return string
* @throws \Exception
*/
public static function groups($baseurl, $selected = '')
public static function groups(string $baseurl, string $selected = ''): string
{
if (!local_user()) {
return '';

View file

@ -656,7 +656,7 @@ class Installer
* @return bool true if the check was successful, otherwise false
* @throws Exception
*/
public function checkDB(Database $dba)
public function checkDB(Database $dba): bool
{
$dba->reconnect();

View file

@ -60,7 +60,7 @@ class Worker
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function processQueue($run_cron, Process $process)
public static function processQueue(bool $run_cron, Process $process)
{
self::$up_start = microtime(true);
@ -169,7 +169,7 @@ class Worker
*
* @return boolean
*/
public static function isReady()
public static function isReady(): bool
{
// Count active workers and compare them with a maximum value that depends on the load
if (self::tooMuchWorkers()) {
@ -204,7 +204,7 @@ class Worker
* @return boolean Returns "true" if tasks are existing
* @throws \Exception
*/
public static function entriesExists()
public static function entriesExists(): bool
{
$stamp = (float)microtime(true);
$exists = DBA::exists('workerqueue', ["NOT `done` AND `pid` = 0 AND `next_try` < ?", DateTimeFormat::utcNow()]);
@ -218,7 +218,7 @@ class Worker
* @return integer Number of deferred entries in the worker queue
* @throws \Exception
*/
private static function deferredEntries()
private static function deferredEntries(): int
{
$stamp = (float)microtime(true);
$count = DBA::count('workerqueue', ["NOT `done` AND `pid` = 0 AND `retrial` > ?", 0]);
@ -233,7 +233,7 @@ class Worker
* @return integer Number of non executed entries in the worker queue
* @throws \Exception
*/
private static function totalEntries()
private static function totalEntries(): int
{
$stamp = (float)microtime(true);
$count = DBA::count('workerqueue', ['done' => false, 'pid' => 0]);
@ -248,7 +248,7 @@ class Worker
* @return integer Number of active worker processes
* @throws \Exception
*/
private static function highestPriority()
private static function highestPriority(): int
{
$stamp = (float)microtime(true);
$condition = ["`pid` = 0 AND NOT `done` AND `next_try` < ?", DateTimeFormat::utcNow()];
@ -269,7 +269,7 @@ class Worker
* @return integer Is there a process running with that priority?
* @throws \Exception
*/
private static function processWithPriorityActive($priority)
private static function processWithPriorityActive(int $priority): int
{
$condition = ["`priority` <= ? AND `pid` != 0 AND NOT `done`", $priority];
return DBA::exists('workerqueue', $condition);
@ -281,7 +281,7 @@ class Worker
* @param mixed $file
* @return bool
*/
private static function validateInclude(&$file)
private static function validateInclude(&$file): bool
{
$orig_file = $file;
@ -321,7 +321,7 @@ class Worker
* @return boolean "true" if further processing should be stopped
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function execute($queue)
public static function execute(array $queue): bool
{
$mypid = getmypid();
@ -454,7 +454,7 @@ class Worker
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function execFunction($queue, $funcname, $argv, $method_call)
private static function execFunction(array $queue, string $funcname, array $argv, bool $method_call)
{
$a = DI::app();
@ -543,7 +543,7 @@ class Worker
* @return bool Are more than 3/4 of the maximum connections used?
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function maxConnectionsReached()
private static function maxConnectionsReached(): bool
{
// Fetch the max value from the config. This is needed when the system cannot detect the correct value by itself.
$max = DI::config()->get("system", "max_connections");
@ -627,7 +627,7 @@ class Worker
* @return bool Are there too much workers running?
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function tooMuchWorkers()
private static function tooMuchWorkers(): bool
{
$queues = DI::config()->get("system", "worker_queues", 10);
@ -751,7 +751,7 @@ class Worker
* @return integer Number of active worker processes
* @throws \Exception
*/
private static function activeWorkers()
private static function activeWorkers(): int
{
$stamp = (float)microtime(true);
$count = DI::process()->countCommand('Worker.php');
@ -766,7 +766,7 @@ class Worker
* @return array List of worker process ids
* @throws \Exception
*/
private static function getWorkerPIDList()
private static function getWorkerPIDList(): array
{
$ids = [];
$stamp = (float)microtime(true);
@ -787,7 +787,7 @@ class Worker
/**
* Returns waiting jobs for the current process id
*
* @return array waiting workerqueue jobs
* @return array|bool waiting workerqueue jobs or FALSE on failture
* @throws \Exception
*/
private static function getWaitingJobForPID()
@ -809,7 +809,7 @@ class Worker
* @return array array with next jobs
* @throws \Exception
*/
private static function nextProcess(int $limit)
private static function nextProcess(int $limit): array
{
$priority = self::nextPriority();
if (empty($priority)) {
@ -844,7 +844,7 @@ class Worker
/**
* Returns the priority of the next workerqueue job
*
* @return string priority
* @return string|bool priority or FALSE on failure
* @throws \Exception
*/
private static function nextPriority()
@ -915,7 +915,7 @@ class Worker
/**
* Find and claim the next worker process for us
*
* @return boolean Have we found something?
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function findWorkerProcesses()
@ -993,7 +993,7 @@ class Worker
* @return array worker processes
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function workerProcess()
public static function workerProcess(): array
{
// There can already be jobs for us in the queue.
$waiting = self::getWaitingJobForPID();
@ -1003,7 +1003,7 @@ class Worker
$stamp = (float)microtime(true);
if (!DI::lock()->acquire(self::LOCK_PROCESS)) {
return false;
return [];
}
self::$lock_duration += (microtime(true) - $stamp);
@ -1011,7 +1011,9 @@ class Worker
DI::lock()->release(self::LOCK_PROCESS);
return self::getWaitingJobForPID();
// Prevents "Return value of Friendica\Core\Worker::workerProcess() must be of the type array, bool returned"
$process = self::getWaitingJobForPID();
return (is_array($process) ? $process : []);
}
/**
@ -1097,7 +1099,7 @@ class Worker
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function spawnWorker($do_cron = false)
public static function spawnWorker(bool $do_cron = false)
{
if (Worker\Daemon::isMode() && DI::config()->get('system', 'worker_fork')) {
self::forkProcess($do_cron);
@ -1231,7 +1233,7 @@ class Worker
return $added;
}
public static function countWorkersByCommand(string $command)
public static function countWorkersByCommand(string $command): int
{
return DBA::count('workerqueue', ['done' => false, 'pid' => 0, 'command' => $command]);
}
@ -1244,7 +1246,7 @@ class Worker
* @param integer $max_level maximum retrial level
* @return integer the next retrial level value
*/
private static function getNextRetrial($queue, $max_level)
private static function getNextRetrial(array $queue, int $max_level): int
{
$created = strtotime($queue['created']);
$retrial_time = time() - $created;
@ -1314,9 +1316,10 @@ class Worker
/**
* Check if the system is inside the defined maintenance window
*
* @param bool $check_last_execution Whether check last execution
* @return boolean
*/
public static function isInMaintenanceWindow(bool $check_last_execution = false)
public static function isInMaintenanceWindow(bool $check_last_execution = false): bool
{
// Calculate the seconds of the start end end of the maintenance window
$start = strtotime(DI::config()->get('system', 'maintenance_start')) % 86400;

View file

@ -427,7 +427,7 @@ class DBA
* @return boolean was the update successfull?
* @throws \Exception
*/
public static function update($table, $fields, $condition, $old_fields = [], $params = [])
public static function update($table, array $fields, array $condition, $old_fields = [], array $params = [])
{
return DI::dba()->update($table, $fields, $condition, $old_fields, $params);
}
@ -443,7 +443,7 @@ class DBA
* @throws \Exception
* @see self::select
*/
public static function selectFirst($table, array $fields = [], array $condition = [], $params = [])
public static function selectFirst($table, array $fields = [], array $condition = [], array $params = [])
{
return DI::dba()->selectFirst($table, $fields, $condition, $params);
}
@ -512,7 +512,7 @@ class DBA
* $count = DBA::count($table, $condition);
* @throws \Exception
*/
public static function count($table, array $condition = [], array $params = [])
public static function count($table, array $condition = [], array $params = []): int
{
return DI::dba()->count($table, $condition, $params);
}
@ -771,7 +771,7 @@ class DBA
*
* @return array Data array
*/
public static function toArray($stmt, $do_close = true, int $count = 0)
public static function toArray($stmt, $do_close = true, int $count = 0): array
{
return DI::dba()->toArray($stmt, $do_close, $count);
}
@ -783,7 +783,7 @@ class DBA
* @param array $fields
* @return array casted fields
*/
public static function castFields(string $table, array $fields)
public static function castFields(string $table, array $fields): array
{
return DI::dba()->castFields($table, $fields);
}
@ -793,7 +793,7 @@ class DBA
*
* @return string Error number (0 if no error)
*/
public static function errorNo()
public static function errorNo(): int
{
return DI::dba()->errorNo();
}
@ -803,7 +803,7 @@ class DBA
*
* @return string Error message ('' if no error)
*/
public static function errorMessage()
public static function errorMessage(): string
{
return DI::dba()->errorMessage();
}
@ -814,7 +814,7 @@ class DBA
* @param object $stmt statement object
* @return boolean was the close successful?
*/
public static function close($stmt)
public static function close($stmt): bool
{
return DI::dba()->close($stmt);
}
@ -827,7 +827,7 @@ class DBA
* 'amount' => Number of concurrent database processes
* @throws \Exception
*/
public static function processlist()
public static function processlist(): array
{
return DI::dba()->processlist();
}

View file

@ -150,10 +150,9 @@ class DBStructure
* Print out database error messages
*
* @param string $message Message to be added to the error message
*
* @return string Error message
*/
private static function printUpdateError($message)
private static function printUpdateError(string $message): string
{
echo DI::l10n()->t("\nError %d occurred during database update:\n%s\n",
DBA::errorNo(), DBA::errorMessage());
@ -164,7 +163,7 @@ class DBStructure
public static function writeStructure()
{
$tables = [];
foreach (self::definition(null) as $name => $definition) {
foreach (self::definition('') as $name => $definition) {
$indexes = [[
'name' => 'Name',
'fields' => 'Fields',
@ -225,8 +224,8 @@ class DBStructure
$field['default'] = $value['default'] ?? 'NULL';
$field['extra'] = $value['extra'] ?? '';
foreach ($field as $fieldname => $fieldvalue) {
$lengths[$fieldname] = max($lengths[$fieldname] ?? 0, strlen($fieldvalue));
foreach ($field as $fieldName => $fieldvalue) {
$lengths[$fieldName] = max($lengths[$fieldName] ?? 0, strlen($fieldvalue));
}
$fields[] = $field;
@ -263,7 +262,7 @@ class DBStructure
file_put_contents($filename, $content);
}
public static function printStructure($basePath)
public static function printStructure(string $basePath)
{
$database = self::definition($basePath, false);
@ -288,12 +287,12 @@ class DBStructure
* On first pass, defines DB_UPDATE_VERSION constant.
*
* @see static/dbstructure.config.php
* @param boolean $with_addons_structure Whether to tack on addons additional tables
* @param string $basePath The base path of this application
* @param boolean $with_addons_structure Whether to tack on addons additional tables
* @return array
* @throws Exception
*/
public static function definition($basePath, $with_addons_structure = true)
public static function definition(string $basePath, bool $with_addons_structure = true): array
{
if (!self::$definition) {
if (empty($basePath)) {
@ -303,7 +302,7 @@ class DBStructure
$filename = $basePath . '/static/dbstructure.config.php';
if (!is_readable($filename)) {
throw new Exception('Missing database structure config file static/dbstructure.config.php');
throw new Exception('Missing database structure config file static/dbstructure.config.php at basePath=' . $basePath);
}
$definition = require $filename;
@ -327,23 +326,23 @@ class DBStructure
/**
* Get field data for the given table
*
* @param string $table
* @param string $table Tavle to load field definitions for
* @param array $data data fields
* @return array fields for the given
*/
public static function getFieldsForTable(string $table, array $data = [])
public static function getFieldsForTable(string $table, array $data = []): array
{
$definition = DBStructure::definition('', false);
if (empty($definition[$table])) {
return [];
}
$fieldnames = array_keys($definition[$table]['fields']);
$fieldNames = array_keys($definition[$table]['fields']);
$fields = [];
// Assign all field that are present in the table
foreach ($fieldnames as $field) {
foreach ($fieldNames as $field) {
if (isset($data[$field])) {
// Limit the length of varchar, varbinary, char and binrary fields
if (is_string($data[$field]) && preg_match("/char\((\d*)\)/", $definition[$table]['fields'][$field]['type'], $result)) {
@ -358,45 +357,54 @@ class DBStructure
return $fields;
}
private static function createTable($name, $structure, $verbose, $action)
/**
* Creates given table with structure
*
* @param string $name Name of table
* @param array $structure Structure of table
* @param boolean $verbose Output SQL statements
* @param boolean $action Whether to run the SQL commands
* @return Whether the SQL command ran successful
*/
private static function createTable(string $name, array $structure, bool $verbose, bool $action): bool
{
$r = true;
$engine = "";
$comment = "";
$engine = '';
$comment = '';
$sql_rows = [];
$primary_keys = [];
$foreign_keys = [];
foreach ($structure["fields"] as $fieldname => $field) {
$sql_rows[] = "`" . DBA::escape($fieldname) . "` " . self::FieldCommand($field);
foreach ($structure['fields'] as $fieldName => $field) {
$sql_rows[] = '`' . DBA::escape($fieldName) . '` ' . self::FieldCommand($field);
if (!empty($field['primary'])) {
$primary_keys[] = $fieldname;
$primary_keys[] = $fieldName;
}
if (!empty($field['foreign'])) {
$foreign_keys[$fieldname] = $field;
$foreign_keys[$fieldName] = $field;
}
}
if (!empty($structure["indexes"])) {
foreach ($structure["indexes"] as $indexname => $fieldnames) {
$sql_index = self::createIndex($indexname, $fieldnames, "");
if (!empty($structure['indexes'])) {
foreach ($structure['indexes'] as $indexName => $fieldNames) {
$sql_index = self::createIndex($indexName, $fieldNames, '');
if (!is_null($sql_index)) {
$sql_rows[] = $sql_index;
}
}
}
foreach ($foreign_keys as $fieldname => $parameters) {
$sql_rows[] = self::foreignCommand($name, $fieldname, $parameters);
foreach ($foreign_keys as $fieldName => $parameters) {
$sql_rows[] = self::foreignCommand($name, $fieldName, $parameters);
}
if (isset($structure["engine"])) {
$engine = " ENGINE=" . $structure["engine"];
if (isset($structure['engine'])) {
$engine = ' ENGINE=' . $structure['engine'];
}
if (isset($structure["comment"])) {
$comment = " COMMENT='" . DBA::escape($structure["comment"]) . "'";
if (isset($structure['comment'])) {
$comment = " COMMENT='" . DBA::escape($structure['comment']) . "'";
}
$sql = implode(",\n\t", $sql_rows);
@ -414,71 +422,77 @@ class DBStructure
return $r;
}
private static function FieldCommand($parameters, $create = true)
/**
* Returns SQL statement for field
*
* @param array $parameters Parameters for SQL statement
* @param boolean $create Whether to include PRIMARY KEY statement (unused)
* @return string SQL statement part
*/
private static function FieldCommand(array $parameters, bool $create = true): string
{
$fieldstruct = $parameters["type"];
$fieldstruct = $parameters['type'];
if (isset($parameters["Collation"])) {
$fieldstruct .= " COLLATE " . $parameters["Collation"];
if (isset($parameters['Collation'])) {
$fieldstruct .= ' COLLATE ' . $parameters['Collation'];
}
if (isset($parameters["not null"])) {
$fieldstruct .= " NOT NULL";
if (isset($parameters['not null'])) {
$fieldstruct .= ' NOT NULL';
}
if (isset($parameters["default"])) {
if (strpos(strtolower($parameters["type"]), "int") !== false) {
$fieldstruct .= " DEFAULT " . $parameters["default"];
if (isset($parameters['default'])) {
if (strpos(strtolower($parameters['type']), 'int') !== false) {
$fieldstruct .= ' DEFAULT ' . $parameters['default'];
} else {
$fieldstruct .= " DEFAULT '" . $parameters["default"] . "'";
$fieldstruct .= " DEFAULT '" . $parameters['default'] . "'";
}
}
if (isset($parameters["extra"])) {
$fieldstruct .= " " . $parameters["extra"];
if (isset($parameters['extra'])) {
$fieldstruct .= ' ' . $parameters['extra'];
}
if (isset($parameters["comment"])) {
$fieldstruct .= " COMMENT '" . DBA::escape($parameters["comment"]) . "'";
if (isset($parameters['comment'])) {
$fieldstruct .= " COMMENT '" . DBA::escape($parameters['comment']) . "'";
}
/*if (($parameters["primary"] != "") && $create)
$fieldstruct .= " PRIMARY KEY";*/
/*if (($parameters['primary'] != '') && $create)
$fieldstruct .= ' PRIMARY KEY';*/
return ($fieldstruct);
return $fieldstruct;
}
private static function createIndex($indexname, $fieldnames, $method = "ADD")
private static function createIndex(string $indexName, array $fieldNames, string $method = 'ADD')
{
$method = strtoupper(trim($method));
if ($method != "" && $method != "ADD") {
throw new Exception("Invalid parameter 'method' in self::createIndex(): '$method'");
}
if (in_array($fieldnames[0], ["UNIQUE", "FULLTEXT"])) {
$index_type = array_shift($fieldnames);
if (in_array($fieldNames[0], ["UNIQUE", "FULLTEXT"])) {
$index_type = array_shift($fieldNames);
$method .= " " . $index_type;
}
$names = "";
foreach ($fieldnames as $fieldname) {
foreach ($fieldNames as $fieldName) {
if ($names != "") {
$names .= ",";
}
if (preg_match('|(.+)\((\d+)\)|', $fieldname, $matches)) {
if (preg_match('|(.+)\((\d+)\)|', $fieldName, $matches)) {
$names .= "`" . DBA::escape($matches[1]) . "`(" . intval($matches[2]) . ")";
} else {
$names .= "`" . DBA::escape($fieldname) . "`";
$names .= "`" . DBA::escape($fieldName) . "`";
}
}
if ($indexname == "PRIMARY") {
if ($indexName == "PRIMARY") {
return sprintf("%s PRIMARY KEY(%s)", $method, $names);
}
$sql = sprintf("%s INDEX `%s` (%s)", $method, DBA::escape($indexname), $names);
return ($sql);
return sprintf("%s INDEX `%s` (%s)", $method, DBA::escape($indexName), $names);
}
/**
@ -500,7 +514,7 @@ class DBStructure
* @return string Empty string if the update is successful, error messages otherwise
* @throws Exception
*/
public static function performUpdate(bool $enable_maintenance_mode = true, bool $verbose = false)
public static function performUpdate(bool $enable_maintenance_mode = true, bool $verbose = false): string
{
if ($enable_maintenance_mode) {
DI::config()->set('system', 'maintenance', 1);
@ -524,7 +538,7 @@ class DBStructure
* @return string Empty string if the update is successful, error messages otherwise
* @throws Exception
*/
public static function install(string $basePath)
public static function install(string $basePath): string
{
return self::update($basePath, false, true, true);
}
@ -541,7 +555,7 @@ class DBStructure
* @return string Empty string if the update is successful, error messages otherwise
* @throws Exception
*/
private static function update($basePath, $verbose, $action, $install = false, array $tables = null, array $definition = null)
private static function update(string $basePath, bool $verbose, bool $action, bool $install = false, array $tables = null, array $definition = null): string
{
$in_maintenance_mode = DI::config()->get('system', 'maintenance');
@ -606,15 +620,15 @@ class DBStructure
* or the definition differ from current status
* and index name doesn't start with "local_"
*/
foreach ($database[$name]["indexes"] as $indexname => $fieldnames) {
$current_index_definition = implode(",", $fieldnames);
if (isset($structure["indexes"][$indexname])) {
$new_index_definition = implode(",", $structure["indexes"][$indexname]);
foreach ($database[$name]["indexes"] as $indexName => $fieldNames) {
$current_index_definition = implode(",", $fieldNames);
if (isset($structure["indexes"][$indexName])) {
$new_index_definition = implode(",", $structure["indexes"][$indexName]);
} else {
$new_index_definition = "__NOT_SET__";
}
if ($current_index_definition != $new_index_definition && substr($indexname, 0, 6) != 'local_') {
$sql2 = self::dropIndex($indexname);
if ($current_index_definition != $new_index_definition && substr($indexName, 0, 6) != 'local_') {
$sql2 = self::dropIndex($indexName);
if ($sql3 == "") {
$sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2;
} else {
@ -623,9 +637,9 @@ class DBStructure
}
}
// Compare the field structure field by field
foreach ($structure["fields"] as $fieldname => $parameters) {
if (!isset($database[$name]["fields"][$fieldname])) {
$sql2 = self::addTableField($fieldname, $parameters);
foreach ($structure["fields"] as $fieldName => $parameters) {
if (!isset($database[$name]["fields"][$fieldName])) {
$sql2 = self::addTableField($fieldName, $parameters);
if ($sql3 == "") {
$sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2;
} else {
@ -633,7 +647,7 @@ class DBStructure
}
} else {
// Compare the field definition
$field_definition = $database[$name]["fields"][$fieldname];
$field_definition = $database[$name]["fields"][$fieldName];
// Remove the relation data that is used for the referential integrity
unset($parameters['relation']);
@ -653,7 +667,7 @@ class DBStructure
$current_field_definition = DBA::cleanQuery(implode(",", $field_definition));
$new_field_definition = DBA::cleanQuery(implode(",", $parameters));
if ($current_field_definition != $new_field_definition) {
$sql2 = self::modifyTableField($fieldname, $parameters);
$sql2 = self::modifyTableField($fieldName, $parameters);
if ($sql3 == "") {
$sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2;
} else {
@ -670,15 +684,15 @@ class DBStructure
* Don't create keys if table is new
*/
if (!$is_new_table) {
foreach ($structure["indexes"] as $indexname => $fieldnames) {
if (isset($database[$name]["indexes"][$indexname])) {
$current_index_definition = implode(",", $database[$name]["indexes"][$indexname]);
foreach ($structure["indexes"] as $indexName => $fieldNames) {
if (isset($database[$name]["indexes"][$indexName])) {
$current_index_definition = implode(",", $database[$name]["indexes"][$indexName]);
} else {
$current_index_definition = "__NOT_SET__";
}
$new_index_definition = implode(",", $fieldnames);
$new_index_definition = implode(",", $fieldNames);
if ($current_index_definition != $new_index_definition) {
$sql2 = self::createIndex($indexname, $fieldnames);
$sql2 = self::createIndex($indexName, $fieldNames);
if ($sql2 != "") {
if ($sql3 == "") {
@ -694,17 +708,17 @@ class DBStructure
// Foreign keys
// Compare the field structure field by field
foreach ($structure["fields"] as $fieldname => $parameters) {
foreach ($structure["fields"] as $fieldName => $parameters) {
if (empty($parameters['foreign'])) {
continue;
}
$constraint = self::getConstraintName($name, $fieldname, $parameters);
$constraint = self::getConstraintName($name, $fieldName, $parameters);
unset($existing_foreign_keys[$constraint]);
if (empty($database[$name]['foreign_keys'][$constraint])) {
$sql2 = self::addForeignKey($name, $fieldname, $parameters);
$sql2 = self::addForeignKey($name, $fieldName, $parameters);
if ($sql3 == "") {
$sql3 = "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2;
@ -767,9 +781,9 @@ class DBStructure
// Now have a look at the field collations
// Compare the field structure field by field
foreach ($structure["fields"] as $fieldname => $parameters) {
foreach ($structure["fields"] as $fieldName => $parameters) {
// Compare the field definition
$field_definition = ($database[$name]["fields"][$fieldname] ?? '') ?: ['Collation' => ''];
$field_definition = ($database[$name]["fields"][$fieldName] ?? '') ?: ['Collation' => ''];
// Define the default collation if not given
if (!isset($parameters['Collation']) && !empty($field_definition['Collation'])) {
@ -779,7 +793,7 @@ class DBStructure
}
if ($field_definition['Collation'] != $parameters['Collation']) {
$sql2 = self::modifyTableField($fieldname, $parameters);
$sql2 = self::modifyTableField($fieldName, $parameters);
if (($sql3 == "") || (substr($sql3, -2, 2) == "; ")) {
$sql3 .= "ALTER" . $ignore . " TABLE `" . $name . "` " . $sql2;
} else {
@ -826,7 +840,13 @@ class DBStructure
return $errors;
}
private static function tableStructure($table)
/**
* Returns an array with table structure information
*
* @param string $table Name of table
* @return array Table structure information
*/
private static function tableStructure(string $table): array
{
// This query doesn't seem to be executable as a prepared statement
$indexes = DBA::toArray(DBA::p("SHOW INDEX FROM " . DBA::quoteIdentifier($table)));
@ -909,41 +929,42 @@ class DBStructure
}
}
return ["fields" => $fielddata, "indexes" => $indexdata,
"foreign_keys" => $foreigndata, "table_status" => $table_status];
return [
'fields' => $fielddata,
'indexes' => $indexdata,
'foreign_keys' => $foreigndata,
'table_status' => $table_status
];
}
private static function dropIndex($indexname)
private static function dropIndex(string $indexName): string
{
$sql = sprintf("DROP INDEX `%s`", DBA::escape($indexname));
return ($sql);
return sprintf("DROP INDEX `%s`", DBA::escape($indexName));
}
private static function addTableField($fieldname, $parameters)
private static function addTableField(string $fieldName, array $parameters): string
{
$sql = sprintf("ADD `%s` %s", DBA::escape($fieldname), self::FieldCommand($parameters));
return ($sql);
return sprintf("ADD `%s` %s", DBA::escape($fieldName), self::FieldCommand($parameters));
}
private static function modifyTableField($fieldname, $parameters)
private static function modifyTableField(string $fieldName, array $parameters): string
{
$sql = sprintf("MODIFY `%s` %s", DBA::escape($fieldname), self::FieldCommand($parameters, false));
return ($sql);
return sprintf("MODIFY `%s` %s", DBA::escape($fieldName), self::FieldCommand($parameters, false));
}
private static function getConstraintName(string $tablename, string $fieldname, array $parameters)
private static function getConstraintName(string $tableName, string $fieldName, array $parameters): string
{
$foreign_table = array_keys($parameters['foreign'])[0];
$foreign_field = array_values($parameters['foreign'])[0];
return $tablename . "-" . $fieldname. "-" . $foreign_table. "-" . $foreign_field;
return $tableName . '-' . $fieldName. '-' . $foreign_table. '-' . $foreign_field;
}
private static function foreignCommand(string $tablename, string $fieldname, array $parameters) {
private static function foreignCommand(string $tableName, string $fieldName, array $parameters) {
$foreign_table = array_keys($parameters['foreign'])[0];
$foreign_field = array_values($parameters['foreign'])[0];
$sql = "FOREIGN KEY (`" . $fieldname . "`) REFERENCES `" . $foreign_table . "` (`" . $foreign_field . "`)";
$sql = "FOREIGN KEY (`" . $fieldName . "`) REFERENCES `" . $foreign_table . "` (`" . $foreign_field . "`)";
if (!empty($parameters['foreign']['on update'])) {
$sql .= " ON UPDATE " . strtoupper($parameters['foreign']['on update']);
@ -960,12 +981,12 @@ class DBStructure
return $sql;
}
private static function addForeignKey(string $tablename, string $fieldname, array $parameters)
private static function addForeignKey(string $tableName, string $fieldName, array $parameters): string
{
return sprintf("ADD %s", self::foreignCommand($tablename, $fieldname, $parameters));
return sprintf("ADD %s", self::foreignCommand($tableName, $fieldName, $parameters));
}
private static function dropForeignKey(string $constraint)
private static function dropForeignKey(string $constraint): string
{
return sprintf("DROP FOREIGN KEY `%s`", $constraint);
}
@ -983,7 +1004,7 @@ class DBStructure
* @return boolean Was the renaming successful?
* @throws Exception
*/
public static function rename($table, $columns, $type = self::RENAME_COLUMN)
public static function rename(string $table, array $columns, int $type = self::RENAME_COLUMN): bool
{
if (empty($table) || empty($columns)) {
return false;
@ -1019,7 +1040,7 @@ class DBStructure
return false;
}
$sql .= ";";
$sql .= ';';
$stmt = DBA::p($sql);
@ -1079,39 +1100,33 @@ class DBStructure
/**
* Check if a foreign key exists for the given table field
*
* @param string $table
* @param string $field
* @return boolean
* @param string $table Table name
* @param string $field Field name
* @return boolean Wether a foreign key exists
*/
public static function existsForeignKeyForField(string $table, string $field)
public static function existsForeignKeyForField(string $table, string $field): bool
{
return DBA::exists(['INFORMATION_SCHEMA' => 'KEY_COLUMN_USAGE'],
["`TABLE_SCHEMA` = ? AND `TABLE_NAME` = ? AND `COLUMN_NAME` = ? AND `REFERENCED_TABLE_SCHEMA` IS NOT NULL",
DBA::databaseName(), $table, $field]);
}
/**
* Check if a table exists
*
* @param string|array $table Table name
* Check if a table exists
*
* @param string $table Single table name (please loop yourself)
* @return boolean Does the table exist?
* @throws Exception
*/
public static function existsTable($table)
public static function existsTable(string $table): bool
{
if (empty($table)) {
return false;
}
if (is_array($table)) {
$condition = ['table_schema' => key($table), 'table_name' => current($table)];
} else {
$condition = ['table_schema' => DBA::databaseName(), 'table_name' => $table];
}
$condition = ['table_schema' => DBA::databaseName(), 'table_name' => $table];
$result = DBA::exists(['information_schema' => 'tables'], $condition);
return $result;
return DBA::exists(['information_schema' => 'tables'], $condition);
}
/**
@ -1122,7 +1137,7 @@ class DBStructure
* @return array An array of the table columns
* @throws Exception
*/
public static function getColumns($table)
public static function getColumns(string $table): array
{
$stmtColumns = DBA::p("SHOW COLUMNS FROM `" . $table . "`");
return DBA::toArray($stmtColumns);
@ -1130,6 +1145,9 @@ class DBStructure
/**
* Check if initial database values do exist - or create them
*
* @param bool $verbose Whether to output messages
* @return void
*/
public static function checkInitialValues(bool $verbose = false)
{
@ -1265,7 +1283,7 @@ class DBStructure
*
* @return boolean
*/
private static function isUpdating()
private static function isUpdating(): bool
{
$isUpdate = false;

View file

@ -541,7 +541,7 @@ class Database
if (!$retval = $this->connection->query($this->replaceParameters($sql, $args))) {
$errorInfo = $this->connection->errorInfo();
$this->error = $errorInfo[2];
$this->errorno = $errorInfo[1];
$this->errorno = (int) $errorInfo[1];
$retval = false;
$is_error = true;
break;
@ -554,7 +554,7 @@ class Database
if (!$stmt = $this->connection->prepare($sql)) {
$errorInfo = $this->connection->errorInfo();
$this->error = $errorInfo[2];
$this->errorno = $errorInfo[1];
$this->errorno = (int) $errorInfo[1];
$retval = false;
$is_error = true;
break;
@ -574,7 +574,7 @@ class Database
if (!$stmt->execute()) {
$errorInfo = $stmt->errorInfo();
$this->error = $errorInfo[2];
$this->errorno = $errorInfo[1];
$this->errorno = (int) $errorInfo[1];
$retval = false;
$is_error = true;
} else {
@ -709,7 +709,7 @@ class Database
}
$this->error = $error;
$this->errorno = $errorno;
$this->errorno = (int) $errorno;
}
$this->profiler->stopRecording();
@ -1541,7 +1541,7 @@ class Database
*
* @return array Data array
*/
public function toArray($stmt, $do_close = true, int $count = 0)
public function toArray($stmt, bool $do_close = true, int $count = 0): array
{
if (is_bool($stmt)) {
return [];
@ -1632,7 +1632,7 @@ class Database
*
* @return string Error number (0 if no error)
*/
public function errorNo()
public function errorNo(): int
{
return $this->errorno;
}
@ -1654,7 +1654,7 @@ class Database
*
* @return boolean was the close successful?
*/
public function close($stmt)
public function close($stmt): bool
{
$this->profiler->startRecording('database');
@ -1696,7 +1696,7 @@ class Database
* 'amount' => Number of concurrent database processes
* @throws \Exception
*/
public function processlist()
public function processlist(): array
{
$ret = $this->p("SHOW PROCESSLIST");
$data = $this->toArray($ret);

View file

@ -133,7 +133,7 @@ class PostUpdate
}
$max_item_delivery_data = DBA::selectFirst('item-delivery-data', ['iid'], ['queue_count > 0 OR queue_done > 0'], ['order' => ['iid']]);
$max_iid = $max_item_delivery_data['iid'];
$max_iid = $max_item_delivery_data['iid'] ?? 0;
Logger::info('Start update1297 with max iid: ' . $max_iid);

View file

@ -57,7 +57,7 @@ class Account extends BaseFactory
* @throws HTTPException\InternalServerErrorException
* @throws ImagickException|HTTPException\NotFoundException
*/
public function createFromContactId(int $contactId, $uid = 0): \Friendica\Object\Api\Mastodon\Account
public function createFromContactId(int $contactId, int $uid = 0): \Friendica\Object\Api\Mastodon\Account
{
$contact = Contact::getById($contactId, ['uri-id']);
if (empty($contact)) {
@ -74,7 +74,7 @@ class Account extends BaseFactory
* @throws HTTPException\InternalServerErrorException
* @throws ImagickException|HTTPException\NotFoundException
*/
public function createFromUriId(int $contactUriId, $uid = 0): \Friendica\Object\Api\Mastodon\Account
public function createFromUriId(int $contactUriId, int $uid = 0): \Friendica\Object\Api\Mastodon\Account
{
$account = DBA::selectFirst('account-user-view', [], ['uri-id' => $contactUriId, 'uid' => [0, $uid]], ['order' => ['id' => true]]);
if (empty($account)) {

View file

@ -70,6 +70,7 @@ class Status extends BaseFactory
/**
* @param int $uriId Uri-ID of the item
* @param int $uid Item user
* @param bool $include_entities Whether to include entities
*
* @return \Friendica\Object\Api\Twitter\Status
* @throws HTTPException\InternalServerErrorException
@ -90,12 +91,13 @@ class Status extends BaseFactory
/**
* @param int $uriId Uri-ID of the item
* @param int $uid Item user
* @param bool $include_entities Whether to include entities
*
* @return \Friendica\Object\Api\Twitter\Status
* @throws HTTPException\InternalServerErrorException
* @throws ImagickException|HTTPException\NotFoundException
*/
public function createFromUriId(int $uriId, $uid = 0, $include_entities = false): \Friendica\Object\Api\Twitter\Status
public function createFromUriId(int $uriId, int $uid = 0, bool $include_entities = false): \Friendica\Object\Api\Twitter\Status
{
$fields = ['parent-uri-id', 'uri-id', 'uid', 'author-id', 'author-link', 'author-network', 'owner-id', 'causer-id',
'starred', 'app', 'title', 'body', 'raw-body', 'created', 'network','post-reason', 'language', 'gravity',
@ -110,6 +112,7 @@ class Status extends BaseFactory
/**
* @param array $item item array
* @param int $uid Item user
* @param bool $include_entities Whether to include entities
*
* @return \Friendica\Object\Api\Twitter\Status
* @throws HTTPException\InternalServerErrorException

View file

@ -51,7 +51,7 @@ class User extends BaseFactory
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public function createFromContactId(int $contactId, $uid = 0, $skip_status = true, $include_user_entities = true)
public function createFromContactId(int $contactId, int $uid = 0, bool $skip_status = true, bool $include_user_entities = true)
{
$cdata = Contact::getPublicAndUserContactID($contactId, $uid);
if (!empty($cdata)) {
@ -78,7 +78,7 @@ class User extends BaseFactory
return new \Friendica\Object\Api\Twitter\User($publicContact, $apcontact, $userContact, $status, $include_user_entities);
}
public function createFromUserId(int $uid, $skip_status = true, $include_user_entities = true)
public function createFromUserId(int $uid, bool $skip_status = true, bool $include_user_entities = true)
{
return $this->createFromContactId(Contact::getPublicIdByUserId($uid), $uid, $skip_status, $include_user_entities);
}

View file

@ -57,7 +57,7 @@ class LegacyModule extends BaseModule
* @param string $file_path
* @throws \Exception
*/
private function setModuleFile($file_path)
private function setModuleFile(string $file_path)
{
if (!is_readable($file_path)) {
throw new \Exception(DI::l10n()->t('Legacy module file not found: %s', $file_path));
@ -87,7 +87,7 @@ class LegacyModule extends BaseModule
* @return string
* @throws \Exception
*/
private function runModuleFunction(string $function_suffix)
private function runModuleFunction(string $function_suffix): string
{
$function_name = $this->moduleName . '_' . $function_suffix;

View file

@ -48,7 +48,7 @@ class APContact
* @param string $addr Address
* @return array webfinger data
*/
private static function fetchWebfingerData(string $addr)
private static function fetchWebfingerData(string $addr): array
{
$addr_parts = explode('@', $addr);
if (count($addr_parts) != 2) {
@ -117,14 +117,14 @@ class APContact
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getByURL($url, $update = null)
public static function getByURL(string $url, $update = null): array
{
if (empty($url) || Network::isUrlBlocked($url)) {
Logger::info('Domain is blocked', ['url' => $url]);
return [];
}
$fetched_contact = false;
$fetched_contact = [];
if (empty($update)) {
if (is_null($update)) {
@ -220,14 +220,14 @@ class APContact
$apcontact['type'] = str_replace('as:', '', JsonLD::fetchElement($compacted, '@type'));
$apcontact['following'] = JsonLD::fetchElement($compacted, 'as:following', '@id');
$apcontact['followers'] = JsonLD::fetchElement($compacted, 'as:followers', '@id');
$apcontact['inbox'] = JsonLD::fetchElement($compacted, 'ldp:inbox', '@id');
$apcontact['inbox'] = (JsonLD::fetchElement($compacted, 'ldp:inbox', '@id') ?? '');
self::unarchiveInbox($apcontact['inbox'], false);
$apcontact['outbox'] = JsonLD::fetchElement($compacted, 'as:outbox', '@id');
$apcontact['sharedinbox'] = '';
if (!empty($compacted['as:endpoints'])) {
$apcontact['sharedinbox'] = JsonLD::fetchElement($compacted['as:endpoints'], 'as:sharedInbox', '@id');
$apcontact['sharedinbox'] = (JsonLD::fetchElement($compacted['as:endpoints'], 'as:sharedInbox', '@id') ?? '');
self::unarchiveInbox($apcontact['sharedinbox'], true);
}
@ -241,9 +241,10 @@ class APContact
$apcontact['name'] = $apcontact['nick'];
}
$apcontact['about'] = HTML::toBBCode(JsonLD::fetchElement($compacted, 'as:summary', '@value'));
$apcontact['about'] = HTML::toBBCode(JsonLD::fetchElement($compacted, 'as:summary', '@value') ?? '');
$ims = JsonLD::fetchElementArray($compacted, 'vcard:hasInstantMessage');
if (!empty($ims)) {
foreach ($ims as $link) {
if (substr($link, 0, 5) == 'xmpp:') {
@ -525,8 +526,9 @@ class APContact
*
* @param string $url inbox url
* @param boolean $shared Shared Inbox
* @return void
*/
private static function unarchiveInbox($url, $shared)
private static function unarchiveInbox(string $url, bool $shared)
{
if (empty($url)) {
return;

View file

@ -44,7 +44,7 @@ class Attach
* @return array field list
* @throws \Exception
*/
private static function getFields()
private static function getFields(): array
{
$allfields = DBStructure::definition(DI::app()->getBasePath(), false);
$fields = array_keys($allfields['attach']['fields']);
@ -59,7 +59,7 @@ class Attach
* @param array $conditions Array of fields for conditions
* @param array $params Array of several parameters
*
* @return array
* @return array|bool
*
* @throws \Exception
* @see \Friendica\Database\DBA::selectToArray
@ -102,7 +102,7 @@ class Attach
* @return boolean
* @throws \Exception
*/
public static function exists(array $conditions)
public static function exists(array $conditions): bool
{
return DBA::exists('attach', $conditions);
}
@ -117,7 +117,7 @@ class Attach
* @throws \Exception
* @see \Friendica\Database\DBA::select
*/
public static function getById($id)
public static function getById(int $id)
{
return self::selectFirst([], ['id' => $id]);
}
@ -132,7 +132,7 @@ class Attach
* @throws \Exception
* @see \Friendica\Database\DBA::select
*/
public static function getByIdWithPermission($id)
public static function getByIdWithPermission(int $id)
{
$r = self::selectFirst(['uid'], ['id' => $id]);
if ($r === false) {
@ -156,10 +156,10 @@ class Attach
*
* @param array $item Attachment data. Needs at least 'id', 'backend-class', 'backend-ref'
*
* @return string file data
* @return string|null file data or null on failure
* @throws \Exception
*/
public static function getData($item)
public static function getData(array $item)
{
if (!empty($item['data'])) {
return $item['data'];
@ -195,10 +195,10 @@ class Attach
* @param string $deny_cid Permissions, denied contacts.optional, default = ''
* @param string $deny_gid Permissions, denied greoup.optional, default = ''
*
* @return boolean/integer Row id on success, False on errors
* @return boolean|integer Row id on success, False on errors
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function store($data, $uid, $filename, $filetype = '' , $filesize = null, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '')
public static function store(string $data, int $uid, string $filename, string $filetype = '' , int $filesize = null, string $allow_cid = '', string $allow_gid = '', string $deny_cid = '', string $deny_gid = '')
{
if ($filetype === '') {
$filetype = Mimetype::getContentType($filename);
@ -241,17 +241,17 @@ class Attach
/**
* Store new file metadata in db and binary in default backend from existing file
*
* @param $src
* @param $uid
* @param string $filename
* @param string $src Source file name
* @param int $uid User id
* @param string $filename Optional file name
* @param string $allow_cid
* @param string $allow_gid
* @param string $deny_cid
* @param string $deny_gid
* @return boolean True on success
* @return boolean|int Insert id or false on failure
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function storeFile($src, $uid, $filename = '', $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '')
public static function storeFile(string $src, int $uid, string $filename = '', string $allow_cid = '', string $allow_gid = '', string $deny_cid = '', string $deny_gid = '')
{
if ($filename === '') {
$filename = basename($src);
@ -276,7 +276,7 @@ class Attach
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @see \Friendica\Database\DBA::update
*/
public static function update($fields, $conditions, Image $img = null, array $old_fields = [])
public static function update(array $fields, array $conditions, Image $img = null, array $old_fields = []): bool
{
if (!is_null($img)) {
// get items to update
@ -311,7 +311,7 @@ class Attach
* @throws \Exception
* @see \Friendica\Database\DBA::delete
*/
public static function delete(array $conditions, array $options = [])
public static function delete(array $conditions, array $options = []): bool
{
// get items to delete data info
$items = self::selectToArray(['backend-class','backend-ref'], $conditions);

View file

@ -119,7 +119,7 @@ class Contact
* @return array
* @throws \Exception
*/
public static function selectToArray(array $fields = [], array $condition = [], array $params = [])
public static function selectToArray(array $fields = [], array $condition = [], array $params = []): array
{
return DBA::selectToArray('contact', $fields, $condition, $params);
}
@ -128,7 +128,7 @@ class Contact
* @param array $fields Array of selected fields, empty for all
* @param array $condition Array of fields for condition
* @param array $params Array of several parameters
* @return array
* @return array|bool
* @throws \Exception
*/
public static function selectFirst(array $fields = [], array $condition = [], array $params = [])
@ -148,7 +148,7 @@ class Contact
* @return int id of the created contact
* @throws \Exception
*/
public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT)
public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT): int
{
if (!empty($fields['baseurl']) && empty($fields['gsid'])) {
$fields['gsid'] = GServer::getID($fields['baseurl'], true);
@ -187,6 +187,7 @@ class Contact
*
* @return boolean was the update successfull?
* @throws \Exception
* @todo Let's get rid of boolean type of $old_fields
*/
public static function update(array $fields, array $condition, $old_fields = [])
{
@ -204,7 +205,7 @@ class Contact
* @return array|boolean Contact record if it exists, false otherwise
* @throws \Exception
*/
public static function getById($id, $fields = [])
public static function getById(int $id, array $fields = [])
{
return DBA::selectFirst('contact', $fields, ['id' => $id]);
}
@ -217,7 +218,7 @@ class Contact
* @return array|boolean Contact record if it exists, false otherwise
* @throws \Exception
*/
public static function getByUriId($uri_id, $fields = [])
public static function getByUriId(int $uri_id, array $fields = [])
{
return DBA::selectFirst('contact', $fields, ['uri-id' => $uri_id], ['order' => ['uid']]);
}
@ -231,7 +232,7 @@ class Contact
* @param integer $uid User ID of the contact
* @return array contact array
*/
public static function getByURL(string $url, $update = null, array $fields = [], int $uid = 0)
public static function getByURL(string $url, $update = null, array $fields = [], int $uid = 0): array
{
if ($update || is_null($update)) {
$cid = self::getIdForURL($url, $uid, $update);
@ -302,7 +303,7 @@ class Contact
* @param array $fields Field list
* @return array contact array
*/
public static function getByURLForUser(string $url, int $uid = 0, $update = false, array $fields = [])
public static function getByURLForUser(string $url, int $uid = 0, $update = false, array $fields = []): array
{
if ($uid != 0) {
$contact = self::getByURL($url, $update, $fields, $uid);
@ -333,7 +334,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isFollower($cid, $uid)
public static function isFollower(int $cid, int $uid): bool
{
if (Contact\User::isBlocked($cid, $uid)) {
return false;
@ -358,7 +359,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isFollowerByURL($url, $uid)
public static function isFollowerByURL(string $url, uid $uid): bool
{
$cid = self::getIdForURL($url, $uid);
@ -370,16 +371,16 @@ class Contact
}
/**
* Tests if the given user follow the given contact
* Tests if the given user shares with the given contact
*
* @param int $cid Either public contact id or user's contact id
* @param int $uid User ID
*
* @return boolean is the contact url being followed?
* @return boolean is the contact sharing with given user?
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isSharing($cid, $uid)
public static function isSharing(int $cid, int $uid): bool
{
if (Contact\User::isBlocked($cid, $uid)) {
return false;
@ -404,7 +405,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isSharingByURL($url, $uid)
public static function isSharingByURL(string $url, int $uid): bool
{
$cid = self::getIdForURL($url, $uid);
@ -425,7 +426,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getBasepath($url, $dont_update = false)
public static function getBasepath(string $url, bool $dont_update = false): string
{
$contact = DBA::selectFirst('contact', ['id', 'baseurl'], ['uid' => 0, 'nurl' => Strings::normaliseLink($url)]);
if (!DBA::isResult($contact)) {
@ -459,7 +460,7 @@ class Contact
*
* @return boolean Is it the same server?
*/
public static function isLocal($url)
public static function isLocal(string $url): bool
{
if (!parse_url($url, PHP_URL_SCHEME)) {
$addr_parts = explode('@', $url);
@ -476,7 +477,7 @@ class Contact
*
* @return boolean Is it the same server?
*/
public static function isLocalById(int $cid)
public static function isLocalById(int $cid): bool
{
$contact = DBA::selectFirst('contact', ['url', 'baseurl'], ['id' => $cid]);
if (!DBA::isResult($contact)) {
@ -500,7 +501,7 @@ class Contact
* @return integer|boolean Public contact id for given user id
* @throws \Exception
*/
public static function getPublicIdByUserId($uid)
public static function getPublicIdByUserId(int $uid)
{
$self = DBA::selectFirst('contact', ['url'], ['self' => true, 'uid' => $uid]);
if (!DBA::isResult($self)) {
@ -519,7 +520,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getPublicAndUserContactID($cid, $uid)
public static function getPublicAndUserContactID(int $cid, int $uid): array
{
// We have to use the legacy function as long as the post update hasn't finished
if (DI::config()->get('system', 'post_update_version') < 1427) {
@ -560,7 +561,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function legacyGetPublicAndUserContactID($cid, $uid)
private static function legacyGetPublicAndUserContactID(int $cid, int $uid): array
{
if (empty($uid) || empty($cid)) {
return [];
@ -1526,7 +1527,7 @@ class Contact
* @param int $type type of contact or account
* @return string
*/
public static function getAccountType(int $type)
public static function getAccountType(int $type): string
{
switch ($type) {
case self::TYPE_ORGANISATION:
@ -1552,11 +1553,11 @@ class Contact
/**
* Blocks a contact
*
* @param int $cid
* @return bool
* @throws \Exception
* @param int $cid Contact id to block
* @param string $reason Block reason
* @return bool Whether it was successful
*/
public static function block($cid, $reason = null)
public static function block(int $cid, string $reason = null): bool
{
$return = self::update(['blocked' => true, 'block_reason' => $reason], ['id' => $cid]);
@ -1566,11 +1567,10 @@ class Contact
/**
* Unblocks a contact
*
* @param int $cid
* @return bool
* @throws \Exception
* @param int $cid Contact id to unblock
* @return bool Whether it was successfull
*/
public static function unblock($cid)
public static function unblock(int $cid): bool
{
$return = self::update(['blocked' => false, 'block_reason' => null], ['id' => $cid]);
@ -1580,7 +1580,7 @@ class Contact
/**
* Ensure that cached avatar exist
*
* @param integer $cid
* @param integer $cid Contact id
*/
public static function checkAvatarCache(int $cid)
{
@ -1620,7 +1620,7 @@ class Contact
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
private static function getAvatarPath(array $contact, string $size, $no_update = false)
private static function getAvatarPath(array $contact, string $size, bool $no_update = false): string
{
$contact = self::checkAvatarCacheByArray($contact, $no_update);
@ -1654,7 +1654,7 @@ class Contact
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
public static function getPhoto(array $contact, bool $no_update = false)
public static function getPhoto(array $contact, bool $no_update = false): string
{
return self::getAvatarPath($contact, Proxy::SIZE_SMALL, $no_update);
}
@ -1666,7 +1666,7 @@ class Contact
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
public static function getThumb(array $contact, bool $no_update = false)
public static function getThumb(array $contact, bool $no_update = false): string
{
return self::getAvatarPath($contact, Proxy::SIZE_THUMB, $no_update);
}
@ -1678,7 +1678,7 @@ class Contact
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return string photo path
*/
public static function getMicro(array $contact, bool $no_update = false)
public static function getMicro(array $contact, bool $no_update = false): string
{
return self::getAvatarPath($contact, Proxy::SIZE_MICRO, $no_update);
}
@ -1690,7 +1690,7 @@ class Contact
* @param bool $no_update Don't perfom an update if no cached avatar was found
* @return array contact array with avatar cache fields
*/
private static function checkAvatarCacheByArray(array $contact, bool $no_update = false)
private static function checkAvatarCacheByArray(array $contact, bool $no_update = false): array
{
$update = false;
$contact_fields = [];
@ -1796,7 +1796,7 @@ class Contact
* @param string $size Size of the avatar picture
* @return string avatar URL
*/
public static function getDefaultAvatar(array $contact, string $size)
public static function getDefaultAvatar(array $contact, string $size): string
{
switch ($size) {
case Proxy::SIZE_MICRO:
@ -1817,6 +1817,114 @@ class Contact
}
if (!DI::config()->get('system', 'remote_avatar_lookup')) {
$platform = '';
$type = Contact::TYPE_PERSON;
if (!empty($contact['id'])) {
$account = DBA::selectFirst('account-user-view', ['platform', 'contact-type'], ['id' => $contact['id']]);
$platform = $account['platform'] ?? '';
$type = $account['contact-type'] ?? Contact::TYPE_PERSON;
}
if (empty($platform) && !empty($contact['uri-id'])) {
$account = DBA::selectFirst('account-user-view', ['platform', 'contact-type'], ['uri-id' => $contact['uri-id']]);
$platform = $account['platform'] ?? '';
$type = $account['contact-type'] ?? Contact::TYPE_PERSON;
}
switch ($platform) {
case 'corgidon':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/msdos621/corgidon/blob/main/public/avatars/original/missing.png
*/
$default = '/images/default/corgidon.png';
break;
case 'diaspora':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/diaspora/diaspora/
*/
$default = '/images/default/diaspora.png';
break;
case 'gotosocial':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/superseriousbusiness/gotosocial/blob/main/web/assets/default_avatars/GoToSocial_icon1.svg
*/
$default = '/images/default/gotosocial.svg';
break;
case 'hometown':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/hometown-fork/hometown/blob/hometown-dev/public/avatars/original/missing.png
*/
$default = '/images/default/hometown.png';
break;
case 'koyuspace':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/koyuspace/mastodon/blob/main/public/avatars/original/missing.png
*/
$default = '/images/default/koyuspace.png';
break;
case 'ecko':
case 'qoto':
case 'mastodon':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/mastodon/mastodon/tree/main/public/avatars/original/missing.png
*/
$default = '/images/default/mastodon.png';
break;
case 'peertube':
if ($type == Contact::TYPE_COMMUNITY) {
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/Chocobozzz/PeerTube/blob/develop/client/src/assets/images/default-avatar-video-channel.png
*/
$default = '/images/default/peertube-channel.png';
} else {
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/Chocobozzz/PeerTube/blob/develop/client/src/assets/images/default-avatar-account.png
*/
$default = '/images/default/peertube-account.png';
}
break;
case 'pleroma':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://git.pleroma.social/pleroma/pleroma/-/blob/develop/priv/static/images/avi.png
*/
$default = '/images/default/pleroma.png';
break;
case 'plume':
/**
* Picture credits
* @license GNU Affero General Public License v3.0
* @link https://github.com/Plume-org/Plume/blob/main/assets/images/default-avatar.png
*/
$default = '/images/default/plume.png';
break;
}
return DI::baseUrl() . $default;
}
@ -2506,7 +2614,7 @@ class Contact
* @throws HTTPException\NotFoundException
* @throws \ImagickException
*/
public static function createFromProbeForUser(int $uid, $url, $network = '')
public static function createFromProbeForUser(int $uid, string $url, string $network = ''): array
{
$result = ['cid' => -1, 'success' => false, 'message' => ''];
@ -2695,7 +2803,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function addRelationship(array $importer, array $contact, array $datarray, $sharing = false, $note = '')
public static function addRelationship(array $importer, array $contact, array $datarray, bool $sharing = false, string $note = '')
{
// Should always be set
if (empty($datarray['author-id'])) {
@ -2922,7 +3030,7 @@ class Contact
* @return array
* @throws \Exception
*/
public static function pruneUnavailable(array $contact_ids)
public static function pruneUnavailable(array $contact_ids): array
{
if (empty($contact_ids)) {
return [];
@ -2950,7 +3058,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function magicLink($contact_url, $url = '')
public static function magicLink(string $contact_url, string $url = ''): string
{
if (!Session::isAuthenticated()) {
return $url ?: $contact_url; // Equivalent to: ($url != '') ? $url : $contact_url;
@ -2977,7 +3085,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function magicLinkById($cid, $url = '')
public static function magicLinkById(int $cid, string $url = ''): string
{
$contact = DBA::selectFirst('contact', ['id', 'network', 'url', 'uid'], ['id' => $cid]);
@ -2994,7 +3102,7 @@ class Contact
* @throws HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function magicLinkByContact($contact, $url = '')
public static function magicLinkByContact(array $contact, string $url = ''): string
{
$destination = $url ?: $contact['url']; // Equivalent to ($url != '') ? $url : $contact['url'];
@ -3035,7 +3143,7 @@ class Contact
*
* @return boolean "true" if it is a forum
*/
public static function isForum($contactid)
public static function isForum(int $contactid): bool
{
$fields = ['contact-type'];
$condition = ['id' => $contactid];
@ -3054,7 +3162,7 @@ class Contact
* @param array $contact
* @return bool
*/
public static function canReceivePrivateMessages(array $contact)
public static function canReceivePrivateMessages(array $contact): bool
{
$protocol = $contact['network'] ?? $contact['protocol'] ?? Protocol::PHANTOM;
$self = $contact['self'] ?? false;
@ -3072,7 +3180,7 @@ class Contact
* @return array with search results
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function searchByName(string $search, string $mode = '', int $uid = 0)
public static function searchByName(string $search, string $mode = '', int $uid = 0): array
{
if (empty($search)) {
return [];
@ -3115,7 +3223,7 @@ class Contact
* @param array $urls
* @return array result "count", "added" and "updated"
*/
public static function addByUrls(array $urls)
public static function addByUrls(array $urls): array
{
$added = 0;
$updated = 0;
@ -3148,7 +3256,7 @@ class Contact
* @return array The profile array
* @throws Exception
*/
public static function getRandomContact()
public static function getRandomContact(): array
{
$contact = DBA::selectFirst('contact', ['id', 'network', 'url', 'uid'], [
"`uid` = ? AND `network` = ? AND NOT `failed` AND `last-item` > ?",

View file

@ -62,7 +62,7 @@ class Conversation
*/
const RELAY = 3;
public static function getByItemUri($item_uri)
public static function getByItemUri(string $item_uri)
{
return DBA::selectFirst('conversation', [], ['item-uri' => $item_uri]);
}
@ -74,7 +74,7 @@ class Conversation
* @return array Item array with removed conversation data
* @throws \Exception
*/
public static function insert(array $arr)
public static function insert(array $arr): array
{
if (in_array(($arr['network'] ?? '') ?: Protocol::PHANTOM,
[Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS, Protocol::TWITTER]) && !empty($arr['uri'])) {

View file

@ -41,7 +41,7 @@ use Friendica\Util\XML;
class Event
{
public static function getHTML(array $event, $simple = false, $uriid = 0)
public static function getHTML(array $event, bool $simple = false, int $uriid = 0): string
{
if (empty($event)) {
return '';
@ -127,7 +127,7 @@ class Event
* @param array $event Array which contains the event data.
* @return string The event as a bbcode formatted string.
*/
private static function getBBCode(array $event)
private static function getBBCode(array $event): string
{
$o = '';
@ -157,11 +157,10 @@ class Event
/**
* Extract bbcode formatted event data from a string.
*
* @params: string $s The string which should be parsed for event data.
* @param $text
* @param string $text The string which should be parsed for event data.
* @return array The array with the event information.
*/
public static function fromBBCode($text)
public static function fromBBCode(string $text): array
{
$ev = [];
@ -195,13 +194,13 @@ class Event
return $ev;
}
public static function sortByDate($event_list)
public static function sortByDate(array $event_list): array
{
usort($event_list, ['self', 'compareDatesCallback']);
return $event_list;
}
private static function compareDatesCallback($event_a, $event_b)
private static function compareDatesCallback(array $event_a, array $event_b)
{
$date_a = DateTimeFormat::local($event_a['start']);
$date_b = DateTimeFormat::local($event_b['start']);
@ -223,7 +222,7 @@ class Event
* @return void
* @throws \Exception
*/
public static function delete($event_id)
public static function delete(int $event_id)
{
if ($event_id == 0) {
return;
@ -242,7 +241,7 @@ class Event
* @return int The new event id.
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function store($arr)
public static function store(array $arr): int
{
$event = [];
$event['id'] = intval($arr['id'] ?? 0);
@ -317,7 +316,7 @@ class Event
return $event['id'];
}
public static function getItemArrayForId(int $event_id, array $item = []):array
public static function getItemArrayForId(int $event_id, array $item = []): array
{
if (empty($event_id)) {
return $item;
@ -374,7 +373,7 @@ class Event
return $item;
}
public static function getItemArrayForImportedId(int $event_id, array $item = []):array
public static function getItemArrayForImportedId(int $event_id, array $item = []): array
{
if (empty($event_id)) {
return $item;
@ -404,7 +403,7 @@ class Event
* @return array Array with translations strings.
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function getStrings()
public static function getStrings(): array
{
// First day of the week (0 = Sunday).
$firstDay = DI::pConfig()->get(local_user(), 'system', 'first_day_of_week', 0);
@ -477,7 +476,7 @@ class Event
*
* @todo We should replace this with a separate update function if there is some time left.
*/
private static function removeDuplicates(array $dates)
private static function removeDuplicates(array $dates): array
{
$dates2 = [];
@ -500,7 +499,7 @@ class Event
* @return array Query result
* @throws \Exception
*/
public static function getListById($owner_uid, $event_id, $sql_extra = '')
public static function getListById(int $owner_uid, int $event_id, string $sql_extra = ''): array
{
$return = [];
@ -536,7 +535,7 @@ class Event
* @return array Query results.
* @throws \Exception
*/
public static function getListByDate($owner_uid, $event_params, $sql_extra = '')
public static function getListByDate(int $owner_uid, array $event_params, string $sql_extra = ''): array
{
$return = [];
@ -570,7 +569,7 @@ class Event
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function prepareListForTemplate(array $event_result)
public static function prepareListForTemplate(array $event_result): array
{
$event_list = [];
@ -651,12 +650,12 @@ class Event
* @param array $events Query result for events.
* @param string $format The output format (ical/csv).
*
* @param $timezone
* @param string $timezone Timezone (missing parameter!)
* @return string Content according to selected export format.
*
* @todo Implement timezone support
*/
private static function formatListForExport(array $events, $format)
private static function formatListForExport(array $events, string $format): string
{
$o = '';
@ -757,7 +756,7 @@ class Event
* @return array Query results.
* @throws \Exception
*/
private static function getListByUserId($uid = 0)
private static function getListByUserId(int $uid = 0): array
{
$return = [];
@ -797,7 +796,7 @@ class Event
* @throws \Exception
* @todo Respect authenticated users with events_by_uid().
*/
public static function exportListByUserId($uid, $format = 'ical')
public static function exportListByUserId(int $uid, string $format = 'ical'): array
{
$process = false;
@ -845,7 +844,8 @@ class Event
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getItemHTML(array $item) {
public static function getItemHTML(array $item): string
{
$same_date = false;
$finish = false;
@ -933,10 +933,11 @@ class Event
* @return array The array with the location data.
* 'name' => The name of the location,<br>
* 'address' => The address of the location,<br>
* 'coordinates' => Latitude and longitude (e.g. '48.864716,2.349014').<br>
* 'coordinates' => Latitude and longitude (e.g. '48.864716,2.349014').<br>
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function locationToArray($s = '') {
private static function locationToArray(string $s = ''): array
{
if ($s == '') {
return [];
}
@ -981,7 +982,7 @@ class Event
* @return bool
* @throws \Exception
*/
public static function createBirthday($contact, $birthday)
public static function createBirthday(array $contact, string $birthday): bool
{
// Check for duplicates
$condition = [
@ -1011,8 +1012,7 @@ class Event
'type' => 'birthday',
];
self::store($values);
return true;
// Check if self::store() was success
return (self::store($values) > 0);
}
}

View file

@ -40,7 +40,7 @@ class FContact
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function getByURL($handle, $update = null)
public static function getByURL(string $handle, $update = null): array
{
$person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]);
if (!DBA::isResult($person)) {
@ -90,7 +90,7 @@ class FContact
* @param array $arr The fcontact data
* @throws \Exception
*/
public static function updateFromProbeArray($arr)
public static function updateFromProbeArray(array $arr)
{
$uriid = ItemURI::insert(['uri' => $arr['url'], 'guid' => $arr['guid']]);
@ -122,12 +122,12 @@ class FContact
* get a url (scheme://domain.tld/u/user) from a given Diaspora*
* fcontact guid
*
* @param mixed $fcontact_guid Hexadecimal string guid
* @param string $fcontact_guid Hexadecimal string guid
*
* @return string the contact url or null
* @return string|null the contact url or null
* @throws \Exception
*/
public static function getUrlByGuid($fcontact_guid)
public static function getUrlByGuid(string $fcontact_guid)
{
Logger::info('fcontact', ['guid' => $fcontact_guid]);

View file

@ -35,10 +35,9 @@ class FileTag
* URL encode <, >, left and right brackets
*
* @param string $s String to be URL encoded.
*
* @return string The URL encoded string.
*/
private static function encode($s)
private static function encode(string $s): string
{
return str_replace(['<', '>', '[', ']'], ['%3c', '%3e', '%5b', '%5d'], $s);
}
@ -47,10 +46,9 @@ class FileTag
* URL decode <, >, left and right brackets
*
* @param string $s The URL encoded string to be decoded
*
* @return string The decoded string.
*/
private static function decode($s)
private static function decode(string $s): string
{
return str_replace(['%3c', '%3e', '%5b', '%5d'], ['<', '>', '[', ']'], $s);
}
@ -62,10 +60,9 @@ class FileTag
*
* @param array $array A list of tags.
* @param string $type Optional file type.
*
* @return string A list of file tags.
*/
public static function arrayToFile(array $array, string $type = 'file')
public static function arrayToFile(array $array, string $type = 'file'): string
{
$tag_list = '';
if ($type == 'file') {
@ -92,10 +89,9 @@ class FileTag
*
* @param string $file File tags
* @param string $type Optional file type.
*
* @return array List of tag names.
*/
public static function fileToArray(string $file, string $type = 'file')
public static function fileToArray(string $file, string $type = 'file'): array
{
$matches = [];
$return = [];

View file

@ -96,7 +96,7 @@ class GServer
*
* @param string $url
* @param boolean $no_check Don't check if the server hadn't been found
* @return int gserver id
* @return int|null gserver id or NULL on empty URL or failed check
*/
public static function getID(string $url, bool $no_check = false)
{
@ -156,7 +156,7 @@ class GServer
*
* @return boolean 'true' if server seems vital
*/
public static function reachable(string $profile, string $server = '', string $network = '', bool $force = false)
public static function reachable(string $profile, string $server = '', string $network = '', bool $force = false): bool
{
if ($server == '') {
$contact = Contact::getByURL($profile, null, ['baseurl']);
@ -172,7 +172,7 @@ class GServer
return self::check($server, $network, $force);
}
public static function getNextUpdateDate(bool $success, string $created = '', string $last_contact = '')
public static function getNextUpdateDate(bool $success, string $created = '', string $last_contact = ''): string
{
// On successful contact process check again next week
if ($success) {
@ -231,7 +231,7 @@ class GServer
*
* @return boolean 'true' if server seems vital
*/
public static function check(string $server_url, string $network = '', bool $force = false, bool $only_nodeinfo = false)
public static function check(string $server_url, string $network = '', bool $force = false, bool $only_nodeinfo = false): bool
{
$server_url = self::cleanURL($server_url);
if ($server_url == '') {
@ -286,7 +286,7 @@ class GServer
* @param string $url
* @return string cleaned URL
*/
public static function cleanURL(string $url)
public static function cleanURL(string $url): string
{
$url = trim($url, '/');
$url = str_replace('/index.php', '', $url);
@ -305,7 +305,7 @@ class GServer
* @param string $url
* @return string base URL
*/
private static function getBaseURL(string $url)
private static function getBaseURL(string $url): string
{
$urlparts = parse_url(self::cleanURL($url));
unset($urlparts['path']);
@ -322,7 +322,7 @@ class GServer
*
* @return boolean 'true' if server could be detected
*/
public static function detect(string $url, string $network = '', bool $only_nodeinfo = false)
public static function detect(string $url, string $network = '', bool $only_nodeinfo = false): bool
{
Logger::info('Detect server type', ['server' => $url]);
$serverdata = ['detection-method' => self::DETECT_MANUAL];
@ -535,7 +535,7 @@ class GServer
$serverdata['last_contact'] = DateTimeFormat::utcNow();
$serverdata['failed'] = false;
$gserver = DBA::selectFirst('gserver', ['network'], ['nurl' => Strings::normaliseLink($url)]);
$gserver = DBA::selectFirst('gserver', ['network'], ['nurl' => $serverdata['nurl']]);
if (!DBA::isResult($gserver)) {
$serverdata['created'] = DateTimeFormat::utcNow();
$ret = DBA::insert('gserver', $serverdata);
@ -586,6 +586,7 @@ class GServer
* Fetch relay data from a given server url
*
* @param string $server_url address of the server
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function discoverRelay(string $server_url)
@ -685,7 +686,7 @@ class GServer
*
* @return array server data
*/
private static function fetchStatistics(string $url)
private static function fetchStatistics(string $url): array
{
$curlResult = DI::httpClient()->get($url . '/statistics.json', HttpClientAccept::JSON);
if (!$curlResult->isSuccess()) {
@ -758,7 +759,7 @@ class GServer
* @return array Server data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function fetchNodeinfo(string $url, ICanHandleHttpResponses $httpResult)
private static function fetchNodeinfo(string $url, ICanHandleHttpResponses $httpResult): array
{
if (!$httpResult->isSuccess()) {
return [];
@ -811,7 +812,7 @@ class GServer
* @return array Server data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function parseNodeinfo1(string $nodeinfo_url)
private static function parseNodeinfo1(string $nodeinfo_url): array
{
$curlResult = DI::httpClient()->get($nodeinfo_url, HttpClientAccept::JSON);
if (!$curlResult->isSuccess()) {
@ -904,7 +905,7 @@ class GServer
* @return array Server data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function parseNodeinfo2(string $nodeinfo_url)
private static function parseNodeinfo2(string $nodeinfo_url): array
{
$curlResult = DI::httpClient()->get($nodeinfo_url, HttpClientAccept::JSON);
if (!$curlResult->isSuccess()) {
@ -1001,10 +1002,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function fetchSiteinfo(string $url, array $serverdata)
private static function fetchSiteinfo(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/siteinfo.json', HttpClientAccept::JSON);
if (!$curlResult->isSuccess()) {
@ -1085,10 +1085,9 @@ class GServer
* Checks if the server contains a valid host meta file
*
* @param string $url URL of the given server
*
* @return boolean 'true' if the server seems to be vital
*/
private static function validHostMeta(string $url)
private static function validHostMeta(string $url): bool
{
$xrd_timeout = DI::config()->get('system', 'xrd_timeout');
$curlResult = DI::httpClient()->get($url . '/.well-known/host-meta', HttpClientAccept::XRD_XML, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
@ -1131,10 +1130,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectNetworkViaContacts(string $url, array $serverdata)
private static function detectNetworkViaContacts(string $url, array $serverdata): array
{
$contacts = [];
@ -1176,10 +1174,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function checkPoCo(string $url, array $serverdata)
private static function checkPoCo(string $url, array $serverdata): array
{
$serverdata['poco'] = '';
@ -1208,10 +1205,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
public static function checkMastodonDirectory(string $url, array $serverdata)
public static function checkMastodonDirectory(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/v1/directory?limit=1', HttpClientAccept::JSON);
if (!$curlResult->isSuccess()) {
@ -1238,7 +1234,7 @@ class GServer
*
* @return array server data
*/
private static function detectPeertube(string $url, array $serverdata)
private static function detectPeertube(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/v1/config', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
@ -1282,10 +1278,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectNextcloud(string $url, array $serverdata)
private static function detectNextcloud(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/status.php', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
@ -1310,7 +1305,15 @@ class GServer
return $serverdata;
}
private static function fetchWeeklyUsage(string $url, array $serverdata) {
/**
* Fetches weekly usage data
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
* @return array server data
*/
private static function fetchWeeklyUsage(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/v1/instance/activity', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
return $serverdata;
@ -1346,10 +1349,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectFromContacts(string $url, array $serverdata)
private static function detectFromContacts(string $url, array $serverdata): array
{
$gserver = DBA::selectFirst('gserver', ['id'], ['nurl' => Strings::normaliseLink($url)]);
if (empty($gserver)) {
@ -1374,10 +1376,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectMastodonAlikes(string $url, array $serverdata)
private static function detectMastodonAlikes(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/v1/instance', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
@ -1439,10 +1440,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectHubzilla(string $url, array $serverdata)
private static function detectHubzilla(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/api/statusnet/config.json', HttpClientAccept::JSON);
if (!$curlResult->isSuccess() || ($curlResult->getBody() == '')) {
@ -1517,10 +1517,9 @@ class GServer
* Converts input value to a boolean value
*
* @param string|integer $val
*
* @return boolean
*/
private static function toBoolean($val)
private static function toBoolean($val): bool
{
if (($val == 'true') || ($val == 1)) {
return true;
@ -1536,10 +1535,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectPumpIO(string $url, array $serverdata)
private static function detectPumpIO(string $url, array $serverdata): array
{
$curlResult = DI::httpClient()->get($url . '/.well-known/host-meta.json', HttpClientAccept::JSON);
if (!$curlResult->isSuccess()) {
@ -1549,7 +1547,6 @@ class GServer
$data = json_decode($curlResult->getBody(), true);
if (empty($data['links'])) {
return $serverdata;
}
// We are looking for some endpoints that are typical for pump.io
@ -1586,10 +1583,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectGNUSocial(string $url, array $serverdata)
private static function detectGNUSocial(string $url, array $serverdata): array
{
// Test for GNU Social
$curlResult = DI::httpClient()->get($url . '/api/gnusocial/version.json', HttpClientAccept::JSON);
@ -1641,10 +1637,9 @@ class GServer
*
* @param string $url URL of the given server
* @param array $serverdata array with server data
*
* @return array server data
*/
private static function detectFriendica(string $url, array $serverdata)
private static function detectFriendica(string $url, array $serverdata): array
{
// There is a bug in some versions of Friendica that will return an ActivityStream actor when the content type "application/json" is requested.
// Because of this me must not use ACCEPT_JSON here.
@ -1717,10 +1712,9 @@ class GServer
* @param object $curlResult result of curl execution
* @param array $serverdata array with server data
* @param string $url Server URL
*
* @return array server data
*/
private static function analyseRootBody($curlResult, array $serverdata, string $url)
private static function analyseRootBody($curlResult, array $serverdata, string $url): array
{
if (empty($curlResult->getBody())) {
return $serverdata;
@ -1859,7 +1853,7 @@ class GServer
*
* @return array server data
*/
private static function analyseRootHeader($curlResult, array $serverdata)
private static function analyseRootHeader($curlResult, array $serverdata): array
{
if ($curlResult->getHeader('server') == 'Mastodon') {
$serverdata['platform'] = 'mastodon';
@ -2054,7 +2048,7 @@ class GServer
* @return int
* @throws Exception
*/
public static function getProtocol(int $gsid)
public static function getProtocol(int $gsid): int
{
if (empty($gsid)) {
return null;

View file

@ -39,7 +39,14 @@ class Group
const FOLLOWERS = '~';
const MUTUALS = '&';
public static function getByUserId($uid, $includesDeleted = false)
/**
* Fetches group record by user id and maybe includes deleted groups as well
*
* @param int $uid User id to fetch group(s) for
* @param bool $includesDeleted Whether deleted groups should be included
* @return array|bool Array on success, bool on error
*/
public static function getByUserId(int $uid, bool $includesDeleted = false)
{
$conditions = ['uid' => $uid, 'cid' => null];
@ -51,15 +58,18 @@ class Group
}
/**
* @param int $group_id
* Checks whether given group id is found in database
*
* @param int $group_id Groupd it
* @param int $uid Optional user id
* @return bool
* @throws \Exception
*/
public static function exists($group_id, $uid = null)
public static function exists(int $group_id, int $uid = null): bool
{
$condition = ['id' => $group_id, 'deleted' => false];
if (isset($uid)) {
if (!is_null($uid)) {
$condition = [
'uid' => $uid
];
@ -73,12 +83,12 @@ class Group
*
* Note: If we found a deleted group with the same name, we restore it
*
* @param int $uid
* @param string $name
* @return boolean
* @param int $uid User id to create group for
* @param string $name Name of group
* @return int|boolean Id of newly created group or false on error
* @throws \Exception
*/
public static function create($uid, $name)
public static function create(int $uid, string $name)
{
$return = false;
if (!empty($uid) && !empty($name)) {
@ -114,7 +124,7 @@ class Group
* @return bool Was the update successful?
* @throws \Exception
*/
public static function update($id, $name)
public static function update(int $id, string $name): bool
{
return DBA::update('group', ['name' => $name], ['id' => $id]);
}
@ -122,11 +132,11 @@ class Group
/**
* Get a list of group ids a contact belongs to
*
* @param int $cid
* @return array
* @param int $cid Contact id
* @return array Group ids
* @throws \Exception
*/
public static function getIdsByContactId($cid)
public static function getIdsByContactId(int $cid): array
{
$return = [];
@ -185,12 +195,12 @@ class Group
*
* Returns false if no group has been found.
*
* @param int $uid
* @param string $name
* @return int|boolean
* @param int $uid User id
* @param string $name Group name
* @return int|boolean Groups' id number or false on error
* @throws \Exception
*/
public static function getIdByName($uid, $name)
public static function getIdByName(int $uid, string $name)
{
if (!$uid || !strlen($name)) {
return false;
@ -211,7 +221,7 @@ class Group
* @return boolean
* @throws \Exception
*/
public static function remove($gid)
public static function remove(int $gid): bool
{
if (!$gid) {
return false;
@ -314,13 +324,14 @@ class Group
* Adds contacts to a group
*
* @param int $gid
* @param array $contacts
* @param array $contacts Array with contact ids
* @return void
* @throws \Exception
*/
public static function addMembers(int $gid, array $contacts)
{
if (!$gid || !$contacts) {
return false;
return;
}
// @TODO Backward compatibility with user contacts, remove by version 2022.03
@ -342,8 +353,9 @@ class Group
/**
* Removes contacts from a group
*
* @param int $gid
* @param array $contacts
* @param int $gid Group id
* @param array $contacts Contact ids
* @return bool
* @throws \Exception
*/
public static function removeMembers(int $gid, array $contacts)
@ -369,19 +381,20 @@ class Group
$contactIds[] = $cdata['user'];
}
DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $contactIds]);
// Return status of deletion
return DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $contactIds]);
}
/**
* Returns the combined list of contact ids from a group id list
*
* @param int $uid
* @param array $group_ids
* @param boolean $check_dead
* @param int $uid User id
* @param array $group_ids Groups ids
* @param boolean $check_dead Whether check "dead" records (?)
* @return array
* @throws \Exception
*/
public static function expand($uid, array $group_ids, $check_dead = false)
public static function expand(int $uid, array $group_ids, bool $check_dead = false): array
{
if (!is_array($group_ids) || !count($group_ids)) {
return [];
@ -454,13 +467,13 @@ class Group
/**
* Returns a templated group selection list
*
* @param int $uid
* @param int $uid User id
* @param int $gid An optional pre-selected group
* @param string $label An optional label of the list
* @return string
* @throws \Exception
*/
public static function displayGroupSelection($uid, $gid = 0, $label = '')
public static function displayGroupSelection(int $uid, int $gid = 0, string $label = ''): string
{
$display_groups = [
[
@ -502,12 +515,12 @@ class Group
* 'standard' => include link 'Edit groups'
* 'extended' => include link 'Create new group'
* 'full' => include link 'Create new group' and provide for each group a link to edit this group
* @param string $group_id
* @param int $cid
* @return string
* @param string|int $group_id Distinct group id or 'everyone'
* @param int $cid Contact id
* @return string Sidebar widget HTML code
* @throws \Exception
*/
public static function sidebarWidget($every = 'contact', $each = 'group', $editmode = 'standard', $group_id = '', $cid = 0)
public static function sidebarWidget(string $every = 'contact', string $each = 'group', string $editmode = 'standard', $group_id = '', int $cid = 0)
{
if (!local_user()) {
return '';
@ -589,7 +602,7 @@ class Group
* @param integer $id Contact ID
* @return integer Group IO
*/
public static function getIdForForum(int $id)
public static function getIdForForum(int $id): int
{
Logger::info('Get id for forum id', ['id' => $id]);
$contact = Contact::getById($id, ['uid', 'name', 'contact-type', 'manually-approve']);
@ -617,6 +630,7 @@ class Group
* Fetch the followers of a given contact id and store them as group members
*
* @param integer $id Contact ID
* @return void
*/
public static function updateMembersForForum(int $id)
{

View file

@ -96,8 +96,8 @@ class Item
'event-created', 'event-edited', 'event-start', 'event-finish',
'event-summary', 'event-desc', 'event-location', 'event-type',
'event-nofinish', 'event-ignore', 'event-id',
"question-id", "question-multiple", "question-voters", "question-end-time",
"has-categories", "has-media",
'question-id', 'question-multiple', 'question-voters', 'question-end-time',
'has-categories', 'has-media',
'delivery_queue_count', 'delivery_queue_done', 'delivery_queue_failed'
];
@ -226,7 +226,7 @@ class Item
foreach ($notify_items as $notify_item) {
$post = Post::selectFirst(['uri-id', 'uid'], ['id' => $notify_item]);
Worker::add(PRIORITY_HIGH, "Notifier", Delivery::POST, (int)$post['uri-id'], (int)$post['uid']);
Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::POST, (int)$post['uri-id'], (int)$post['uid']);
}
return $rows;
@ -237,9 +237,10 @@ class Item
*
* @param array $condition The condition for finding the item entries
* @param integer $priority Priority for the notification
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function markForDeletion($condition, $priority = PRIORITY_HIGH)
public static function markForDeletion(array $condition, int $priority = PRIORITY_HIGH)
{
$items = Post::select(['id'], $condition);
while ($item = Post::fetch($items)) {
@ -253,9 +254,10 @@ class Item
*
* @param array $condition The condition for finding the item entries
* @param integer $uid User who wants to delete this item
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function deleteForUser($condition, $uid)
public static function deleteForUser(array $condition, int $uid)
{
if ($uid == 0) {
return;
@ -282,11 +284,10 @@ class Item
*
* @param integer $item_id
* @param integer $priority Priority for the notification
*
* @return boolean success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function markForDeletionById($item_id, $priority = PRIORITY_HIGH)
public static function markForDeletionById(int $item_id, int $priority = PRIORITY_HIGH): bool
{
Logger::info('Mark item for deletion by id', ['id' => $item_id, 'callstack' => System::callstack()]);
// locate item to be deleted
@ -331,7 +332,7 @@ class Item
// If item has attachments, drop them
$attachments = Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT]);
foreach($attachments as $attachment) {
if (preg_match("|attach/(\d+)|", $attachment['url'], $matches)) {
if (preg_match('|attach/(\d+)|', $attachment['url'], $matches)) {
Attach::delete(['id' => $matches[1], 'uid' => $item['uid']]);
}
}
@ -360,7 +361,7 @@ class Item
// send the notification upstream/downstream
if ($priority) {
Worker::add(['priority' => $priority, 'dont_fork' => true], "Notifier", Delivery::DELETION, (int)$item['uri-id'], (int)$item['uid']);
Worker::add(['priority' => $priority, 'dont_fork' => true], 'Notifier', Delivery::DELETION, (int)$item['uri-id'], (int)$item['uid']);
}
} elseif ($item['uid'] != 0) {
Post\User::update($item['uri-id'], $item['uid'], ['hidden' => true]);
@ -372,7 +373,14 @@ class Item
return true;
}
public static function guid($item, $notify)
/**
* Get guid from given item record
*
* @param array $item Item record
* @param bool Whether to notify (?)
* @return string Guid
*/
public static function guid(array $item, bool $notify): string
{
if (!empty($item['guid'])) {
return trim($item['guid']);
@ -425,7 +433,13 @@ class Item
return $guid;
}
private static function contactId($item)
/**
* Returns contact id from given item record
*
* @param array $item Item record
* @return int Contact id
*/
private static function contactId(array $item): int
{
if (!empty($item['contact-id']) && DBA::exists('contact', ['self' => true, 'id' => $item['contact-id']])) {
return $item['contact-id'];
@ -451,17 +465,17 @@ class Item
* @param array $item The item fields that are to be inserted
* @throws \Exception
*/
private static function spool($orig_item)
private static function spool(array $item)
{
// Now we store the data in the spool directory
// We use "microtime" to keep the arrival order and "mt_rand" to avoid duplicates
$file = 'item-' . round(microtime(true) * 10000) . '-' . mt_rand() . '.msg';
$spoolpath = System::getSpoolPath();
if ($spoolpath != "") {
if ($spoolpath != '') {
$spool = $spoolpath . '/' . $file;
file_put_contents($spool, json_encode($orig_item));
file_put_contents($spool, json_encode($item));
Logger::warning("Item wasn't stored - Item was spooled into file", ['file' => $file]);
}
}
@ -469,10 +483,10 @@ class Item
/**
* Check if the item array is a duplicate
*
* @param array $item
* @param array $item Item record
* @return boolean is it a duplicate?
*/
private static function isDuplicate(array $item)
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']];
@ -521,10 +535,10 @@ class Item
/**
* Check if the item array is valid
*
* @param array $item
* @param array $item Item record
* @return boolean item is valid
*/
public static function isValid(array $item)
public static function isValid(array $item): bool
{
// When there is no content then we don't post it
if (($item['body'] . $item['title'] == '') && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) {
@ -591,10 +605,10 @@ class Item
/**
* Check if the item array is too old
*
* @param array $item
* @param array $item Item record
* @return boolean item is too old
*/
public static function isTooOld(array $item)
public static function isTooOld(array $item): bool
{
// check for create date and expire time
$expire_interval = DI::config()->get('system', 'dbclean-expire-days', 0);
@ -623,15 +637,20 @@ class Item
/**
* Return the id of the given item array if it has been stored before
*
* @param array $item
* @return integer item id
* @param array $item Item record
* @return integer Item id or zero on error
*/
private static function getDuplicateID(array $item)
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, Protocol::OSTATUS];
$condition = ['`uri-id` = ? AND `uid` = ? AND `network` IN (?, ?, ?, ?)',
$item['uri-id'],
$item['uid'],
Protocol::ACTIVITYPUB,
Protocol::DIASPORA,
Protocol::DFRN,
Protocol::OSTATUS
];
$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
@ -640,12 +659,12 @@ class Item
'uri-id' => $item['uri-id'],
'uid' => $item['uid'],
'network' => $item['network'],
'existing_id' => $existing["id"],
'existing_network' => $existing["network"]
'existing_id' => $existing['id'],
'existing_network' => $existing['network']
]);
}
return $existing["id"];
return $existing['id'];
}
}
return 0;
@ -658,7 +677,7 @@ class Item
* @return array item array with parent data
* @throws \Exception
*/
private static function getTopLevelParent(array $item)
private static function getTopLevelParent(array $item): array
{
$fields = ['uid', 'uri', 'parent-uri', 'id', 'deleted',
'uri-id', 'parent-uri-id',
@ -709,7 +728,7 @@ class Item
* @param array $item
* @return integer gravity
*/
private static function getGravity(array $item)
private static function getGravity(array $item): int
{
$activity = DI::activity();
@ -724,11 +743,20 @@ class Item
} elseif ($activity->match($item['verb'], Activity::ANNOUNCE)) {
return GRAVITY_ACTIVITY;
}
Logger::info('Unknown gravity for verb', ['verb' => $item['verb']]);
return GRAVITY_UNKNOWN; // Should not happen
}
public static function insert(array $item, int $notify = 0, bool $post_local = true)
/**
* Inserts item record
*
* @param array $item Item array to be inserted
* @param int $notify Notification (type?)
* @param bool $post_local (???)
* @return int Zero means error, otherwise primary key (id) is being returned
*/
public static function insert(array $item, int $notify = 0, bool $post_local = true): int
{
$orig_item = $item;
@ -869,7 +897,7 @@ class Item
Contact::checkAvatarCache($item['owner-id']);
// The contact-id should be set before "self::insert" was called - but there seems to be issues sometimes
$item["contact-id"] = self::contactId($item);
$item['contact-id'] = self::contactId($item);
if (!empty($item['direction']) && in_array($item['direction'], [Conversation::PUSH, Conversation::RELAY]) &&
empty($item['origin']) &&self::isTooOld($item)) {
@ -944,8 +972,8 @@ class Item
$item['thr-parent-id'] = ItemURI::getIdByURI($item['thr-parent']);
// Is this item available in the global items (with uid=0)?
if ($item["uid"] == 0) {
$item["global"] = true;
if ($item['uid'] == 0) {
$item['global'] = true;
// Set the global flag on all items if this was a global item entry
Post::update(['global' => true], ['uri-id' => $item['uri-id']]);
@ -954,8 +982,8 @@ class Item
}
// ACL settings
if (!empty($item["allow_cid"] . $item["allow_gid"] . $item["deny_cid"] . $item["deny_gid"])) {
$item["private"] = self::PRIVATE;
if (!empty($item['allow_cid'] . $item['allow_gid'] . $item['deny_cid'] . $item['deny_gid'])) {
$item['private'] = self::PRIVATE;
}
if ($notify && $post_local) {
@ -1323,7 +1351,7 @@ class Item
* @param string $signed_text Original text (for Diaspora signatures), JSON encoded.
* @throws \Exception
*/
public static function distribute($itemid, $signed_text = '')
public static function distribute(int $itemid, string $signed_text = '')
{
$condition = ["`id` IN (SELECT `parent` FROM `post-user-view` WHERE `id` = ?)", $itemid];
$parent = Post::selectFirst(['owner-id'], $condition);
@ -1417,7 +1445,7 @@ class Item
* @param integer $source_uid User id of the source post
* @return integer stored item id
*/
public static function storeForUserByUriId(int $uri_id, int $uid, array $fields = [], int $source_uid = 0)
public static function storeForUserByUriId(int $uri_id, int $uid, array $fields = [], int $source_uid = 0): int
{
if ($uid == $source_uid) {
Logger::warning('target UID must not be be equal to the source UID', ['uri-id' => $uri_id, 'uid' => $uid]);
@ -1525,7 +1553,7 @@ class Item
* @return integer stored item id
* @throws \Exception
*/
private static function storeForUser(array $item, int $uid)
private static function storeForUser(array $item, int $uid): int
{
if (Post::exists(['uri-id' => $item['uri-id'], 'uid' => $uid])) {
if (!empty($item['event-id'])) {
@ -1613,7 +1641,7 @@ class Item
* @param integer $itemid Item ID that should be added
* @throws \Exception
*/
private static function addShadow($itemid)
private static function addShadow(int $itemid)
{
$fields = ['uid', 'private', 'visible', 'deleted', 'network', 'uri-id'];
$condition = ['id' => $itemid, 'gravity' => GRAVITY_PARENT];
@ -1676,7 +1704,7 @@ class Item
* @param integer $itemid Item ID that should be added
* @throws \Exception
*/
private static function addShadowPost($itemid)
private static function addShadowPost(int $itemid)
{
$item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $itemid]);
if (!DBA::isResult($item)) {
@ -1740,7 +1768,7 @@ class Item
* @return string detected language
* @throws \Text_LanguageDetect_Exception
*/
private static function getLanguage(array $item)
private static function getLanguage(array $item): string
{
if (!empty($item['language'])) {
return $item['language'];
@ -1784,7 +1812,7 @@ class Item
return '';
}
public static function getLanguageMessage(array $item)
public static function getLanguageMessage(array $item): string
{
$iso639 = new \Matriphe\ISO639\ISO639;
@ -1806,7 +1834,7 @@ class Item
* @param string $host hostname for the GUID prefix
* @return string unique guid
*/
public static function guidFromUri($uri, $host)
public static function guidFromUri(string $uri, string $host): string
{
// Our regular guid routine is using this kind of prefix as well
// We have to avoid that different routines could accidentally create the same value
@ -1850,7 +1878,7 @@ class Item
* @param array $arr Contains the just posted item record
* @throws \Exception
*/
private static function updateContact($arr)
private static function updateContact(array $arr)
{
// Unarchive the author
$contact = DBA::selectFirst('contact', [], ['id' => $arr["author-id"]]);
@ -1897,7 +1925,7 @@ class Item
}
}
public static function setHashtags($body)
public static function setHashtags(string $body): string
{
$body = BBCode::performWithEscapedTags($body, ['noparse', 'pre', 'code', 'img'], function ($body) {
$tags = BBCode::getTags($body);
@ -1971,7 +1999,7 @@ class Item
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function tagDeliver($uid, $item_id)
private static function tagDeliver(int $uid, int $item_id): bool
{
$mention = false;
@ -2066,7 +2094,7 @@ class Item
self::performActivity($item['id'], 'announce', $item['uid']);
}
public static function isRemoteSelf($contact, &$datarray)
public static function isRemoteSelf(array $contact, array &$datarray): bool
{
if (!$contact['remote_self']) {
return false;
@ -2160,7 +2188,7 @@ class Item
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function fixPrivatePhotos($s, $uid, $item = null, $cid = 0)
public static function fixPrivatePhotos(string $s, int $uid, array $item = null, int $cid = 0): string
{
if (DI::config()->get('system', 'disable_embedded')) {
return $s;
@ -2254,13 +2282,14 @@ class Item
return $new_body;
}
private static function hasPermissions($obj)
private static function hasPermissions(array $obj)
{
return !empty($obj['allow_cid']) || !empty($obj['allow_gid']) ||
!empty($obj['deny_cid']) || !empty($obj['deny_gid']);
}
private static function samePermissions($uid, $obj1, $obj2)
// @TODO $uid is unused parameter
private static function samePermissions($uid, array $obj1, array $obj2): bool
{
// first part is easy. Check that these are exactly the same.
if (($obj1['allow_cid'] == $obj2['allow_cid'])
@ -2288,7 +2317,7 @@ class Item
* @return array
* @throws \Exception
*/
public static function enumeratePermissions(array $obj, bool $check_dead = false)
public static function enumeratePermissions(array $obj, bool $check_dead = false): array
{
$aclFormater = DI::aclFormatter();
@ -2376,7 +2405,7 @@ class Item
Logger::notice('User ' . $uid . ": expired $expired items; expire items: $expire_items, expire notes: $expire_notes, expire starred: $expire_starred, expire photos: $expire_photos");
}
public static function firstPostDate($uid, $wall = false)
public static function firstPostDate(int $uid, bool $wall = false)
{
$user = User::getById($uid, ['register_date']);
if (empty($user)) {
@ -2417,7 +2446,7 @@ class Item
* array $arr
* 'post_id' => ID of posted item
*/
public static function performActivity(int $item_id, string $verb, int $uid, string $allow_cid = null, string $allow_gid = null, string $deny_cid = null, string $deny_gid = null)
public static function performActivity(int $item_id, string $verb, int $uid, string $allow_cid = null, string $allow_gid = null, string $deny_cid = null, string $deny_gid = null): bool
{
if (empty($uid)) {
return false;
@ -2611,7 +2640,7 @@ class Item
* @param integer $owner_id User ID for which the permissions should be fetched
* @return array condition
*/
public static function getPermissionsConditionArrayByUserId(int $owner_id)
public static function getPermissionsConditionArrayByUserId(int $owner_id): array
{
$local_user = local_user();
$remote_user = Session::getRemoteContactID($owner_id);
@ -2643,7 +2672,7 @@ class Item
* @param string $table
* @return string
*/
public static function getPermissionsSQLByUserId(int $owner_id, string $table = '')
public static function getPermissionsSQLByUserId(int $owner_id, string $table = ''): string
{
$local_user = local_user();
$remote_user = Session::getRemoteContactID($owner_id);
@ -2691,7 +2720,7 @@ class Item
* @param \Friendica\Core\L10n $l10n
* @return string
*/
public static function postType(array $item, \Friendica\Core\L10n $l10n)
public static function postType(array $item, \Friendica\Core\L10n $l10n): string
{
if (!empty($item['event-id'])) {
return $l10n->t('event');
@ -2757,10 +2786,10 @@ class Item
* Given an item array, convert the body element from bbcode to html and add smilie icons.
* If attach is true, also add icons for item attachments.
*
* @param array $item
* @param boolean $attach
* @param boolean $is_preview
* @param boolean $only_cache
* @param array $item Record from item table
* @param boolean $attach If true, add icons for item attachments as well
* @param boolean $is_preview Whether this is a preview
* @param boolean $only_cache Whether only cached HTML should be updated
* @return string item body html
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
@ -2769,7 +2798,7 @@ class Item
* @hook prepare_body ('item'=>item array, 'html'=>body string, 'is_preview'=>boolean, 'filter_reasons'=>string array) after first bbcode to html
* @hook prepare_body_final ('item'=>item array, 'html'=>body string) after attach icons and blockquote special case handling (spoiler, author)
*/
public static function prepareBody(array &$item, $attach = false, $is_preview = false, $only_cache = false)
public static function prepareBody(array &$item, bool $attach = false, bool $is_preview = false, bool $only_cache = false): string
{
$a = DI::app();
Hook::callAll('prepare_body_init', $item);
@ -2811,7 +2840,7 @@ class Item
$s = $item["rendered-html"];
if ($only_cache) {
return;
return '';
}
// Compile eventual content filter reasons
@ -2891,7 +2920,7 @@ class Item
* @param int $type
* @return bool
*/
public static function containsLink(string $body, string $url, int $type = 0)
public static function containsLink(string $body, string $url, int $type = 0): bool
{
// Make sure that for example site parameters aren't used when testing if the link is contained in the body
$urlparts = parse_url($url);
@ -2924,7 +2953,7 @@ class Item
* @param string $body
* @return string modified body
*/
private static function replaceVisualAttachments(array $attachments, string $body)
private static function replaceVisualAttachments(array $attachments, string $body): string
{
DI::profiler()->startRecording('rendering');
@ -2955,7 +2984,7 @@ class Item
* @param string $content
* @return string modified content
*/
private static function addVisualAttachments(array $attachments, array $item, string $content, bool $shared)
private static function addVisualAttachments(array $attachments, array $item, string $content, bool $shared): string
{
DI::profiler()->startRecording('rendering');
$leading = '';
@ -3047,7 +3076,7 @@ class Item
* @param array $ignore_links A list of URLs to ignore
* @return string modified content
*/
private static function addLinkAttachment(int $uriid, array $attachments, string $body, string $content, bool $shared, array $ignore_links)
private static function addLinkAttachment(int $uriid, array $attachments, string $body, string $content, bool $shared, array $ignore_links): string
{
DI::profiler()->startRecording('rendering');
// Don't show a preview when there is a visual attachment (audio or video)
@ -3161,7 +3190,7 @@ class Item
* @param string $content
* @return string modified content
*/
private static function addNonVisualAttachments(array $attachments, array $item, string $content)
private static function addNonVisualAttachments(array $attachments, array $item, string $content): string
{
DI::profiler()->startRecording('rendering');
$trailing = '';
@ -3193,7 +3222,7 @@ class Item
return $content;
}
private static function addQuestions(array $item, string $content)
private static function addQuestions(array $item, string $content): string
{
DI::profiler()->startRecording('rendering');
if (!empty($item['question-id'])) {
@ -3244,7 +3273,7 @@ class Item
* @return boolean|array False if item has not plink, otherwise array('href'=>plink url, 'title'=>translated title)
* @throws \Exception
*/
public static function getPlink($item)
public static function getPlink(array $item)
{
if (!empty($item['plink']) && Network::isValidHttpUrl($item['plink'])) {
$plink = $item['plink'];
@ -3291,7 +3320,7 @@ class Item
*
* @return boolean "true" when it is a forum post
*/
public static function isForumPost(int $uri_id)
public static function isForumPost(int $uri_id): bool
{
foreach (Tag::getByURIId($uri_id, [Tag::EXCLUSIVE_MENTION]) as $tag) {
if (DBA::exists('contact', ['uid' => 0, 'nurl' => Strings::normaliseLink($tag['url']), 'contact-type' => Contact::TYPE_COMMUNITY])) {
@ -3309,7 +3338,7 @@ class Item
*
* @return integer item id
*/
public static function searchByLink($uri, $uid = 0)
public static function searchByLink(string $uri, int $uid = 0): int
{
$ssl_uri = str_replace('http://', 'https://', $uri);
$uris = [$uri, $ssl_uri, Strings::normaliseLink($uri)];
@ -3334,7 +3363,7 @@ class Item
*
* @return string URI
*/
public static function getURIByLink(string $uri)
public static function getURIByLink(string $uri): string
{
$ssl_uri = str_replace('http://', 'https://', $uri);
$uris = [$uri, $ssl_uri, Strings::normaliseLink($uri)];
@ -3360,7 +3389,7 @@ class Item
*
* @return integer item id
*/
public static function fetchByLink(string $uri, int $uid = 0)
public static function fetchByLink(string $uri, int $uid = 0): int
{
Logger::info('Trying to fetch link', ['uid' => $uid, 'uri' => $uri]);
$item_id = self::searchByLink($uri, $uid);
@ -3406,7 +3435,7 @@ class Item
*
* @return array with share information
*/
public static function getShareArray($item)
public static function getShareArray(array $item): array
{
if (!preg_match("/(.*?)\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", $item['body'], $matches)) {
return [];
@ -3429,7 +3458,7 @@ class Item
*
* @return array item array with data from the original item
*/
public static function addShareDataFromOriginal(array $item)
public static function addShareDataFromOriginal(array $item): array
{
$shared = self::getShareArray($item);
if (empty($shared)) {
@ -3490,7 +3519,7 @@ class Item
* @return bool
* @throws \Exception
*/
protected static function isAllowedByUser(array $item, int $user_id)
protected static function isAllowedByUser(array $item, int $user_id): bool
{
if (!empty($item['author-id']) && Contact\User::isBlocked($item['author-id'], $user_id)) {
Logger::notice('Author is blocked by user', ['author-link' => $item['author-link'], 'uid' => $user_id, 'item-uri' => $item['uri']]);
@ -3522,7 +3551,7 @@ class Item
* @param array $item
* @return string body
*/
public static function improveSharedDataInBody(array $item)
public static function improveSharedDataInBody(array $item): string
{
$shared = BBCode::fetchShareAttributes($item['body']);
if (empty($shared['link'])) {

View file

@ -30,7 +30,6 @@ class ItemURI
* Insert an item-uri record and return its id
*
* @param array $fields Item-uri fields
*
* @return int|null item-uri id
* @throws \Exception
*/
@ -61,12 +60,15 @@ class ItemURI
* Searched for an id of a given uri. Adds it, if not existing yet.
*
* @param string $uri
*
* @return integer item-uri id
* @throws \Exception
*/
public static function getIdByURI($uri)
public static function getIdByURI(string $uri): int
{
if (empty($uri)) {
return 0;
}
// If the URI gets too long we only take the first parts and hope for best
$uri = substr($uri, 0, 255);
@ -82,11 +84,10 @@ class ItemURI
* Searched for an id of a given guid.
*
* @param string $guid
*
* @return integer item-uri id
* @throws \Exception
*/
public static function getIdByGUID($guid)
public static function getIdByGUID(string $guid): int
{
// If the GUID gets too long we only take the first parts and hope for best
$guid = substr($guid, 0, 255);

View file

@ -60,7 +60,7 @@ class ParsedLogIterator implements \Iterator
* @param string $filename File to open
* @return $this
*/
public function open(string $filename)
public function open(string $filename): ParsedLogIterator
{
$this->reader->open($filename);
return $this;
@ -70,7 +70,7 @@ class ParsedLogIterator implements \Iterator
* @param int $limit Max num of lines to read
* @return $this
*/
public function withLimit(int $limit)
public function withLimit(int $limit): ParsedLogIterator
{
$this->limit = $limit;
return $this;
@ -80,7 +80,7 @@ class ParsedLogIterator implements \Iterator
* @param array $filters filters per column
* @return $this
*/
public function withFilters(array $filters)
public function withFilters(array $filters): ParsedLogIterator
{
$this->filters = $filters;
return $this;
@ -90,7 +90,7 @@ class ParsedLogIterator implements \Iterator
* @param string $search string to search to filter lines
* @return $this
*/
public function withSearch(string $search)
public function withSearch(string $search): ParsedLogIterator
{
$this->search = $search;
return $this;
@ -100,10 +100,10 @@ class ParsedLogIterator implements \Iterator
* Check if parsed log line match filters.
* Always match if no filters are set.
*
* @param ParsedLogLine $parsedlogline
* @return bool
* @param ParsedLogLine $parsedlogline ParsedLogLine instance
* @return bool Wether the parse log line matches
*/
private function filter($parsedlogline)
private function filter(ParsedLogLine $parsedlogline): bool
{
$match = true;
foreach ($this->filters as $filter => $filtervalue) {
@ -126,7 +126,7 @@ class ParsedLogIterator implements \Iterator
* @param ParsedLogLine $parsedlogline
* @return bool
*/
private function search($parsedlogline)
private function search(ParsedLogLine $parsedlogline): bool
{
if ($this->search != "") {
return strstr($parsedlogline->logline, $this->search) !== false;

View file

@ -45,7 +45,7 @@ class Mail
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function insert($msg, $notification = true)
public static function insert(array $msg, bool $notification = true)
{
if (!isset($msg['reply'])) {
$msg['reply'] = DBA::exists('mail', ['parent-uri' => $msg['parent-uri']]);
@ -125,7 +125,7 @@ class Mail
* @return int
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function send($recipient = 0, $body = '', $subject = '', $replyto = '')
public static function send(int $recipient = 0, string $body = '', string $subject = '', string $replyto = ''): int
{
$a = DI::app();
@ -255,7 +255,7 @@ class Mail
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function sendWall(array $recipient = [], $body = '', $subject = '', $replyto = '')
public static function sendWall(array $recipient = [], string $body = '', string $subject = '', string $replyto = ''): int
{
if (!$recipient) {
return -1;

View file

@ -22,6 +22,7 @@
namespace Friendica\Model;
use Friendica\Core\Addon;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Database\DBA;
use Friendica\DI;
use stdClass;
@ -101,7 +102,7 @@ class Nodeinfo
*
* @return array with supported services
*/
public static function getServices()
public static function getServices(): array
{
$services = [
'inbound' => [],
@ -156,9 +157,19 @@ class Nodeinfo
return $services;
}
public static function getOrganization($config)
/**
* Gathers organization information and returns it as an array
*
* @param IManageConfigValues $config Configuration instance
* @return array Organization information
*/
public static function getOrganization(IManageConfigValues $config): array
{
$organization = ['name' => null, 'contact' => null, 'account' => null];
$organization = [
'name' => null,
'contact' => null,
'account' => null
];
if (!empty($config->get('config', 'admin_email'))) {
$adminList = explode(',', str_replace(' ', '', $config->get('config', 'admin_email')));

View file

@ -40,16 +40,16 @@ class OpenWebAuthToken
* @return boolean
* @throws \Exception
*/
public static function create($type, $uid, $token, $meta)
public static function create(string $type, uid $uid, string $token, string $meta)
{
$fields = [
"type" => $type,
"uid" => $uid,
"token" => $token,
"meta" => $meta,
"created" => DateTimeFormat::utcNow()
'type' => $type,
'uid' => $uid,
'token' => $token,
'meta' => $meta,
'created' => DateTimeFormat::utcNow()
];
return DBA::insert("openwebauth-token", $fields);
return DBA::insert('openwebauth-token', $fields);
}
/**
@ -62,15 +62,15 @@ class OpenWebAuthToken
* @return string|boolean The meta enry or false if not found.
* @throws \Exception
*/
public static function getMeta($type, $uid, $token)
public static function getMeta(string $type, int $uid, string $token)
{
$condition = ["type" => $type, "uid" => $uid, "token" => $token];
$condition = ['type' => $type, 'uid' => $uid, 'token' => $token];
$entry = DBA::selectFirst("openwebauth-token", ["id", "meta"], $condition);
$entry = DBA::selectFirst('openwebauth-token', ['id', 'meta'], $condition);
if (DBA::isResult($entry)) {
DBA::delete("openwebauth-token", ["id" => $entry["id"]]);
DBA::delete('openwebauth-token', ['id' => $entry['id']]);
return $entry["meta"];
return $entry['meta'];
}
return false;
}
@ -82,10 +82,10 @@ class OpenWebAuthToken
* @param string $interval SQL compatible time interval
* @throws \Exception
*/
public static function purge($type, $interval)
public static function purge(string $type, string $interval)
{
$condition = ["`type` = ? AND `created` < ?", $type, DateTimeFormat::utcNow() . " - INTERVAL " . $interval];
DBA::delete("openwebauth-token", $condition);
$condition = ["`type` = ? AND `created` < ?", $type, DateTimeFormat::utcNow() . ' - INTERVAL ' . $interval];
DBA::delete('openwebauth-token', $condition);
}
}

View file

@ -94,7 +94,7 @@ class Photo
$fields = self::getFields();
}
return DBA::selectFirst("photo", $fields, $conditions, $params);
return DBA::selectFirst('photo', $fields, $conditions, $params);
}
/**
@ -110,10 +110,10 @@ class Photo
* @throws \Exception
* @see \Friendica\Database\DBA::select
*/
public static function getPhotosForUser($uid, $resourceid, array $conditions = [], array $params = [])
public static function getPhotosForUser(int $uid, string $resourceid, array $conditions = [], array $params = [])
{
$conditions["resource-id"] = $resourceid;
$conditions["uid"] = $uid;
$conditions['resource-id'] = $resourceid;
$conditions['uid'] = $uid;
return self::selectToArray([], $conditions, $params);
}
@ -132,11 +132,11 @@ class Photo
* @throws \Exception
* @see \Friendica\Database\DBA::select
*/
public static function getPhotoForUser($uid, $resourceid, $scale = 0, array $conditions = [], array $params = [])
public static function getPhotoForUser(int $uid, $resourceid, $scale = 0, array $conditions = [], array $params = [])
{
$conditions["resource-id"] = $resourceid;
$conditions["uid"] = $uid;
$conditions["scale"] = $scale;
$conditions['resource-id'] = $resourceid;
$conditions['uid'] = $uid;
$conditions['scale'] = $scale;
return self::selectFirst([], $conditions, $params);
}
@ -156,19 +156,19 @@ class Photo
*/
public static function getPhoto(string $resourceid, int $scale = 0)
{
$r = self::selectFirst(["uid"], ["resource-id" => $resourceid]);
$r = self::selectFirst(['uid'], ['resource-id' => $resourceid]);
if (!DBA::isResult($r)) {
return false;
}
$uid = $r["uid"];
$uid = $r['uid'];
$accessible = $uid ? (bool)DI::pConfig()->get($uid, 'system', 'accessible-photos', false) : false;
$sql_acl = Security::getPermissionsSQLByUserId($uid, $accessible);
$conditions = ["`resource-id` = ? AND `scale` <= ? " . $sql_acl, $resourceid, $scale];
$params = ["order" => ["scale" => true]];
$params = ['order' => ['scale' => true]];
$photo = self::selectFirst([], $conditions, $params);
return $photo;
@ -182,9 +182,9 @@ class Photo
* @return boolean
* @throws \Exception
*/
public static function exists(array $conditions)
public static function exists(array $conditions): bool
{
return DBA::exists("photo", $conditions);
return DBA::exists('photo', $conditions);
}
@ -193,7 +193,7 @@ class Photo
*
* @param array $photo Photo data. Needs at least 'id', 'type', 'backend-class', 'backend-ref'
*
* @return \Friendica\Object\Image
* @return \Friendica\Object\Image|null Image object or null on error
*/
public static function getImageDataForPhoto(array $photo)
{
@ -248,11 +248,11 @@ class Photo
* @return array field list
* @throws \Exception
*/
private static function getFields()
private static function getFields(): array
{
$allfields = DBStructure::definition(DI::app()->getBasePath(), false);
$fields = array_keys($allfields["photo"]["fields"]);
array_splice($fields, array_search("data", $fields), 1);
$fields = array_keys($allfields['photo']['fields']);
array_splice($fields, array_search('data', $fields), 1);
return $fields;
}
@ -265,14 +265,14 @@ class Photo
* @return array
* @throws \Exception
*/
public static function createPhotoForSystemResource($filename, $mimetype = '')
public static function createPhotoForSystemResource(string $filename, string $mimetype = ''): array
{
if (empty($mimetype)) {
$mimetype = Images::guessTypeByExtension($filename);
}
$fields = self::getFields();
$values = array_fill(0, count($fields), "");
$values = array_fill(0, count($fields), '');
$photo = array_combine($fields, $values);
$photo['backend-class'] = SystemResource::NAME;
@ -293,14 +293,14 @@ class Photo
* @return array
* @throws \Exception
*/
public static function createPhotoForExternalResource($url, $uid = 0, $mimetype = '')
public static function createPhotoForExternalResource(string $url, int $uid = 0, string $mimetype = ''): array
{
if (empty($mimetype)) {
$mimetype = Images::guessTypeByExtension($url);
}
$fields = self::getFields();
$values = array_fill(0, count($fields), "");
$values = array_fill(0, count($fields), '');
$photo = array_combine($fields, $values);
$photo['backend-class'] = ExternalResource::NAME;
@ -314,14 +314,14 @@ class Photo
/**
* store photo metadata in db and binary in default backend
*
* @param Image $Image Image object with data
* @param Image $image Image object with data
* @param integer $uid User ID
* @param integer $cid Contact ID
* @param integer $rid Resource ID
* @param string $rid Resource ID
* @param string $filename Filename
* @param string $album Album name
* @param integer $scale Scale
* @param integer $profile Is a profile image? optional, default = 0
* @param integer $type Photo type, optional, default: Photo::DEFAULT
* @param string $allow_cid Permissions, allowed contacts. optional, default = ""
* @param string $allow_gid Permissions, allowed groups. optional, default = ""
* @param string $deny_cid Permissions, denied contacts.optional, default = ""
@ -331,71 +331,71 @@ class Photo
* @return boolean True on success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function store(Image $Image, $uid, $cid, $rid, $filename, $album, $scale, $type = self::DEFAULT, $allow_cid = "", $allow_gid = "", $deny_cid = "", $deny_gid = "", $desc = "")
public static function store(Image $image, int $uid, int $cid, string $rid, string $filename, string $album, int $scale, int $type = self::DEFAULT, string $allow_cid = '', string $allow_gid = '', string $deny_cid = '', string $deny_gid = '', string $desc = ''): bool
{
$photo = self::selectFirst(["guid"], ["`resource-id` = ? AND `guid` != ?", $rid, ""]);
$photo = self::selectFirst(['guid'], ["`resource-id` = ? AND `guid` != ?", $rid, '']);
if (DBA::isResult($photo)) {
$guid = $photo["guid"];
$guid = $photo['guid'];
} else {
$guid = System::createGUID();
}
$existing_photo = self::selectFirst(["id", "created", "backend-class", "backend-ref"], ["resource-id" => $rid, "uid" => $uid, "contact-id" => $cid, "scale" => $scale]);
$existing_photo = self::selectFirst(['id', 'created', 'backend-class', 'backend-ref'], ['resource-id' => $rid, 'uid' => $uid, 'contact-id' => $cid, 'scale' => $scale]);
$created = DateTimeFormat::utcNow();
if (DBA::isResult($existing_photo)) {
$created = $existing_photo["created"];
$created = $existing_photo['created'];
}
// Get defined storage backend.
// if no storage backend, we use old "data" column in photo table.
// if is an existing photo, reuse same backend
$data = "";
$backend_ref = "";
$storage = "";
$data = '';
$backend_ref = '';
$storage = '';
try {
if (DBA::isResult($existing_photo)) {
$backend_ref = (string)$existing_photo["backend-ref"];
$storage = DI::storageManager()->getWritableStorageByName($existing_photo["backend-class"] ?? '');
$backend_ref = (string)$existing_photo['backend-ref'];
$storage = DI::storageManager()->getWritableStorageByName($existing_photo['backend-class'] ?? '');
} else {
$storage = DI::storage();
}
$backend_ref = $storage->put($Image->asString(), $backend_ref);
$backend_ref = $storage->put($image->asString(), $backend_ref);
} catch (InvalidClassStorageException $storageException) {
$data = $Image->asString();
$data = $image->asString();
}
$fields = [
"uid" => $uid,
"contact-id" => $cid,
"guid" => $guid,
"resource-id" => $rid,
"hash" => md5($Image->asString()),
"created" => $created,
"edited" => DateTimeFormat::utcNow(),
"filename" => basename($filename),
"type" => $Image->getType(),
"album" => $album,
"height" => $Image->getHeight(),
"width" => $Image->getWidth(),
"datasize" => strlen($Image->asString()),
"data" => $data,
"scale" => $scale,
"photo-type" => $type,
"profile" => false,
"allow_cid" => $allow_cid,
"allow_gid" => $allow_gid,
"deny_cid" => $deny_cid,
"deny_gid" => $deny_gid,
"desc" => $desc,
"backend-class" => (string)$storage,
"backend-ref" => $backend_ref
'uid' => $uid,
'contact-id' => $cid,
'guid' => $guid,
'resource-id' => $rid,
'hash' => md5($image->asString()),
'created' => $created,
'edited' => DateTimeFormat::utcNow(),
'filename' => basename($filename),
'type' => $image->getType(),
'album' => $album,
'height' => $image->getHeight(),
'width' => $image->getWidth(),
'datasize' => strlen($image->asString()),
'data' => $data,
'scale' => $scale,
'photo-type' => $type,
'profile' => false,
'allow_cid' => $allow_cid,
'allow_gid' => $allow_gid,
'deny_cid' => $deny_cid,
'deny_gid' => $deny_gid,
'desc' => $desc,
'backend-class' => (string)$storage,
'backend-ref' => $backend_ref
];
if (DBA::isResult($existing_photo)) {
$r = DBA::update("photo", $fields, ["id" => $existing_photo["id"]]);
$r = DBA::update('photo', $fields, ['id' => $existing_photo['id']]);
} else {
$r = DBA::insert("photo", $fields);
$r = DBA::insert('photo', $fields);
}
return $r;
@ -413,7 +413,7 @@ class Photo
* @throws \Exception
* @see \Friendica\Database\DBA::delete
*/
public static function delete(array $conditions, array $options = [])
public static function delete(array $conditions, array $options = []): bool
{
// get photo to delete data info
$photos = DBA::select('photo', ['id', 'backend-class', 'backend-ref'], $conditions);
@ -423,7 +423,7 @@ class Photo
$backend_class = DI::storageManager()->getWritableStorageByName($photo['backend-class'] ?? '');
$backend_class->delete($photo['backend-ref'] ?? '');
// Delete the photos after they had been deleted successfully
DBA::delete("photo", ['id' => $photo['id']]);
DBA::delete('photo', ['id' => $photo['id']]);
} catch (InvalidClassStorageException $storageException) {
DI::logger()->debug('Storage class not found.', ['conditions' => $conditions, 'exception' => $storageException]);
} catch (ReferenceStorageException $referenceStorageException) {
@ -433,34 +433,34 @@ class Photo
DBA::close($photos);
return DBA::delete("photo", $conditions, $options);
return DBA::delete('photo', $conditions, $options);
}
/**
* Update a photo
*
* @param array $fields Contains the fields that are updated
* @param array $conditions Condition array with the key values
* @param Image $img Image to update. Optional, default null.
* @param array|boolean $old_fields Array with the old field values that are about to be replaced (true = update on duplicate)
* @param array $fields Contains the fields that are updated
* @param array $conditions Condition array with the key values
* @param Image $image Image to update. Optional, default null.
* @param array $old_fields Array with the old field values that are about to be replaced (true = update on duplicate)
*
* @return boolean Was the update successfull?
*
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @see \Friendica\Database\DBA::update
*/
public static function update($fields, $conditions, Image $img = null, array $old_fields = [])
public static function update(array $fields, array $conditions, Image $image = null, array $old_fields = []): bool
{
if (!is_null($img)) {
if (!is_null($image)) {
// get photo to update
$photos = self::selectToArray(['backend-class', 'backend-ref'], $conditions);
foreach($photos as $photo) {
try {
$backend_class = DI::storageManager()->getWritableStorageByName($photo['backend-class'] ?? '');
$fields["backend-ref"] = $backend_class->put($img->asString(), $photo['backend-ref']);
$fields['backend-ref'] = $backend_class->put($image->asString(), $photo['backend-ref']);
} catch (InvalidClassStorageException $storageException) {
$fields["data"] = $img->asString();
$fields['data'] = $image->asString();
}
}
$fields['updated'] = DateTimeFormat::utcNow();
@ -468,7 +468,7 @@ class Photo
$fields['edited'] = DateTimeFormat::utcNow();
return DBA::update("photo", $fields, $conditions, $old_fields);
return DBA::update('photo', $fields, $conditions, $old_fields);
}
/**
@ -476,20 +476,20 @@ class Photo
* @param integer $uid user id
* @param integer $cid contact id
* @param boolean $quit_on_error optional, default false
* @return array
* @return array|bool Array on success, false on error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function importProfilePhoto($image_url, $uid, $cid, $quit_on_error = false)
public static function importProfilePhoto(string $image_url, int $uid, int $cid, bool $quit_on_error = false)
{
$thumb = "";
$micro = "";
$thumb = '';
$micro = '';
$photo = DBA::selectFirst(
"photo", ["resource-id"], ["uid" => $uid, "contact-id" => $cid, "scale" => 4, "photo-type" => self::CONTACT_AVATAR]
'photo', ['resource-id'], ['uid' => $uid, 'contact-id' => $cid, 'scale' => 4, 'photo-type' => self::CONTACT_AVATAR]
);
if (!empty($photo['resource-id'])) {
$resource_id = $photo["resource-id"];
$resource_id = $photo['resource-id'];
} else {
$resource_id = self::newResource();
}
@ -507,66 +507,66 @@ class Photo
$type = '';
}
if ($quit_on_error && ($img_str == "")) {
if ($quit_on_error && ($img_str == '')) {
return false;
}
$type = Images::getMimeTypeByData($img_str, $image_url, $type);
$Image = new Image($img_str, $type);
if ($Image->isValid()) {
$Image->scaleToSquare(300);
$image = new Image($img_str, $type);
if ($image->isValid()) {
$image->scaleToSquare(300);
$filesize = strlen($Image->asString());
$filesize = strlen($image->asString());
$maximagesize = DI::config()->get('system', 'maximagesize');
if (!empty($maximagesize) && ($filesize > $maximagesize)) {
Logger::info('Avatar exceeds image limit', ['uid' => $uid, 'cid' => $cid, 'maximagesize' => $maximagesize, 'size' => $filesize, 'type' => $Image->getType()]);
if ($Image->getType() == 'image/gif') {
$Image->toStatic();
$Image = new Image($Image->asString(), 'image/png');
Logger::info('Avatar exceeds image limit', ['uid' => $uid, 'cid' => $cid, 'maximagesize' => $maximagesize, 'size' => $filesize, 'type' => $image->getType()]);
if ($image->getType() == 'image/gif') {
$image->toStatic();
$image = new Image($image->asString(), 'image/png');
$filesize = strlen($Image->asString());
Logger::info('Converted gif to a static png', ['uid' => $uid, 'cid' => $cid, 'size' => $filesize, 'type' => $Image->getType()]);
$filesize = strlen($image->asString());
Logger::info('Converted gif to a static png', ['uid' => $uid, 'cid' => $cid, 'size' => $filesize, 'type' => $image->getType()]);
}
if ($filesize > $maximagesize) {
foreach ([160, 80] as $pixels) {
if ($filesize > $maximagesize) {
Logger::info('Resize', ['uid' => $uid, 'cid' => $cid, 'size' => $filesize, 'max' => $maximagesize, 'pixels' => $pixels, 'type' => $Image->getType()]);
$Image->scaleDown($pixels);
$filesize = strlen($Image->asString());
Logger::info('Resize', ['uid' => $uid, 'cid' => $cid, 'size' => $filesize, 'max' => $maximagesize, 'pixels' => $pixels, 'type' => $image->getType()]);
$image->scaleDown($pixels);
$filesize = strlen($image->asString());
}
}
}
Logger::info('Avatar is resized', ['uid' => $uid, 'cid' => $cid, 'size' => $filesize, 'type' => $Image->getType()]);
Logger::info('Avatar is resized', ['uid' => $uid, 'cid' => $cid, 'size' => $filesize, 'type' => $image->getType()]);
}
$r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 4, self::CONTACT_AVATAR);
$r = self::store($image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 4, self::CONTACT_AVATAR);
if ($r === false) {
$photo_failure = true;
}
$Image->scaleDown(80);
$image->scaleDown(80);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 5, self::CONTACT_AVATAR);
$r = self::store($image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 5, self::CONTACT_AVATAR);
if ($r === false) {
$photo_failure = true;
}
$Image->scaleDown(48);
$image->scaleDown(48);
$r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 6, self::CONTACT_AVATAR);
$r = self::store($image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 6, self::CONTACT_AVATAR);
if ($r === false) {
$photo_failure = true;
}
$suffix = "?ts=" . time();
$suffix = '?ts=' . time();
$image_url = DI::baseUrl() . "/photo/" . $resource_id . "-4." . $Image->getExt() . $suffix;
$thumb = DI::baseUrl() . "/photo/" . $resource_id . "-5." . $Image->getExt() . $suffix;
$micro = DI::baseUrl() . "/photo/" . $resource_id . "-6." . $Image->getExt() . $suffix;
$image_url = DI::baseUrl() . '/photo/' . $resource_id . '-4.' . $image->getExt() . $suffix;
$thumb = DI::baseUrl() . '/photo/' . $resource_id . '-5.' . $image->getExt() . $suffix;
$micro = DI::baseUrl() . '/photo/' . $resource_id . '-6.' . $image->getExt() . $suffix;
} else {
$photo_failure = true;
}
@ -590,31 +590,33 @@ class Photo
* @param string $hemi hemi
* @return float
*/
public static function getGps($exifCoord, $hemi)
public static function getGps(array $exifCoord, string $hemi): float
{
$degrees = count($exifCoord) > 0 ? self::gps2Num($exifCoord[0]) : 0;
$minutes = count($exifCoord) > 1 ? self::gps2Num($exifCoord[1]) : 0;
$seconds = count($exifCoord) > 2 ? self::gps2Num($exifCoord[2]) : 0;
$flip = ($hemi == "W" || $hemi == "S") ? -1 : 1;
$flip = ($hemi == 'W' || $hemi == 'S') ? -1 : 1;
return floatval($flip * ($degrees + ($minutes / 60) + ($seconds / 3600)));
}
/**
* Change GPS to float number
*
* @param string $coordPart coordPart
* @return float
*/
private static function gps2Num($coordPart)
private static function gps2Num(string $coordPart): float
{
$parts = explode("/", $coordPart);
$parts = explode('/', $coordPart);
if (count($parts) <= 0) {
return 0;
}
if (count($parts) == 1) {
return $parts[0];
return (float)$parts[0];
}
return floatval($parts[0]) / floatval($parts[1]);
@ -631,17 +633,18 @@ class Photo
* @return array Returns array of the photo albums
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function getAlbums($uid, $update = false)
public static function getAlbums(int $uid, bool $update = false): array
{
$sql_extra = Security::getPermissionsSQLByUserId($uid);
$avatar_type = (local_user() && (local_user() == $uid)) ? self::USER_AVATAR : self::DEFAULT;
$banner_type = (local_user() && (local_user() == $uid)) ? self::USER_BANNER : self::DEFAULT;
$key = "photo_albums:".$uid.":".local_user().":".remote_user();
$key = 'photo_albums:' . $uid . ':' . local_user() . ':' . remote_user();
$albums = DI::cache()->get($key);
if (is_null($albums) || $update) {
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
// 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`
@ -674,19 +677,19 @@ class Photo
* @return void
* @throws \Exception
*/
public static function clearAlbumCache($uid)
public static function clearAlbumCache(int $uid)
{
$key = "photo_albums:".$uid.":".local_user().":".remote_user();
$key = 'photo_albums:' . $uid . ':' . local_user() . ':' . remote_user();
DI::cache()->set($key, null, Duration::DAY);
}
/**
* Generate a unique photo ID.
*
* @return string
* @return string Resource GUID
* @throws \Exception
*/
public static function newResource()
public static function newResource(): string
{
return System::createGUID(32, false);
}
@ -697,7 +700,7 @@ class Photo
* @param string $image_uri The URI of the photo
* @return string The rid of the photo, or an empty string if the URI is not local
*/
public static function ridFromURI(string $image_uri)
public static function ridFromURI(string $image_uri): string
{
if (!stristr($image_uri, DI::baseUrl() . '/photo/')) {
return '';
@ -809,7 +812,7 @@ class Photo
* @param string $name Picture link
* @return array
*/
public static function getResourceData(string $name):array
public static function getResourceData(string $name): array
{
$base = DI::baseUrl()->get();
@ -840,8 +843,9 @@ class Photo
* @return boolean
* @throws \Exception
*/
public static function isLocal($name)
public static function isLocal(string $name): bool
{
// @TODO Maybe a proper check here on true condition?
return (bool)self::getIdForName($name);
}
@ -851,7 +855,7 @@ class Photo
* @param string $name Picture link
* @return int
*/
public static function getIdForName($name)
public static function getIdForName(string $name): int
{
$data = self::getResourceData($name);
if (empty($data)) {
@ -872,7 +876,7 @@ class Photo
* @return boolean
* @throws \Exception
*/
public static function isLocalPage($name)
public static function isLocalPage(string $name): bool
{
$base = DI::baseUrl()->get();
@ -885,17 +889,23 @@ class Photo
return DBA::exists('photo', ['resource-id' => $guid]);
}
private static function fitImageSize($Image)
/**
* Tries to resize image to wanted maximum size
*
* @param Image $image Image instance
* @return Image|null Image instance on success, null on error
*/
private static function fitImageSize(Image $image)
{
$max_length = DI::config()->get('system', 'max_image_length');
if ($max_length > 0) {
$Image->scaleDown($max_length);
$image->scaleDown($max_length);
Logger::info('File upload: Scaling picture to new size', ['max-length' => $max_length]);
}
$filesize = strlen($Image->asString());
$width = $Image->getWidth();
$height = $Image->getHeight();
$filesize = strlen($image->asString());
$width = $image->getWidth();
$height = $image->getHeight();
$maximagesize = DI::config()->get('system', 'maximagesize');
@ -904,10 +914,10 @@ class Photo
foreach ([5120, 2560, 1280, 640] as $pixels) {
if (($filesize > $maximagesize) && (max($width, $height) > $pixels)) {
Logger::info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]);
$Image->scaleDown($pixels);
$filesize = strlen($Image->asString());
$width = $Image->getWidth();
$height = $Image->getHeight();
$image->scaleDown($pixels);
$filesize = strlen($image->asString());
$width = $image->getWidth();
$height = $image->getHeight();
}
}
if ($filesize > $maximagesize) {
@ -916,10 +926,16 @@ class Photo
}
}
return $Image;
return $image;
}
private static function loadImageFromURL(string $image_url)
/**
* Fetches image from URL and returns an array with instance and local file name
*
* @param string $image_url URL to image
* @return array With: 'image' and 'filename' fields or empty array on error
*/
private static function loadImageFromURL(string $image_url): array
{
$filename = basename($image_url);
if (!empty($image_url)) {
@ -939,17 +955,23 @@ class Photo
$type = Images::getMimeTypeByData($img_str, $image_url, $type);
$Image = new Image($img_str, $type);
$image = new Image($img_str, $type);
$Image = self::fitImageSize($Image);
if (empty($Image)) {
$image = self::fitImageSize($image);
if (empty($image)) {
return [];
}
return ['image' => $Image, 'filename' => $filename];
return ['image' => $image, 'filename' => $filename];
}
private static function uploadImage(array $files)
/**
* Inserts uploaded image into database and removes local temporary file
*
* @param array $files File array
* @return array With 'image' for Image instance and 'filename' for local file name or empty array on error
*/
private static function uploadImage(array $files): array
{
Logger::info('starting new upload');
@ -1008,34 +1030,36 @@ class Photo
Logger::info('File upload', ['src' => $src, 'filename' => $filename, 'size' => $filesize, 'type' => $filetype]);
$imagedata = @file_get_contents($src);
$Image = new Image($imagedata, $filetype);
if (!$Image->isValid()) {
$image = new Image($imagedata, $filetype);
if (!$image->isValid()) {
Logger::notice('Image is unvalid', ['files' => $files]);
return [];
}
$Image->orient($src);
$image->orient($src);
@unlink($src);
$Image = self::fitImageSize($Image);
if (empty($Image)) {
$image = self::fitImageSize($image);
if (empty($image)) {
return [];
}
return ['image' => $Image, 'filename' => $filename];
return ['image' => $image, 'filename' => $filename];
}
/**
* Handles uploaded image and assigns it to given user id
*
* @param int $uid User ID
* @param array $files uploaded file array
* @param string $album
* @param string $album Album name (optional)
* @param string|null $allow_cid
* @param string|null $allow_gid
* @param string $deny_cid
* @param string $deny_gid
* @param string $desc
* @param string $resource_id
* @return array photo record
* @param string $desc Description (optional)
* @param string $resource_id GUID (optional)
* @return array photo record or empty array on error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function upload(int $uid, array $files, string $album = '', string $allow_cid = null, string $allow_gid = null, string $deny_cid = '', string $deny_gid = '', string $desc = '', string $resource_id = ''): array
@ -1052,10 +1076,10 @@ class Photo
return [];
}
$Image = $data['image'];
$image = $data['image'];
$filename = $data['filename'];
$width = $Image->getWidth();
$height = $Image->getHeight();
$width = $image->getWidth();
$height = $image->getHeight();
$resource_id = $resource_id ?: self::newResource();
$album = $album ?: DI::l10n()->t('Wall Photos');
@ -1067,23 +1091,23 @@ class Photo
$smallest = 0;
$r = self::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 0, self::DEFAULT, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
$r = self::store($image, $user['uid'], 0, $resource_id, $filename, $album, 0, self::DEFAULT, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if (!$r) {
Logger::notice('Photo could not be stored');
return [];
}
if ($width > 640 || $height > 640) {
$Image->scaleDown(640);
$r = self::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 1, self::DEFAULT, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
$image->scaleDown(640);
$r = self::store($image, $user['uid'], 0, $resource_id, $filename, $album, 1, self::DEFAULT, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if ($r) {
$smallest = 1;
}
}
if ($width > 320 || $height > 320) {
$Image->scaleDown(320);
$r = self::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 2, self::DEFAULT, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
$image->scaleDown(320);
$r = self::store($image, $user['uid'], 0, $resource_id, $filename, $album, 2, self::DEFAULT, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if ($r && ($smallest == 0)) {
$smallest = 2;
}
@ -1105,8 +1129,8 @@ class Photo
$picture['height'] = $photo['height'];
$picture['type'] = $photo['type'];
$picture['albumpage'] = DI::baseUrl() . '/photos/' . $user['nickname'] . '/image/' . $resource_id;
$picture['picture'] = DI::baseUrl() . '/photo/{$resource_id}-0.' . $Image->getExt();
$picture['preview'] = DI::baseUrl() . '/photo/{$resource_id}-{$smallest}.' . $Image->getExt();
$picture['picture'] = DI::baseUrl() . '/photo/{$resource_id}-0.' . $image->getExt();
$picture['preview'] = DI::baseUrl() . '/photo/{$resource_id}-{$smallest}.' . $image->getExt();
Logger::info('upload done', ['picture' => $picture]);
return $picture;
@ -1139,10 +1163,10 @@ class Photo
return '';
}
$Image = $data['image'];
$image = $data['image'];
$filename = $data['filename'];
$width = $Image->getWidth();
$height = $Image->getHeight();
$width = $image->getWidth();
$height = $image->getHeight();
$resource_id = self::newResource();
$album = DI::l10n()->t(self::PROFILE_PHOTOS);
@ -1151,28 +1175,28 @@ class Photo
logger::info('starting new profile image upload');
if ($width > 300 || $height > 300) {
$Image->scaleDown(300);
$image->scaleDown(300);
}
$r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 4, self::USER_AVATAR);
$r = self::store($image, $uid, 0, $resource_id, $filename, $album, 4, self::USER_AVATAR);
if (!$r) {
logger::notice('profile image upload with scale 4 (300) failed');
}
if ($width > 80 || $height > 80) {
$Image->scaleDown(80);
$image->scaleDown(80);
}
$r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 5, self::USER_AVATAR);
$r = self::store($image, $uid, 0, $resource_id, $filename, $album, 5, self::USER_AVATAR);
if (!$r) {
logger::notice('profile image upload with scale 5 (80) failed');
}
if ($width > 48 || $height > 48) {
$Image->scaleDown(48);
$image->scaleDown(48);
}
$r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 6, self::USER_AVATAR);
$r = self::store($image, $uid, 0, $resource_id, $filename, $album, 6, self::USER_AVATAR);
if (!$r) {
logger::notice('profile image upload with scale 6 (48) failed');
}
@ -1217,19 +1241,19 @@ class Photo
return '';
}
$Image = $data['image'];
$image = $data['image'];
$filename = $data['filename'];
$width = $Image->getWidth();
$height = $Image->getHeight();
$width = $image->getWidth();
$height = $image->getHeight();
$resource_id = self::newResource();
$album = DI::l10n()->t(self::BANNER_PHOTOS);
if ($width > 960) {
$Image->scaleDown(960);
$image->scaleDown(960);
}
$r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 3, self::USER_BANNER);
$r = self::store($image, $uid, 0, $resource_id, $filename, $album, 3, self::USER_BANNER);
if (!$r) {
logger::notice('profile banner upload with scale 3 (960) failed');
}
@ -1247,3 +1271,4 @@ class Photo
return $resource_id;
}
}

View file

@ -39,7 +39,7 @@ class Post
* @return int ID of inserted post
* @throws \Exception
*/
public static function insert(int $uri_id, array $data = [])
public static function insert(int $uri_id, array $data = []): int
{
if (empty($uri_id)) {
throw new BadMethodCallException('Empty URI_id');
@ -107,8 +107,10 @@ class Post
* @param object $stmt statement object
* @param bool $do_close
* @return array Data array
* @todo Find proper type-hint for $stmt and maybe avoid boolean
*/
public static function toArray($stmt, $do_close = true) {
public static function toArray($stmt, bool $do_close = true)
{
if (is_bool($stmt)) {
return $stmt;
}
@ -131,7 +133,8 @@ class Post
* @return boolean Are there rows for that condition?
* @throws \Exception
*/
public static function exists($condition) {
public static function exists(array $condition): bool
{
return DBA::exists('post-user-view', $condition);
}
@ -151,7 +154,7 @@ class Post
* $count = Post::count($condition);
* @throws \Exception
*/
public static function count(array $condition = [], array $params = [])
public static function count(array $condition = [], array $params = []): int
{
return DBA::count('post-user-view', $condition, $params);
}
@ -172,7 +175,7 @@ class Post
* $count = Post::count($condition);
* @throws \Exception
*/
public static function countThread(array $condition = [], array $params = [])
public static function countThread(array $condition = [], array $params = []): int
{
return DBA::count('post-thread-user-view', $condition, $params);
}
@ -193,7 +196,7 @@ class Post
* $count = Post::count($condition);
* @throws \Exception
*/
public static function countPosts(array $condition = [], array $params = [])
public static function countPosts(array $condition = [], array $params = []): int
{
return DBA::count('post-view', $condition, $params);
}
@ -209,7 +212,7 @@ class Post
* @throws \Exception
* @see DBA::select
*/
public static function selectFirst(array $fields = [], array $condition = [], $params = [])
public static function selectFirst(array $fields = [], array $condition = [], array $params = [])
{
$params['limit'] = 1;
@ -234,7 +237,7 @@ class Post
* @throws \Exception
* @see DBA::select
*/
public static function selectFirstPost(array $fields = [], array $condition = [], $params = [])
public static function selectFirstPost(array $fields = [], array $condition = [], array $params = [])
{
$params['limit'] = 1;
@ -259,7 +262,7 @@ class Post
* @throws \Exception
* @see DBA::select
*/
public static function selectFirstThread(array $fields = [], array $condition = [], $params = [])
public static function selectFirstThread(array $fields = [], array $condition = [], array $params = [])
{
$params['limit'] = 1;
@ -284,7 +287,7 @@ class Post
* @return array
* @throws \Exception
*/
public static function selectToArray(array $fields = [], array $condition = [], $params = [])
public static function selectToArray(array $fields = [], array $condition = [], array $params = [])
{
$result = self::select($fields, $condition, $params);
@ -312,7 +315,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
private static function selectView(string $view, array $selected = [], array $condition = [], $params = [])
private static function selectView(string $view, array $selected = [], array $condition = [], array $params = [])
{
if (empty($selected)) {
$selected = array_merge(Item::DISPLAY_FIELDLIST, Item::ITEM_FIELDLIST);
@ -337,7 +340,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
public static function select(array $selected = [], array $condition = [], $params = [])
public static function select(array $selected = [], array $condition = [], array $params = [])
{
return self::selectView('post-user-view', $selected, $condition, $params);
}
@ -352,7 +355,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
public static function selectPosts(array $selected = [], array $condition = [], $params = [])
public static function selectPosts(array $selected = [], array $condition = [], array $params = [])
{
return self::selectView('post-view', $selected, $condition, $params);
}
@ -367,7 +370,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
public static function selectThread(array $selected = [], array $condition = [], $params = [])
public static function selectThread(array $selected = [], array $condition = [], array $params = [])
{
return self::selectView('post-thread-user-view', $selected, $condition, $params);
}
@ -384,7 +387,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
private static function selectViewForUser(string $view, $uid, array $selected = [], array $condition = [], $params = [])
private static function selectViewForUser(string $view, int $uid, array $selected = [], array $condition = [], array $params = [])
{
if (empty($selected)) {
$selected = Item::DISPLAY_FIELDLIST;
@ -425,7 +428,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
public static function selectForUser($uid, array $selected = [], array $condition = [], $params = [])
public static function selectForUser(int $uid, array $selected = [], array $condition = [], array $params = [])
{
return self::selectViewForUser('post-user-view', $uid, $selected, $condition, $params);
}
@ -441,7 +444,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
public static function selectPostsForUser($uid, array $selected = [], array $condition = [], $params = [])
public static function selectPostsForUser(int $uid, array $selected = [], array $condition = [], array $params = [])
{
return self::selectViewForUser('post-view', $uid, $selected, $condition, $params);
}
@ -457,7 +460,7 @@ class Post
* @return boolean|object
* @throws \Exception
*/
public static function selectThreadForUser($uid, array $selected = [], array $condition = [], $params = [])
public static function selectThreadForUser(int $uid, array $selected = [], array $condition = [], array $params = [])
{
return self::selectViewForUser('post-thread-user-view', $uid, $selected, $condition, $params);
}
@ -473,7 +476,7 @@ class Post
* @throws \Exception
* @see DBA::select
*/
public static function selectFirstForUser($uid, array $selected = [], array $condition = [], $params = [])
public static function selectFirstForUser(int $uid, array $selected = [], array $condition = [], array $params = [])
{
$params['limit'] = 1;
@ -640,7 +643,7 @@ class Post
* @return boolean was the delete successful?
* @throws \Exception
*/
public static function delete(array $conditions, array $options = [])
public static function delete(array $conditions, array $options = []): bool
{
return DBA::delete('post', $conditions, $options);
}

View file

@ -109,7 +109,7 @@ class Media
* @param array $media
* @return array cleaned media array
*/
private static function unsetEmptyFields(array $media)
private static function unsetEmptyFields(array $media): array
{
$fields = ['mimetype', 'height', 'width', 'size', 'preview', 'preview-height', 'preview-width', 'description'];
foreach ($fields as $field) {
@ -145,7 +145,7 @@ class Media
* @param string $title
* @return string "[attach]" element
*/
public static function getAttachElement(string $href, int $length, string $type, string $title = '')
public static function getAttachElement(string $href, int $length, string $type, string $title = ''): string
{
$media = self::fetchAdditionalData(['type' => self::DOCUMENT, 'url' => $href,
'size' => $length, 'mimetype' => $type, 'description' => $title]);
@ -160,7 +160,7 @@ class Media
* @param array $media
* @return array media array with additional data
*/
public static function fetchAdditionalData(array $media)
public static function fetchAdditionalData(array $media): array
{
if (Network::isLocalLink($media['url'])) {
$media = self::fetchLocalData($media);
@ -235,7 +235,7 @@ class Media
* @param array $media
* @return array media with added data
*/
private static function fetchLocalData(array $media)
private static function fetchLocalData(array $media): array
{
if (!preg_match('|.*?/photo/(.*[a-fA-F0-9])\-(.*[0-9])\..*[\w]|', $media['url'] ?? '', $matches)) {
return $media;
@ -266,7 +266,7 @@ class Media
* @param array $data
* @return array data array with the detected type
*/
public static function addType(array $data)
public static function addType(array $data): array
{
if (empty($data['mimetype'])) {
Logger::info('No MimeType provided', ['media' => $data]);
@ -318,7 +318,7 @@ class Media
* @param string $preview Preview picture
* @return boolean
*/
private static function isPictureLink(string $page, string $preview)
private static function isPictureLink(string $page, string $preview): bool
{
return preg_match('#/photos/.*/image/#ism', $page) && preg_match('#/photo/.*-1\.#ism', $preview);
}
@ -330,7 +330,7 @@ class Media
* @param string $body
* @return string Body without media links
*/
public static function insertFromBody(int $uriid, string $body)
public static function insertFromBody(int $uriid, string $body): string
{
// Simplify image codes
$unshared_body = $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
@ -413,6 +413,7 @@ class Media
*
* @param integer $uriid
* @param string $body
* @return void
*/
public static function insertFromRelevantUrl(int $uriid, string $body)
{
@ -448,6 +449,7 @@ class Media
*
* @param integer $uriid
* @param string $body
* @return void
*/
public static function insertFromAttachmentData(int $uriid, string $body)
{
@ -506,9 +508,9 @@ class Media
/**
* Retrieves the media attachments associated with the provided item ID.
*
* @param int $uri_id
* @param array $types
* @return array
* @param int $uri_id URI id
* @param array $types Media types
* @return array|bool Array on success, false on error
* @throws \Exception
*/
public static function getByURIId(int $uri_id, array $types = [])
@ -525,12 +527,12 @@ class Media
/**
* Checks if media attachments are associated with the provided item ID.
*
* @param int $uri_id
* @param array $types
* @return array
* @param int $uri_id URI id
* @param array $types Media types
* @return bool Whether media attachment exists
* @throws \Exception
*/
public static function existsByURIId(int $uri_id, array $types = [])
public static function existsByURIId(int $uri_id, array $types = []): bool
{
$condition = ['uri-id' => $uri_id];
@ -544,13 +546,13 @@ class Media
/**
* Split the attachment media in the three segments "visual", "link" and "additional"
*
* @param int $uri_id
* @param string $guid
* @param int $uri_id URI id
* @param string $guid GUID
* @param array $links list of links that shouldn't be added
* @param bool $has_media
* @return array attachments
*/
public static function splitAttachments(int $uri_id, string $guid = '', array $links = [], bool $has_media = true)
public static function splitAttachments(int $uri_id, string $guid = '', array $links = [], bool $has_media = true): array
{
$attachments = ['visual' => [], 'link' => [], 'additional' => []];
@ -648,7 +650,7 @@ class Media
* @param string $body
* @return string body
*/
public static function addAttachmentsToBody(int $uriid, string $body = '')
public static function addAttachmentsToBody(int $uriid, string $body = ''): string
{
if (empty($body)) {
$item = Post::selectFirst(['body'], ['uri-id' => $uriid]);
@ -701,7 +703,7 @@ class Media
* @param string $size One of the Proxy::SIZE_* constants
* @return string preview link
*/
public static function getPreviewUrlForId(int $id, string $size = ''):string
public static function getPreviewUrlForId(int $id, string $size = ''): string
{
$url = DI::baseUrl() . '/photo/preview/';
switch ($size) {
@ -731,7 +733,7 @@ class Media
* @param string $size One of the Proxy::SIZE_* constants
* @return string media link
*/
public static function getUrlForId(int $id, string $size = ''):string
public static function getUrlForId(int $id, string $size = ''): string
{
$url = DI::baseUrl() . '/photo/media/';
switch ($size) {

View file

@ -54,10 +54,10 @@ class Profile
*
* @param integer User ID
*
* @return array Profile data
* @return array|bool Profile data or false on error
* @throws \Exception
*/
public static function getByUID($uid)
public static function getByUID(int $uid)
{
return DBA::selectFirst('profile', [], ['uid' => $uid]);
}
@ -69,7 +69,7 @@ class Profile
* @param int $id The contact owner ID
* @param array $fields The selected fields
*
* @return array Profile data for the ID
* @return array|bool Profile data for the ID or false on error
* @throws \Exception
*/
public static function getById(int $uid, int $id, array $fields = [])
@ -81,7 +81,7 @@ class Profile
* Returns profile data for the contact owner
*
* @param int $uid The User ID
* @param array $fields The fields to retrieve
* @param array|bool $fields The fields to retrieve or false on error
*
* @return array Array of profile data
* @throws \Exception
@ -94,9 +94,9 @@ class Profile
/**
* Update a profile entry and distribute the changes if needed
*
* @param array $fields
* @param integer $uid
* @return boolean
* @param array $fields Profile fields to update
* @param integer $uid User id
* @return boolean Whether update was successful
*/
public static function update(array $fields, int $uid): bool
{
@ -136,8 +136,10 @@ class Profile
/**
* Publish a changed profile
* @param int $uid
*
* @param int $uid User id
* @param bool $force Force publishing to the directory
* @return void
*/
public static function publishUpdate(int $uid, bool $force = false)
{
@ -163,7 +165,7 @@ class Profile
*
* @return string Location string
*/
public static function formatLocation(array $profile)
public static function formatLocation(array $profile): string
{
$location = '';
@ -237,7 +239,7 @@ class Profile
if (!local_user()) {
$a->setCurrentTheme($profile['theme']);
$a->setCurrentMobileTheme(DI::pConfig()->get($a->getProfileOwner(), 'system', 'mobile_theme'));
$a->setCurrentMobileTheme(DI::pConfig()->get($a->getProfileOwner(), 'system', 'mobile_theme') ?? '');
}
/*

View file

@ -34,9 +34,10 @@ class PushSubscriber
*
* @param integer $uid User ID
* @param int $default_priority
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function publishFeed($uid, $default_priority = PRIORITY_HIGH)
public static function publishFeed(int $uid, int $default_priority = PRIORITY_HIGH)
{
$condition = ['push' => 0, 'uid' => $uid];
DBA::update('push_subscriber', ['push' => 1, 'next_try' => DBA::NULL_DATETIME], $condition);
@ -48,9 +49,10 @@ class PushSubscriber
* start workers to transmit the feed data
*
* @param int $default_priority
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function requeue($default_priority = PRIORITY_HIGH)
public static function requeue(int $default_priority = PRIORITY_HIGH)
{
// We'll push to each subscriber that has push > 0,
// i.e. there has been an update (set in notifier.php).
@ -80,9 +82,10 @@ class PushSubscriber
* @param string $hub_callback Callback address
* @param string $hub_topic Feed topic
* @param string $hub_secret Subscription secret
* @return void
* @throws \Exception
*/
public static function renew($uid, $nick, $subscribe, $hub_callback, $hub_topic, $hub_secret)
public static function renew(int $uid, string $nick, int $subscribe, string $hub_callback, string $hub_topic, string $hub_secret)
{
// fetch the old subscription if it exists
$subscriber = DBA::selectFirst('push_subscriber', ['last_update', 'push'], ['callback_url' => $hub_callback]);
@ -119,9 +122,10 @@ class PushSubscriber
* Delay the push subscriber
*
* @param integer $id Subscriber ID
* @return void
* @throws \Exception
*/
public static function delay($id)
public static function delay(int $id)
{
$subscriber = DBA::selectFirst('push_subscriber', ['push', 'callback_url', 'renewed', 'nickname'], ['id' => $id]);
if (!DBA::isResult($subscriber)) {
@ -158,9 +162,10 @@ class PushSubscriber
*
* @param integer $id Subscriber ID
* @param string $last_update Date of last transmitted item
* @return void
* @throws \Exception
*/
public static function reset($id, $last_update)
public static function reset(int $id, string $last_update)
{
$subscriber = DBA::selectFirst('push_subscriber', ['callback_url', 'nickname'], ['id' => $id]);
if (!DBA::isResult($subscriber)) {

View file

@ -134,7 +134,7 @@ class User
*
* @return array system account
*/
public static function getSystemAccount()
public static function getSystemAccount(): array
{
$system = Contact::selectFirst([], ['self' => true, 'uid' => 0]);
if (!DBA::isResult($system)) {
@ -244,7 +244,7 @@ class User
*
* @return string actor account name
*/
public static function getActorName()
public static function getActorName(): string
{
$system_actor_name = DI::config()->get('system', 'actor_name');
if (!empty($system_actor_name)) {
@ -278,7 +278,7 @@ class User
* @return boolean
* @throws Exception
*/
public static function exists($uid)
public static function exists(int $uid): bool
{
return DBA::exists('user', ['uid' => $uid]);
}
@ -289,7 +289,7 @@ class User
* @return array|boolean User record if it exists, false otherwise
* @throws Exception
*/
public static function getById($uid, array $fields = [])
public static function getById(int $uid, array $fields = [])
{
return !empty($uid) ? DBA::selectFirst('user', $fields, ['uid' => $uid]) : [];
}
@ -321,7 +321,7 @@ class User
* @return array|boolean User record if it exists, false otherwise
* @throws Exception
*/
public static function getByNickname($nickname, array $fields = [])
public static function getByNickname(string $nickname, array $fields = [])
{
return DBA::selectFirst('user', $fields, ['nickname' => $nickname]);
}
@ -334,7 +334,7 @@ class User
* @return integer user id
* @throws Exception
*/
public static function getIdForURL(string $url)
public static function getIdForURL(string $url): int
{
// Avoid database queries when the local node hostname isn't even part of the url.
if (!Contact::isLocal($url)) {
@ -380,7 +380,7 @@ class User
* @param array $fields
* @return array user
*/
public static function getFirstAdmin(array $fields = [])
public static function getFirstAdmin(array $fields = []) : array
{
if (!empty(DI::config()->get('config', 'admin_nickname'))) {
return self::getByNickname(DI::config()->get('config', 'admin_nickname'), $fields);
@ -469,7 +469,7 @@ class User
* @return boolean|array
* @throws Exception
*/
public static function getOwnerDataByNick($nick)
public static function getOwnerDataByNick(string $nick)
{
$user = DBA::selectFirst('user', ['uid'], ['nickname' => $nick]);
@ -488,7 +488,7 @@ class User
* @return int group id
* @throws Exception
*/
public static function getDefaultGroup($uid)
public static function getDefaultGroup(int $uid): int
{
$user = DBA::selectFirst('user', ['def_gid'], ['uid' => $uid]);
if (DBA::isResult($user)) {
@ -512,7 +512,7 @@ class User
* @throws HTTPException\ForbiddenException
* @throws HTTPException\NotFoundException
*/
public static function getIdFromPasswordAuthentication($user_info, $password, $third_party = false)
public static function getIdFromPasswordAuthentication($user_info, string $password, bool $third_party = false)
{
// Addons registered with the "authenticate" hook may create the user on the
// fly. `getAuthenticationInfo` will fail if the user doesn't exist yet. If
@ -580,7 +580,7 @@ class User
* @return int User Id if authentication is successful
* @throws HTTPException\ForbiddenException
*/
public static function getIdFromAuthenticateHooks($username, $password)
public static function getIdFromAuthenticateHooks(string $username, string $password): int
{
$addon_auth = [
'username' => $username,
@ -613,7 +613,7 @@ class User
* - User array with at least the uid and the hashed password
*
* @param mixed $user_info
* @return array
* @return array|null Null if not found/determined
* @throws HTTPException\NotFoundException
*/
public static function getAuthenticationInfo($user_info)
@ -671,7 +671,7 @@ class User
* @return string
* @throws Exception
*/
public static function generateNewPassword()
public static function generateNewPassword(): string
{
return ucfirst(Strings::getRandomName(8)) . random_int(1000, 9999);
}
@ -683,7 +683,7 @@ class User
* @return bool
* @throws Exception
*/
public static function isPasswordExposed($password)
public static function isPasswordExposed(string $password): bool
{
$cache = new CacheItemPool();
$cache->changeConfig([
@ -712,7 +712,7 @@ class User
* @param string $password
* @return string
*/
private static function hashPasswordLegacy($password)
private static function hashPasswordLegacy(string $password): string
{
return hash('whirlpool', $password);
}
@ -724,7 +724,7 @@ class User
* @return string
* @throws Exception
*/
public static function hashPassword($password)
public static function hashPassword(string $password): string
{
if (!trim($password)) {
throw new Exception(DI::l10n()->t('Password can\'t be empty'));
@ -741,7 +741,7 @@ class User
* @return bool
* @throws Exception
*/
public static function updatePassword($uid, $password)
public static function updatePassword(int $uid, string $password): bool
{
$password = trim($password);
@ -771,7 +771,7 @@ class User
* @return bool
* @throws Exception
*/
private static function updatePasswordHashed($uid, $pasword_hashed)
private static function updatePasswordHashed(int $uid, string $pasword_hashed): bool
{
$fields = [
'password' => $pasword_hashed,
@ -792,7 +792,7 @@ class User
* @param string $nickname The nickname that should be checked
* @return boolean True is the nickname is blocked on the node
*/
public static function isNicknameBlocked($nickname)
public static function isNicknameBlocked(string $nickname): bool
{
$forbidden_nicknames = DI::config()->get('system', 'forbidden_nicknames', '');
if (!empty($forbidden_nicknames)) {
@ -829,7 +829,7 @@ class User
* @return string avatar link
* @throws Exception
*/
public static function getAvatarUrl(array $user, string $size = ''):string
public static function getAvatarUrl(array $user, string $size = ''): string
{
if (empty($user['nickname'])) {
DI::logger()->warning('Missing user nickname key', ['trace' => System::callstack(20)]);
@ -871,7 +871,7 @@ class User
* @return string banner link
* @throws Exception
*/
public static function getBannerUrl(array $user):string
public static function getBannerUrl(array $user): string
{
if (empty($user['nickname'])) {
DI::logger()->warning('Missing user nickname key', ['trace' => System::callstack(20)]);
@ -913,7 +913,7 @@ class User
* @throws ImagickException
* @throws Exception
*/
public static function create(array $data)
public static function create(array $data): array
{
$return = ['user' => null, 'password' => ''];
@ -1255,7 +1255,7 @@ class User
* @throws Exception
*/
public static function block(int $uid, bool $block = true)
public static function block(int $uid, bool $block = true): bool
{
return DBA::update('user', ['blocked' => $block], ['uid' => $uid]);
}
@ -1270,7 +1270,7 @@ class User
* @throws HTTPException\InternalServerErrorException
* @throws Exception
*/
public static function allow(string $hash)
public static function allow(string $hash): bool
{
$register = Register::getByHash($hash);
if (!DBA::isResult($register)) {
@ -1316,7 +1316,7 @@ class User
* @return bool True, if the deny was successfull
* @throws Exception
*/
public static function deny(string $hash)
public static function deny(string $hash): bool
{
$register = Register::getByHash($hash);
if (!DBA::isResult($register)) {
@ -1348,7 +1348,7 @@ class User
* @throws ErrorException
* @throws ImagickException
*/
public static function createMinimal(string $name, string $email, string $nick, string $lang = L10n::DEFAULT)
public static function createMinimal(string $name, string $email, string $nick, string $lang = L10n::DEFAULT): bool
{
if (empty($name) ||
empty($email) ||
@ -1418,7 +1418,7 @@ class User
* @return NULL|boolean from notification() and email() inherited
* @throws HTTPException\InternalServerErrorException
*/
public static function sendRegisterPendingEmail($user, $sitename, $siteurl, $password)
public static function sendRegisterPendingEmail(array $user, string $sitename, string $siteurl, string $password)
{
$body = Strings::deindent(DI::l10n()->t(
'
@ -1461,7 +1461,7 @@ class User
* @return NULL|boolean from notification() and email() inherited
* @throws HTTPException\InternalServerErrorException
*/
public static function sendRegisterOpenEmail(L10n $l10n, $user, $sitename, $siteurl, $password)
public static function sendRegisterOpenEmail(L10n $l10n, array $user, string $sitename, string $siteurl, string $password)
{
$preamble = Strings::deindent($l10n->t(
'
@ -1520,7 +1520,7 @@ class User
* @return bool
* @throws HTTPException\InternalServerErrorException
*/
public static function remove(int $uid)
public static function remove(int $uid): bool
{
if (empty($uid)) {
return false;
@ -1574,7 +1574,7 @@ class User
* ]
* @throws Exception
*/
public static function identities($uid)
public static function identities(int $uid): array
{
if (empty($uid)) {
return [];
@ -1646,7 +1646,7 @@ class User
* @param int $uid
* @return bool
*/
public static function hasIdentities(int $uid):bool
public static function hasIdentities(int $uid): bool
{
if (empty($uid)) {
return false;
@ -1679,7 +1679,7 @@ class User
*
* @throws Exception
*/
public static function getStatistics()
public static function getStatistics(): array
{
$statistics = [
'total_users' => 0,
@ -1732,10 +1732,10 @@ class User
* @param string $order Order of the user list (Default is 'contact.name')
* @param bool $descending Order direction (Default is ascending)
*
* @return array The list of the users
* @return array|bool The list of the users
* @throws Exception
*/
public static function getList($start = 0, $count = Pager::ITEMS_PER_PAGE, $type = 'all', $order = 'name', bool $descending = false)
public static function getList(int $start = 0, int $count = Pager::ITEMS_PER_PAGE, string $type = 'all', string $order = 'name', bool $descending = false)
{
$param = ['limit' => [$start, $count], 'order' => [$order => $descending]];
$condition = [];

View file

@ -48,7 +48,7 @@ class BaseSettings extends BaseModule
'label' => DI::l10n()->t('Two-factor authentication'),
'url' => 'settings/2fa',
'selected' => ((DI::args()->getArgc() > 1) && (DI::args()->getArgv()[1] === '2fa') ? 'active' : ''),
'accesskey' => 'o',
'accesskey' => '2',
];
$tabs[] = [

View file

@ -59,12 +59,13 @@ class Notify extends BaseModule
}
}
private static function dispatchPublic($postdata)
private static function dispatchPublic(array $postdata)
{
$msg = Diaspora::decodeRaw($postdata, '', true);
if (!$msg) {
if (!is_array($msg)) {
// We have to fail silently to be able to hand it over to the salmon parser
return false;
Logger::warning('Diaspora::decodeRaw() has failed for some reason.');
return;
}
// Fetch the corresponding public contact
@ -88,10 +89,10 @@ class Notify extends BaseModule
System::xmlExit($ret, 'Done');
}
private static function dispatchPrivate($user, $postdata)
private static function dispatchPrivate(array $user, string $postdata)
{
$msg = Diaspora::decodeRaw($postdata, $user['prvkey'] ?? '');
if (!$msg) {
if (!is_array($msg)) {
System::xmlExit(4, 'Unable to parse message');
}

View file

@ -34,6 +34,6 @@ class Poll extends BaseModule
protected function rawContent(array $request = [])
{
$last_update = $request['last_update'] ?? '';
System::httpExit(OStatus::feed($this->parameters['nickname'], $last_update, 10), Response::TYPE_ATOM);
System::httpExit(OStatus::feed($this->parameters['nickname'], $last_update, 10) ?? '', Response::TYPE_ATOM);
}
}

View file

@ -112,7 +112,7 @@ class Directory extends BaseModule
*
* @throws \Exception
*/
public static function formatEntry(array $contact, $photo_size = 'photo')
public static function formatEntry(array $contact, string $photo_size = 'photo'): array
{
$itemurl = (($contact['addr'] != "") ? $contact['addr'] : $contact['url']);
@ -166,7 +166,7 @@ class Directory extends BaseModule
'img_hover' => $contact['name'],
'name' => $contact['name'],
'details' => $details,
'account_type' => Model\Contact::getAccountType($contact['contact-type']),
'account_type' => Model\Contact::getAccountType($contact['contact-type'] ?? 0),
'profile' => $profile,
'location' => $location_e,
'tags' => $contact['pub_keywords'],

View file

@ -128,7 +128,7 @@ class Photo extends BaseModule
throw new HTTPException\NotFoundException(DI::l10n()->t('The Photo is not available.'));
}
$photo = self::getPhotoByid($id, $this->parameters['type'], $customsize ?: Proxy::PIXEL_SMALL);
$photo = self::getPhotoById($id, $this->parameters['type'], $customsize ?: Proxy::PIXEL_SMALL);
} else {
$photoid = pathinfo($this->parameters['name'], PATHINFO_FILENAME);
$scale = 0;
@ -228,10 +228,18 @@ class Photo extends BaseModule
System::exit();
}
private static function getPhotoByid(int $id, $type, $customsize)
/**
* Fetches photo record by given id number, type and custom size
*
* @param int $id Photo id
* @param string $type Photo type
* @param int $customsize Custom size (?)
* @return array|bool Array on success, false on error
*/
private static function getPhotoById(int $id, string $type, int $customsize)
{
switch($type) {
case "preview":
case 'preview':
$media = DBA::selectFirst('post-media', ['preview', 'url', 'mimetype', 'type', 'uri-id'], ['id' => $id]);
if (empty($media)) {
return false;
@ -251,7 +259,7 @@ class Photo extends BaseModule
}
return MPhoto::createPhotoForExternalResource($url, (int)local_user(), $media['mimetype']);
case "media":
case 'media':
$media = DBA::selectFirst('post-media', ['url', 'mimetype', 'uri-id'], ['id' => $id, 'type' => Post\Media::IMAGE]);
if (empty($media)) {
return false;
@ -262,15 +270,15 @@ class Photo extends BaseModule
}
return MPhoto::createPhotoForExternalResource($media['url'], (int)local_user(), $media['mimetype']);
case "link":
case 'link':
$link = DBA::selectFirst('post-link', ['url', 'mimetype'], ['id' => $id]);
if (empty($link)) {
return false;
}
return MPhoto::createPhotoForExternalResource($link['url'], (int)local_user(), $link['mimetype']);
case "contact":
$fields = ['uid', 'url', 'nurl', 'avatar', 'photo', 'xmpp', 'addr', 'network', 'failed', 'updated'];
case 'contact':
$fields = ['uid', 'uri-id', 'url', 'nurl', 'avatar', 'photo', 'xmpp', 'addr', 'network', 'failed', 'updated'];
$contact = Contact::getById($id, $fields);
if (empty($contact)) {
return false;
@ -287,7 +295,7 @@ class Photo extends BaseModule
} else {
$scale = 4;
}
$photo = MPhoto::selectFirst([], ["scale" => $scale, "uid" => $contact['uid'], "profile" => 1]);
$photo = MPhoto::selectFirst([], ['scale' => $scale, 'uid' => $contact['uid'], 'profile' => 1]);
if (!empty($photo)) {
return $photo;
}
@ -330,7 +338,7 @@ class Photo extends BaseModule
}
if ($update) {
Logger::info('Invalid file, contact update initiated', ['cid' => $id, 'url' => $contact['url'], 'avatar' => $url]);
Worker::add(PRIORITY_LOW, "UpdateContact", $id);
Worker::add(PRIORITY_LOW, 'UpdateContact', $id);
} else {
Logger::info('Invalid file', ['cid' => $id, 'url' => $contact['url'], 'avatar' => $url]);
}
@ -352,7 +360,7 @@ class Photo extends BaseModule
}
}
return MPhoto::createPhotoForExternalResource($url, 0, $mimetext);
case "header":
case 'header':
$fields = ['uid', 'url', 'header', 'network', 'gsid'];
$contact = Contact::getById($id, $fields);
if (empty($contact)) {
@ -367,37 +375,37 @@ class Photo extends BaseModule
$url = Contact::getDefaultHeader($contact);
}
return MPhoto::createPhotoForExternalResource($url);
case "banner":
$photo = MPhoto::selectFirst([], ["scale" => 3, 'uid' => $id, 'photo-type' => MPhoto::USER_BANNER]);
case 'banner':
$photo = MPhoto::selectFirst([], ['scale' => 3, 'uid' => $id, 'photo-type' => MPhoto::USER_BANNER]);
if (!empty($photo)) {
return $photo;
}
return MPhoto::createPhotoForExternalResource(DI::baseUrl() . '/images/friendica-banner.jpg');
case "profile":
case "custom":
case 'profile':
case 'custom':
$scale = 4;
break;
case "micro":
case 'micro':
$scale = 6;
break;
case "avatar":
case 'avatar':
default:
$scale = 5;
}
$photo = MPhoto::selectFirst([], ["scale" => $scale, "uid" => $id, "profile" => 1]);
$photo = MPhoto::selectFirst([], ['scale' => $scale, 'uid' => $id, 'profile' => 1]);
if (empty($photo)) {
$contact = DBA::selectFirst('contact', [], ['uid' => $id, 'self' => true]) ?: [];
switch($type) {
case "profile":
case "custom":
case 'profile':
case 'custom':
$default = Contact::getDefaultAvatar($contact, Proxy::SIZE_SMALL);
break;
case "micro":
case 'micro':
$default = Contact::getDefaultAvatar($contact, Proxy::SIZE_MICRO);
break;
case "avatar":
case 'avatar':
default:
$default = Contact::getDefaultAvatar($contact, Proxy::SIZE_THUMB);
}

View file

@ -33,14 +33,14 @@ interface ICanHandleHttpResponses
*
* @return string The Return Code
*/
public function getReturnCode();
public function getReturnCode(): string;
/**
* Returns the Content Type
*
* @return string the Content Type
*/
public function getContentType();
public function getContentType(): string;
/**
* Returns the headers
@ -55,21 +55,20 @@ interface ICanHandleHttpResponses
/**
* Returns all headers
* @see MessageInterface::getHeaders()
*
* @see MessageInterface::getHeaders()
* @return string[][]
*/
public function getHeaders();
/**
* Check if a specified header exists
*
* @see MessageInterface::hasHeader()
*
* @param string $field header field
*
* @return boolean "true" if header exists
*/
public function inHeader(string $field);
public function inHeader(string $field): bool;
/**
* Returns the headers as an associated array
@ -83,21 +82,22 @@ interface ICanHandleHttpResponses
/**
* @return bool
*/
public function isSuccess();
public function isSuccess(): bool;
/**
* @return string
*/
public function getUrl();
public function getUrl(): string;
/**
* @return string
*/
public function getRedirectUrl();
public function getRedirectUrl(): string;
/**
* @see MessageInterface::getBody()
* Getter for body
*
* @see MessageInterface::getBody()
* @return string
*/
public function getBody();
@ -105,20 +105,20 @@ interface ICanHandleHttpResponses
/**
* @return boolean
*/
public function isRedirectUrl();
public function isRedirectUrl(): bool;
/**
* @return integer
*/
public function getErrorNumber();
public function getErrorNumber(): int;
/**
* @return string
*/
public function getError();
public function getError(): string;
/**
* @return boolean
*/
public function isTimeout();
public function isTimeout(): bool;
}

View file

@ -1445,7 +1445,7 @@ class Probe
* @return array|bool OStatus data or "false" on error or "true" on short mode
* @throws HTTPException\InternalServerErrorException
*/
private static function ostatus($webfinger, $short = false)
private static function ostatus(array $webfinger, bool $short = false)
{
$data = [];

View file

@ -1008,7 +1008,7 @@ class Post
/**
* @return string
*/
private function getRedirectUrl()
private function getRedirectUrl(): string
{
return $this->redirect_url;
}

View file

@ -110,7 +110,7 @@ class ContactResult implements IResult
/**
* @return string
*/
public function getUrl()
public function getUrl(): string
{
return $this->url;
}

View file

@ -33,9 +33,9 @@ class ProfileFields extends BaseCollection
/**
* @param callable $callback
* @return ProfileFields
* @return ProfileFields (as an extended form of BaseCollection)
*/
public function map(callable $callback): ProfileFields
public function map(callable $callback): BaseCollection
{
return parent::map($callback);
}
@ -43,9 +43,9 @@ class ProfileFields extends BaseCollection
/**
* @param callable|null $callback
* @param int $flag
* @return ProfileFields
* @return ProfileFields as an extended version of BaseCollection
*/
public function filter(callable $callback = null, int $flag = 0): ProfileFields
public function filter(callable $callback = null, int $flag = 0): BaseCollection
{
return parent::filter($callback, $flag);
}

View file

@ -212,7 +212,7 @@ final class Activity
*
* @return bool True, if the activity is hidden
*/
public function isHidden(string $activity)
public function isHidden(string $activity): bool
{
foreach (self::HIDDEN_ACTIVITIES as $hiddenActivity) {
if ($this->match($activity, $hiddenActivity)) {
@ -231,7 +231,7 @@ final class Activity
*
* @return boolean
*/
public function match(string $haystack, string $needle)
public function match(string $haystack, string $needle): bool
{
return (($haystack === $needle) ||
((basename($needle) === $haystack) &&

View file

@ -104,12 +104,12 @@ class ActivityPub
* @return array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function fetchContent(string $url, int $uid = 0)
public static function fetchContent(string $url, int $uid = 0): array
{
return HTTPSignature::fetch($url, $uid);
}
private static function getAccountType($apcontact)
private static function getAccountType(array $apcontact): int
{
$accounttype = -1;
@ -146,7 +146,7 @@ class ActivityPub
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function probeProfile($url, $update = true)
public static function probeProfile(string $url, bool $update = true): array
{
$apcontact = APContact::getByURL($url, $update);
if (empty($apcontact)) {
@ -204,7 +204,7 @@ class ActivityPub
* @param integer $uid User ID
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function fetchOutbox($url, $uid)
public static function fetchOutbox(string $url, int $uid)
{
$data = self::fetchContent($url, $uid);
if (empty($data)) {
@ -235,7 +235,7 @@ class ActivityPub
* @param integer $uid Optional user id
* @return array Endpoint items
*/
public static function fetchItems(string $url, int $uid = 0)
public static function fetchItems(string $url, int $uid = 0): array
{
$data = self::fetchContent($url, $uid);
if (empty($data)) {
@ -268,7 +268,7 @@ class ActivityPub
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isSupportedByContactUrl($url, $update = null)
public static function isSupportedByContactUrl(string $url, $update = null)
{
return !empty(APContact::getByURL($url, $update));
}

View file

@ -71,7 +71,7 @@ class Processor
* @param array $languages
* @return string language JSON
*/
private static function processLanguages(array $languages)
private static function processLanguages(array $languages): string
{
$codes = array_keys($languages);
$lang = [];
@ -88,12 +88,13 @@ class Processor
/**
* Replaces emojis in the body
*
* @param array $emojis
* @param int $uri_id
* @param string $body
* @param array $emojis
*
* @return string with replaced emojis
*/
private static function replaceEmojis(int $uri_id, $body, array $emojis)
private static function replaceEmojis(int $uri_id, string $body, array $emojis): string
{
$body = strtr($body,
array_combine(
@ -143,7 +144,7 @@ class Processor
* @param array $activity
* @param array $item
*/
private static function storeAttachments($activity, $item)
private static function storeAttachments(array $activity, array $item)
{
if (empty($activity['attachments'])) {
return;
@ -160,7 +161,7 @@ class Processor
* @param array $activity
* @param array $item
*/
private static function storeQuestion($activity, $item)
private static function storeQuestion(array $activity, array $item)
{
if (empty($activity['question'])) {
return;
@ -191,7 +192,7 @@ class Processor
* @param array $activity Activity array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function updateItem($activity)
public static function updateItem(array $activity)
{
$item = Post::selectFirst(['uri', 'uri-id', 'thr-parent', 'gravity', 'post-type'], ['uri' => $activity['id']]);
if (!DBA::isResult($item)) {
@ -262,7 +263,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function createItem($activity)
public static function createItem(array $activity): array
{
$item = [];
$item['verb'] = Activity::POST;
@ -411,7 +412,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function deleteItem($activity)
public static function deleteItem(array $activity)
{
$owner = Contact::getIdForURL($activity['actor']);
@ -426,7 +427,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function addTag($activity)
public static function addTag(array $activity)
{
if (empty($activity['object_content']) || empty($activity['object_id'])) {
return;
@ -457,7 +458,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function createActivity($activity, $verb)
public static function createActivity(array $activity, string $verb)
{
$item = self::createItem($activity);
if (empty($item)) {
@ -561,7 +562,7 @@ class Processor
* @return int event id
* @throws \Exception
*/
public static function createEvent($activity, $item)
public static function createEvent(array $activity, array $item): int
{
$event['summary'] = HTML::toBBCode($activity['name'] ?: $activity['summary']);
$event['desc'] = HTML::toBBCode($activity['content']);
@ -605,7 +606,7 @@ class Processor
* @return array|bool Returns the item array or false if there was an unexpected occurrence
* @throws \Exception
*/
private static function processContent($activity, $item)
private static function processContent(array $activity, array $item)
{
if (!empty($activity['mediatype']) && ($activity['mediatype'] == 'text/markdown')) {
$item['title'] = strip_tags($activity['name']);
@ -615,8 +616,8 @@ class Processor
$content = $activity['content'];
} else {
// By default assume "text/html"
$item['title'] = HTML::toBBCode($activity['name']);
$content = HTML::toBBCode($activity['content']);
$item['title'] = HTML::toBBCode($activity['name'] ?? '');
$content = HTML::toBBCode($activity['content'] ?? '');
}
$item['title'] = trim(BBCode::toPlaintext($item['title']));
@ -650,7 +651,7 @@ class Processor
$content = self::removeImplicitMentionsFromBody($content, $parent);
}
$item['content-warning'] = HTML::toBBCode($activity['summary']);
$item['content-warning'] = HTML::toBBCode($activity['summary'] ?? '');
$item['raw-body'] = $item['body'] = $content;
}
@ -689,7 +690,7 @@ class Processor
* @param string $url message URL
* @return string with GUID
*/
private static function getGUIDByURL(string $url)
private static function getGUIDByURL(string $url): string
{
$parsed = parse_url($url);
@ -710,7 +711,7 @@ class Processor
* @param array $item
* @return boolean Is the message wanted?
*/
private static function isSolicitedMessage(array $activity, array $item)
private static function isSolicitedMessage(array $activity, array $item): bool
{
// The checks are split to improve the support when searching why a message was accepted.
if (count($activity['receiver']) != 1) {
@ -971,7 +972,7 @@ class Processor
* @return int|bool New mail table row id or false on error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function postMail($activity, $item)
private static function postMail(array $activity, array $item)
{
if (($item['gravity'] != GRAVITY_PARENT) && !DBA::exists('mail', ['uri' => $item['thr-parent'], 'uid' => $item['uid']])) {
Logger::info('Parent not found, mail will be discarded.', ['uid' => $item['uid'], 'uri' => $item['thr-parent']]);
@ -1112,7 +1113,7 @@ class Processor
* @return string fetched message URL
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function fetchMissingActivity(string $url, array $child = [], string $relay_actor = '', int $completion = Receiver::COMPLETION_MANUAL)
public static function fetchMissingActivity(string $url, array $child = [], string $relay_actor = '', int $completion = Receiver::COMPLETION_MANUAL): string
{
if (!empty($child['receiver'])) {
$uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']);
@ -1207,7 +1208,7 @@ class Processor
* @param string $id object ID
* @return boolean true if message is accepted
*/
private static function acceptIncomingMessage(array $activity, string $id)
private static function acceptIncomingMessage(array $activity, string $id): bool
{
if (empty($activity['as:object'])) {
Logger::info('No object field in activity - accepted', ['id' => $id]);
@ -1215,7 +1216,7 @@ class Processor
}
$replyto = JsonLD::fetchElement($activity['as:object'], 'as:inReplyTo', '@id');
$uriid = ItemURI::getIdByURI($replyto);
$uriid = ItemURI::getIdByURI($replyto ?? '');
if (Post::exists(['uri-id' => $uriid])) {
Logger::info('Post is a reply to an existing post - accepted', ['id' => $id, 'uri-id' => $uriid, 'replyto' => $replyto]);
return true;
@ -1224,7 +1225,7 @@ class Processor
$attributed_to = JsonLD::fetchElement($activity['as:object'], 'as:attributedTo', '@id');
$authorid = Contact::getIdForURL($attributed_to);
$body = HTML::toBBCode(JsonLD::fetchElement($activity['as:object'], 'as:content', '@value'));
$body = HTML::toBBCode(JsonLD::fetchElement($activity['as:object'], 'as:content', '@value') ?? '');
$messageTags = [];
$tags = Receiver::processTags(JsonLD::fetchElementArray($activity['as:object'], 'as:tag') ?? []);
@ -1247,7 +1248,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function followUser($activity)
public static function followUser(array $activity)
{
$uid = User::getIdForURL($activity['object_id']);
if (empty($uid)) {
@ -1325,7 +1326,7 @@ class Processor
* @param array $activity
* @throws \Exception
*/
public static function updatePerson($activity)
public static function updatePerson(array $activity)
{
if (empty($activity['object_id'])) {
return;
@ -1341,7 +1342,7 @@ class Processor
* @param array $activity
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function deletePerson($activity)
public static function deletePerson(array $activity)
{
if (empty($activity['object_id']) || empty($activity['actor'])) {
Logger::info('Empty object id or actor.');
@ -1368,7 +1369,7 @@ class Processor
* @param array $activity
* @throws \Exception
*/
public static function blockAccount($activity)
public static function blockAccount(array $activity)
{
$cid = Contact::getIdForURL($activity['actor']);
if (empty($cid)) {
@ -1391,7 +1392,7 @@ class Processor
* @param array $activity
* @throws \Exception
*/
public static function unblockAccount($activity)
public static function unblockAccount(array $activity)
{
$cid = Contact::getIdForURL($activity['actor']);
if (empty($cid)) {
@ -1415,7 +1416,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function acceptFollowUser($activity)
public static function acceptFollowUser(array $activity)
{
$uid = User::getIdForURL($activity['object_actor']);
if (empty($uid)) {
@ -1449,7 +1450,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function rejectFollowUser($activity)
public static function rejectFollowUser(array $activity)
{
$uid = User::getIdForURL($activity['object_actor']);
if (empty($uid)) {
@ -1482,7 +1483,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function undoActivity($activity)
public static function undoActivity(array $activity)
{
if (empty($activity['object_id'])) {
return;
@ -1507,7 +1508,7 @@ class Processor
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function undoFollowUser($activity)
public static function undoFollowUser(array $activity)
{
$uid = User::getIdForURL($activity['object_object']);
if (empty($uid)) {
@ -1542,7 +1543,7 @@ class Processor
* @param integer $cid Contact ID
* @throws \Exception
*/
private static function switchContact($cid)
private static function switchContact(int $cid)
{
$contact = DBA::selectFirst('contact', ['network', 'url'], ['id' => $cid]);
if (!DBA::isResult($contact) || in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN]) || Contact::isLocal($contact['url'])) {
@ -1562,7 +1563,7 @@ class Processor
* @return array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function getImplicitMentionList(array $parent)
private static function getImplicitMentionList(array $parent): array
{
$parent_terms = Tag::getByURIId($parent['uri-id'], [Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION]);
@ -1600,7 +1601,7 @@ class Processor
* @param array $parent
* @return string
*/
private static function removeImplicitMentionsFromBody(string $body, array $parent)
private static function removeImplicitMentionsFromBody(string $body, array $parent): string
{
if (DI::config()->get('system', 'disable_implicit_mentions')) {
return $body;

View file

@ -84,8 +84,9 @@ class Receiver
* @param $header
* @param integer $uid User ID
* @throws \Exception
* @todo Find type for $body/$header
*/
public static function processInbox($body, $header, $uid)
public static function processInbox($body, $header, int $uid)
{
$activity = json_decode($body, true);
if (empty($activity)) {
@ -220,11 +221,11 @@ class Receiver
* @param string $object_id Object ID of the the provided object
* @param integer $uid User ID
*
* @return string with object type
* @return string with object type or NULL
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function fetchObjectType($activity, $object_id, $uid = 0)
private static function fetchObjectType(array $activity, string $object_id, int $uid = 0)
{
if (!empty($activity['as:object'])) {
$object_type = JsonLD::fetchElement($activity['as:object'], '@type');
@ -268,7 +269,7 @@ class Receiver
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function prepareObjectData($activity, $uid, $push, &$trust_source)
public static function prepareObjectData(array $activity, int $uid, bool $push, bool &$trust_source): array
{
$id = JsonLD::fetchElement($activity, '@id');
if (!empty($id) && !$trust_source) {
@ -458,7 +459,7 @@ class Receiver
* @param array $receivers Array with receivers
* @return integer user id;
*/
public static function getFirstUserFromReceivers($receivers)
public static function getFirstUserFromReceivers(array $receivers): int
{
foreach ($receivers as $receiver) {
if (!empty($receiver)) {
@ -479,7 +480,7 @@ class Receiver
* @param array $signer The signer of the post
* @throws \Exception
*/
public static function processActivity($activity, string $body = '', int $uid = null, bool $trust_source = false, bool $push = false, array $signer = [])
public static function processActivity(array $activity, string $body = '', int $uid = null, bool $trust_source = false, bool $push = false, array $signer = [])
{
$type = JsonLD::fetchElement($activity, '@type');
if (!$type) {
@ -818,7 +819,7 @@ class Receiver
*
* @return int user id
*/
public static function getBestUserForActivity(array $activity)
public static function getBestUserForActivity(array $activity): int
{
$uid = 0;
$actor = JsonLD::fetchElement($activity, 'as:actor', '@id') ?? '';
@ -844,7 +845,8 @@ class Receiver
return $uid;
}
public static function getReceiverURL($activity)
// @TODO Missing documentation
public static function getReceiverURL(array $activity): array
{
$urls = [];
@ -876,9 +878,9 @@ class Receiver
* @return array with receivers (user id)
* @throws \Exception
*/
private static function getReceivers($activity, $actor, $tags = [], $fetch_unlisted = false)
private static function getReceivers(array $activity, string $actor, array $tags = [], bool $fetch_unlisted = false): array
{
$reply = $receivers = [];
$reply = $receivers = $profile = [];
// When it is an answer, we inherite the receivers from the parent
$replyto = JsonLD::fetchElement($activity, 'as:inReplyTo', '@id');
@ -1005,7 +1007,7 @@ class Receiver
* @return array with receivers (user id)
* @throws \Exception
*/
private static function getReceiverForActor($actor, $tags, $receivers, $target_type, $profile)
private static function getReceiverForActor(string $actor, array $tags, array $receivers, int $target_type, array $profile): array
{
$basecondition = ['rel' => [Contact::SHARING, Contact::FRIEND, Contact::FOLLOWER],
'network' => Protocol::FEDERATED, 'archive' => false, 'pending' => false];
@ -1047,13 +1049,12 @@ class Receiver
* Tests if the contact is a valid receiver for this actor
*
* @param array $contact
* @param string $actor
* @param array $tags
*
* @return bool with receivers (user id)
* @throws \Exception
*/
private static function isValidReceiverForActor($contact, $tags)
private static function isValidReceiverForActor(array $contact, array $tags): bool
{
// Are we following the contact? Then this is a valid receiver
if (in_array($contact['rel'], [Contact::SHARING, Contact::FRIEND])) {
@ -1089,7 +1090,7 @@ class Receiver
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function switchContact($cid, $uid, $url)
public static function switchContact(int $cid, int $uid, string $url)
{
if (DBA::exists('contact', ['id' => $cid, 'network' => Protocol::ACTIVITYPUB])) {
Logger::info('Contact is already ActivityPub', ['id' => $cid, 'uid' => $uid, 'url' => $url]);
@ -1108,7 +1109,7 @@ class Receiver
}
/**
*
* @TODO Fix documentation and type-hints
*
* @param $receivers
* @param $actor
@ -1135,14 +1136,14 @@ class Receiver
}
/**
*
* @TODO Fix documentation and type-hints
*
* @param $object_data
* @param array $activity
*
* @return mixed
*/
private static function addActivityFields($object_data, $activity)
private static function addActivityFields($object_data, array $activity)
{
if (!empty($activity['published']) && empty($object_data['published'])) {
$object_data['published'] = JsonLD::fetchElement($activity, 'as:published', '@value');
@ -1262,7 +1263,7 @@ class Receiver
* @param array $languages
* @return array Languages
*/
public static function processLanguages(array $languages)
public static function processLanguages(array $languages): array
{
if (empty($languages)) {
return [];
@ -1285,7 +1286,7 @@ class Receiver
*
* @return array with tags in a simplified format
*/
public static function processTags(array $tags)
public static function processTags(array $tags): array
{
$taglist = [];
@ -1317,7 +1318,7 @@ class Receiver
* @param array $emojis
* @return array with emojis in a simplified format
*/
private static function processEmojis(array $emojis)
private static function processEmojis(array $emojis): array
{
$emojilist = [];
@ -1343,7 +1344,7 @@ class Receiver
*
* @return array Attachments in a simplified format
*/
private static function processAttachments(array $attachments)
private static function processAttachments(array $attachments): array
{
$attachlist = [];
@ -1460,7 +1461,7 @@ class Receiver
*
* @return array Questions in a simplified format
*/
private static function processQuestion(array $object)
private static function processQuestion(array $object): array
{
$question = [];
@ -1518,10 +1519,10 @@ class Receiver
* @param array $object
* @param array $object_data
*
* @return array
* @return array Object data (?)
* @throws \Exception
*/
private static function getSource($object, $object_data)
private static function getSource(array $object, array $object_data): array
{
$object_data['source'] = JsonLD::fetchElement($object, 'as:source', 'as:content', 'as:mediaType', 'text/bbcode');
$object_data['source'] = JsonLD::fetchElement($object_data, 'source', '@value');
@ -1650,10 +1651,10 @@ class Receiver
*
* @param array $object
*
* @return array
* @return array|bool Object data or FALSE if $object does not contain @id element
* @throws \Exception
*/
private static function processObject($object)
private static function processObject(array $object)
{
if (!JsonLD::fetchElement($object, '@id')) {
return false;
@ -1767,7 +1768,7 @@ class Receiver
$object_data['question'] = self::processQuestion($object);
}
$receiverdata = self::getReceivers($object, $object_data['actor'], $object_data['tags'], true);
$receiverdata = self::getReceivers($object, $object_data['actor'] ?? '', $object_data['tags'], true);
$receivers = $reception_types = [];
foreach ($receiverdata as $key => $data) {
$receivers[$key] = $data['uid'];

View file

@ -68,7 +68,7 @@ class Transmitter
* @param array $inboxes
* @return array inboxes with added relay servers
*/
public static function addRelayServerInboxes(array $inboxes = [])
public static function addRelayServerInboxes(array $inboxes = []): array
{
foreach (Relay::getList(['inbox']) as $contact) {
$inboxes[$contact['inbox']] = $contact['inbox'];
@ -83,7 +83,7 @@ class Transmitter
* @param array $inboxes
* @return array inboxes with added relay servers
*/
public static function addRelayServerInboxesForItem(int $item_id, array $inboxes = [])
public static function addRelayServerInboxesForItem(int $item_id, array $inboxes = []): array
{
$item = Post::selectFirst(['uid'], ['id' => $item_id]);
if (empty($item)) {

View file

@ -72,7 +72,7 @@ class DFRN
* @return array importer
* @throws \Exception
*/
public static function getImporter($cid, $uid = 0)
public static function getImporter(int $cid, int $uid = 0): array
{
$condition = ['id' => $cid, 'blocked' => false, 'pending' => false];
$contact = DBA::selectFirst('contact', [], $condition);
@ -115,7 +115,7 @@ class DFRN
* @throws \ImagickException
* @todo Find proper type-hints
*/
public static function entries($items, $owner)
public static function entries(array $items, array $owner): string
{
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
@ -152,7 +152,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function itemFeed(int $uri_id, int $uid, bool $conversation = false)
public static function itemFeed(int $uri_id, int $uid, bool $conversation = false): string
{
if ($conversation) {
$condition = ['parent-uri-id' => $uri_id];
@ -222,7 +222,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
*/
public static function mail(array $mail, array $owner)
public static function mail(array $mail, array $owner): string
{
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
@ -259,7 +259,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
*/
public static function fsuggest($item, $owner)
public static function fsuggest(array $item, array $owner): string
{
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
@ -289,7 +289,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
*/
public static function relocate($owner, $uid)
public static function relocate(array $owner, int $uid): string
{
/* get site pubkey. this could be a new installation with no site keys*/
@ -346,9 +346,9 @@ class DFRN
*
* @return object XML root object
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
* @todo Find proper type-hint for returned type
*/
private static function addHeader(DOMDocument $doc, $owner, $authorelement, $alternatelink = "", $public = false)
private static function addHeader(DOMDocument $doc, array $owner, string $authorelement, string $alternatelink = '', bool $public = false)
{
if ($alternatelink == "") {
@ -428,8 +428,12 @@ class DFRN
* viewer's timezone also, but first we are going to convert it from the birthday
* person's timezone to GMT - so the viewer may find the birthday starting at
* 6:00PM the day before, but that will correspond to midnight to the birthday person.
*
* @param int $uid User id
* @param string $tz Time zone string, like UTC
* @return string Formatted birthday string
*/
private static function determineNextBirthday($uid, $tz)
private static function determineNextBirthday(int $uid, string $tz): string
{
$birthday = '';
@ -467,7 +471,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
*/
private static function addAuthor(DOMDocument $doc, array $owner, $authorelement, $public)
private static function addAuthor(DOMDocument $doc, array $owner, string $authorelement, bool $public)
{
// Should the profile be "unsearchable" in the net? Then add the "hide" element
$hide = DBA::exists('profile', ['uid' => $owner['uid'], 'net-publish' => false]);
@ -592,7 +596,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
*/
private static function addEntryAuthor(DOMDocument $doc, $element, $contact_url, $item)
private static function addEntryAuthor(DOMDocument $doc, string $element, string $contact_url, array $item)
{
$author = $doc->createElement($element);
@ -637,7 +641,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find proper type-hints
*/
private static function createActivity(DOMDocument $doc, $element, $activity, $uriid)
private static function createActivity(DOMDocument $doc, string $element, string $activity, int $uriid)
{
if ($activity) {
$entry = $doc->createElement($element);
@ -703,7 +707,7 @@ class DFRN
* @return void XML attachment object
* @todo Find proper type-hints
*/
private static function getAttachment($doc, $root, $item)
private static function getAttachment($doc, $root, array $item)
{
foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]) as $attachment) {
$attributes = ['rel' => 'enclosure',
@ -737,7 +741,7 @@ class DFRN
* @throws \ImagickException
* @todo Find proper type-hints
*/
private static function entry(DOMDocument $doc, $type, array $item, array $owner, $comment = false, $cid = 0, $single = false)
private static function entry(DOMDocument $doc, string $type, array $item, array $owner, bool $comment = false, int $cid = 0, bool $single = false)
{
$mentioned = [];
@ -961,13 +965,12 @@ class DFRN
* @param array $owner Owner record
* @param array $contact Contact record of the receiver
* @param string $atom Content that will be transmitted
*
* @param bool $public_batch
* @return int Deliver status. Negative values mean an error.
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function transmit($owner, $contact, $atom, $public_batch = false)
public static function transmit(array $owner, array $contact, string $atom, bool $public_batch = false)
{
if (!$public_batch) {
if (empty($contact['addr'])) {
@ -1060,7 +1063,7 @@ class DFRN
* @throws \ImagickException
* @todo Find good type-hints for all parameter
*/
private static function fetchauthor(\DOMXPath $xpath, \DOMNode $context, $importer, $element, $onlyfetch, $xml = "")
private static function fetchauthor(\DOMXPath $xpath, \DOMNode $context, array $importer, string $element, bool $onlyfetch, string $xml = ''): array
{
$author = [];
$author["name"] = XML::getFirstNodeValue($xpath, $element."/atom:name/text()", $context);
@ -1280,7 +1283,7 @@ class DFRN
* @return string XML string
* @todo Find good type-hints for all parameter
*/
private static function transformActivity($xpath, $activity, $element)
private static function transformActivity($xpath, $activity, string $element): string
{
if (!is_object($activity)) {
return "";
@ -1335,7 +1338,7 @@ class DFRN
* @throws \Exception
* @todo Find good type-hints for all parameter
*/
private static function processMail($xpath, $mail, $importer)
private static function processMail($xpath, $mail, array $importer)
{
Logger::notice("Processing mails");
@ -1364,7 +1367,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo Find good type-hints for all parameter
*/
private static function processSuggestion($xpath, $suggestion, $importer)
private static function processSuggestion($xpath, $suggestion, array $importer)
{
Logger::notice('Processing suggestions');
@ -1383,7 +1386,7 @@ class DFRN
* @param integer $from_cid
* @return bool Was the adding successful?
*/
private static function addSuggestion(int $uid, int $cid, int $from_cid, string $note = '')
private static function addSuggestion(int $uid, int $cid, int $from_cid, string $note = ''): bool
{
$owner = User::getOwnerDataById($uid);
$contact = Contact::getById($cid);
@ -1440,7 +1443,7 @@ class DFRN
* @throws \ImagickException
* @todo Find good type-hints for all parameter
*/
private static function processRelocation($xpath, $relocation, $importer)
private static function processRelocation($xpath, $relocation, array $importer): bool
{
Logger::notice("Processing relocations");
@ -1510,7 +1513,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo set proper type-hints (array?)
*/
private static function updateContent($current, $item, $importer, $entrytype)
private static function updateContent(array $current, array $item, array $importer, int $entrytype)
{
$changed = false;
@ -1542,7 +1545,7 @@ class DFRN
* @throws \Exception
* @todo set proper type-hints (array?)
*/
private static function getEntryType($importer, $item)
private static function getEntryType(array $importer, array $item): int
{
if ($item["thr-parent"] != $item["uri"]) {
$community = false;
@ -1638,7 +1641,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @todo set proper type-hints (array?)
*/
private static function processVerbs($entrytype, $importer, &$item, &$is_like)
private static function processVerbs(int $entrytype, array $importer, array &$item, bool &$is_like)
{
Logger::info("Process verb ".$item["verb"]." and object-type ".$item["object-type"]." for entrytype ".$entrytype);
@ -1734,7 +1737,7 @@ class DFRN
* @return void
* @todo set proper type-hints
*/
private static function parseLinks($links, &$item)
private static function parseLinks($links, array &$item)
{
$rel = "";
$href = "";
@ -1772,7 +1775,7 @@ class DFRN
* @param array $imporer
* @return boolean Is the message wanted?
*/
private static function isSolicitedMessage(array $item, array $importer)
private static function isSolicitedMessage(array $item, array $importer): bool
{
if (DBA::exists('contact', ["`nurl` = ? AND `uid` != ? AND `rel` IN (?, ?)",
Strings::normaliseLink($item["author-link"]), 0, Contact::FRIEND, Contact::SHARING])) {
@ -1807,12 +1810,13 @@ class DFRN
* @param object $entry entry elements
* @param array $importer Record of the importer user mixed with contact of the content
* @param string $xml xml
* @param int $protocol Protocol
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
* @todo Add type-hints
*/
private static function processEntry($header, $xpath, $entry, $importer, $xml, $protocol)
private static function processEntry(array $header, $xpath, $entry, array $importer, string $xml, int $protocol)
{
Logger::notice("Processing entries");
@ -2070,6 +2074,9 @@ class DFRN
}
}
// Need to initialize variable, otherwise E_NOTICE will happen
$is_like = false;
if (!self::processVerbs($entrytype, $importer, $item, $is_like)) {
Logger::info("Exiting because 'processVerbs' told us so");
return;
@ -2163,7 +2170,7 @@ class DFRN
* @throws \Exception
* @todo set proper type-hints
*/
private static function processDeletion($xpath, $deletion, $importer)
private static function processDeletion($xpath, $deletion, array $importer)
{
Logger::notice("Processing deletions");
$uri = null;
@ -2224,9 +2231,8 @@ class DFRN
* @return integer Import status
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
* @todo set proper type-hints
*/
public static function import($xml, $importer, $protocol, $direction)
public static function import(string $xml, array $importer, int $protocol, int $direction): int
{
if ($xml == "") {
return 400;
@ -2365,7 +2371,7 @@ class DFRN
*
* @return string activity verb
*/
private static function constructVerb(array $item)
private static function constructVerb(array $item): string
{
if ($item['verb']) {
return $item['verb'];
@ -2373,7 +2379,8 @@ class DFRN
return Activity::POST;
}
private static function tgroupCheck($uid, $item)
// @TODO Documentation missing
private static function tgroupCheck(int $uid, array $item): bool
{
$mention = false;
@ -2421,12 +2428,12 @@ class DFRN
* item is assumed to be up-to-date. If the timestamps are equal it
* assumes the update has been seen before and should be ignored.
*
* @param $existing
* @param $update
* @param array $existing
* @param array $update
* @return bool
* @throws \Exception
*/
private static function isEditedTimestampNewer($existing, $update)
private static function isEditedTimestampNewer(array $existing, array $update): bool
{
if (empty($existing['edited'])) {
return true;
@ -2449,7 +2456,7 @@ class DFRN
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isSupportedByContactUrl($url)
public static function isSupportedByContactUrl(string $url): bool
{
$probe = Probe::uri($url, Protocol::DFRN);
return $probe['network'] == Protocol::DFRN;

View file

@ -74,9 +74,9 @@ class Diaspora
* @return array of relay servers
* @throws \Exception
*/
public static function participantsForThread(array $item, array $contacts)
public static function participantsForThread(array $item, array $contacts): array
{
if (!in_array($item['private'], [Item::PUBLIC, Item::UNLISTED]) || in_array($item["verb"], [Activity::FOLLOW, Activity::TAG])) {
if (!in_array($item['private'], [Item::PUBLIC, Item::UNLISTED]) || in_array($item['verb'], [Activity::FOLLOW, Activity::TAG])) {
Logger::info('Item is private or a participation request. It will not be relayed', ['guid' => $item['guid'], 'private' => $item['private'], 'verb' => $item['verb']]);
return $contacts;
}
@ -114,11 +114,11 @@ class Diaspora
*
* @param string $envelope The magic envelope
*
* @return string verified data
* @return string|bool verified data or false on error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function verifyMagicEnvelope($envelope)
private static function verifyMagicEnvelope(string $envelope)
{
$basedom = XML::parseString($envelope, true);
@ -145,14 +145,14 @@ class Diaspora
$sig = Strings::base64UrlDecode($children->sig);
$key_id = $children->sig->attributes()->key_id[0];
if ($key_id != "") {
if ($key_id != '') {
$handle = Strings::base64UrlDecode($key_id);
}
$b64url_data = Strings::base64UrlEncode($data);
$msg = str_replace(["\n", "\r", " ", "\t"], ["", "", "", ""], $b64url_data);
$msg = str_replace(["\n", "\r", " ", "\t"], ['', '', '', ''], $b64url_data);
$signable_data = $msg.".".Strings::base64UrlEncode($type).".".Strings::base64UrlEncode($encoding).".".Strings::base64UrlEncode($alg);
$signable_data = $msg . '.' . Strings::base64UrlEncode($type) . '.' . Strings::base64UrlEncode($encoding) . '.' . Strings::base64UrlEncode($alg);
if ($handle == '') {
Logger::notice('No author could be decoded. Discarding. Message: ' . $envelope);
@ -183,7 +183,7 @@ class Diaspora
*
* @return string encrypted data
*/
private static function aesEncrypt($key, $iv, $data)
private static function aesEncrypt(string $key, string $iv, string $data): string
{
return openssl_encrypt($data, 'aes-256-cbc', str_pad($key, 32, "\0"), OPENSSL_RAW_DATA, str_pad($iv, 16, "\0"));
}
@ -197,19 +197,19 @@ class Diaspora
*
* @return string decrypted data
*/
private static function aesDecrypt($key, $iv, $encrypted)
private static function aesDecrypt(string $key, string $iv, string $encrypted): string
{
return openssl_decrypt($encrypted, 'aes-256-cbc', str_pad($key, 32, "\0"), OPENSSL_RAW_DATA, str_pad($iv, 16, "\0"));
}
/**
* Decodes incoming Diaspora message in the new format
* Decodes incoming Diaspora message in the new format. This method returns false on an error.
*
* @param string $raw raw post message
* @param string $privKey The private key of the importer
* @param boolean $no_exit Don't do an http exit on error
*
* @return array
* @return bool|array
* 'message' -> decoded Diaspora XML message
* 'author' -> author diaspora handle
* 'key' -> author public key (converted to pkcs#8)
@ -260,13 +260,13 @@ class Diaspora
$base = $basedom->children(ActivityNamespace::SALMON_ME);
// Not sure if this cleaning is needed
$data = str_replace([" ", "\t", "\r", "\n"], ["", "", "", ""], $base->data);
$data = str_replace([" ", "\t", "\r", "\n"], ['', '', '', ''], $base->data);
// Build the signed data
$type = $base->data[0]->attributes()->type[0];
$encoding = $base->encoding;
$alg = $base->alg;
$signed_data = $data.'.'.Strings::base64UrlEncode($type).'.'.Strings::base64UrlEncode($encoding).'.'.Strings::base64UrlEncode($alg);
$signed_data = $data . '.' . Strings::base64UrlEncode($type) . '.' . Strings::base64UrlEncode($encoding) . '.' . Strings::base64UrlEncode($alg);
// This is the signature
$signature = Strings::base64UrlDecode($base->sig);
@ -303,9 +303,11 @@ class Diaspora
}
}
return ['message' => (string)Strings::base64UrlDecode($base->data),
'author' => XML::unescape($author_addr),
'key' => (string)$key];
return [
'message' => (string)Strings::base64UrlDecode($base->data),
'author' => XML::unescape($author_addr),
'key' => (string)$key
];
}
/**
@ -394,7 +396,7 @@ class Diaspora
// unpack the data
// strip whitespace so our data element will return to one big base64 blob
$data = str_replace([" ", "\t", "\r", "\n"], ["", "", "", ""], $base->data);
$data = str_replace([" ", "\t", "\r", "\n"], ['', '', '', ''], $base->data);
// stash away some other stuff for later
@ -445,9 +447,11 @@ class Diaspora
Logger::notice('Message verified.');
return ['message' => (string)$inner_decrypted,
'author' => XML::unescape($author_link),
'key' => (string)$key];
return [
'message' => (string)$inner_decrypted,
'author' => XML::unescape($author_link),
'key' => (string)$key
];
}
@ -457,11 +461,11 @@ class Diaspora
* @param array $msg The post that will be dispatched
* @param int $direction Indicates if the message had been fetched or pushed (self::PUSHED, self::FETCHED, self::FORCED_FETCH)
*
* @return int The message id of the generated message, "true" or "false" if there was an error
* @return int|bool The message id of the generated message, "true" or "false" if there was an error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function dispatchPublic($msg, int $direction)
public static function dispatchPublic(array $msg, int $direction)
{
$enabled = intval(DI::config()->get("system", "diaspora_enabled"));
if (!$enabled) {
@ -474,7 +478,10 @@ class Diaspora
return false;
}
$importer = ["uid" => 0, "page-flags" => User::PAGE_FLAGS_FREELOVE];
$importer = [
'uid' => 0,
'page-flags' => User::PAGE_FLAGS_FREELOVE
];
$success = self::dispatch($importer, $msg, $fields, $direction);
return $success;
@ -488,15 +495,15 @@ class Diaspora
* @param SimpleXMLElement $fields SimpleXML object that contains the message
* @param int $direction Indicates if the message had been fetched or pushed (self::PUSHED, self::FETCHED, self::FORCED_FETCH)
*
* @return int The message id of the generated message, "true" or "false" if there was an error
* @return int|bool The message id of the generated message, "true" or "false" if there was an error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function dispatch(array $importer, $msg, SimpleXMLElement $fields = null, int $direction = self::PUSHED)
public static function dispatch(array $importer, array $msg, SimpleXMLElement $fields = null, int $direction = self::PUSHED)
{
// The sender is the handle of the contact that sent the message.
// This will often be different with relayed messages (for example "like" and "comment")
$sender = $msg["author"];
$sender = $msg['author'];
// This is only needed for private postings since this is already done for public ones before
if (is_null($fields)) {
@ -511,77 +518,77 @@ class Diaspora
$type = $fields->getName();
Logger::info('Received message', ['type' => $type, 'sender' => $sender, 'user' => $importer["uid"]]);
Logger::info('Received message', ['type' => $type, 'sender' => $sender, 'user' => $importer['uid']]);
switch ($type) {
case "account_migration":
case 'account_migration':
if (!$private) {
Logger::notice('Message with type ' . $type . ' is not private, quitting.');
return false;
}
return self::receiveAccountMigration($importer, $fields);
case "account_deletion":
case 'account_deletion':
return self::receiveAccountDeletion($fields);
case "comment":
return self::receiveComment($importer, $sender, $fields, $msg["message"], $direction);
case 'comment':
return self::receiveComment($importer, $sender, $fields, $msg['message'], $direction);
case "contact":
case 'contact':
if (!$private) {
Logger::notice('Message with type ' . $type . ' is not private, quitting.');
return false;
}
return self::receiveContactRequest($importer, $fields);
case "conversation":
case 'conversation':
if (!$private) {
Logger::notice('Message with type ' . $type . ' is not private, quitting.');
return false;
}
return self::receiveConversation($importer, $msg, $fields);
case "like":
case 'like':
return self::receiveLike($importer, $sender, $fields, $direction);
case "message":
case 'message':
if (!$private) {
Logger::notice('Message with type ' . $type . ' is not private, quitting.');
return false;
}
return self::receiveMessage($importer, $fields);
case "participation":
case 'participation':
if (!$private) {
Logger::notice('Message with type ' . $type . ' is not private, quitting.');
return false;
}
return self::receiveParticipation($importer, $fields, $direction);
case "photo": // Not implemented
case 'photo': // Not implemented
return self::receivePhoto($importer, $fields);
case "poll_participation": // Not implemented
case 'poll_participation': // Not implemented
return self::receivePollParticipation($importer, $fields);
case "profile":
case 'profile':
if (!$private) {
Logger::notice('Message with type ' . $type . ' is not private, quitting.');
return false;
}
return self::receiveProfile($importer, $fields);
case "reshare":
return self::receiveReshare($importer, $fields, $msg["message"], $direction);
case 'reshare':
return self::receiveReshare($importer, $fields, $msg['message'], $direction);
case "retraction":
case 'retraction':
return self::receiveRetraction($importer, $sender, $fields);
case "status_message":
return self::receiveStatusMessage($importer, $fields, $msg["message"], $direction);
case 'status_message':
return self::receiveStatusMessage($importer, $fields, $msg['message'], $direction);
default:
Logger::notice("Unknown message type ".$type);
Logger::notice("Unknown message type " . $type);
return false;
}
}
@ -598,9 +605,9 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function validPosting($msg)
private static function validPosting(array $msg)
{
$data = XML::parseString($msg["message"]);
$data = XML::parseString($msg['message']);
if (!is_object($data)) {
Logger::info('No valid XML', ['message' => $msg['message']]);
@ -608,7 +615,7 @@ class Diaspora
}
// Is this the new or the old version?
if ($data->getName() == "XML") {
if ($data->getName() == 'XML') {
$oldXML = true;
foreach ($data->post->children() as $child) {
$element = $child;
@ -621,106 +628,106 @@ class Diaspora
$type = $element->getName();
$orig_type = $type;
Logger::debug("Got message type ".$type.": ".$msg["message"]);
Logger::debug("Got message type " . $type . ": " . $msg['message']);
// All retractions are handled identically from now on.
// In the new version there will only be "retraction".
if (in_array($type, ["signed_retraction", "relayable_retraction"]))
$type = "retraction";
if (in_array($type, ['signed_retraction', 'relayable_retraction']))
$type = 'retraction';
if ($type == "request") {
$type = "contact";
if ($type == 'request') {
$type = 'contact';
}
$fields = new SimpleXMLElement("<".$type."/>");
$fields = new SimpleXMLElement('<' . $type . '/>');
$signed_data = "";
$signed_data = '';
$author_signature = null;
$parent_author_signature = null;
foreach ($element->children() as $fieldname => $entry) {
if ($oldXML) {
// Translation for the old XML structure
if ($fieldname == "diaspora_handle") {
$fieldname = "author";
if ($fieldname == 'diaspora_handle') {
$fieldname = 'author';
}
if ($fieldname == "participant_handles") {
$fieldname = "participants";
if ($fieldname == 'participant_handles') {
$fieldname = 'participants';
}
if (in_array($type, ["like", "participation"])) {
if ($fieldname == "target_type") {
$fieldname = "parent_type";
if (in_array($type, ['like', 'participation'])) {
if ($fieldname == 'target_type') {
$fieldname = 'parent_type';
}
}
if ($fieldname == "sender_handle") {
$fieldname = "author";
if ($fieldname == 'sender_handle') {
$fieldname = 'author';
}
if ($fieldname == "recipient_handle") {
$fieldname = "recipient";
if ($fieldname == 'recipient_handle') {
$fieldname = 'recipient';
}
if ($fieldname == "root_diaspora_id") {
$fieldname = "root_author";
if ($fieldname == 'root_diaspora_id') {
$fieldname = 'root_author';
}
if ($type == "status_message") {
if ($fieldname == "raw_message") {
$fieldname = "text";
if ($type == 'status_message') {
if ($fieldname == 'raw_message') {
$fieldname = 'text';
}
}
if ($type == "retraction") {
if ($fieldname == "post_guid") {
$fieldname = "target_guid";
if ($type == 'retraction') {
if ($fieldname == 'post_guid') {
$fieldname = 'target_guid';
}
if ($fieldname == "type") {
$fieldname = "target_type";
if ($fieldname == 'type') {
$fieldname = 'target_type';
}
}
}
if (($fieldname == "author_signature") && ($entry != "")) {
if (($fieldname == 'author_signature') && ($entry != '')) {
$author_signature = base64_decode($entry);
} elseif (($fieldname == "parent_author_signature") && ($entry != "")) {
} elseif (($fieldname == 'parent_author_signature') && ($entry != '')) {
$parent_author_signature = base64_decode($entry);
} elseif (!in_array($fieldname, ["author_signature", "parent_author_signature", "target_author_signature"])) {
if ($signed_data != "") {
$signed_data .= ";";
} elseif (!in_array($fieldname, ['author_signature', 'parent_author_signature', 'target_author_signature'])) {
if ($signed_data != '') {
$signed_data .= ';';
}
$signed_data .= $entry;
}
if (!in_array($fieldname, ["parent_author_signature", "target_author_signature"])
|| ($orig_type == "relayable_retraction")
if (!in_array($fieldname, ['parent_author_signature', 'target_author_signature'])
|| ($orig_type == 'relayable_retraction')
) {
XML::copy($entry, $fields, $fieldname);
}
}
// This is something that shouldn't happen at all.
if (in_array($type, ["status_message", "reshare", "profile"])) {
if ($msg["author"] != $fields->author) {
if (in_array($type, ['status_message', 'reshare', 'profile'])) {
if ($msg['author'] != $fields->author) {
Logger::notice("Message handle is not the same as envelope sender. Quitting this message.");
return false;
}
}
// Only some message types have signatures. So we quit here for the other types.
if (!in_array($type, ["comment", "like"])) {
if (!in_array($type, ['comment', 'like'])) {
return $fields;
}
// No author_signature? This is a must, so we quit.
if (!isset($author_signature)) {
Logger::info("No author signature for type ".$type." - Message: ".$msg["message"]);
Logger::info("No author signature for type " . $type . " - Message: " . $msg['message']);
return false;
}
if (isset($parent_author_signature)) {
$key = self::key($msg["author"]);
$key = self::key($msg['author']);
if (empty($key)) {
Logger::info('No key found for parent', ['author' => $msg["author"]]);
Logger::info('No key found for parent', ['author' => $msg['author']]);
return false;
}
if (!Crypto::rsaVerify($signed_data, $parent_author_signature, $key, "sha256")) {
Logger::info("No valid parent author signature for parent author ".$msg["author"]. " in type ".$type." - signed data: ".$signed_data." - Message: ".$msg["message"]." - Signature ".$parent_author_signature);
if (!Crypto::rsaVerify($signed_data, $parent_author_signature, $key, 'sha256')) {
Logger::info("No valid parent author signature for parent author " . $msg['author'] . " in type " . $type . " - signed data: " . $signed_data . " - Message: " . $msg['message'] . " - Signature " . $parent_author_signature);
return false;
}
}
@ -731,8 +738,8 @@ class Diaspora
return false;
}
if (!Crypto::rsaVerify($signed_data, $author_signature, $key, "sha256")) {
Logger::info("No valid author signature for author ".$fields->author. " in type ".$type." - signed data: ".$signed_data." - Message: ".$msg["message"]." - Signature ".$author_signature);
if (!Crypto::rsaVerify($signed_data, $author_signature, $key, 'sha256')) {
Logger::info("No valid author signature for author " . $fields->author . " in type " . $type . " - signed data: " . $signed_data . " - Message: " . $msg['message'] . " - Signature " . $author_signature);
return false;
} else {
return $fields;
@ -748,18 +755,18 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function key($handle)
private static function key(string $handle): string
{
$handle = strval($handle);
Logger::notice("Fetching diaspora key for: ".$handle);
Logger::notice("Fetching diaspora key for: " . $handle);
$r = FContact::getByURL($handle);
if ($r) {
return $r["pubkey"];
$fcontact = FContact::getByURL($handle);
if ($fcontact) {
return $fcontact['pubkey'];
}
return "";
return '';
}
/**
@ -771,7 +778,7 @@ class Diaspora
* @return string the handle
* @throws \Exception
*/
private static function handleFromContact($contact_id, $pcontact_id = 0)
private static function handleFromContact(int $contact_id, int $pcontact_id = 0): string
{
$handle = '';
@ -804,7 +811,7 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function contactByHandle($uid, $handle)
private static function contactByHandle(int $uid, string $handle): array
{
return Contact::getByURL($handle, null, [], $uid);
}
@ -818,7 +825,7 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isSupportedByContactUrl($url, $update = null)
public static function isSupportedByContactUrl(string $url, $update = null)
{
return !empty(FContact::getByURL($url, $update));
}
@ -832,7 +839,7 @@ class Diaspora
*
* @return bool is the contact allowed to post?
*/
private static function postAllow(array $importer, array $contact, $is_comment = false)
private static function postAllow(array $importer, array $contact, bool $is_comment = false): bool
{
/*
* Perhaps we were already sharing with this person. Now they're sharing with us.
@ -855,15 +862,15 @@ class Diaspora
if (Network::isUrlBlocked($contact['url'])) {
return false;
// We don't seem to like that person
} elseif ($contact["blocked"]) {
} elseif ($contact['blocked']) {
// Maybe blocked, don't accept.
return false;
// We are following this person?
} elseif (($contact["rel"] == Contact::SHARING) || ($contact["rel"] == Contact::FRIEND)) {
} elseif (($contact['rel'] == Contact::SHARING) || ($contact['rel'] == Contact::FRIEND)) {
// Yes, then it is fine.
return true;
// Is the message a global user or a comment?
} elseif (($importer["uid"] == 0) || $is_comment) {
} elseif (($importer['uid'] == 0) || $is_comment) {
// Messages for the global users and comments are always accepted
return true;
}
@ -878,16 +885,16 @@ class Diaspora
* @param string $handle The checked handle in the format user@domain.tld
* @param bool $is_comment Is the check for a comment?
*
* @return array The contact data
* @return array|bool The contact data or false on error
* @throws \Exception
*/
private static function allowedContactByHandle(array $importer, $handle, $is_comment = false)
private static function allowedContactByHandle(array $importer, string $handle, bool $is_comment = false)
{
$contact = self::contactByHandle($importer["uid"], $handle);
$contact = self::contactByHandle($importer['uid'], $handle);
if (!$contact) {
Logger::notice("A Contact for handle ".$handle." and user ".$importer["uid"]." was not found");
Logger::notice("A Contact for handle " . $handle . " and user " . $importer['uid'] . " was not found");
// If a contact isn't found, we accept it anyway if it is a comment
if ($is_comment && ($importer["uid"] != 0)) {
if ($is_comment && ($importer['uid'] != 0)) {
return self::contactByHandle(0, $handle);
} elseif ($is_comment) {
return $importer;
@ -897,7 +904,7 @@ class Diaspora
}
if (!self::postAllow($importer, $contact, $is_comment)) {
Logger::notice("The handle: ".$handle." is not allowed to post to user ".$importer["uid"]);
Logger::notice("The handle: " . $handle . " is not allowed to post to user " . $importer['uid']);
return false;
}
return $contact;
@ -912,12 +919,12 @@ class Diaspora
* @return int|bool message id if the message already was stored into the system - or false.
* @throws \Exception
*/
private static function messageExists($uid, $guid)
private static function messageExists(int $uid, string $guid)
{
$item = Post::selectFirst(['id'], ['uid' => $uid, 'guid' => $guid]);
if (DBA::isResult($item)) {
Logger::notice("message ".$guid." already exists for user ".$uid);
return $item["id"];
Logger::notice("message " . $guid . " already exists for user " . $uid);
return $item['id'];
}
return false;
@ -931,13 +938,12 @@ class Diaspora
*/
private static function fetchGuid(array $item)
{
$expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism";
preg_replace_callback(
$expression,
"=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism",
function ($match) use ($item) {
self::fetchGuidSub($match, $item);
},
$item["body"]
$item['body']
);
preg_replace_callback(
@ -945,7 +951,7 @@ class Diaspora
function ($match) use ($item) {
self::fetchGuidSub($match, $item);
},
$item["body"]
$item['body']
);
}
@ -958,7 +964,7 @@ class Diaspora
*
* @return string the replaced string
*/
public static function replacePeopleGuid($body, $author_link)
public static function replacePeopleGuid(string $body, string $author_link): string
{
$return = preg_replace_callback(
"&\[url=/people/([^\[\]]*)\](.*)\[\/url\]&Usi",
@ -970,11 +976,11 @@ class Diaspora
$handle = FContact::getUrlByGuid($match[1]);
if ($handle) {
$return = '@[url='.$handle.']'.$match[2].'[/url]';
$return = '@[url=' . $handle . ']' . $match[2] . '[/url]';
} else {
// No local match, restoring absolute remote URL from author scheme and host
$author_url = parse_url($author_link);
$return = '[url='.$author_url['scheme'].'://'.$author_url['host'].'/people/'.$match[1].']'.$match[2].'[/url]';
$return = '[url=' . $author_url['scheme'] . '://' . $author_url['host'] . '/people/' . $match[1] . ']' . $match[2] . '[/url]';
}
return $return;
@ -994,10 +1000,10 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function fetchGuidSub($match, $item)
private static function fetchGuidSub(array $match, array $item)
{
if (!self::storeByGuid($match[1], $item["author-link"], true)) {
self::storeByGuid($match[1], $item["owner-link"], true);
if (!self::storeByGuid($match[1], $item['author-link'], true)) {
self::storeByGuid($match[1], $item['owner-link'], true);
}
}
@ -1008,21 +1014,21 @@ class Diaspora
* @param string $server The server address
* @param bool $force Forced fetch
*
* @return int the message id of the stored message or false
* @return int|bool the message id of the stored message or false
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function storeByGuid($guid, $server, $force)
private static function storeByGuid(string $guid, string $server, bool $force)
{
$serverparts = parse_url($server);
if (empty($serverparts["host"]) || empty($serverparts["scheme"])) {
if (empty($serverparts['host']) || empty($serverparts['scheme'])) {
return false;
}
$server = $serverparts["scheme"]."://".$serverparts["host"];
$server = $serverparts['scheme'] . '://' . $serverparts['host'];
Logger::info("Trying to fetch item ".$guid." from ".$server);
Logger::info("Trying to fetch item " . $guid . " from " . $server);
$msg = self::message($guid, $server);
@ -1030,7 +1036,7 @@ class Diaspora
return false;
}
Logger::info("Successfully fetched item ".$guid." from ".$server);
Logger::info("Successfully fetched item " . $guid . " from " . $server);
// Now call the dispatcher
return self::dispatchPublic($msg, $force ? self::FORCED_FETCH : self::FETCHED);
@ -1049,16 +1055,16 @@ class Diaspora
* 'key' => The public key of the author
* @throws \Exception
*/
public static function message($guid, $server, $level = 0)
public static function message(string $guid, string $server, int $level = 0)
{
if ($level > 5) {
return false;
}
// This will work for new Diaspora servers and Friendica servers from 3.5
$source_url = $server."/fetch/post/".urlencode($guid);
$source_url = $server . '/fetch/post/' . urlencode($guid);
Logger::info("Fetch post from ".$source_url);
Logger::info("Fetch post from " . $source_url);
$envelope = DI::httpClient()->fetch($source_url, HttpClientAccept::MAGIC);
if ($envelope) {
@ -1098,7 +1104,7 @@ class Diaspora
// Fetch the author - for the old and the new Diaspora version
if ($source_xml->post->status_message && $source_xml->post->status_message->diaspora_handle) {
$author = (string)$source_xml->post->status_message->diaspora_handle;
} elseif ($source_xml->author && ($source_xml->getName() == "status_message")) {
} elseif ($source_xml->author && ($source_xml->getName() == 'status_message')) {
$author = (string)$source_xml->author;
}
@ -1108,26 +1114,27 @@ class Diaspora
return false;
}
$msg = ["message" => $x, "author" => $author];
$msg["key"] = self::key($msg["author"]);
return $msg;
return [
'message' => $x,
'author' => $author,
'key' => self::key($author)
];
}
/**
* Fetches an item with a given URL
*
* @param string $url the message url
* @param int $uid User id
*
* @return int the message id of the stored message or false
* @return int|bool the message id of the stored message or false
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function fetchByURL($url, $uid = 0)
public static function fetchByURL(string $url, int $uid = 0)
{
// Check for Diaspora (and Friendica) typical paths
if (!preg_match("=(https?://.+)/(?:posts|display|objects)/([a-zA-Z0-9-_@.:%]+[a-zA-Z0-9])=i", $url, $matches)) {
if (!preg_match('=(https?://.+)/(?:posts|display|objects)/([a-zA-Z0-9-_@.:%]+[a-zA-Z0-9])=i', $url, $matches)) {
Logger::info('Invalid url', ['url' => $url]);
return false;
}
@ -1162,10 +1169,10 @@ class Diaspora
* @param string $author The handle of the item
* @param array $contact The contact of the item owner
*
* @return array the item record
* @return array|bool the item record or false on failure
* @throws \Exception
*/
private static function parentItem($uid, $guid, $author, array $contact)
private static function parentItem(int $uid, string $guid, string $author, array $contact)
{
$fields = ['id', 'parent', 'body', 'wall', 'uri', 'guid', 'private', 'origin',
'author-name', 'author-link', 'author-avatar', 'gravity',
@ -1175,25 +1182,25 @@ class Diaspora
if (!DBA::isResult($item)) {
$person = FContact::getByURL($author);
$result = self::storeByGuid($guid, $person["url"], false);
$result = self::storeByGuid($guid, $person['url'], false);
// We don't have an url for items that arrived at the public dispatcher
if (!$result && !empty($contact["url"])) {
$result = self::storeByGuid($guid, $contact["url"], false);
if (!$result && !empty($contact['url'])) {
$result = self::storeByGuid($guid, $contact['url'], false);
}
if ($result) {
Logger::info("Fetched missing item ".$guid." - result: ".$result);
Logger::info("Fetched missing item " . $guid . " - result: " . $result);
$item = Post::selectFirst($fields, $condition);
}
}
if (!DBA::isResult($item)) {
Logger::notice("parent item not found: parent: ".$guid." - user: ".$uid);
Logger::notice("parent item not found: parent: " . $guid . " - user: " . $uid);
return false;
} else {
Logger::notice("parent item found: parent: ".$guid." - user: ".$uid);
Logger::notice("parent item found: parent: " . $guid . " - user: " . $uid);
return $item;
}
}
@ -1210,19 +1217,22 @@ class Diaspora
* 'network' => network type
* @throws \Exception
*/
private static function authorContactByUrl($def_contact, $person, $uid)
private static function authorContactByUrl(array $def_contact, array $person, int $uid): array
{
$condition = ['nurl' => Strings::normaliseLink($person["url"]), 'uid' => $uid];
$condition = ['nurl' => Strings::normaliseLink($person['url']), 'uid' => $uid];
$contact = DBA::selectFirst('contact', ['id', 'network'], $condition);
if (DBA::isResult($contact)) {
$cid = $contact["id"];
$network = $contact["network"];
$cid = $contact['id'];
$network = $contact['network'];
} else {
$cid = $def_contact["id"];
$cid = $def_contact['id'];
$network = Protocol::DIASPORA;
}
return ["cid" => $cid, "network" => $network];
return [
'cid' => $cid,
'network' => $network
];
}
/**
@ -1232,9 +1242,9 @@ class Diaspora
*
* @return bool is it a hubzilla server?
*/
private static function isHubzilla($url)
private static function isHubzilla(string $url): bool
{
return(strstr($url, '/channel/'));
return strstr($url, '/channel/');
}
/**
@ -1248,7 +1258,7 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function plink(string $addr, string $guid, string $parent_guid = '')
private static function plink(string $addr, string $guid, string $parent_guid = ''): string
{
$contact = Contact::getByURL($addr);
if (empty($contact)) {
@ -1306,30 +1316,30 @@ class Diaspora
* Receives account migration
*
* @param array $importer Array of the importer user
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool Success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function receiveAccountMigration(array $importer, $data)
private static function receiveAccountMigration(array $importer, SimpleXMLElement $data): bool
{
$old_handle = XML::unescape($data->author);
$new_handle = XML::unescape($data->profile->author);
$signature = XML::unescape($data->signature);
$contact = self::contactByHandle($importer["uid"], $old_handle);
$contact = self::contactByHandle($importer['uid'], $old_handle);
if (!$contact) {
Logger::notice("cannot find contact for sender: ".$old_handle." and user ".$importer["uid"]);
Logger::notice("cannot find contact for sender: " . $old_handle . " and user " . $importer['uid']);
return false;
}
Logger::notice("Got migration for ".$old_handle.", to ".$new_handle." with user ".$importer["uid"]);
Logger::notice("Got migration for " . $old_handle . ", to " . $new_handle . " with user " . $importer['uid']);
// Check signature
$signed_text = 'AccountMigration:'.$old_handle.':'.$new_handle;
$signed_text = 'AccountMigration:' . $old_handle . ':' . $new_handle;
$key = self::key($old_handle);
if (!Crypto::rsaVerify($signed_text, $signature, $key, "sha256")) {
if (!Crypto::rsaVerify($signed_text, $signature, $key, 'sha256')) {
Logger::notice('No valid signature for migration.');
return false;
}
@ -1340,15 +1350,21 @@ class Diaspora
// change the technical stuff in contact
$data = Probe::uri($new_handle);
if ($data['network'] == Protocol::PHANTOM) {
Logger::notice('Account for '.$new_handle." couldn't be probed.");
Logger::notice("Account for " . $new_handle . " couldn't be probed.");
return false;
}
$fields = ['url' => $data['url'], 'nurl' => Strings::normaliseLink($data['url']),
'name' => $data['name'], 'nick' => $data['nick'],
'addr' => $data['addr'], 'batch' => $data['batch'],
'notify' => $data['notify'], 'poll' => $data['poll'],
'network' => $data['network']];
$fields = [
'url' => $data['url'],
'nurl' => Strings::normaliseLink($data['url']),
'name' => $data['name'],
'nick' => $data['nick'],
'addr' => $data['addr'],
'batch' => $data['batch'],
'notify' => $data['notify'],
'poll' => $data['poll'],
'network' => $data['network']
];
Contact::update($fields, ['addr' => $old_handle]);
@ -1360,18 +1376,18 @@ class Diaspora
/**
* Processes an account deletion
*
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool Success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function receiveAccountDeletion($data)
private static function receiveAccountDeletion(SimpleXMLElement $data): bool
{
$author = XML::unescape($data->author);
$contacts = DBA::select('contact', ['id'], ['addr' => $author]);
while ($contact = DBA::fetch($contacts)) {
Contact::remove($contact["id"]);
Contact::remove($contact['id']);
}
DBA::close($contacts);
@ -1387,15 +1403,15 @@ class Diaspora
* @param string $guid Message guid
* @param boolean $onlyfound Only return uri when found in the database
*
* @return string The constructed uri or the one from our database
* @return string The constructed uri or the one from our database or empty string on if $onlyfound is true
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function getUriFromGuid($author, $guid, $onlyfound = false)
private static function getUriFromGuid(string $author, string $guid, bool $onlyfound = false): string
{
$item = Post::selectFirst(['uri'], ['guid' => $guid]);
if (DBA::isResult($item)) {
return $item["uri"];
return $item['uri'];
} elseif (!$onlyfound) {
$person = FContact::getByURL($author);
@ -1406,7 +1422,7 @@ class Diaspora
return $host_url . '/objects/' . $guid;
}
return "";
return '';
}
/**
@ -1448,7 +1464,7 @@ class Diaspora
*
* @param array $importer Array of the importer user
* @param string $sender The sender of the message
* @param object $data The message object
* @param SimpleXMLElement $data The message object
* @param string $xml The original XML of the message
* @param int $direction Indicates if the message had been fetched or pushed (self::PUSHED, self::FETCHED, self::FORCED_FETCH)
*
@ -1456,7 +1472,7 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function receiveComment(array $importer, $sender, $data, $xml, int $direction)
private static function receiveComment(array $importer, string $sender, SimpleXMLElement $data, string $xml, int $direction): bool
{
$author = XML::unescape($data->author);
$guid = XML::unescape($data->guid);
@ -1471,9 +1487,9 @@ class Diaspora
if (isset($data->thread_parent_guid)) {
$thread_parent_guid = XML::unescape($data->thread_parent_guid);
$thr_parent = self::getUriFromGuid("", $thread_parent_guid, true);
$thr_parent = self::getUriFromGuid('', $thread_parent_guid, true);
} else {
$thr_parent = "";
$thr_parent = '';
}
$contact = self::allowedContactByHandle($importer, $sender, true);
@ -1485,12 +1501,12 @@ class Diaspora
GServer::setProtocol($contact['gsid'], Post\DeliveryData::DIASPORA);
}
$message_id = self::messageExists($importer["uid"], $guid);
$message_id = self::messageExists($importer['uid'], $guid);
if ($message_id) {
return true;
}
$toplevel_parent_item = self::parentItem($importer["uid"], $parent_guid, $author, $contact);
$toplevel_parent_item = self::parentItem($importer['uid'], $parent_guid, $author, $contact);
if (!$toplevel_parent_item) {
return false;
}
@ -1502,60 +1518,60 @@ class Diaspora
}
// Fetch the contact id - if we know this contact
$author_contact = self::authorContactByUrl($contact, $person, $importer["uid"]);
$author_contact = self::authorContactByUrl($contact, $person, $importer['uid']);
$datarray = [];
$datarray["uid"] = $importer["uid"];
$datarray["contact-id"] = $author_contact["cid"];
$datarray["network"] = $author_contact["network"];
$datarray['uid'] = $importer['uid'];
$datarray['contact-id'] = $author_contact['cid'];
$datarray['network'] = $author_contact['network'];
$datarray["author-link"] = $person["url"];
$datarray["author-id"] = Contact::getIdForURL($person["url"], 0);
$datarray['author-link'] = $person['url'];
$datarray['author-id'] = Contact::getIdForURL($person['url'], 0);
$datarray["owner-link"] = $contact["url"];
$datarray["owner-id"] = Contact::getIdForURL($contact["url"], 0);
$datarray['owner-link'] = $contact['url'];
$datarray['owner-id'] = Contact::getIdForURL($contact['url'], 0);
// Will be overwritten for sharing accounts in Item::insert
if (in_array($direction, [self::FETCHED, self::FORCED_FETCH])) {
$datarray["post-reason"] = Item::PR_FETCHED;
} elseif ($datarray["uid"] == 0) {
$datarray["post-reason"] = Item::PR_GLOBAL;
$datarray['post-reason'] = Item::PR_FETCHED;
} elseif ($datarray['uid'] == 0) {
$datarray['post-reason'] = Item::PR_GLOBAL;
} else {
$datarray["post-reason"] = Item::PR_COMMENT;
$datarray['post-reason'] = Item::PR_COMMENT;
}
$datarray["guid"] = $guid;
$datarray["uri"] = self::getUriFromGuid($author, $guid);
$datarray['guid'] = $guid;
$datarray['uri'] = self::getUriFromGuid($author, $guid);
$datarray['uri-id'] = ItemURI::insert(['uri' => $datarray['uri'], 'guid' => $datarray['guid']]);
$datarray["verb"] = Activity::POST;
$datarray["gravity"] = GRAVITY_COMMENT;
$datarray['verb'] = Activity::POST;
$datarray['gravity'] = GRAVITY_COMMENT;
$datarray['thr-parent'] = $thr_parent ?: $toplevel_parent_item['uri'];
$datarray["object-type"] = Activity\ObjectType::COMMENT;
$datarray["post-type"] = Item::PT_NOTE;
$datarray['object-type'] = Activity\ObjectType::COMMENT;
$datarray['post-type'] = Item::PT_NOTE;
$datarray["protocol"] = Conversation::PARCEL_DIASPORA;
$datarray["source"] = $xml;
$datarray["direction"] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray['protocol'] = Conversation::PARCEL_DIASPORA;
$datarray['source'] = $xml;
$datarray['direction'] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray["changed"] = $datarray["created"] = $datarray["edited"] = $created_at;
$datarray['changed'] = $datarray['created'] = $datarray['edited'] = $created_at;
$datarray["plink"] = self::plink($author, $guid, $toplevel_parent_item['guid']);
$datarray['plink'] = self::plink($author, $guid, $toplevel_parent_item['guid']);
$body = Markdown::toBBCode($text);
$datarray["body"] = self::replacePeopleGuid($body, $person["url"]);
$datarray['body'] = self::replacePeopleGuid($body, $person['url']);
self::storeMentions($datarray['uri-id'], $text);
Tag::storeRawTagsFromBody($datarray['uri-id'], $datarray["body"]);
Tag::storeRawTagsFromBody($datarray['uri-id'], $datarray['body']);
self::fetchGuid($datarray);
// If we are the origin of the parent we store the original data.
// We notify our followers during the item storage.
if ($toplevel_parent_item["origin"]) {
if ($toplevel_parent_item['origin']) {
$datarray['diaspora_signed_text'] = json_encode($data);
}
@ -1571,7 +1587,7 @@ class Diaspora
}
if ($message_id) {
Logger::info("Stored comment ".$datarray["guid"]." with message id ".$message_id);
Logger::info("Stored comment " . $datarray['guid'] . " with message id " . $message_id);
if ($datarray['uid'] == 0) {
Item::distribute($message_id, json_encode($data));
}
@ -1585,15 +1601,16 @@ class Diaspora
*
* @param array $importer Array of the importer user
* @param array $contact The contact of the message
* @param object $data The message object
* @param SimpleXMLElement $data The message object
* @param array $msg Array of the processed message, author handle and key
* @param object $mesg The private message
* @param array $conversation The conversation record to which this message belongs
*
* @return bool "true" if it was successful
* @throws \Exception
* @todo Find type-hint for $mesg and update documentation
*/
private static function receiveConversationMessage(array $importer, array $contact, $data, $msg, $mesg, $conversation)
private static function receiveConversationMessage(array $importer, array $contact, SimpleXMLElement $data, array $msg, $mesg, array $conversation): bool
{
$author = XML::unescape($data->author);
$guid = XML::unescape($data->guid);
@ -1645,12 +1662,12 @@ class Diaspora
*
* @param array $importer Array of the importer user
* @param array $msg Array of the processed message, author handle and key
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool Success
* @throws \Exception
*/
private static function receiveConversation(array $importer, $msg, $data)
private static function receiveConversation(array $importer, array $msg, SimpleXMLElement $data)
{
$author = XML::unescape($data->author);
$guid = XML::unescape($data->guid);
@ -1665,7 +1682,7 @@ class Diaspora
return false;
}
$contact = self::allowedContactByHandle($importer, $msg["author"], true);
$contact = self::allowedContactByHandle($importer, $msg['author'], true);
if (!$contact) {
return false;
}
@ -1674,7 +1691,7 @@ class Diaspora
GServer::setProtocol($contact['gsid'], Post\DeliveryData::DIASPORA);
}
$conversation = DBA::selectFirst('conv', [], ['uid' => $importer["uid"], 'guid' => $guid]);
$conversation = DBA::selectFirst('conv', [], ['uid' => $importer['uid'], 'guid' => $guid]);
if (!DBA::isResult($conversation)) {
$r = DBA::insert('conv', [
'uid' => $importer['uid'],
@ -1685,7 +1702,7 @@ class Diaspora
'subject' => $subject,
'recips' => $participants]);
if ($r) {
$conversation = DBA::selectFirst('conv', [], ['uid' => $importer["uid"], 'guid' => $guid]);
$conversation = DBA::selectFirst('conv', [], ['uid' => $importer['uid'], 'guid' => $guid]);
}
}
if (!$conversation) {
@ -1705,14 +1722,14 @@ class Diaspora
*
* @param array $importer Array of the importer user
* @param string $sender The sender of the message
* @param object $data The message object
* @param SimpleXMLElement $data The message object
* @param int $direction Indicates if the message had been fetched or pushed (self::PUSHED, self::FETCHED, self::FORCED_FETCH)
*
* @return int The message id of the generated like or "false" if there was an error
* @return bool Success or failure
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function receiveLike(array $importer, $sender, $data, int $direction)
private static function receiveLike(array $importer, string $sender, SimpleXMLElement $data, int $direction): bool
{
$author = XML::unescape($data->author);
$guid = XML::unescape($data->guid);
@ -1722,7 +1739,7 @@ class Diaspora
// likes on comments aren't supported by Diaspora - only on posts
// But maybe this will be supported in the future, so we will accept it.
if (!in_array($parent_type, ["Post", "Comment"])) {
if (!in_array($parent_type, ['Post', 'Comment'])) {
return false;
}
@ -1735,12 +1752,12 @@ class Diaspora
GServer::setProtocol($contact['gsid'], Post\DeliveryData::DIASPORA);
}
$message_id = self::messageExists($importer["uid"], $guid);
$message_id = self::messageExists($importer['uid'], $guid);
if ($message_id) {
return true;
}
$toplevel_parent_item = self::parentItem($importer["uid"], $parent_guid, $author, $contact);
$toplevel_parent_item = self::parentItem($importer['uid'], $parent_guid, $author, $contact);
if (!$toplevel_parent_item) {
return false;
}
@ -1752,11 +1769,11 @@ class Diaspora
}
// Fetch the contact id - if we know this contact
$author_contact = self::authorContactByUrl($contact, $person, $importer["uid"]);
$author_contact = self::authorContactByUrl($contact, $person, $importer['uid']);
// "positive" = "false" would be a Dislike - wich isn't currently supported by Diaspora
// We would accept this anyhow.
if ($positive == "true") {
if ($positive == 'true') {
$verb = Activity::LIKE;
} else {
$verb = Activity::DISLIKE;
@ -1764,36 +1781,36 @@ class Diaspora
$datarray = [];
$datarray["protocol"] = Conversation::PARCEL_DIASPORA;
$datarray["direction"] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray['protocol'] = Conversation::PARCEL_DIASPORA;
$datarray['direction'] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray["uid"] = $importer["uid"];
$datarray["contact-id"] = $author_contact["cid"];
$datarray["network"] = $author_contact["network"];
$datarray['uid'] = $importer['uid'];
$datarray['contact-id'] = $author_contact['cid'];
$datarray['network'] = $author_contact['network'];
$datarray["owner-link"] = $datarray["author-link"] = $person["url"];
$datarray["owner-id"] = $datarray["author-id"] = Contact::getIdForURL($person["url"], 0);
$datarray['owner-link'] = $datarray['author-link'] = $person['url'];
$datarray['owner-id'] = $datarray['author-id'] = Contact::getIdForURL($person['url'], 0);
$datarray["guid"] = $guid;
$datarray["uri"] = self::getUriFromGuid($author, $guid);
$datarray['guid'] = $guid;
$datarray['uri'] = self::getUriFromGuid($author, $guid);
$datarray["verb"] = $verb;
$datarray["gravity"] = GRAVITY_ACTIVITY;
$datarray['verb'] = $verb;
$datarray['gravity'] = GRAVITY_ACTIVITY;
$datarray['thr-parent'] = $toplevel_parent_item['uri'];
$datarray["object-type"] = Activity\ObjectType::NOTE;
$datarray['object-type'] = Activity\ObjectType::NOTE;
$datarray["body"] = $verb;
$datarray['body'] = $verb;
// Diaspora doesn't provide a date for likes
$datarray["changed"] = $datarray["created"] = $datarray["edited"] = DateTimeFormat::utcNow();
$datarray['changed'] = $datarray['created'] = $datarray['edited'] = DateTimeFormat::utcNow();
// like on comments have the comment as parent. So we need to fetch the toplevel parent
if ($toplevel_parent_item['gravity'] != GRAVITY_PARENT) {
$toplevel = Post::selectFirst(['origin'], ['id' => $toplevel_parent_item['parent']]);
$origin = $toplevel["origin"];
$origin = $toplevel['origin'];
} else {
$origin = $toplevel_parent_item["origin"];
$origin = $toplevel_parent_item['origin'];
}
// If we are the origin of the parent we store the original data.
@ -1814,7 +1831,7 @@ class Diaspora
}
if ($message_id) {
Logger::info("Stored like ".$datarray["guid"]." with message id ".$message_id);
Logger::info("Stored like " . $datarray['guid'] . " with message id " . $message_id);
if ($datarray['uid'] == 0) {
Item::distribute($message_id, json_encode($data));
}
@ -1827,12 +1844,12 @@ class Diaspora
* Processes private messages
*
* @param array $importer Array of the importer user
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool Success?
* @throws \Exception
*/
private static function receiveMessage(array $importer, $data)
private static function receiveMessage(array $importer, SimpleXMLElement $data): bool
{
$author = XML::unescape($data->author);
$guid = XML::unescape($data->guid);
@ -1851,7 +1868,7 @@ class Diaspora
$conversation = null;
$condition = ['uid' => $importer["uid"], 'guid' => $conversation_guid];
$condition = ['uid' => $importer['uid'], 'guid' => $conversation_guid];
$conversation = DBA::selectFirst('conv', [], $condition);
if (!DBA::isResult($conversation)) {
@ -1859,7 +1876,7 @@ class Diaspora
return false;
}
$message_uri = $author.":".$guid;
$message_uri = $author . ':' . $guid;
$person = FContact::getByURL($author);
if (!$person) {
@ -1892,14 +1909,14 @@ class Diaspora
* Processes participations - unsupported by now
*
* @param array $importer Array of the importer user
* @param object $data The message object
* @param SimpleXMLElement $data The message object
* @param int $direction Indicates if the message had been fetched or pushed (self::PUSHED, self::FETCHED, self::FORCED_FETCH)
*
* @return bool success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function receiveParticipation(array $importer, $data, int $direction)
private static function receiveParticipation(array $importer, SimpleXMLElement $data, int $direction): bool
{
$author = strtolower(XML::unescape($data->author));
$guid = XML::unescape($data->guid);
@ -1914,11 +1931,11 @@ class Diaspora
GServer::setProtocol($contact['gsid'], Post\DeliveryData::DIASPORA);
}
if (self::messageExists($importer["uid"], $guid)) {
if (self::messageExists($importer['uid'], $guid)) {
return true;
}
$toplevel_parent_item = self::parentItem($importer["uid"], $parent_guid, $author, $contact);
$toplevel_parent_item = self::parentItem($importer['uid'], $parent_guid, $author, $contact);
if (!$toplevel_parent_item) {
return false;
}
@ -1934,38 +1951,38 @@ class Diaspora
$person = FContact::getByURL($author);
if (!is_array($person)) {
Logger::notice("Person not found: ".$author);
Logger::notice("Person not found: " . $author);
return false;
}
$author_contact = self::authorContactByUrl($contact, $person, $importer["uid"]);
$author_contact = self::authorContactByUrl($contact, $person, $importer['uid']);
// Store participation
$datarray = [];
$datarray["protocol"] = Conversation::PARCEL_DIASPORA;
$datarray["direction"] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray['protocol'] = Conversation::PARCEL_DIASPORA;
$datarray['direction'] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray["uid"] = $importer["uid"];
$datarray["contact-id"] = $author_contact["cid"];
$datarray["network"] = $author_contact["network"];
$datarray['uid'] = $importer['uid'];
$datarray['contact-id'] = $author_contact['cid'];
$datarray['network'] = $author_contact['network'];
$datarray["owner-link"] = $datarray["author-link"] = $person["url"];
$datarray["owner-id"] = $datarray["author-id"] = Contact::getIdForURL($person["url"], 0);
$datarray['owner-link'] = $datarray['author-link'] = $person['url'];
$datarray['owner-id'] = $datarray['author-id'] = Contact::getIdForURL($person['url'], 0);
$datarray["guid"] = $guid;
$datarray["uri"] = self::getUriFromGuid($author, $guid);
$datarray['guid'] = $guid;
$datarray['uri'] = self::getUriFromGuid($author, $guid);
$datarray["verb"] = Activity::FOLLOW;
$datarray["gravity"] = GRAVITY_ACTIVITY;
$datarray['verb'] = Activity::FOLLOW;
$datarray['gravity'] = GRAVITY_ACTIVITY;
$datarray['thr-parent'] = $toplevel_parent_item['uri'];
$datarray["object-type"] = Activity\ObjectType::NOTE;
$datarray['object-type'] = Activity\ObjectType::NOTE;
$datarray["body"] = Activity::FOLLOW;
$datarray['body'] = Activity::FOLLOW;
// Diaspora doesn't provide a date for a participation
$datarray["changed"] = $datarray["created"] = $datarray["edited"] = DateTimeFormat::utcNow();
$datarray['changed'] = $datarray['created'] = $datarray['edited'] = DateTimeFormat::utcNow();
if (Item::isTooOld($datarray)) {
Logger::info('Participation is too old', ['created' => $datarray['created'], 'uid' => $datarray['uid'], 'guid' => $datarray['guid']]);
@ -1995,8 +2012,8 @@ class Diaspora
continue;
}
Logger::info('Deliver participation', ['item' => $comment['id'], 'contact' => $author_contact["cid"]]);
if (Worker::add(PRIORITY_HIGH, 'Delivery', Delivery::POST, $comment['id'], $author_contact["cid"])) {
Logger::info('Deliver participation', ['item' => $comment['id'], 'contact' => $author_contact['cid']]);
if (Worker::add(PRIORITY_HIGH, 'Delivery', Delivery::POST, $comment['id'], $author_contact['cid'])) {
Post\DeliveryData::incrementQueueCount($comment['uri-id'], 1);
}
}
@ -2009,7 +2026,7 @@ class Diaspora
* Processes photos - unneeded
*
* @param array $importer Array of the importer user
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool always true
*/
@ -2038,68 +2055,69 @@ class Diaspora
* Processes incoming profile updates
*
* @param array $importer Array of the importer user
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool Success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function receiveProfile(array $importer, $data)
private static function receiveProfile(array $importer, SimpleXMLElement $data): bool
{
$author = strtolower(XML::unescape($data->author));
$contact = self::contactByHandle($importer["uid"], $author);
$contact = self::contactByHandle($importer['uid'], $author);
if (!$contact) {
return false;
}
$name = XML::unescape($data->first_name).((strlen($data->last_name)) ? " ".XML::unescape($data->last_name) : "");
$name = XML::unescape($data->first_name).((strlen($data->last_name)) ? ' ' . XML::unescape($data->last_name) : '');
$image_url = XML::unescape($data->image_url);
$birthday = XML::unescape($data->birthday);
$about = Markdown::toBBCode(XML::unescape($data->bio));
$location = Markdown::toBBCode(XML::unescape($data->location));
$searchable = (XML::unescape($data->searchable) == "true");
$nsfw = (XML::unescape($data->nsfw) == "true");
$searchable = (XML::unescape($data->searchable) == 'true');
$nsfw = (XML::unescape($data->nsfw) == 'true');
$tags = XML::unescape($data->tag_string);
$tags = explode("#", $tags);
$tags = explode('#', $tags);
$keywords = [];
foreach ($tags as $tag) {
$tag = trim(strtolower($tag));
if ($tag != "") {
if ($tag != '') {
$keywords[] = $tag;
}
}
$keywords = implode(", ", $keywords);
$keywords = implode(', ', $keywords);
$handle_parts = explode("@", $author);
$handle_parts = explode('@', $author);
$nick = $handle_parts[0];
if ($name === "") {
if ($name === '') {
$name = $handle_parts[0];
}
if (preg_match("|^https?://|", $image_url) === 0) {
$image_url = "http://".$handle_parts[1].$image_url;
if (preg_match('|^https?://|', $image_url) === 0) {
// @TODO No HTTPS here?
$image_url = 'http://' . $handle_parts[1] . $image_url;
}
Contact::updateAvatar($contact["id"], $image_url);
Contact::updateAvatar($contact['id'], $image_url);
// Generic birthday. We don't know the timezone. The year is irrelevant.
$birthday = str_replace("1000", "1901", $birthday);
$birthday = str_replace('1000', '1901', $birthday);
if ($birthday != "") {
$birthday = DateTimeFormat::utc($birthday, "Y-m-d");
if ($birthday != '') {
$birthday = DateTimeFormat::utc($birthday, 'Y-m-d');
}
// this is to prevent multiple birthday notifications in a single year
// if we already have a stored birthday and the 'm-d' part hasn't changed, preserve the entry, which will preserve the notify year
if (substr($birthday, 5) === substr($contact["bd"], 5)) {
$birthday = $contact["bd"];
if (substr($birthday, 5) === substr($contact['bd'], 5)) {
$birthday = $contact['bd'];
}
$fields = ['name' => $name, 'location' => $location,
@ -2113,7 +2131,7 @@ class Diaspora
Contact::update($fields, ['id' => $contact['id']]);
Logger::info("Profile of contact ".$contact["id"]." stored for user ".$importer["uid"]);
Logger::info("Profile of contact " . $contact['id'] . " stored for user " . $importer['uid']);
return true;
}
@ -2128,10 +2146,10 @@ class Diaspora
*/
private static function receiveRequestMakeFriend(array $importer, array $contact)
{
if ($contact["rel"] == Contact::SHARING) {
if ($contact['rel'] == Contact::SHARING) {
Contact::update(
['rel' => Contact::FRIEND, 'writable' => true],
['id' => $contact["id"], 'uid' => $importer["uid"]]
['id' => $contact['id'], 'uid' => $importer['uid']]
);
}
}
@ -2140,12 +2158,12 @@ class Diaspora
* Processes incoming sharing notification
*
* @param array $importer Array of the importer user
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool Success
* @throws \Exception
*/
private static function receiveContactRequest(array $importer, $data)
private static function receiveContactRequest(array $importer, SimpleXMLElement $data): bool
{
$author = XML::unescape($data->author);
$recipient = XML::unescape($data->recipient);
@ -2157,64 +2175,64 @@ class Diaspora
// the current protocol version doesn't know these fields
// That means that we will assume their existance
if (isset($data->following)) {
$following = (XML::unescape($data->following) == "true");
$following = (XML::unescape($data->following) == 'true');
} else {
$following = true;
}
if (isset($data->sharing)) {
$sharing = (XML::unescape($data->sharing) == "true");
$sharing = (XML::unescape($data->sharing) == 'true');
} else {
$sharing = true;
}
$contact = self::contactByHandle($importer["uid"], $author);
$contact = self::contactByHandle($importer['uid'], $author);
// perhaps we were already sharing with this person. Now they're sharing with us.
// That makes us friends.
if ($contact) {
if ($following) {
Logger::info("Author ".$author." (Contact ".$contact["id"].") wants to follow us.");
Logger::info("Author " . $author . " (Contact " . $contact['id'] . ") wants to follow us.");
self::receiveRequestMakeFriend($importer, $contact);
// refetch the contact array
$contact = self::contactByHandle($importer["uid"], $author);
$contact = self::contactByHandle($importer['uid'], $author);
// If we are now friends, we are sending a share message.
// Normally we needn't to do so, but the first message could have been vanished.
if (in_array($contact["rel"], [Contact::FRIEND])) {
$user = DBA::selectFirst('user', [], ['uid' => $importer["uid"]]);
if (in_array($contact['rel'], [Contact::FRIEND])) {
$user = DBA::selectFirst('user', [], ['uid' => $importer['uid']]);
if (DBA::isResult($user)) {
Logger::info("Sending share message to author ".$author." - Contact: ".$contact["id"]." - User: ".$importer["uid"]);
Logger::info("Sending share message to author " . $author . " - Contact: " . $contact['id'] . " - User: " . $importer['uid']);
self::sendShare($user, $contact);
}
}
return true;
} else {
Logger::info("Author ".$author." doesn't want to follow us anymore.");
Logger::info("Author " . $author . " doesn't want to follow us anymore.");
Contact::removeFollower($contact);
return true;
}
}
if (!$following && $sharing && in_array($importer["page-flags"], [User::PAGE_FLAGS_SOAPBOX, User::PAGE_FLAGS_NORMAL])) {
Logger::info("Author ".$author." wants to share with us - but doesn't want to listen. Request is ignored.");
if (!$following && $sharing && in_array($importer['page-flags'], [User::PAGE_FLAGS_SOAPBOX, User::PAGE_FLAGS_NORMAL])) {
Logger::info("Author " . $author . " wants to share with us - but doesn't want to listen. Request is ignored.");
return false;
} elseif (!$following && !$sharing) {
Logger::info("Author ".$author." doesn't want anything - and we don't know the author. Request is ignored.");
Logger::info("Author " . $author . " doesn't want anything - and we don't know the author. Request is ignored.");
return false;
} elseif (!$following && $sharing) {
Logger::info("Author ".$author." wants to share with us.");
Logger::info("Author " . $author . " wants to share with us.");
} elseif ($following && $sharing) {
Logger::info("Author ".$author." wants to have a bidirectional conection.");
Logger::info("Author " . $author . " wants to have a bidirectional conection.");
} elseif ($following && !$sharing) {
Logger::info("Author ".$author." wants to listen to us.");
Logger::info("Author " . $author . " wants to listen to us.");
}
$ret = FContact::getByURL($author);
if (!$ret || ($ret["network"] != Protocol::DIASPORA)) {
Logger::notice("Cannot resolve diaspora handle ".$author." for ".$recipient);
if (!$ret || ($ret['network'] != Protocol::DIASPORA)) {
Logger::notice("Cannot resolve diaspora handle " . $author . " for ".$recipient);
return false;
}
@ -2233,7 +2251,7 @@ class Diaspora
$contact_record = self::contactByHandle($importer['uid'], $author);
if (!$contact_record) {
Logger::info('unable to locate newly created contact record.');
return;
return false;
}
$user = DBA::selectFirst('user', [], ['uid' => $importer['uid']]);
@ -2253,11 +2271,11 @@ class Diaspora
*
* @param string $guid message guid
* @param string $orig_author handle of the original post
* @return array The fetched item
* @return array|bool The fetched item or false on failure
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function originalItem($guid, $orig_author)
public static function originalItem(string $guid, string $orig_author)
{
if (empty($guid)) {
Logger::notice('Empty guid. Quitting.');
@ -2271,17 +2289,17 @@ class Diaspora
$item = Post::selectFirst($fields, $condition);
if (DBA::isResult($item)) {
Logger::notice("reshared message ".$guid." already exists on system.");
Logger::notice("reshared message " . $guid . " already exists on system.");
// Maybe it is already a reshared item?
// Then refetch the content, if it is a reshare from a reshare.
// If it is a reshared post from another network then reformat to avoid display problems with two share elements
if (self::isReshare($item["body"], true)) {
if (self::isReshare($item['body'], true)) {
$item = [];
} elseif (self::isReshare($item["body"], false) || strstr($item["body"], "[share")) {
$item["body"] = Markdown::toBBCode(BBCode::toMarkdown($item["body"]));
} elseif (self::isReshare($item['body'], false) || strstr($item['body'], '[share')) {
$item['body'] = Markdown::toBBCode(BBCode::toMarkdown($item['body']));
$item["body"] = self::replacePeopleGuid($item["body"], $item["author-link"]);
$item['body'] = self::replacePeopleGuid($item['body'], $item['author-link']);
return $item;
} else {
@ -2295,13 +2313,13 @@ class Diaspora
return false;
}
$server = "https://".substr($orig_author, strpos($orig_author, "@") + 1);
Logger::notice("1st try: reshared message ".$guid." will be fetched via SSL from the server ".$server);
$server = 'https://' . substr($orig_author, strpos($orig_author, '@') + 1);
Logger::notice("1st try: reshared message " . $guid . " will be fetched via SSL from the server " . $server);
$stored = self::storeByGuid($guid, $server, true);
if (!$stored) {
$server = "http://".substr($orig_author, strpos($orig_author, "@") + 1);
Logger::notice("2nd try: reshared message ".$guid." will be fetched without SSL from the server ".$server);
$server = 'http://' . substr($orig_author, strpos($orig_author, '@') + 1);
Logger::notice("2nd try: reshared message " . $guid . " will be fetched without SSL from the server " . $server);
$stored = self::storeByGuid($guid, $server, true);
}
@ -2313,9 +2331,9 @@ class Diaspora
if (DBA::isResult($item)) {
// If it is a reshared post from another network then reformat to avoid display problems with two share elements
if (self::isReshare($item["body"], false)) {
$item["body"] = Markdown::toBBCode(BBCode::toMarkdown($item["body"]));
$item["body"] = self::replacePeopleGuid($item["body"], $item["author-link"]);
if (self::isReshare($item['body'], false)) {
$item['body'] = Markdown::toBBCode(BBCode::toMarkdown($item['body']));
$item['body'] = self::replacePeopleGuid($item['body'], $item['author-link']);
}
return $item;
@ -2333,7 +2351,7 @@ class Diaspora
* @param string $guid GUID string of reshare action
* @param string $author Author handle
*/
private static function addReshareActivity($item, $parent_message_id, $guid, $author)
private static function addReshareActivity(array $item, int $parent_message_id, string $guid, string $author)
{
$parent = Post::selectFirst(['uri', 'guid'], ['id' => $parent_message_id]);
@ -2384,15 +2402,15 @@ class Diaspora
* Processes a reshare message
*
* @param array $importer Array of the importer user
* @param object $data The message object
* @param SimpleXMLElement $data The message object
* @param string $xml The original XML of the message
* @param int $direction Indicates if the message had been fetched or pushed (self::PUSHED, self::FETCHED, self::FORCED_FETCH)
*
* @return int the message id
* @return bool Success or failure
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function receiveReshare(array $importer, $data, $xml, int $direction)
private static function receiveReshare(array $importer, SimpleXMLElement $data, string $xml, int $direction): bool
{
$author = XML::unescape($data->author);
$guid = XML::unescape($data->guid);
@ -2411,7 +2429,7 @@ class Diaspora
GServer::setProtocol($contact['gsid'], Post\DeliveryData::DIASPORA);
}
$message_id = self::messageExists($importer["uid"], $guid);
$message_id = self::messageExists($importer['uid'], $guid);
if ($message_id) {
return true;
}
@ -2427,53 +2445,53 @@ class Diaspora
$datarray = [];
$datarray["uid"] = $importer["uid"];
$datarray["contact-id"] = $contact["id"];
$datarray["network"] = Protocol::DIASPORA;
$datarray['uid'] = $importer['uid'];
$datarray['contact-id'] = $contact['id'];
$datarray['network'] = Protocol::DIASPORA;
$datarray["author-link"] = $contact["url"];
$datarray["author-id"] = Contact::getIdForURL($contact["url"], 0);
$datarray['author-link'] = $contact['url'];
$datarray['author-id'] = Contact::getIdForURL($contact['url'], 0);
$datarray["owner-link"] = $datarray["author-link"];
$datarray["owner-id"] = $datarray["author-id"];
$datarray['owner-link'] = $datarray['author-link'];
$datarray['owner-id'] = $datarray['author-id'];
$datarray["guid"] = $guid;
$datarray["uri"] = $datarray["thr-parent"] = self::getUriFromGuid($author, $guid);
$datarray['guid'] = $guid;
$datarray['uri'] = $datarray['thr-parent'] = self::getUriFromGuid($author, $guid);
$datarray['uri-id'] = ItemURI::insert(['uri' => $datarray['uri'], 'guid' => $datarray['guid']]);
$datarray["verb"] = Activity::POST;
$datarray["gravity"] = GRAVITY_PARENT;
$datarray['verb'] = Activity::POST;
$datarray['gravity'] = GRAVITY_PARENT;
$datarray["protocol"] = Conversation::PARCEL_DIASPORA;
$datarray["source"] = $xml;
$datarray["direction"] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray['protocol'] = Conversation::PARCEL_DIASPORA;
$datarray['source'] = $xml;
$datarray['direction'] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
/// @todo Copy tag data from original post
$prefix = BBCode::getShareOpeningTag(
$original_item["author-name"],
$original_item["author-link"],
$original_item["author-avatar"],
$original_item["plink"],
$original_item["created"],
$original_item["guid"]
$original_item['author-name'],
$original_item['author-link'],
$original_item['author-avatar'],
$original_item['plink'],
$original_item['created'],
$original_item['guid']
);
if (!empty($original_item['title'])) {
$prefix .= '[h3]' . $original_item['title'] . "[/h3]\n";
}
$datarray["body"] = $prefix.$original_item["body"]."[/share]";
$datarray['body'] = $prefix.$original_item['body'] . '[/share]';
Tag::storeFromBody($datarray['uri-id'], $datarray["body"]);
Tag::storeFromBody($datarray['uri-id'], $datarray['body']);
$datarray["app"] = $original_item["app"];
$datarray['app'] = $original_item['app'];
$datarray["plink"] = self::plink($author, $guid);
$datarray["private"] = (($public == "false") ? Item::PRIVATE : Item::PUBLIC);
$datarray["changed"] = $datarray["created"] = $datarray["edited"] = $created_at;
$datarray['plink'] = self::plink($author, $guid);
$datarray['private'] = (($public == 'false') ? Item::PRIVATE : Item::PUBLIC);
$datarray['changed'] = $datarray['created'] = $datarray['edited'] = $created_at;
$datarray["object-type"] = $original_item["object-type"];
$datarray['object-type'] = $original_item['object-type'];
self::fetchGuid($datarray);
@ -2486,13 +2504,13 @@ class Diaspora
self::sendParticipation($contact, $datarray);
$root_message_id = self::messageExists($importer["uid"], $root_guid);
$root_message_id = self::messageExists($importer['uid'], $root_guid);
if ($root_message_id) {
self::addReshareActivity($datarray, $root_message_id, $guid, $author);
}
if ($message_id) {
Logger::info("Stored reshare ".$datarray["guid"]." with message id ".$message_id);
Logger::info("Stored reshare " . $datarray['guid'] . " with message id " . $message_id);
if ($datarray['uid'] == 0) {
Item::distribute($message_id);
}
@ -2507,12 +2525,12 @@ class Diaspora
*
* @param array $importer Array of the importer user
* @param array $contact The contact of the item owner
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool success
* @throws \Exception
*/
private static function itemRetraction(array $importer, array $contact, $data)
private static function itemRetraction(array $importer, array $contact, SimpleXMLElement $data): bool
{
$author = XML::unescape($data->author);
$target_guid = XML::unescape($data->target_guid);
@ -2520,12 +2538,12 @@ class Diaspora
$person = FContact::getByURL($author);
if (!is_array($person)) {
Logger::notice("unable to find author detail for ".$author);
Logger::notice("unable to find author detail for " . $author);
return false;
}
if (empty($contact["url"])) {
$contact["url"] = $person["url"];
if (empty($contact['url'])) {
$contact['url'] = $person['url'];
}
// Fetch items that are about to be deleted
@ -2540,7 +2558,7 @@ class Diaspora
$r = Post::select($fields, $condition);
if (!DBA::isResult($r)) {
Logger::notice("Target guid ".$target_guid." was not found on this system for user ".$importer['uid'].".");
Logger::notice("Target guid " . $target_guid . " was not found on this system for user " . $importer['uid'] . ".");
return false;
}
@ -2554,14 +2572,14 @@ class Diaspora
$parent = Post::selectFirst(['author-link'], ['id' => $item['parent']]);
// Only delete it if the parent author really fits
if (!Strings::compareLink($parent["author-link"], $contact["url"]) && !Strings::compareLink($item["author-link"], $contact["url"])) {
Logger::info("Thread author ".$parent["author-link"]." and item author ".$item["author-link"]." don't fit to expected contact ".$contact["url"]);
if (!Strings::compareLink($parent['author-link'], $contact['url']) && !Strings::compareLink($item['author-link'], $contact['url'])) {
Logger::info("Thread author " . $parent['author-link'] . " and item author " . $item['author-link'] . " don't fit to expected contact " . $contact['url']);
continue;
}
Item::markForDeletion(['id' => $item['id']]);
Logger::info("Deleted target ".$target_guid." (".$item["id"].") from user ".$item["uid"]." parent: ".$item['parent']);
Logger::info("Deleted target " . $target_guid . " (" . $item['id'] . ") from user " . $item['uid'] . " parent: " . $item['parent']);
}
DBA::close($r);
@ -2573,18 +2591,18 @@ class Diaspora
*
* @param array $importer Array of the importer user
* @param string $sender The sender of the message
* @param object $data The message object
* @param SimpleXMLElement $data The message object
*
* @return bool Success
* @throws \Exception
*/
private static function receiveRetraction(array $importer, $sender, $data)
private static function receiveRetraction(array $importer, string $sender, SimpleXMLElement $data)
{
$target_type = XML::unescape($data->target_type);
$contact = self::contactByHandle($importer["uid"], $sender);
if (!$contact && (in_array($target_type, ["Contact", "Person"]))) {
Logger::notice("cannot find contact for sender: ".$sender." and user ".$importer["uid"]);
$contact = self::contactByHandle($importer['uid'], $sender);
if (!$contact && (in_array($target_type, ['Contact', 'Person']))) {
Logger::notice("cannot find contact for sender: " . $sender . " and user " . $importer['uid']);
return false;
}
@ -2592,23 +2610,23 @@ class Diaspora
$contact = [];
}
Logger::info("Got retraction for ".$target_type.", sender ".$sender." and user ".$importer["uid"]);
Logger::info("Got retraction for " . $target_type . ", sender " . $sender . " and user " . $importer['uid']);
switch ($target_type) {
case "Comment":
case "Like":
case "Post":
case "Reshare":
case "StatusMessage":
case 'Comment':
case 'Like':
case 'Post':
case 'Reshare':
case 'StatusMessage':
return self::itemRetraction($importer, $contact, $data);
case "PollParticipation":
case "Photo":
case 'PollParticipation':
case 'Photo':
// Currently unsupported
break;
default:
Logger::notice("Unknown target type ".$target_type);
Logger::notice("Unknown target type " . $target_type);
return false;
}
return true;
@ -2624,11 +2642,10 @@ class Diaspora
*
* @return boolean Is the message wanted?
*/
private static function isSolicitedMessage(array $item, string $author, string $body, int $direction)
private static function isSolicitedMessage(array $item, string $author, string $body, int $direction): bool
{
$contact = Contact::getByURL($author);
if (DBA::exists('contact', ["`nurl` = ? AND `uid` != ? AND `rel` IN (?, ?)",
$contact['nurl'], 0, Contact::FRIEND, Contact::SHARING])) {
if (DBA::exists('contact', ['`nurl` = ? AND `uid` != ? AND `rel` IN (?, ?)', $contact['nurl'], 0, Contact::FRIEND, Contact::SHARING])) {
Logger::debug('Author has got followers - accepted', ['uri-id' => $item['uri-id'], 'guid' => $item['guid'], 'url' => $item['uri'], 'author' => $author]);
return true;
}
@ -2656,6 +2673,8 @@ class Diaspora
*/
private static function storePhotoAsMedia(int $uriid, $photo)
{
// @TODO Need to find object type, roland@f.haeder.net
Logger::debug('photo='.get_class($photo));
$data = [];
$data['uri-id'] = $uriid;
$data['type'] = Post\Media::IMAGE;
@ -2675,11 +2694,11 @@ class Diaspora
* @param string $xml The original XML of the message
* @param int $direction Indicates if the message had been fetched or pushed (self::PUSHED, self::FETCHED, self::FORCED_FETCH)
*
* @return int The message id of the newly created item
* @return int|bool The message id of the newly created item or false on error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function receiveStatusMessage(array $importer, SimpleXMLElement $data, $xml, int $direction)
private static function receiveStatusMessage(array $importer, SimpleXMLElement $data, string $xml, int $direction)
{
$author = XML::unescape($data->author);
$guid = XML::unescape($data->guid);
@ -2697,7 +2716,7 @@ class Diaspora
GServer::setProtocol($contact['gsid'], Post\DeliveryData::DIASPORA);
}
$message_id = self::messageExists($importer["uid"], $guid);
$message_id = self::messageExists($importer['uid'], $guid);
if ($message_id) {
return true;
}
@ -2713,8 +2732,8 @@ class Diaspora
$datarray = [];
$datarray["guid"] = $guid;
$datarray["uri"] = $datarray["thr-parent"] = self::getUriFromGuid($author, $guid);
$datarray['guid'] = $guid;
$datarray['uri'] = $datarray['thr-parent'] = self::getUriFromGuid($author, $guid);
$datarray['uri-id'] = ItemURI::insert(['uri' => $datarray['uri'], 'guid' => $datarray['guid']]);
// Attach embedded pictures to the body
@ -2723,14 +2742,14 @@ class Diaspora
self::storePhotoAsMedia($datarray['uri-id'], $photo);
}
$datarray["object-type"] = Activity\ObjectType::IMAGE;
$datarray["post-type"] = Item::PT_IMAGE;
$datarray['object-type'] = Activity\ObjectType::IMAGE;
$datarray['post-type'] = Item::PT_IMAGE;
} elseif ($data->poll) {
$datarray["object-type"] = Activity\ObjectType::NOTE;
$datarray["post-type"] = Item::PT_POLL;
$datarray['object-type'] = Activity\ObjectType::NOTE;
$datarray['post-type'] = Item::PT_POLL;
} else {
$datarray["object-type"] = Activity\ObjectType::NOTE;
$datarray["post-type"] = Item::PT_NOTE;
$datarray['object-type'] = Activity\ObjectType::NOTE;
$datarray['post-type'] = Item::PT_NOTE;
}
/// @todo enable support for polls
@ -2742,54 +2761,54 @@ class Diaspora
/// @todo enable support for events
$datarray["uid"] = $importer["uid"];
$datarray["contact-id"] = $contact["id"];
$datarray["network"] = Protocol::DIASPORA;
$datarray['uid'] = $importer['uid'];
$datarray['contact-id'] = $contact['id'];
$datarray['network'] = Protocol::DIASPORA;
$datarray["author-link"] = $contact["url"];
$datarray["author-id"] = Contact::getIdForURL($contact["url"], 0);
$datarray['author-link'] = $contact['url'];
$datarray['author-id'] = Contact::getIdForURL($contact['url'], 0);
$datarray["owner-link"] = $datarray["author-link"];
$datarray["owner-id"] = $datarray["author-id"];
$datarray['owner-link'] = $datarray['author-link'];
$datarray['owner-id'] = $datarray['author-id'];
$datarray["verb"] = Activity::POST;
$datarray["gravity"] = GRAVITY_PARENT;
$datarray['verb'] = Activity::POST;
$datarray['gravity'] = GRAVITY_PARENT;
$datarray["protocol"] = Conversation::PARCEL_DIASPORA;
$datarray["source"] = $xml;
$datarray["direction"] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
$datarray['protocol'] = Conversation::PARCEL_DIASPORA;
$datarray['source'] = $xml;
$datarray['direction'] = in_array($direction, [self::FETCHED, self::FORCED_FETCH]) ? Conversation::PULL : Conversation::PUSH;
if (in_array($direction, [self::FETCHED, self::FORCED_FETCH])) {
$datarray["post-reason"] = Item::PR_FETCHED;
} elseif ($datarray["uid"] == 0) {
$datarray["post-reason"] = Item::PR_GLOBAL;
$datarray['post-reason'] = Item::PR_FETCHED;
} elseif ($datarray['uid'] == 0) {
$datarray['post-reason'] = Item::PR_GLOBAL;
}
$datarray["body"] = self::replacePeopleGuid($body, $contact["url"]);
$datarray["raw-body"] = self::replacePeopleGuid($raw_body, $contact["url"]);
$datarray['body'] = self::replacePeopleGuid($body, $contact['url']);
$datarray['raw-body'] = self::replacePeopleGuid($raw_body, $contact['url']);
self::storeMentions($datarray['uri-id'], $text);
Tag::storeRawTagsFromBody($datarray['uri-id'], $datarray["body"]);
Tag::storeRawTagsFromBody($datarray['uri-id'], $datarray['body']);
if (!self::isSolicitedMessage($datarray, $author, $body, $direction)) {
DBA::delete('item-uri', ['uri' => $datarray['uri']]);
return false;
}
if ($provider_display_name != "") {
$datarray["app"] = $provider_display_name;
if ($provider_display_name != '') {
$datarray['app'] = $provider_display_name;
}
$datarray["plink"] = self::plink($author, $guid);
$datarray["private"] = (($public == "false") ? Item::PRIVATE : Item::PUBLIC);
$datarray["changed"] = $datarray["created"] = $datarray["edited"] = $created_at;
$datarray['plink'] = self::plink($author, $guid);
$datarray['private'] = (($public == 'false') ? Item::PRIVATE : Item::PUBLIC);
$datarray['changed'] = $datarray['created'] = $datarray['edited'] = $created_at;
if (isset($address["address"])) {
$datarray["location"] = $address["address"];
if (isset($address['address'])) {
$datarray['location'] = $address['address'];
}
if (isset($address["lat"]) && isset($address["lng"])) {
$datarray["coord"] = $address["lat"]." ".$address["lng"];
if (isset($address['lat']) && isset($address['lng'])) {
$datarray['coord'] = $address['lat'] . " " . $address['lng'];
}
self::fetchGuid($datarray);
@ -2804,7 +2823,7 @@ class Diaspora
self::sendParticipation($contact, $datarray);
if ($message_id) {
Logger::info("Stored item ".$datarray["guid"]." with message id ".$message_id);
Logger::info("Stored item " . $datarray['guid'] . " with message id " . $message_id);
if ($datarray['uid'] == 0) {
Item::distribute($message_id);
}
@ -2826,21 +2845,21 @@ class Diaspora
* @return string the handle in the format user@domain.tld
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function myHandle(array $contact)
private static function myHandle(array $contact): string
{
if (!empty($contact["addr"])) {
return $contact["addr"];
if (!empty($contact['addr'])) {
return $contact['addr'];
}
// Normally we should have a filled "addr" field - but in the past this wasn't the case
// So - just in case - we build the the address here.
if ($contact["nickname"] != "") {
$nick = $contact["nickname"];
if ($contact['nickname'] != '') {
$nick = $contact['nickname'];
} else {
$nick = $contact["nick"];
$nick = $contact['nick'];
}
return $nick . "@" . substr(DI::baseUrl(), strpos(DI::baseUrl(), "://") + 3);
return $nick . '@' . substr(DI::baseUrl(), strpos(DI::baseUrl(), '://') + 3);
}
@ -2856,7 +2875,7 @@ class Diaspora
* @return string The encrypted data
* @throws \Exception
*/
public static function encodePrivateData($msg, array $user, array $contact, $prvkey, $pubkey)
public static function encodePrivateData(string $msg, array $user, array $contact, string $prvkey, string $pubkey): string
{
Logger::debug("Message: ".$msg);
@ -2873,16 +2892,18 @@ class Diaspora
$ciphertext = self::aesEncrypt($aes_key, $iv, $msg);
$json = json_encode(["iv" => $b_iv, "key" => $b_aes_key]);
$json = json_encode(['iv' => $b_iv, 'key' => $b_aes_key]);
$encrypted_key_bundle = "";
$encrypted_key_bundle = '';
if (!@openssl_public_encrypt($json, $encrypted_key_bundle, $pubkey)) {
return false;
}
$json_object = json_encode(
["aes_key" => base64_encode($encrypted_key_bundle),
"encrypted_magic_envelope" => base64_encode($ciphertext)]
[
'aes_key' => base64_encode($encrypted_key_bundle),
'encrypted_magic_envelope' => base64_encode($ciphertext)
]
);
return $json_object;
@ -2897,33 +2918,37 @@ class Diaspora
* @return string The envelope
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function buildMagicEnvelope($msg, array $user)
public static function buildMagicEnvelope(string $msg, array $user): string
{
$b64url_data = Strings::base64UrlEncode($msg);
$data = str_replace(["\n", "\r", " ", "\t"], ["", "", "", ""], $b64url_data);
$data = str_replace(["\n", "\r", " ", "\t"], ['', '', '', ''], $b64url_data);
$key_id = Strings::base64UrlEncode(self::myHandle($user));
$type = "application/xml";
$encoding = "base64url";
$alg = "RSA-SHA256";
$signable_data = $data.".".Strings::base64UrlEncode($type).".".Strings::base64UrlEncode($encoding).".".Strings::base64UrlEncode($alg);
$type = 'application/xml';
$encoding = 'base64url';
$alg = 'RSA-SHA256';
$signable_data = $data . '.' . Strings::base64UrlEncode($type) . '.' . Strings::base64UrlEncode($encoding) . '.' . Strings::base64UrlEncode($alg);
// Fallback if the private key wasn't transmitted in the expected field
if ($user['uprvkey'] == "") {
if ($user['uprvkey'] == '') {
$user['uprvkey'] = $user['prvkey'];
}
$signature = Crypto::rsaSign($signable_data, $user["uprvkey"]);
$signature = Crypto::rsaSign($signable_data, $user['uprvkey']);
$sig = Strings::base64UrlEncode($signature);
$xmldata = ["me:env" => ["me:data" => $data,
"@attributes" => ["type" => $type],
"me:encoding" => $encoding,
"me:alg" => $alg,
"me:sig" => $sig,
"@attributes2" => ["key_id" => $key_id]]];
$xmldata = [
'me:env' => [
'me:data' => $data,
'@attributes' => ['type' => $type],
'me:encoding' => $encoding,
'me:alg' => $alg,
'me:sig' => $sig,
'@attributes2' => ['key_id' => $key_id]
]
];
$namespaces = ["me" => "http://salmon-protocol.org/ns/magic-env"];
$namespaces = ['me' => 'http://salmon-protocol.org/ns/magic-env'];
return XML::fromArray($xmldata, $xml, false, $namespaces);
}
@ -2941,7 +2966,7 @@ class Diaspora
* @return string The message that will be transmitted to other servers
* @throws \Exception
*/
public static function buildMessage($msg, array $user, array $contact, $prvkey, $pubkey, $public = false)
public static function buildMessage(string $msg, array $user, array $contact, string $prvkey, string $pubkey, bool $public = false): string
{
// The message is put into an envelope with the sender's signature
$envelope = self::buildMagicEnvelope($msg, $user);
@ -2962,15 +2987,15 @@ class Diaspora
*
* @return string The signature
*/
private static function signature($owner, $message)
private static function signature(array $owner, array $message): string
{
$sigmsg = $message;
unset($sigmsg["author_signature"]);
unset($sigmsg["parent_author_signature"]);
unset($sigmsg['author_signature']);
unset($sigmsg['parent_author_signature']);
$signed_text = implode(";", $sigmsg);
$signed_text = implode(';', $sigmsg);
return base64_encode(Crypto::rsaSign($signed_text, $owner["uprvkey"], "sha256"));
return base64_encode(Crypto::rsaSign($signed_text, $owner['uprvkey'], 'sha256'));
}
/**
@ -2986,9 +3011,9 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function transmit(array $owner, array $contact, $envelope, $public_batch, $guid = "")
private static function transmit(array $owner, array $contact, string $envelope, bool $public_batch, string $guid = ''): int
{
$enabled = intval(DI::config()->get("system", "diaspora_enabled"));
$enabled = intval(DI::config()->get('system', 'diaspora_enabled'));
if (!$enabled) {
return 200;
}
@ -3000,32 +3025,32 @@ class Diaspora
if (!empty($contact['addr'])) {
$fcontact = FContact::getByURL($contact['addr']);
if (!empty($fcontact)) {
$dest_url = ($public_batch ? $fcontact["batch"] : $fcontact["notify"]);
$dest_url = ($public_batch ? $fcontact['batch'] : $fcontact['notify']);
}
}
if (empty($dest_url)) {
$dest_url = ($public_batch ? $contact["batch"] : $contact["notify"]);
$dest_url = ($public_batch ? $contact['batch'] : $contact['notify']);
}
if (!$dest_url) {
Logger::notice("no url for contact: ".$contact["id"]." batch mode =".$public_batch);
Logger::notice("no url for contact: " . $contact['id'] . " batch mode =" . $public_batch);
return 0;
}
Logger::notice("transmit: ".$logid."-".$guid." ".$dest_url);
Logger::notice("transmit: " . $logid . "-" . $guid . " " . $dest_url);
if (!intval(DI::config()->get("system", "diaspora_test"))) {
$content_type = (($public_batch) ? "application/magic-envelope+xml" : "application/json");
if (!intval(DI::config()->get('system', 'diaspora_test'))) {
$content_type = (($public_batch) ? 'application/magic-envelope+xml' : 'application/json');
$postResult = DI::httpClient()->post($dest_url . "/", $envelope, ['Content-Type' => $content_type]);
$postResult = DI::httpClient()->post($dest_url . '/', $envelope, ['Content-Type' => $content_type]);
$return_code = $postResult->getReturnCode();
} else {
Logger::notice("test_mode");
Logger::notice('test_mode');
return 200;
}
Logger::notice("transmit: ".$logid."-".$guid." to ".$dest_url." returns: ".$return_code);
Logger::notice("transmit: " . $logid . "-" . $guid . " to " . $dest_url . " returns: " . $return_code);
return $return_code ? $return_code : -1;
}
@ -3039,7 +3064,7 @@ class Diaspora
*
* @return string The post XML
*/
public static function buildPostXml($type, $message)
public static function buildPostXml(string $type, array $message): string
{
$data = [$type => $message];
@ -3060,7 +3085,7 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function buildAndTransmit(array $owner, array $contact, $type, $message, $public_batch = false, $guid = "")
private static function buildAndTransmit(array $owner, array $contact, string $type, array $message, bool $public_batch = false, string $guid = '')
{
$msg = self::buildPostXml($type, $message);
@ -3103,18 +3128,18 @@ class Diaspora
* @return int The result of the transmission
* @throws \Exception
*/
private static function sendParticipation(array $contact, array $item)
private static function sendParticipation(array $contact, array $item): int
{
// Don't send notifications for private postings
if ($item['private'] == Item::PRIVATE) {
return;
return 0;
}
$cachekey = "diaspora:sendParticipation:".$item['guid'];
$cachekey = 'diaspora:sendParticipation:' . $item['guid'];
$result = DI::cache()->get($cachekey);
if (!is_null($result)) {
return;
return -1;
}
// Fetch some user id to have a valid handle to transmit the participation.
@ -3132,17 +3157,19 @@ class Diaspora
$author = self::myHandle($owner);
$message = ["author" => $author,
"guid" => System::createUUID(),
"parent_type" => "Post",
"parent_guid" => $item["guid"]];
$message = [
'author' => $author,
'guid' => System::createUUID(),
'parent_type' => 'Post',
'parent_guid' => $item['guid']
];
Logger::info("Send participation for ".$item["guid"]." by ".$author);
Logger::info("Send participation for " . $item['guid'] . " by " . $author);
// It doesn't matter what we store, we only want to avoid sending repeated notifications for the same item
DI::cache()->set($cachekey, $item["guid"], Duration::QUARTER_HOUR);
DI::cache()->set($cachekey, $item['guid'], Duration::QUARTER_HOUR);
return self::buildAndTransmit($owner, $contact, "participation", $message);
return self::buildAndTransmit($owner, $contact, 'participation', $message);
}
/**
@ -3156,21 +3183,23 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function sendAccountMigration(array $owner, array $contact, $uid)
public static function sendAccountMigration(array $owner, array $contact, int $uid): int
{
$old_handle = DI::pConfig()->get($uid, 'system', 'previous_addr');
$profile = self::createProfileData($uid);
$signed_text = 'AccountMigration:'.$old_handle.':'.$profile['author'];
$signature = base64_encode(Crypto::rsaSign($signed_text, $owner["uprvkey"], "sha256"));
$signature = base64_encode(Crypto::rsaSign($signed_text, $owner['uprvkey'], 'sha256'));
$message = ["author" => $old_handle,
"profile" => $profile,
"signature" => $signature];
$message = [
'author' => $old_handle,
'profile' => $profile,
'signature' => $signature
];
Logger::info('Send account migration', ['msg' => $message]);
return self::buildAndTransmit($owner, $contact, "account_migration", $message);
return self::buildAndTransmit($owner, $contact, 'account_migration', $message);
}
/**
@ -3182,7 +3211,7 @@ class Diaspora
* @return int The result of the transmission
* @throws \Exception
*/
public static function sendShare(array $owner, array $contact)
public static function sendShare(array $owner, array $contact): int
{
/**
* @todo support the different possible combinations of "following" and "sharing"
@ -3207,14 +3236,16 @@ class Diaspora
}
*/
$message = ["author" => self::myHandle($owner),
"recipient" => $contact["addr"],
"following" => "true",
"sharing" => "true"];
$message = [
'author' => self::myHandle($owner),
'recipient' => $contact['addr'],
'following' => 'true',
'sharing' => 'true'
];
Logger::info('Send share', ['msg' => $message]);
return self::buildAndTransmit($owner, $contact, "contact", $message);
return self::buildAndTransmit($owner, $contact, 'contact', $message);
}
/**
@ -3226,16 +3257,18 @@ class Diaspora
* @return int The result of the transmission
* @throws \Exception
*/
public static function sendUnshare(array $owner, array $contact)
public static function sendUnshare(array $owner, array $contact): int
{
$message = ["author" => self::myHandle($owner),
"recipient" => $contact["addr"],
"following" => "false",
"sharing" => "false"];
$message = [
'author' => self::myHandle($owner),
'recipient' => $contact['addr'],
'following' => 'false',
'sharing' => 'false'
];
Logger::info('Send unshare', ['msg' => $message]);
return self::buildAndTransmit($owner, $contact, "contact", $message);
return self::buildAndTransmit($owner, $contact, 'contact', $message);
}
/**
@ -3248,7 +3281,7 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function isReshare($body, $complete = true)
public static function isReshare(string $body, bool $complete = true)
{
$body = trim($body);
@ -3268,8 +3301,8 @@ class Diaspora
$item = Post::selectFirst(['contact-id'], $condition);
if (DBA::isResult($item)) {
$ret = [];
$ret["root_handle"] = self::handleFromContact($item["contact-id"]);
$ret["root_guid"] = $reshared['guid'];
$ret['root_handle'] = self::handleFromContact($item['contact-id']);
$ret['root_guid'] = $reshared['guid'];
return $ret;
} elseif ($complete) {
// We are resharing something that isn't a DFRN or Diaspora post.
@ -3304,7 +3337,7 @@ class Diaspora
* @return array with event data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function buildEvent($event_id)
private static function buildEvent(string $event_id): array
{
$event = DBA::selectFirst('event', [], ['id' => $event_id]);
if (!DBA::isResult($event)) {
@ -3327,7 +3360,7 @@ class Diaspora
$mask = DateTimeFormat::ATOM;
/// @todo - establish "all day" events in Friendica
$eventdata["all_day"] = "false";
$eventdata['all_day'] = 'false';
$eventdata['timezone'] = 'UTC';
@ -3348,13 +3381,13 @@ class Diaspora
$coord = Map::getCoordinates($event['location']);
$location = [];
$location["address"] = html_entity_decode(BBCode::toMarkdown($event['location']));
$location['address'] = html_entity_decode(BBCode::toMarkdown($event['location']));
if (!empty($coord['lat']) && !empty($coord['lon'])) {
$location["lat"] = $coord['lat'];
$location["lng"] = $coord['lon'];
$location['lat'] = $coord['lat'];
$location['lng'] = $coord['lon'];
} else {
$location["lat"] = 0;
$location["lng"] = 0;
$location['lat'] = 0;
$location['lng'] = 0;
}
$eventdata['location'] = $location;
}
@ -3376,7 +3409,7 @@ class Diaspora
*/
public static function buildStatus(array $item, array $owner)
{
$cachekey = "diaspora:buildStatus:".$item['guid'];
$cachekey = 'diaspora:buildStatus:' . $item['guid'];
$result = DI::cache()->get($cachekey);
if (!is_null($result)) {
@ -3385,27 +3418,29 @@ class Diaspora
$myaddr = self::myHandle($owner);
$public = ($item["private"] == Item::PRIVATE ? "false" : "true");
$public = ($item['private'] == Item::PRIVATE ? 'false' : 'true');
$created = DateTimeFormat::utc($item['received'], DateTimeFormat::ATOM);
$edited = DateTimeFormat::utc($item["edited"] ?? $item["created"], DateTimeFormat::ATOM);
$edited = DateTimeFormat::utc($item['edited'] ?? $item['created'], DateTimeFormat::ATOM);
// Detect a share element and do a reshare
if (($item['private'] != Item::PRIVATE) && ($ret = self::isReshare($item["body"]))) {
$message = ["author" => $myaddr,
"guid" => $item["guid"],
"created_at" => $created,
"root_author" => $ret["root_handle"],
"root_guid" => $ret["root_guid"],
"provider_display_name" => $item["app"],
"public" => $public];
if (($item['private'] != Item::PRIVATE) && ($ret = self::isReshare($item['body']))) {
$message = [
'author' => $myaddr,
'guid' => $item['guid'],
'created_at' => $created,
'root_author' => $ret['root_handle'],
'root_guid' => $ret['root_guid'],
'provider_display_name' => $item['app'],
'public' => $public
];
$type = "reshare";
$type = 'reshare';
} else {
$title = $item["title"];
$title = $item['title'];
$body = Post\Media::addAttachmentsToBody($item['uri-id'], $item['body']);
// Fetch the title from an attached link - if there is one
if (empty($item["title"]) && DI::pConfig()->get($owner['uid'], 'system', 'attach_link_title')) {
if (empty($item['title']) && DI::pConfig()->get($owner['uid'], 'system', 'attach_link_title')) {
$page_data = BBCode::getAttachmentData($item['body']);
if (!empty($page_data['type']) && !empty($page_data['title']) && ($page_data['type'] == 'link')) {
$title = $page_data['title'];
@ -3422,7 +3457,7 @@ class Diaspora
// Adding the title
if (strlen($title)) {
$body = "### ".html_entity_decode($title)."\n\n".$body;
$body = '### ' . html_entity_decode($title) . "\n\n" . $body;
}
$attachments = Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]);
@ -3435,27 +3470,29 @@ class Diaspora
$location = [];
if ($item["location"] != "")
$location["address"] = $item["location"];
if ($item['location'] != '')
$location['address'] = $item['location'];
if ($item["coord"] != "") {
$coord = explode(" ", $item["coord"]);
$location["lat"] = $coord[0];
$location["lng"] = $coord[1];
if ($item['coord'] != '') {
$coord = explode(' ', $item['coord']);
$location['lat'] = $coord[0];
$location['lng'] = $coord[1];
}
$message = ["author" => $myaddr,
"guid" => $item["guid"],
"created_at" => $created,
"edited_at" => $edited,
"public" => $public,
"text" => $body,
"provider_display_name" => $item["app"],
"location" => $location];
$message = [
'author' => $myaddr,
'guid' => $item['guid'],
'created_at' => $created,
'edited_at' => $edited,
'public' => $public,
'text' => $body,
'provider_display_name' => $item['app'],
'location' => $location
];
// Diaspora rejects messages when they contain a location without "lat" or "lng"
if (!isset($location["lat"]) || !isset($location["lng"])) {
unset($message["location"]);
if (!isset($location['lat']) || !isset($location['lng'])) {
unset($message['location']);
}
if ($item['event-id'] > 0) {
@ -3474,17 +3511,20 @@ class Diaspora
}
}
$type = "status_message";
$type = 'status_message';
}
$msg = ["type" => $type, "message" => $message];
$msg = [
'type' => $type,
'message' => $message
];
DI::cache()->set($cachekey, $msg, Duration::QUARTER_HOUR);
return $msg;
}
private static function prependParentAuthorMention($body, $profile_url)
private static function prependParentAuthorMention(string $body, string $profile_url): string
{
$profile = Contact::getByURL($profile_url, false, ['addr', 'name']);
if (!empty($profile['addr'])
@ -3509,11 +3549,11 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function sendStatus(array $item, array $owner, array $contact, $public_batch = false)
public static function sendStatus(array $item, array $owner, array $contact, bool $public_batch = false): int
{
$status = self::buildStatus($item, $owner);
return self::buildAndTransmit($owner, $contact, $status["type"], $status["message"], $public_batch, $item["guid"]);
return self::buildAndTransmit($owner, $contact, $status['type'], $status['message'], $public_batch, $item['guid']);
}
/**
@ -3522,30 +3562,32 @@ class Diaspora
* @param array $item The item that will be exported
* @param array $owner the array of the item owner
*
* @return array The data for a "like"
* @return array|bool The data for a "like" or false on error
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function constructLike(array $item, array $owner)
{
$parent = Post::selectFirst(['guid', 'uri', 'thr-parent'], ['uri' => $item["thr-parent"]]);
$parent = Post::selectFirst(['guid', 'uri', 'thr-parent'], ['uri' => $item['thr-parent']]);
if (!DBA::isResult($parent)) {
return false;
}
$target_type = ($parent["uri"] === $parent["thr-parent"] ? "Post" : "Comment");
$target_type = ($parent['uri'] === $parent['thr-parent'] ? 'Post' : 'Comment');
$positive = null;
if ($item['verb'] === Activity::LIKE) {
$positive = "true";
$positive = 'true';
} elseif ($item['verb'] === Activity::DISLIKE) {
$positive = "false";
$positive = 'false';
}
return(["author" => self::myHandle($owner),
"guid" => $item["guid"],
"parent_guid" => $parent["guid"],
"parent_type" => $target_type,
"positive" => $positive,
"author_signature" => ""]);
return [
'author' => self::myHandle($owner),
'guid' => $item['guid'],
'parent_guid' => $parent['guid'],
'parent_type' => $target_type,
'positive' => $positive,
'author_signature' => ''
];
}
/**
@ -3554,7 +3596,7 @@ class Diaspora
* @param array $item The item that will be exported
* @param array $owner the array of the item owner
*
* @return array The data for an "EventParticipation"
* @return array|bool The data for an "EventParticipation" or false on error
* @throws \Exception
*/
private static function constructAttend(array $item, array $owner)
@ -3579,11 +3621,13 @@ class Diaspora
return false;
}
return(["author" => self::myHandle($owner),
"guid" => $item["guid"],
"parent_guid" => $parent["guid"],
"status" => $attend_answer,
"author_signature" => ""]);
return [
'author' => self::myHandle($owner),
'guid' => $item['guid'],
'parent_guid' => $parent['guid'],
'status' => $attend_answer,
'author_signature' => ''
];
}
/**
@ -3597,7 +3641,7 @@ class Diaspora
*/
private static function constructComment(array $item, array $owner)
{
$cachekey = "diaspora:constructComment:".$item['guid'];
$cachekey = 'diaspora:constructComment:' . $item['guid'];
$result = DI::cache()->get($cachekey);
if (!is_null($result)) {
@ -3631,17 +3675,17 @@ class Diaspora
}
$text = html_entity_decode(BBCode::toMarkdown($body));
$created = DateTimeFormat::utc($item["created"], DateTimeFormat::ATOM);
$edited = DateTimeFormat::utc($item["edited"], DateTimeFormat::ATOM);
$created = DateTimeFormat::utc($item['created'], DateTimeFormat::ATOM);
$edited = DateTimeFormat::utc($item['edited'], DateTimeFormat::ATOM);
$comment = [
"author" => self::myHandle($owner),
"guid" => $item["guid"],
"created_at" => $created,
"edited_at" => $edited,
"parent_guid" => $toplevel_item["guid"],
"text" => $text,
"author_signature" => ""
'author' => self::myHandle($owner),
'guid' => $item['guid'],
'created_at' => $created,
'edited_at' => $edited,
'parent_guid' => $toplevel_item['guid'],
'text' => $text,
'author_signature' => ''
];
// Send the thread parent guid only if it is a threaded comment
@ -3651,7 +3695,7 @@ class Diaspora
DI::cache()->set($cachekey, $comment, Duration::QUARTER_HOUR);
return($comment);
return $comment;
}
/**
@ -3666,26 +3710,26 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function sendFollowup(array $item, array $owner, array $contact, $public_batch = false)
public static function sendFollowup(array $item, array $owner, array $contact, bool $public_batch = false): int
{
if (in_array($item['verb'], [Activity::ATTEND, Activity::ATTENDNO, Activity::ATTENDMAYBE])) {
$message = self::constructAttend($item, $owner);
$type = "event_participation";
} elseif (in_array($item["verb"], [Activity::LIKE, Activity::DISLIKE])) {
$type = 'event_participation';
} elseif (in_array($item['verb'], [Activity::LIKE, Activity::DISLIKE])) {
$message = self::constructLike($item, $owner);
$type = "like";
} elseif (!in_array($item["verb"], [Activity::FOLLOW, Activity::TAG])) {
$type = 'like';
} elseif (!in_array($item['verb'], [Activity::FOLLOW, Activity::TAG])) {
$message = self::constructComment($item, $owner);
$type = "comment";
$type = 'comment';
}
if (empty($message)) {
return false;
return -1;
}
$message["author_signature"] = self::signature($owner, $message);
$message['author_signature'] = self::signature($owner, $message);
return self::buildAndTransmit($owner, $contact, $type, $message, $public_batch, $item["guid"]);
return self::buildAndTransmit($owner, $contact, $type, $message, $public_batch, $item['guid']);
}
/**
@ -3699,43 +3743,43 @@ class Diaspora
* @return int The result of the transmission
* @throws \Exception
*/
public static function sendRelay(array $item, array $owner, array $contact, $public_batch = false)
public static function sendRelay(array $item, array $owner, array $contact, bool $public_batch = false): int
{
if ($item["deleted"]) {
if ($item['deleted']) {
return self::sendRetraction($item, $owner, $contact, $public_batch, true);
} elseif (in_array($item["verb"], [Activity::LIKE, Activity::DISLIKE])) {
$type = "like";
} elseif (in_array($item['verb'], [Activity::LIKE, Activity::DISLIKE])) {
$type = 'like';
} else {
$type = "comment";
$type = 'comment';
}
Logger::info("Got relayable data ".$type." for item ".$item["guid"]." (".$item["id"].")");
Logger::info("Got relayable data " . $type . " for item " . $item['guid'] . " (" . $item['id'] . ")");
$msg = json_decode($item['signed_text'], true);
$message = [];
if (is_array($msg)) {
foreach ($msg as $field => $data) {
if (!$item["deleted"]) {
if ($field == "diaspora_handle") {
$field = "author";
if (!$item['deleted']) {
if ($field == 'diaspora_handle') {
$field = 'author';
}
if ($field == "target_type") {
$field = "parent_type";
if ($field == 'target_type') {
$field = 'parent_type';
}
}
$message[$field] = $data;
}
} else {
Logger::info("Signature text for item ".$item["guid"]." (".$item["id"].") couldn't be extracted: ".$item['signed_text']);
Logger::info("Signature text for item " . $item["guid"] . " (" . $item["id"] . ") couldn't be extracted: " . $item['signed_text']);
}
$message["parent_author_signature"] = self::signature($owner, $message);
$message['parent_author_signature'] = self::signature($owner, $message);
Logger::info('Relayed data', ['msg' => $message]);
return self::buildAndTransmit($owner, $contact, $type, $message, $public_batch, $item["guid"]);
return self::buildAndTransmit($owner, $contact, $type, $message, $public_batch, $item['guid']);
}
/**
@ -3750,27 +3794,29 @@ class Diaspora
* @return int The result of the transmission
* @throws \Exception
*/
public static function sendRetraction(array $item, array $owner, array $contact, $public_batch = false, $relay = false)
public static function sendRetraction(array $item, array $owner, array $contact, bool $public_batch = false, bool $relay = false): int
{
$itemaddr = self::handleFromContact($item["contact-id"], $item["author-id"]);
$itemaddr = self::handleFromContact($item['contact-id'], $item['author-id']);
$msg_type = "retraction";
$msg_type = 'retraction';
if ($item['gravity'] == GRAVITY_PARENT) {
$target_type = "Post";
} elseif (in_array($item["verb"], [Activity::LIKE, Activity::DISLIKE])) {
$target_type = "Like";
$target_type = 'Post';
} elseif (in_array($item['verb'], [Activity::LIKE, Activity::DISLIKE])) {
$target_type = 'Like';
} else {
$target_type = "Comment";
$target_type = 'Comment';
}
$message = ["author" => $itemaddr,
"target_guid" => $item['guid'],
"target_type" => $target_type];
$message = [
'author' => $itemaddr,
'target_guid' => $item['guid'],
'target_type' => $target_type
];
Logger::info('Got message', ['msg' => $message]);
return self::buildAndTransmit($owner, $contact, $msg_type, $message, $public_batch, $item["guid"]);
return self::buildAndTransmit($owner, $contact, $msg_type, $message, $public_batch, $item['guid']);
}
/**
@ -3784,44 +3830,44 @@ class Diaspora
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
public static function sendMail(array $item, array $owner, array $contact)
public static function sendMail(array $item, array $owner, array $contact): int
{
$myaddr = self::myHandle($owner);
$cnv = DBA::selectFirst('conv', [], ['id' => $item["convid"], 'uid' => $item["uid"]]);
$cnv = DBA::selectFirst('conv', [], ['id' => $item['convid'], 'uid' => $item['uid']]);
if (!DBA::isResult($cnv)) {
Logger::notice("conversation not found.");
return;
return -1;
}
$body = BBCode::toMarkdown($item["body"]);
$created = DateTimeFormat::utc($item["created"], DateTimeFormat::ATOM);
$body = BBCode::toMarkdown($item['body']);
$created = DateTimeFormat::utc($item['created'], DateTimeFormat::ATOM);
$msg = [
"author" => $myaddr,
"guid" => $item["guid"],
"conversation_guid" => $cnv["guid"],
"text" => $body,
"created_at" => $created,
'author' => $myaddr,
'guid' => $item['guid'],
'conversation_guid' => $cnv['guid'],
'text' => $body,
'created_at' => $created,
];
if ($item["reply"]) {
if ($item['reply']) {
$message = $msg;
$type = "message";
$type = 'message';
} else {
$message = [
"author" => $cnv["creator"],
"guid" => $cnv["guid"],
"subject" => $cnv["subject"],
"created_at" => DateTimeFormat::utc($cnv['created'], DateTimeFormat::ATOM),
"participants" => $cnv["recips"],
"message" => $msg
'author' => $cnv['creator'],
'guid' => $cnv['guid'],
'subject' => $cnv['subject'],
'created_at' => DateTimeFormat::utc($cnv['created'], DateTimeFormat::ATOM),
'participants' => $cnv['recips'],
'message' => $msg
];
$type = "conversation";
$type = 'conversation';
}
return self::buildAndTransmit($owner, $contact, $type, $message, false, $item["guid"]);
return self::buildAndTransmit($owner, $contact, $type, $message, false, $item['guid']);
}
/**
@ -3831,7 +3877,8 @@ class Diaspora
*
* @return array The array with "first" and "last"
*/
public static function splitName($name) {
public static function splitName(string $name): array
{
$name = trim($name);
// Is the name longer than 64 characters? Then cut the rest of it.
@ -3888,14 +3935,14 @@ class Diaspora
* @return array The profile data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function createProfileData($uid)
private static function createProfileData(int $uid): array
{
$profile = DBA::selectFirst('owner-view', ['uid', 'addr', 'name', 'location', 'net-publish', 'dob', 'about', 'pub_keywords'], ['uid' => $uid]);
if (!DBA::isResult($profile)) {
return [];
}
$handle = $profile["addr"];
$handle = $profile['addr'];
$split_name = self::splitName($profile['name']);
$first = $split_name['first'];
@ -3940,18 +3987,20 @@ class Diaspora
$tags = trim($tags);
}
return ["author" => $handle,
"first_name" => $first,
"last_name" => $last,
"image_url" => $large,
"image_url_medium" => $medium,
"image_url_small" => $small,
"birthday" => $dob,
"bio" => $about,
"location" => $location,
"searchable" => $searchable,
"nsfw" => "false",
"tag_string" => $tags];
return [
'author' => $handle,
'first_name' => $first,
'last_name' => $last,
'image_url' => $large,
'image_url_medium' => $medium,
'image_url_small' => $small,
'birthday' => $dob,
'bio' => $about,
'location' => $location,
'searchable' => $searchable,
'nsfw' => 'false',
'tag_string' => $tags
];
}
/**
@ -3962,7 +4011,7 @@ class Diaspora
* @return void
* @throws \Exception
*/
public static function sendProfile($uid, $recips = false)
public static function sendProfile(int $uid, bool $recips = false)
{
if (!$uid) {
return;
@ -3985,8 +4034,8 @@ class Diaspora
// @ToDo Split this into single worker jobs
foreach ($recips as $recip) {
Logger::info("Send updated profile data for user ".$uid." to contact ".$recip["id"]);
self::buildAndTransmit($owner, $recip, "profile", $message);
Logger::info("Send updated profile data for user " . $uid . " to contact " . $recip['id']);
self::buildAndTransmit($owner, $recip, 'profile', $message);
}
}
@ -3996,10 +4045,10 @@ class Diaspora
* @param integer $uid The user of that comment
* @param array $item Item array
*
* @return array Signed content
* @return array|bool Signed content or false on error
* @throws \Exception
*/
public static function createLikeSignature($uid, array $item)
public static function createLikeSignature(int $uid, array $item)
{
$owner = User::getOwnerDataById($uid);
if (empty($owner)) {
@ -4007,7 +4056,7 @@ class Diaspora
return false;
}
if (!in_array($item["verb"], [Activity::LIKE, Activity::DISLIKE])) {
if (!in_array($item['verb'], [Activity::LIKE, Activity::DISLIKE])) {
return false;
}
@ -4016,7 +4065,7 @@ class Diaspora
return false;
}
$message["author_signature"] = self::signature($owner, $message);
$message['author_signature'] = self::signature($owner, $message);
return $message;
}
@ -4026,7 +4075,7 @@ class Diaspora
*
* @param array $item Item array
*
* @return array Signed content
* @return array|bool Signed content or false on error
* @throws \Exception
*/
public static function createCommentSignature(array $item)
@ -4064,12 +4113,12 @@ class Diaspora
return false;
}
$message["author_signature"] = self::signature($owner, $message);
$message['author_signature'] = self::signature($owner, $message);
return $message;
}
public static function performReshare(int $UriId, int $uid)
public static function performReshare(int $UriId, int $uid): int
{
$fields = ['uri-id', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink'];
$item = Post::selectFirst($fields, ['uri-id' => $UriId, 'uid' => [$uid, 0], 'private' => [Item::PUBLIC, Item::UNLISTED]]);

View file

@ -164,7 +164,7 @@ abstract class MailBuilder
*
* @return string[][]
*/
public function getHeaders()
public function getHeaders(): array
{
return $this->headers;
}
@ -182,7 +182,7 @@ abstract class MailBuilder
* @param string[][] $headers
* @return $this
*/
public function withHeaders(array $headers)
public function withHeaders(array $headers): MailBuilder
{
$this->headers = $headers;

View file

@ -55,7 +55,7 @@ class HTTPSignature
* @return array with verification data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function verifyMagic($key)
public static function verifyMagic(string $key): array
{
$headers = null;
$spoofable = false;
@ -139,7 +139,7 @@ class HTTPSignature
*
* @return array
*/
public static function createSig($head, $prvkey, $keyid = 'Key')
public static function createSig(array $head, string $prvkey, string $keyid = 'Key'): array
{
$return_headers = [];
if (!empty($head)) {
@ -166,7 +166,7 @@ class HTTPSignature
*
* @return array
*/
private static function sign($head, $prvkey, $alg = 'sha256')
private static function sign(array $head, string $prvkey, string $alg = 'sha256'): array
{
$ret = [];
$headers = '';
@ -204,7 +204,7 @@ class HTTPSignature
* - \e string \b signature
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function parseSigheader($header)
public static function parseSigheader(string $header): array
{
// Remove obsolete folds
$header = preg_replace('/\n\s+/', ' ', $header);
@ -251,7 +251,7 @@ class HTTPSignature
* @return string Decrypted signature string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
private static function decryptSigheader(array $headers, string $prvkey)
private static function decryptSigheader(array $headers, string $prvkey): string
{
if (!empty($headers['iv']) && !empty($headers['key']) && !empty($headers['data'])) {
return Crypto::unencapsulate($headers, $prvkey);
@ -341,7 +341,7 @@ class HTTPSignature
* @param boolean $success Transmission status
* @param boolean $shared The inbox is a shared inbox
*/
static public function setInboxStatus($url, $success, $shared = false)
static public function setInboxStatus(string $url, bool $success, bool $shared = false)
{
$now = DateTimeFormat::utcNow();
@ -403,21 +403,21 @@ class HTTPSignature
* @return array JSON array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function fetch($request, $uid)
public static function fetch(string $request, int $uid): array
{
$curlResult = self::fetchRaw($request, $uid);
if (empty($curlResult)) {
return false;
return [];
}
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
return false;
return [];
}
$content = json_decode($curlResult->getBody(), true);
if (empty($content) || !is_array($content)) {
return false;
return [];
}
return $content;
@ -438,7 +438,7 @@ class HTTPSignature
* @return \Friendica\Network\HTTPClient\Capability\ICanHandleHttpResponses CurlResult
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function fetchRaw($request, $uid = 0, $opts = [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::JSON_AS]])
public static function fetchRaw(string $request, int $uid = 0, array $opts = [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::JSON_AS]])
{
$header = [];
@ -488,13 +488,13 @@ class HTTPSignature
/**
* Gets a signer from a given HTTP request
*
* @param $content
* @param $http_headers
* @param string $content
* @param array $http_headers
*
* @return string Signer
* @return string|null|false Signer
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function getSigner($content, $http_headers)
public static function getSigner(string $content, array $http_headers)
{
if (empty($http_headers['HTTP_SIGNATURE'])) {
Logger::debug('No HTTP_SIGNATURE header');
@ -686,13 +686,13 @@ class HTTPSignature
/**
* fetches a key for a given id and actor
*
* @param $id
* @param $actor
* @param string $id
* @param string $actor
*
* @return array with actor url and public key
* @throws \Exception
*/
private static function fetchKey($id, $actor)
private static function fetchKey(string $id, string $actor): array
{
$url = (strpos($id, '#') ? substr($id, 0, strpos($id, '#')) : $id);
@ -709,6 +709,6 @@ class HTTPSignature
}
Logger::notice('Key could not be fetched', ['url' => $url, 'actor' => $actor]);
return false;
return [];
}
}

View file

@ -29,7 +29,7 @@ class Mimetype
* @param string $filename filename
* @return mixed array or string
*/
public static function getContentType($filename)
public static function getContentType(string $filename)
{
$mime_types = [

View file

@ -59,7 +59,7 @@ class ParseUrl
* @param string $accept content-type to accept
* @return array content type
*/
public static function getContentType(string $url, string $accept = HttpClientAccept::DEFAULT)
public static function getContentType(string $url, string $accept = HttpClientAccept::DEFAULT): array
{
$curlResult = DI::httpClient()->head($url, [HttpClientOptions::ACCEPT_CONTENT => $accept]);

View file

@ -165,7 +165,7 @@ class Strings
* @return string Formatted network name
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function formatNetworkName($network, $url = '')
public static function formatNetworkName(string $network, string $url = ''): string
{
if ($network != '') {
if ($url != '') {
@ -176,6 +176,8 @@ class Strings
return $network_name;
}
return '';
}
/**
@ -187,7 +189,7 @@ class Strings
*
* @return string Transformed string.
*/
public static function deindent($text, $chr = "[\t ]", $count = NULL)
public static function deindent(string $text, string $chr = "[\t ]", int $count = null)
{
$lines = explode("\n", $text);

View file

@ -269,7 +269,7 @@ class Delivery
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function deliverDFRN($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup, $server_protocol)
private static function deliverDFRN(string $cmd, array $contact, array $owner, array $items, array $target_item, bool $public_message, bool $top_level, bool $followup, int $server_protocol)
{
// Transmit Diaspora reshares via Diaspora if the Friendica contact support Diaspora
if (Diaspora::isReshare($target_item['body'] ?? '') && !empty(FContact::getByURL($contact['addr'], false))) {
@ -384,7 +384,7 @@ class Delivery
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function deliverDiaspora($cmd, $contact, $owner, $items, $target_item, $public_message, $top_level, $followup)
private static function deliverDiaspora(string $cmd, array $contact, array $owner, array $items, array $target_item, bool $public_message, bool $top_level, bool $followup)
{
// We don't treat Forum posts as "wall-to-wall" to be able to post them via Diaspora
$walltowall = $top_level && ($owner['id'] != $items[0]['contact-id']) & ($owner['account-type'] != Model\User::ACCOUNT_TYPE_COMMUNITY);
@ -478,7 +478,7 @@ class Delivery
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
private static function deliverMail($cmd, $contact, $owner, $target_item, $thr_parent)
private static function deliverMail(string $cmd, array $contact, array $owner, array $target_item, array $thr_parent)
{
if (DI::config()->get('system','imap_disabled')) {
return;

View file

@ -34,7 +34,7 @@ use Friendica\Network\HTTPClient\Client\HttpClientAccept;
*/
class Directory
{
public static function execute($url = '')
public static function execute(string $url = '')
{
$dir = Search::getGlobalDirectory();

View file

@ -30,9 +30,9 @@ class MergeContact
/**
* Replace all occurences of the given contact id and replace it
*
* @param integer $new_cid
* @param integer $old_cid
* @param integer $uid
* @param integer $new_cid New contact id
* @param integer $old_cid Old contact id
* @param integer $uid User id
*/
public static function execute(int $new_cid, int $old_cid, int $uid)
{

View file

@ -55,7 +55,7 @@
use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1469);
define('DB_UPDATE_VERSION', 1470);
}
return [
@ -1252,12 +1252,12 @@ return [
"fields" => [
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "sequential ID"],
"uri-id" => ["type" => "int unsigned", "not null" => "1", "foreign" => ["item-uri" => "id"], "comment" => "Id of the item-uri table entry that contains the item uri"],
"url" => ["type" => "varbinary(511)", "not null" => "1", "comment" => "Media URL"],
"url" => ["type" => "text", "not null" => "1", "comment" => "Media URL"],
"type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Media type"],
"mimetype" => ["type" => "varchar(60)", "comment" => ""],
"height" => ["type" => "smallint unsigned", "comment" => "Height of the media"],
"width" => ["type" => "smallint unsigned", "comment" => "Width of the media"],
"size" => ["type" => "int unsigned", "comment" => "Media size"],
"size" => ["type" => "mediumint unsigned", "comment" => "Media size"],
"preview" => ["type" => "varbinary(255)", "comment" => "Preview URL"],
"preview-height" => ["type" => "smallint unsigned", "comment" => "Height of the preview picture"],
"preview-width" => ["type" => "smallint unsigned", "comment" => "Width of the preview picture"],
@ -1272,7 +1272,7 @@ return [
],
"indexes" => [
"PRIMARY" => ["id"],
"uri-id-url" => ["UNIQUE", "uri-id", "url"],
"uri-id-url" => ["UNIQUE", "uri-id", "url(512)"],
"uri-id-id" => ["uri-id", "id"],
]
],

View file

@ -122,6 +122,16 @@ return [
// Cache avatar pictures as files (experimental)
'avatar_cache' => false,
// avatar_cache_path (String)
// File path to the avatar cache. Default is /(your basepath)/avatar/
// The value has to be an absolute path and has to end with a "/"
'avatar_cache_path' => '',
// avatar_cache_url (String)
// Base URL of the avatar cache. Default is http(s)://(your hostname)/avatar/
// The value has to start with the scheme and end with a "/"
'avatar_cache_url' => '',
// big_emojis (Boolean)
// Display "Emoji Only" posts in big.
'big_emojis' => false,

View file

@ -43,7 +43,7 @@ class AppDouble extends App
$this->isLoggedIn = $isLoggedIn;
}
public function isLoggedIn()
public function isLoggedIn(): bool
{
return $this->isLoggedIn;
}

View file

@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 2022.06\n"
"Project-Id-Version: 2022.09-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-06 07:33+0000\n"
"POT-Creation-Date: 2022-06-13 05:45+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"
@ -37,7 +37,7 @@ msgstr ""
msgid "User not found."
msgstr ""
#: mod/cal.php:122 mod/display.php:247 src/Module/Profile/Profile.php:94
#: mod/cal.php:122 mod/display.php:262 src/Module/Profile/Profile.php:94
#: src/Module/Profile/Profile.php:109 src/Module/Profile/Status.php:110
#: src/Module/Update/Profile.php:56
msgid "Access to this profile has been restricted."
@ -104,17 +104,17 @@ msgstr ""
msgid "calendar"
msgstr ""
#: mod/display.php:142 mod/photos.php:802
#: mod/display.php:143 mod/photos.php:802
#: src/Module/Conversation/Community.php:175 src/Module/Directory.php:49
#: src/Module/Search/Index.php:50
msgid "Public access denied."
msgstr ""
#: mod/display.php:198 mod/display.php:272
#: mod/display.php:213 mod/display.php:287
msgid "The requested item doesn't exist or has been deleted."
msgstr ""
#: mod/display.php:352
#: mod/display.php:367
msgid "The feed for this item is unavailable."
msgstr ""
@ -230,7 +230,7 @@ msgstr ""
#: mod/editpost.php:107 mod/message.php:200 mod/message.php:358
#: mod/photos.php:1489 mod/wallmessage.php:142 src/Content/Conversation.php:368
#: src/Content/Conversation.php:712 src/Module/Item/Compose.php:177
#: src/Content/Conversation.php:713 src/Module/Item/Compose.php:177
#: src/Object/Post.php:528
msgid "Please wait"
msgstr ""
@ -1077,11 +1077,11 @@ msgstr ""
msgid "Comment"
msgstr ""
#: mod/photos.php:1424 src/Content/Conversation.php:628 src/Object/Post.php:247
#: mod/photos.php:1424 src/Content/Conversation.php:629 src/Object/Post.php:247
msgid "Select"
msgstr ""
#: mod/photos.php:1425 mod/settings.php:350 src/Content/Conversation.php:629
#: mod/photos.php:1425 mod/settings.php:350 src/Content/Conversation.php:630
#: src/Module/Admin/Users/Active.php:139 src/Module/Admin/Users/Blocked.php:140
#: src/Module/Admin/Users/Index.php:153
msgid "Delete"
@ -1942,7 +1942,7 @@ msgid "%s attends maybe."
msgstr ""
#: src/Content/Conversation.php:222 src/Content/Conversation.php:260
#: src/Content/Conversation.php:872
#: src/Content/Conversation.php:873
#, php-format
msgid "%s reshared this."
msgstr ""
@ -2061,92 +2061,92 @@ msgstr ""
msgid "Scheduled at"
msgstr ""
#: src/Content/Conversation.php:656 src/Object/Post.php:235
#: src/Content/Conversation.php:657 src/Object/Post.php:235
msgid "Pinned item"
msgstr ""
#: src/Content/Conversation.php:672 src/Object/Post.php:476
#: src/Content/Conversation.php:673 src/Object/Post.php:476
#: src/Object/Post.php:477
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
#: src/Content/Conversation.php:685 src/Object/Post.php:464
#: src/Content/Conversation.php:686 src/Object/Post.php:464
msgid "Categories:"
msgstr ""
#: src/Content/Conversation.php:686 src/Object/Post.php:465
#: src/Content/Conversation.php:687 src/Object/Post.php:465
msgid "Filed under:"
msgstr ""
#: src/Content/Conversation.php:694 src/Object/Post.php:490
#: src/Content/Conversation.php:695 src/Object/Post.php:490
#, php-format
msgid "%s from %s"
msgstr ""
#: src/Content/Conversation.php:710
#: src/Content/Conversation.php:711
msgid "View in context"
msgstr ""
#: src/Content/Conversation.php:775
#: src/Content/Conversation.php:776
msgid "remove"
msgstr ""
#: src/Content/Conversation.php:779
#: src/Content/Conversation.php:780
msgid "Delete Selected Items"
msgstr ""
#: src/Content/Conversation.php:844 src/Content/Conversation.php:847
#: src/Content/Conversation.php:850 src/Content/Conversation.php:853
#: src/Content/Conversation.php:845 src/Content/Conversation.php:848
#: src/Content/Conversation.php:851 src/Content/Conversation.php:854
#, php-format
msgid "You had been addressed (%s)."
msgstr ""
#: src/Content/Conversation.php:856
#: src/Content/Conversation.php:857
#, php-format
msgid "You are following %s."
msgstr ""
#: src/Content/Conversation.php:859
#: src/Content/Conversation.php:860
msgid "Tagged"
msgstr ""
#: src/Content/Conversation.php:874
#: src/Content/Conversation.php:875
msgid "Reshared"
msgstr ""
#: src/Content/Conversation.php:874
#: src/Content/Conversation.php:875
#, php-format
msgid "Reshared by %s <%s>"
msgstr ""
#: src/Content/Conversation.php:877
#: src/Content/Conversation.php:878
#, php-format
msgid "%s is participating in this thread."
msgstr ""
#: src/Content/Conversation.php:880
#: src/Content/Conversation.php:881
msgid "Stored"
msgstr ""
#: src/Content/Conversation.php:883
#: src/Content/Conversation.php:884
msgid "Global"
msgstr ""
#: src/Content/Conversation.php:886
#: src/Content/Conversation.php:887
msgid "Relayed"
msgstr ""
#: src/Content/Conversation.php:886
#: src/Content/Conversation.php:887
#, php-format
msgid "Relayed by %s <%s>"
msgstr ""
#: src/Content/Conversation.php:889
#: src/Content/Conversation.php:890
msgid "Fetched"
msgstr ""
#: src/Content/Conversation.php:889
#: src/Content/Conversation.php:890
#, php-format
msgid "Fetched because of %s <%s>"
msgstr ""
@ -3625,63 +3625,63 @@ msgstr ""
msgid "Forum"
msgstr ""
#: src/Model/Contact.php:2517
#: src/Model/Contact.php:2550
msgid "Disallowed profile URL."
msgstr ""
#: src/Model/Contact.php:2522 src/Module/Friendica.php:81
#: src/Model/Contact.php:2555 src/Module/Friendica.php:81
msgid "Blocked domain"
msgstr ""
#: src/Model/Contact.php:2527
#: src/Model/Contact.php:2560
msgid "Connect URL missing."
msgstr ""
#: src/Model/Contact.php:2536
#: src/Model/Contact.php:2569
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr ""
#: src/Model/Contact.php:2578
#: src/Model/Contact.php:2611
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: src/Model/Contact.php:2580
#: src/Model/Contact.php:2613
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: src/Model/Contact.php:2583
#: src/Model/Contact.php:2616
msgid "An author or name was not found."
msgstr ""
#: src/Model/Contact.php:2586
#: src/Model/Contact.php:2619
msgid "No browser URL could be matched to this address."
msgstr ""
#: src/Model/Contact.php:2589
#: src/Model/Contact.php:2622
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr ""
#: src/Model/Contact.php:2590
#: src/Model/Contact.php:2623
msgid "Use mailto: in front of address to force email check."
msgstr ""
#: src/Model/Contact.php:2596
#: src/Model/Contact.php:2629
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: src/Model/Contact.php:2601
#: src/Model/Contact.php:2634
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: src/Model/Contact.php:2660
#: src/Model/Contact.php:2693
msgid "Unable to retrieve contact information."
msgstr ""

View file

@ -8,6 +8,7 @@
# abidin toumi <abidin24@tutanota.com>, 2020-2021
# ominds <ashraf@o-minds.com>, 2014
# ButterflyOfFire, 2018-2019
# ButterflyOfFire, 2022
# Farida Khalaf <faridakhalaf@hotmail.com>, 2021
# ominds <ashraf@o-minds.com>, 2014
# abidin toumi <abidin24@tutanota.com>, 2020
@ -15,9 +16,9 @@ msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-24 09:39-0500\n"
"PO-Revision-Date: 2022-03-05 16:40+0000\n"
"Last-Translator: abidin toumi <abidin24@tutanota.com>\n"
"POT-Creation-Date: 2022-06-06 07:33+0000\n"
"PO-Revision-Date: 2011-05-05 10:19+0000\n"
"Last-Translator: ButterflyOfFire, 2022\n"
"Language-Team: Arabic (http://www.transifex.com/Friendica/friendica/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -25,73 +26,74 @@ msgstr ""
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: mod/cal.php:44 mod/cal.php:48 mod/follow.php:39 mod/redir.php:34
#: mod/redir.php:175 src/Module/Conversation/Community.php:181
#: src/Module/Debug/ItemBody.php:37 src/Module/Diaspora/Receive.php:57
#: 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: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
msgid "Access denied."
msgstr "رُفض الوصول."
#: mod/cal.php:61 mod/cal.php:78 mod/photos.php:69 mod/photos.php:140
#: mod/photos.php:804 src/Model/Profile.php:229 src/Module/HCard.php:52
#: src/Module/Profile/Common.php:41 src/Module/Profile/Common.php:52
#: src/Module/Profile/Contacts.php:40 src/Module/Profile/Contacts.php:50
#: src/Module/Profile/Media.php:38 src/Module/Profile/Status.php:58
#: src/Module/Register.php:267 src/Module/RemoteFollow.php:58
#: mod/cal.php:63 mod/cal.php:80 mod/photos.php:69 mod/photos.php:140
#: mod/photos.php:798 src/Model/Profile.php:231 src/Module/Feed.php:72
#: src/Module/HCard.php:52 src/Module/Profile/Common.php:41
#: src/Module/Profile/Common.php:52 src/Module/Profile/Contacts.php:40
#: src/Module/Profile/Contacts.php:50 src/Module/Profile/Media.php:38
#: src/Module/Profile/Status.php:59 src/Module/Register.php:267
#: src/Module/RemoteFollow.php:58
msgid "User not found."
msgstr "لم يُعثر على المستخدم."
#: mod/cal.php:120 mod/display.php:238 src/Module/Profile/Profile.php:94
#: src/Module/Profile/Profile.php:109 src/Module/Profile/Status.php:109
#: mod/cal.php:122 mod/display.php:247 src/Module/Profile/Profile.php:94
#: src/Module/Profile/Profile.php:109 src/Module/Profile/Status.php:110
#: src/Module/Update/Profile.php:56
msgid "Access to this profile has been restricted."
msgstr "قُيِّد الوصول لهذا الملف الشخصي."
#: mod/cal.php:242 mod/events.php:377 src/Content/Nav.php:194
#: mod/cal.php:243 mod/events.php:374 src/Content/Nav.php:194
#: src/Content/Nav.php:258 src/Module/BaseProfile.php:84
#: src/Module/BaseProfile.php:95 view/theme/frio/theme.php:229
#: view/theme/frio/theme.php:233
msgid "Events"
msgstr "الأحداث"
#: mod/cal.php:243 mod/events.php:378
#: mod/cal.php:244 mod/events.php:375
msgid "View"
msgstr "اعرض"
#: mod/cal.php:244 mod/events.php:380
#: mod/cal.php:245 mod/events.php:377
msgid "Previous"
msgstr "السابق"
#: mod/cal.php:245 mod/events.php:381 src/Module/Install.php:214
#: mod/cal.php:246 mod/events.php:378 src/Module/Install.php:214
msgid "Next"
msgstr "التالي"
#: mod/cal.php:248 mod/events.php:386 src/Model/Event.php:457
#: mod/cal.php:249 mod/events.php:383 src/Model/Event.php:457
msgid "today"
msgstr "اليوم"
#: mod/cal.php:249 mod/events.php:387 src/Model/Event.php:458
#: mod/cal.php:250 mod/events.php:384 src/Model/Event.php:458
#: src/Util/Temporal.php:334
msgid "month"
msgstr "شهر"
#: mod/cal.php:250 mod/events.php:388 src/Model/Event.php:459
#: mod/cal.php:251 mod/events.php:385 src/Model/Event.php:459
#: src/Util/Temporal.php:335
msgid "week"
msgstr "أسبوع"
#: mod/cal.php:251 mod/events.php:389 src/Model/Event.php:460
#: mod/cal.php:252 mod/events.php:386 src/Model/Event.php:460
#: src/Util/Temporal.php:336
msgid "day"
msgstr "يوم"
#: mod/cal.php:252 mod/events.php:390
#: mod/cal.php:253 mod/events.php:387
msgid "list"
msgstr "قائمة"
#: mod/cal.php:265 src/Console/User.php:182 src/Model/User.php:659
#: mod/cal.php:265 src/Console/User.php:182 src/Model/User.php:661
#: src/Module/Admin/Users/Active.php:73 src/Module/Admin/Users/Blocked.php:74
#: src/Module/Admin/Users/Index.php:80 src/Module/Admin/Users/Pending.php:71
#: src/Module/Api/Twitter/ContactEndpoint.php:74
@ -106,50 +108,51 @@ msgstr "تنسيق هذا التقويم غير مدعوم"
msgid "No exportable data found"
msgstr "لم يُعثر على بيانات قابلة للتصدير"
#: mod/cal.php:293
#: mod/cal.php:292
msgid "calendar"
msgstr "تقويم"
#: mod/display.php:133 mod/photos.php:808
#: src/Module/Conversation/Community.php:175 src/Module/Directory.php:48
#: src/Module/Search/Index.php:49
#: mod/display.php:142 mod/photos.php:802
#: src/Module/Conversation/Community.php:175 src/Module/Directory.php:49
#: src/Module/Search/Index.php:50
msgid "Public access denied."
msgstr "رُفض الوصول العلني."
#: mod/display.php:189 mod/display.php:263
#: mod/display.php:198 mod/display.php:272
msgid "The requested item doesn't exist or has been deleted."
msgstr "العنصر غير موجود أو حُذف."
#: mod/display.php:343
#: mod/display.php:352
msgid "The feed for this item is unavailable."
msgstr "تغذية هذا العنصر غير متوفرة."
#: mod/editpost.php:38 mod/events.php:220 mod/follow.php:56 mod/follow.php:130
#: mod/item.php:184 mod/item.php:189 mod/item.php:918 mod/message.php:69
#: mod/message.php:111 mod/notes.php:44 mod/ostatus_subscribe.php:32
#: mod/photos.php:160 mod/photos.php:897 mod/repair_ostatus.php:31
#: mod/settings.php:47 mod/settings.php:57 mod/settings.php:417
#: 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: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:891 mod/repair_ostatus.php:31
#: mod/settings.php:40 mod/settings.php:50 mod/settings.php:156
#: mod/suggest.php:34 mod/uimport.php:33 mod/unfollow.php:35
#: mod/unfollow.php:50 mod/unfollow.php:82 mod/wall_attach.php:68
#: mod/wall_attach.php:71 mod/wall_upload.php:90 mod/wall_upload.php:93
#: 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
#: src/Module/Group.php:85 src/Module/Invite.php:41 src/Module/Invite.php:130
#: src/Module/Notifications/Notification.php:48
#: src/Module/Notifications/Notification.php:79
#: src/Module/Group.php:85 src/Module/Invite.php:42 src/Module/Invite.php:131
#: src/Module/Notifications/Notification.php:75
#: src/Module/Notifications/Notification.php:106
#: src/Module/Profile/Common.php:56 src/Module/Profile/Contacts.php:56
#: src/Module/Profile/Schedule.php:39 src/Module/Profile/Schedule.php:56
#: src/Module/Register.php:77 src/Module/Register.php:90
#: src/Module/Register.php:206 src/Module/Register.php:245
#: src/Module/Search/Directory.php:37 src/Module/Settings/Delegation.php:42
#: src/Module/Search/Directory.php:37 src/Module/Settings/Account.php:49
#: src/Module/Settings/Account.php:409 src/Module/Settings/Delegation.php:42
#: src/Module/Settings/Delegation.php:70 src/Module/Settings/Display.php:42
#: 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
@ -169,25 +172,25 @@ msgstr "عدّل المشاركة"
msgid "Save"
msgstr "احفظ"
#: mod/editpost.php:92 mod/photos.php:1344 src/Content/Conversation.php:326
#: src/Module/Contact/Poke.php:176 src/Object/Post.php:982
#: mod/editpost.php:92 mod/photos.php:1338 src/Content/Conversation.php:338
#: src/Module/Contact/Poke.php:176 src/Object/Post.php:989
msgid "Loading..."
msgstr "يحمل..."
#: mod/editpost.php:93 mod/message.php:198 mod/message.php:355
#: mod/wallmessage.php:140 src/Content/Conversation.php:327
#: mod/wallmessage.php:140 src/Content/Conversation.php:339
msgid "Upload photo"
msgstr "ارفع صورة"
#: mod/editpost.php:94 src/Content/Conversation.php:328
#: mod/editpost.php:94 src/Content/Conversation.php:340
msgid "upload photo"
msgstr "ارفع صورة"
#: mod/editpost.php:95 src/Content/Conversation.php:329
#: mod/editpost.php:95 src/Content/Conversation.php:341
msgid "Attach file"
msgstr "أرفق ملفًا"
#: mod/editpost.php:96 src/Content/Conversation.php:330
#: mod/editpost.php:96 src/Content/Conversation.php:342
msgid "attach file"
msgstr "أرفق ملفًا"
@ -216,31 +219,31 @@ msgstr "إدراج رابط ملف صوتي"
msgid "audio link"
msgstr "رابط ملف صوتي"
#: mod/editpost.php:103 src/Content/Conversation.php:340
#: src/Module/Item/Compose.php:161
#: mod/editpost.php:103 src/Content/Conversation.php:352
#: src/Module/Item/Compose.php:173
msgid "Set your location"
msgstr "عيّن موقعك"
#: mod/editpost.php:104 src/Content/Conversation.php:341
#: mod/editpost.php:104 src/Content/Conversation.php:353
msgid "set location"
msgstr "عين الموقع"
#: mod/editpost.php:105 src/Content/Conversation.php:342
#: mod/editpost.php:105 src/Content/Conversation.php:354
msgid "Clear browser location"
msgstr "امسح موقع المتصفح"
#: mod/editpost.php:106 src/Content/Conversation.php:343
#: mod/editpost.php:106 src/Content/Conversation.php:355
msgid "clear location"
msgstr "امسح الموقع"
#: mod/editpost.php:107 mod/message.php:200 mod/message.php:358
#: mod/photos.php:1495 mod/wallmessage.php:142
#: src/Content/Conversation.php:355 src/Content/Conversation.php:690
#: src/Module/Item/Compose.php:165 src/Object/Post.php:520
#: mod/photos.php:1489 mod/wallmessage.php:142
#: src/Content/Conversation.php:368 src/Content/Conversation.php:712
#: src/Module/Item/Compose.php:177 src/Object/Post.php:528
msgid "Please wait"
msgstr "يرجى الانتظار"
#: mod/editpost.php:108 src/Content/Conversation.php:356
#: mod/editpost.php:108 src/Content/Conversation.php:369
msgid "Permission settings"
msgstr "إعدادات الأذونات"
@ -248,17 +251,17 @@ msgstr "إعدادات الأذونات"
msgid "CC: email addresses"
msgstr "أرسله إلى عناوين البريد الإلكتروني"
#: mod/editpost.php:117 src/Content/Conversation.php:366
#: mod/editpost.php:117 src/Content/Conversation.php:379
msgid "Public post"
msgstr "مشاركة علنية"
#: mod/editpost.php:120 src/Content/Conversation.php:345
#: src/Module/Item/Compose.php:166
#: mod/editpost.php:120 src/Content/Conversation.php:357
#: src/Module/Item/Compose.php:178
msgid "Set title"
msgstr "عين العنوان"
#: mod/editpost.php:122 src/Content/Conversation.php:347
#: src/Module/Item/Compose.php:167
#: mod/editpost.php:122 src/Content/Conversation.php:359
#: src/Module/Item/Compose.php:179
msgid "Categories (comma-separated list)"
msgstr "الفئات (قائمة مفصولة بفاصلة)"
@ -266,75 +269,75 @@ msgstr "الفئات (قائمة مفصولة بفاصلة)"
msgid "Example: bob@example.com, mary@example.com"
msgstr "مثل: bob@example.com, mary@example.com"
#: mod/editpost.php:128 mod/events.php:517 mod/photos.php:1343
#: mod/photos.php:1399 mod/photos.php:1473 src/Content/Conversation.php:370
#: src/Module/Item/Compose.php:160 src/Object/Post.php:992
#: mod/editpost.php:128 mod/events.php:513 mod/photos.php:1337
#: mod/photos.php:1393 mod/photos.php:1467 src/Content/Conversation.php:383
#: src/Module/Item/Compose.php:172 src/Object/Post.php:999
msgid "Preview"
msgstr "معاينة"
#: mod/editpost.php:130 mod/fbrowser.php:117 mod/fbrowser.php:144
#: mod/follow.php:144 mod/photos.php:1010 mod/photos.php:1111 mod/tagrm.php:35
#: mod/tagrm.php:127 mod/unfollow.php:97 src/Content/Conversation.php:373
#: mod/editpost.php:130 mod/fbrowser.php:118 mod/fbrowser.php:145
#: mod/follow.php:144 mod/photos.php:1004 mod/photos.php:1105 mod/tagrm.php:35
#: mod/tagrm.php:127 mod/unfollow.php:97 src/Content/Conversation.php:386
#: src/Module/Contact/Revoke.php:108 src/Module/RemoteFollow.php:127
msgid "Cancel"
msgstr "ألغ"
#: mod/editpost.php:134 src/Content/Conversation.php:331
#: src/Module/Item/Compose.php:151 src/Object/Post.php:983
#: mod/editpost.php:134 src/Content/Conversation.php:343
#: src/Module/Item/Compose.php:163 src/Object/Post.php:990
msgid "Bold"
msgstr "عريض"
#: mod/editpost.php:135 src/Content/Conversation.php:332
#: src/Module/Item/Compose.php:152 src/Object/Post.php:984
#: mod/editpost.php:135 src/Content/Conversation.php:344
#: src/Module/Item/Compose.php:164 src/Object/Post.php:991
msgid "Italic"
msgstr "مائل"
#: mod/editpost.php:136 src/Content/Conversation.php:333
#: src/Module/Item/Compose.php:153 src/Object/Post.php:985
#: mod/editpost.php:136 src/Content/Conversation.php:345
#: src/Module/Item/Compose.php:165 src/Object/Post.php:992
msgid "Underline"
msgstr "تحته خط"
#: mod/editpost.php:137 src/Content/Conversation.php:334
#: src/Module/Item/Compose.php:154 src/Object/Post.php:986
#: mod/editpost.php:137 src/Content/Conversation.php:346
#: src/Module/Item/Compose.php:166 src/Object/Post.php:993
msgid "Quote"
msgstr "اقتبس"
#: mod/editpost.php:138 src/Content/Conversation.php:335
#: src/Module/Item/Compose.php:155 src/Object/Post.php:987
#: mod/editpost.php:138 src/Content/Conversation.php:347
#: src/Module/Item/Compose.php:167 src/Object/Post.php:994
msgid "Code"
msgstr "شفرة"
#: mod/editpost.php:139 src/Content/Conversation.php:337
#: src/Module/Item/Compose.php:157 src/Object/Post.php:989
#: mod/editpost.php:139 src/Content/Conversation.php:349
#: src/Module/Item/Compose.php:169 src/Object/Post.php:996
msgid "Link"
msgstr "رابط"
#: mod/editpost.php:140 src/Content/Conversation.php:338
#: src/Module/Item/Compose.php:158 src/Object/Post.php:990
#: mod/editpost.php:140 src/Content/Conversation.php:350
#: src/Module/Item/Compose.php:170 src/Object/Post.php:997
msgid "Link or Media"
msgstr "رابط أو وسائط"
#: mod/editpost.php:143 src/Content/Conversation.php:380
#: src/Content/Widget/VCard.php:107 src/Model/Profile.php:460
#: src/Module/Admin/Logs/View.php:92
#: mod/editpost.php:143 src/Content/Conversation.php:393
#: src/Content/Widget/VCard.php:113 src/Model/Profile.php:462
#: src/Module/Admin/Logs/View.php:93
msgid "Message"
msgstr "الرسالة"
#: mod/editpost.php:144 src/Content/Conversation.php:381
#: mod/editpost.php:144 src/Content/Conversation.php:394
#: src/Module/Settings/TwoFactor/Trusted.php:137
msgid "Browser"
msgstr "المتصفح"
#: mod/editpost.php:145 mod/events.php:522 mod/photos.php:945
#: mod/photos.php:1297 src/Content/Conversation.php:357
#: mod/editpost.php:145 mod/events.php:518 mod/photos.php:939
#: mod/photos.php:1291 src/Content/Conversation.php:370
msgid "Permissions"
msgstr "الأُذونات"
#: mod/editpost.php:147 src/Content/Conversation.php:383
#: mod/editpost.php:147 src/Content/Conversation.php:396
msgid "Open Compose page"
msgstr "افتح صفحة الإنشاء"
#: mod/events.php:123 mod/events.php:125
#: mod/events.php:124 mod/events.php:126
msgid "Event can not end before it has started."
msgstr "لا يمكن أن ينتهي الحدث قبل أن يبدأ."
@ -342,23 +345,23 @@ msgstr "لا يمكن أن ينتهي الحدث قبل أن يبدأ."
msgid "Event title and start time are required."
msgstr "عنوان الحدث و وقت بدئه إلزاميان."
#: mod/events.php:379
#: mod/events.php:376
msgid "Create New Event"
msgstr "أنشئ حدثاً جديدًا"
#: mod/events.php:478 src/Module/Admin/Logs/View.php:96
#: mod/events.php:474 src/Module/Admin/Logs/View.php:97
msgid "Event details"
msgstr "تفاصيل الحدث"
#: mod/events.php:479
#: mod/events.php:475
msgid "Starting date and Title are required."
msgstr "تاريخ البدء والعنوان إلزاميان."
#: mod/events.php:480 mod/events.php:485
#: mod/events.php:476 mod/events.php:481
msgid "Event Starts:"
msgstr "يبدأ الحدث في:"
#: mod/events.php:480 mod/events.php:510
#: mod/events.php:476 mod/events.php:506
#: src/Module/Admin/Blocklist/Server/Add.php:104
#: src/Module/Admin/Blocklist/Server/Add.php:106
#: src/Module/Admin/Blocklist/Server/Index.php:68
@ -377,77 +380,77 @@ msgstr "يبدأ الحدث في:"
msgid "Required"
msgstr "إلزامي"
#: mod/events.php:493 mod/events.php:516
#: mod/events.php:489 mod/events.php:512
msgid "Finish date/time is not known or not relevant"
msgstr "وقت\\تاريخ الانتهاء مجهول أو ليس له صلة"
#: mod/events.php:495 mod/events.php:500
#: mod/events.php:491 mod/events.php:496
msgid "Event Finishes:"
msgstr "ينتهي الحدث في:"
#: mod/events.php:506 src/Module/Profile/Profile.php:172
#: mod/events.php:502 src/Module/Profile/Profile.php:172
#: src/Module/Settings/Profile/Index.php:238
msgid "Description:"
msgstr "الوصف:"
#: mod/events.php:508 src/Content/Widget/VCard.php:98 src/Model/Event.php:80
#: mod/events.php:504 src/Content/Widget/VCard.php:104 src/Model/Event.php:80
#: src/Model/Event.php:107 src/Model/Event.php:466 src/Model/Event.php:915
#: src/Model/Profile.php:368 src/Module/Contact/Profile.php:369
#: src/Module/Directory.php:147 src/Module/Notifications/Introductions.php:185
#: src/Model/Profile.php:370 src/Module/Contact/Profile.php:369
#: src/Module/Directory.php:148 src/Module/Notifications/Introductions.php:185
#: src/Module/Profile/Profile.php:194
msgid "Location:"
msgstr "الموقع:"
#: mod/events.php:510 mod/events.php:512
#: mod/events.php:506 mod/events.php:508
msgid "Title:"
msgstr "العنوان:"
#: mod/events.php:513 mod/events.php:514
#: mod/events.php:509 mod/events.php:510
msgid "Share this event"
msgstr "شارك هذا الحدث"
#: mod/events.php:519 mod/message.php:201 mod/message.php:357
#: mod/photos.php:927 mod/photos.php:1031 mod/photos.php:1301
#: mod/photos.php:1342 mod/photos.php:1398 mod/photos.php:1472
#: mod/events.php:515 mod/message.php:201 mod/message.php:357
#: mod/photos.php:921 mod/photos.php:1025 mod/photos.php:1295
#: mod/photos.php:1336 mod/photos.php:1392 mod/photos.php:1466
#: src/Module/Admin/Item/Source.php:65 src/Module/Contact/Advanced.php:132
#: src/Module/Contact/Poke.php:177 src/Module/Contact/Profile.php:327
#: src/Module/Debug/ActivityPubConversion.php:141
#: src/Module/Debug/ActivityPubConversion.php:145
#: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64
#: src/Module/Debug/Probe.php:54 src/Module/Debug/WebFinger.php:51
#: src/Module/Delegation.php:148 src/Module/FriendSuggest.php:144
#: src/Module/Install.php:252 src/Module/Install.php:294
#: src/Module/Install.php:331 src/Module/Invite.php:177
#: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:247
#: src/Module/Settings/Profile/Index.php:222 src/Object/Post.php:981
#: src/Module/Install.php:331 src/Module/Invite.php:178
#: src/Module/Item/Compose.php:162 src/Module/Profile/Profile.php:247
#: src/Module/Settings/Profile/Index.php:222 src/Object/Post.php:988
#: view/theme/duepuntozero/config.php:69 view/theme/frio/config.php:160
#: view/theme/quattro/config.php:71 view/theme/vier/config.php:119
msgid "Submit"
msgstr "أرسل"
#: mod/events.php:520 src/Module/Profile/Profile.php:248
#: mod/events.php:516 src/Module/Profile/Profile.php:248
msgid "Basic"
msgstr "أساسي"
#: mod/events.php:521 src/Module/Admin/Site.php:506 src/Module/Contact.php:474
#: mod/events.php:517 src/Module/Admin/Site.php:439 src/Module/Contact.php:474
#: src/Module/Profile/Profile.php:249
msgid "Advanced"
msgstr "متقدم"
#: mod/events.php:538
#: mod/events.php:534
msgid "Failed to remove event"
msgstr "فشلت إزالة الحدث"
#: mod/fbrowser.php:60 src/Content/Nav.php:192 src/Module/BaseProfile.php:64
#: mod/fbrowser.php:61 src/Content/Nav.php:192 src/Module/BaseProfile.php:64
#: view/theme/frio/theme.php:227
msgid "Photos"
msgstr "الصور"
#: mod/fbrowser.php:119 mod/fbrowser.php:146
#: mod/fbrowser.php:120 mod/fbrowser.php:147
#: src/Module/Settings/Profile/Photo/Index.php:129
msgid "Upload"
msgstr "ارفع"
#: mod/fbrowser.php:141
#: mod/fbrowser.php:142
msgid "Files"
msgstr "الملفات"
@ -471,8 +474,8 @@ msgstr "دعم دياسبورا غير مفعل. لا يمكن إضافة الم
msgid "OStatus support is disabled. Contact can't be added."
msgstr "دعم OStatus غير مفعل. لا يمكن إضافة المتراسل."
#: mod/follow.php:138 src/Content/Item.php:452 src/Content/Widget.php:76
#: src/Model/Contact.php:1083 src/Model/Contact.php:1095
#: mod/follow.php:138 src/Content/Item.php:443 src/Content/Widget.php:78
#: src/Model/Contact.php:1102 src/Model/Contact.php:1114
#: view/theme/vier/theme.php:172
msgid "Connect/Follow"
msgstr "اقترن\\تابع"
@ -517,29 +520,29 @@ msgstr "مشاركات ورسائل الحالة"
msgid "The contact could not be added."
msgstr "تعذر إضافة المتراسل."
#: mod/item.php:134 mod/item.php:138
#: mod/item.php:131 mod/item.php:135
msgid "Unable to locate original post."
msgstr "تعذر إيجاد المشاركة الأصلية."
#: mod/item.php:340 mod/item.php:345
#: mod/item.php:337 mod/item.php:342
msgid "Empty post discarded."
msgstr "رُفضت المشاركة الفارغة."
#: mod/item.php:724
#: mod/item.php:687
msgid "Post updated."
msgstr "حُدثت المشاركة."
#: mod/item.php:734 mod/item.php:739
#: mod/item.php:697 mod/item.php:702
msgid "Item wasn't stored."
msgstr "لم يخزن العنصر."
#: mod/item.php:750
#: mod/item.php:713
msgid "Item couldn't be fetched."
msgstr "تعذر جلب العنصر."
#: mod/item.php:896 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 "لم يُعثر على العنصر."
@ -681,7 +684,7 @@ msgstr "غُيرت كلمة المرور على %s"
msgid "No keywords to match. Please add keywords to your profile."
msgstr "لا توجد كلمات مفتاحية لمطابقتها. من فضلك أضف كلمات مفتاحية إلى ملفك الشخصي."
#: mod/match.php:93 src/Module/BaseSearch.php:116
#: mod/match.php:93 src/Module/BaseSearch.php:119
msgid "No matches"
msgstr "لا تطابق"
@ -711,7 +714,7 @@ msgstr "فشل استرجاع الرسائل."
#: mod/message.php:120 src/Module/Notifications/Introductions.php:133
#: src/Module/Notifications/Introductions.php:168
#: src/Module/Notifications/Notification.php:57
#: src/Module/Notifications/Notification.php:84
msgid "Discard"
msgstr "ارفض"
@ -748,7 +751,7 @@ msgid "Subject:"
msgstr "الموضوع:"
#: mod/message.php:195 mod/message.php:351 mod/wallmessage.php:138
#: src/Module/Invite.php:170
#: src/Module/Invite.php:171
msgid "Your message:"
msgstr "رسالتك:"
@ -816,51 +819,51 @@ msgstr "ملاحظات شخصية"
msgid "Personal notes are visible only by yourself."
msgstr "الملاحظات الشخصية مرئية لك فقط."
#: mod/ostatus_subscribe.php:37
#: mod/ostatus_subscribe.php:38
msgid "Subscribing to contacts"
msgstr "يشترك في متراسلين"
#: mod/ostatus_subscribe.php:47
#: mod/ostatus_subscribe.php:48
msgid "No contact provided."
msgstr "لم يُقدم متراسلين."
#: mod/ostatus_subscribe.php:53
#: mod/ostatus_subscribe.php:54
msgid "Couldn't fetch information for contact."
msgstr "تعذر جلب معلومات المتراسل."
#: mod/ostatus_subscribe.php:64
#: mod/ostatus_subscribe.php:65
msgid "Couldn't fetch friends for contact."
msgstr "تعذر جلب أصدقاء المتراسل."
#: mod/ostatus_subscribe.php:70 mod/ostatus_subscribe.php:81
#: mod/ostatus_subscribe.php:71 mod/ostatus_subscribe.php:82
msgid "Couldn't fetch following contacts."
msgstr "تعذر جلب متابِعي المتراسل."
#: mod/ostatus_subscribe.php:76
#: mod/ostatus_subscribe.php:77
msgid "Couldn't fetch remote profile."
msgstr "تعذر جلب الملف الشخصي البعيد."
#: mod/ostatus_subscribe.php:86
#: mod/ostatus_subscribe.php:87
msgid "Unsupported network"
msgstr "شبكة غير مدعومة"
#: mod/ostatus_subscribe.php:102 mod/repair_ostatus.php:51
#: mod/ostatus_subscribe.php:103 mod/repair_ostatus.php:51
msgid "Done"
msgstr "تم"
#: mod/ostatus_subscribe.php:116
#: mod/ostatus_subscribe.php:117
msgid "success"
msgstr "نجح"
#: mod/ostatus_subscribe.php:118
#: mod/ostatus_subscribe.php:119
msgid "failed"
msgstr "فشل"
#: mod/ostatus_subscribe.php:121
#: mod/ostatus_subscribe.php:122
msgid "ignored"
msgstr "متجاهل"
#: mod/ostatus_subscribe.php:126 mod/repair_ostatus.php:57
#: mod/ostatus_subscribe.php:127 mod/repair_ostatus.php:57
msgid "Keep this window open until done."
msgstr "أبق هذه النافذة مفتوحة حتى ينتهي."
@ -868,11 +871,11 @@ msgstr "أبق هذه النافذة مفتوحة حتى ينتهي."
msgid "Photo Albums"
msgstr "ألبومات الصور"
#: mod/photos.php:109 mod/photos.php:1590
#: mod/photos.php:109 mod/photos.php:1584
msgid "Recent Photos"
msgstr "الصور الأخيرة"
#: mod/photos.php:111 mod/photos.php:1079 mod/photos.php:1592
#: mod/photos.php:111 mod/photos.php:1073 mod/photos.php:1586
msgid "Upload New Photos"
msgstr "ارفع صور جديدة"
@ -900,242 +903,229 @@ msgstr "ألبوم فارغ."
msgid "Failed to delete the photo."
msgstr "فشل حذف الصفحة."
#: mod/photos.php:559
#: mod/photos.php:553
msgid "a photo"
msgstr "صورة"
#: mod/photos.php:559
#: mod/photos.php:553
#, php-format
msgid "%1$s was tagged in %2$s by %3$s"
msgstr "ذكر %3$s %1$s في %2$s"
#: mod/photos.php:642 mod/photos.php:645 mod/photos.php:672
#: mod/wall_upload.php:204 src/Module/Settings/Profile/Photo/Index.php:60
#: mod/photos.php:636 mod/photos.php:639 mod/photos.php:666
#: mod/wall_upload.php:201 src/Module/Settings/Profile/Photo/Index.php:60
#, php-format
msgid "Image exceeds size limit of %s"
msgstr "تجاوزت الصورة الحد الأقصى للحجم وهو %s"
#: mod/photos.php:648
#: mod/photos.php:642
msgid "Image upload didn't complete, please try again"
msgstr "لم يكتمل رفع الصورة، من فضلك أعد المحاولة"
#: mod/photos.php:651
#: mod/photos.php:645
msgid "Image file is missing"
msgstr "ملف الصورة مفقود"
#: mod/photos.php:656
#: mod/photos.php:650
msgid ""
"Server can't accept new file upload at this time, please contact your "
"administrator"
msgstr "الخادم لا يقبل رفع ملفات جديدة، يرجى التواصل مع مدير الموقع"
#: mod/photos.php:680
#: mod/photos.php:674
msgid "Image file is empty."
msgstr "ملف الصورة فارغ."
#: mod/photos.php:695 mod/wall_upload.php:166
#: mod/photos.php:689 mod/wall_upload.php:163
#: src/Module/Settings/Profile/Photo/Index.php:69
msgid "Unable to process image."
msgstr "تعذرت معالجة الصورة."
#: mod/photos.php:721 mod/wall_upload.php:229
#: mod/photos.php:715 mod/wall_upload.php:226
#: src/Module/Settings/Profile/Photo/Index.php:96
msgid "Image upload failed."
msgstr "فشل رفع الصورة."
#: mod/photos.php:813
#: mod/photos.php:807
msgid "No photos selected"
msgstr "لم تختر صورًا"
#: mod/photos.php:882
#: mod/photos.php:876
msgid "Access to this item is restricted."
msgstr "الوصول إلى هذا العنصر مقيد."
#: mod/photos.php:937
#: mod/photos.php:931
msgid "Upload Photos"
msgstr "ارفع صورًا"
#: mod/photos.php:941 mod/photos.php:1027
#: mod/photos.php:935 mod/photos.php:1021
msgid "New album name: "
msgstr "اسم الألبوم الجديد: "
#: mod/photos.php:942
#: mod/photos.php:936
msgid "or select existing album:"
msgstr "أو اختر ألبومًا موجودًا:"
#: mod/photos.php:943
#: mod/photos.php:937
msgid "Do not show a status post for this upload"
msgstr "لا تظهر مشاركة حالة لهذا الملف المرفوع"
#: mod/photos.php:1008
#: mod/photos.php:1002
msgid "Do you really want to delete this photo album and all its photos?"
msgstr "أتريد حذف هذا الألبوم وكافة محتوياته؟"
#: mod/photos.php:1009 mod/photos.php:1032
#: mod/photos.php:1003 mod/photos.php:1026
msgid "Delete Album"
msgstr "احذف الألبوم"
#: mod/photos.php:1036
#: mod/photos.php:1030
msgid "Edit Album"
msgstr "عدّل الألبوم"
#: mod/photos.php:1037
#: mod/photos.php:1031
msgid "Drop Album"
msgstr "احذف الألبوم"
#: mod/photos.php:1041
#: mod/photos.php:1035
msgid "Show Newest First"
msgstr "اعرض الأحدث أولًا"
#: mod/photos.php:1043
#: mod/photos.php:1037
msgid "Show Oldest First"
msgstr "اعرض الأقدم أولًا"
#: mod/photos.php:1064 mod/photos.php:1575
#: mod/photos.php:1058 mod/photos.php:1569
msgid "View Photo"
msgstr "اعرض الصور"
#: mod/photos.php:1097
#: mod/photos.php:1091
msgid "Permission denied. Access to this item may be restricted."
msgstr "رُفض الإذن. قد يكون الوصول إلى هذا العنصر مقيدا."
#: mod/photos.php:1099
#: mod/photos.php:1093
msgid "Photo not available"
msgstr "الصورة غير متوفرة"
#: mod/photos.php:1109
#: mod/photos.php:1103
msgid "Do you really want to delete this photo?"
msgstr "أتريد حذف هذه الصورة؟"
#: mod/photos.php:1110 mod/photos.php:1302
#: mod/photos.php:1104 mod/photos.php:1296
msgid "Delete Photo"
msgstr "احذف الصورة"
#: mod/photos.php:1200
#: mod/photos.php:1196
msgid "View photo"
msgstr "اعرض الصورة"
#: mod/photos.php:1202
#: mod/photos.php:1198
msgid "Edit photo"
msgstr "عدّل الصورة"
#: mod/photos.php:1203
#: mod/photos.php:1199
msgid "Delete photo"
msgstr "احذف الصورة"
#: mod/photos.php:1204
#: mod/photos.php:1200
msgid "Use as profile photo"
msgstr "استخدامها كصورة الملف الشخصي"
#: mod/photos.php:1211
#: mod/photos.php:1207
msgid "Private Photo"
msgstr "صور خاصة"
#: mod/photos.php:1217
#: mod/photos.php:1213
msgid "View Full Size"
msgstr "اعرض بالحجم الكامل"
#: mod/photos.php:1270
#: mod/photos.php:1264
msgid "Tags: "
msgstr "الوسوم: "
#: mod/photos.php:1273
#: mod/photos.php:1267
msgid "[Select tags to remove]"
msgstr "[اختر وسومًا لإزالتها]"
#: mod/photos.php:1288
#: mod/photos.php:1282
msgid "New album name"
msgstr "اسم الألبوم الجديد"
#: mod/photos.php:1289
#: mod/photos.php:1283
msgid "Caption"
msgstr "وصف الصورة"
#: mod/photos.php:1290
#: mod/photos.php:1284
msgid "Add a Tag"
msgstr "أضف وسمًا"
#: mod/photos.php:1290
#: mod/photos.php:1284
msgid ""
"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr "مثال: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
#: mod/photos.php:1291
#: mod/photos.php:1285
msgid "Do not rotate"
msgstr "لا تُدر"
#: mod/photos.php:1292
#: mod/photos.php:1286
msgid "Rotate CW (right)"
msgstr "أدر باتجاه عقارب الساعة"
#: mod/photos.php:1293
#: mod/photos.php:1287
msgid "Rotate CCW (left)"
msgstr "أدر عكس اتجاه عقارب الساعة"
#: mod/photos.php:1339 mod/photos.php:1395 mod/photos.php:1469
#: src/Module/Contact.php:544 src/Module/Item/Compose.php:148
#: src/Object/Post.php:978
#: mod/photos.php:1333 mod/photos.php:1389 mod/photos.php:1463
#: src/Module/Contact.php:544 src/Module/Item/Compose.php:160
#: src/Object/Post.php:985
msgid "This is you"
msgstr "هذا أنت"
#: mod/photos.php:1341 mod/photos.php:1397 mod/photos.php:1471
#: src/Object/Post.php:514 src/Object/Post.php:980
#: mod/photos.php:1335 mod/photos.php:1391 mod/photos.php:1465
#: src/Object/Post.php:522 src/Object/Post.php:987
msgid "Comment"
msgstr "علِّق"
#: mod/photos.php:1430 src/Content/Conversation.php:615
#: mod/photos.php:1424 src/Content/Conversation.php:628
#: src/Object/Post.php:247
msgid "Select"
msgstr "اختر"
#: mod/photos.php:1431 mod/settings.php:611 src/Content/Conversation.php:616
#: mod/photos.php:1425 mod/settings.php:350 src/Content/Conversation.php:629
#: src/Module/Admin/Users/Active.php:139
#: src/Module/Admin/Users/Blocked.php:140 src/Module/Admin/Users/Index.php:153
msgid "Delete"
msgstr "احذف"
#: mod/photos.php:1492 src/Object/Post.php:369
#: mod/photos.php:1486 src/Object/Post.php:369
msgid "Like"
msgstr "أعجبني"
#: mod/photos.php:1493 src/Object/Post.php:369
#: mod/photos.php:1487 src/Object/Post.php:369
msgid "I like this (toggle)"
msgstr "أعجبني (بدِّل)"
#: mod/photos.php:1494 src/Object/Post.php:370
#: mod/photos.php:1488 src/Object/Post.php:370
msgid "Dislike"
msgstr "لم يعجبني"
#: mod/photos.php:1496 src/Object/Post.php:370
#: mod/photos.php:1490 src/Object/Post.php:370
msgid "I don't like this (toggle)"
msgstr "لم يعجبني (بدِّل)"
#: mod/photos.php:1518
#: mod/photos.php:1512
msgid "Map"
msgstr "خريطة"
#: mod/photos.php:1581
#: mod/photos.php:1575
msgid "View Album"
msgstr "اعرض الألبوم"
#: mod/ping.php:275
msgid "{0} wants to be your friend"
msgstr "{0} يريد أن يكون صديقك"
#: mod/ping.php:292
msgid "{0} requested registration"
msgstr "{0} طلبَ التسجيل"
#: mod/ping.php:305
#, php-format
msgid "{0} and %d others requested registration"
msgstr "{0} و %d أخرون يطلبون التسجيل"
#: mod/redir.php:49 mod/redir.php:102
#: mod/redir.php:51 mod/redir.php:104
msgid "Bad Request."
msgstr "طلب خاطئ."
#: mod/redir.php:55 mod/redir.php:129 src/Module/Contact/Advanced.php:70
#: mod/redir.php:57 mod/redir.php:131 src/Module/Contact/Advanced.php:70
#: src/Module/Contact/Advanced.php:109 src/Module/Contact/Contacts.php:55
#: src/Module/Contact/Conversations.php:78
#: src/Module/Contact/Conversations.php:83
@ -1148,36 +1138,36 @@ msgstr "طلب خاطئ."
msgid "Contact not found."
msgstr "لم يُعثر على المتراسل."
#: mod/removeme.php:63 src/Navigation/Notifications/Repository/Notify.php:473
#: mod/removeme.php:65 src/Navigation/Notifications/Repository/Notify.php:482
msgid "[Friendica System Notify]"
msgstr "[تنبيه نظام فرنديكا]"
#: mod/removeme.php:63
#: mod/removeme.php:65
msgid "User deleted their account"
msgstr "حذف المستخدم حسابه"
#: mod/removeme.php:64
#: mod/removeme.php:66
msgid ""
"On your Friendica node an user deleted their account. Please ensure that "
"their data is removed from the backups."
msgstr "حذف مستخدم حسابه على عقدة فرَندِكا خاصتك. من فضلك تأكد أن بياناتهم أُزيلت من النسخ الاحتياطية."
#: mod/removeme.php:65
#: mod/removeme.php:67
#, php-format
msgid "The user id is %d"
msgstr "معرف المستخدم هو %d"
#: mod/removeme.php:99 mod/removeme.php:102
#: mod/removeme.php:101 mod/removeme.php:104
msgid "Remove My Account"
msgstr "أزل حسابي"
#: mod/removeme.php:100
#: mod/removeme.php:102
msgid ""
"This will completely remove your account. Once this has been done it is not "
"recoverable."
msgstr "سيزال حسابك نهائيًا. لا مجال لتراجع عند انتهائه."
#: mod/removeme.php:101
#: mod/removeme.php:103
msgid "Please enter your password for verification:"
msgstr "يرجى إدخال كلمة المرور للتأكيد:"
@ -1185,7 +1175,7 @@ msgstr "يرجى إدخال كلمة المرور للتأكيد:"
msgid "Resubscribing to OStatus contacts"
msgstr "يعيد الاشتراك في متراسلي OStatus"
#: mod/repair_ostatus.php:46 src/Module/Debug/ActivityPubConversion.php:130
#: mod/repair_ostatus.php:46 src/Module/Debug/ActivityPubConversion.php:134
#: src/Module/Debug/Babel.php:293 src/Module/Security/TwoFactor/Verify.php:97
msgid "Error"
msgid_plural "Errors"
@ -1196,67 +1186,15 @@ msgstr[3] "أخطاء"
msgstr[4] "خطأً"
msgstr[5] "خطأٍ"
#: mod/settings.php:129
#: mod/settings.php:122
msgid "Failed to connect with email account using the settings provided."
msgstr "فشل الاتصال بحساب البريد الإلكتروني باستخدام الإعدادات المقدمة."
#: mod/settings.php:159
msgid "Contact CSV file upload error"
msgstr "خطأ أثناء رفع ملف CSV"
#: mod/settings.php:178
msgid "Importing Contacts done"
msgstr "أُستورد المتراسلون"
#: mod/settings.php:191
msgid "Relocate message has been send to your contacts"
msgstr "أُرسلت رسالة تنبيه بانتقالك إلى متراسليك"
#: mod/settings.php:203
msgid "Passwords do not match."
msgstr "كلمتا المرور غير متطابقتين."
#: mod/settings.php:211 src/Console/User.php:210
msgid "Password update failed. Please try again."
msgstr "فشل تحديث كلمة المرور. من فضلك أعد المحاولة."
#: mod/settings.php:214 src/Console/User.php:213
msgid "Password changed."
msgstr "غُيّرت كلمة المرور."
#: mod/settings.php:217
msgid "Password unchanged."
msgstr "لم تُغير كلمة المرور."
#: mod/settings.php:304
msgid "Please use a shorter name."
msgstr "يرجى استخدام اسم أقصر."
#: mod/settings.php:307
msgid "Name too short."
msgstr "الاسم قصير جداً."
#: mod/settings.php:316
msgid "Wrong Password."
msgstr "كلمة المرور خاطئة."
#: mod/settings.php:321
msgid "Invalid email."
msgstr "البريد الإلكتروني غير صالح."
#: mod/settings.php:327
msgid "Cannot change to that email."
msgstr "لا يمكن التغيير إلى هذا البريد الإلكتروني."
#: mod/settings.php:395
msgid "Settings were not updated."
msgstr "لم تُحدث الإعدادات."
#: mod/settings.php:436
#: mod/settings.php:175
msgid "Connected Apps"
msgstr "التطبيقات المتصلة"
#: mod/settings.php:437 src/Module/Admin/Blocklist/Contact.php:106
#: mod/settings.php:176 src/Module/Admin/Blocklist/Contact.php:106
#: src/Module/Admin/Users/Active.php:129
#: src/Module/Admin/Users/Blocked.php:130 src/Module/Admin/Users/Create.php:71
#: src/Module/Admin/Users/Deleted.php:88 src/Module/Admin/Users/Index.php:142
@ -1265,104 +1203,104 @@ msgstr "التطبيقات المتصلة"
msgid "Name"
msgstr "الاسم"
#: mod/settings.php:438 src/Content/Nav.php:212
#: mod/settings.php:177 src/Content/Nav.php:212
msgid "Home Page"
msgstr "الصفحة الرئيسية"
#: mod/settings.php:439 src/Module/Admin/Queue.php:78
#: mod/settings.php:178 src/Module/Admin/Queue.php:78
msgid "Created"
msgstr "أُنشئ"
#: mod/settings.php:440
#: mod/settings.php:179
msgid "Remove authorization"
msgstr "أزل التخويل"
#: mod/settings.php:466 mod/settings.php:498 mod/settings.php:529
#: mod/settings.php:613 mod/settings.php:750
#: src/Module/Admin/Addons/Index.php:69 src/Module/Admin/Features.php:87
#: src/Module/Admin/Logs/Settings.php:81 src/Module/Admin/Site.php:501
#: src/Module/Admin/Themes/Index.php:113 src/Module/Admin/Tos.php:83
#: mod/settings.php:205 mod/settings.php:237 mod/settings.php:268
#: mod/settings.php:352 src/Module/Admin/Addons/Index.php:69
#: src/Module/Admin/Features.php:87 src/Module/Admin/Logs/Settings.php:81
#: src/Module/Admin/Site.php:434 src/Module/Admin/Themes/Index.php:113
#: src/Module/Admin/Tos.php:83 src/Module/Settings/Account.php:559
#: src/Module/Settings/Delegation.php:170 src/Module/Settings/Display.php:193
msgid "Save Settings"
msgstr "احفظ الإعدادات"
#: mod/settings.php:474
#: mod/settings.php:213
msgid "Addon Settings"
msgstr "إعدادات الإضافة"
#: mod/settings.php:475
#: mod/settings.php:214
msgid "No Addon settings configured"
msgstr "لم تضبط إعدادات الإضافة"
#: mod/settings.php:496
#: mod/settings.php:235
msgid "Additional Features"
msgstr "ميزات إضافية"
#: mod/settings.php:534
#: mod/settings.php:273
msgid "Diaspora (Socialhome, Hubzilla)"
msgstr "دياسبورا (سوشل-هوم، هوب-زيلا)"
#: mod/settings.php:534 mod/settings.php:535
#: mod/settings.php:273 mod/settings.php:274
msgid "enabled"
msgstr "مفعل"
#: mod/settings.php:534 mod/settings.php:535
#: mod/settings.php:273 mod/settings.php:274
msgid "disabled"
msgstr "معطل"
#: mod/settings.php:534 mod/settings.php:535
#: mod/settings.php:273 mod/settings.php:274
#, php-format
msgid "Built-in support for %s connectivity is %s"
msgstr "دعم مدمج لـ %s باتصال %s"
#: mod/settings.php:535
#: mod/settings.php:274
msgid "OStatus (GNU Social)"
msgstr "OStatus (غنو سوشل)"
#: mod/settings.php:561
#: mod/settings.php:300
msgid "Email access is disabled on this site."
msgstr "الوصول إلى البريد الإلكتروني معطل في هذا الموقع."
#: mod/settings.php:566 mod/settings.php:611
#: mod/settings.php:305 mod/settings.php:350
msgid "None"
msgstr "لا شيء"
#: mod/settings.php:572 src/Module/BaseSettings.php:78
#: mod/settings.php:311 src/Module/BaseSettings.php:78
msgid "Social Networks"
msgstr "الشبكات الاجتماعية"
#: mod/settings.php:577
#: mod/settings.php:316
msgid "General Social Media Settings"
msgstr "الإعدادات العامة لشبكات التواصل الاجتماعي"
#: mod/settings.php:580
#: mod/settings.php:319
msgid "Followed content scope"
msgstr "حيز المحتوى المتابَع"
#: mod/settings.php:582
#: mod/settings.php:321
msgid ""
"By default, conversations in which your follows participated but didn't "
"start will be shown in your timeline. You can turn this behavior off, or "
"expand it to the conversations in which your follows liked a post."
msgstr ""
#: mod/settings.php:584
#: mod/settings.php:323
msgid "Only conversations my follows started"
msgstr "المحادثات التي بدأها متابَعي فقط"
#: mod/settings.php:585
#: mod/settings.php:324
msgid "Conversations my follows started or commented on (default)"
msgstr "المحادثات التي بدأها متابَعي أو علقوا عليها (الافتراضي)"
#: mod/settings.php:586
#: mod/settings.php:325
msgid "Any conversation my follows interacted with, including likes"
msgstr "أي محادثة تفاعل معها متابَعي"
#: mod/settings.php:589
#: mod/settings.php:328
msgid "Enable Content Warning"
msgstr "فعّل التحذير من المحتوى"
#: mod/settings.php:589
#: mod/settings.php:328
msgid ""
"Users on networks like Mastodon or Pleroma are able to set a content warning"
" field which collapse their post by default. This enables the automatic "
@ -1370,627 +1308,131 @@ msgid ""
" affect any other content filtering you eventually set up."
msgstr "يمكن لمستخدمي شبكات مثل ماستدون أو بليروما تعيين حقل التحذير من المحتوى الذي يطوي مشاركتهم افتراضيا. هذا يفعل الطي التلقائي بدلًا من تعيين التحذير من المحتوى كعنوان للمشاركة. هذا لا يؤثر على أي ترشيح محتوى قمت بإعداده."
#: mod/settings.php:590
#: mod/settings.php:329
msgid "Enable intelligent shortening"
msgstr "فعّل الاختصار الذكي"
#: mod/settings.php:590
#: mod/settings.php:329
msgid ""
"Normally the system tries to find the best link to add to shortened posts. "
"If disabled, every shortened post will always point to the original "
"friendica post."
msgstr "يعثر الاختصار الذكي على الرابط الأنسب في المشاركات المختصرة. عند تعطيله سيشير الرابط إلى منشور فرنديكا الأصلي."
#: mod/settings.php:591
#: mod/settings.php:330
msgid "Enable simple text shortening"
msgstr "فعّل اختصار النصوص"
#: mod/settings.php:591
#: mod/settings.php:330
msgid ""
"Normally the system shortens posts at the next line feed. If this option is "
"enabled then the system will shorten the text at the maximum character "
"limit."
msgstr ""
#: mod/settings.php:592
#: mod/settings.php:331
msgid "Attach the link title"
msgstr "أرفق عنوان الرابط"
#: mod/settings.php:592
#: mod/settings.php:331
msgid ""
"When activated, the title of the attached link will be added as a title on "
"posts to Diaspora. This is mostly helpful with \"remote-self\" contacts that"
" share feed content."
msgstr "عند تفعيله سيتم إرفاق عنوان الصفحة بمنشور دياسبورا. هذا مفيد بشكل أساسي مع المتراسلين \"الذاتيين\" الذين يشاركون تغذيات Rss / Atom."
#: mod/settings.php:593
#: mod/settings.php:332
msgid "Your legacy ActivityPub/GNU Social account"
msgstr "حساب GNU Social\\ActivityPub القديم"
#: mod/settings.php:593
#: mod/settings.php:332
msgid ""
"If you enter your old account name from an ActivityPub based system or your "
"GNU Social/Statusnet account name here (in the format user@domain.tld), your"
" contacts will be added automatically. The field will be emptied when done."
msgstr "إذا قمت بإدخال اسم حساب ActivityPub/GNU Social/Statusnet القديم هنا (بنسق user@domain.tld)، سيضاف المتراسلون في هذا الحساب تلقائيا. سيصفر الحقل عند الانتهاء."
#: mod/settings.php:596
#: mod/settings.php:335
msgid "Repair OStatus subscriptions"
msgstr "أصلح اشتراكات OStatus"
#: mod/settings.php:600
#: mod/settings.php:339
msgid "Email/Mailbox Setup"
msgstr "إعداد بريد الكتروني/صندوق بريد"
#: mod/settings.php:601
#: mod/settings.php:340
msgid ""
"If you wish to communicate with email contacts using this service "
"(optional), please specify how to connect to your mailbox."
msgstr "إذا كنت ترغب في التواصل مع متراسلي البريد الإلكتروني باستخدام هذه الخدمة (اختيارية)، من فضلك حدد كيفية الاتصال بصندوق بريدك."
#: mod/settings.php:602
#: mod/settings.php:341
msgid "Last successful email check:"
msgstr "آخر تحقق ناجح للبريد الإلكتروني:"
#: mod/settings.php:604
#: mod/settings.php:343
msgid "IMAP server name:"
msgstr "اسم خادم IMAP:"
#: mod/settings.php:605
#: mod/settings.php:344
msgid "IMAP port:"
msgstr "منفذ IMAP:"
#: mod/settings.php:606
#: mod/settings.php:345
msgid "Security:"
msgstr "الحماية:"
#: mod/settings.php:607
#: mod/settings.php:346
msgid "Email login name:"
msgstr "اسم الولوج للبريد الإلكتروني:"
#: mod/settings.php:608
#: mod/settings.php:347
msgid "Email password:"
msgstr "كلمة مرور البريد الإلكتروني:"
#: mod/settings.php:609
#: mod/settings.php:348
msgid "Reply-to address:"
msgstr "الرد على عنوان:"
#: mod/settings.php:610
#: mod/settings.php:349
msgid "Send public posts to all email contacts:"
msgstr "أرسل المشاركات العلنية لجميع متراسلي البريد الإلكتروني:"
#: mod/settings.php:611
#: mod/settings.php:350
msgid "Action after import:"
msgstr "الإجراء بعد الاستيراد:"
#: mod/settings.php:611 src/Content/Nav.php:280
#: mod/settings.php:350 src/Content/Nav.php:280
msgid "Mark as seen"
msgstr "علّمه كمُشاهَد"
#: mod/settings.php:611
#: mod/settings.php:350
msgid "Move to folder"
msgstr "انقل إلى مجلد"
#: mod/settings.php:612
#: mod/settings.php:351
msgid "Move to folder:"
msgstr "انقل إلى المجلد:"
#: mod/settings.php:626
msgid "Unable to find your profile. Please contact your admin."
msgstr "تعذر العثور على ملفك الشخصي. من فضلك اتصال بالمدير."
#: mod/settings.php:664 src/Content/Widget.php:523
msgid "Account Types"
msgstr "أنواع الحسابات"
#: mod/settings.php:665
msgid "Personal Page Subtypes"
msgstr "الأنواع الفرعية للصفحة الشخصية"
#: mod/settings.php:666
msgid "Community Forum Subtypes"
msgstr "الأنواع الفرعية للمنتدى المجتمعي"
#: mod/settings.php:673 src/Module/Admin/BaseUsers.php:107
msgid "Personal Page"
msgstr "صفحة شخصية"
#: mod/settings.php:674
msgid "Account for a personal profile."
msgstr "حساب ملف شخصي خاص."
#: mod/settings.php:677 src/Module/Admin/BaseUsers.php:108
msgid "Organisation Page"
msgstr "صفحة منظمة"
#: mod/settings.php:678
msgid ""
"Account for an organisation that automatically approves contact requests as "
"\"Followers\"."
msgstr "حساب المنظمة يوافق تلقائياً على طلبات المراسلة \"كمتابعين\"."
#: mod/settings.php:681 src/Module/Admin/BaseUsers.php:109
msgid "News Page"
msgstr "صفحة إخبارية"
#: mod/settings.php:682
msgid ""
"Account for a news reflector that automatically approves contact requests as"
" \"Followers\"."
msgstr "حساب إخباري يوافق تلقائياً على طلبات المراسلة \"كمتابعين\"."
#: mod/settings.php:685 src/Module/Admin/BaseUsers.php:110
msgid "Community Forum"
msgstr "منتدى مجتمعي"
#: mod/settings.php:686
msgid "Account for community discussions."
msgstr "حساب مناقشات مجتمعية."
#: mod/settings.php:689 src/Module/Admin/BaseUsers.php:100
msgid "Normal Account Page"
msgstr "صفحة حساب عادي"
#: mod/settings.php:690
msgid ""
"Account for a regular personal profile that requires manual approval of "
"\"Friends\" and \"Followers\"."
msgstr "حساب ملف شخصي عادي يتطلب الموافقة اليدوية على \"الأصدقاء\" و \"المتابعين\"."
#: mod/settings.php:693 src/Module/Admin/BaseUsers.php:101
msgid "Soapbox Page"
msgstr "صفحة سياسي"
#: mod/settings.php:694
msgid ""
"Account for a public profile that automatically approves contact requests as"
" \"Followers\"."
msgstr "حساب شخصي علني يوافق تلقائياً على طلبات المراسلة \"كمتابعين\"."
#: mod/settings.php:697 src/Module/Admin/BaseUsers.php:102
msgid "Public Forum"
msgstr "منتدى عمومي"
#: mod/settings.php:698
msgid "Automatically approves all contact requests."
msgstr "يوافق تلقائياً على جميع طلبات المراسلة."
#: mod/settings.php:701 src/Module/Admin/BaseUsers.php:103
msgid "Automatic Friend Page"
msgstr "صفحة اشترك تلقائي"
#: mod/settings.php:702
msgid ""
"Account for a popular profile that automatically approves contact requests "
"as \"Friends\"."
msgstr "حساب ملف شخصي لمشهور يوافق تلقائياً على طلبات المراسلة كـ\"أصدقاء\"."
#: mod/settings.php:705
msgid "Private Forum [Experimental]"
msgstr "منتدى خاص [تجريبي]"
#: mod/settings.php:706
msgid "Requires manual approval of contact requests."
msgstr "يتطلب الموافقة اليدوية على طلبات المراسلة."
#: mod/settings.php:717
msgid "OpenID:"
msgstr "OpenID:"
#: mod/settings.php:717
msgid "(Optional) Allow this OpenID to login to this account."
msgstr "(اختياري) اسمح لمعرف OpenID بالولوج إلى هذا الحساب."
#: mod/settings.php:725
msgid "Publish your profile in your local site directory?"
msgstr "أتريد نشر ملفك الشخصي في الدليل المحلي للموقع؟"
#: mod/settings.php:725
#, php-format
msgid ""
"Your profile will be published in this node's <a href=\"%s\">local "
"directory</a>. Your profile details may be publicly visible depending on the"
" system settings."
msgstr "سينشر ملفك الشخصي في <a href=\"%s\"> الدليل المحلي</a> لهذه العقدة. تعتمد خصوصية معلوماتك على إعدادات النظام."
#: mod/settings.php:731
#, php-format
msgid ""
"Your profile will also be published in the global friendica directories "
"(e.g. <a href=\"%s\">%s</a>)."
msgstr "سينشر ملفك الشخصي كذلك في الأدلة العالمية لفرَندِيكا (مثال <a href=\"%s\">%s</a>)."
#: mod/settings.php:737
#, php-format
msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
msgstr "عنوان معرفك هو <strong>'%s'</strong> أو '%s'."
#: mod/settings.php:748
msgid "Account Settings"
msgstr "إعدادات الحساب"
#: mod/settings.php:756
msgid "Password Settings"
msgstr "إعدادات كلمة المرور"
#: mod/settings.php:757 src/Module/Register.php:162
msgid "New Password:"
msgstr "كلمة المرور الجديدة:"
#: mod/settings.php:757
msgid ""
"Allowed characters are a-z, A-Z, 0-9 and special characters except white "
"spaces, accentuated letters and colon (:)."
msgstr "المحارف المسموح بها هي a-z، A-Z، 0-9 والأحرف الخاصة باستثناء المساحات، الأحرف المنبورة ونقطتي التفسير (:)."
#: mod/settings.php:758 src/Module/Register.php:163
msgid "Confirm:"
msgstr "التأكيد:"
#: mod/settings.php:758
msgid "Leave password fields blank unless changing"
msgstr "اترك حقول كلمة المرور فارغة ما لم ترد تغييرها"
#: mod/settings.php:759
msgid "Current Password:"
msgstr "كلمة المرور الحالية:"
#: mod/settings.php:759
msgid "Your current password to confirm the changes"
msgstr "اكتب كلمة المرور الحالية لتأكيد التغييرات"
#: mod/settings.php:760
msgid "Password:"
msgstr "كلمة المرور:"
#: mod/settings.php:760
msgid "Your current password to confirm the changes of the email address"
msgstr "اكتب كلمة المرور الحالية لتأكيد تغيير بريدك الإلكتروني"
#: mod/settings.php:763
msgid "Delete OpenID URL"
msgstr "احذف معرف OpenID"
#: mod/settings.php:765
msgid "Basic Settings"
msgstr "الإعدادات الأساسيّة"
#: mod/settings.php:766 src/Module/Profile/Profile.php:144
msgid "Full Name:"
msgstr "الاسم الكامل:"
#: mod/settings.php:767
msgid "Email Address:"
msgstr "البريد الإلكتروني:"
#: mod/settings.php:768
msgid "Your Timezone:"
msgstr "المنطقة الزمنية:"
#: mod/settings.php:769
msgid "Your Language:"
msgstr "لغتك:"
#: mod/settings.php:769
msgid ""
"Set the language we use to show you friendica interface and to send you "
"emails"
msgstr "عيّن لغة واجهة فرَندِيكا ورسائل البريد الإلكتروني"
#: mod/settings.php:770
msgid "Default Post Location:"
msgstr "موقع النشر الافتراضي:"
#: mod/settings.php:771
msgid "Use Browser Location:"
msgstr "استخدم موقع المتصفح:"
#: mod/settings.php:773
msgid "Security and Privacy Settings"
msgstr "إعدادات الأمان والخصوصية"
#: mod/settings.php:775
msgid "Maximum Friend Requests/Day:"
msgstr "حدُ طلبات الصداقة لليوم الواحد:"
#: mod/settings.php:775 mod/settings.php:785
msgid "(to prevent spam abuse)"
msgstr "(لمنع الرسائل المزعجة)"
#: mod/settings.php:777
msgid "Allow your profile to be searchable globally?"
msgstr "أتريد السماح لملفك الشخصي بالظهور في نتائج البحث العالمي؟"
#: mod/settings.php:777
msgid ""
"Activate this setting if you want others to easily find and follow you. Your"
" profile will be searchable on remote systems. This setting also determines "
"whether Friendica will inform search engines that your profile should be "
"indexed or not."
msgstr "فعّل هذا الإعداد إن أردت أن يُعثر عليك بسهولة. سيتمكن المستخدمون في المواقع البعيد من العثور عليك، وأيضا سيسمح بظهور ملفك الشخصي في محركات البحث."
#: mod/settings.php:778
msgid "Hide your contact/friend list from viewers of your profile?"
msgstr "أتريد إخفاء قائمة المتراسلين/الأصدقاء عن متصفحي ملفك الشخصي؟"
#: mod/settings.php:778
msgid ""
"A list of your contacts is displayed on your profile page. Activate this "
"option to disable the display of your contact list."
msgstr "عادة تُعرض قائمة المتراسلين على صفحة ملفك الشخصي. إن قمت بتفعيل هذا الخيار ستخفى القائمة."
#: mod/settings.php:779
msgid "Hide your profile details from anonymous viewers?"
msgstr "اخف معلومات ملفك الشخص عن المتصفحين المجهولين؟"
#: mod/settings.php:779
msgid ""
"Anonymous visitors will only see your profile picture, your display name and"
" the nickname you are using on your profile page. Your public posts and "
"replies will still be accessible by other means."
msgstr "سيرى الزوار المجهولون صورة ملفك الشخصي واسمك العلني ولقبك فقط. لكن ستبقى مشاركتك العامة وردودك متاحة عبر وسائل أخرى."
#: mod/settings.php:780
msgid "Make public posts unlisted"
msgstr "لا تدرج المشاركات العلنية"
#: mod/settings.php:780
msgid ""
"Your public posts will not appear on the community pages or in search "
"results, nor be sent to relay servers. However they can still appear on "
"public feeds on remote servers."
msgstr "لن تظهر مشاركتك العلنية على صفحات المجتمع أو في نتائج البحث لهذا الموقع، ولن يتم إرسالها إلى خوادم الترحيل. غير أنها ستبقى تظهر في التغذيات العمومية للخوادم البعيدة."
#: mod/settings.php:781
msgid "Make all posted pictures accessible"
msgstr "أتح كل الصور المنشورة"
#: mod/settings.php:781
msgid ""
"This option makes every posted picture accessible via the direct link. This "
"is a workaround for the problem that most other networks can't handle "
"permissions on pictures. Non public pictures still won't be visible for the "
"public on your photo albums though."
msgstr "يسمح هذا الخيار بالوصول للصورة المنشورة عبر رابط مباشر. هذا حل لمعظم الشبكات التي لا يمكنها التعامل مع الأذونات. صورك غير العلنية ستبقى مخفية."
#: mod/settings.php:782
msgid "Allow friends to post to your profile page?"
msgstr "أتسمح لأصدقائك بالنشر في صفحة ملفك الشخصي؟"
#: mod/settings.php:782
msgid ""
"Your contacts may write posts on your profile wall. These posts will be "
"distributed to your contacts"
msgstr "يمكن للمتراسلين كتابة مشاركات على حائط ملفك الشخصي. ستكون هذه المشركات مرئية لكل المتراسلين"
#: mod/settings.php:783
msgid "Allow friends to tag your posts?"
msgstr "أتسمح لأصدقائك بوسم مشاركاتك؟"
#: mod/settings.php:783
msgid "Your contacts can add additional tags to your posts."
msgstr "يمكن لأصدقائك إضافة وسوم لمشاركاتك."
#: mod/settings.php:784
msgid "Permit unknown people to send you private mail?"
msgstr "أتسمح لأشخاص مجهولين بإرسال بريد خاص لك؟"
#: mod/settings.php:784
msgid ""
"Friendica network users may send you private messages even if they are not "
"in your contact list."
msgstr "يمكن لمستخدمي شبكة فرَندِكا إرسال رسائل خاصة لك حتى إن لم يكونوا في قائمة المتراسلين."
#: mod/settings.php:785
msgid "Maximum private messages per day from unknown people:"
msgstr "حد الرسائل اليومي المستلمة من مجهولين:"
#: mod/settings.php:787
msgid "Default Post Permissions"
msgstr "أذونات النشر الافتراضية"
#: mod/settings.php:791
msgid "Expiration settings"
msgstr "إعدادات انتهاء الصلاحية"
#: mod/settings.php:792
msgid "Automatically expire posts after this many days:"
msgstr "أنه صَلاحِيَة المشاركات تلقائياً بعد هذا العدد من الأيام:"
#: mod/settings.php:792
msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr "إذا كان فارغاً، لن تنتهي صلاحية المشاركات. وإلا بعد المهلة ستحذف المشاركات المنتهية صلاحيتها"
#: mod/settings.php:793
msgid "Expire posts"
msgstr "أنه صَلاحِيَة المشاركات"
#: mod/settings.php:793
msgid "When activated, posts and comments will be expired."
msgstr "عند تفعيله، ستنهى صلاحية المشاركات والتعليقات."
#: mod/settings.php:794
msgid "Expire personal notes"
msgstr "أنه صَلاحِيَة الملاحظات الشخصية"
#: mod/settings.php:794
msgid ""
"When activated, the personal notes on your profile page will be expired."
msgstr "عند تفعيله، ستنهى صلاحية الملاحظات الشخصية على صفحة ملفك الشخصي."
#: mod/settings.php:795
msgid "Expire starred posts"
msgstr "أنتهي صلاحية المشاركات المفضلة"
#: mod/settings.php:795
msgid ""
"Starring posts keeps them from being expired. That behaviour is overwritten "
"by this setting."
msgstr "تفضيل مشاركة تقيها من انتهاء الصلاحية. هذا السلوك يُتجاوز من خلال هذا الإعداد."
#: mod/settings.php:796
msgid "Expire photos"
msgstr "أنه صَلاحِيَة الصور"
#: mod/settings.php:796
msgid "When activated, photos will be expired."
msgstr "عند تفعيله، ستنهى صلاحية الصور."
#: mod/settings.php:797
msgid "Only expire posts by others"
msgstr "أنه صَلاحِيَة مشاركات الآخرين فقط"
#: mod/settings.php:797
msgid ""
"When activated, your own posts never expire. Then the settings above are "
"only valid for posts you received."
msgstr "عند تفعيله، لا نهاية لصلاحية مشاركاتك. ثم تكون الإعدادات أعلاه صالحة فقط للمشاركات التي استلمتها."
#: mod/settings.php:800
msgid "Notification Settings"
msgstr "إعدادات التنبيهات"
#: mod/settings.php:801
msgid "Send a notification email when:"
msgstr "أرسل تنبيها للبريدي الإلكتروني عند:"
#: mod/settings.php:802
msgid "You receive an introduction"
msgstr "تلقي تقديم"
#: mod/settings.php:803
msgid "Your introductions are confirmed"
msgstr "أُكدت تقديماتك"
#: mod/settings.php:804
msgid "Someone writes on your profile wall"
msgstr "يكتب شخص ما على جدار ملفك الشخصي"
#: mod/settings.php:805
msgid "Someone writes a followup comment"
msgstr "شخص ما يعلق على ما نشرت"
#: mod/settings.php:806
msgid "You receive a private message"
msgstr "تلقي رسالة خاصة"
#: mod/settings.php:807
msgid "You receive a friend suggestion"
msgstr "تلقي اقتراح صداقة"
#: mod/settings.php:808
msgid "You are tagged in a post"
msgstr "ذُكرتَ في مشاركة"
#: mod/settings.php:809
msgid "You are poked/prodded/etc. in a post"
msgstr ""
#: mod/settings.php:811
msgid "Create a desktop notification when:"
msgstr "أنشئ تنبيه سطح المكتب عند:"
#: mod/settings.php:812
msgid "Someone liked your content"
msgstr "أُعجب شخص بمحتواك"
#: mod/settings.php:813
msgid "Someone shared your content"
msgstr "شارك شخص محتواك"
#: mod/settings.php:815
msgid "Activate desktop notifications"
msgstr "نشّط تنبيهات سطح المكتب"
#: mod/settings.php:815
msgid "Show desktop popup on new notifications"
msgstr "أظهر منبثقات للتنبيهات الجديدة"
#: mod/settings.php:817
msgid "Text-only notification emails"
msgstr "رسائل تنبيه نصية فقط"
#: mod/settings.php:819
msgid "Send text only notification emails, without the html part"
msgstr "أرسل بريد التنبيه كنص فقط، دون وسوم html"
#: mod/settings.php:821
msgid "Show detailled notifications"
msgstr "اعرض تنبيهات مفصلة"
#: mod/settings.php:823
msgid ""
"Per default, notifications are condensed to a single notification per item. "
"When enabled every notification is displayed."
msgstr "افتراضيًا ، يعرض أحدث تنبيه فقط لكل محادثة. عند تفعيله ستعرض جميع التنبيهات."
#: mod/settings.php:825
msgid "Show notifications of ignored contacts"
msgstr "أظهر تنبيهات للمتراسلين المتجاهلين"
#: mod/settings.php:827
msgid ""
"You don't see posts from ignored contacts. But you still see their comments."
" This setting controls if you want to still receive regular notifications "
"that are caused by ignored contacts or not."
msgstr "أنت لا ترى مشاركات المتراسلين المتجاهلين. لكن لا يزال بإمكانك رؤية تعليقاتهم. هذا الإعداد يتحكم إذا كنت ترغب في الاستمرار في تلقي تنبيهات سببها المتراسلون المتجاهلون."
#: mod/settings.php:829
msgid "Advanced Account/Page Type Settings"
msgstr "الإعدادات المتقدمة للحساب/للصفحة"
#: mod/settings.php:830
msgid "Change the behaviour of this account for special situations"
msgstr "غيّر سلوك هذا الحساب للحالات الخاصة"
#: mod/settings.php:833
msgid "Import Contacts"
msgstr "استيراد متراسلين"
#: mod/settings.php:834
msgid ""
"Upload a CSV file that contains the handle of your followed accounts in the "
"first column you exported from the old account."
msgstr "ارفع ملف CSV معرفات المتراسلين لحسابك القديم، معرفات المتابَعين تكون في العمود الأول."
#: mod/settings.php:835
msgid "Upload File"
msgstr "ارفع ملفًا"
#: mod/settings.php:837
msgid "Relocate"
msgstr "الانتقال"
#: mod/settings.php:838
msgid ""
"If you have moved this profile from another server, and some of your "
"contacts don't receive your updates, try pushing this button."
msgstr "إذا كنت قد نقلت هذا الملف الشخصي من خادم آخر، وبعض المتراسلين لا يتلقون تحديثاتك، أنقر هذا الزر."
#: mod/settings.php:839
msgid "Resend relocate message to contacts"
msgstr "أعد إرسال رسالة الانتقال للمتراسلين"
#: mod/suggest.php:44
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "لا توجد اقتراحات متاحة. إذا كان هذا الموقع جديد، من فضلك أعد المحاولة في غضون 24 ساعة."
#: mod/suggest.php:55 src/Content/Widget.php:79 view/theme/vier/theme.php:175
#: mod/suggest.php:55 src/Content/Widget.php:81 view/theme/vier/theme.php:175
msgid "Friend Suggestions"
msgstr "اقتراحات الأصدقاء"
#: mod/tagger.php:78 src/Content/Item.php:335 src/Model/Item.php:2670
#: mod/tagger.php:78 src/Content/Item.php:342 src/Model/Item.php:2699
msgid "photo"
msgstr "صورة"
#: mod/tagger.php:78 src/Content/Item.php:330 src/Content/Item.php:339
#: mod/tagger.php:78 src/Content/Item.php:337 src/Content/Item.php:346
msgid "status"
msgstr "حالة"
#: mod/tagger.php:111 src/Content/Item.php:349
#: mod/tagger.php:111 src/Content/Item.php:356
#, php-format
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr "%1$s وسم %3$s %2$s بـ %4$s"
@ -2073,30 +1515,30 @@ msgstr "نجح إلغاء متابعة المتراسل"
msgid "Unable to unfollow this contact, please contact your administrator"
msgstr "يتعذر إلغاء متابعة هذا المتراسل، يرجى الاتصال بمدير الموقع"
#: mod/wall_attach.php:39 mod/wall_attach.php:46 mod/wall_attach.php:77
#: mod/wall_upload.php:53 mod/wall_upload.php:63 mod/wall_upload.php:99
#: mod/wall_upload.php:150 mod/wall_upload.php:153
#: mod/wall_attach.php:40 mod/wall_attach.php:46 mod/wall_attach.php:75
#: mod/wall_upload.php:54 mod/wall_upload.php:63 mod/wall_upload.php:97
#: mod/wall_upload.php:148 mod/wall_upload.php:150
msgid "Invalid request."
msgstr "طلب غير صالح."
#: mod/wall_attach.php:95
#: mod/wall_attach.php:93
msgid "Sorry, maybe your upload is bigger than the PHP configuration allows"
msgstr "عذراً، ربّما يكون الرفع أكبر من ما يسمح به ضبط PHP"
#: mod/wall_attach.php:95
#: mod/wall_attach.php:93
msgid "Or - did you try to upload an empty file?"
msgstr "أو - هل حاولت تحميل ملف فارغ؟"
#: mod/wall_attach.php:106
#: mod/wall_attach.php:104
#, php-format
msgid "File exceeds size limit of %s"
msgstr "تجاوز الملف الحد الأقصى للحجم وهو %s"
#: mod/wall_attach.php:121
#: mod/wall_attach.php:119
msgid "File upload failed."
msgstr "فشل رفع الملف."
#: mod/wall_upload.php:221 src/Model/Photo.php:1049
#: mod/wall_upload.php:218 src/Model/Photo.php:1061
msgid "Wall Photos"
msgstr "صور الحائط"
@ -2124,21 +1566,21 @@ msgstr "إذا أردت تلقي رد من %s. تحقق أن إعدادات ال
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:250
#: src/App/Page.php:276
msgid "Delete this item?"
msgstr "أتريد حذف العنصر؟"
#: src/App/Page.php:251
#: 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:321
#: src/App/Page.php:347
msgid "toggle mobile"
msgstr "بدّل واجهة الهاتف"
@ -2147,7 +1589,7 @@ msgstr "بدّل واجهة الهاتف"
msgid "Method not allowed for this module. Allowed method(s): %s"
msgstr "هذه الطريقة غير مسموح بها لهذه الوحدة. الطرق المسموح بها: %s"
#: 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 "لم يُعثر على الصفحة."
@ -2165,18 +1607,18 @@ msgstr "رمز الأمان للنموذج غير صحيح. ربما لأن ال
msgid "All contacts"
msgstr "كل المتراسلين"
#: src/BaseModule.php:409 src/Content/Widget.php:231 src/Core/ACL.php:194
#: src/Module/Contact.php:367 src/Module/PermissionTooltip.php:106
#: src/Module/PermissionTooltip.php:128
#: src/BaseModule.php:409 src/Content/Widget.php:233 src/Core/ACL.php:194
#: src/Module/Contact.php:367 src/Module/PermissionTooltip.php:122
#: src/Module/PermissionTooltip.php:144
msgid "Followers"
msgstr "متابِعون"
#: src/BaseModule.php:414 src/Content/Widget.php:232
#: src/BaseModule.php:414 src/Content/Widget.php:234
#: src/Module/Contact.php:368
msgid "Following"
msgstr "متابَعون"
#: src/BaseModule.php:419 src/Content/Widget.php:233
#: src/BaseModule.php:419 src/Content/Widget.php:235
#: src/Module/Contact.php:369
msgid "Mutual friends"
msgstr "أصدقاء مشتركون"
@ -2217,6 +1659,95 @@ msgstr "تعذر العثور على متراسل يقود اليه هذا ال
msgid "The contact has been blocked from the node"
msgstr "حُجب المتراسل من هذه العقدة"
#: src/Console/MergeContacts.php:74
#, php-format
msgid "%d %s, %d duplicates."
msgstr ""
#: src/Console/MergeContacts.php:77
#, php-format
msgid "uri-id is empty for contact %s."
msgstr ""
#: src/Console/MergeContacts.php:90
#, php-format
msgid "No valid first countact found for uri-id %d."
msgstr ""
#: src/Console/MergeContacts.php:101
#, php-format
msgid "Wrong duplicate found for uri-id %d in %d (url: %s != %s)."
msgstr ""
#: src/Console/MergeContacts.php:105
#, php-format
msgid "Wrong duplicate found for uri-id %d in %d (nurl: %s != %s)."
msgstr ""
#: src/Console/MergeContacts.php:141
#, php-format
msgid "Deletion of id %d failed"
msgstr ""
#: src/Console/MergeContacts.php:143
#, php-format
msgid "Deletion of id %d was successful"
msgstr ""
#: src/Console/MergeContacts.php:149
#, php-format
msgid "Updating \"%s\" in \"%s\" from %d to %d"
msgstr ""
#: src/Console/MergeContacts.php:151
msgid " - found"
msgstr ""
#: src/Console/MergeContacts.php:158
msgid " - failed"
msgstr ""
#: src/Console/MergeContacts.php:160
msgid " - success"
msgstr ""
#: src/Console/MergeContacts.php:164
msgid " - deleted"
msgstr ""
#: src/Console/MergeContacts.php:167
msgid " - done"
msgstr ""
#: src/Console/MoveToAvatarCache.php:91
msgid "The avatar cache needs to be enabled to use this command."
msgstr ""
#: src/Console/MoveToAvatarCache.php:109
#, php-format
msgid "no resource in photo %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:137
#, php-format
msgid "no photo with id %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:146
#, php-format
msgid "no image data for photo with id %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:155
#, php-format
msgid "invalid image for id %s"
msgstr ""
#: src/Console/MoveToAvatarCache.php:168
#, 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."
@ -2246,6 +1777,14 @@ msgstr "أدخل لقب المستخدم: "
msgid "Enter new password: "
msgstr "أدخل كلمة مرور جديدة: "
#: src/Console/User.php:210 src/Module/Settings/Account.php:74
msgid "Password update failed. Please try again."
msgstr "فشل تحديث كلمة المرور. من فضلك أعد المحاولة."
#: src/Console/User.php:213 src/Module/Settings/Account.php:77
msgid "Password changed."
msgstr "غُيّرت كلمة المرور."
#: src/Console/User.php:237
msgid "Enter user name: "
msgstr "أدخل اسم المستخدم: "
@ -2421,7 +1960,7 @@ msgid "%s attends maybe."
msgstr "قد يحضره %s."
#: src/Content/Conversation.php:222 src/Content/Conversation.php:260
#: src/Content/Conversation.php:849
#: src/Content/Conversation.php:872
#, php-format
msgid "%s reshared this."
msgstr "أعاد %s نشره."
@ -2494,8 +2033,8 @@ msgstr "أعاد نشره <span %1$s>%2$d شخص</span>"
msgid "Visible to <strong>everybody</strong>"
msgstr "مرئي <strong>للجميع</strong>"
#: src/Content/Conversation.php:308 src/Module/Item/Compose.php:159
#: src/Object/Post.php:991
#: src/Content/Conversation.php:308 src/Module/Item/Compose.php:171
#: src/Object/Post.php:998
msgid "Please enter a image/video/audio/webpage URL:"
msgstr "رجاء أدخل رابط صورة/فيديو/صوت/صفحة ويب:"
@ -2515,109 +2054,117 @@ msgstr "أين أنت حاليا؟"
msgid "Delete item(s)?"
msgstr "أتريد حذف العناصر؟"
#: src/Content/Conversation.php:322
#: src/Content/Conversation.php:324 src/Module/Item/Compose.php:143
msgid "Created at"
msgstr ""
#: src/Content/Conversation.php:334
msgid "New Post"
msgstr "مشاركة جديدة"
#: src/Content/Conversation.php:325 src/Object/Post.php:497
#: src/Content/Conversation.php:337
msgid "Share"
msgstr "شارك"
#: src/Content/Conversation.php:336 src/Module/Item/Compose.php:156
#: src/Object/Post.php:988
#: src/Content/Conversation.php:348 src/Module/Item/Compose.php:168
#: src/Object/Post.php:995
msgid "Image"
msgstr "صورة"
#: src/Content/Conversation.php:339
#: src/Content/Conversation.php:351
msgid "Video"
msgstr "فيديو"
#: src/Content/Conversation.php:352 src/Module/Item/Compose.php:172
#: src/Content/Conversation.php:364 src/Module/Item/Compose.php:184
msgid "Scheduled at"
msgstr "بُرمِج في"
#: src/Content/Conversation.php:651 src/Object/Post.php:468
#: src/Object/Post.php:469
#: src/Content/Conversation.php:656 src/Object/Post.php:235
msgid "Pinned item"
msgstr "عنصر مثبت"
#: src/Content/Conversation.php:672 src/Object/Post.php:476
#: src/Object/Post.php:477
#, php-format
msgid "View %s's profile @ %s"
msgstr "اعرض ملف %s الشخصي @ %s"
#: src/Content/Conversation.php:664 src/Object/Post.php:456
#: src/Content/Conversation.php:685 src/Object/Post.php:464
msgid "Categories:"
msgstr "الفئات:"
#: src/Content/Conversation.php:665 src/Object/Post.php:457
#: src/Content/Conversation.php:686 src/Object/Post.php:465
msgid "Filed under:"
msgstr "مصنف كـ:"
#: src/Content/Conversation.php:673 src/Object/Post.php:482
#: src/Content/Conversation.php:694 src/Object/Post.php:490
#, php-format
msgid "%s from %s"
msgstr "%s من %s"
#: src/Content/Conversation.php:688
#: src/Content/Conversation.php:710
msgid "View in context"
msgstr "اعرضه في السياق"
#: src/Content/Conversation.php:753
#: src/Content/Conversation.php:775
msgid "remove"
msgstr "أزل"
#: src/Content/Conversation.php:757
#: src/Content/Conversation.php:779
msgid "Delete Selected Items"
msgstr "أزل العناصر المختارة"
#: src/Content/Conversation.php:821 src/Content/Conversation.php:824
#: src/Content/Conversation.php:827 src/Content/Conversation.php:830
#: src/Content/Conversation.php:844 src/Content/Conversation.php:847
#: src/Content/Conversation.php:850 src/Content/Conversation.php:853
#, php-format
msgid "You had been addressed (%s)."
msgstr "ذُكرت (%s)."
#: src/Content/Conversation.php:833
#: src/Content/Conversation.php:856
#, php-format
msgid "You are following %s."
msgstr "تتابع %s."
#: src/Content/Conversation.php:836
#: src/Content/Conversation.php:859
msgid "Tagged"
msgstr "موسوم"
#: src/Content/Conversation.php:851
#: src/Content/Conversation.php:874
msgid "Reshared"
msgstr "أُعيد نشره"
#: src/Content/Conversation.php:851
#: src/Content/Conversation.php:874
#, php-format
msgid "Reshared by %s <%s>"
msgstr "أعاد نشره %s <%s>"
#: src/Content/Conversation.php:854
#: src/Content/Conversation.php:877
#, php-format
msgid "%s is participating in this thread."
msgstr "%s مشترك في هذا النقاش."
#: src/Content/Conversation.php:857
#: src/Content/Conversation.php:880
msgid "Stored"
msgstr "مُخزن"
#: src/Content/Conversation.php:860
#: src/Content/Conversation.php:883
msgid "Global"
msgstr "عالمي"
#: src/Content/Conversation.php:863
#: src/Content/Conversation.php:886
msgid "Relayed"
msgstr "منقول"
#: src/Content/Conversation.php:863
#: src/Content/Conversation.php:886
#, php-format
msgid "Relayed by %s <%s>"
msgstr "نقله %s <%s>"
#: src/Content/Conversation.php:866
#: src/Content/Conversation.php:889
msgid "Fetched"
msgstr "جُلب"
#: src/Content/Conversation.php:866
#: src/Content/Conversation.php:889
#, php-format
msgid "Fetched because of %s <%s>"
msgstr "جُلب بسبب %s <%s>"
@ -2669,126 +2216,137 @@ msgid ""
"mentioned in replies."
msgstr "يضيف الذِكر الصريح في صندوق التعليق مما يسمح بالتحكم اليدوي بالذِكر في التعليقات."
#: src/Content/Feature.php:111
#: src/Content/Feature.php:107
msgid "Add an abstract from ActivityPub content warnings"
msgstr ""
#: src/Content/Feature.php:107
msgid ""
"Add an abstract when commenting on ActivityPub posts with a content warning."
" Abstracts are displayed as content warning on systems like Mastodon or "
"Pleroma."
msgstr ""
#: src/Content/Feature.php:112
msgid "Post/Comment Tools"
msgstr "أدوات النشر\\التعليق"
#: src/Content/Feature.php:112
#: src/Content/Feature.php:113
msgid "Post Categories"
msgstr "فئات المشاركة"
#: src/Content/Feature.php:112
#: src/Content/Feature.php:113
msgid "Add categories to your posts"
msgstr "أضف فئات لمشاركاتك"
#: src/Content/Feature.php:117
#: src/Content/Feature.php:118
msgid "Advanced Profile Settings"
msgstr "إعدادات الحساب الشخصي المُتقدّمة"
#: src/Content/Feature.php:118
#: src/Content/Feature.php:119
msgid "List Forums"
msgstr "اسرد المنتديات"
#: src/Content/Feature.php:118
#: src/Content/Feature.php:119
msgid "Show visitors public community forums at the Advanced Profile Page"
msgstr "إظهار منتديات المجتمعية للزوار على صفحة الملف الشخصي المتقدمة"
#: src/Content/Feature.php:119
#: src/Content/Feature.php:120
msgid "Tag Cloud"
msgstr "سحابة الوسوم"
#: src/Content/Feature.php:119
#: src/Content/Feature.php:120
msgid "Provide a personal tag cloud on your profile page"
msgstr "إظهار سحابة وسوم في صفحة ملفك الشخصي"
#: src/Content/Feature.php:120
#: src/Content/Feature.php:121
msgid "Display Membership Date"
msgstr "اعرض عُمر العضوية"
#: src/Content/Feature.php:120
#: src/Content/Feature.php:121
msgid "Display membership date in profile"
msgstr "اعرض عُمر العضوية في الملف الشخصي"
#: src/Content/ForumManager.php:145 src/Content/Nav.php:239
#: src/Content/Text/HTML.php:896 src/Content/Widget.php:520
#: src/Content/ForumManager.php:151 src/Content/Nav.php:239
#: src/Content/Text/HTML.php:896 src/Content/Widget.php:522
msgid "Forums"
msgstr "المنتديات"
#: src/Content/ForumManager.php:147
#: src/Content/ForumManager.php:153
msgid "External link to forum"
msgstr "رابط خارجي للمنتدى"
#: src/Content/ForumManager.php:150 src/Content/Widget.php:499
#: src/Content/ForumManager.php:156 src/Content/Widget.php:501
msgid "show less"
msgstr "اعرض أقلّ"
#: src/Content/ForumManager.php:151 src/Content/Widget.php:401
#: src/Content/Widget.php:500
#: src/Content/ForumManager.php:157 src/Content/Widget.php:403
#: src/Content/Widget.php:502
msgid "show more"
msgstr "اعرض المزيد"
#: src/Content/Item.php:294
#: src/Content/Item.php:301
#, php-format
msgid "%1$s poked %2$s"
msgstr "%1$s لكز%2$s"
#: src/Content/Item.php:327 src/Model/Item.php:2668
#: src/Content/Item.php:334 src/Model/Item.php:2697
msgid "event"
msgstr "حدث"
#: src/Content/Item.php:431 view/theme/frio/theme.php:254
#: src/Content/Item.php:422 view/theme/frio/theme.php:254
msgid "Follow Thread"
msgstr "تابع المناقشة"
#: src/Content/Item.php:432 src/Model/Contact.php:1088
#: src/Content/Item.php:423 src/Model/Contact.php:1107
msgid "View Status"
msgstr "اعرض الحالة"
#: src/Content/Item.php:433 src/Content/Item.php:455
#: src/Model/Contact.php:1022 src/Model/Contact.php:1080
#: src/Model/Contact.php:1089 src/Module/Directory.php:157
#: src/Content/Item.php:424 src/Content/Item.php:446
#: src/Model/Contact.php:1041 src/Model/Contact.php:1099
#: src/Model/Contact.php:1108 src/Module/Directory.php:158
#: src/Module/Settings/Profile/Index.php:225
msgid "View Profile"
msgstr "اعرض الملف الشخصي"
#: src/Content/Item.php:434 src/Model/Contact.php:1090
#: src/Content/Item.php:425 src/Model/Contact.php:1109
msgid "View Photos"
msgstr "اعرض الصور"
#: src/Content/Item.php:435 src/Model/Contact.php:1081
#: src/Model/Contact.php:1091
#: src/Content/Item.php:426 src/Model/Contact.php:1100
#: src/Model/Contact.php:1110
msgid "Network Posts"
msgstr "مشاركات الشبكة"
#: src/Content/Item.php:436 src/Model/Contact.php:1082
#: src/Model/Contact.php:1092
#: src/Content/Item.php:427 src/Model/Contact.php:1101
#: src/Model/Contact.php:1111
msgid "View Contact"
msgstr "اعرض المتراسل"
#: src/Content/Item.php:437 src/Model/Contact.php:1093
#: src/Content/Item.php:428 src/Model/Contact.php:1112
msgid "Send PM"
msgstr "أرسل رسالة خاصة"
#: src/Content/Item.php:438 src/Module/Admin/Blocklist/Contact.php:100
#: src/Content/Item.php:429 src/Module/Admin/Blocklist/Contact.php:100
#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154
#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:348
#: src/Module/Contact/Profile.php:449
msgid "Block"
msgstr "احجب"
#: src/Content/Item.php:439 src/Module/Contact.php:399
#: src/Content/Item.php:430 src/Module/Contact.php:399
#: src/Module/Contact/Profile.php:349 src/Module/Contact/Profile.php:457
#: src/Module/Notifications/Introductions.php:132
#: src/Module/Notifications/Introductions.php:204
#: src/Module/Notifications/Notification.php:61
#: src/Module/Notifications/Notification.php:88
msgid "Ignore"
msgstr "تجاهل"
#: src/Content/Item.php:443 src/Object/Post.php:443
#: src/Content/Item.php:434 src/Object/Post.php:445
msgid "Languages"
msgstr "اللغات"
#: src/Content/Item.php:447 src/Model/Contact.php:1094
#: src/Content/Item.php:438 src/Model/Contact.php:1113
msgid "Poke"
msgstr "ألكز"
@ -2907,7 +2465,7 @@ msgid "Addon applications, utilities, games"
msgstr "إضافات، أدوات، ألعاب"
#: src/Content/Nav.php:230 src/Content/Text/HTML.php:881
#: src/Module/Admin/Logs/View.php:86 src/Module/Search/Index.php:96
#: src/Module/Admin/Logs/View.php:87 src/Module/Search/Index.php:97
msgid "Search"
msgstr "ابحث"
@ -3049,11 +2607,11 @@ msgstr "تصفح"
msgid "Site map"
msgstr "خريطة الموقع"
#: src/Content/OEmbed.php:298
#: src/Content/OEmbed.php:299
msgid "Embedding disabled"
msgstr "التضمين معطل"
#: src/Content/OEmbed.php:416
#: src/Content/OEmbed.php:417
msgid "Embedded content"
msgstr "محتوى مضمن"
@ -3073,38 +2631,38 @@ msgstr "التالي"
msgid "last"
msgstr "الأخير"
#: src/Content/Text/BBCode.php:987 src/Content/Text/BBCode.php:1781
#: src/Content/Text/BBCode.php:1782
#: src/Content/Text/BBCode.php:990 src/Content/Text/BBCode.php:1784
#: src/Content/Text/BBCode.php:1785
msgid "Image/photo"
msgstr "صورة"
#: src/Content/Text/BBCode.php:1160
#: src/Content/Text/BBCode.php:1163
#, php-format
msgid "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr "<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
#: src/Content/Text/BBCode.php:1185 src/Model/Item.php:3199
#: src/Model/Item.php:3205 src/Model/Item.php:3206
#: 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 "رابط المصدر"
#: src/Content/Text/BBCode.php:1699 src/Content/Text/HTML.php:933
#: src/Content/Text/BBCode.php:1702 src/Content/Text/HTML.php:933
msgid "Click to open/close"
msgstr "أنقر للفتح/للإغلاق"
#: src/Content/Text/BBCode.php:1730
#: src/Content/Text/BBCode.php:1733
msgid "$1 wrote:"
msgstr "كتب $1:"
#: src/Content/Text/BBCode.php:1786 src/Content/Text/BBCode.php:1787
#: src/Content/Text/BBCode.php:1789 src/Content/Text/BBCode.php:1790
msgid "Encrypted content"
msgstr "محتوى مشفر"
#: src/Content/Text/BBCode.php:2002
#: src/Content/Text/BBCode.php:2008
msgid "Invalid source protocol"
msgstr "ميفاق المصدر غير صالح"
#: src/Content/Text/BBCode.php:2017
#: src/Content/Text/BBCode.php:2023
msgid "Invalid link protocol"
msgstr "ميفاق الرابط غير صالح"
@ -3116,28 +2674,28 @@ msgstr "يحمل مزيدًا من المدخلات..."
msgid "The end"
msgstr "النهاية"
#: src/Content/Text/HTML.php:875 src/Content/Widget/VCard.php:103
#: src/Model/Profile.php:454
#: src/Content/Text/HTML.php:875 src/Content/Widget/VCard.php:109
#: src/Model/Profile.php:456
msgid "Follow"
msgstr "تابع"
#: src/Content/Widget.php:49
#: src/Content/Widget.php:51
msgid "Add New Contact"
msgstr "أضف متراسلًا جديدًا"
#: src/Content/Widget.php:50
#: src/Content/Widget.php:52
msgid "Enter address or web location"
msgstr "أدخل العنوان أو الرابط"
#: src/Content/Widget.php:51
#: src/Content/Widget.php:53
msgid "Example: bob@example.com, http://example.com/barbara"
msgstr "مثل: bob@example.com, http://example.com/barbara"
#: src/Content/Widget.php:53
#: src/Content/Widget.php:55
msgid "Connect"
msgstr "اتصل"
#: src/Content/Widget.php:68
#: src/Content/Widget.php:70
#, php-format
msgid "%d invitation available"
msgid_plural "%d invitations available"
@ -3148,83 +2706,83 @@ msgstr[3] "%d دعوات متاحة"
msgstr[4] "%d دعوة متاحة"
msgstr[5] "%d دعوة متاحة"
#: src/Content/Widget.php:74 view/theme/vier/theme.php:170
#: src/Content/Widget.php:76 view/theme/vier/theme.php:170
msgid "Find People"
msgstr "ابحث عن أشخاص"
#: src/Content/Widget.php:75 view/theme/vier/theme.php:171
#: src/Content/Widget.php:77 view/theme/vier/theme.php:171
msgid "Enter name or interest"
msgstr "أدخل اسما أو اهتماما"
#: src/Content/Widget.php:77 view/theme/vier/theme.php:173
#: src/Content/Widget.php:79 view/theme/vier/theme.php:173
msgid "Examples: Robert Morgenstein, Fishing"
msgstr "مثال: أحمد علي، الصيد"
#: src/Content/Widget.php:78 src/Module/Contact.php:391
#: src/Module/Directory.php:96 view/theme/vier/theme.php:174
#: src/Content/Widget.php:80 src/Module/Contact.php:391
#: src/Module/Directory.php:97 view/theme/vier/theme.php:174
msgid "Find"
msgstr "ابحث"
#: src/Content/Widget.php:80 view/theme/vier/theme.php:176
#: src/Content/Widget.php:82 view/theme/vier/theme.php:176
msgid "Similar Interests"
msgstr "اهتمامات مشتركة"
#: src/Content/Widget.php:81 view/theme/vier/theme.php:177
#: src/Content/Widget.php:83 view/theme/vier/theme.php:177
msgid "Random Profile"
msgstr "ملف شخصي عشوائي"
#: src/Content/Widget.php:82 view/theme/vier/theme.php:178
#: src/Content/Widget.php:84 view/theme/vier/theme.php:178
msgid "Invite Friends"
msgstr "دعوة أصدقاء"
#: src/Content/Widget.php:83 src/Module/Directory.php:88
#: src/Content/Widget.php:85 src/Module/Directory.php:89
#: view/theme/vier/theme.php:179
msgid "Global Directory"
msgstr "الدليل العالمي"
#: src/Content/Widget.php:85 view/theme/vier/theme.php:181
#: src/Content/Widget.php:87 view/theme/vier/theme.php:181
msgid "Local Directory"
msgstr "الدليل المحلي"
#: src/Content/Widget.php:207 src/Model/Group.php:570
#: src/Content/Widget.php:209 src/Model/Group.php:570
#: src/Module/Contact.php:354 src/Module/Welcome.php:76
msgid "Groups"
msgstr "المجموعات"
#: src/Content/Widget.php:209
#: src/Content/Widget.php:211
msgid "Everyone"
msgstr "الجميع"
#: src/Content/Widget.php:238
#: src/Content/Widget.php:240
msgid "Relationships"
msgstr "العلاقات"
#: src/Content/Widget.php:240 src/Module/Contact.php:306
#: src/Content/Widget.php:242 src/Module/Contact.php:306
#: src/Module/Group.php:293
msgid "All Contacts"
msgstr "كل المتراسلين"
#: src/Content/Widget.php:279
#: src/Content/Widget.php:281
msgid "Protocols"
msgstr "الموافيق"
#: src/Content/Widget.php:281
#: src/Content/Widget.php:283
msgid "All Protocols"
msgstr "كل الموافيق"
#: src/Content/Widget.php:309
#: src/Content/Widget.php:311
msgid "Saved Folders"
msgstr "المجلدات المحفوظة"
#: src/Content/Widget.php:311 src/Content/Widget.php:342
#: src/Content/Widget.php:313 src/Content/Widget.php:344
msgid "Everything"
msgstr "كلّ شيء"
#: src/Content/Widget.php:340
#: src/Content/Widget.php:342
msgid "Categories"
msgstr "الفئات"
#: src/Content/Widget.php:397
#: src/Content/Widget.php:399
#, php-format
msgid "%d contact in common"
msgid_plural "%d contacts in common"
@ -3235,23 +2793,27 @@ msgstr[3] "%d متراسلين مشتركين"
msgstr[4] "%d متراسلًا مشتركًا"
msgstr[5] "%d متراسل مشترك"
#: src/Content/Widget.php:493
#: src/Content/Widget.php:495
msgid "Archives"
msgstr "الأرشيفات"
#: src/Content/Widget.php:517
#: src/Content/Widget.php:519
msgid "Persons"
msgstr "الأشخاص"
#: src/Content/Widget.php:518
#: src/Content/Widget.php:520
msgid "Organisations"
msgstr "المنظّمات"
#: src/Content/Widget.php:519 src/Model/Contact.php:1498
#: src/Content/Widget.php:521 src/Model/Contact.php:1537
msgid "News"
msgstr "الأخبار"
#: src/Content/Widget.php:524 src/Module/Admin/BaseUsers.php:51
#: src/Content/Widget.php:525 src/Module/Settings/Account.php:455
msgid "Account Types"
msgstr "أنواع الحسابات"
#: src/Content/Widget.php:526 src/Module/Admin/BaseUsers.php:51
msgid "All"
msgstr "الكل"
@ -3309,22 +2871,22 @@ msgstr[5] "الوسوم الشائعة (آخر %d ساعة)"
msgid "More Trending Tags"
msgstr "المزيد من الوسوم الشائعة"
#: src/Content/Widget/VCard.php:96 src/Model/Profile.php:373
#: src/Content/Widget/VCard.php:102 src/Model/Profile.php:375
#: src/Module/Contact/Profile.php:371 src/Module/Profile/Profile.php:176
msgid "XMPP:"
msgstr "XMPP:"
#: src/Content/Widget/VCard.php:97 src/Model/Profile.php:374
#: src/Content/Widget/VCard.php:103 src/Model/Profile.php:376
#: src/Module/Contact/Profile.php:373 src/Module/Profile/Profile.php:180
msgid "Matrix:"
msgstr "مايتركس:"
#: src/Content/Widget/VCard.php:101 src/Model/Profile.php:466
#: src/Content/Widget/VCard.php:107 src/Model/Profile.php:468
#: src/Module/Notifications/Introductions.php:199
msgid "Network:"
msgstr "الشبكة:"
#: src/Content/Widget/VCard.php:105 src/Model/Profile.php:456
#: src/Content/Widget/VCard.php:111 src/Model/Profile.php:458
msgid "Unfollow"
msgstr "ألغِ المتابعة"
@ -3332,8 +2894,8 @@ msgstr "ألغِ المتابعة"
msgid "Yourself"
msgstr "أنت"
#: src/Core/ACL.php:201 src/Module/PermissionTooltip.php:112
#: src/Module/PermissionTooltip.php:134
#: src/Core/ACL.php:201 src/Module/PermissionTooltip.php:128
#: src/Module/PermissionTooltip.php:150
msgid "Mutuals"
msgstr "المشتركة"
@ -3341,7 +2903,8 @@ msgstr "المشتركة"
msgid "Post to Email"
msgstr "أنشر عبر البريد الإلكتروني"
#: src/Core/ACL.php:320 src/Module/PermissionTooltip.php:181
#: src/Core/ACL.php:320 src/Module/PermissionTooltip.php:85
#: src/Module/PermissionTooltip.php:197
msgid "Public"
msgstr "علني"
@ -3351,7 +2914,7 @@ msgid ""
"community pages and by anyone with its link."
msgstr "سيتم عرض هذا المحتوى لكل متابِعيك ويمكن مشاهدته في صفحات المجتمع ومن قبل أي شخص عبر رابطه."
#: src/Core/ACL.php:322
#: src/Core/ACL.php:322 src/Module/PermissionTooltip.php:93
msgid "Limited/Private"
msgstr "محدود/خاص"
@ -3685,201 +3248,201 @@ msgstr "قاعدة البيانات قيد الاستخدام."
msgid "Could not connect to database."
msgstr "يتعذر الاتصال بقاعدة البيانات."
#: src/Core/L10n.php:399 src/Model/Event.php:425
#: src/Core/L10n.php:400 src/Model/Event.php:425
#: src/Module/Settings/Display.php:182
msgid "Monday"
msgstr "الإثنين"
#: src/Core/L10n.php:399 src/Model/Event.php:426
#: src/Core/L10n.php:400 src/Model/Event.php:426
msgid "Tuesday"
msgstr "الثلاثاء"
#: src/Core/L10n.php:399 src/Model/Event.php:427
#: src/Core/L10n.php:400 src/Model/Event.php:427
msgid "Wednesday"
msgstr "الأربعاء"
#: src/Core/L10n.php:399 src/Model/Event.php:428
#: src/Core/L10n.php:400 src/Model/Event.php:428
msgid "Thursday"
msgstr "الخميس"
#: src/Core/L10n.php:399 src/Model/Event.php:429
#: src/Core/L10n.php:400 src/Model/Event.php:429
msgid "Friday"
msgstr "الجمعة"
#: src/Core/L10n.php:399 src/Model/Event.php:430
#: src/Core/L10n.php:400 src/Model/Event.php:430
msgid "Saturday"
msgstr "السبت"
#: src/Core/L10n.php:399 src/Model/Event.php:424
#: src/Core/L10n.php:400 src/Model/Event.php:424
#: src/Module/Settings/Display.php:182
msgid "Sunday"
msgstr "الأحد"
#: src/Core/L10n.php:403 src/Model/Event.php:445
#: src/Core/L10n.php:404 src/Model/Event.php:445
msgid "January"
msgstr "جانفي"
#: src/Core/L10n.php:403 src/Model/Event.php:446
#: src/Core/L10n.php:404 src/Model/Event.php:446
msgid "February"
msgstr "فيفري"
#: src/Core/L10n.php:403 src/Model/Event.php:447
#: src/Core/L10n.php:404 src/Model/Event.php:447
msgid "March"
msgstr "مارس"
#: src/Core/L10n.php:403 src/Model/Event.php:448
#: src/Core/L10n.php:404 src/Model/Event.php:448
msgid "April"
msgstr "أفريل"
#: src/Core/L10n.php:403 src/Core/L10n.php:423 src/Model/Event.php:436
#: src/Core/L10n.php:404 src/Core/L10n.php:424 src/Model/Event.php:436
msgid "May"
msgstr "ماي"
#: src/Core/L10n.php:403 src/Model/Event.php:449
#: src/Core/L10n.php:404 src/Model/Event.php:449
msgid "June"
msgstr "جوان"
#: src/Core/L10n.php:403 src/Model/Event.php:450
#: src/Core/L10n.php:404 src/Model/Event.php:450
msgid "July"
msgstr "جويلية"
#: src/Core/L10n.php:403 src/Model/Event.php:451
#: src/Core/L10n.php:404 src/Model/Event.php:451
msgid "August"
msgstr "أوت"
#: src/Core/L10n.php:403 src/Model/Event.php:452
#: src/Core/L10n.php:404 src/Model/Event.php:452
msgid "September"
msgstr "سبتمبر"
#: src/Core/L10n.php:403 src/Model/Event.php:453
#: src/Core/L10n.php:404 src/Model/Event.php:453
msgid "October"
msgstr "أكتوبر"
#: src/Core/L10n.php:403 src/Model/Event.php:454
#: src/Core/L10n.php:404 src/Model/Event.php:454
msgid "November"
msgstr "نوفمبر"
#: src/Core/L10n.php:403 src/Model/Event.php:455
#: src/Core/L10n.php:404 src/Model/Event.php:455
msgid "December"
msgstr "ديسمبر"
#: src/Core/L10n.php:419 src/Model/Event.php:417
#: src/Core/L10n.php:420 src/Model/Event.php:417
msgid "Mon"
msgstr "إث"
#: src/Core/L10n.php:419 src/Model/Event.php:418
#: src/Core/L10n.php:420 src/Model/Event.php:418
msgid "Tue"
msgstr "ثلا"
#: src/Core/L10n.php:419 src/Model/Event.php:419
#: src/Core/L10n.php:420 src/Model/Event.php:419
msgid "Wed"
msgstr "أر"
#: src/Core/L10n.php:419 src/Model/Event.php:420
#: src/Core/L10n.php:420 src/Model/Event.php:420
msgid "Thu"
msgstr "خم"
#: src/Core/L10n.php:419 src/Model/Event.php:421
#: src/Core/L10n.php:420 src/Model/Event.php:421
msgid "Fri"
msgstr "جم"
#: src/Core/L10n.php:419 src/Model/Event.php:422
#: src/Core/L10n.php:420 src/Model/Event.php:422
msgid "Sat"
msgstr "سب"
#: src/Core/L10n.php:419 src/Model/Event.php:416
#: src/Core/L10n.php:420 src/Model/Event.php:416
msgid "Sun"
msgstr "أح"
#: src/Core/L10n.php:423 src/Model/Event.php:432
#: src/Core/L10n.php:424 src/Model/Event.php:432
msgid "Jan"
msgstr "جا"
#: src/Core/L10n.php:423 src/Model/Event.php:433
#: src/Core/L10n.php:424 src/Model/Event.php:433
msgid "Feb"
msgstr "في"
#: src/Core/L10n.php:423 src/Model/Event.php:434
#: src/Core/L10n.php:424 src/Model/Event.php:434
msgid "Mar"
msgstr "مارس"
#: src/Core/L10n.php:423 src/Model/Event.php:435
#: src/Core/L10n.php:424 src/Model/Event.php:435
msgid "Apr"
msgstr "أف"
#: src/Core/L10n.php:423 src/Model/Event.php:437
#: src/Core/L10n.php:424 src/Model/Event.php:437
msgid "Jun"
msgstr "جو"
#: src/Core/L10n.php:423 src/Model/Event.php:438
#: src/Core/L10n.php:424 src/Model/Event.php:438
msgid "Jul"
msgstr "جوي"
#: src/Core/L10n.php:423 src/Model/Event.php:439
#: src/Core/L10n.php:424 src/Model/Event.php:439
msgid "Aug"
msgstr "أو"
#: src/Core/L10n.php:423
#: src/Core/L10n.php:424
msgid "Sep"
msgstr "سب"
#: src/Core/L10n.php:423 src/Model/Event.php:441
#: src/Core/L10n.php:424 src/Model/Event.php:441
msgid "Oct"
msgstr "أك"
#: src/Core/L10n.php:423 src/Model/Event.php:442
#: src/Core/L10n.php:424 src/Model/Event.php:442
msgid "Nov"
msgstr "نو"
#: src/Core/L10n.php:423 src/Model/Event.php:443
#: src/Core/L10n.php:424 src/Model/Event.php:443
msgid "Dec"
msgstr "دي"
#: src/Core/L10n.php:442
#: src/Core/L10n.php:443
msgid "poke"
msgstr "ألكز"
#: src/Core/L10n.php:442
#: src/Core/L10n.php:443
msgid "poked"
msgstr "لُكز"
#: src/Core/L10n.php:443
#: src/Core/L10n.php:444
msgid "ping"
msgstr ""
#: src/Core/L10n.php:443
#: src/Core/L10n.php:444
msgid "pinged"
msgstr ""
#: src/Core/L10n.php:444
#: src/Core/L10n.php:445
msgid "prod"
msgstr "انخس"
#: src/Core/L10n.php:444
#: src/Core/L10n.php:445
msgid "prodded"
msgstr "نُخِس"
#: src/Core/L10n.php:445
#: src/Core/L10n.php:446
msgid "slap"
msgstr "اصفع"
#: src/Core/L10n.php:445
#: src/Core/L10n.php:446
msgid "slapped"
msgstr "صُفع"
#: src/Core/L10n.php:446
#: src/Core/L10n.php:447
msgid "finger"
msgstr ""
#: src/Core/L10n.php:446
#: src/Core/L10n.php:447
msgid "fingered"
msgstr ""
#: src/Core/L10n.php:447
#: src/Core/L10n.php:448
msgid "rebuff"
msgstr ""
#: src/Core/L10n.php:447
#: src/Core/L10n.php:448
msgid "rebuffed"
msgstr ""
@ -4082,81 +3645,81 @@ msgstr "خطأ داخلي في الخادم"
msgid "Legacy module file not found: %s"
msgstr "لم يُعثر على ملف الوحدة القديم: %s"
#: src/Model/Contact.php:1084 src/Model/Contact.php:1096
#: src/Model/Contact.php:1103 src/Model/Contact.php:1115
msgid "UnFollow"
msgstr "ألغِ المتابعة"
#: src/Model/Contact.php:1102 src/Module/Admin/Users/Pending.php:107
#: src/Model/Contact.php:1121 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:1494
#: src/Model/Contact.php:1533
msgid "Organisation"
msgstr "منظّمة"
#: src/Model/Contact.php:1502
#: src/Model/Contact.php:1541
msgid "Forum"
msgstr "منتدى"
#: src/Model/Contact.php:2437
#: src/Model/Contact.php:2517
msgid "Disallowed profile URL."
msgstr "رابط الملف الشخصي غير المسموح."
#: src/Model/Contact.php:2442 src/Module/Friendica.php:81
#: src/Model/Contact.php:2522 src/Module/Friendica.php:81
msgid "Blocked domain"
msgstr "نطاق محجوب"
#: src/Model/Contact.php:2447
#: src/Model/Contact.php:2527
msgid "Connect URL missing."
msgstr "رابط الاتصال مفقود."
#: src/Model/Contact.php:2456
#: src/Model/Contact.php:2536
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr "تعذر إضافة المتراسل. تحقق من بيانات اعتماد الشبكة المستهدفة في الإعدادات -> صفحة الشبكات الاجتماعية."
#: src/Model/Contact.php:2493
#: src/Model/Contact.php:2578
msgid "The profile address specified does not provide adequate information."
msgstr "عنوان الملف الشخصي لا يوفر معلومات كافية."
#: src/Model/Contact.php:2495
#: src/Model/Contact.php:2580
msgid "No compatible communication protocols or feeds were discovered."
msgstr "لم تكتشف أي موافيق اتصال أو تغذيات متوافقة."
#: src/Model/Contact.php:2498
#: src/Model/Contact.php:2583
msgid "An author or name was not found."
msgstr "لم يُعثر على الكاتب أو اسمه."
#: src/Model/Contact.php:2501
#: src/Model/Contact.php:2586
msgid "No browser URL could be matched to this address."
msgstr "لا يوجد رابط يطابق هذا العنوان."
#: src/Model/Contact.php:2504
#: src/Model/Contact.php:2589
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr "غير قادر على مطابقة عنوان المعرف \"@\" بميفاق معروف أو متراسل بريد إلكتروني."
#: src/Model/Contact.php:2505
#: src/Model/Contact.php:2590
msgid "Use mailto: in front of address to force email check."
msgstr "استخدم mailto: أمام العنوان للتعرّف عليه كبريد إلكتروني."
#: src/Model/Contact.php:2511
#: src/Model/Contact.php:2596
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr "عنوان الملف الشخصي تابع لشبكة محجوبة في هذا الموقع."
#: src/Model/Contact.php:2516
#: src/Model/Contact.php:2601
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr "ملف شخصي محدود. لن يتمكن هذا الشخص من تلقي تنبيهات مباشرة/شخصية."
#: src/Model/Contact.php:2575
#: src/Model/Contact.php:2660
msgid "Unable to retrieve contact information."
msgstr "تعذر جلب معلومات المتراسل."
@ -4276,33 +3839,58 @@ msgstr "اسم المجموعة: "
msgid "Edit groups"
msgstr "عدّل المجموعات"
#: src/Model/Item.php:1764
#: src/Model/Item.php:1795
#, php-format
msgid "Detected languages in this post:\\n%s"
msgstr "اللغات المكتشفة في هذه المشاركة:\\n%s"
#: src/Model/Item.php:2672
#: src/Model/Item.php:2701
msgid "activity"
msgstr "النشاط"
#: src/Model/Item.php:2674
#: src/Model/Item.php:2703
msgid "comment"
msgstr "تعليق"
#: src/Model/Item.php:2677
#: src/Model/Item.php:2706
msgid "post"
msgstr "مشاركة"
#: src/Model/Item.php:2814
#: src/Model/Item.php:2821
#, php-format
msgid "Content warning: %s"
msgstr "تحذير من المحتوى: %s"
#: src/Model/Item.php:3164
#: src/Model/Item.php:3180
msgid "bytes"
msgstr "بايت"
#: src/Model/Item.php:3193 src/Model/Item.php:3194
#: src/Model/Item.php:3214
#, php-format
msgid "%s (%d%s, %d votes)"
msgstr ""
#: src/Model/Item.php:3216
#, php-format
msgid "%s (%d votes)"
msgstr ""
#: src/Model/Item.php:3221
#, php-format
msgid "%d voters. Poll end: %s"
msgstr ""
#: src/Model/Item.php:3223
#, php-format
msgid "%d voters."
msgstr ""
#: src/Model/Item.php:3225
#, php-format
msgid "Poll end: %s"
msgstr ""
#: src/Model/Item.php:3259 src/Model/Item.php:3260
msgid "View on separate page"
msgstr "اعرضه في صفحة منفصلة"
@ -4310,215 +3898,215 @@ msgstr "اعرضه في صفحة منفصلة"
msgid "[no subject]"
msgstr "[بدون موضوع]"
#: src/Model/Profile.php:356 src/Module/Profile/Profile.php:256
#: src/Model/Profile.php:358 src/Module/Profile/Profile.php:256
#: src/Module/Profile/Profile.php:258
msgid "Edit profile"
msgstr "عدّل الملف الشخصي"
#: src/Model/Profile.php:358
#: src/Model/Profile.php:360
msgid "Change profile photo"
msgstr "غير صورة الملف الشخصي"
#: src/Model/Profile.php:371 src/Module/Directory.php:152
#: src/Model/Profile.php:373 src/Module/Directory.php:153
#: src/Module/Profile/Profile.php:184
msgid "Homepage:"
msgstr "الصفحة رئيسية:"
#: src/Model/Profile.php:372 src/Module/Contact/Profile.php:375
#: src/Model/Profile.php:374 src/Module/Contact/Profile.php:375
#: src/Module/Notifications/Introductions.php:187
msgid "About:"
msgstr "حول:"
#: src/Model/Profile.php:458
#: src/Model/Profile.php:460
msgid "Atom feed"
msgstr "تغذية Atom"
#: src/Model/Profile.php:502
#: src/Model/Profile.php:504
msgid "F d"
msgstr "F d"
#: src/Model/Profile.php:566 src/Model/Profile.php:650
#: src/Model/Profile.php:568 src/Model/Profile.php:652
msgid "[today]"
msgstr "[اليوم]"
#: src/Model/Profile.php:575
#: src/Model/Profile.php:577
msgid "Birthday Reminders"
msgstr "التذكير أبعياد الميلاد"
#: src/Model/Profile.php:576
#: src/Model/Profile.php:578
msgid "Birthdays this week:"
msgstr "أعياد ميلاد لهذا الأسبوع:"
#: src/Model/Profile.php:599
#: src/Model/Profile.php:601
msgid "g A l F d"
msgstr "g A l F d"
#: src/Model/Profile.php:637
#: src/Model/Profile.php:639
msgid "[No description]"
msgstr "[بدون وصف]"
#: src/Model/Profile.php:663
#: src/Model/Profile.php:665
msgid "Event Reminders"
msgstr "التذكير بالأحداث"
#: src/Model/Profile.php:664
#: src/Model/Profile.php:666
msgid "Upcoming events the next 7 days:"
msgstr "أحداث لهذا الأسبوع:"
#: src/Model/Profile.php:852
#: src/Model/Profile.php:854
#, php-format
msgid "OpenWebAuth: %1$s welcomes %2$s"
msgstr "OpenWebAuth: %1$s يرحب بـ %2$s"
#: src/Model/Profile.php:984
#: src/Model/Profile.php:980
msgid "Hometown:"
msgstr "المدينة:"
#: src/Model/Profile.php:985
#: src/Model/Profile.php:981
msgid "Marital Status:"
msgstr "الحالة الاجتماعية:"
#: src/Model/Profile.php:986
#: src/Model/Profile.php:982
msgid "With:"
msgstr "مع:"
#: src/Model/Profile.php:987
#: src/Model/Profile.php:983
msgid "Since:"
msgstr "منذ:"
#: src/Model/Profile.php:988
#: src/Model/Profile.php:984
msgid "Sexual Preference:"
msgstr "التفضيل الجنسي:"
#: src/Model/Profile.php:989
#: src/Model/Profile.php:985
msgid "Political Views:"
msgstr "الآراء السياسية:"
#: src/Model/Profile.php:990
#: src/Model/Profile.php:986
msgid "Religious Views:"
msgstr "الآراء الدينية:"
#: src/Model/Profile.php:991
#: src/Model/Profile.php:987
msgid "Likes:"
msgstr "أعجبني:"
#: src/Model/Profile.php:992
#: src/Model/Profile.php:988
msgid "Dislikes:"
msgstr "لم يعجبني:"
#: src/Model/Profile.php:993
#: src/Model/Profile.php:989
msgid "Title/Description:"
msgstr "العنوان/الوصف:"
#: src/Model/Profile.php:994 src/Module/Admin/Summary.php:233
#: src/Model/Profile.php:990 src/Module/Admin/Summary.php:234
msgid "Summary"
msgstr "موجز"
#: src/Model/Profile.php:995
#: src/Model/Profile.php:991
msgid "Musical interests"
msgstr "الموسيقى المفضلة"
#: src/Model/Profile.php:996
#: src/Model/Profile.php:992
msgid "Books, literature"
msgstr "الكتب والأدب"
#: src/Model/Profile.php:997
#: src/Model/Profile.php:993
msgid "Television"
msgstr "العروض التلفزيونة"
#: src/Model/Profile.php:998
#: src/Model/Profile.php:994
msgid "Film/dance/culture/entertainment"
msgstr "أفلام/رقص/ثقافة/ترفيه"
#: src/Model/Profile.php:999
#: src/Model/Profile.php:995
msgid "Hobbies/Interests"
msgstr "الهوايات/الاهتمامات"
#: src/Model/Profile.php:1000
#: src/Model/Profile.php:996
msgid "Love/romance"
msgstr "الحب/الرومانسية"
#: src/Model/Profile.php:1001
#: src/Model/Profile.php:997
msgid "Work/employment"
msgstr "العمل/التوظيف"
#: src/Model/Profile.php:1002
#: src/Model/Profile.php:998
msgid "School/education"
msgstr "المدرسة/التعليم"
#: src/Model/Profile.php:1003
#: src/Model/Profile.php:999
msgid "Contact information and Social Networks"
msgstr "معلومات الاتصال وحسابات الشبكات الاجتماعية"
#: src/Model/User.php:208 src/Model/User.php:1056
#: src/Model/User.php:210 src/Model/User.php:1058
msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr "خطأ قاتل: فشل توليد مفاتيح الأمان."
#: src/Model/User.php:568 src/Model/User.php:601
#: src/Model/User.php:570 src/Model/User.php:603
msgid "Login failed"
msgstr "فشل الولوج"
#: src/Model/User.php:633
#: src/Model/User.php:635
msgid "Not enough information to authenticate"
msgstr "لا توجد معلومات كافية للاستيثاق"
#: src/Model/User.php:728
#: src/Model/User.php:730
msgid "Password can't be empty"
msgstr "لا يمكن أن تكون كلمة المرور فارغة"
#: src/Model/User.php:747
#: src/Model/User.php:749
msgid "Empty passwords are not allowed."
msgstr "لا يسمح بكلمات مرور فارغة."
#: src/Model/User.php:751
#: src/Model/User.php:753
msgid ""
"The new password has been exposed in a public data dump, please choose "
"another."
msgstr "كلمة المرور الجديدة جزء من تسريب بيانات علني ، يرجى اختيار كلمة مرور مختلفة."
#: src/Model/User.php:757
#: src/Model/User.php:759
msgid ""
"The password can't contain accentuated letters, white spaces or colons (:)"
msgstr "لا يمكن أن تحتوي كلمة المرور على أحرف منبورة أو مسافات أو نقطتي تفسير (:)"
#: src/Model/User.php:936
#: src/Model/User.php:938
msgid "Passwords do not match. Password unchanged."
msgstr "كلمتا المرور غير متطابقتين. لم تغيَّر كلمة المرور."
#: src/Model/User.php:943
#: src/Model/User.php:945
msgid "An invitation is required."
msgstr "الدعوة إلزامية."
#: src/Model/User.php:947
#: src/Model/User.php:949
msgid "Invitation could not be verified."
msgstr "تعذر التحقق من الدعوة."
#: src/Model/User.php:955
#: src/Model/User.php:957
msgid "Invalid OpenID url"
msgstr "رابط OpenID عير صالح"
#: src/Model/User.php:968 src/Security/Authentication.php:235
#: src/Model/User.php:970 src/Security/Authentication.php:235
msgid ""
"We encountered a problem while logging in with the OpenID you provided. "
"Please check the correct spelling of the ID."
msgstr "واجهنا مشكلة أثناء الولوج باستخدام OpenID. يرجى التحقق من صحة المعرف."
#: src/Model/User.php:968 src/Security/Authentication.php:235
#: src/Model/User.php:970 src/Security/Authentication.php:235
msgid "The error message was:"
msgstr "رسالة الخطأ:"
#: src/Model/User.php:974
#: src/Model/User.php:976
msgid "Please enter the required information."
msgstr "رجاءً أدخل المعلومات المطلوبة."
#: src/Model/User.php:988
#: src/Model/User.php:990
#, 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:995
#: src/Model/User.php:997
#, php-format
msgid "Username should be at least %s character."
msgid_plural "Username should be at least %s characters."
@ -4529,7 +4117,7 @@ msgstr[3] "يجب أن لا يقل اسم المستخدم عن %s محارف."
msgstr[4] "يجب أن لا يقل اسم المستخدم عن %s محرف."
msgstr[5] "يجب أن لا يقل اسم المستخدم عن %s محرف."
#: src/Model/User.php:999
#: src/Model/User.php:1001
#, php-format
msgid "Username should be at most %s character."
msgid_plural "Username should be at most %s characters."
@ -4540,60 +4128,60 @@ msgstr[3] "يجب أن لا يزيد اسم المستخدم عن %s محارف.
msgstr[4] "يجب أن لا يزيد اسم المستخدم عن %s محرف."
msgstr[5] "يجب أن لا يزيد اسم المستخدم عن %s محرف."
#: src/Model/User.php:1007
#: src/Model/User.php:1009
msgid "That doesn't appear to be your full (First Last) name."
msgstr "لا يبدو أن هذا اسمك الكامل."
#: src/Model/User.php:1012
#: src/Model/User.php:1014
msgid "Your email domain is not among those allowed on this site."
msgstr "نطاق بريدك الإلكتروني غير مسموح به على هذا الموقع."
#: src/Model/User.php:1016
#: src/Model/User.php:1018
msgid "Not a valid email address."
msgstr "عنوان البريد الإلكتروني غير صالح."
#: src/Model/User.php:1019
#: src/Model/User.php:1021
msgid "The nickname was blocked from registration by the nodes admin."
msgstr "هذا اللقب محظور من قبل مدير العقدة."
#: src/Model/User.php:1023 src/Model/User.php:1031
#: src/Model/User.php:1025 src/Model/User.php:1033
msgid "Cannot use that email."
msgstr "لا يمكن استخدام هذا البريد الإلكتروني."
#: src/Model/User.php:1038
#: src/Model/User.php:1040
msgid "Your nickname can only contain a-z, 0-9 and _."
msgstr "يجب أن يتكون اللقب من المحارف a-z، 0-9، _."
#: src/Model/User.php:1046 src/Model/User.php:1103
#: src/Model/User.php:1048 src/Model/User.php:1105
msgid "Nickname is already registered. Please choose another."
msgstr "هذا اللقب محجوز. اختر لقبًا آخر."
#: src/Model/User.php:1090 src/Model/User.php:1094
#: src/Model/User.php:1092 src/Model/User.php:1096
msgid "An error occurred during registration. Please try again."
msgstr "حدث خطأ أثناء التسجيل، رجاء حاول مرة أخرى."
#: src/Model/User.php:1117
#: src/Model/User.php:1119
msgid "An error occurred creating your default profile. Please try again."
msgstr "حدث خطأ أثناء إنشاء الملف الشخصي الافتراضي، رجاء حاول مرة أخرى."
#: src/Model/User.php:1124
#: src/Model/User.php:1126
msgid "An error occurred creating your self contact. Please try again."
msgstr ""
#: src/Model/User.php:1129
#: src/Model/User.php:1131
msgid "Friends"
msgstr "الأصدقاء"
#: src/Model/User.php:1133
#: src/Model/User.php:1135
msgid ""
"An error occurred creating your default contact group. Please try again."
msgstr "حدث خطأ أثناء إنشاء مجموعة المتراسلين الافتراضية، رجاء حاول مرة أخرى."
#: src/Model/User.php:1171
#: src/Model/User.php:1174
msgid "Profile Photos"
msgstr "صور الملف الشخصي"
#: src/Model/User.php:1365
#: src/Model/User.php:1368
#, php-format
msgid ""
"\n"
@ -4601,7 +4189,7 @@ msgid ""
"\t\t\tthe administrator of %2$s has set up an account for you."
msgstr "\n\t\tعزيزي %1$s،\n\t\t\tأنشأ مدير %2$s حساب لك."
#: src/Model/User.php:1368
#: src/Model/User.php:1371
#, php-format
msgid ""
"\n"
@ -4633,12 +4221,12 @@ msgid ""
"\t\tThank you and welcome to %4$s."
msgstr "\n\t\tتفاصيل تسجيل الولوج هي كالتالي:\n\n\t\tالموقع:\t%1$s\n\t\tاسم المستخدم:\t\t%2$s\n\t\tكلمة المرور:\t%3$s\n\n\t\tيمكنك تغيير كلمة المرور من صفحة إعدادات الحساب.\n\n\t\tيرجى أخذ بضع لحظات لمراجعة الإعدادات الأخرى في تلك الصفحة.\n\n\t\tقد ترغب أيضًا في إضافة بعض المعلومات الأساسية إلى صفحة ملفك الشخصية الافتراضي\n\t\t(من صفحة \"الملفات الشخصية\") حتى يتمكن الآخرون من العثور عليك بسهولة.\n\n\t\tنحن نوصي بوضع اسمك الكامل، إضافة لصورة،\n\t\tوإضافة بعض الكلمات المفتاحية (مفيدة جدا في تكوين صداقات) - و\n\t\tربما البلد الذي تعيش فيه.\n\n\t\tنحن نحترم حقك في الخصوصية احتراما كاملا، ولا ضرورة لأي مما سبق.\n\t\tإذا كنت جديداً ولا تعرف أي شخص هنا، فقد تساعدك هذه المعلومات على تكوين صداقات مثيرة للاهتمام.\n\n\t\tإذا كنت ترغب في حذف حسابك، يمكنك فعل ذلك في %1$s/removeme\n\n\t\tشكرا لك ومرحبًا بك في %4$s."
#: src/Model/User.php:1401 src/Model/User.php:1508
#: src/Model/User.php:1404 src/Model/User.php:1511
#, php-format
msgid "Registration details for %s"
msgstr "تفاصيل التسجيل لـ %s"
#: src/Model/User.php:1421
#: src/Model/User.php:1424
#, php-format
msgid ""
"\n"
@ -4653,12 +4241,12 @@ msgid ""
"\t\t"
msgstr "\n\t\t\tعزيزي %1$s،\n\t\t\t\tشكرا لك على التسجيل في %2$s. حسابك معلق حتى يوافق عليه المدير.\n\n\t\t\tتفاصيل الولوج هي كالتالي:\n\n\t\t\tالموقع:\t%3$s\n\t\t\tاسم المستخدم:\t\t%4$s\n\t\t\tكلمة المرور:\t\t%5$s\n\t\t\t\t"
#: src/Model/User.php:1440
#: src/Model/User.php:1443
#, php-format
msgid "Registration at %s"
msgstr "التسجيل في %s"
#: src/Model/User.php:1464
#: src/Model/User.php:1467
#, php-format
msgid ""
"\n"
@ -4667,7 +4255,7 @@ msgid ""
"\t\t\t"
msgstr "\n\t\t\t\t عزيزي %1$s،\n\t\t\t\tشكرا لك على التسجيل في %2$s. نجح إنشاء حسابك.\n\t\t\t\t"
#: src/Model/User.php:1472
#: src/Model/User.php:1475
#, php-format
msgid ""
"\n"
@ -4728,10 +4316,10 @@ msgstr "فعّل"
#: src/Module/Admin/Blocklist/Contact.php:94
#: src/Module/Admin/Blocklist/Server/Add.php:89
#: src/Module/Admin/Blocklist/Server/Index.php:78
#: src/Module/Admin/Federation.php:194 src/Module/Admin/Item/Delete.php:64
#: src/Module/Admin/Logs/Settings.php:79 src/Module/Admin/Logs/View.php:83
#: src/Module/Admin/Queue.php:72 src/Module/Admin/Site.php:498
#: src/Module/Admin/Storage.php:138 src/Module/Admin/Summary.php:232
#: src/Module/Admin/Federation.php:196 src/Module/Admin/Item/Delete.php:64
#: src/Module/Admin/Logs/Settings.php:79 src/Module/Admin/Logs/View.php:84
#: src/Module/Admin/Queue.php:72 src/Module/Admin/Site.php:431
#: src/Module/Admin/Storage.php:138 src/Module/Admin/Summary.php:233
#: src/Module/Admin/Themes/Details.php:90
#: src/Module/Admin/Themes/Index.php:111 src/Module/Admin/Tos.php:75
#: src/Module/Admin/Users/Active.php:136
@ -4821,10 +4409,42 @@ msgstr "حُذف"
msgid "List of pending user deletions"
msgstr "قائمة الحذف المعلق للمستخدمين"
#: src/Module/Admin/BaseUsers.php:100 src/Module/Settings/Account.php:493
msgid "Normal Account Page"
msgstr "صفحة حساب عادي"
#: src/Module/Admin/BaseUsers.php:101 src/Module/Settings/Account.php:500
msgid "Soapbox Page"
msgstr "صفحة سياسي"
#: src/Module/Admin/BaseUsers.php:102 src/Module/Settings/Account.php:507
msgid "Public Forum"
msgstr "منتدى عمومي"
#: src/Module/Admin/BaseUsers.php:103 src/Module/Settings/Account.php:514
msgid "Automatic Friend Page"
msgstr "صفحة اشترك تلقائي"
#: src/Module/Admin/BaseUsers.php:104
msgid "Private Forum"
msgstr "منتدى خاص"
#: src/Module/Admin/BaseUsers.php:107 src/Module/Settings/Account.php:465
msgid "Personal Page"
msgstr "صفحة شخصية"
#: src/Module/Admin/BaseUsers.php:108 src/Module/Settings/Account.php:472
msgid "Organisation Page"
msgstr "صفحة منظمة"
#: src/Module/Admin/BaseUsers.php:109 src/Module/Settings/Account.php:479
msgid "News Page"
msgstr "صفحة إخبارية"
#: src/Module/Admin/BaseUsers.php:110 src/Module/Settings/Account.php:486
msgid "Community Forum"
msgstr "منتدى مجتمعي"
#: src/Module/Admin/BaseUsers.php:111
msgid "Relay"
msgstr "مُرحِل"
@ -5160,65 +4780,65 @@ msgstr "أقفل ميزة %s"
msgid "Manage Additional Features"
msgstr "إدارة الميّزات الإضافية"
#: src/Module/Admin/Federation.php:63
#: src/Module/Admin/Federation.php:65
msgid "Other"
msgstr "أخرى"
#: src/Module/Admin/Federation.php:134 src/Module/Admin/Federation.php:383
#: src/Module/Admin/Federation.php:136 src/Module/Admin/Federation.php:385
msgid "unknown"
msgstr "مجهول"
#: src/Module/Admin/Federation.php:167
#: src/Module/Admin/Federation.php:169
#, php-format
msgid "%s total systems"
msgstr "%s نظام"
#: src/Module/Admin/Federation.php:168
#: src/Module/Admin/Federation.php:170
#, php-format
msgid "%s active users last month"
msgstr "%s مستخدم نشط في آخر شهر"
#: src/Module/Admin/Federation.php:169
#: src/Module/Admin/Federation.php:171
#, php-format
msgid "%s active users last six month"
msgstr "%s مستخدم نشط في آخر ستة أشهر"
msgid "%s active users last six months"
msgstr ""
#: src/Module/Admin/Federation.php:170
#: src/Module/Admin/Federation.php:172
#, php-format
msgid "%s registered users"
msgstr "%s مستخدم مسجل"
#: src/Module/Admin/Federation.php:171
#: src/Module/Admin/Federation.php:173
#, php-format
msgid "%s local posts"
msgstr "%s مشاركة محلية"
msgid "%s locally created posts and comments"
msgstr ""
#: src/Module/Admin/Federation.php:174
#: src/Module/Admin/Federation.php:176
#, php-format
msgid "%s posts per user"
msgstr "%s مشاركة لكل مستخدم"
#: src/Module/Admin/Federation.php:179
#: src/Module/Admin/Federation.php:181
#, php-format
msgid "%s users per system"
msgstr "%s مستخدم لكل نظام"
#: src/Module/Admin/Federation.php:189
#: src/Module/Admin/Federation.php:191
msgid ""
"This page offers you some numbers to the known part of the federated social "
"network your Friendica node is part of. These numbers are not complete but "
"only reflect the part of the network your node is aware of."
msgstr "تقدم لك هذه الصفحة بعض الإحصائيات للجزء المعروف من الشبكة الاجتماعية الموحدة المتصلة بعقدتك. هذه الإحصائيات ليست كاملة ولكنها تتضمن المواقع المعروفة لعقدتك من الشبكة."
#: src/Module/Admin/Federation.php:195 src/Module/BaseAdmin.php:87
#: src/Module/Admin/Federation.php:197 src/Module/BaseAdmin.php:87
msgid "Federation Statistics"
msgstr "إحصائيات الشبكة الموحدة"
#: src/Module/Admin/Federation.php:199
#: src/Module/Admin/Federation.php:201
#, php-format
msgid ""
"Currently this node is aware of %s nodes (%s active users last month, %s "
"active users last six month, %s registered users in total) from the "
"active users last six months, %s registered users in total) from the "
"following platforms:"
msgstr ""
@ -5300,7 +4920,7 @@ msgstr "ذكر"
msgid "Implicit Mention"
msgstr "ذِكر صريح"
#: src/Module/Admin/Item/Source.php:73 src/Module/Admin/Logs/View.php:98
#: src/Module/Admin/Item/Source.php:73 src/Module/Admin/Logs/View.php:99
#: src/Module/Debug/ActivityPubConversion.php:62
msgid "Source"
msgstr "المصدر"
@ -5372,68 +4992,68 @@ msgid ""
"is readable."
msgstr "يتعذر فتح ملف السجل <strong>%1$s</strong>.<br/> تحقق مما إذا كان الملف %1$s مُنح أذونات القراءة."
#: src/Module/Admin/Logs/View.php:84 src/Module/BaseAdmin.php:110
#: src/Module/Admin/Logs/View.php:85 src/Module/BaseAdmin.php:110
msgid "View Logs"
msgstr "اعرض السجلات"
#: src/Module/Admin/Logs/View.php:87
#: src/Module/Admin/Logs/View.php:88
msgid "Search in logs"
msgstr "ابحث في السجل"
#: src/Module/Admin/Logs/View.php:88
#: src/Module/Admin/Logs/View.php:89
#: src/Module/Notifications/Notifications.php:139
msgid "Show all"
msgstr "اعرض الكل"
#: src/Module/Admin/Logs/View.php:89
#: src/Module/Admin/Logs/View.php:90
msgid "Date"
msgstr "التّاريخ"
#: src/Module/Admin/Logs/View.php:90
#: src/Module/Admin/Logs/View.php:91
msgid "Level"
msgstr "المستوى"
#: src/Module/Admin/Logs/View.php:91
#: src/Module/Admin/Logs/View.php:92
msgid "Context"
msgstr "السياق"
#: src/Module/Admin/Logs/View.php:93
#: src/Module/Admin/Logs/View.php:94
msgid "ALL"
msgstr "الكل"
#: src/Module/Admin/Logs/View.php:94
#: src/Module/Admin/Logs/View.php:95
msgid "View details"
msgstr "اعرض التفاصيل"
#: src/Module/Admin/Logs/View.php:95
#: src/Module/Admin/Logs/View.php:96
msgid "Click to view details"
msgstr "انقر لعرض التفاصيل"
#: src/Module/Admin/Logs/View.php:97
#: src/Module/Admin/Logs/View.php:98
msgid "Data"
msgstr "البيانات"
#: src/Module/Admin/Logs/View.php:99
#: src/Module/Admin/Logs/View.php:100
msgid "File"
msgstr "الملف"
#: src/Module/Admin/Logs/View.php:100
#: src/Module/Admin/Logs/View.php:101
msgid "Line"
msgstr "السطر"
#: src/Module/Admin/Logs/View.php:101
#: src/Module/Admin/Logs/View.php:102
msgid "Function"
msgstr "الدالة"
#: src/Module/Admin/Logs/View.php:102
#: src/Module/Admin/Logs/View.php:103
msgid "UID"
msgstr ""
#: src/Module/Admin/Logs/View.php:103
#: src/Module/Admin/Logs/View.php:104
msgid "Process ID"
msgstr "مُعرّف العملية"
#: src/Module/Admin/Logs/View.php:104
#: src/Module/Admin/Logs/View.php:105
msgid "Close"
msgstr "أغلق"
@ -5473,461 +5093,459 @@ msgstr "معطيات العملية"
msgid "Priority"
msgstr "الأولوية"
#: src/Module/Admin/Site.php:71
msgid "Can not parse base url. Must have at least <scheme>://<domain>"
msgstr "يتعذر تحليل الرابط الأساسي. يجب أن يكون <scheme>://<domain>"
#: src/Module/Admin/Site.php:125
msgid "Relocation started. Could take a while to complete."
msgstr "بدأ النقل. قد يستغرق بعض الوقت."
#: src/Module/Admin/Site.php:403 src/Module/Settings/Display.php:138
#: src/Module/Admin/Site.php:336 src/Module/Settings/Display.php:138
msgid "No special theme for mobile devices"
msgstr "لا توجد سمة مخصصة للهاتف"
#: src/Module/Admin/Site.php:420 src/Module/Settings/Display.php:148
#: src/Module/Admin/Site.php:353 src/Module/Settings/Display.php:148
#, php-format
msgid "%s - (Experimental)"
msgstr "%s - (اختباري)"
#: src/Module/Admin/Site.php:432
#: src/Module/Admin/Site.php:365
msgid "No community page for local users"
msgstr "لا توجد صفحة مجتمع للمستخدمين المحليين"
#: src/Module/Admin/Site.php:433
#: src/Module/Admin/Site.php:366
msgid "No community page"
msgstr "لا توجد صفحة مجتمع"
#: src/Module/Admin/Site.php:434
#: src/Module/Admin/Site.php:367
msgid "Public postings from users of this site"
msgstr "المشاركات العلنية لمستخدمي هذا الموقع"
#: src/Module/Admin/Site.php:435
#: src/Module/Admin/Site.php:368
msgid "Public postings from the federated network"
msgstr "المشاركات العلنية من الشبكة الموحدة"
#: src/Module/Admin/Site.php:436
#: src/Module/Admin/Site.php:369
msgid "Public postings from local users and the federated network"
msgstr "المشركات العلنية من الشبكة الموحدة والشبكة المحلية"
#: src/Module/Admin/Site.php:442
#: src/Module/Admin/Site.php:375
msgid "Multi user instance"
msgstr "مثيل متعدد المستخدمين"
#: src/Module/Admin/Site.php:469
#: src/Module/Admin/Site.php:402
msgid "Closed"
msgstr "مغلق"
#: src/Module/Admin/Site.php:470
#: src/Module/Admin/Site.php:403
msgid "Requires approval"
msgstr "تتطلب الحصول على موافقة"
#: src/Module/Admin/Site.php:471
#: src/Module/Admin/Site.php:404
msgid "Open"
msgstr "افتح"
#: src/Module/Admin/Site.php:475 src/Module/Install.php:222
#: src/Module/Admin/Site.php:408 src/Module/Install.php:222
msgid "No SSL policy, links will track page SSL state"
msgstr ""
#: src/Module/Admin/Site.php:476 src/Module/Install.php:223
#: src/Module/Admin/Site.php:409 src/Module/Install.php:223
msgid "Force all links to use SSL"
msgstr "فرض استخدام الروابط ل SSL"
#: src/Module/Admin/Site.php:477 src/Module/Install.php:224
#: src/Module/Admin/Site.php:410 src/Module/Install.php:224
msgid "Self-signed certificate, use SSL for local links only (discouraged)"
msgstr ""
#: src/Module/Admin/Site.php:481
#: src/Module/Admin/Site.php:414
msgid "Don't check"
msgstr "لا تتحقق"
#: src/Module/Admin/Site.php:482
#: src/Module/Admin/Site.php:415
msgid "check the stable version"
msgstr "تحقق من الإصدار المستقر"
#: src/Module/Admin/Site.php:483
#: src/Module/Admin/Site.php:416
msgid "check the development version"
msgstr "تحقق من الإصدار التطويري"
#: src/Module/Admin/Site.php:487
#: src/Module/Admin/Site.php:420
msgid "none"
msgstr "لا شيﺀ"
#: src/Module/Admin/Site.php:488
#: src/Module/Admin/Site.php:421
msgid "Local contacts"
msgstr "المُتراسِلون المحليون"
#: src/Module/Admin/Site.php:489
#: src/Module/Admin/Site.php:422
msgid "Interactors"
msgstr "المتفاعلون"
#: src/Module/Admin/Site.php:499 src/Module/BaseAdmin.php:90
#: src/Module/Admin/Site.php:432 src/Module/BaseAdmin.php:90
msgid "Site"
msgstr "موقع"
#: src/Module/Admin/Site.php:500
#: src/Module/Admin/Site.php:433
msgid "General Information"
msgstr "معلومات عامة"
#: src/Module/Admin/Site.php:502
#: src/Module/Admin/Site.php:435
msgid "Republish users to directory"
msgstr "أعد نشر المستخدمين في الدليل"
#: src/Module/Admin/Site.php:503 src/Module/Register.php:152
#: src/Module/Admin/Site.php:436 src/Module/Register.php:152
msgid "Registration"
msgstr "التسجيل"
#: src/Module/Admin/Site.php:504
#: src/Module/Admin/Site.php:437
msgid "File upload"
msgstr "رفع الملف"
#: src/Module/Admin/Site.php:505
#: src/Module/Admin/Site.php:438
msgid "Policies"
msgstr "السياسات"
#: src/Module/Admin/Site.php:507
#: src/Module/Admin/Site.php:440
msgid "Auto Discovered Contact Directory"
msgstr "دليل المتراسلين المكتشفين تلقائيًا"
#: src/Module/Admin/Site.php:508
#: src/Module/Admin/Site.php:441
msgid "Performance"
msgstr "الأداء"
#: src/Module/Admin/Site.php:509
#: src/Module/Admin/Site.php:442
msgid "Worker"
msgstr "مهمة"
#: src/Module/Admin/Site.php:510
#: src/Module/Admin/Site.php:443
msgid "Message Relay"
msgstr "ترحيل الرسالة"
#: src/Module/Admin/Site.php:511
#: src/Module/Admin/Site.php:444
msgid ""
"Use the command \"console relay\" in the command line to add or remove "
"relays."
msgstr ""
#: src/Module/Admin/Site.php:512
#: src/Module/Admin/Site.php:445
msgid "The system is not subscribed to any relays at the moment."
msgstr "هذا الخادم ليس مشترك في أي مرحلات حاليًا."
#: src/Module/Admin/Site.php:513
#: src/Module/Admin/Site.php:446
msgid "The system is currently subscribed to the following relays:"
msgstr "هذا الخادم مشترك حاليًا في المرحلات التالية:"
#: src/Module/Admin/Site.php:515
msgid "Relocate Instance"
msgstr "انقل المثيل"
#: src/Module/Admin/Site.php:448
msgid "Relocate Node"
msgstr ""
#: src/Module/Admin/Site.php:516
#: src/Module/Admin/Site.php:449
msgid ""
"<strong>Warning!</strong> Advanced function. Could make this server "
"unreachable."
msgstr "<strong>تحذير!</strong> وظيفة متقدمة. يمكن أن تجعل هذا الخادم غير قابل للوصول."
"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:520
#: src/Module/Admin/Site.php:450
msgid "(Friendica directory)# bin/console relocate https://newdomain.com"
msgstr ""
#: src/Module/Admin/Site.php:454
msgid "Site name"
msgstr "اسم الموقع"
#: src/Module/Admin/Site.php:521
#: src/Module/Admin/Site.php:455
msgid "Sender Email"
msgstr "بريد المرسل"
#: src/Module/Admin/Site.php:521
#: src/Module/Admin/Site.php:455
msgid ""
"The email address your server shall use to send notification emails from."
msgstr "عنوان البريد الإلكتروني الذي سيستخدمه الخادم لإرسال رسائل التنبيه."
#: src/Module/Admin/Site.php:522
#: src/Module/Admin/Site.php:456
msgid "Name of the system actor"
msgstr "اسم حساب النظام"
#: src/Module/Admin/Site.php:522
#: src/Module/Admin/Site.php:456
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 "اسم حساب النظام الداخلي المستخدم لتنفيذ طلبات ActivityPub. يجب أن لا يكون هذا الاسم محجوز. إذا عُين لا يمكن تغييره."
#: src/Module/Admin/Site.php:523
#: src/Module/Admin/Site.php:457
msgid "Banner/Logo"
msgstr "اللافتة/الشعار"
#: src/Module/Admin/Site.php:524
#: src/Module/Admin/Site.php:458
msgid "Email Banner/Logo"
msgstr "شعار\\لافتة البريد الإلكتروني"
#: src/Module/Admin/Site.php:525
#: src/Module/Admin/Site.php:459
msgid "Shortcut icon"
msgstr "أيقونة الاختصار"
#: src/Module/Admin/Site.php:525
#: src/Module/Admin/Site.php:459
msgid "Link to an icon that will be used for browsers."
msgstr "رابط إلى أيقونة سيتم استخدامها للمتصفحات."
#: src/Module/Admin/Site.php:526
#: src/Module/Admin/Site.php:460
msgid "Touch icon"
msgstr "أيقونة الأجهزة اللمسية"
#: src/Module/Admin/Site.php:526
#: src/Module/Admin/Site.php:460
msgid "Link to an icon that will be used for tablets and mobiles."
msgstr "رابط إلى أيقونة سيتم استخدامها للأجهزة اللوحية والهواتف."
#: src/Module/Admin/Site.php:527
#: src/Module/Admin/Site.php:461
msgid "Additional Info"
msgstr "معلومات إضافية"
#: src/Module/Admin/Site.php:527
#: src/Module/Admin/Site.php:461
#, php-format
msgid ""
"For public servers: you can add additional information here that will be "
"listed at %s/servers."
msgstr "للخوادم العامة: يمكنك إضافة معلومات إضافية لتدرج في %s/servers."
#: src/Module/Admin/Site.php:528
#: src/Module/Admin/Site.php:462
msgid "System language"
msgstr "لغة النظام"
#: src/Module/Admin/Site.php:529
#: src/Module/Admin/Site.php:463
msgid "System theme"
msgstr "سمة النظام"
#: src/Module/Admin/Site.php:529
#: src/Module/Admin/Site.php:463
#, php-format
msgid ""
"Default system theme - may be over-ridden by user profiles - <a "
"href=\"/admin/themes\" id=\"cnftheme\">Change default theme settings</a>"
msgstr "مظهر الموقع الافتراضي يختلف بناءً على الملف الشخصي الذي تمت زيارته - <a href=\"/admin/themes\" id=\"cnftheme\"> غيّر إعدادات السمة الافتراضية</a>"
"Default system theme - may be over-ridden by user profiles - <a href=\"%s\" "
"id=\"cnftheme\">Change default theme settings</a>"
msgstr ""
#: src/Module/Admin/Site.php:530
#: src/Module/Admin/Site.php:464
msgid "Mobile system theme"
msgstr "سمة الهاتف"
#: src/Module/Admin/Site.php:530
#: src/Module/Admin/Site.php:464
msgid "Theme for mobile devices"
msgstr "سمة للأجهزة المحمولة"
#: src/Module/Admin/Site.php:531 src/Module/Install.php:232
#: src/Module/Admin/Site.php:465 src/Module/Install.php:232
msgid "SSL link policy"
msgstr "سياسة روابط SSL"
#: src/Module/Admin/Site.php:531 src/Module/Install.php:234
#: src/Module/Admin/Site.php:465 src/Module/Install.php:234
msgid "Determines whether generated links should be forced to use SSL"
msgstr "يحدد ما إذا كان ينبغي إجبار الروابط المولدة على استخدام SSL"
#: src/Module/Admin/Site.php:532
#: src/Module/Admin/Site.php:466
msgid "Force SSL"
msgstr "فرض SSL"
#: src/Module/Admin/Site.php:532
#: src/Module/Admin/Site.php:466
msgid ""
"Force all Non-SSL requests to SSL - Attention: on some systems it could lead"
" to endless loops."
msgstr "أعد توجيه جميع الطلبات غير المشفرة إلى طلبات SSL. تحذير: في بعض الأنظمة يمكن أن يؤدي هذا إلى حلقات إعادة توجيه لا نهائية."
#: src/Module/Admin/Site.php:533
#: src/Module/Admin/Site.php:467
msgid "Show help entry from navigation menu"
msgstr "أظهر المساعدة في قائمة التصفح"
#: src/Module/Admin/Site.php:533
#: src/Module/Admin/Site.php:467
msgid ""
"Displays the menu entry for the Help pages from the navigation menu. It is "
"always accessible by calling /help directly."
msgstr "إظهار المساعدة في قائمة التصفح. تظل المساعدة قابلة للوصول من خلال الانتقال إلى /help مباشرة."
#: src/Module/Admin/Site.php:534
#: src/Module/Admin/Site.php:468
msgid "Single user instance"
msgstr "مثيل لمستخدم وحيد"
#: src/Module/Admin/Site.php:534
#: src/Module/Admin/Site.php:468
msgid "Make this instance multi-user or single-user for the named user"
msgstr "اجعل هذا المثيل إما لمستخدم واحد أولعدّة مستخدمين"
#: src/Module/Admin/Site.php:536
#: src/Module/Admin/Site.php:470
msgid "Maximum image size"
msgstr "الحجم الأقصى للصورة"
#: src/Module/Admin/Site.php:536
#: src/Module/Admin/Site.php:470
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "حد حجم الصورة المرفوعة بالبايت. الافتراضي هو 0 والذي يعني حجمًا غير محدود."
#: src/Module/Admin/Site.php:537
#: src/Module/Admin/Site.php:471
msgid "Maximum image length"
msgstr "الطول الأقصى للصورة"
#: src/Module/Admin/Site.php:537
#: src/Module/Admin/Site.php:471
msgid ""
"Maximum length in pixels of the longest side of uploaded images. Default is "
"-1, which means no limits."
msgstr "حد حجم الصورة المرفوعة بالبيكسل. الافتراضي هو 1- والذي يعني حجمًا غير محدود."
#: src/Module/Admin/Site.php:538
#: src/Module/Admin/Site.php:472
msgid "JPEG image quality"
msgstr "جودة صور JPEG"
#: src/Module/Admin/Site.php:538
#: src/Module/Admin/Site.php:472
msgid ""
"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
"100, which is full quality."
msgstr "سيتم حفظ ملفات JPEG المرفوعة بنسبة جودة [0-100]. القيمة الافتراضية هي 100 وهي جودة الأصلية للملف."
#: src/Module/Admin/Site.php:540
#: src/Module/Admin/Site.php:474
msgid "Register policy"
msgstr "سياسات التسجيل"
#: src/Module/Admin/Site.php:541
#: src/Module/Admin/Site.php:475
msgid "Maximum Daily Registrations"
msgstr "الحد اليومي للتسجيل"
#: src/Module/Admin/Site.php:541
#: src/Module/Admin/Site.php:475
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:542
#: src/Module/Admin/Site.php:476
msgid "Register text"
msgstr "نص صفحة التسجيل"
#: src/Module/Admin/Site.php:542
#: src/Module/Admin/Site.php:476
msgid ""
"Will be displayed prominently on the registration page. You can use BBCode "
"here."
msgstr "ستعرض في صفحة التسجيل. يمكنك استخدام BBCode."
#: src/Module/Admin/Site.php:543
#: src/Module/Admin/Site.php:477
msgid "Forbidden Nicknames"
msgstr "الألقاب المحظورة"
#: src/Module/Admin/Site.php:543
#: src/Module/Admin/Site.php:477
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:544
#: src/Module/Admin/Site.php:478
msgid "Accounts abandoned after x days"
msgstr "الحسابات المهجورة بعد x يوم"
#: src/Module/Admin/Site.php:544
#: src/Module/Admin/Site.php:478
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "من أجل صونِ موارد النظام سنوقف الاستطلاع عن الحسابات المهجورة من المواقع البعيدة. ضع 0 لإيقاف هذه الوظيفة."
#: src/Module/Admin/Site.php:545
#: src/Module/Admin/Site.php:479
msgid "Allowed friend domains"
msgstr "النطاقات المسموحة"
#: src/Module/Admin/Site.php:545
#: src/Module/Admin/Site.php:479
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:546
#: src/Module/Admin/Site.php:480
msgid "Allowed email domains"
msgstr "نطاقات البريد الإلكتروني المسموحة"
#: src/Module/Admin/Site.php:546
#: src/Module/Admin/Site.php:480
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:547
#: src/Module/Admin/Site.php:481
msgid "No OEmbed rich content"
msgstr ""
#: src/Module/Admin/Site.php:547
#: src/Module/Admin/Site.php:481
msgid ""
"Don't show the rich content (e.g. embedded PDF), except from the domains "
"listed below."
msgstr ""
#: src/Module/Admin/Site.php:548
#: src/Module/Admin/Site.php:482
msgid "Trusted third-party domains"
msgstr "نطاقات الخارجية الموثوق بها"
#: src/Module/Admin/Site.php:548
#: src/Module/Admin/Site.php:482
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 "قائمة مفصولة بفواصل من النطاقات التي يُسمح بتضمين محتواها في المشاركات مثل OEmbed. يُسمح أيضًا بجميع النطاقات الفرعية التابعة لها."
#: src/Module/Admin/Site.php:549
#: src/Module/Admin/Site.php:483
msgid "Block public"
msgstr "احجب المشاركات العلنية"
#: src/Module/Admin/Site.php:549
#: src/Module/Admin/Site.php:483
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:550
#: src/Module/Admin/Site.php:484
msgid "Force publish"
msgstr "افرض النشر"
#: src/Module/Admin/Site.php:550
#: src/Module/Admin/Site.php:484
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "أشر لفرض إدراج جميع الملفات الشخصية في دليل الموقع."
#: src/Module/Admin/Site.php:550
#: src/Module/Admin/Site.php:484
msgid "Enabling this may violate privacy laws like the GDPR"
msgstr "تفعيله قد ينتهك قوانين حماية الخصوصية مثل GDPR"
#: src/Module/Admin/Site.php:551
#: src/Module/Admin/Site.php:485
msgid "Global directory URL"
msgstr "رابط الدليل العالمي"
#: src/Module/Admin/Site.php:551
#: src/Module/Admin/Site.php:485
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:552
#: src/Module/Admin/Site.php:486
msgid "Private posts by default for new users"
msgstr "جعل المشاركات خاصة للمستخدمين الجدد افتراضيًا"
#: src/Module/Admin/Site.php:552
#: src/Module/Admin/Site.php:486
msgid ""
"Set default post permissions for all new members to the default privacy "
"group rather than public."
msgstr "تعيين أذونات النشر الافتراضية لجميع الأعضاء الجدد إلى خاصة بدل العلنية."
#: src/Module/Admin/Site.php:553
#: src/Module/Admin/Site.php:487
msgid "Don't include post content in email notifications"
msgstr "لا تضمن محتويات المشاركات في تنبيهات البريد الإلكتروني"
#: src/Module/Admin/Site.php:553
#: src/Module/Admin/Site.php:487
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:554
#: src/Module/Admin/Site.php:488
msgid "Disallow public access to addons listed in the apps menu."
msgstr "لا تسمح بالوصول العلني للإضافات المدرجة في قائمة التطبيقات."
#: src/Module/Admin/Site.php:554
#: src/Module/Admin/Site.php:488
msgid ""
"Checking this box will restrict addons listed in the apps menu to members "
"only."
msgstr "تأشير هذا الخِيار سيجعل الوصول إلى الإضافات في قائمة التطبيقات للأعضاء فقط."
#: src/Module/Admin/Site.php:555
#: src/Module/Admin/Site.php:489
msgid "Don't embed private images in posts"
msgstr "لا تضمن الصور الخاصة في المشاركات"
#: src/Module/Admin/Site.php:555
#: src/Module/Admin/Site.php:489
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 "
@ -5935,11 +5553,11 @@ msgid ""
"while."
msgstr "لا تستبدل الصور الخاصة المستضافة محليًا في المشاركات بنسخة مضمنة ، لأن هذا يعني أن المتراسلين الذين يتلقون المشاركات التي تحوي تلك الصور ستحتاج إلى مصادقة لرؤية كل صورة ، ما قد يستغرق بعض الوقت."
#: src/Module/Admin/Site.php:556
#: src/Module/Admin/Site.php:490
msgid "Explicit Content"
msgstr "محتوى حساس"
#: src/Module/Admin/Site.php:556
#: src/Module/Admin/Site.php:490
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 "
@ -5948,257 +5566,257 @@ msgid ""
"will be shown at the user registration page."
msgstr "عيّن هذا الخيار للإعلان عن أن عقدتك تحتوي محتوى حساس قد لا يكون مناسباً للقصر. وسوف تنشر هذه المعلومات في معلومات العقدة وصفحة التسجيل، ويستخدم هذا الخيار في الدليل العالمي، فأثناء استعراض هذه العقدة في الدليل ستظهر لهم هذه المعلومة."
#: src/Module/Admin/Site.php:557
#: src/Module/Admin/Site.php:491
msgid "Proxify external content"
msgstr "توجيه المحتوى الخارجي عبر الوكيل"
#: src/Module/Admin/Site.php:557
#: src/Module/Admin/Site.php:491
msgid ""
"Route external content via the proxy functionality. This is used for example"
" for some OEmbed accesses and in some other rare cases."
msgstr "توجيه المحتوى الخارجي عن طريق وميل. يستخدم هذا على سبيل المثال وصول OEmbed وفي بعض الحالات النادرة الأخرى."
#: src/Module/Admin/Site.php:558
#: src/Module/Admin/Site.php:492
msgid "Cache contact avatars"
msgstr ""
#: src/Module/Admin/Site.php:558
#: src/Module/Admin/Site.php:492
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:559
#: src/Module/Admin/Site.php:493
msgid "Allow Users to set remote_self"
msgstr "اسمح للمستخدمين بتعيين remote_self"
#: src/Module/Admin/Site.php:559
#: src/Module/Admin/Site.php:493
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 "يتيح تأشير هذا المربع للميتخدمين تعريف مل المتراسلين علئ أنهم remote_self في مربع حوار اصلاح المتراسلين. سيؤدي تنشيط هذه الميزة على متراسل إلى نسخ جميع منشوراته في دفق المستخدم."
#: src/Module/Admin/Site.php:560
#: src/Module/Admin/Site.php:494
msgid "Enable multiple registrations"
msgstr "فعّل تعدد التسجيل"
#: src/Module/Admin/Site.php:560
#: src/Module/Admin/Site.php:494
msgid "Enable users to register additional accounts for use as pages."
msgstr "يمكن المستخدمين من تسجيل حسابات إضافية لتستخدم كصفحات."
#: src/Module/Admin/Site.php:561
#: src/Module/Admin/Site.php:495
msgid "Enable OpenID"
msgstr "فعّل OpenID"
#: src/Module/Admin/Site.php:561
#: src/Module/Admin/Site.php:495
msgid "Enable OpenID support for registration and logins."
msgstr "فعّل دعم OpenID للتسجيل والولوج."
#: src/Module/Admin/Site.php:562
#: src/Module/Admin/Site.php:496
msgid "Enable Fullname check"
msgstr "افرض استخدام الأسماء الكاملة"
#: src/Module/Admin/Site.php:562
#: src/Module/Admin/Site.php:496
msgid ""
"Enable check to only allow users to register with a space between the first "
"name and the last name in their full name."
msgstr "يفرض على المستخدمين تضمين مسافة واحدة في اسم المستخدم الخاص بهم بين الاسم الأول والاسم الأخير."
#: src/Module/Admin/Site.php:563
#: src/Module/Admin/Site.php:497
msgid "Community pages for visitors"
msgstr "عرض صفحة المجتمع للزوار"
#: src/Module/Admin/Site.php:563
#: src/Module/Admin/Site.php:497
msgid ""
"Which community pages should be available for visitors. Local users always "
"see both pages."
msgstr "صفحات المجتمع المتاحة للزوار. المستخدمون المحليون يمكنهم مشاهدة كلا النوعين."
#: src/Module/Admin/Site.php:564
#: src/Module/Admin/Site.php:498
msgid "Posts per user on community page"
msgstr "حد المشاركات لكل مستخدم في صفحة المجتمع"
#: src/Module/Admin/Site.php:564
#: src/Module/Admin/Site.php:498
msgid ""
"The maximum number of posts per user on the community page. (Not valid for "
"\"Global Community\")"
msgstr "الحد الأقصى لعدد المشاركات لكل مستخدم في صفحة المجتمع المحلي"
#: src/Module/Admin/Site.php:566
#: src/Module/Admin/Site.php:500
msgid "Enable Mail support"
msgstr "فعّل دعم البريد الإلكتروني"
#: src/Module/Admin/Site.php:566
#: src/Module/Admin/Site.php:500
msgid ""
"Enable built-in mail support to poll IMAP folders and to reply via mail."
msgstr ""
#: src/Module/Admin/Site.php:567
#: src/Module/Admin/Site.php:501
msgid ""
"Mail support can't be enabled because the PHP IMAP module is not installed."
msgstr ""
#: src/Module/Admin/Site.php:568
#: src/Module/Admin/Site.php:502
msgid "Enable OStatus support"
msgstr ""
#: src/Module/Admin/Site.php:568
#: src/Module/Admin/Site.php:502
msgid ""
"Enable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
"communications in OStatus are public."
msgstr ""
#: src/Module/Admin/Site.php:570
#: src/Module/Admin/Site.php:504
msgid ""
"Diaspora support can't be enabled because Friendica was installed into a sub"
" directory."
msgstr ""
#: src/Module/Admin/Site.php:571
#: src/Module/Admin/Site.php:505
msgid "Enable Diaspora support"
msgstr ""
#: src/Module/Admin/Site.php:571
#: src/Module/Admin/Site.php:505
msgid ""
"Enable built-in Diaspora network compatibility for communicating with "
"diaspora servers."
msgstr ""
#: src/Module/Admin/Site.php:572
#: src/Module/Admin/Site.php:506
msgid "Verify SSL"
msgstr ""
#: src/Module/Admin/Site.php:572
#: src/Module/Admin/Site.php:506
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:573
#: src/Module/Admin/Site.php:507
msgid "Proxy user"
msgstr "مستخدم الوكيل"
#: src/Module/Admin/Site.php:573
#: src/Module/Admin/Site.php:507
msgid "User name for the proxy server."
msgstr ""
#: src/Module/Admin/Site.php:574
#: src/Module/Admin/Site.php:508
msgid "Proxy URL"
msgstr "رابط الوكيل"
#: src/Module/Admin/Site.php:574
#: src/Module/Admin/Site.php:508
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:575
#: src/Module/Admin/Site.php:509
msgid "Network timeout"
msgstr "انتهت مهلة الاتصال بالشبكة"
#: src/Module/Admin/Site.php:575
#: src/Module/Admin/Site.php:509
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "القيمة بالثواني. تعيينها لـ 0 يعني مهلة غير محدودة (غير مستحسن)."
#: src/Module/Admin/Site.php:576
#: src/Module/Admin/Site.php:510
msgid "Maximum Load Average"
msgstr ""
#: src/Module/Admin/Site.php:576
#: src/Module/Admin/Site.php:510
#, php-format
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default %d."
msgstr ""
#: src/Module/Admin/Site.php:577
#: src/Module/Admin/Site.php:511
msgid "Minimal Memory"
msgstr "الحد الأدنى للذاكرة"
#: src/Module/Admin/Site.php:577
#: src/Module/Admin/Site.php:511
msgid ""
"Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
"default 0 (deactivated)."
msgstr "الحد الأدنى لذاكرة الحرة للمهمة بالميغابايت. تحتاج إذن الوصول إلى /proc/meminfo - الافتراضي 0 (معطل)."
#: src/Module/Admin/Site.php:578
#: src/Module/Admin/Site.php:512
msgid "Periodically optimize tables"
msgstr "تحسين الجداول بصفة دورية"
#: src/Module/Admin/Site.php:578
#: src/Module/Admin/Site.php:512
msgid "Periodically optimize tables like the cache and the workerqueue"
msgstr "حسن بانتظام بعض جداول قاعدة البيانات المستخدمة على نطاق واسع مثل ذاكرة التخزين المؤقت أو الأقفال أو الجلسة أو طابور المهام"
#: src/Module/Admin/Site.php:580
#: src/Module/Admin/Site.php:514
msgid "Discover followers/followings from contacts"
msgstr "اكتشف قائمة متابِعي/متابَعي متراسليك"
#: src/Module/Admin/Site.php:580
#: src/Module/Admin/Site.php:514
msgid ""
"If enabled, contacts are checked for their followers and following contacts."
msgstr "اذا فُعل سيقوم هذا الخادم بتجميع قائمة متابِعي ومتابَعي متراسليك."
#: src/Module/Admin/Site.php:581
#: src/Module/Admin/Site.php:515
msgid "None - deactivated"
msgstr "لا شيء - معطل"
#: src/Module/Admin/Site.php:582
#: src/Module/Admin/Site.php:516
msgid ""
"Local contacts - contacts of our local contacts are discovered for their "
"followers/followings."
msgstr "المتراسلون المحليون - متراسلوا مستخدمي هذا الخادم."
#: src/Module/Admin/Site.php:583
#: src/Module/Admin/Site.php:517
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:585
#: src/Module/Admin/Site.php:519
msgid "Synchronize the contacts with the directory server"
msgstr "زامن المتراسلين مع خادم الدليل"
#: src/Module/Admin/Site.php:585
#: src/Module/Admin/Site.php:519
msgid ""
"if enabled, the system will check periodically for new contacts on the "
"defined directory server."
msgstr "إذا فُعل سيقوم النظام بالتحقق دوريا للبحث عن متراسلين جدد على خادم الدليل المحدد."
#: src/Module/Admin/Site.php:587
#: src/Module/Admin/Site.php:521
msgid "Days between requery"
msgstr "المهلة بالأيام بين الطلبات"
#: src/Module/Admin/Site.php:587
#: src/Module/Admin/Site.php:521
msgid "Number of days after which a server is requeried for his contacts."
msgstr ""
#: src/Module/Admin/Site.php:588
#: src/Module/Admin/Site.php:522
msgid "Discover contacts from other servers"
msgstr "اكتشف متراسلين من خوادم أخرى"
#: src/Module/Admin/Site.php:588
#: src/Module/Admin/Site.php:522
msgid ""
"Periodically query other servers for contacts. The system queries Friendica,"
" Mastodon and Hubzilla servers."
msgstr "يجلب دوريا متراسلين من خوادم أخرى. يُطبّق على خوادم فرنديكا وماستدون وهوبزيلا."
#: src/Module/Admin/Site.php:589
#: src/Module/Admin/Site.php:523
msgid "Search the local directory"
msgstr "ابحث في الدليل المحلي"
#: src/Module/Admin/Site.php:589
#: src/Module/Admin/Site.php:523
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:591
#: src/Module/Admin/Site.php:525
msgid "Publish server information"
msgstr "انشر معلومات الخادم"
#: src/Module/Admin/Site.php:591
#: src/Module/Admin/Site.php:525
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 "
@ -6206,50 +5824,50 @@ msgid ""
" href=\"http://the-federation.info/\">the-federation.info</a> for details."
msgstr "إذا فعل ستنشر البيانات العامة للخادم وبيانات استخدامه. تحتوي هذه البيانات على اسم وإصدار الخادم ، وعدد المستخدمين الذين لهم ملف شخصي علني، وعدد المنشورات وقائمة الموصّلات والموافيق النشطة. راجع <a href=\"http://the-federation.info/\">federation.info</a> للحصول على التفاصيل."
#: src/Module/Admin/Site.php:593
#: src/Module/Admin/Site.php:527
msgid "Check upstream version"
msgstr "تحقق من الاصدار المنبعي"
#: src/Module/Admin/Site.php:593
#: src/Module/Admin/Site.php:527
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:594
#: src/Module/Admin/Site.php:528
msgid "Suppress Tags"
msgstr "اخف الوسوم"
#: src/Module/Admin/Site.php:594
#: src/Module/Admin/Site.php:528
msgid "Suppress showing a list of hashtags at the end of the posting."
msgstr "اخف قائمة الوسوم من أسفل المشاركة."
#: src/Module/Admin/Site.php:595
#: src/Module/Admin/Site.php:529
msgid "Clean database"
msgstr "امسح قاعدة البيانات"
#: src/Module/Admin/Site.php:595
#: src/Module/Admin/Site.php:529
msgid ""
"Remove old remote items, orphaned database records and old content from some"
" other helper tables."
msgstr "يزيل العناصر البعيدة القديمة والسجلات اليتيمة والمحتوى القديم من بعض الجداول المساعدة."
#: src/Module/Admin/Site.php:596
#: src/Module/Admin/Site.php:530
msgid "Lifespan of remote items"
msgstr "عمر العناصر البعيدة"
#: src/Module/Admin/Site.php:596
#: src/Module/Admin/Site.php:530
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 "إذا كان تنظيف قاعدة البيانات مفعلًا ، فإن هذه القيمة تمثل المهلة بالأيام لحذف العناصر البعيدة. يتم دائمًا الاحتفاظ بالعناصر المحلية والمفضلة والمؤرشفة. أدخل 0 لتعطيله."
#: src/Module/Admin/Site.php:597
#: src/Module/Admin/Site.php:531
msgid "Lifespan of unclaimed items"
msgstr ""
#: src/Module/Admin/Site.php:597
#: src/Module/Admin/Site.php:531
msgid ""
"When the database cleanup is enabled, this defines the days after which "
"unclaimed remote items (mostly content from the relay) will be deleted. "
@ -6257,144 +5875,134 @@ msgid ""
"items if set to 0."
msgstr ""
#: src/Module/Admin/Site.php:598
#: src/Module/Admin/Site.php:532
msgid "Lifespan of raw conversation data"
msgstr ""
#: src/Module/Admin/Site.php:598
#: src/Module/Admin/Site.php:532
msgid ""
"The conversation data is used for ActivityPub and OStatus, 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:599
#: src/Module/Admin/Site.php:533
msgid "Maximum numbers of comments per post"
msgstr "حد عدد التعليقات لكل مشاركة"
#: src/Module/Admin/Site.php:599
#: src/Module/Admin/Site.php:533
msgid "How much comments should be shown for each post? Default value is 100."
msgstr "عدد التعليقات التي تعرض لكل مشاركة؟ القيمة الافتراضية هي 100."
#: src/Module/Admin/Site.php:600
#: src/Module/Admin/Site.php:534
msgid "Maximum numbers of comments per post on the display page"
msgstr "الحد الأقصى لعدد التعليقات لكل محادثة في صفحة العرض (/display)"
#: src/Module/Admin/Site.php:600
#: src/Module/Admin/Site.php:534
msgid ""
"How many comments should be shown on the single view for each post? Default "
"value is 1000."
msgstr "عدد التعليقات المعروضة في سياق المشاركة، القيمة الافتراضية هي 1000."
#: src/Module/Admin/Site.php:601
#: src/Module/Admin/Site.php:535
msgid "Temp path"
msgstr "مسار التخزين المؤقت"
#: src/Module/Admin/Site.php:601
#: src/Module/Admin/Site.php:535
msgid ""
"If you have a restricted system where the webserver can't access the system "
"temp path, enter another path here."
msgstr "إذا كان نظامك مقيد حيث لا يستطيع خادم الويب الوصول إلى مسار مجلد التخزين المؤقت (temp)، أدخل مسار آخر هنا."
#: src/Module/Admin/Site.php:602
#: src/Module/Admin/Site.php:536
msgid "Only search in tags"
msgstr "ابحث في الوسوم فقط"
#: src/Module/Admin/Site.php:602
#: src/Module/Admin/Site.php:536
msgid "On large systems the text search can slow down the system extremely."
msgstr "في النّظم الكبيرة، يمكن أن يؤدي البحث عن النصوص إلى إبطاء النظام."
#: src/Module/Admin/Site.php:604
msgid "New base url"
msgstr "رابط أساسي جديد"
#: src/Module/Admin/Site.php:604
msgid ""
"Change base url for this server. Sends relocate message to all Friendica and"
" Diaspora* contacts of all users."
msgstr ""
#: src/Module/Admin/Site.php:606
#: src/Module/Admin/Site.php:538
msgid "Maximum number of parallel workers"
msgstr "الحد الأقصى لعدد المهام"
#: src/Module/Admin/Site.php:606
#: src/Module/Admin/Site.php:538
#, 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:607
#: src/Module/Admin/Site.php:539
msgid "Enable fastlane"
msgstr ""
#: src/Module/Admin/Site.php:607
#: src/Module/Admin/Site.php:539
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:609
#: src/Module/Admin/Site.php:541
msgid "Direct relay transfer"
msgstr ""
#: src/Module/Admin/Site.php:609
#: src/Module/Admin/Site.php:541
msgid ""
"Enables the direct transfer to other servers without using the relay servers"
msgstr ""
#: src/Module/Admin/Site.php:610
#: src/Module/Admin/Site.php:542
msgid "Relay scope"
msgstr ""
#: src/Module/Admin/Site.php:610
#: src/Module/Admin/Site.php:542
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:610 src/Module/Contact/Profile.php:273
#: src/Module/Admin/Site.php:542 src/Module/Contact/Profile.php:273
#: src/Module/Settings/TwoFactor/Index.php:118
msgid "Disabled"
msgstr "معطّل"
#: src/Module/Admin/Site.php:610
#: src/Module/Admin/Site.php:542
msgid "all"
msgstr "الكل"
#: src/Module/Admin/Site.php:610
#: src/Module/Admin/Site.php:542
msgid "tags"
msgstr "الوسوم"
#: src/Module/Admin/Site.php:611
#: src/Module/Admin/Site.php:543
msgid "Server tags"
msgstr "وسوم الخادم"
#: src/Module/Admin/Site.php:611
#: src/Module/Admin/Site.php:543
msgid "Comma separated list of tags for the \"tags\" subscription."
msgstr ""
#: src/Module/Admin/Site.php:612
#: src/Module/Admin/Site.php:544
msgid "Deny Server tags"
msgstr "الوسوم المرفوضة"
#: src/Module/Admin/Site.php:612
#: src/Module/Admin/Site.php:544
msgid "Comma separated list of tags that are rejected."
msgstr "قائمة بالوسوم المرفوضة مفصول بفاصلة."
#: src/Module/Admin/Site.php:613
#: src/Module/Admin/Site.php:545
msgid "Allow user tags"
msgstr "اسمح بوسوم المستخدمين"
#: src/Module/Admin/Site.php:613
#: src/Module/Admin/Site.php:545
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:616
#: src/Module/Admin/Site.php:548
msgid "Start Relocation"
msgstr "ابدأ النقل"
@ -6444,12 +6052,12 @@ msgstr ""
msgid "Database (legacy)"
msgstr ""
#: src/Module/Admin/Summary.php:53
#: src/Module/Admin/Summary.php:54
#, php-format
msgid "Template engine (%s) error: %s"
msgstr ""
#: src/Module/Admin/Summary.php:57
#: src/Module/Admin/Summary.php:58
#, php-format
msgid ""
"Your DB still runs with MyISAM tables. You should change the engine type to "
@ -6460,7 +6068,7 @@ msgid ""
" an automatic conversion.<br />"
msgstr "تستخدم قاعدة البيانات جداول MYISAM. يجب عليك تغيير المحرك إلى InnoDB حيث أنه من المخطط أن يستخدم فرنديكا ميزات منوطة بـ InnoDB في المستقبل.راجع <a href=\"%s\"> هذا الدليل </a> لتحديث قاعدة البيانات الخاصة بك. يمكنك أيضًا تشغيل الأمر <tt>php bin/console.php dbstructure toinnodb</tt> في دليل الجذر لفرنديكا للتحويل التلقائي.<br />"
#: src/Module/Admin/Summary.php:62
#: src/Module/Admin/Summary.php:63
#, php-format
msgid ""
"Your DB still runs with InnoDB tables in the Antelope file format. You "
@ -6471,7 +6079,7 @@ msgid ""
" installation for an automatic conversion.<br />"
msgstr "تستخدم قاعدة البيانات جداول InnoDB بتنسيق Antelope. يجب عليك تغيير التنسيق إلى Barracuda حيث أن فرنديكا يستخدم ميزات منوطة بتنسيق Barracuda راجع <a href=\"%s\">هذا الدليل</a> لتحديث قاعدة البيانات. يمكنك أيضًا تشغيل الأمر <tt>php bin/console.php dbstructure toinnodb</tt> في دليل الجذر لفرنديكا للتحويل التلقائي.<br />"
#: src/Module/Admin/Summary.php:72
#: src/Module/Admin/Summary.php:73
#, php-format
msgid ""
"Your table_definition_cache is too low (%d). This can lead to the database "
@ -6479,39 +6087,39 @@ msgid ""
" to %d. See <a href=\"%s\">here</a> for more information.<br />"
msgstr ""
#: src/Module/Admin/Summary.php:82
#: src/Module/Admin/Summary.php:83
#, php-format
msgid ""
"There is a new version of Friendica available for download. Your current "
"version is %1$s, upstream version is %2$s"
msgstr "يتوفر إصدار جديد لفرنديكا. الإصدار الحالي هو %1$s والإصدار الجديد هو %2$s"
#: src/Module/Admin/Summary.php:91
#: src/Module/Admin/Summary.php:92
msgid ""
"The database update failed. Please run \"php bin/console.php dbstructure "
"update\" from the command line and have a look at the errors that might "
"appear."
msgstr "فشل تحديث قاعدة البيانات. رجاءً شغّل أمر \"php bin/console.php dbstructure update\" من سطر الأوامر وألق نظرة على الأخطاء التي قد تظهر."
#: src/Module/Admin/Summary.php:95
#: src/Module/Admin/Summary.php:96
msgid ""
"The last update failed. Please run \"php bin/console.php dbstructure "
"update\" from the command line and have a look at the errors that might "
"appear. (Some of the errors are possibly inside the logfile.)"
msgstr "فشل آخر تحديث لقاعدة البيانات. رجاءً شغّل أمر \"php bin/console.php dbstructure update\" من سطر الأوامر وألق نظرة على الأخطاء التي قد تظهر. (قد تجد بعض الأخطاء في ملف السجل)"
#: src/Module/Admin/Summary.php:100
#: src/Module/Admin/Summary.php:101
msgid "The worker was never executed. Please check your database structure!"
msgstr "لم يتم تنفيذ المهمة أبداً. يرجى التحقق من بنية قاعدة البيانات!"
#: src/Module/Admin/Summary.php:102
#: src/Module/Admin/Summary.php:103
#, php-format
msgid ""
"The last worker execution was on %s UTC. This is older than one hour. Please"
" check your crontab settings."
msgstr "تنفيذ آخر مهمة كان على %s UTC. هذا أقدم من ساعة. يرجى التحقق من إعدادات crontab."
#: src/Module/Admin/Summary.php:107
#: src/Module/Admin/Summary.php:108
#, php-format
msgid ""
"Friendica's configuration now is stored in config/local.config.php, please "
@ -6520,7 +6128,7 @@ msgid ""
"help with the transition."
msgstr ""
#: src/Module/Admin/Summary.php:111
#: src/Module/Admin/Summary.php:112
#, php-format
msgid ""
"Friendica's configuration now is stored in config/local.config.php, please "
@ -6529,7 +6137,7 @@ msgid ""
"page</a> for help with the transition."
msgstr ""
#: src/Module/Admin/Summary.php:117
#: src/Module/Admin/Summary.php:118
#, php-format
msgid ""
"<a href=\"%s\">%s</a> is not reachable on your system. This is a severe "
@ -6537,83 +6145,83 @@ msgid ""
"href=\"%s\">the installation page</a> for help."
msgstr ""
#: src/Module/Admin/Summary.php:135
#: src/Module/Admin/Summary.php:136
#, php-format
msgid "The logfile '%s' is not usable. No logging possible (error: '%s')"
msgstr "لا يمكن استخدام ملف السجل ''%s'. لا يمكن كتابة السجلات (خطأ: '%s')"
#: src/Module/Admin/Summary.php:149
#: src/Module/Admin/Summary.php:150
#, php-format
msgid ""
"The debug logfile '%s' is not usable. No logging possible (error: '%s')"
msgstr "لا يمكن استخدام ملف السجل الخاص بالتنقيح '%s'. لا يمكن كتابة السجلات (خطأ: '%s')"
#: src/Module/Admin/Summary.php:165
#: src/Module/Admin/Summary.php:166
#, php-format
msgid ""
"Friendica's system.basepath was updated from '%s' to '%s'. Please remove the"
" system.basepath from your db to avoid differences."
msgstr ""
#: src/Module/Admin/Summary.php:173
#: src/Module/Admin/Summary.php:174
#, php-format
msgid ""
"Friendica's current system.basepath '%s' is wrong and the config file '%s' "
"isn't used."
msgstr ""
#: src/Module/Admin/Summary.php:181
#: src/Module/Admin/Summary.php:182
#, php-format
msgid ""
"Friendica's current system.basepath '%s' is not equal to the config file "
"'%s'. Please fix your configuration."
msgstr ""
#: src/Module/Admin/Summary.php:188
#: src/Module/Admin/Summary.php:189
msgid "Normal Account"
msgstr "حساب عادي"
#: src/Module/Admin/Summary.php:189
#: src/Module/Admin/Summary.php:190
msgid "Automatic Follower Account"
msgstr ""
#: src/Module/Admin/Summary.php:190
#: src/Module/Admin/Summary.php:191
msgid "Public Forum Account"
msgstr "حساب منتدى عمومي"
#: src/Module/Admin/Summary.php:191
#: src/Module/Admin/Summary.php:192
msgid "Automatic Friend Account"
msgstr ""
#: src/Module/Admin/Summary.php:192
#: src/Module/Admin/Summary.php:193
msgid "Blog Account"
msgstr "حساب مدونة"
#: src/Module/Admin/Summary.php:193
#: src/Module/Admin/Summary.php:194
msgid "Private Forum Account"
msgstr "حساب منتدى خاص"
#: src/Module/Admin/Summary.php:213
#: src/Module/Admin/Summary.php:214
msgid "Message queues"
msgstr "طوابير الرسائل"
#: src/Module/Admin/Summary.php:219
#: src/Module/Admin/Summary.php:220
msgid "Server Settings"
msgstr "إعدادات الخادم"
#: src/Module/Admin/Summary.php:235
#: src/Module/Admin/Summary.php:236
msgid "Registered users"
msgstr "الأعضاء المسجلون"
#: src/Module/Admin/Summary.php:237
#: src/Module/Admin/Summary.php:238
msgid "Pending registrations"
msgstr "التسجيلات المعلقة"
#: src/Module/Admin/Summary.php:238
#: src/Module/Admin/Summary.php:239
msgid "Version"
msgstr "الإصدار"
#: src/Module/Admin/Summary.php:242
#: src/Module/Admin/Summary.php:243
msgid "Active addons"
msgstr "الإضافات النشطة"
@ -6641,7 +6249,7 @@ msgstr "لقطة شاشة"
msgid "Themes"
msgstr "السمات"
#: src/Module/Admin/Themes/Embed.php:79
#: src/Module/Admin/Themes/Embed.php:80
msgid "Unknown theme."
msgstr "سمة مجهولة."
@ -6933,11 +6541,6 @@ msgstr ""
msgid "Only starting posts can be muted"
msgstr ""
#: src/Module/Api/Mastodon/Statuses/Pin.php:50
#: src/Module/Api/Mastodon/Statuses/Unpin.php:50
msgid "Only starting posts can be pinned"
msgstr ""
#: src/Module/Api/Mastodon/Statuses/Reblog.php:53
#, php-format
msgid "Posts from %s can't be shared"
@ -6968,7 +6571,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 "لم يُعثر على العنصر."
@ -7046,7 +6649,7 @@ msgstr "تحقق من بصمة الويب"
msgid "Babel"
msgstr ""
#: src/Module/BaseAdmin.php:118 src/Module/Debug/ActivityPubConversion.php:138
#: src/Module/BaseAdmin.php:118 src/Module/Debug/ActivityPubConversion.php:142
msgid "ActivityPub Conversion"
msgstr "محادثة عبر ActivityPub"
@ -7111,12 +6714,12 @@ msgstr "المشاركات المقرر نشرها"
msgid "Tips for New Members"
msgstr "تلميحات للأعضاء الجدد"
#: src/Module/BaseSearch.php:68
#: src/Module/BaseSearch.php:69
#, php-format
msgid "People Search - %s"
msgstr "البحث عن أشخاص - %s"
#: src/Module/BaseSearch.php:78
#: src/Module/BaseSearch.php:79
#, php-format
msgid "Forum Search - %s"
msgstr "البحث عن منتديات - %s"
@ -7142,7 +6745,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 "تصدير البيانات الشخصية"
@ -7214,7 +6817,7 @@ msgstr "نظّم مجموعات متراسليك"
msgid "Search your contacts"
msgstr "ابحث في متراسليك"
#: src/Module/Contact.php:390 src/Module/Search/Index.php:191
#: src/Module/Contact.php:390 src/Module/Search/Index.php:192
#, php-format
msgid "Results for: %s"
msgstr "نتائج: %s"
@ -7385,7 +6988,7 @@ msgstr[5] "%s متراسل"
msgid "Error while sending poke, please retry."
msgstr ""
#: src/Module/Contact/Poke.php:148 src/Module/Search/Acl.php:54
#: src/Module/Contact/Poke.php:148 src/Module/Search/Acl.php:55
msgid "You must be logged in to use this module."
msgstr "يجب عليك الولوج لاستخدام هذه الوحدة."
@ -7689,8 +7292,8 @@ msgstr "تضمين"
msgid "Hide"
msgstr "اخف"
#: src/Module/Conversation/Community.php:137 src/Module/Search/Index.php:136
#: src/Module/Search/Index.php:178
#: src/Module/Conversation/Community.php:137 src/Module/Search/Index.php:137
#: src/Module/Search/Index.php:179
msgid "No results."
msgstr "لا نتائج."
@ -7717,36 +7320,44 @@ msgstr "لا توجد مثل هذه المجموعة"
msgid "Group: %s"
msgstr "المجموعة: %s"
#: src/Module/Conversation/Network.php:253
#: src/Module/Conversation/Network.php:255
msgid "Latest Activity"
msgstr "آخر نشاط"
#: src/Module/Conversation/Network.php:256
#: src/Module/Conversation/Network.php:258
msgid "Sort by latest activity"
msgstr "رتب حسب آخر نشاط"
#: src/Module/Conversation/Network.php:261
#: src/Module/Conversation/Network.php:263
msgid "Latest Posts"
msgstr "آخر المشاركات"
#: src/Module/Conversation/Network.php:264
#: src/Module/Conversation/Network.php:266
msgid "Sort by post received date"
msgstr "رتب حسب تاريخ استلام المشاركة"
#: src/Module/Conversation/Network.php:269
#: src/Module/Conversation/Network.php:271
msgid "Latest Creation"
msgstr ""
#: src/Module/Conversation/Network.php:274
msgid "Sort by post creation date"
msgstr ""
#: src/Module/Conversation/Network.php:279
#: src/Module/Settings/Profile/Index.php:227
msgid "Personal"
msgstr "نشاطي"
#: src/Module/Conversation/Network.php:272
#: src/Module/Conversation/Network.php:282
msgid "Posts that mention or involve you"
msgstr "المشاركات التي تذكرك أو تتعلق بك"
#: src/Module/Conversation/Network.php:277 src/Object/Post.php:341
#: src/Module/Conversation/Network.php:287 src/Object/Post.php:341
msgid "Starred"
msgstr "المفضلة"
#: src/Module/Conversation/Network.php:280
#: src/Module/Conversation/Network.php:290
msgid "Favourite Posts"
msgstr "المشاركات المفضلة"
@ -7769,15 +7380,15 @@ msgstr "مهيأ"
msgid "Activity"
msgstr "النشاط"
#: src/Module/Debug/ActivityPubConversion.php:118
#: src/Module/Debug/ActivityPubConversion.php:122
msgid "Object data"
msgstr "بيانات الكائن"
#: src/Module/Debug/ActivityPubConversion.php:125
#: src/Module/Debug/ActivityPubConversion.php:129
msgid "Result Item"
msgstr "النتيجة"
#: src/Module/Debug/ActivityPubConversion.php:139
#: src/Module/Debug/ActivityPubConversion.php:143
msgid "Source activity"
msgstr "نشاط المصدر"
@ -7957,12 +7568,12 @@ msgstr "HTML"
msgid "Twitter Source / Tweet URL (requires API key)"
msgstr ""
#: src/Module/Debug/Feed.php:50 src/Module/Filer/SaveTag.php:46
#: src/Module/Debug/Feed.php:51 src/Module/Filer/SaveTag.php:46
#: src/Module/Settings/Profile/Index.php:141
msgid "You must be logged in to use this module"
msgstr "يجب عليك الولوج لاستخدام هذه الوحدة"
#: src/Module/Debug/Feed.php:75
#: src/Module/Debug/Feed.php:76
msgid "Source URL"
msgstr "الرابط المصدري"
@ -8042,19 +7653,19 @@ msgstr "تنقل بين مختلف الهويات أو الصفحات (المج
msgid "Select an identity to manage: "
msgstr ""
#: src/Module/Directory.php:74
#: src/Module/Directory.php:75
msgid "No entries (some entries may be hidden)."
msgstr "لا توجد مدخلات (قد تكون بعض المدخلات مخفية)."
#: src/Module/Directory.php:90
#: src/Module/Directory.php:91
msgid "Find on this site"
msgstr "ابحث في هذا الموقع"
#: src/Module/Directory.php:92
#: src/Module/Directory.php:93
msgid "Results for:"
msgstr "نتائج:"
#: src/Module/Directory.php:94
#: src/Module/Directory.php:95
msgid "Site Directory"
msgstr "دليل الموقع"
@ -8383,29 +7994,29 @@ msgid ""
" administrator email. This will allow you to enter the site admin panel."
msgstr "انتقل إلى <a href=\"%s/register\">صفحة التسجيل</a> وسجل كمستخدم جديد. تذكر أن تستخدم نفس البريد الإلكتروني الذي أدخلته للمدير. هذا سيسمح لك بالدخول إلى لوحة الإدارة."
#: src/Module/Invite.php:56
#: src/Module/Invite.php:57
msgid "Total invitation limit exceeded."
msgstr "تجاوزت حد عدد الدعوات."
#: src/Module/Invite.php:81
#: src/Module/Invite.php:82
#, php-format
msgid "%s : Not a valid email address."
msgstr "%s : عناوين بريد الكتروني غير صالحة."
#: src/Module/Invite.php:107
#: src/Module/Invite.php:108
msgid "Please join us on Friendica"
msgstr "انضم إلينا في فرَندِكا"
#: src/Module/Invite.php:116
#: src/Module/Invite.php:117
msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr "تجاوزت عدد الدعوات. رجاء اتصال بمدير الموقع."
#: src/Module/Invite.php:120
#: src/Module/Invite.php:121
#, php-format
msgid "%s : Message delivery failed."
msgstr "%s : فشل توصيل الرسالة."
#: src/Module/Invite.php:124
#: src/Module/Invite.php:125
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
@ -8416,11 +8027,11 @@ msgstr[3] "أُرسلت %d رسائل."
msgstr[4] "أُرسلت %d رسالة."
msgstr[5] "أُرسلت %d رسالة."
#: src/Module/Invite.php:142
#: src/Module/Invite.php:143
msgid "You have no more invitations available"
msgstr "لم تتبقى لديك أي دعوة"
#: src/Module/Invite.php:149
#: src/Module/Invite.php:150
#, php-format
msgid ""
"Visit %s for a list of public sites that you can join. Friendica members on "
@ -8428,14 +8039,14 @@ msgid ""
" other social networks."
msgstr "زر %s للحصول على قائمة المواقع العمومية التي يمكنك الانضمام إليها. يمكن لجميع أعضاء مواقع شبكة فرَندِكا الوصول لبعضهم البعض، وكذلك مع عديد من الشبكات الاجتماعية الأخرى."
#: src/Module/Invite.php:151
#: src/Module/Invite.php:152
#, php-format
msgid ""
"To accept this invitation, please visit and register at %s or any other "
"public Friendica website."
msgstr "لقبول هذه الدعوة، من فضلك زر وسجل في %s أو في أي موقع فرَندِكا آخر."
#: src/Module/Invite.php:152
#: src/Module/Invite.php:153
#, php-format
msgid ""
"Friendica sites all inter-connect to create a huge privacy-enhanced social "
@ -8444,48 +8055,48 @@ msgid ""
"sites you can join."
msgstr "مواقع فرَندِكا كلها متصلة لإنشاء شبكة اجتماعية ضخمة تدعم الخصوصية يملكها ويسيطر عليها أعضاؤها. يمكنهم أيضا التواصل مع العديد من الشبكات الاجتماعية الأخرى. راجع %s للحصول على قائمة مواقع فرَندِكا بديلة."
#: src/Module/Invite.php:156
#: src/Module/Invite.php:157
msgid ""
"Our apologies. This system is not currently configured to connect with other"
" public sites or invite members."
msgstr ""
#: src/Module/Invite.php:159
#: src/Module/Invite.php:160
msgid ""
"Friendica sites all inter-connect to create a huge privacy-enhanced social "
"web that is owned and controlled by its members. They can also connect with "
"many traditional social networks."
msgstr ""
#: src/Module/Invite.php:158
#: src/Module/Invite.php:159
#, php-format
msgid "To accept this invitation, please visit and register at %s."
msgstr "لقبول هذه الدعوة، من فضلك زر وسجل في %s."
#: src/Module/Invite.php:166
#: src/Module/Invite.php:167
msgid "Send invitations"
msgstr "أرسل دعوات"
#: src/Module/Invite.php:167
#: src/Module/Invite.php:168
msgid "Enter email addresses, one per line:"
msgstr "أدخل عناوين البريد الإلكتروني ،واحد في كل سطر:"
#: src/Module/Invite.php:171
#: src/Module/Invite.php:172
msgid ""
"You are cordially invited to join me and other close friends on Friendica - "
"and help us to create a better social web."
msgstr ""
#: src/Module/Invite.php:173
#: src/Module/Invite.php:174
msgid "You will need to supply this invitation code: $invite_code"
msgstr ""
#: src/Module/Invite.php:173
#: src/Module/Invite.php:174
msgid ""
"Once you have registered, please connect with me via my profile page at:"
msgstr ""
#: src/Module/Invite.php:175
#: src/Module/Invite.php:176
msgid ""
"For more information about the Friendica project and why we feel it is "
"important, please visit http://friendi.ca"
@ -8507,19 +8118,19 @@ msgstr "أنشئ ملاحظة شخصية جديدة"
msgid "Compose new post"
msgstr "أنشئ مشاركة جديدة"
#: src/Module/Item/Compose.php:141
#: src/Module/Item/Compose.php:153
msgid "Visibility"
msgstr "الظّهور"
#: src/Module/Item/Compose.php:162
#: src/Module/Item/Compose.php:174
msgid "Clear the location"
msgstr "امسح الموقع الجغرافي"
#: src/Module/Item/Compose.php:163
#: src/Module/Item/Compose.php:175
msgid "Location services are unavailable on your device"
msgstr "خدمات الموقع الجغرافي غير متاحة على جهازك"
#: src/Module/Item/Compose.php:164
#: src/Module/Item/Compose.php:176
msgid ""
"Location services are disabled. Please check the website's permissions on "
"your device"
@ -8540,7 +8151,7 @@ msgid ""
"condition should be temporary, please come back in a few minutes."
msgstr "هذه العقدة في وضع الصيانة حاليًا، وهذا إما تلقائيا بسبب التحديث أو يدويا من قبل مدير العقدة. يرجى العودة في غضون بضع دقائق."
#: src/Module/Manifest.php:42
#: src/Module/Manifest.php:40
msgid "A Decentralized Social Network"
msgstr "شبكة اجتماعية لامركزية"
@ -8606,7 +8217,7 @@ msgstr "لا توجد تقديمات."
msgid "No more %s notifications."
msgstr "لا مزيد من تنبيهات %s."
#: src/Module/Notifications/Notification.php:107
#: src/Module/Notifications/Notification.php:134
msgid "You must be logged in to show this page."
msgstr "يجب أن تلج لتصل لهذه الصفحة."
@ -8630,6 +8241,15 @@ msgstr "تنبيهات الصفحة الرئيسية"
msgid "Show unread"
msgstr "اعرض غير المقروءة"
#: src/Module/Notifications/Ping.php:221
msgid "{0} requested registration"
msgstr "{0} طلبَ التسجيل"
#: src/Module/Notifications/Ping.php:232
#, php-format
msgid "{0} and %d others requested registration"
msgstr "{0} و %d أخرون يطلبون التسجيل"
#: src/Module/OAuth/Acknowledge.php:50
msgid "Authorize application connection"
msgstr "خول لهذا التطبيق الاتصال"
@ -8659,63 +8279,72 @@ msgstr "الرجاء نسخ رمز الاستيثاق إلى التطبيق وإ
msgid "Unsupported or missing grant type"
msgstr ""
#: src/Module/PermissionTooltip.php:47
#: src/Module/PermissionTooltip.php:49
#, php-format
msgid "Wrong type \"%s\", expected one of: %s"
msgstr "نوع خاطئ \"%s\" ، يُتوقع أن يكون: %s"
#: src/Module/PermissionTooltip.php:64
#: src/Module/PermissionTooltip.php:66
msgid "Model not found"
msgstr ""
#: src/Module/PermissionTooltip.php:91
#: src/Module/PermissionTooltip.php:89
msgid "Unlisted"
msgstr ""
#: src/Module/PermissionTooltip.php:107
msgid "Remote privacy information not available."
msgstr "معلومات الخصوصية غير متوفرة."
#: src/Module/PermissionTooltip.php:100
#: src/Module/PermissionTooltip.php:116
msgid "Visible to:"
msgstr "مرئي لـ:"
#: src/Module/PermissionTooltip.php:185
#: src/Module/PermissionTooltip.php:200
#, php-format
msgid "Collection (%s)"
msgstr ""
#: src/Module/PermissionTooltip.php:204
#, php-format
msgid "Followers (%s)"
msgstr "متابِعون (%s)"
#: src/Module/PermissionTooltip.php:201
#: src/Module/PermissionTooltip.php:223
#, php-format
msgid "%d more"
msgstr ""
#: src/Module/PermissionTooltip.php:205
#: src/Module/PermissionTooltip.php:227
#, php-format
msgid "<b>To:</b> %s<br>"
msgstr "<b>إلى:</b> %s<br>"
#: src/Module/PermissionTooltip.php:208
#: src/Module/PermissionTooltip.php:230
#, php-format
msgid "<b>CC:</b> %s<br>"
msgstr "<b>ووجه إلى:</b>%s<br>"
#: src/Module/PermissionTooltip.php:211
#: src/Module/PermissionTooltip.php:233
#, php-format
msgid "<b>BCC:</b> %s<br>"
msgstr ""
#: src/Module/Photo.php:123
#: src/Module/Photo.php:128
msgid "The Photo is not available."
msgstr "الصورة غير متوفرة."
#: src/Module/Photo.php:136
#: src/Module/Photo.php:141
#, php-format
msgid "The Photo with id %s is not available."
msgstr "الصورة ذات المعرف %s غير متوفّرة."
#: src/Module/Photo.php:169
#: src/Module/Photo.php:174
#, php-format
msgid "Invalid external resource with url %s."
msgstr ""
#: src/Module/Photo.php:171
#: src/Module/Photo.php:176
#, php-format
msgid "Invalid photo with id %s."
msgstr "الصورة ذات المعرف %s غير صالحة."
@ -8735,6 +8364,10 @@ msgid ""
"class=\"btn btn-sm pull-right\">Cancel</a>"
msgstr "أنت حاليا تستعرض ملفك الشخصي كـ <b>%s</b><a href=\"%s\" class=\"btn btn-sm pull-right\"> ألغ</a>"
#: src/Module/Profile/Profile.php:144 src/Module/Settings/Account.php:575
msgid "Full Name:"
msgstr "الاسم الكامل:"
#: src/Module/Profile/Profile.php:149
msgid "Member since:"
msgstr "عضو منذ:"
@ -8781,20 +8414,20 @@ msgid "View as"
msgstr "اعرض ك"
#: src/Module/Profile/Profile.php:326 src/Module/Profile/Profile.php:329
#: src/Module/Profile/Status.php:65 src/Module/Profile/Status.php:68
#: src/Protocol/Feed.php:990 src/Protocol/OStatus.php:1245
#: src/Module/Profile/Status.php:66 src/Module/Profile/Status.php:69
#: src/Protocol/Feed.php:1017 src/Protocol/OStatus.php:1245
#, php-format
msgid "%s's timeline"
msgstr "الخط الزمني لـ %s"
#: src/Module/Profile/Profile.php:327 src/Module/Profile/Status.php:66
#: src/Protocol/Feed.php:994 src/Protocol/OStatus.php:1249
#: src/Module/Profile/Profile.php:327 src/Module/Profile/Status.php:67
#: src/Protocol/Feed.php:1021 src/Protocol/OStatus.php:1249
#, php-format
msgid "%s's posts"
msgstr "مشاركات %s"
#: src/Module/Profile/Profile.php:328 src/Module/Profile/Status.php:67
#: src/Protocol/Feed.php:997 src/Protocol/OStatus.php:1252
#: src/Module/Profile/Profile.php:328 src/Module/Profile/Status.php:68
#: src/Protocol/Feed.php:1024 src/Protocol/OStatus.php:1252
#, php-format
msgid "%s's comments"
msgstr "تعليقات %s"
@ -8865,10 +8498,18 @@ msgstr ""
msgid "Please repeat your e-mail address:"
msgstr "رجاء أعد إدخال عنوان بريدك الإلكتروني:"
#: src/Module/Register.php:162 src/Module/Settings/Account.php:566
msgid "New Password:"
msgstr "كلمة المرور الجديدة:"
#: src/Module/Register.php:162
msgid "Leave empty for an auto generated password."
msgstr ""
#: src/Module/Register.php:163 src/Module/Settings/Account.php:567
msgid "Confirm:"
msgstr "التأكيد:"
#: src/Module/Register.php:164
#, php-format
msgid ""
@ -8986,15 +8627,15 @@ msgstr "إن لم تكن عضواً في شبكة اجتماعية حرة، <a h
msgid "Your Webfinger address or profile URL:"
msgstr ""
#: src/Module/Search/Index.php:53
#: src/Module/Search/Index.php:54
msgid "Only logged in users are permitted to perform a search."
msgstr "يمكن فقط للمستخدمين المسجلين البحث في الموقع."
#: src/Module/Search/Index.php:73
#: src/Module/Search/Index.php:74
msgid "Only one search per minute is permitted for not logged in users."
msgstr "يسمح ببحث واحد فقط في كل دقيقة للزوار."
#: src/Module/Search/Index.php:189
#: src/Module/Search/Index.php:190
#, php-format
msgid "Items tagged with: %s"
msgstr "عناصر موسمة بـ: %s"
@ -9131,6 +8772,516 @@ msgstr "هذا هو جهاز الذي استخدمه للاستيثاق بعام
msgid "Verify code and complete login"
msgstr "تحقق من الرمز وأكمل الولوج"
#: src/Module/Settings/Account.php:66
msgid "Passwords do not match."
msgstr "كلمتا المرور غير متطابقتين."
#: src/Module/Settings/Account.php:80
msgid "Password unchanged."
msgstr "لم تُغير كلمة المرور."
#: src/Module/Settings/Account.php:95
msgid "Please use a shorter name."
msgstr "يرجى استخدام اسم أقصر."
#: src/Module/Settings/Account.php:98
msgid "Name too short."
msgstr "الاسم قصير جداً."
#: src/Module/Settings/Account.php:107
msgid "Wrong Password."
msgstr "كلمة المرور خاطئة."
#: src/Module/Settings/Account.php:112
msgid "Invalid email."
msgstr "البريد الإلكتروني غير صالح."
#: src/Module/Settings/Account.php:118
msgid "Cannot change to that email."
msgstr "لا يمكن التغيير إلى هذا البريد الإلكتروني."
#: src/Module/Settings/Account.php:148 src/Module/Settings/Account.php:200
#: src/Module/Settings/Account.php:220 src/Module/Settings/Account.php:304
#: src/Module/Settings/Account.php:353
msgid "Settings were not updated."
msgstr "لم تُحدث الإعدادات."
#: src/Module/Settings/Account.php:365
msgid "Contact CSV file upload error"
msgstr "خطأ أثناء رفع ملف CSV"
#: src/Module/Settings/Account.php:384
msgid "Importing Contacts done"
msgstr "أُستورد المتراسلون"
#: src/Module/Settings/Account.php:397
msgid "Relocate message has been send to your contacts"
msgstr "أُرسلت رسالة تنبيه بانتقالك إلى متراسليك"
#: src/Module/Settings/Account.php:414
msgid "Unable to find your profile. Please contact your admin."
msgstr "تعذر العثور على ملفك الشخصي. من فضلك اتصال بالمدير."
#: src/Module/Settings/Account.php:456
msgid "Personal Page Subtypes"
msgstr "الأنواع الفرعية للصفحة الشخصية"
#: src/Module/Settings/Account.php:457
msgid "Community Forum Subtypes"
msgstr "الأنواع الفرعية للمنتدى المجتمعي"
#: src/Module/Settings/Account.php:467
msgid "Account for a personal profile."
msgstr "حساب ملف شخصي خاص."
#: src/Module/Settings/Account.php:474
msgid ""
"Account for an organisation that automatically approves contact requests as "
"\"Followers\"."
msgstr "حساب المنظمة يوافق تلقائياً على طلبات المراسلة \"كمتابعين\"."
#: src/Module/Settings/Account.php:481
msgid ""
"Account for a news reflector that automatically approves contact requests as"
" \"Followers\"."
msgstr "حساب إخباري يوافق تلقائياً على طلبات المراسلة \"كمتابعين\"."
#: src/Module/Settings/Account.php:488
msgid "Account for community discussions."
msgstr "حساب مناقشات مجتمعية."
#: src/Module/Settings/Account.php:495
msgid ""
"Account for a regular personal profile that requires manual approval of "
"\"Friends\" and \"Followers\"."
msgstr "حساب ملف شخصي عادي يتطلب الموافقة اليدوية على \"الأصدقاء\" و \"المتابعين\"."
#: src/Module/Settings/Account.php:502
msgid ""
"Account for a public profile that automatically approves contact requests as"
" \"Followers\"."
msgstr "حساب شخصي علني يوافق تلقائياً على طلبات المراسلة \"كمتابعين\"."
#: src/Module/Settings/Account.php:509
msgid "Automatically approves all contact requests."
msgstr "يوافق تلقائياً على جميع طلبات المراسلة."
#: src/Module/Settings/Account.php:516
msgid ""
"Account for a popular profile that automatically approves contact requests "
"as \"Friends\"."
msgstr "حساب ملف شخصي لمشهور يوافق تلقائياً على طلبات المراسلة كـ\"أصدقاء\"."
#: src/Module/Settings/Account.php:521
msgid "Private Forum [Experimental]"
msgstr "منتدى خاص [تجريبي]"
#: src/Module/Settings/Account.php:523
msgid "Requires manual approval of contact requests."
msgstr "يتطلب الموافقة اليدوية على طلبات المراسلة."
#: src/Module/Settings/Account.php:532
msgid "OpenID:"
msgstr "OpenID:"
#: src/Module/Settings/Account.php:532
msgid "(Optional) Allow this OpenID to login to this account."
msgstr "(اختياري) اسمح لمعرف OpenID بالولوج إلى هذا الحساب."
#: src/Module/Settings/Account.php:540
msgid "Publish your profile in your local site directory?"
msgstr "أتريد نشر ملفك الشخصي في الدليل المحلي للموقع؟"
#: src/Module/Settings/Account.php:540
#, php-format
msgid ""
"Your profile will be published in this node's <a href=\"%s\">local "
"directory</a>. Your profile details may be publicly visible depending on the"
" system settings."
msgstr "سينشر ملفك الشخصي في <a href=\"%s\"> الدليل المحلي</a> لهذه العقدة. تعتمد خصوصية معلوماتك على إعدادات النظام."
#: src/Module/Settings/Account.php:546
#, php-format
msgid ""
"Your profile will also be published in the global friendica directories "
"(e.g. <a href=\"%s\">%s</a>)."
msgstr "سينشر ملفك الشخصي كذلك في الأدلة العالمية لفرَندِيكا (مثال <a href=\"%s\">%s</a>)."
#: src/Module/Settings/Account.php:556
msgid "Account Settings"
msgstr "إعدادات الحساب"
#: src/Module/Settings/Account.php:557
#, php-format
msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
msgstr "عنوان معرفك هو <strong>'%s'</strong> أو '%s'."
#: src/Module/Settings/Account.php:565
msgid "Password Settings"
msgstr "إعدادات كلمة المرور"
#: src/Module/Settings/Account.php:566
msgid ""
"Allowed characters are a-z, A-Z, 0-9 and special characters except white "
"spaces, accentuated letters and colon (:)."
msgstr "المحارف المسموح بها هي a-z، A-Z، 0-9 والأحرف الخاصة باستثناء المساحات، الأحرف المنبورة ونقطتي التفسير (:)."
#: src/Module/Settings/Account.php:567
msgid "Leave password fields blank unless changing"
msgstr "اترك حقول كلمة المرور فارغة ما لم ترد تغييرها"
#: src/Module/Settings/Account.php:568
msgid "Current Password:"
msgstr "كلمة المرور الحالية:"
#: src/Module/Settings/Account.php:568
msgid "Your current password to confirm the changes"
msgstr "اكتب كلمة المرور الحالية لتأكيد التغييرات"
#: src/Module/Settings/Account.php:569
msgid "Password:"
msgstr "كلمة المرور:"
#: src/Module/Settings/Account.php:569
msgid "Your current password to confirm the changes of the email address"
msgstr "اكتب كلمة المرور الحالية لتأكيد تغيير بريدك الإلكتروني"
#: src/Module/Settings/Account.php:572
msgid "Delete OpenID URL"
msgstr "احذف معرف OpenID"
#: src/Module/Settings/Account.php:574
msgid "Basic Settings"
msgstr "الإعدادات الأساسيّة"
#: src/Module/Settings/Account.php:576
msgid "Email Address:"
msgstr "البريد الإلكتروني:"
#: src/Module/Settings/Account.php:577
msgid "Your Timezone:"
msgstr "المنطقة الزمنية:"
#: src/Module/Settings/Account.php:578
msgid "Your Language:"
msgstr "لغتك:"
#: src/Module/Settings/Account.php:578
msgid ""
"Set the language we use to show you friendica interface and to send you "
"emails"
msgstr "عيّن لغة واجهة فرَندِيكا ورسائل البريد الإلكتروني"
#: src/Module/Settings/Account.php:579
msgid "Default Post Location:"
msgstr "موقع النشر الافتراضي:"
#: src/Module/Settings/Account.php:580
msgid "Use Browser Location:"
msgstr "استخدم موقع المتصفح:"
#: src/Module/Settings/Account.php:582
msgid "Security and Privacy Settings"
msgstr "إعدادات الأمان والخصوصية"
#: src/Module/Settings/Account.php:584
msgid "Maximum Friend Requests/Day:"
msgstr "حدُ طلبات الصداقة لليوم الواحد:"
#: src/Module/Settings/Account.php:584 src/Module/Settings/Account.php:594
msgid "(to prevent spam abuse)"
msgstr "(لمنع الرسائل المزعجة)"
#: src/Module/Settings/Account.php:586
msgid "Allow your profile to be searchable globally?"
msgstr "أتريد السماح لملفك الشخصي بالظهور في نتائج البحث العالمي؟"
#: src/Module/Settings/Account.php:586
msgid ""
"Activate this setting if you want others to easily find and follow you. Your"
" profile will be searchable on remote systems. This setting also determines "
"whether Friendica will inform search engines that your profile should be "
"indexed or not."
msgstr "فعّل هذا الإعداد إن أردت أن يُعثر عليك بسهولة. سيتمكن المستخدمون في المواقع البعيد من العثور عليك، وأيضا سيسمح بظهور ملفك الشخصي في محركات البحث."
#: src/Module/Settings/Account.php:587
msgid "Hide your contact/friend list from viewers of your profile?"
msgstr "أتريد إخفاء قائمة المتراسلين/الأصدقاء عن متصفحي ملفك الشخصي؟"
#: src/Module/Settings/Account.php:587
msgid ""
"A list of your contacts is displayed on your profile page. Activate this "
"option to disable the display of your contact list."
msgstr "عادة تُعرض قائمة المتراسلين على صفحة ملفك الشخصي. إن قمت بتفعيل هذا الخيار ستخفى القائمة."
#: src/Module/Settings/Account.php:588
msgid "Hide your profile details from anonymous viewers?"
msgstr "اخف معلومات ملفك الشخص عن المتصفحين المجهولين؟"
#: src/Module/Settings/Account.php:588
msgid ""
"Anonymous visitors will only see your profile picture, your display name and"
" the nickname you are using on your profile page. Your public posts and "
"replies will still be accessible by other means."
msgstr "سيرى الزوار المجهولون صورة ملفك الشخصي واسمك العلني ولقبك فقط. لكن ستبقى مشاركتك العامة وردودك متاحة عبر وسائل أخرى."
#: src/Module/Settings/Account.php:589
msgid "Make public posts unlisted"
msgstr "لا تدرج المشاركات العلنية"
#: src/Module/Settings/Account.php:589
msgid ""
"Your public posts will not appear on the community pages or in search "
"results, nor be sent to relay servers. However they can still appear on "
"public feeds on remote servers."
msgstr "لن تظهر مشاركتك العلنية على صفحات المجتمع أو في نتائج البحث لهذا الموقع، ولن يتم إرسالها إلى خوادم الترحيل. غير أنها ستبقى تظهر في التغذيات العمومية للخوادم البعيدة."
#: src/Module/Settings/Account.php:590
msgid "Make all posted pictures accessible"
msgstr "أتح كل الصور المنشورة"
#: src/Module/Settings/Account.php:590
msgid ""
"This option makes every posted picture accessible via the direct link. This "
"is a workaround for the problem that most other networks can't handle "
"permissions on pictures. Non public pictures still won't be visible for the "
"public on your photo albums though."
msgstr "يسمح هذا الخيار بالوصول للصورة المنشورة عبر رابط مباشر. هذا حل لمعظم الشبكات التي لا يمكنها التعامل مع الأذونات. صورك غير العلنية ستبقى مخفية."
#: src/Module/Settings/Account.php:591
msgid "Allow friends to post to your profile page?"
msgstr "أتسمح لأصدقائك بالنشر في صفحة ملفك الشخصي؟"
#: src/Module/Settings/Account.php:591
msgid ""
"Your contacts may write posts on your profile wall. These posts will be "
"distributed to your contacts"
msgstr "يمكن للمتراسلين كتابة مشاركات على حائط ملفك الشخصي. ستكون هذه المشركات مرئية لكل المتراسلين"
#: src/Module/Settings/Account.php:592
msgid "Allow friends to tag your posts?"
msgstr "أتسمح لأصدقائك بوسم مشاركاتك؟"
#: src/Module/Settings/Account.php:592
msgid "Your contacts can add additional tags to your posts."
msgstr "يمكن لأصدقائك إضافة وسوم لمشاركاتك."
#: src/Module/Settings/Account.php:593
msgid "Permit unknown people to send you private mail?"
msgstr "أتسمح لأشخاص مجهولين بإرسال بريد خاص لك؟"
#: src/Module/Settings/Account.php:593
msgid ""
"Friendica network users may send you private messages even if they are not "
"in your contact list."
msgstr "يمكن لمستخدمي شبكة فرَندِكا إرسال رسائل خاصة لك حتى إن لم يكونوا في قائمة المتراسلين."
#: src/Module/Settings/Account.php:594
msgid "Maximum private messages per day from unknown people:"
msgstr "حد الرسائل اليومي المستلمة من مجهولين:"
#: src/Module/Settings/Account.php:596
msgid "Default Post Permissions"
msgstr "أذونات النشر الافتراضية"
#: src/Module/Settings/Account.php:600
msgid "Expiration settings"
msgstr "إعدادات انتهاء الصلاحية"
#: src/Module/Settings/Account.php:601
msgid "Automatically expire posts after this many days:"
msgstr "أنه صَلاحِيَة المشاركات تلقائياً بعد هذا العدد من الأيام:"
#: src/Module/Settings/Account.php:601
msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr "إذا كان فارغاً، لن تنتهي صلاحية المشاركات. وإلا بعد المهلة ستحذف المشاركات المنتهية صلاحيتها"
#: src/Module/Settings/Account.php:602
msgid "Expire posts"
msgstr "أنه صَلاحِيَة المشاركات"
#: src/Module/Settings/Account.php:602
msgid "When activated, posts and comments will be expired."
msgstr "عند تفعيله، ستنهى صلاحية المشاركات والتعليقات."
#: src/Module/Settings/Account.php:603
msgid "Expire personal notes"
msgstr "أنه صَلاحِيَة الملاحظات الشخصية"
#: src/Module/Settings/Account.php:603
msgid ""
"When activated, the personal notes on your profile page will be expired."
msgstr "عند تفعيله، ستنهى صلاحية الملاحظات الشخصية على صفحة ملفك الشخصي."
#: src/Module/Settings/Account.php:604
msgid "Expire starred posts"
msgstr "أنتهي صلاحية المشاركات المفضلة"
#: src/Module/Settings/Account.php:604
msgid ""
"Starring posts keeps them from being expired. That behaviour is overwritten "
"by this setting."
msgstr "تفضيل مشاركة تقيها من انتهاء الصلاحية. هذا السلوك يُتجاوز من خلال هذا الإعداد."
#: src/Module/Settings/Account.php:605
msgid "Only expire posts by others"
msgstr "أنه صَلاحِيَة مشاركات الآخرين فقط"
#: src/Module/Settings/Account.php:605
msgid ""
"When activated, your own posts never expire. Then the settings above are "
"only valid for posts you received."
msgstr "عند تفعيله، لا نهاية لصلاحية مشاركاتك. ثم تكون الإعدادات أعلاه صالحة فقط للمشاركات التي استلمتها."
#: src/Module/Settings/Account.php:608
msgid "Notification Settings"
msgstr "إعدادات التنبيهات"
#: src/Module/Settings/Account.php:609
msgid "Send a notification email when:"
msgstr "أرسل تنبيها للبريدي الإلكتروني عند:"
#: src/Module/Settings/Account.php:610
msgid "You receive an introduction"
msgstr "تلقي تقديم"
#: src/Module/Settings/Account.php:611
msgid "Your introductions are confirmed"
msgstr "أُكدت تقديماتك"
#: src/Module/Settings/Account.php:612
msgid "Someone writes on your profile wall"
msgstr "يكتب شخص ما على جدار ملفك الشخصي"
#: src/Module/Settings/Account.php:613
msgid "Someone writes a followup comment"
msgstr "شخص ما يعلق على ما نشرت"
#: src/Module/Settings/Account.php:614
msgid "You receive a private message"
msgstr "تلقي رسالة خاصة"
#: src/Module/Settings/Account.php:615
msgid "You receive a friend suggestion"
msgstr "تلقي اقتراح صداقة"
#: src/Module/Settings/Account.php:616
msgid "You are tagged in a post"
msgstr "ذُكرتَ في مشاركة"
#: src/Module/Settings/Account.php:617
msgid "You are poked/prodded/etc. in a post"
msgstr ""
#: src/Module/Settings/Account.php:619
msgid "Create a desktop notification when:"
msgstr "أنشئ تنبيه سطح المكتب عند:"
#: src/Module/Settings/Account.php:620
msgid "Someone tagged you"
msgstr ""
#: src/Module/Settings/Account.php:621
msgid "Someone directly commented on your post"
msgstr ""
#: src/Module/Settings/Account.php:622
msgid "Someone liked your content"
msgstr "أُعجب شخص بمحتواك"
#: src/Module/Settings/Account.php:622 src/Module/Settings/Account.php:623
msgid "Can only be enabled, when the direct comment notification is enabled."
msgstr ""
#: src/Module/Settings/Account.php:623
msgid "Someone shared your content"
msgstr "شارك شخص محتواك"
#: src/Module/Settings/Account.php:624
msgid "Someone commented in your thread"
msgstr ""
#: src/Module/Settings/Account.php:625
msgid "Someone commented in a thread where you commented"
msgstr ""
#: src/Module/Settings/Account.php:626
msgid "Someone commented in a thread where you interacted"
msgstr ""
#: src/Module/Settings/Account.php:628
msgid "Activate desktop notifications"
msgstr "نشّط تنبيهات سطح المكتب"
#: src/Module/Settings/Account.php:628
msgid "Show desktop popup on new notifications"
msgstr "أظهر منبثقات للتنبيهات الجديدة"
#: src/Module/Settings/Account.php:632
msgid "Text-only notification emails"
msgstr "رسائل تنبيه نصية فقط"
#: src/Module/Settings/Account.php:634
msgid "Send text only notification emails, without the html part"
msgstr "أرسل بريد التنبيه كنص فقط، دون وسوم html"
#: src/Module/Settings/Account.php:638
msgid "Show detailled notifications"
msgstr "اعرض تنبيهات مفصلة"
#: src/Module/Settings/Account.php:640
msgid ""
"Per default, notifications are condensed to a single notification per item. "
"When enabled every notification is displayed."
msgstr "افتراضيًا ، يعرض أحدث تنبيه فقط لكل محادثة. عند تفعيله ستعرض جميع التنبيهات."
#: src/Module/Settings/Account.php:644
msgid "Show notifications of ignored contacts"
msgstr "أظهر تنبيهات للمتراسلين المتجاهلين"
#: src/Module/Settings/Account.php:646
msgid ""
"You don't see posts from ignored contacts. But you still see their comments."
" This setting controls if you want to still receive regular notifications "
"that are caused by ignored contacts or not."
msgstr "أنت لا ترى مشاركات المتراسلين المتجاهلين. لكن لا يزال بإمكانك رؤية تعليقاتهم. هذا الإعداد يتحكم إذا كنت ترغب في الاستمرار في تلقي تنبيهات سببها المتراسلون المتجاهلون."
#: src/Module/Settings/Account.php:649
msgid "Advanced Account/Page Type Settings"
msgstr "الإعدادات المتقدمة للحساب/للصفحة"
#: src/Module/Settings/Account.php:650
msgid "Change the behaviour of this account for special situations"
msgstr "غيّر سلوك هذا الحساب للحالات الخاصة"
#: src/Module/Settings/Account.php:653
msgid "Import Contacts"
msgstr "استيراد متراسلين"
#: src/Module/Settings/Account.php:654
msgid ""
"Upload a CSV file that contains the handle of your followed accounts in the "
"first column you exported from the old account."
msgstr "ارفع ملف CSV معرفات المتراسلين لحسابك القديم، معرفات المتابَعين تكون في العمود الأول."
#: src/Module/Settings/Account.php:655
msgid "Upload File"
msgstr "ارفع ملفًا"
#: src/Module/Settings/Account.php:658
msgid "Relocate"
msgstr "الانتقال"
#: src/Module/Settings/Account.php:659
msgid ""
"If you have moved this profile from another server, and some of your "
"contacts don't receive your updates, try pushing this button."
msgstr "إذا كنت قد نقلت هذا الملف الشخصي من خادم آخر، وبعض المتراسلين لا يتلقون تحديثاتك، أنقر هذا الزر."
#: src/Module/Settings/Account.php:660
msgid "Resend relocate message to contacts"
msgstr "أعد إرسال رسالة الانتقال للمتراسلين"
#: src/Module/Settings/Delegation.php:53
msgid "Delegation successfully granted."
msgstr "منح التفويض بنجاح."
@ -9834,32 +9985,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 "صدّر معلومات حسابك ومتراسليك وجميع العناصر الخاصة بك كملف json. قد يستغرق وقتًا طويلًا وينتج عنه ملف كبير. استخدمه لإنشاء نسخة احتياطية كاملة من حسابك (الصور غير مضمنة)"
#: src/Module/Settings/UserExport.php:69
#: src/Module/Settings/UserExport.php:70
msgid "Export Contacts to CSV"
msgstr "صدّر المتراسلين الى ملف CSV"
#: 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."
@ -10074,43 +10225,51 @@ msgid ""
" features and resources."
msgstr "يمكنك الاطلاع على صفحات <strong>المساعدة</strong> للحصول على تفاصيل حول ميزات البرامج الأخرى ومصادرها."
#: src/Navigation/Notifications/Factory/FormattedNotification.php:89
#: src/Navigation/Notifications/Factory/FormattedNavNotification.php:134
msgid "{0} wants to follow you"
msgstr "{0} يريد متابعتك"
#: src/Navigation/Notifications/Factory/FormattedNavNotification.php:136
msgid "{0} has started following you"
msgstr ""
#: src/Navigation/Notifications/Factory/FormattedNotify.php:91
#, php-format
msgid "%s liked %s's post"
msgstr "أُعجب %s بمشاركة %s"
#: src/Navigation/Notifications/Factory/FormattedNotification.php:101
#: src/Navigation/Notifications/Factory/FormattedNotify.php:103
#, php-format
msgid "%s disliked %s's post"
msgstr "لم يُعجب %s بمشاركة %s"
#: src/Navigation/Notifications/Factory/FormattedNotification.php:113
#: src/Navigation/Notifications/Factory/FormattedNotify.php:115
#, php-format
msgid "%s is attending %s's event"
msgstr "يحضر %s حدث %s"
#: src/Navigation/Notifications/Factory/FormattedNotification.php:125
#: src/Navigation/Notifications/Factory/FormattedNotify.php:127
#, php-format
msgid "%s is not attending %s's event"
msgstr "لن يحضر %s حدث %s"
#: src/Navigation/Notifications/Factory/FormattedNotification.php:137
#: src/Navigation/Notifications/Factory/FormattedNotify.php:139
#, php-format
msgid "%s may attending %s's event"
msgstr "قد يحضر %s حدث %s"
#: src/Navigation/Notifications/Factory/FormattedNotification.php:167
#: src/Navigation/Notifications/Factory/FormattedNotify.php:169
#, php-format
msgid "%s is now friends with %s"
msgstr "أصبح %s صديقا ل %s"
#: src/Navigation/Notifications/Factory/FormattedNotification.php:334
#: src/Navigation/Notifications/Factory/FormattedNotification.php:372
#: src/Navigation/Notifications/Factory/FormattedNotify.php:336
#: src/Navigation/Notifications/Factory/FormattedNotify.php:374
#, php-format
msgid "%s commented on %s's post"
msgstr "علق %s على مشاركة %s"
#: src/Navigation/Notifications/Factory/FormattedNotification.php:371
#: src/Navigation/Notifications/Factory/FormattedNotify.php:373
#, php-format
msgid "%s created a new post"
msgstr "أنشأ %s مشاركة جديدة"
@ -10127,330 +10286,330 @@ msgstr "طلب صداقة/اقتران"
msgid "New Follower"
msgstr "متابِع جديد"
#: src/Navigation/Notifications/Factory/Notification.php:93
#: src/Navigation/Notifications/Factory/Notification.php:134
#, php-format
msgid "%1$s wants to follow you"
msgstr "%1$s يريد متابعتك"
#: src/Navigation/Notifications/Factory/Notification.php:95
#: src/Navigation/Notifications/Factory/Notification.php:136
#, php-format
msgid "%1$s had started following you"
msgstr "%1$s يتابعك"
msgid "%1$s has started following you"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:149
#: src/Navigation/Notifications/Factory/Notification.php:200
#, php-format
msgid "%1$s liked your comment %2$s"
msgstr "أعجب %1$s بتعليقك %2$s"
msgid "%1$s liked your comment on %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:152
#: src/Navigation/Notifications/Factory/Notification.php:203
#, php-format
msgid "%1$s liked your post %2$s"
msgstr "أعجب %1$s بمشاركتك %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:159
#: src/Navigation/Notifications/Factory/Notification.php:210
#, php-format
msgid "%1$s disliked your comment %2$s"
msgstr "لم يعجب %1$s تعليقك %2$s"
msgid "%1$s disliked your comment on %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:162
#: src/Navigation/Notifications/Factory/Notification.php:213
#, php-format
msgid "%1$s disliked your post %2$s"
msgstr "لم يعجب %1$s مشاركتك %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:169
#: src/Navigation/Notifications/Factory/Notification.php:220
#, php-format
msgid "%1$s shared your comment %2$s"
msgstr "شارك %1$s تعليقك %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:172
#: src/Navigation/Notifications/Factory/Notification.php:223
#, php-format
msgid "%1$s shared your post %2$s"
msgstr "شارك %1$s مشاركتك %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:176
#: src/Navigation/Notifications/Factory/Notification.php:245
#: src/Navigation/Notifications/Factory/Notification.php:227
#: src/Navigation/Notifications/Factory/Notification.php:297
#, php-format
msgid "%1$s shared the post %2$s from %3$s"
msgstr "شارك %1$s المشاركة %2$s من %3$s"
#: src/Navigation/Notifications/Factory/Notification.php:178
#: src/Navigation/Notifications/Factory/Notification.php:247
#: src/Navigation/Notifications/Factory/Notification.php:229
#: src/Navigation/Notifications/Factory/Notification.php:299
#, php-format
msgid "%1$s shared a post from %3$s"
msgstr "شارك %1$s مشاركة %3$s"
#: src/Navigation/Notifications/Factory/Notification.php:180
#: src/Navigation/Notifications/Factory/Notification.php:249
#: src/Navigation/Notifications/Factory/Notification.php:231
#: src/Navigation/Notifications/Factory/Notification.php:301
#, php-format
msgid "%1$s shared the post %2$s"
msgstr "شارك %1$s المشاركة %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:182
#: src/Navigation/Notifications/Factory/Notification.php:251
#: src/Navigation/Notifications/Factory/Notification.php:233
#: src/Navigation/Notifications/Factory/Notification.php:303
#, php-format
msgid "%1$s shared a post"
msgstr "شارك %1$s مشاركة"
#: src/Navigation/Notifications/Factory/Notification.php:190
#: src/Navigation/Notifications/Factory/Notification.php:241
#, php-format
msgid "%1$s wants to attend your event %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:197
#: src/Navigation/Notifications/Factory/Notification.php:248
#, php-format
msgid "%1$s does not want to attend your event %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:204
#: src/Navigation/Notifications/Factory/Notification.php:255
#, php-format
msgid "%1$s maybe wants to attend your event %2$s"
msgstr ""
#: src/Navigation/Notifications/Factory/Notification.php:211
#: src/Navigation/Notifications/Factory/Notification.php:262
#, php-format
msgid "%1$s tagged you on %2$s"
msgstr "ذكرك %1$s في %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:215
#: src/Navigation/Notifications/Factory/Notification.php:266
#, php-format
msgid "%1$s replied to you on %2$s"
msgstr "رد %1$s عليك في %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:219
#: src/Navigation/Notifications/Factory/Notification.php:270
#, php-format
msgid "%1$s commented in your thread %2$s"
msgstr "علق %1$s على نقاشك %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:223
#: src/Navigation/Notifications/Factory/Notification.php:274
#, php-format
msgid "%1$s commented on your comment %2$s"
msgstr "علق %1$s على تعليقك %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:229
#: src/Navigation/Notifications/Factory/Notification.php:281
#, php-format
msgid "%1$s commented in their thread %2$s"
msgstr "علق %1$s على نقاشه %2$s"
#: src/Navigation/Notifications/Factory/Notification.php:231
#: src/Navigation/Notifications/Factory/Notification.php:283
#, php-format
msgid "%1$s commented in their thread"
msgstr "علق %1$s على نقاشه"
#: src/Navigation/Notifications/Factory/Notification.php:233
#: src/Navigation/Notifications/Factory/Notification.php:285
#, php-format
msgid "%1$s commented in the thread %2$s from %3$s"
msgstr "علق %1$s على المحدثة %2$s من %3$s"
#: src/Navigation/Notifications/Factory/Notification.php:235
#: src/Navigation/Notifications/Factory/Notification.php:287
#, php-format
msgid "%1$s commented in the thread from %3$s"
msgstr "علق %1$s على نقاش %3$s"
#: src/Navigation/Notifications/Factory/Notification.php:240
#: src/Navigation/Notifications/Factory/Notification.php:292
#, php-format
msgid "%1$s commented on your thread %2$s"
msgstr "علق %1$s على نقاشك %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:211
#: src/Navigation/Notifications/Repository/Notify.php:694
#: src/Navigation/Notifications/Repository/Notify.php:221
#: src/Navigation/Notifications/Repository/Notify.php:735
msgid "[Friendica:Notify]"
msgstr "[فرنديكا: تنبيه]"
#: src/Navigation/Notifications/Repository/Notify.php:275
#: src/Navigation/Notifications/Repository/Notify.php:285
#, php-format
msgid "%s New mail received at %s"
msgstr "أُستلم %s بريد جديد على %s"
#: src/Navigation/Notifications/Repository/Notify.php:277
#: src/Navigation/Notifications/Repository/Notify.php:287
#, php-format
msgid "%1$s sent you a new private message at %2$s."
msgstr "أرسل %1$s لك رسالة خاصة على %2$s."
#: src/Navigation/Notifications/Repository/Notify.php:278
#: src/Navigation/Notifications/Repository/Notify.php:288
msgid "a private message"
msgstr "رسالة خاصة"
#: src/Navigation/Notifications/Repository/Notify.php:278
#: src/Navigation/Notifications/Repository/Notify.php:288
#, php-format
msgid "%1$s sent you %2$s."
msgstr "أرسل %1$s لك %2$s."
#: src/Navigation/Notifications/Repository/Notify.php:280
#: src/Navigation/Notifications/Repository/Notify.php:290
#, php-format
msgid "Please visit %s to view and/or reply to your private messages."
msgstr "من فضلك زر %s لعرض و/أو الرد على الرسائل الخاصة."
#: src/Navigation/Notifications/Repository/Notify.php:311
#: src/Navigation/Notifications/Repository/Notify.php:320
#, php-format
msgid "%1$s commented on %2$s's %3$s %4$s"
msgstr "علق %1$s على %3$s %2$s %4$s"
#: src/Navigation/Notifications/Repository/Notify.php:316
#: src/Navigation/Notifications/Repository/Notify.php:325
#, php-format
msgid "%1$s commented on your %2$s %3$s"
msgstr "علق %1$s على %2$s تخصك %3$s"
#: src/Navigation/Notifications/Repository/Notify.php:320
#: src/Navigation/Notifications/Repository/Notify.php:329
#, php-format
msgid "%1$s commented on their %2$s %3$s"
msgstr "علق %1$s على %2$s له %3$s"
#: src/Navigation/Notifications/Repository/Notify.php:324
#: src/Navigation/Notifications/Repository/Notify.php:729
#: src/Navigation/Notifications/Repository/Notify.php:333
#: src/Navigation/Notifications/Repository/Notify.php:769
#, php-format
msgid "%1$s Comment to conversation #%2$d by %3$s"
msgstr "علق %1$s على محادثة %3$s #%2$d"
#: src/Navigation/Notifications/Repository/Notify.php:326
#: src/Navigation/Notifications/Repository/Notify.php:335
#, php-format
msgid "%s commented on an item/conversation you have been following."
msgstr "علق %s على محادثة/عنصر تتابعه."
#: src/Navigation/Notifications/Repository/Notify.php:330
#: src/Navigation/Notifications/Repository/Notify.php:345
#: src/Navigation/Notifications/Repository/Notify.php:364
#: src/Navigation/Notifications/Repository/Notify.php:744
#: src/Navigation/Notifications/Repository/Notify.php:339
#: src/Navigation/Notifications/Repository/Notify.php:354
#: src/Navigation/Notifications/Repository/Notify.php:373
#: src/Navigation/Notifications/Repository/Notify.php:784
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr "من فضلك زر %s لعرض و/أو الرد على المحادثة."
#: src/Navigation/Notifications/Repository/Notify.php:337
#: src/Navigation/Notifications/Repository/Notify.php:346
#, php-format
msgid "%s %s posted to your profile wall"
msgstr "نشر %s%s على حائط ملفك الشخصي"
#: src/Navigation/Notifications/Repository/Notify.php:339
#: src/Navigation/Notifications/Repository/Notify.php:348
#, php-format
msgid "%1$s posted to your profile wall at %2$s"
msgstr "نشر %1$s على حائط ملفك الشخصي على %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:340
#: src/Navigation/Notifications/Repository/Notify.php:349
#, php-format
msgid "%1$s posted to [url=%2$s]your wall[/url]"
msgstr "نشر %1$s على [url=%2$s]حائطك[/url]"
#: src/Navigation/Notifications/Repository/Notify.php:352
#: src/Navigation/Notifications/Repository/Notify.php:361
#, php-format
msgid "%1$s %2$s poked you"
msgstr "لكزك %1$s %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:354
#: src/Navigation/Notifications/Repository/Notify.php:363
#, php-format
msgid "%1$s poked you at %2$s"
msgstr "لكزك %1$s على %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:355
#: src/Navigation/Notifications/Repository/Notify.php:364
#, php-format
msgid "%1$s [url=%2$s]poked you[/url]."
msgstr "[url=%2$s]لكزك[/url] %1$s."
#: src/Navigation/Notifications/Repository/Notify.php:372
#: src/Navigation/Notifications/Repository/Notify.php:381
#, php-format
msgid "%s Introduction received"
msgstr "تلقيت تقديما من %s"
#: src/Navigation/Notifications/Repository/Notify.php:374
#: src/Navigation/Notifications/Repository/Notify.php:383
#, php-format
msgid "You've received an introduction from '%1$s' at %2$s"
msgstr "تلقيت تقديما من '%1$s' على %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:375
#: src/Navigation/Notifications/Repository/Notify.php:384
#, php-format
msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
msgstr "تلقيت [url=%1$s]تقديما[/url] من %2$s."
#: src/Navigation/Notifications/Repository/Notify.php:380
#: src/Navigation/Notifications/Repository/Notify.php:426
#: src/Navigation/Notifications/Repository/Notify.php:389
#: src/Navigation/Notifications/Repository/Notify.php:435
#, php-format
msgid "You may visit their profile at %s"
msgstr "يمكنك زيارة ملفهم الشخصي على %s"
#: src/Navigation/Notifications/Repository/Notify.php:382
#: src/Navigation/Notifications/Repository/Notify.php:391
#, php-format
msgid "Please visit %s to approve or reject the introduction."
msgstr "من فضلك زر %s لقبول أو رفض التقديم."
#: src/Navigation/Notifications/Repository/Notify.php:389
#: src/Navigation/Notifications/Repository/Notify.php:398
#, php-format
msgid "%s A new person is sharing with you"
msgstr "%s شخص جديد يشارك معك"
#: src/Navigation/Notifications/Repository/Notify.php:391
#: src/Navigation/Notifications/Repository/Notify.php:392
#: src/Navigation/Notifications/Repository/Notify.php:400
#: src/Navigation/Notifications/Repository/Notify.php:401
#, php-format
msgid "%1$s is sharing with you at %2$s"
msgstr "يشارك %1$s معك على %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:399
#: src/Navigation/Notifications/Repository/Notify.php:408
#, php-format
msgid "%s You have a new follower"
msgstr "لديك متابِع جديد %s"
#: src/Navigation/Notifications/Repository/Notify.php:401
#: src/Navigation/Notifications/Repository/Notify.php:402
#: src/Navigation/Notifications/Repository/Notify.php:410
#: src/Navigation/Notifications/Repository/Notify.php:411
#, php-format
msgid "You have a new follower at %2$s : %1$s"
msgstr "لديك متابِع جديد على %2$s : %1$s"
#: src/Navigation/Notifications/Repository/Notify.php:415
#: src/Navigation/Notifications/Repository/Notify.php:424
#, php-format
msgid "%s Friend suggestion received"
msgstr "تلقيت إقتراح صديق %s"
#: src/Navigation/Notifications/Repository/Notify.php:417
#: src/Navigation/Notifications/Repository/Notify.php:426
#, php-format
msgid "You've received a friend suggestion from '%1$s' at %2$s"
msgstr "تلقيت اقتراح صديق من '%1$s' على %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:418
#: src/Navigation/Notifications/Repository/Notify.php:427
#, php-format
msgid ""
"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
msgstr "اقترح عليك %3$s [url=%1$s] مصادقة %2$s[/url]."
#: src/Navigation/Notifications/Repository/Notify.php:424
#: src/Navigation/Notifications/Repository/Notify.php:433
msgid "Name:"
msgstr "الاسم:"
#: src/Navigation/Notifications/Repository/Notify.php:425
#: src/Navigation/Notifications/Repository/Notify.php:434
msgid "Photo:"
msgstr "الصورة:"
#: src/Navigation/Notifications/Repository/Notify.php:428
#: src/Navigation/Notifications/Repository/Notify.php:437
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr "من فضلك زر %s لقبول أو رفض الاقتراح."
#: src/Navigation/Notifications/Repository/Notify.php:436
#: src/Navigation/Notifications/Repository/Notify.php:451
#: src/Navigation/Notifications/Repository/Notify.php:445
#: src/Navigation/Notifications/Repository/Notify.php:460
#, php-format
msgid "%s Connection accepted"
msgstr "قُبِل الاقتران %s"
#: src/Navigation/Notifications/Repository/Notify.php:438
#: src/Navigation/Notifications/Repository/Notify.php:453
#: src/Navigation/Notifications/Repository/Notify.php:447
#: src/Navigation/Notifications/Repository/Notify.php:462
#, php-format
msgid "'%1$s' has accepted your connection request at %2$s"
msgstr "قبِل '%1$s' طلب الاقتران على %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:439
#: src/Navigation/Notifications/Repository/Notify.php:454
#: src/Navigation/Notifications/Repository/Notify.php:448
#: src/Navigation/Notifications/Repository/Notify.php:463
#, php-format
msgid "%2$s has accepted your [url=%1$s]connection request[/url]."
msgstr "قبِل %2$s [url=%1$s]طلب الاقتران[/url]."
#: src/Navigation/Notifications/Repository/Notify.php:444
#: src/Navigation/Notifications/Repository/Notify.php:453
msgid ""
"You are now mutual friends and may exchange status updates, photos, and "
"email without restriction."
msgstr "أصبحتما صديقين من كلا الطرفين ويمكنكما تبادل تحديثات الحالة، والصور، والبريد دون قيود."
#: src/Navigation/Notifications/Repository/Notify.php:446
#: src/Navigation/Notifications/Repository/Notify.php:455
#, php-format
msgid "Please visit %s if you wish to make any changes to this relationship."
msgstr "من فضلك زر %s إن أردت تغيير هذه العلاقة."
#: src/Navigation/Notifications/Repository/Notify.php:459
#: src/Navigation/Notifications/Repository/Notify.php:468
#, php-format
msgid ""
"'%1$s' has chosen to accept you a fan, which restricts some forms of "
@ -10459,33 +10618,33 @@ msgid ""
"automatically."
msgstr "قبِلك '%1$s' كمعجب، هذا يحدُّ من أشكال التواصل بينكما مثل الرسائل الخاصة وبعض التفاعلات. يتم هذا تلقائيا اذا كانت صفحة مشهور أو مجتمع."
#: src/Navigation/Notifications/Repository/Notify.php:461
#: src/Navigation/Notifications/Repository/Notify.php:470
#, php-format
msgid ""
"'%1$s' may choose to extend this into a two-way or more permissive "
"relationship in the future."
msgstr "قد يختار '%1$s' توسيعها إلى علاقة ذات اتجاهين أو أكثر في المستقبل."
#: src/Navigation/Notifications/Repository/Notify.php:463
#: src/Navigation/Notifications/Repository/Notify.php:472
#, php-format
msgid "Please visit %s if you wish to make any changes to this relationship."
msgstr "من فضلك زر %s إن أردت تغيير هذه العلاقة."
#: src/Navigation/Notifications/Repository/Notify.php:473
#: src/Navigation/Notifications/Repository/Notify.php:482
msgid "registration request"
msgstr "طلب تسجيل"
#: src/Navigation/Notifications/Repository/Notify.php:475
#: src/Navigation/Notifications/Repository/Notify.php:484
#, php-format
msgid "You've received a registration request from '%1$s' at %2$s"
msgstr "تلقيت طلب تسجيل من '%1$s' على %2$s"
#: src/Navigation/Notifications/Repository/Notify.php:476
#: src/Navigation/Notifications/Repository/Notify.php:485
#, php-format
msgid "You've received a [url=%1$s]registration request[/url] from %2$s."
msgstr "تلقيت [url=%1$s]طلب تسجيل[/url] من %2$s."
#: src/Navigation/Notifications/Repository/Notify.php:481
#: src/Navigation/Notifications/Repository/Notify.php:490
#, php-format
msgid ""
"Full Name:\t%s\n"
@ -10493,17 +10652,17 @@ msgid ""
"Login Name:\t%s (%s)"
msgstr "الاسم الكامل:\t%s\nالموقع:\t%s\nاسم الولوج:\t%s (%s)"
#: src/Navigation/Notifications/Repository/Notify.php:487
#: src/Navigation/Notifications/Repository/Notify.php:496
#, php-format
msgid "Please visit %s to approve or reject the request."
msgstr "من فضلك زر %s لقبول أو رفض الطلب."
#: src/Navigation/Notifications/Repository/Notify.php:723
#: src/Navigation/Notifications/Repository/Notify.php:763
#, php-format
msgid "%s %s tagged you"
msgstr "ذكرك %s%s"
#: src/Navigation/Notifications/Repository/Notify.php:726
#: src/Navigation/Notifications/Repository/Notify.php:766
#, php-format
msgid "%s %s shared a new post"
msgstr "شارك %s%s مشاركة جديدة"
@ -10555,10 +10714,6 @@ msgstr ""
msgid "Edit"
msgstr "تعديل"
#: src/Object/Post.php:235
msgid "Pinned item"
msgstr "عنصر مثبت"
#: src/Object/Post.php:239
msgid "Delete globally"
msgstr "احذفه عالميًا"
@ -10656,65 +10811,73 @@ msgstr "ألغ إعادة النشر"
msgid "Unshare"
msgstr "ألغ المشاركة"
#: src/Object/Post.php:421
#: src/Object/Post.php:423
#, php-format
msgid "%s (Received %s)"
msgstr "%s (استلم %s)"
#: src/Object/Post.php:426
#: src/Object/Post.php:428
msgid "Comment this item on your system"
msgstr "علّق على هذا العنصر على خادمك"
#: src/Object/Post.php:426
#: src/Object/Post.php:428
msgid "Remote comment"
msgstr "تعليق بعيد"
#: src/Object/Post.php:470
#: src/Object/Post.php:449
msgid "Share via ..."
msgstr ""
#: src/Object/Post.php:449
msgid "Share via external services"
msgstr ""
#: src/Object/Post.php:478
msgid "to"
msgstr "إلى"
#: src/Object/Post.php:471
#: src/Object/Post.php:479
msgid "via"
msgstr "عبر"
#: src/Object/Post.php:472
#: src/Object/Post.php:480
msgid "Wall-to-Wall"
msgstr "حائط لحائط"
#: src/Object/Post.php:473
#: src/Object/Post.php:481
msgid "via Wall-To-Wall:"
msgstr "عير حائط لحائط"
#: src/Object/Post.php:515
#: src/Object/Post.php:523
#, php-format
msgid "Reply to %s"
msgstr "رد على %s"
#: src/Object/Post.php:518
#: src/Object/Post.php:526
msgid "More"
msgstr "المزيد"
#: src/Object/Post.php:536
#: src/Object/Post.php:544
msgid "Notifier task is pending"
msgstr "مهمة التنبيه معلقة"
#: src/Object/Post.php:537
#: src/Object/Post.php:545
msgid "Delivery to remote servers is pending"
msgstr "التسليم للخوادم البعيدة معلق"
#: src/Object/Post.php:538
#: src/Object/Post.php:546
msgid "Delivery to remote servers is underway"
msgstr "التسليم إلى الخوادم البعيدة جار"
#: src/Object/Post.php:539
#: src/Object/Post.php:547
msgid "Delivery to remote servers is mostly done"
msgstr "التسليم إلى الخوادم البعيدة يكاد يكتمل"
#: src/Object/Post.php:540
#: src/Object/Post.php:548
msgid "Delivery to remote servers is done"
msgstr "التسليم للخوادم البعيدة اكتمل"
#: src/Object/Post.php:560
#: src/Object/Post.php:568
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
@ -10725,11 +10888,11 @@ msgstr[3] "%d تعليقات"
msgstr[4] "%d تعليقا"
msgstr[5] "%d تعليق"
#: src/Object/Post.php:561
#: src/Object/Post.php:569
msgid "Show more"
msgstr "اعرض المزيد"
#: src/Object/Post.php:562
#: src/Object/Post.php:570
msgid "Show fewer"
msgstr "اعرض أقل"

View file

@ -301,9 +301,6 @@ $a->strings['Dislike'] = 'لم يعجبني';
$a->strings['I don\'t like this (toggle)'] = 'لم يعجبني (بدِّل)';
$a->strings['Map'] = 'خريطة';
$a->strings['View Album'] = 'اعرض الألبوم';
$a->strings['{0} wants to be your friend'] = '{0} يريد أن يكون صديقك';
$a->strings['{0} requested registration'] = '{0} طلبَ التسجيل';
$a->strings['{0} and %d others requested registration'] = '{0} و %d أخرون يطلبون التسجيل';
$a->strings['Bad Request.'] = 'طلب خاطئ.';
$a->strings['Contact not found.'] = 'لم يُعثر على المتراسل.';
$a->strings['[Friendica System Notify]'] = '[تنبيه نظام فرنديكا]';
@ -323,19 +320,6 @@ $a->strings['Error'] = [
5 => 'خطأٍ',
];
$a->strings['Failed to connect with email account using the settings provided.'] = 'فشل الاتصال بحساب البريد الإلكتروني باستخدام الإعدادات المقدمة.';
$a->strings['Contact CSV file upload error'] = 'خطأ أثناء رفع ملف CSV';
$a->strings['Importing Contacts done'] = 'أُستورد المتراسلون';
$a->strings['Relocate message has been send to your contacts'] = 'أُرسلت رسالة تنبيه بانتقالك إلى متراسليك';
$a->strings['Passwords do not match.'] = 'كلمتا المرور غير متطابقتين.';
$a->strings['Password update failed. Please try again.'] = 'فشل تحديث كلمة المرور. من فضلك أعد المحاولة.';
$a->strings['Password changed.'] = 'غُيّرت كلمة المرور.';
$a->strings['Password unchanged.'] = 'لم تُغير كلمة المرور.';
$a->strings['Please use a shorter name.'] = 'يرجى استخدام اسم أقصر.';
$a->strings['Name too short.'] = 'الاسم قصير جداً.';
$a->strings['Wrong Password.'] = 'كلمة المرور خاطئة.';
$a->strings['Invalid email.'] = 'البريد الإلكتروني غير صالح.';
$a->strings['Cannot change to that email.'] = 'لا يمكن التغيير إلى هذا البريد الإلكتروني.';
$a->strings['Settings were not updated.'] = 'لم تُحدث الإعدادات.';
$a->strings['Connected Apps'] = 'التطبيقات المتصلة';
$a->strings['Name'] = 'الاسم';
$a->strings['Home Page'] = 'الصفحة الرئيسية';
@ -382,115 +366,6 @@ $a->strings['Action after import:'] = 'الإجراء بعد الاستيراد:
$a->strings['Mark as seen'] = 'علّمه كمُشاهَد';
$a->strings['Move to folder'] = 'انقل إلى مجلد';
$a->strings['Move to folder:'] = 'انقل إلى المجلد:';
$a->strings['Unable to find your profile. Please contact your admin.'] = 'تعذر العثور على ملفك الشخصي. من فضلك اتصال بالمدير.';
$a->strings['Account Types'] = 'أنواع الحسابات';
$a->strings['Personal Page Subtypes'] = 'الأنواع الفرعية للصفحة الشخصية';
$a->strings['Community Forum Subtypes'] = 'الأنواع الفرعية للمنتدى المجتمعي';
$a->strings['Personal Page'] = 'صفحة شخصية';
$a->strings['Account for a personal profile.'] = 'حساب ملف شخصي خاص.';
$a->strings['Organisation Page'] = 'صفحة منظمة';
$a->strings['Account for an organisation that automatically approves contact requests as "Followers".'] = 'حساب المنظمة يوافق تلقائياً على طلبات المراسلة "كمتابعين".';
$a->strings['News Page'] = 'صفحة إخبارية';
$a->strings['Account for a news reflector that automatically approves contact requests as "Followers".'] = 'حساب إخباري يوافق تلقائياً على طلبات المراسلة "كمتابعين".';
$a->strings['Community Forum'] = 'منتدى مجتمعي';
$a->strings['Account for community discussions.'] = 'حساب مناقشات مجتمعية.';
$a->strings['Normal Account Page'] = 'صفحة حساب عادي';
$a->strings['Account for a regular personal profile that requires manual approval of "Friends" and "Followers".'] = 'حساب ملف شخصي عادي يتطلب الموافقة اليدوية على "الأصدقاء" و "المتابعين".';
$a->strings['Soapbox Page'] = 'صفحة سياسي';
$a->strings['Account for a public profile that automatically approves contact requests as "Followers".'] = 'حساب شخصي علني يوافق تلقائياً على طلبات المراسلة "كمتابعين".';
$a->strings['Public Forum'] = 'منتدى عمومي';
$a->strings['Automatically approves all contact requests.'] = 'يوافق تلقائياً على جميع طلبات المراسلة.';
$a->strings['Automatic Friend Page'] = 'صفحة اشترك تلقائي';
$a->strings['Account for a popular profile that automatically approves contact requests as "Friends".'] = 'حساب ملف شخصي لمشهور يوافق تلقائياً على طلبات المراسلة كـ"أصدقاء".';
$a->strings['Private Forum [Experimental]'] = 'منتدى خاص [تجريبي]';
$a->strings['Requires manual approval of contact requests.'] = 'يتطلب الموافقة اليدوية على طلبات المراسلة.';
$a->strings['OpenID:'] = 'OpenID:';
$a->strings['(Optional) Allow this OpenID to login to this account.'] = '(اختياري) اسمح لمعرف OpenID بالولوج إلى هذا الحساب.';
$a->strings['Publish your profile in your local site directory?'] = 'أتريد نشر ملفك الشخصي في الدليل المحلي للموقع؟';
$a->strings['Your profile will be published in this node\'s <a href="%s">local directory</a>. Your profile details may be publicly visible depending on the system settings.'] = 'سينشر ملفك الشخصي في <a href="%s"> الدليل المحلي</a> لهذه العقدة. تعتمد خصوصية معلوماتك على إعدادات النظام.';
$a->strings['Your profile will also be published in the global friendica directories (e.g. <a href="%s">%s</a>).'] = 'سينشر ملفك الشخصي كذلك في الأدلة العالمية لفرَندِيكا (مثال <a href="%s">%s</a>).';
$a->strings['Your Identity Address is <strong>\'%s\'</strong> or \'%s\'.'] = 'عنوان معرفك هو <strong>\'%s\'</strong> أو \'%s\'.';
$a->strings['Account Settings'] = 'إعدادات الحساب';
$a->strings['Password Settings'] = 'إعدادات كلمة المرور';
$a->strings['New Password:'] = 'كلمة المرور الجديدة:';
$a->strings['Allowed characters are a-z, A-Z, 0-9 and special characters except white spaces, accentuated letters and colon (:).'] = 'المحارف المسموح بها هي a-z، A-Z، 0-9 والأحرف الخاصة باستثناء المساحات، الأحرف المنبورة ونقطتي التفسير (:).';
$a->strings['Confirm:'] = 'التأكيد:';
$a->strings['Leave password fields blank unless changing'] = 'اترك حقول كلمة المرور فارغة ما لم ترد تغييرها';
$a->strings['Current Password:'] = 'كلمة المرور الحالية:';
$a->strings['Your current password to confirm the changes'] = 'اكتب كلمة المرور الحالية لتأكيد التغييرات';
$a->strings['Password:'] = 'كلمة المرور:';
$a->strings['Your current password to confirm the changes of the email address'] = 'اكتب كلمة المرور الحالية لتأكيد تغيير بريدك الإلكتروني';
$a->strings['Delete OpenID URL'] = 'احذف معرف OpenID';
$a->strings['Basic Settings'] = 'الإعدادات الأساسيّة';
$a->strings['Full Name:'] = 'الاسم الكامل:';
$a->strings['Email Address:'] = 'البريد الإلكتروني:';
$a->strings['Your Timezone:'] = 'المنطقة الزمنية:';
$a->strings['Your Language:'] = 'لغتك:';
$a->strings['Set the language we use to show you friendica interface and to send you emails'] = 'عيّن لغة واجهة فرَندِيكا ورسائل البريد الإلكتروني';
$a->strings['Default Post Location:'] = 'موقع النشر الافتراضي:';
$a->strings['Use Browser Location:'] = 'استخدم موقع المتصفح:';
$a->strings['Security and Privacy Settings'] = 'إعدادات الأمان والخصوصية';
$a->strings['Maximum Friend Requests/Day:'] = 'حدُ طلبات الصداقة لليوم الواحد:';
$a->strings['(to prevent spam abuse)'] = '(لمنع الرسائل المزعجة)';
$a->strings['Allow your profile to be searchable globally?'] = 'أتريد السماح لملفك الشخصي بالظهور في نتائج البحث العالمي؟';
$a->strings['Activate this setting if you want others to easily find and follow you. Your profile will be searchable on remote systems. This setting also determines whether Friendica will inform search engines that your profile should be indexed or not.'] = 'فعّل هذا الإعداد إن أردت أن يُعثر عليك بسهولة. سيتمكن المستخدمون في المواقع البعيد من العثور عليك، وأيضا سيسمح بظهور ملفك الشخصي في محركات البحث.';
$a->strings['Hide your contact/friend list from viewers of your profile?'] = 'أتريد إخفاء قائمة المتراسلين/الأصدقاء عن متصفحي ملفك الشخصي؟';
$a->strings['A list of your contacts is displayed on your profile page. Activate this option to disable the display of your contact list.'] = 'عادة تُعرض قائمة المتراسلين على صفحة ملفك الشخصي. إن قمت بتفعيل هذا الخيار ستخفى القائمة.';
$a->strings['Hide your profile details from anonymous viewers?'] = 'اخف معلومات ملفك الشخص عن المتصفحين المجهولين؟';
$a->strings['Anonymous visitors will only see your profile picture, your display name and the nickname you are using on your profile page. Your public posts and replies will still be accessible by other means.'] = 'سيرى الزوار المجهولون صورة ملفك الشخصي واسمك العلني ولقبك فقط. لكن ستبقى مشاركتك العامة وردودك متاحة عبر وسائل أخرى.';
$a->strings['Make public posts unlisted'] = 'لا تدرج المشاركات العلنية';
$a->strings['Your public posts will not appear on the community pages or in search results, nor be sent to relay servers. However they can still appear on public feeds on remote servers.'] = 'لن تظهر مشاركتك العلنية على صفحات المجتمع أو في نتائج البحث لهذا الموقع، ولن يتم إرسالها إلى خوادم الترحيل. غير أنها ستبقى تظهر في التغذيات العمومية للخوادم البعيدة.';
$a->strings['Make all posted pictures accessible'] = 'أتح كل الصور المنشورة';
$a->strings['This option makes every posted picture accessible via the direct link. This is a workaround for the problem that most other networks can\'t handle permissions on pictures. Non public pictures still won\'t be visible for the public on your photo albums though.'] = 'يسمح هذا الخيار بالوصول للصورة المنشورة عبر رابط مباشر. هذا حل لمعظم الشبكات التي لا يمكنها التعامل مع الأذونات. صورك غير العلنية ستبقى مخفية.';
$a->strings['Allow friends to post to your profile page?'] = 'أتسمح لأصدقائك بالنشر في صفحة ملفك الشخصي؟';
$a->strings['Your contacts may write posts on your profile wall. These posts will be distributed to your contacts'] = 'يمكن للمتراسلين كتابة مشاركات على حائط ملفك الشخصي. ستكون هذه المشركات مرئية لكل المتراسلين';
$a->strings['Allow friends to tag your posts?'] = 'أتسمح لأصدقائك بوسم مشاركاتك؟';
$a->strings['Your contacts can add additional tags to your posts.'] = 'يمكن لأصدقائك إضافة وسوم لمشاركاتك.';
$a->strings['Permit unknown people to send you private mail?'] = 'أتسمح لأشخاص مجهولين بإرسال بريد خاص لك؟';
$a->strings['Friendica network users may send you private messages even if they are not in your contact list.'] = 'يمكن لمستخدمي شبكة فرَندِكا إرسال رسائل خاصة لك حتى إن لم يكونوا في قائمة المتراسلين.';
$a->strings['Maximum private messages per day from unknown people:'] = 'حد الرسائل اليومي المستلمة من مجهولين:';
$a->strings['Default Post Permissions'] = 'أذونات النشر الافتراضية';
$a->strings['Expiration settings'] = 'إعدادات انتهاء الصلاحية';
$a->strings['Automatically expire posts after this many days:'] = 'أنه صَلاحِيَة المشاركات تلقائياً بعد هذا العدد من الأيام:';
$a->strings['If empty, posts will not expire. Expired posts will be deleted'] = 'إذا كان فارغاً، لن تنتهي صلاحية المشاركات. وإلا بعد المهلة ستحذف المشاركات المنتهية صلاحيتها';
$a->strings['Expire posts'] = 'أنه صَلاحِيَة المشاركات';
$a->strings['When activated, posts and comments will be expired.'] = 'عند تفعيله، ستنهى صلاحية المشاركات والتعليقات.';
$a->strings['Expire personal notes'] = 'أنه صَلاحِيَة الملاحظات الشخصية';
$a->strings['When activated, the personal notes on your profile page will be expired.'] = 'عند تفعيله، ستنهى صلاحية الملاحظات الشخصية على صفحة ملفك الشخصي.';
$a->strings['Expire starred posts'] = 'أنتهي صلاحية المشاركات المفضلة';
$a->strings['Starring posts keeps them from being expired. That behaviour is overwritten by this setting.'] = 'تفضيل مشاركة تقيها من انتهاء الصلاحية. هذا السلوك يُتجاوز من خلال هذا الإعداد.';
$a->strings['Expire photos'] = 'أنه صَلاحِيَة الصور';
$a->strings['When activated, photos will be expired.'] = 'عند تفعيله، ستنهى صلاحية الصور.';
$a->strings['Only expire posts by others'] = 'أنه صَلاحِيَة مشاركات الآخرين فقط';
$a->strings['When activated, your own posts never expire. Then the settings above are only valid for posts you received.'] = 'عند تفعيله، لا نهاية لصلاحية مشاركاتك. ثم تكون الإعدادات أعلاه صالحة فقط للمشاركات التي استلمتها.';
$a->strings['Notification Settings'] = 'إعدادات التنبيهات';
$a->strings['Send a notification email when:'] = 'أرسل تنبيها للبريدي الإلكتروني عند:';
$a->strings['You receive an introduction'] = 'تلقي تقديم';
$a->strings['Your introductions are confirmed'] = 'أُكدت تقديماتك';
$a->strings['Someone writes on your profile wall'] = 'يكتب شخص ما على جدار ملفك الشخصي';
$a->strings['Someone writes a followup comment'] = 'شخص ما يعلق على ما نشرت';
$a->strings['You receive a private message'] = 'تلقي رسالة خاصة';
$a->strings['You receive a friend suggestion'] = 'تلقي اقتراح صداقة';
$a->strings['You are tagged in a post'] = 'ذُكرتَ في مشاركة';
$a->strings['Create a desktop notification when:'] = 'أنشئ تنبيه سطح المكتب عند:';
$a->strings['Someone liked your content'] = 'أُعجب شخص بمحتواك';
$a->strings['Someone shared your content'] = 'شارك شخص محتواك';
$a->strings['Activate desktop notifications'] = 'نشّط تنبيهات سطح المكتب';
$a->strings['Show desktop popup on new notifications'] = 'أظهر منبثقات للتنبيهات الجديدة';
$a->strings['Text-only notification emails'] = 'رسائل تنبيه نصية فقط';
$a->strings['Send text only notification emails, without the html part'] = 'أرسل بريد التنبيه كنص فقط، دون وسوم html';
$a->strings['Show detailled notifications'] = 'اعرض تنبيهات مفصلة';
$a->strings['Per default, notifications are condensed to a single notification per item. When enabled every notification is displayed.'] = 'افتراضيًا ، يعرض أحدث تنبيه فقط لكل محادثة. عند تفعيله ستعرض جميع التنبيهات.';
$a->strings['Show notifications of ignored contacts'] = 'أظهر تنبيهات للمتراسلين المتجاهلين';
$a->strings['You don\'t see posts from ignored contacts. But you still see their comments. This setting controls if you want to still receive regular notifications that are caused by ignored contacts or not.'] = 'أنت لا ترى مشاركات المتراسلين المتجاهلين. لكن لا يزال بإمكانك رؤية تعليقاتهم. هذا الإعداد يتحكم إذا كنت ترغب في الاستمرار في تلقي تنبيهات سببها المتراسلون المتجاهلون.';
$a->strings['Advanced Account/Page Type Settings'] = 'الإعدادات المتقدمة للحساب/للصفحة';
$a->strings['Change the behaviour of this account for special situations'] = 'غيّر سلوك هذا الحساب للحالات الخاصة';
$a->strings['Import Contacts'] = 'استيراد متراسلين';
$a->strings['Upload a CSV file that contains the handle of your followed accounts in the first column you exported from the old account.'] = 'ارفع ملف CSV معرفات المتراسلين لحسابك القديم، معرفات المتابَعين تكون في العمود الأول.';
$a->strings['Upload File'] = 'ارفع ملفًا';
$a->strings['Relocate'] = 'الانتقال';
$a->strings['If you have moved this profile from another server, and some of your contacts don\'t receive your updates, try pushing this button.'] = 'إذا كنت قد نقلت هذا الملف الشخصي من خادم آخر، وبعض المتراسلين لا يتلقون تحديثاتك، أنقر هذا الزر.';
$a->strings['Resend relocate message to contacts'] = 'أعد إرسال رسالة الانتقال للمتراسلين';
$a->strings['No suggestions available. If this is a new site, please try again in 24 hours.'] = 'لا توجد اقتراحات متاحة. إذا كان هذا الموقع جديد، من فضلك أعد المحاولة في غضون 24 ساعة.';
$a->strings['Friend Suggestions'] = 'اقتراحات الأصدقاء';
$a->strings['photo'] = 'صورة';
@ -551,6 +426,8 @@ $a->strings['Execute pending post updates.'] = 'نفذ التحديثات الم
$a->strings['All pending post updates are done.'] = 'تمت كل تحديثات المعلقة للمشاركة.';
$a->strings['Enter user nickname: '] = 'أدخل لقب المستخدم: ';
$a->strings['Enter new password: '] = 'أدخل كلمة مرور جديدة: ';
$a->strings['Password update failed. Please try again.'] = 'فشل تحديث كلمة المرور. من فضلك أعد المحاولة.';
$a->strings['Password changed.'] = 'غُيّرت كلمة المرور.';
$a->strings['Enter user name: '] = 'أدخل اسم المستخدم: ';
$a->strings['Enter user email address: '] = 'أدخل عنوان البريد الإلكتروني: ';
$a->strings['Enter a language (optional): '] = 'أدخل اللغة (اختياري): ';
@ -616,6 +493,7 @@ $a->strings['Share'] = 'شارك';
$a->strings['Image'] = 'صورة';
$a->strings['Video'] = 'فيديو';
$a->strings['Scheduled at'] = 'بُرمِج في';
$a->strings['Pinned item'] = 'عنصر مثبت';
$a->strings['View %s\'s profile @ %s'] = 'اعرض ملف %s الشخصي @ %s';
$a->strings['Categories:'] = 'الفئات:';
$a->strings['Filed under:'] = 'مصنف كـ:';
@ -788,6 +666,7 @@ $a->strings['Archives'] = 'الأرشيفات';
$a->strings['Persons'] = 'الأشخاص';
$a->strings['Organisations'] = 'المنظّمات';
$a->strings['News'] = 'الأخبار';
$a->strings['Account Types'] = 'أنواع الحسابات';
$a->strings['All'] = 'الكل';
$a->strings['Export'] = 'صدّر';
$a->strings['Export calendar as ical'] = 'صدّر الرزنامة كملف ical';
@ -1251,7 +1130,15 @@ $a->strings['Blocked'] = 'محجوب';
$a->strings['List of blocked users'] = 'قائمة المستخدمين المحجوبين';
$a->strings['Deleted'] = 'حُذف';
$a->strings['List of pending user deletions'] = 'قائمة الحذف المعلق للمستخدمين';
$a->strings['Normal Account Page'] = 'صفحة حساب عادي';
$a->strings['Soapbox Page'] = 'صفحة سياسي';
$a->strings['Public Forum'] = 'منتدى عمومي';
$a->strings['Automatic Friend Page'] = 'صفحة اشترك تلقائي';
$a->strings['Private Forum'] = 'منتدى خاص';
$a->strings['Personal Page'] = 'صفحة شخصية';
$a->strings['Organisation Page'] = 'صفحة منظمة';
$a->strings['News Page'] = 'صفحة إخبارية';
$a->strings['Community Forum'] = 'منتدى مجتمعي';
$a->strings['Relay'] = 'مُرحِل';
$a->strings['%s contact unblocked'] = [
0 => 'لم يُرفع الحجب عن مستخدم %s',
@ -1346,9 +1233,7 @@ $a->strings['Other'] = 'أخرى';
$a->strings['unknown'] = 'مجهول';
$a->strings['%s total systems'] = '%s نظام';
$a->strings['%s active users last month'] = '%s مستخدم نشط في آخر شهر';
$a->strings['%s active users last six month'] = '%s مستخدم نشط في آخر ستة أشهر';
$a->strings['%s registered users'] = '%s مستخدم مسجل';
$a->strings['%s local posts'] = '%s مشاركة محلية';
$a->strings['%s posts per user'] = '%s مشاركة لكل مستخدم';
$a->strings['%s users per system'] = '%s مستخدم لكل نظام';
$a->strings['This page offers you some numbers to the known part of the federated social network your Friendica node is part of. These numbers are not complete but only reflect the part of the network your node is aware of.'] = 'تقدم لك هذه الصفحة بعض الإحصائيات للجزء المعروف من الشبكة الاجتماعية الموحدة المتصلة بعقدتك. هذه الإحصائيات ليست كاملة ولكنها تتضمن المواقع المعروفة لعقدتك من الشبكة.';
@ -1405,8 +1290,6 @@ $a->strings['ID'] = 'المعرف';
$a->strings['Command'] = 'أمر';
$a->strings['Job Parameters'] = 'معطيات العملية';
$a->strings['Priority'] = 'الأولوية';
$a->strings['Can not parse base url. Must have at least <scheme>://<domain>'] = 'يتعذر تحليل الرابط الأساسي. يجب أن يكون <scheme>://<domain>';
$a->strings['Relocation started. Could take a while to complete.'] = 'بدأ النقل. قد يستغرق بعض الوقت.';
$a->strings['No special theme for mobile devices'] = 'لا توجد سمة مخصصة للهاتف';
$a->strings['%s - (Experimental)'] = '%s - (اختباري)';
$a->strings['No community page for local users'] = 'لا توجد صفحة مجتمع للمستخدمين المحليين';
@ -1437,8 +1320,6 @@ $a->strings['Worker'] = 'مهمة';
$a->strings['Message Relay'] = 'ترحيل الرسالة';
$a->strings['The system is not subscribed to any relays at the moment.'] = 'هذا الخادم ليس مشترك في أي مرحلات حاليًا.';
$a->strings['The system is currently subscribed to the following relays:'] = 'هذا الخادم مشترك حاليًا في المرحلات التالية:';
$a->strings['Relocate Instance'] = 'انقل المثيل';
$a->strings['<strong>Warning!</strong> Advanced function. Could make this server unreachable.'] = '<strong>تحذير!</strong> وظيفة متقدمة. يمكن أن تجعل هذا الخادم غير قابل للوصول.';
$a->strings['Site name'] = 'اسم الموقع';
$a->strings['Sender Email'] = 'بريد المرسل';
$a->strings['The email address your server shall use to send notification emails from.'] = 'عنوان البريد الإلكتروني الذي سيستخدمه الخادم لإرسال رسائل التنبيه.';
@ -1454,7 +1335,6 @@ $a->strings['Additional Info'] = 'معلومات إضافية';
$a->strings['For public servers: you can add additional information here that will be listed at %s/servers.'] = 'للخوادم العامة: يمكنك إضافة معلومات إضافية لتدرج في %s/servers.';
$a->strings['System language'] = 'لغة النظام';
$a->strings['System theme'] = 'سمة النظام';
$a->strings['Default system theme - may be over-ridden by user profiles - <a href="/admin/themes" id="cnftheme">Change default theme settings</a>'] = 'مظهر الموقع الافتراضي يختلف بناءً على الملف الشخصي الذي تمت زيارته - <a href="/admin/themes" id="cnftheme"> غيّر إعدادات السمة الافتراضية</a>';
$a->strings['Mobile system theme'] = 'سمة الهاتف';
$a->strings['Theme for mobile devices'] = 'سمة للأجهزة المحمولة';
$a->strings['SSL link policy'] = 'سياسة روابط SSL';
@ -1555,7 +1435,6 @@ $a->strings['Temp path'] = 'مسار التخزين المؤقت';
$a->strings['If you have a restricted system where the webserver can\'t access the system temp path, enter another path here.'] = 'إذا كان نظامك مقيد حيث لا يستطيع خادم الويب الوصول إلى مسار مجلد التخزين المؤقت (temp)، أدخل مسار آخر هنا.';
$a->strings['Only search in tags'] = 'ابحث في الوسوم فقط';
$a->strings['On large systems the text search can slow down the system extremely.'] = 'في النّظم الكبيرة، يمكن أن يؤدي البحث عن النصوص إلى إبطاء النظام.';
$a->strings['New base url'] = 'رابط أساسي جديد';
$a->strings['Maximum number of parallel workers'] = 'الحد الأقصى لعدد المهام';
$a->strings['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.'] = 'إما أن يكون "الكل" أو "الوسوم". يعني "الكل" وُجوب تلقي كل المشاركات العلنية. تعني "الوسوم" وجوب تلقي المشاركات ذات الوسوم المحددة فقط.';
$a->strings['Disabled'] = 'معطّل';
@ -2072,6 +1951,8 @@ $a->strings['System Notifications'] = 'تنبيهات النظام';
$a->strings['Personal Notifications'] = 'تنبيهات شخصية';
$a->strings['Home Notifications'] = 'تنبيهات الصفحة الرئيسية';
$a->strings['Show unread'] = 'اعرض غير المقروءة';
$a->strings['{0} requested registration'] = '{0} طلبَ التسجيل';
$a->strings['{0} and %d others requested registration'] = '{0} و %d أخرون يطلبون التسجيل';
$a->strings['Authorize application connection'] = 'خول لهذا التطبيق الاتصال';
$a->strings['Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?'] = 'هل تخول لهذا التطبيق الوصول إلى مشاركاتك ومتراسليك، و/أو إنشاء مشاركات جديدة باسمك؟';
$a->strings['Unsupported or missing response type'] = 'نوع الاستجابة غير مدعومة أو مفقودة';
@ -2089,6 +1970,7 @@ $a->strings['Invalid photo with id %s.'] = 'الصورة ذات المعرف %s
$a->strings['No contacts.'] = 'لا متراسلين.';
$a->strings['Profile not found.'] = 'لم يُعثر على الملف الشخصي.';
$a->strings['You\'re currently viewing your profile as <b>%s</b> <a href="%s" class="btn btn-sm pull-right">Cancel</a>'] = 'أنت حاليا تستعرض ملفك الشخصي كـ <b>%s</b><a href="%s" class="btn btn-sm pull-right"> ألغ</a>';
$a->strings['Full Name:'] = 'الاسم الكامل:';
$a->strings['Member since:'] = 'عضو منذ:';
$a->strings['j F, Y'] = 'j F, Y';
$a->strings['j F'] = 'j F';
@ -2121,6 +2003,8 @@ $a->strings['Membership on this site is by invitation only.'] = 'العضوية
$a->strings['Your invitation code: '] = 'رمز الدعوة: ';
$a->strings['Your Full Name (e.g. Joe Smith, real or real-looking): '] = 'اسمك الكامل (على سبيل المثال جو سميث): ';
$a->strings['Please repeat your e-mail address:'] = 'رجاء أعد إدخال عنوان بريدك الإلكتروني:';
$a->strings['New Password:'] = 'كلمة المرور الجديدة:';
$a->strings['Confirm:'] = 'التأكيد:';
$a->strings['Choose a nickname: '] = 'اختر لقبًا: ';
$a->strings['Import your profile to this friendica instance'] = 'استورد ملفك الشخصي لهذا المثيل';
$a->strings['Parent Password:'] = 'كلمة المرور الولي:';
@ -2168,6 +2052,112 @@ $a->strings['<p>Open the two-factor authentication app on your device to get an
$a->strings['Please enter a code from your authentication app'] = 'يرجى إدخال رمز من تطبيق الاستيثاق';
$a->strings['This is my two-factor authenticator app device'] = 'هذا هو جهاز الذي استخدمه للاستيثاق بعاملين';
$a->strings['Verify code and complete login'] = 'تحقق من الرمز وأكمل الولوج';
$a->strings['Passwords do not match.'] = 'كلمتا المرور غير متطابقتين.';
$a->strings['Password unchanged.'] = 'لم تُغير كلمة المرور.';
$a->strings['Please use a shorter name.'] = 'يرجى استخدام اسم أقصر.';
$a->strings['Name too short.'] = 'الاسم قصير جداً.';
$a->strings['Wrong Password.'] = 'كلمة المرور خاطئة.';
$a->strings['Invalid email.'] = 'البريد الإلكتروني غير صالح.';
$a->strings['Cannot change to that email.'] = 'لا يمكن التغيير إلى هذا البريد الإلكتروني.';
$a->strings['Settings were not updated.'] = 'لم تُحدث الإعدادات.';
$a->strings['Contact CSV file upload error'] = 'خطأ أثناء رفع ملف CSV';
$a->strings['Importing Contacts done'] = 'أُستورد المتراسلون';
$a->strings['Relocate message has been send to your contacts'] = 'أُرسلت رسالة تنبيه بانتقالك إلى متراسليك';
$a->strings['Unable to find your profile. Please contact your admin.'] = 'تعذر العثور على ملفك الشخصي. من فضلك اتصال بالمدير.';
$a->strings['Personal Page Subtypes'] = 'الأنواع الفرعية للصفحة الشخصية';
$a->strings['Community Forum Subtypes'] = 'الأنواع الفرعية للمنتدى المجتمعي';
$a->strings['Account for a personal profile.'] = 'حساب ملف شخصي خاص.';
$a->strings['Account for an organisation that automatically approves contact requests as "Followers".'] = 'حساب المنظمة يوافق تلقائياً على طلبات المراسلة "كمتابعين".';
$a->strings['Account for a news reflector that automatically approves contact requests as "Followers".'] = 'حساب إخباري يوافق تلقائياً على طلبات المراسلة "كمتابعين".';
$a->strings['Account for community discussions.'] = 'حساب مناقشات مجتمعية.';
$a->strings['Account for a regular personal profile that requires manual approval of "Friends" and "Followers".'] = 'حساب ملف شخصي عادي يتطلب الموافقة اليدوية على "الأصدقاء" و "المتابعين".';
$a->strings['Account for a public profile that automatically approves contact requests as "Followers".'] = 'حساب شخصي علني يوافق تلقائياً على طلبات المراسلة "كمتابعين".';
$a->strings['Automatically approves all contact requests.'] = 'يوافق تلقائياً على جميع طلبات المراسلة.';
$a->strings['Account for a popular profile that automatically approves contact requests as "Friends".'] = 'حساب ملف شخصي لمشهور يوافق تلقائياً على طلبات المراسلة كـ"أصدقاء".';
$a->strings['Private Forum [Experimental]'] = 'منتدى خاص [تجريبي]';
$a->strings['Requires manual approval of contact requests.'] = 'يتطلب الموافقة اليدوية على طلبات المراسلة.';
$a->strings['OpenID:'] = 'OpenID:';
$a->strings['(Optional) Allow this OpenID to login to this account.'] = '(اختياري) اسمح لمعرف OpenID بالولوج إلى هذا الحساب.';
$a->strings['Publish your profile in your local site directory?'] = 'أتريد نشر ملفك الشخصي في الدليل المحلي للموقع؟';
$a->strings['Your profile will be published in this node\'s <a href="%s">local directory</a>. Your profile details may be publicly visible depending on the system settings.'] = 'سينشر ملفك الشخصي في <a href="%s"> الدليل المحلي</a> لهذه العقدة. تعتمد خصوصية معلوماتك على إعدادات النظام.';
$a->strings['Your profile will also be published in the global friendica directories (e.g. <a href="%s">%s</a>).'] = 'سينشر ملفك الشخصي كذلك في الأدلة العالمية لفرَندِيكا (مثال <a href="%s">%s</a>).';
$a->strings['Account Settings'] = 'إعدادات الحساب';
$a->strings['Your Identity Address is <strong>\'%s\'</strong> or \'%s\'.'] = 'عنوان معرفك هو <strong>\'%s\'</strong> أو \'%s\'.';
$a->strings['Password Settings'] = 'إعدادات كلمة المرور';
$a->strings['Allowed characters are a-z, A-Z, 0-9 and special characters except white spaces, accentuated letters and colon (:).'] = 'المحارف المسموح بها هي a-z، A-Z، 0-9 والأحرف الخاصة باستثناء المساحات، الأحرف المنبورة ونقطتي التفسير (:).';
$a->strings['Leave password fields blank unless changing'] = 'اترك حقول كلمة المرور فارغة ما لم ترد تغييرها';
$a->strings['Current Password:'] = 'كلمة المرور الحالية:';
$a->strings['Your current password to confirm the changes'] = 'اكتب كلمة المرور الحالية لتأكيد التغييرات';
$a->strings['Password:'] = 'كلمة المرور:';
$a->strings['Your current password to confirm the changes of the email address'] = 'اكتب كلمة المرور الحالية لتأكيد تغيير بريدك الإلكتروني';
$a->strings['Delete OpenID URL'] = 'احذف معرف OpenID';
$a->strings['Basic Settings'] = 'الإعدادات الأساسيّة';
$a->strings['Email Address:'] = 'البريد الإلكتروني:';
$a->strings['Your Timezone:'] = 'المنطقة الزمنية:';
$a->strings['Your Language:'] = 'لغتك:';
$a->strings['Set the language we use to show you friendica interface and to send you emails'] = 'عيّن لغة واجهة فرَندِيكا ورسائل البريد الإلكتروني';
$a->strings['Default Post Location:'] = 'موقع النشر الافتراضي:';
$a->strings['Use Browser Location:'] = 'استخدم موقع المتصفح:';
$a->strings['Security and Privacy Settings'] = 'إعدادات الأمان والخصوصية';
$a->strings['Maximum Friend Requests/Day:'] = 'حدُ طلبات الصداقة لليوم الواحد:';
$a->strings['(to prevent spam abuse)'] = '(لمنع الرسائل المزعجة)';
$a->strings['Allow your profile to be searchable globally?'] = 'أتريد السماح لملفك الشخصي بالظهور في نتائج البحث العالمي؟';
$a->strings['Activate this setting if you want others to easily find and follow you. Your profile will be searchable on remote systems. This setting also determines whether Friendica will inform search engines that your profile should be indexed or not.'] = 'فعّل هذا الإعداد إن أردت أن يُعثر عليك بسهولة. سيتمكن المستخدمون في المواقع البعيد من العثور عليك، وأيضا سيسمح بظهور ملفك الشخصي في محركات البحث.';
$a->strings['Hide your contact/friend list from viewers of your profile?'] = 'أتريد إخفاء قائمة المتراسلين/الأصدقاء عن متصفحي ملفك الشخصي؟';
$a->strings['A list of your contacts is displayed on your profile page. Activate this option to disable the display of your contact list.'] = 'عادة تُعرض قائمة المتراسلين على صفحة ملفك الشخصي. إن قمت بتفعيل هذا الخيار ستخفى القائمة.';
$a->strings['Hide your profile details from anonymous viewers?'] = 'اخف معلومات ملفك الشخص عن المتصفحين المجهولين؟';
$a->strings['Anonymous visitors will only see your profile picture, your display name and the nickname you are using on your profile page. Your public posts and replies will still be accessible by other means.'] = 'سيرى الزوار المجهولون صورة ملفك الشخصي واسمك العلني ولقبك فقط. لكن ستبقى مشاركتك العامة وردودك متاحة عبر وسائل أخرى.';
$a->strings['Make public posts unlisted'] = 'لا تدرج المشاركات العلنية';
$a->strings['Your public posts will not appear on the community pages or in search results, nor be sent to relay servers. However they can still appear on public feeds on remote servers.'] = 'لن تظهر مشاركتك العلنية على صفحات المجتمع أو في نتائج البحث لهذا الموقع، ولن يتم إرسالها إلى خوادم الترحيل. غير أنها ستبقى تظهر في التغذيات العمومية للخوادم البعيدة.';
$a->strings['Make all posted pictures accessible'] = 'أتح كل الصور المنشورة';
$a->strings['This option makes every posted picture accessible via the direct link. This is a workaround for the problem that most other networks can\'t handle permissions on pictures. Non public pictures still won\'t be visible for the public on your photo albums though.'] = 'يسمح هذا الخيار بالوصول للصورة المنشورة عبر رابط مباشر. هذا حل لمعظم الشبكات التي لا يمكنها التعامل مع الأذونات. صورك غير العلنية ستبقى مخفية.';
$a->strings['Allow friends to post to your profile page?'] = 'أتسمح لأصدقائك بالنشر في صفحة ملفك الشخصي؟';
$a->strings['Your contacts may write posts on your profile wall. These posts will be distributed to your contacts'] = 'يمكن للمتراسلين كتابة مشاركات على حائط ملفك الشخصي. ستكون هذه المشركات مرئية لكل المتراسلين';
$a->strings['Allow friends to tag your posts?'] = 'أتسمح لأصدقائك بوسم مشاركاتك؟';
$a->strings['Your contacts can add additional tags to your posts.'] = 'يمكن لأصدقائك إضافة وسوم لمشاركاتك.';
$a->strings['Permit unknown people to send you private mail?'] = 'أتسمح لأشخاص مجهولين بإرسال بريد خاص لك؟';
$a->strings['Friendica network users may send you private messages even if they are not in your contact list.'] = 'يمكن لمستخدمي شبكة فرَندِكا إرسال رسائل خاصة لك حتى إن لم يكونوا في قائمة المتراسلين.';
$a->strings['Maximum private messages per day from unknown people:'] = 'حد الرسائل اليومي المستلمة من مجهولين:';
$a->strings['Default Post Permissions'] = 'أذونات النشر الافتراضية';
$a->strings['Expiration settings'] = 'إعدادات انتهاء الصلاحية';
$a->strings['Automatically expire posts after this many days:'] = 'أنه صَلاحِيَة المشاركات تلقائياً بعد هذا العدد من الأيام:';
$a->strings['If empty, posts will not expire. Expired posts will be deleted'] = 'إذا كان فارغاً، لن تنتهي صلاحية المشاركات. وإلا بعد المهلة ستحذف المشاركات المنتهية صلاحيتها';
$a->strings['Expire posts'] = 'أنه صَلاحِيَة المشاركات';
$a->strings['When activated, posts and comments will be expired.'] = 'عند تفعيله، ستنهى صلاحية المشاركات والتعليقات.';
$a->strings['Expire personal notes'] = 'أنه صَلاحِيَة الملاحظات الشخصية';
$a->strings['When activated, the personal notes on your profile page will be expired.'] = 'عند تفعيله، ستنهى صلاحية الملاحظات الشخصية على صفحة ملفك الشخصي.';
$a->strings['Expire starred posts'] = 'أنتهي صلاحية المشاركات المفضلة';
$a->strings['Starring posts keeps them from being expired. That behaviour is overwritten by this setting.'] = 'تفضيل مشاركة تقيها من انتهاء الصلاحية. هذا السلوك يُتجاوز من خلال هذا الإعداد.';
$a->strings['Only expire posts by others'] = 'أنه صَلاحِيَة مشاركات الآخرين فقط';
$a->strings['When activated, your own posts never expire. Then the settings above are only valid for posts you received.'] = 'عند تفعيله، لا نهاية لصلاحية مشاركاتك. ثم تكون الإعدادات أعلاه صالحة فقط للمشاركات التي استلمتها.';
$a->strings['Notification Settings'] = 'إعدادات التنبيهات';
$a->strings['Send a notification email when:'] = 'أرسل تنبيها للبريدي الإلكتروني عند:';
$a->strings['You receive an introduction'] = 'تلقي تقديم';
$a->strings['Your introductions are confirmed'] = 'أُكدت تقديماتك';
$a->strings['Someone writes on your profile wall'] = 'يكتب شخص ما على جدار ملفك الشخصي';
$a->strings['Someone writes a followup comment'] = 'شخص ما يعلق على ما نشرت';
$a->strings['You receive a private message'] = 'تلقي رسالة خاصة';
$a->strings['You receive a friend suggestion'] = 'تلقي اقتراح صداقة';
$a->strings['You are tagged in a post'] = 'ذُكرتَ في مشاركة';
$a->strings['Create a desktop notification when:'] = 'أنشئ تنبيه سطح المكتب عند:';
$a->strings['Someone liked your content'] = 'أُعجب شخص بمحتواك';
$a->strings['Someone shared your content'] = 'شارك شخص محتواك';
$a->strings['Activate desktop notifications'] = 'نشّط تنبيهات سطح المكتب';
$a->strings['Show desktop popup on new notifications'] = 'أظهر منبثقات للتنبيهات الجديدة';
$a->strings['Text-only notification emails'] = 'رسائل تنبيه نصية فقط';
$a->strings['Send text only notification emails, without the html part'] = 'أرسل بريد التنبيه كنص فقط، دون وسوم html';
$a->strings['Show detailled notifications'] = 'اعرض تنبيهات مفصلة';
$a->strings['Per default, notifications are condensed to a single notification per item. When enabled every notification is displayed.'] = 'افتراضيًا ، يعرض أحدث تنبيه فقط لكل محادثة. عند تفعيله ستعرض جميع التنبيهات.';
$a->strings['Show notifications of ignored contacts'] = 'أظهر تنبيهات للمتراسلين المتجاهلين';
$a->strings['You don\'t see posts from ignored contacts. But you still see their comments. This setting controls if you want to still receive regular notifications that are caused by ignored contacts or not.'] = 'أنت لا ترى مشاركات المتراسلين المتجاهلين. لكن لا يزال بإمكانك رؤية تعليقاتهم. هذا الإعداد يتحكم إذا كنت ترغب في الاستمرار في تلقي تنبيهات سببها المتراسلون المتجاهلون.';
$a->strings['Advanced Account/Page Type Settings'] = 'الإعدادات المتقدمة للحساب/للصفحة';
$a->strings['Change the behaviour of this account for special situations'] = 'غيّر سلوك هذا الحساب للحالات الخاصة';
$a->strings['Import Contacts'] = 'استيراد متراسلين';
$a->strings['Upload a CSV file that contains the handle of your followed accounts in the first column you exported from the old account.'] = 'ارفع ملف CSV معرفات المتراسلين لحسابك القديم، معرفات المتابَعين تكون في العمود الأول.';
$a->strings['Upload File'] = 'ارفع ملفًا';
$a->strings['Relocate'] = 'الانتقال';
$a->strings['If you have moved this profile from another server, and some of your contacts don\'t receive your updates, try pushing this button.'] = 'إذا كنت قد نقلت هذا الملف الشخصي من خادم آخر، وبعض المتراسلين لا يتلقون تحديثاتك، أنقر هذا الزر.';
$a->strings['Resend relocate message to contacts'] = 'أعد إرسال رسالة الانتقال للمتراسلين';
$a->strings['Delegation successfully granted.'] = 'منح التفويض بنجاح.';
$a->strings['Parent user not found, unavailable or password doesn\'t match.'] = 'لم يُعثر على الولي أو هو غير متوفر أو كلمة مرور غير صحيحة.';
$a->strings['Delegation successfully revoked.'] = 'نجح إبطال التفويض.';
@ -2361,6 +2351,7 @@ $a->strings['Friendica respects your privacy. By default, your posts will only s
$a->strings['Getting Help'] = 'الحصول على مساعدة';
$a->strings['Go to the Help Section'] = 'انتقل إلى القسم المساعدة';
$a->strings['Our <strong>help</strong> pages may be consulted for detail on other program features and resources.'] = 'يمكنك الاطلاع على صفحات <strong>المساعدة</strong> للحصول على تفاصيل حول ميزات البرامج الأخرى ومصادرها.';
$a->strings['{0} wants to follow you'] = '{0} يريد متابعتك';
$a->strings['%s liked %s\'s post'] = 'أُعجب %s بمشاركة %s';
$a->strings['%s disliked %s\'s post'] = 'لم يُعجب %s بمشاركة %s';
$a->strings['%s is attending %s\'s event'] = 'يحضر %s حدث %s';
@ -2373,10 +2364,7 @@ $a->strings['Friend Suggestion'] = 'اقتراح صديق';
$a->strings['Friend/Connect Request'] = 'طلب صداقة/اقتران';
$a->strings['New Follower'] = 'متابِع جديد';
$a->strings['%1$s wants to follow you'] = '%1$s يريد متابعتك';
$a->strings['%1$s had started following you'] = '%1$s يتابعك';
$a->strings['%1$s liked your comment %2$s'] = 'أعجب %1$s بتعليقك %2$s';
$a->strings['%1$s liked your post %2$s'] = 'أعجب %1$s بمشاركتك %2$s';
$a->strings['%1$s disliked your comment %2$s'] = 'لم يعجب %1$s تعليقك %2$s';
$a->strings['%1$s disliked your post %2$s'] = 'لم يعجب %1$s مشاركتك %2$s';
$a->strings['%1$s shared your comment %2$s'] = 'شارك %1$s تعليقك %2$s';
$a->strings['%1$s shared your post %2$s'] = 'شارك %1$s مشاركتك %2$s';
@ -2452,7 +2440,6 @@ $a->strings['%s posted an update.'] = 'نشر %s تحديثاً.';
$a->strings['Private Message'] = 'رسالة خاصة';
$a->strings['This entry was edited'] = 'عدّل المدخل';
$a->strings['Edit'] = 'تعديل';
$a->strings['Pinned item'] = 'عنصر مثبت';
$a->strings['Delete globally'] = 'احذفه عالميًا';
$a->strings['Remove locally'] = 'أزله محليًا';
$a->strings['Block %s'] = 'احجب %s';

View file

@ -6604,7 +6604,7 @@ msgstr "Tester une adresse"
#: src/Module/BaseAdmin.php:115
msgid "check webfinger"
msgstr "vérification de webfinger"
msgstr "Vérifier le webfinger"
#: src/Module/BaseAdmin.php:117
msgid "Babel"

View file

@ -1679,7 +1679,7 @@ $a->strings['Server Blocklist'] = 'Serveurs bloqués';
$a->strings['Diagnostics'] = 'Diagnostics';
$a->strings['PHP Info'] = 'PHP Info';
$a->strings['probe address'] = 'Tester une adresse';
$a->strings['check webfinger'] = 'vérification de webfinger';
$a->strings['check webfinger'] = 'Vérifier le webfinger';
$a->strings['Babel'] = 'Babel';
$a->strings['ActivityPub Conversion'] = 'Conversion ActivityPub';
$a->strings['Addon Features'] = 'Fonctionnalités des addons';

View file

@ -9071,7 +9071,7 @@ msgstr "Valaki kedvelte az Ön tartalmát"
#: src/Module/Settings/Account.php:622 src/Module/Settings/Account.php:623
msgid "Can only be enabled, when the direct comment notification is enabled."
msgstr ""
msgstr "Csak akkor engedélyezhető, ha a közvetlen hozzászólási értesítés engedélyezve van."
#: src/Module/Settings/Account.php:623
msgid "Someone shared your content"
@ -9079,7 +9079,7 @@ msgstr "Valaki megosztotta az Ön tartalmát"
#: src/Module/Settings/Account.php:624
msgid "Someone commented in your thread"
msgstr ""
msgstr "Valaki hozzászólt az Ön szálában"
#: src/Module/Settings/Account.php:625
msgid "Someone commented in a thread where you commented"
@ -9087,7 +9087,7 @@ msgstr "Valaki hozzászólt egy olyan szálban, ahol Ön hozzászólt"
#: src/Module/Settings/Account.php:626
msgid "Someone commented in a thread where you interacted"
msgstr ""
msgstr "Valaki hozzászólt egy olyan szálban, ahol Ön interakcióba került"
#: src/Module/Settings/Account.php:628
msgid "Activate desktop notifications"

View file

@ -2263,8 +2263,11 @@ $a->strings['Create a desktop notification when:'] = 'Asztali értesítés létr
$a->strings['Someone tagged you'] = 'Valaki megjelölte Önt';
$a->strings['Someone directly commented on your post'] = 'Valaki közvetlenül hozzászólt a bejegyzéséhez';
$a->strings['Someone liked your content'] = 'Valaki kedvelte az Ön tartalmát';
$a->strings['Can only be enabled, when the direct comment notification is enabled.'] = 'Csak akkor engedélyezhető, ha a közvetlen hozzászólási értesítés engedélyezve van.';
$a->strings['Someone shared your content'] = 'Valaki megosztotta az Ön tartalmát';
$a->strings['Someone commented in your thread'] = 'Valaki hozzászólt az Ön szálában';
$a->strings['Someone commented in a thread where you commented'] = 'Valaki hozzászólt egy olyan szálban, ahol Ön hozzászólt';
$a->strings['Someone commented in a thread where you interacted'] = 'Valaki hozzászólt egy olyan szálban, ahol Ön interakcióba került';
$a->strings['Activate desktop notifications'] = 'Asztali értesítések bekapcsolása';
$a->strings['Show desktop popup on new notifications'] = 'Felugró üzenet megjelenítése az asztalon új értesítések esetén.';
$a->strings['Text-only notification emails'] = 'Csak szöveges értesítési e-mailek';

View file

View file

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 258 KiB

Before After
Before After

View file

View file

View file

Before

Width:  |  Height:  |  Size: 278 KiB

After

Width:  |  Height:  |  Size: 278 KiB

Before After
Before After

View file

View file

Before

Width:  |  Height:  |  Size: 259 KiB

After

Width:  |  Height:  |  Size: 259 KiB

Before After
Before After

View file

View file

View file

Before

Width:  |  Height:  |  Size: 277 KiB

After

Width:  |  Height:  |  Size: 277 KiB

Before After
Before After

View file

View file

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 285 KiB

Before After
Before After

View file

View file

View file

View file

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 252 KiB

Before After
Before After

View file

View file

View file

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 285 KiB

Before After
Before After

View file

View file

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 260 KiB

Before After
Before After

View file

View file

View file

View file

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 258 KiB

Before After
Before After

View file

View file

View file

Before

Width:  |  Height:  |  Size: 283 KiB

After

Width:  |  Height:  |  Size: 283 KiB

Before After
Before After

0
view/theme/frio/font/open_sans/open-sans.css Executable file → Normal file
View file

0
view/theme/frio/templates/admin/logs/view.tpl Executable file → Normal file
View file