]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #6704 from tobiasd/20190220-credits
authorTobias Diekershoff <tobias.diekershoff@gmx.net>
Sat, 2 Mar 2019 07:35:53 +0000 (08:35 +0100)
committerGitHub <noreply@github.com>
Sat, 2 Mar 2019 07:35:53 +0000 (08:35 +0100)
updated the credits

119 files changed:
VERSION
bin/daemon.php
boot.php
composer.json
composer.lock
config/dbstructure.config.php
config/defaults.config.php
database.sql
doc/FAQ.md
doc/Quick-Start-groupsandpages.md
doc/de/FAQ.md
doc/de/Quick-Start-groupsandpages.md
include/api.php
include/conversation.php
include/enotify.php
mod/contactgroup.php [deleted file]
mod/display.php
mod/group.php [deleted file]
mod/item.php
mod/nodeinfo.php
mod/profiles.php
mod/share.php
mod/worker.php
src/App.php
src/Content/ContactSelector.php
src/Content/Text/BBCode.php
src/Core/Config/Adapter/AbstractDbaConfigAdapter.php
src/Core/Config/Adapter/IConfigAdapter.php
src/Core/Config/Adapter/IPConfigAdapter.php
src/Core/Config/Adapter/JITConfigAdapter.php
src/Core/Config/Adapter/JITPConfigAdapter.php
src/Core/Config/Adapter/PreloadConfigAdapter.php
src/Core/Config/Adapter/PreloadPConfigAdapter.php
src/Core/Config/Cache/ConfigCache.php
src/Core/Config/Cache/ConfigCacheLoader.php
src/Core/Config/Cache/IConfigCache.php
src/Core/Config/Cache/IPConfigCache.php
src/Core/Config/Configuration.php
src/Core/Config/PConfiguration.php
src/Core/Console/AutomaticInstallation.php
src/Core/Console/DatabaseStructure.php
src/Core/Console/PostUpdate.php
src/Core/Console/Storage.php
src/Core/Installer.php
src/Core/Lock.php
src/Core/Lock/CacheLockDriver.php
src/Core/Lock/DatabaseLockDriver.php
src/Core/Lock/ILockDriver.php
src/Core/Lock/SemaphoreLockDriver.php
src/Core/PConfig.php
src/Core/StorageManager.php
src/Core/System.php
src/Core/Update.php
src/Core/Worker.php
src/Database/DBA.php
src/Factory/DBFactory.php
src/Factory/DependencyFactory.php
src/Factory/LoggerFactory.php
src/Factory/ProfilerFactory.php
src/Model/Contact.php
src/Model/Group.php
src/Model/Item.php
src/Model/Photo.php
src/Model/Profile.php
src/Model/Term.php
src/Module/Group.php [new file with mode: 0644]
src/Module/Install.php
src/Module/Itemsource.php
src/Network/Probe.php
src/Object/Post.php
src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Receiver.php
src/Protocol/ActivityPub/Transmitter.php
src/Protocol/DFRN.php
src/Protocol/Diaspora.php
src/Protocol/OStatus.php
src/Protocol/PortableContact.php
src/Util/JsonLD.php
src/Util/Logger/WorkerLogger.php [new file with mode: 0644]
src/Util/Profiler.php
src/Util/Strings.php
src/Util/XML.php
tests/DatabaseTest.php
tests/Util/DBAMockTrait.php
tests/Util/DBStructureMockTrait.php
tests/Util/DateTimeFormatMockTrait.php
tests/Util/L10nMockTrait.php
tests/Util/RendererMockTrait.php
tests/include/ApiTest.php
tests/src/BaseObjectTest.php
tests/src/Core/Config/Cache/ConfigCacheLoaderTest.php
tests/src/Core/Config/Cache/ConfigCacheTest.php
tests/src/Core/Config/ConfigurationTest.php
tests/src/Core/Config/PConfigurationTest.php
tests/src/Core/Console/ConfigConsoleTest.php
tests/src/Core/InstallerTest.php
tests/src/Database/DBATest.php
tests/src/Database/DBStructureTest.php
tests/src/Model/UserTest.php
tests/src/Util/ArraysTest.php
tests/src/Util/Logger/WorkerLoggerTest.php [new file with mode: 0644]
tests/src/Util/ProfilerTest.php
tests/src/Util/StringsTest.php
tests/src/Util/XmlTest.php
view/js/main.js
view/lang/C/messages.po
view/lang/cs/messages.po
view/lang/cs/strings.php
view/lang/fr/messages.po
view/lang/fr/strings.php
view/templates/debug/itemsource.tpl
view/templates/group_side.tpl
view/theme/frio/config.php
view/theme/frio/php/scheme.php
view/theme/frio/templates/auto_request.tpl
view/theme/frio/templates/dfrn_request.tpl
view/theme/frio/templates/group_side.tpl
view/theme/frio/templates/wall_thread.tpl
view/theme/quattro/templates/group_side.tpl

diff --git a/VERSION b/VERSION
index 2b5b640bc39a5167bfdf5e5cc7b609d766d43054..f546d9acbcbe4d11d809532aa5a6de5415efb59a 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2019.03-dev
+2019.03-rc
index 047bf71be77b4ac31dbea889098e5dd52dce8b5b..298cfa2534ad1221ddbf1cf7561de89830b354e2 100755 (executable)
@@ -144,7 +144,9 @@ if (!$foreground) {
        file_put_contents($pidfile, $pid);
 
        // We lose the database connection upon forking
-       Factory\DBFactory::init($a->getConfigCache(), $a->getProfiler(), $_SERVER);
+       /// @todo refactoring during https://github.com/friendica/friendica/issues/6720
+       $basePath = \Friendica\Util\BasePath::create(dirname(__DIR__), $_SERVER);
+       Factory\DBFactory::init($basePath, $a->getConfigCache(), $a->getProfiler(), $_SERVER);
 }
 
 Config::set('system', 'worker_daemon_mode', true);
index 1f503c908a6935c087bd1ef8de8c7ced72342473..830a636aca28740f9bdbea0802d7f23666241a3c 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -25,12 +25,13 @@ use Friendica\Core\Protocol;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
+use Friendica\Model\Term;
 use Friendica\Util\BasePath;
 use Friendica\Util\DateTimeFormat;
 
 define('FRIENDICA_PLATFORM',     'Friendica');
 define('FRIENDICA_CODENAME',     'The Tazmans Flax-lily');
-define('FRIENDICA_VERSION',      '2019.03-dev');
+define('FRIENDICA_VERSION',      '2019.03-rc');
 define('DFRN_PROTOCOL_VERSION',  '2.23');
 define('NEW_UPDATE_ROUTINE_VERSION', 1170);
 
@@ -171,23 +172,27 @@ define('NOTIFY_SYSTEM',   32768);
 /* @}*/
 
 
-/**
- * @name Term
- *
- * Tag/term types
- * @{
- */
-define('TERM_UNKNOWN',   0);
-define('TERM_HASHTAG',   1);
-define('TERM_MENTION',   2);
-define('TERM_CATEGORY',  3);
-define('TERM_PCATEGORY', 4);
-define('TERM_FILE',      5);
-define('TERM_SAVEDSEARCH', 6);
-define('TERM_CONVERSATION', 7);
-
-define('TERM_OBJ_POST',  1);
-define('TERM_OBJ_PHOTO', 2);
+/** @deprecated since 2019.03, use Term::UNKNOWN instead */
+define('TERM_UNKNOWN',   Term::UNKNOWN);
+/** @deprecated since 2019.03, use Term::HASHTAG instead */
+define('TERM_HASHTAG',   Term::HASHTAG);
+/** @deprecated since 2019.03, use Term::MENTION instead */
+define('TERM_MENTION',   Term::MENTION);
+/** @deprecated since 2019.03, use Term::CATEGORY instead */
+define('TERM_CATEGORY',  Term::CATEGORY);
+/** @deprecated since 2019.03, use Term::PCATEGORY instead */
+define('TERM_PCATEGORY', Term::PCATEGORY);
+/** @deprecated since 2019.03, use Term::FILE instead */
+define('TERM_FILE',      Term::FILE);
+/** @deprecated since 2019.03, use Term::SAVEDSEARCH instead */
+define('TERM_SAVEDSEARCH', Term::SAVEDSEARCH);
+/** @deprecated since 2019.03, use Term::CONVERSATION instead */
+define('TERM_CONVERSATION', Term::CONVERSATION);
+
+/** @deprecated since 2019.03, use Term::OBJECT_TYPE_POST instead */
+define('TERM_OBJ_POST',  Term::OBJECT_TYPE_POST);
+/** @deprecated since 2019.03, use Term::OBJECT_TYPE_PHOTO instead */
+define('TERM_OBJ_PHOTO', Term::OBJECT_TYPE_PHOTO);
 
 /**
  * @name Namespaces
index 3638a9495921562dd660fb4ef0b9a2c995857d76..765ec23a24dedfc5054ea4d4c5c7cdc6eb7a2c69 100644 (file)
@@ -49,6 +49,7 @@
                "npm-asset/jquery-colorbox": "^1.6",
                "npm-asset/jquery-datetimepicker": "^2.4.0",
                "npm-asset/jgrowl": "^1.4",
+               "npm-asset/moment": "^2.20.1",
                "npm-asset/fullcalendar": "^3.0.1",
                "npm-asset/cropperjs": "1.2.2",
                "npm-asset/imagesloaded": "4.1.4"
index e554b119992198d1d35d8ef65eaf31c88d7ab368..ff38c810504f168fb240cb1e53ed363eec29ee0f 100644 (file)
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "19fabb14e0dd5d806ef841e51d5f6a0b",
+    "content-hash": "8897c1f6912cc9b889534a8c59deead1",
     "packages": [
         {
             "name": "asika/simple-console",
         },
         {
             "name": "npm-asset/fullcalendar",
-            "version": "3.9.0",
+            "version": "3.10.0",
             "dist": {
                 "type": "tar",
-                "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.9.0.tgz",
+                "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.0.tgz",
                 "reference": null,
-                "shasum": "b608a9989f3416f0b1d526c6bdfeeaf2ac79eda5"
-            },
-            "require": {
-                "npm-asset/jquery": ">=2,<4.0",
-                "npm-asset/moment": ">=2.20.1,<3.0.0"
+                "shasum": "cc5e87d518fd6550e142816a31dd191664847919"
             },
             "type": "npm-asset-library",
             "extra": {
                 "npm-asset-bugs": {
                     "url": "https://fullcalendar.io/wiki/Reporting-Bugs/"
                 },
-                "npm-asset-files": [
-                    "dist/*.js",
-                    "dist/*.css",
-                    "dist/*.d.ts",
-                    "dist/locale/*.js",
-                    "README.*",
-                    "LICENSE.*",
-                    "CHANGELOG.*",
-                    "CONTRIBUTING.*"
-                ],
                 "npm-asset-main": "dist/fullcalendar.js",
                 "npm-asset-directories": [],
                 "npm-asset-repository": {
                 "npm-asset-scripts": {
                     "clean": "gulp clean",
                     "dist": "gulp dist",
-                    "lint": "gulp lint",
+                    "lint": "gulp lint-and-example-repos",
                     "test": "gulp test:single"
                 }
             },
                 "full-sized",
                 "jquery-plugin"
             ],
-            "time": "2018-03-05T03:30:23+00:00"
+            "time": "2019-01-11T02:39:12+00:00"
         },
         {
             "name": "npm-asset/imagesloaded",
                 "mock",
                 "xunit"
             ],
+            "abandoned": true,
             "time": "2017-06-30T09:13:00+00:00"
         },
         {
                 }
             ],
             "description": "Provides the functionality to compare PHP values for equality",
-            "homepage": "https://github.com/sebastianbergmann/comparator",
+            "homepage": "http://www.github.com/sebastianbergmann/comparator",
             "keywords": [
                 "comparator",
                 "compare",
                 }
             ],
             "description": "Provides functionality to handle HHVM/PHP environments",
-            "homepage": "https://github.com/sebastianbergmann/environment",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
             "keywords": [
                 "Xdebug",
                 "environment",
                 }
             ],
             "description": "Provides the functionality to export PHP variables for visualization",
-            "homepage": "https://github.com/sebastianbergmann/exporter",
+            "homepage": "http://www.github.com/sebastianbergmann/exporter",
             "keywords": [
                 "export",
                 "exporter"
                 }
             ],
             "description": "Snapshotting of global state",
-            "homepage": "https://github.com/sebastianbergmann/global-state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
             "keywords": [
                 "global state"
             ],
                 }
             ],
             "description": "Provides functionality to recursively process PHP variables",
-            "homepage": "https://github.com/sebastianbergmann/recursion-context",
+            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
             "time": "2016-11-19T07:33:16+00:00"
         },
         {
index 6ce9d69474f1bad6531cc6f4c734f3bcd6b54a57..f03132addaf066596762d51dad9c3bbc41efd8a4 100644 (file)
@@ -34,7 +34,7 @@
 use Friendica\Database\DBA;
 
 if (!defined('DB_UPDATE_VERSION')) {
-       define('DB_UPDATE_VERSION', 1302);
+       define('DB_UPDATE_VERSION', 1304);
 }
 
 return [
@@ -960,7 +960,8 @@ return [
                        "deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
                        "deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
                        "backend-class" => ["type" => "tinytext", "comment" => "Storage backend class"],
-                       "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"]
+                       "backend-ref" => ["type" => "text", "comment" => "Storage backend data reference"],
+                       "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""]
                ],
                "indexes" => [
                        "PRIMARY" => ["id"],
@@ -1378,9 +1379,8 @@ return [
                        "PRIMARY" => ["id"],
                        "done_parameter" => ["done", "parameter(64)"],
                        "done_executed" => ["done", "executed"],
-                       "done_priority" => ["done", "priority"],
                        "done_priority_created" => ["done", "priority", "created"],
-                       "done_pid" => ["done", "pid"],
+                       "done_priority_next_try" => ["done", "priority", "next_try"],
                        "done_pid_next_try" => ["done", "pid", "next_try"],
                        "done_pid_priority_created" => ["done", "pid", "priority", "created"]
                ]
index 694f75c2200341aa284b4f02431a185e57e773a7..a6f90f319e1c901814ac0daa6a8de006c34a4282 100644 (file)
@@ -135,9 +135,14 @@ return [
                // Disables the check if a mail address is in a valid format and can be resolved via DNS.
                'disable_email_validation' => false,
 
-               // disable_mentions_removal (Boolean)
-               // Disables the automatic removal of implicit mentions in ActivityPub postings.
-               'disable_mentions_removal' => false,
+               // disable_implicit_mentions (Boolean) since 2019.03
+               // Implicit mentions are mentions in the body of replies that are redundant in a thread-enabled system like Friendica.
+               // This config key disables the gathering of implicit mentions in incoming and outgoing posts.
+               // Also disables the default automatic removal of implicit mentions from the body of incoming posts.
+               // Also disables the default automatic addition of implicit mentions in the body of outgoing posts.
+               // Disabling implicit mentions also affects the "explicit_mentions" additional feature by limiting it
+               // to the replied-to post author mention in the comment boxes.
+               'disable_implicit_mentions' => false,
 
                // disable_url_validation (Boolean)
                // Disables the DNS lookup of an URL.
index 2102a9398a88983609920f2a7c79b39d7e42fbac..10a428ffff9a9ac0fcad4fde766942c00b4e9bc4 100644 (file)
@@ -879,6 +879,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
        `deny_gid` mediumtext COMMENT 'Access Control - list of denied groups',
        `backend-class` tinytext COMMENT 'Storage backend class',
        `backend-ref` text COMMENT 'Storage backend data reference',
+       `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'edited timestamp',
         PRIMARY KEY(`id`),
         INDEX `contactid` (`contact-id`),
         INDEX `uid_contactid` (`uid`,`contact-id`),
index 562ff681b7ead3f0a2a2b71ee3225e1af751004c..140718178536dd3a25a10e32f6d1e704c1064fa7 100644 (file)
@@ -172,7 +172,9 @@ Friendica is using a [Twitter/GNU Social compatible API](help/api), which means
 Here is a list of known working clients:
 
 * Android
-  * [Friendiqa](https://github.com/lubuwest/friendiqa) (available in Google Playstore or from a binary repository you can add to [F-Droid](https://freunde.ma-nic.de/display/3e98eba8185a13c5bdbf3d1539646854))
+  * [Friendiqa](https://git.friendi.ca/lubuwest/Friendiqa) (available in Google Playstore or from a binary repository you can add to [F-Droid](https://freunde.ma-nic.de/display/3e98eba8185a13c5bdbf3d1539646854))
+  * [Fedilab](https://gitlab.com/tom79/mastalab) (available in F-Droid and Google stores)
+  * [DiCa](https://dica.mixi.cool/)
   * AndStatus
   * Twidere
   * Mustard and Mustard-Mod
index d4680f65f2b5aa575b1f128bb21241f2360007b2..f64f3afcbe8924cc3313e0e8bccfa9cf353bf9c3 100644 (file)
@@ -15,6 +15,6 @@ Remember the link at the top of this page will bring you back here.
 
 Once you've added some groups, <a href="help/Quick-Start-andfinally">move on to the next section</a>.
 
-<iframe src="http://dir.friendica.social/directory" width="950" height="600"></iframe>
+<iframe src="https://dir.friendica.social/forum" width="950" height="600"></iframe>
 
 
index 0317a35be02b0a9cd1868cc4062a9f4e7553dab5..85a6f389a22dbaa1911bc46f1612b250591cc8c6 100644 (file)
@@ -188,7 +188,9 @@ Das bedeutet, dass du jeden Twitter/GNU Social Client verwenden kannst in dem du
 Hier ist eine Liste von Clients bei denen dies möglich ist, bzw. die speziell für Friendica entwickelt werden:
 
 * Android
-  * [Friendiqa](https://github.com/lubuwest/friendiqa) (Gibt es im Google Playstore oder als [binary Repository](https://freunde.ma-nic.de/display/3e98eba8185a13c5bdbf3d1539646854) für F-Droid)
+  * [Friendiqa](https://git.friendi.ca/lubuwest/Friendiqa) (Gibt es im Google Playstore oder als [binary Repository](https://freunde.ma-nic.de/display/3e98eba8185a13c5bdbf3d1539646854) für F-Droid)
+  * [Fedilab](https://gitlab.com/tom79/mastalab) (Gibt es im F-Droid und dem Google Play Store)
+  * [DiCa](https://dica.mixi.cool/) (Gibt es bei Google Play)
   * AndStatus
   * Twidere
   * Mustard and Mustard-Mod
index da2a7dc3cc4aefa8c64bd6c5fd65078258adcd66..66df79d3f3588ff35e0c882c51672ec26a3a77c9 100644 (file)
@@ -21,6 +21,6 @@ Solltest Du beim Stöbern durch die vielen Gruppen nicht wieder hierher zurück
 
 Wenn Du einige Gruppen hinzugefügt hast, gehe <a href="help/Quick-Start-andfinally">weiter zum nächsten Schritt</a>.
 
-<iframe src="https://dir.friendica.social/home" width="950" height="600"></iframe>
+<iframe src="https://dir.friendica.social/forum" width="950" height="600"></iframe>
 
 
index e6fd2f22bae9b15aa38a15808b8623a6f8e2849e..9de054e0a0122cffcfaa2a8b9ad073de4b97485f 100644 (file)
@@ -1738,7 +1738,7 @@ function api_statuses_public_timeline($type)
        $start = $page * $count;
 
        if ($exclude_replies && !$conversation_id) {
-               $condition = ["`gravity` IN (?, ?) AND `iid` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall`",
+               $condition = ["`gravity` IN (?, ?) AND `iid` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall` AND NOT `author`.`hidden`",
                        GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
 
                if ($max_id > 0) {
@@ -1751,7 +1751,7 @@ function api_statuses_public_timeline($type)
 
                $r = Item::inArray($statuses);
        } else {
-               $condition = ["`gravity` IN (?, ?) AND `id` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall` AND `item`.`origin`",
+               $condition = ["`gravity` IN (?, ?) AND `id` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall` AND `item`.`origin` AND NOT `author`.`hidden`",
                        GRAVITY_PARENT, GRAVITY_COMMENT, $since_id];
 
                if ($max_id > 0) {
index 23a0dcbf29215318fc776b1cb7821cbf99bfd03c..37752c083e66d6ab8c7e8cdd4fc359ad7da13f8f 100644 (file)
@@ -365,7 +365,7 @@ function localize_item(&$item)
 
        // Only create a redirection to a magic link when logged in
        if (!empty($item['plink']) && (local_user() || remote_user())) {
-               $item['plink'] = Contact::magicLinkbyContact($author, $item['plink']);
+               $item['plink'] = Contact::magicLinkByContact($author, $item['plink']);
        }
 }
 
@@ -625,7 +625,7 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ
 
                                $author = ['uid' => 0, 'id' => $item['author-id'],
                                        'network' => $item['author-network'], 'url' => $item['author-link']];
-                               $profile_link = Contact::magicLinkbyContact($author);
+                               $profile_link = Contact::magicLinkByContact($author);
 
                                if (strpos($profile_link, 'redir/') === 0) {
                                        $sparkle = ' sparkle';
@@ -660,21 +660,12 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ
 
                                list($categories, $folders) = get_cats_and_terms($item);
 
-                               $profile_name_e = $profile_name;
-
                                if (!empty($item['content-warning']) && PConfig::get(local_user(), 'system', 'disable_cw', false)) {
-                                       $title_e = ucfirst($item['content-warning']);
+                                       $title = ucfirst($item['content-warning']);
                                } else {
-                                       $title_e = $item['title'];
+                                       $title = $item['title'];
                                }
 
-                               $body_e = $body;
-                               $tags_e = $tags['tags'];
-                               $hashtags_e = $tags['hashtags'];
-                               $mentions_e = $tags['mentions'];
-                               $location_e = $location;
-                               $owner_name_e = $owner_name;
-
                                $tmp_item = [
                                        'template' => $tpl,
                                        'id' => ($preview ? 'P0' : $item['id']),
@@ -684,27 +675,28 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ
                                        'linktitle' => L10n::t('View %s\'s profile @ %s', $profile_name, $item['author-link']),
                                        'profile_url' => $profile_link,
                                        'item_photo_menu' => item_photo_menu($item),
-                                       'name' => $profile_name_e,
+                                       'name' => $profile_name,
                                        'sparkle' => $sparkle,
                                        'lock' => $lock,
                                        'thumb' => System::removedBaseUrl(ProxyUtils::proxifyUrl($item['author-avatar'], false, ProxyUtils::SIZE_THUMB)),
-                                       'title' => $title_e,
-                                       'body' => $body_e,
-                                       'tags' => $tags_e,
-                                       'hashtags' => $hashtags_e,
-                                       'mentions' => $mentions_e,
+                                       'title' => $title,
+                                       'body' => $body,
+                                       'tags' => $tags['tags'],
+                                       'hashtags' => $tags['hashtags'],
+                                       'mentions' => $tags['mentions'],
+                                       'implicit_mentions' => $tags['implicit_mentions'],
                                        'txt_cats' => L10n::t('Categories:'),
                                        'txt_folders' => L10n::t('Filed under:'),
                                        'has_cats' => ((count($categories)) ? 'true' : ''),
                                        'has_folders' => ((count($folders)) ? 'true' : ''),
                                        'categories' => $categories,
                                        'folders' => $folders,
-                                       'text' => strip_tags($body_e),
+                                       'text' => strip_tags($body),
                                        'localtime' => DateTimeFormat::local($item['created'], 'r'),
                                        'ago' => (($item['app']) ? L10n::t('%s from %s', Temporal::getRelativeDate($item['created']),$item['app']) : Temporal::getRelativeDate($item['created'])),
-                                       'location' => $location_e,
+                                       'location' => $location,
                                        'indent' => '',
-                                       'owner_name' => $owner_name_e,
+                                       'owner_name' => $owner_name,
                                        'owner_url' => $owner_url,
                                        'owner_photo' => System::removedBaseUrl(ProxyUtils::proxifyUrl($item['owner-avatar'], false, ProxyUtils::SIZE_THUMB)),
                                        'plink' => Item::getPlink($item),
@@ -858,7 +850,7 @@ function item_photo_menu($item) {
 
        $author = ['uid' => 0, 'id' => $item['author-id'],
                'network' => $item['author-network'], 'url' => $item['author-link']];
-       $profile_link = Contact::magicLinkbyContact($author);
+       $profile_link = Contact::magicLinkByContact($author, $item['author-link']);
        $sparkle = (strpos($profile_link, 'redir/') === 0);
 
        $cid = 0;
@@ -873,9 +865,9 @@ function item_photo_menu($item) {
        }
 
        if ($sparkle) {
-               $status_link = $profile_link . '?url=status';
-               $photos_link = $profile_link . '?url=photos';
-               $profile_link = $profile_link . '?url=profile';
+               $status_link = $profile_link . '?tab=status';
+               $photos_link = str_replace('/profile/', '/photos/', $profile_link);
+               $profile_link = $profile_link . '?=profile';
        }
 
        if ($cid && !$item['self']) {
@@ -966,7 +958,7 @@ function builtin_activity_puller($item, &$conv_responses) {
                if (activity_match($item['verb'], $verb) && ($item['id'] != $item['parent'])) {
                        $author = ['uid' => 0, 'id' => $item['author-id'],
                                'network' => $item['author-network'], 'url' => $item['author-link']];
-                       $url = Contact::magicLinkbyContact($author);
+                       $url = Contact::magicLinkByContact($author);
                        if (strpos($url, 'redir/') === 0) {
                                $sparkle = ' class="sparkle" ';
                        }
index 58e1a75f00a830c64de414c5ca5c13f8c9d0f7b2..db44b464deb79b44ae9535163e905786e69bbf87 100644 (file)
@@ -33,8 +33,8 @@ function notification($params)
        $a = \get_app();
 
        // Temporary logging for finding the origin
-       if (!isset($params['language']) || !isset($params['uid'])) {
-               Logger::log('Missing parameters.' . System::callstack());
+       if (!isset($params['uid'])) {
+               Logger::notice('Missing parameters "uid".', ['params' => $params, 'callstack' => System::callstack()]);
        }
 
        // Ensure that the important fields are set at any time
@@ -42,7 +42,7 @@ function notification($params)
        $user = DBA::selectFirst('user', $fields, ['uid' => $params['uid']]);
 
        if (!DBA::isResult($user)) {
-               Logger::log('Unknown user ' . $params['uid']);
+               Logger::error('Unknown user', ['uid' =>  $params['uid']]);
                return false;
        }
 
diff --git a/mod/contactgroup.php b/mod/contactgroup.php
deleted file mode 100644 (file)
index 07997cd..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-use Friendica\App;
-use Friendica\Database\DBA;
-use Friendica\Model\Contact;
-use Friendica\Model\Group;
-
-function contactgroup_content(App $a)
-{
-       if (!local_user()) {
-               exit();
-       }
-
-       $change = null;
-       if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
-               $r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
-                       intval($a->argv[2]),
-                       intval(local_user())
-               );
-               if (DBA::isResult($r)) {
-                       $change = intval($a->argv[2]);
-               }
-       }
-
-       if (($a->argc > 1) && (intval($a->argv[1]))) {
-               $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
-                       intval($a->argv[1]),
-                       intval(local_user())
-               );
-               if (!DBA::isResult($r)) {
-                       exit();
-               }
-
-               $group = $r[0];
-               $members = Contact::getByGroupId($group['id']);
-               $preselected = [];
-               if (count($members)) {
-                       foreach ($members as $member) {
-                               $preselected[] = $member['id'];
-                       }
-               }
-
-               if (!empty($change)) {
-                       if (in_array($change, $preselected)) {
-                               Group::removeMember($group['id'], $change);
-                       } else {
-                               Group::addMember($group['id'], $change);
-                       }
-               }
-       }
-
-       exit();
-}
index 2e931e0687e60b2d02189c33a1dd18303977c118..6723a77e9d106d269ce3a8f5d373f11633fc1553 100644 (file)
@@ -19,10 +19,10 @@ use Friendica\Model\Contact;
 use Friendica\Model\Group;
 use Friendica\Model\Item;
 use Friendica\Model\Profile;
+use Friendica\Module\Objects;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Protocol\DFRN;
 use Friendica\Util\Strings;
-use Friendica\Module\Objects;
 
 function display_init(App $a)
 {
@@ -283,22 +283,25 @@ function display_content(App $a, $update = false, $update_uid = 0)
        $is_remote_contact = false;
        $item_uid = local_user();
 
-       $parent = Item::selectFirst(['uid'], ['uri' => $item_parent_uri, 'wall' => true]);
-       if (DBA::isResult($parent)) {
-               $a->profile['uid'] = defaults($a->profile, 'uid', $parent['uid']);
-               $a->profile['profile_uid'] = defaults($a->profile, 'profile_uid', $parent['uid']);
-               $is_remote_contact = Contact::isFollower(remote_user(), $a->profile['profile_uid']);
-       }
-
-       if ($is_remote_contact) {
-               $cdata = Contact::getPublicAndUserContacID(remote_user(), $a->profile['profile_uid']);
-               if (!empty($cdata['user'])) {
-                       $groups = Group::getIdsByContactId($cdata['user']);
-                       $remote_cid = $cdata['user'];
-                       $item_uid = $parent['uid'];
+       if (isset($item_parent_uri)) {
+               $parent = Item::selectFirst(['uid'], ['uri' => $item_parent_uri, 'wall' => true]);
+               if (DBA::isResult($parent)) {
+                       $a->profile['uid'] = defaults($a->profile, 'uid', $parent['uid']);
+                       $a->profile['profile_uid'] = defaults($a->profile, 'profile_uid', $parent['uid']);
+                       $is_remote_contact = Contact::isFollower(remote_user(), $a->profile['profile_uid']);
+
+                       if ($is_remote_contact) {
+                               $cdata = Contact::getPublicAndUserContacID(remote_user(), $a->profile['profile_uid']);
+                               if (!empty($cdata['user'])) {
+                                       $groups = Group::getIdsByContactId($cdata['user']);
+                                       $remote_cid = $cdata['user'];
+                                       $item_uid = $parent['uid'];
+                               }
+                       }
                }
        }
 
+
        $page_contact = DBA::selectFirst('contact', [], ['self' => true, 'uid' => $a->profile['uid']]);
        if (DBA::isResult($page_contact)) {
                $a->page_contact = $page_contact;
diff --git a/mod/group.php b/mod/group.php
deleted file mode 100644 (file)
index a6f649b..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-<?php
-/**
- * @file mod/group.php
- * @brief The group module (create and rename contact groups, add and
- *     remove contacts to the contact groups
- */
-
-use Friendica\App;
-use Friendica\BaseModule;
-use Friendica\Core\Config;
-use Friendica\Core\L10n;
-use Friendica\Core\PConfig;
-use Friendica\Core\Renderer;
-use Friendica\Database\DBA;
-use Friendica\Model;
-use Friendica\Module;
-use Friendica\Util\Strings;
-
-function group_init(App $a) {
-       if (local_user()) {
-               $a->page['aside'] = Model\Group::sidebarWidget('contact', 'group', 'extended', (($a->argc > 1) ? $a->argv[1] : 'everyone'));
-       }
-}
-
-function group_post(App $a) {
-
-       if (!local_user()) {
-               notice(L10n::t('Permission denied.') . EOL);
-               return;
-       }
-
-       if (($a->argc == 2) && ($a->argv[1] === 'new')) {
-               BaseModule::checkFormSecurityTokenRedirectOnError('/group/new', 'group_edit');
-
-               $name = Strings::escapeTags(trim($_POST['groupname']));
-               $r = Model\Group::create(local_user(), $name);
-               if ($r) {
-                       info(L10n::t('Group created.') . EOL);
-                       $r = Model\Group::getIdByName(local_user(), $name);
-                       if ($r) {
-                               $a->internalRedirect('group/' . $r);
-                       }
-               } else {
-                       notice(L10n::t('Could not create group.') . EOL);
-               }
-               $a->internalRedirect('group');
-               return; // NOTREACHED
-       }
-
-       if (($a->argc == 2) && intval($a->argv[1])) {
-               BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_edit');
-
-               $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                       intval($a->argv[1]),
-                       intval(local_user())
-               );
-               if (!DBA::isResult($r)) {
-                       notice(L10n::t('Group not found.') . EOL);
-                       $a->internalRedirect('contact');
-                       return; // NOTREACHED
-               }
-               $group = $r[0];
-               $groupname = Strings::escapeTags(trim($_POST['groupname']));
-               if (strlen($groupname) && ($groupname != $group['name'])) {
-                       $r = q("UPDATE `group` SET `name` = '%s' WHERE `uid` = %d AND `id` = %d",
-                               DBA::escape($groupname),
-                               intval(local_user()),
-                               intval($group['id'])
-                       );
-
-                       if ($r) {
-                               info(L10n::t('Group name changed.') . EOL);
-                       }
-               }
-
-               $a->page['aside'] = Model\Group::sidebarWidget();
-       }
-       return;
-}
-
-function group_content(App $a) {
-       $change = false;
-
-       if (!local_user()) {
-               notice(L10n::t('Permission denied') . EOL);
-               return;
-       }
-
-       // With no group number provided we jump to the unassigned contacts as a starting point
-       if ($a->argc == 1) {
-               $a->internalRedirect('group/none');
-       }
-
-       // Switch to text mode interface if we have more than 'n' contacts or group members
-       $switchtotext = PConfig::get(local_user(), 'system', 'groupedit_image_limit');
-       if (is_null($switchtotext)) {
-               $switchtotext = Config::get('system', 'groupedit_image_limit', 400);
-       }
-
-       $tpl = Renderer::getMarkupTemplate('group_edit.tpl');
-
-       $context = [
-               '$submit' => L10n::t('Save Group'),
-               '$submit_filter' => L10n::t('Filter'),
-       ];
-
-       if (($a->argc == 2) && ($a->argv[1] === 'new')) {
-               return Renderer::replaceMacros($tpl, $context + [
-                       '$title' => L10n::t('Create a group of contacts/friends.'),
-                       '$gname' => ['groupname', L10n::t('Group Name: '), '', ''],
-                       '$gid' => 'new',
-                       '$form_security_token' => BaseModule::getFormSecurityToken("group_edit"),
-               ]);
-
-
-       }
-
-       $nogroup = false;
-
-       if (($a->argc == 2) && ($a->argv[1] === 'none')) {
-               $id = -1;
-               $nogroup = true;
-               $group = [
-                       'id' => $id,
-                       'name' => L10n::t('Contacts not in any group'),
-               ];
-
-               $members = [];
-               $preselected = [];
-
-               $context = $context + [
-                       '$title' => $group['name'],
-                       '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],
-                       '$gid' => $id,
-                       '$editable' => 0,
-               ];
-       }
-
-
-       if (($a->argc == 3) && ($a->argv[1] === 'drop')) {
-               BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_drop', 't');
-
-               if (intval($a->argv[2])) {
-                       $r = q("SELECT `name` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                               intval($a->argv[2]),
-                               intval(local_user())
-                       );
-
-                       $result = null;
-
-                       if (DBA::isResult($r)) {
-                               $result = Model\Group::removeByName(local_user(), $r[0]['name']);
-                       }
-
-                       if ($result) {
-                               info(L10n::t('Group removed.') . EOL);
-                       } else {
-                               notice(L10n::t('Unable to remove group.') . EOL);
-                       }
-               }
-               $a->internalRedirect('group');
-               // NOTREACHED
-       }
-
-       if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
-               BaseModule::checkFormSecurityTokenForbiddenOnError('group_member_change', 't');
-
-               $r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
-                       intval($a->argv[2]),
-                       intval(local_user())
-               );
-               if (DBA::isResult($r)) {
-                       $change = intval($a->argv[2]);
-               }
-       }
-
-       if (($a->argc > 1) && intval($a->argv[1])) {
-               $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
-                       intval($a->argv[1]),
-                       intval(local_user())
-               );
-
-               if (!DBA::isResult($r)) {
-                       notice(L10n::t('Group not found.') . EOL);
-                       $a->internalRedirect('contact');
-               }
-
-               $group = $r[0];
-               $members = Model\Contact::getByGroupId($group['id']);
-               $preselected = [];
-
-               if (count($members)) {
-                       foreach ($members as $member) {
-                               $preselected[] = $member['id'];
-                       }
-               }
-
-               if ($change) {
-                       if (in_array($change, $preselected)) {
-                               Model\Group::removeMember($group['id'], $change);
-                       } else {
-                               Model\Group::addMember($group['id'], $change);
-                       }
-
-                       $members = Model\Contact::getByGroupId($group['id']);
-                       $preselected = [];
-                       if (count($members)) {
-                               foreach ($members as $member) {
-                                       $preselected[] = $member['id'];
-                               }
-                       }
-               }
-
-               $drop_tpl = Renderer::getMarkupTemplate('group_drop.tpl');
-               $drop_txt = Renderer::replaceMacros($drop_tpl, [
-                       '$id' => $group['id'],
-                       '$delete' => L10n::t('Delete Group'),
-                       '$form_security_token' => BaseModule::getFormSecurityToken("group_drop"),
-               ]);
-
-
-               $context = $context + [
-                       '$title' => $group['name'],
-                       '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],
-                       '$gid' => $group['id'],
-                       '$drop' => $drop_txt,
-                       '$form_security_token' => BaseModule::getFormSecurityToken('group_edit'),
-                       '$edit_name' => L10n::t('Edit Group Name'),
-                       '$editable' => 1,
-               ];
-
-       }
-
-       if (!isset($group)) {
-               return;
-       }
-
-       $groupeditor = [
-               'label_members' => L10n::t('Members'),
-               'members' => [],
-               'label_contacts' => L10n::t('All Contacts'),
-               'group_is_empty' => L10n::t('Group is empty'),
-               'contacts' => [],
-       ];
-
-       $sec_token = addslashes(BaseModule::getFormSecurityToken('group_member_change'));
-
-       // Format the data of the group members
-       foreach ($members as $member) {
-               if ($member['url']) {
-                       $entry = Module\Contact::getContactTemplateVars($member);
-                       $entry['label'] = 'members';
-                       $entry['photo_menu'] = '';
-                       $entry['change_member'] = [
-                               'title'     => L10n::t("Remove contact from group"),
-                               'gid'       => $group['id'],
-                               'cid'       => $member['id'],
-                               'sec_token' => $sec_token
-                       ];
-
-                       $groupeditor['members'][] = $entry;
-               } else {
-                       Model\Group::removeMember($group['id'], $member['id']);
-               }
-       }
-
-       if ($nogroup) {
-               $r = Model\Contact::getUngroupedList(local_user());
-       } else {
-               $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `blocked` AND NOT `pending` AND NOT `self` ORDER BY `name` ASC",
-                       intval(local_user())
-               );
-               $context['$desc'] = L10n::t('Click on a contact to add or remove.');
-       }
-
-       if (DBA::isResult($r)) {
-               // Format the data of the contacts who aren't in the contact group
-               foreach ($r as $member) {
-                       if (!in_array($member['id'], $preselected)) {
-                               $entry = Module\Contact::getContactTemplateVars($member);
-                               $entry['label'] = 'contacts';
-                               if (!$nogroup)
-                                       $entry['photo_menu'] = [];
-
-                               if (!$nogroup) {
-                                       $entry['change_member'] = [
-                                               'title'     => L10n::t("Add contact to group"),
-                                               'gid'       => $group['id'],
-                                               'cid'       => $member['id'],
-                                               'sec_token' => $sec_token
-                                       ];
-                               }
-
-                               $groupeditor['contacts'][] = $entry;
-                       }
-               }
-       }
-
-       $context['$groupeditor'] = $groupeditor;
-
-       // If there are to many contacts we could provide an alternative view mode
-       $total = count($groupeditor['members']) + count($groupeditor['contacts']);
-       $context['$shortmode'] = (($switchtotext && ($total > $switchtotext)) ? true : false);
-
-       if ($change) {
-               $tpl = Renderer::getMarkupTemplate('groupeditor.tpl');
-               echo Renderer::replaceMacros($tpl, $context);
-               exit();
-       }
-
-       return Renderer::replaceMacros($tpl, $context);
-
-}
index 40c01da20f48d5a83d489c676e2a5b30770d4a71..b126c4825b6ef7a8ca83f517a9edc52f08352e9c 100644 (file)
@@ -33,6 +33,7 @@ use Friendica\Model\FileTag;
 use Friendica\Model\Item;
 use Friendica\Model\Photo;
 use Friendica\Model\Attach;
+use Friendica\Model\Term;
 use Friendica\Protocol\Diaspora;
 use Friendica\Protocol\Email;
 use Friendica\Util\DateTimeFormat;
@@ -83,13 +84,13 @@ function item_post(App $a) {
        }
 
        // Is this a reply to something?
-       $thr_parent = intval(defaults($_REQUEST, 'parent', 0));
+       $toplevel_item_id = intval(defaults($_REQUEST, 'parent', 0));
        $thr_parent_uri = trim(defaults($_REQUEST, 'parent_uri', ''));
 
-       $thr_parent_contact = null;
+       $thread_parent_id = 0;
+       $thread_parent_contact = null;
 
-       $parent = 0;
-       $parent_item = null;
+       $toplevel_item = null;
        $parent_user = null;
 
        $parent_contact = null;
@@ -98,25 +99,26 @@ function item_post(App $a) {
        $profile_uid = defaults($_REQUEST, 'profile_uid', local_user());
        $posttype = defaults($_REQUEST, 'post_type', Item::PT_ARTICLE);
 
-       if ($thr_parent || $thr_parent_uri) {
-               if ($thr_parent) {
-                       $parent_item = Item::selectFirst([], ['id' => $thr_parent]);
+       if ($toplevel_item_id || $thr_parent_uri) {
+               if ($toplevel_item_id) {
+                       $toplevel_item = Item::selectFirst([], ['id' => $toplevel_item_id]);
                } elseif ($thr_parent_uri) {
-                       $parent_item = Item::selectFirst([], ['uri' => $thr_parent_uri, 'uid' => $profile_uid]);
+                       $toplevel_item = Item::selectFirst([], ['uri' => $thr_parent_uri, 'uid' => $profile_uid]);
                }
 
-               // if this isn't the real parent of the conversation, find it
-               if (DBA::isResult($parent_item)) {
+               // if this isn't the top-level parent of the conversation, find it
+               if (DBA::isResult($toplevel_item)) {
                        // The URI and the contact is taken from the direct parent which needn't to be the top parent
-                       $thr_parent_uri = $parent_item['uri'];
-                       $thr_parent_contact = Contact::getDetailsByURL($parent_item["author-link"]);
+                       $thread_parent_id = $toplevel_item['id'];
+                       $thr_parent_uri = $toplevel_item['uri'];
+                       $thread_parent_contact = Contact::getDetailsByURL($toplevel_item["author-link"]);
 
-                       if ($parent_item['id'] != $parent_item['parent']) {
-                               $parent_item = Item::selectFirst(Item::ITEM_FIELDLIST, ['id' => $parent_item['parent']]);
+                       if ($toplevel_item['id'] != $toplevel_item['parent']) {
+                               $toplevel_item = Item::selectFirst(Item::ITEM_FIELDLIST, ['id' => $toplevel_item['parent']]);
                        }
                }
 
-               if (!DBA::isResult($parent_item)) {
+               if (!DBA::isResult($toplevel_item)) {
                        notice(L10n::t('Unable to locate original post.') . EOL);
                        if (!empty($_REQUEST['return'])) {
                                $a->internalRedirect($return_path);
@@ -124,14 +126,14 @@ function item_post(App $a) {
                        exit();
                }
 
-               $parent = $parent_item['id'];
-               $parent_user = $parent_item['uid'];
+               $toplevel_item_id = $toplevel_item['id'];
+               $parent_user = $toplevel_item['uid'];
 
                $objecttype = ACTIVITY_OBJ_COMMENT;
        }
 
-       if ($parent) {
-               Logger::log('mod_item: item_post parent=' . $parent);
+       if ($toplevel_item_id) {
+               Logger::info('mod_item: item_post parent=' . $toplevel_item_id);
        }
 
        $post_id     = intval(defaults($_REQUEST, 'post_id', 0));
@@ -160,7 +162,7 @@ function item_post(App $a) {
        }
 
        // Allow commenting if it is an answer to a public post
-       $allow_comment = local_user() && ($profile_uid == 0) && $parent && in_array($parent_item['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
+       $allow_comment = local_user() && ($profile_uid == 0) && $toplevel_item_id && in_array($toplevel_item['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
 
        // Now check that valid personal details have been provided
        if (!Security::canWriteToUserWall($profile_uid) && !$allow_comment) {
@@ -183,7 +185,7 @@ function item_post(App $a) {
 
        $user = DBA::selectFirst('user', [], ['uid' => $profile_uid]);
 
-       if (!DBA::isResult($user) && !$parent) {
+       if (!DBA::isResult($user) && !$toplevel_item_id) {
                return 0;
        }
 
@@ -287,21 +289,21 @@ function item_post(App $a) {
 
                // If this is a comment, set the permissions from the parent.
 
-               if ($parent_item) {
+               if ($toplevel_item) {
                        // for non native networks use the network of the original post as network of the item
-                       if (($parent_item['network'] != Protocol::DIASPORA)
-                               && ($parent_item['network'] != Protocol::OSTATUS)
+                       if (($toplevel_item['network'] != Protocol::DIASPORA)
+                               && ($toplevel_item['network'] != Protocol::OSTATUS)
                                && ($network == "")) {
-                               $network = $parent_item['network'];
+                               $network = $toplevel_item['network'];
                        }
 
-                       $str_contact_allow = $parent_item['allow_cid'];
-                       $str_group_allow   = $parent_item['allow_gid'];
-                       $str_contact_deny  = $parent_item['deny_cid'];
-                       $str_group_deny    = $parent_item['deny_gid'];
-                       $private           = $parent_item['private'];
+                       $str_contact_allow = $toplevel_item['allow_cid'];
+                       $str_group_allow   = $toplevel_item['allow_gid'];
+                       $str_contact_deny  = $toplevel_item['deny_cid'];
+                       $str_group_deny    = $toplevel_item['deny_gid'];
+                       $private           = $toplevel_item['private'];
 
-                       $wall              = $parent_item['wall'];
+                       $wall              = $toplevel_item['wall'];
                }
 
                $pubmail_enabled = defaults($_REQUEST, 'pubmail_enable', false) && !$private;
@@ -382,12 +384,8 @@ function item_post(App $a) {
 
        $tags = BBCode::getTags($body);
 
-       // Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them)
-       if ($parent && in_array($thr_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) {
-               $contact = '@[url=' . $thr_parent_contact['url'] . ']' . $thr_parent_contact['nick'] . '[/url]';
-               if (!stripos(implode($tags), '[url=' . $thr_parent_contact['url'] . ']')) {
-                       $tags[] = $contact;
-               }
+       if ($thread_parent_id && !\Friendica\Content\Feature::isEnabled($uid, 'explicit_mentions')) {
+               $tags = item_add_implicit_mentions($tags, $thread_parent_contact, $thread_parent_id);
        }
 
        $tagged = [];
@@ -400,7 +398,7 @@ function item_post(App $a) {
                foreach ($tags as $tag) {
                        $tag_type = substr($tag, 0, 1);
 
-                       if ($tag_type == '#') {
+                       if ($tag_type == Term::TAG_CHARACTER[Term::HASHTAG]) {
                                continue;
                        }
 
@@ -425,9 +423,9 @@ function item_post(App $a) {
                                $tagged[] = $tag;
                        }
                        // When the forum is private or the forum is addressed with a "!" make the post private
-                       if (is_array($success['contact']) && (!empty($success['contact']['prv']) || ($tag_type == '!'))) {
+                       if (is_array($success['contact']) && (!empty($success['contact']['prv']) || ($tag_type == Term::TAG_CHARACTER[Term::EXCLUSIVE_MENTION]))) {
                                $private_forum = $success['contact']['prv'];
-                               $only_to_forum = ($tag_type == '!');
+                               $only_to_forum = ($tag_type == Term::TAG_CHARACTER[Term::EXCLUSIVE_MENTION]);
                                $private_id = $success['contact']['id'];
                                $forum_contact = $success['contact'];
                        } elseif (is_array($success['contact']) && !empty($success['contact']['forum']) &&
@@ -442,7 +440,7 @@ function item_post(App $a) {
 
        $original_contact_id = $contact_id;
 
-       if (!$parent && count($forum_contact) && ($private_forum || $only_to_forum)) {
+       if (!$toplevel_item_id && count($forum_contact) && ($private_forum || $only_to_forum)) {
                // we tagged a forum in a top level post. Now we change the post
                $private = $private_forum;
 
@@ -595,7 +593,7 @@ function item_post(App $a) {
                $network = Protocol::DFRN;
        }
 
-       $gravity = ($parent ? GRAVITY_COMMENT : GRAVITY_PARENT);
+       $gravity = ($toplevel_item_id ? GRAVITY_COMMENT : GRAVITY_PARENT);
 
        // even if the post arrived via API we are considering that it
        // originated on this site by default for determining relayability.
@@ -607,12 +605,12 @@ function item_post(App $a) {
                $origin = $_REQUEST['origin'];
        }
 
-       $notify_type = ($parent ? 'comment-new' : 'wall-new');
+       $notify_type = ($toplevel_item_id ? 'comment-new' : 'wall-new');
 
        $uri = ($message_id ? $message_id : Item::newURI($api_source ? $profile_uid : $uid, $guid));
 
        // Fallback so that we alway have a parent uri
-       if (!$thr_parent_uri || !$parent) {
+       if (!$thr_parent_uri || !$toplevel_item_id) {
                $thr_parent_uri = $uri;
        }
 
@@ -670,7 +668,7 @@ function item_post(App $a) {
         * 'self' if true indicates the owner is posting on their own wall
         * If parent is 0 it is a top-level post.
         */
-       $datarray['parent']        = $parent;
+       $datarray['parent']        = $toplevel_item_id;
        $datarray['self']          = $self;
 
        // This triggers posts via API and the mirror functions
@@ -788,7 +786,7 @@ function item_post(App $a) {
        FileTag::updatePconfig($uid, $categories_old, $categories_new, 'category');
 
        // These notifications are sent if someone else is commenting other your wall
-       if ($parent) {
+       if ($toplevel_item_id) {
                if ($contact_record != $author) {
                        notification([
                                'type'         => NOTIFY_COMMENT,
@@ -804,8 +802,8 @@ function item_post(App $a) {
                                'source_photo' => $datarray['author-avatar'],
                                'verb'         => ACTIVITY_POST,
                                'otype'        => 'item',
-                               'parent'       => $parent,
-                               'parent_uri'   => $parent_item['uri']
+                               'parent'       => $toplevel_item_id,
+                               'parent_uri'   => $toplevel_item['uri']
                        ]);
                }
        } else {
@@ -962,7 +960,7 @@ function handle_tag(&$body, &$inform, &$str_tags, $profile_uid, $tag, $network =
        $r = null;
 
        //is it a person tag?
-       if ((strpos($tag, '@') === 0) || (strpos($tag, '!') === 0)) {
+       if (Term::isType($tag, Term::MENTION, Term::IMPLICIT_MENTION, Term::EXCLUSIVE_MENTION)) {
                $tag_type = substr($tag, 0, 1);
                //is it already replaced?
                if (strpos($tag, '[url=')) {
@@ -1099,3 +1097,34 @@ function handle_tag(&$body, &$inform, &$str_tags, $profile_uid, $tag, $network =
 
        return ['replaced' => $replaced, 'contact' => $contact];
 }
+
+function item_add_implicit_mentions(array $tags, array $thread_parent_contact, $thread_parent_id)
+{
+       if (Config::get('system', 'disable_implicit_mentions')) {
+               // Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them)
+               if (in_array($thread_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) {
+                       $contact = Term::TAG_CHARACTER[Term::MENTION] . '[url=' . $thread_parent_contact['url'] . ']' . $thread_parent_contact['nick'] . '[/url]';
+                       if (!stripos(implode($tags), '[url=' . $thread_parent_contact['url'] . ']')) {
+                               $tags[] = $contact;
+                       }
+               }
+       } else {
+               $implicit_mentions = [
+                       $thread_parent_contact['url'] => $thread_parent_contact['nick']
+               ];
+
+               $parent_terms = Term::tagArrayFromItemId($thread_parent_id, [Term::MENTION, Term::IMPLICIT_MENTION]);
+
+               foreach ($parent_terms as $parent_term) {
+                       $implicit_mentions[$parent_term['url']] = $parent_term['term'];
+               }
+
+               foreach ($implicit_mentions as $url => $label) {
+                       if ($url != \Friendica\Model\Profile::getMyURL() && !stripos(implode($tags), '[url=' . $url . ']')) {
+                               $tags[] = Term::TAG_CHARACTER[Term::IMPLICIT_MENTION] . '[url=' . $url . ']' . $label . '[/url]';
+                       }
+               }
+       }
+
+       return $tags;
+}
index 39f430f92f2e249ea37d092c32b34a02b26ba550..da9dbb87c649691ee6b7063a05a3c8f4dd92c7d2 100644 (file)
@@ -12,7 +12,12 @@ use Friendica\Core\Logger;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Util\Network;
+
 function nodeinfo_wellknown(App $a) {
+       if (!Config::get('system', 'nodeinfo')) {
+               System::httpExit(404);
+       }
+
        $nodeinfo = ['links' => [['rel' => 'http://nodeinfo.diaspora.software/ns/schema/1.0',
                                        'href' => System::baseUrl().'/nodeinfo/1.0']]];
 
index bc41718c544f9ce9b9600b9c12b3663b03fab7f1..58f23e4634afff5d1a87a5af876a0cd5ccb98040 100644 (file)
@@ -338,7 +338,7 @@ function profiles_post(App $a) {
 
                $hide_friends = (($_POST['hide-friends'] == 1) ? 1: 0);
 
-               PConfig::set(local_user(), 'system', 'detailled_profile', (($_POST['detailled_profile'] == 1) ? 1: 0));
+               PConfig::set(local_user(), 'system', 'detailled_profile', (($_POST['detailed_profile'] == 1) ? 1: 0));
 
                $changes = [];
                if ($is_default) {
@@ -535,18 +535,18 @@ function profiles_content(App $a) {
                $personal_account = !(in_array($a->user["page-flags"],
                                        [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP]));
 
-               $detailled_profile = (PConfig::get(local_user(), 'system', 'detailled_profile') AND $personal_account);
+               $detailed_profile = (PConfig::get(local_user(), 'system', 'detailled_profile') AND $personal_account);
 
                $is_default = (($r[0]['is-default']) ? 1 : 0);
                $tpl = Renderer::getMarkupTemplate("profile_edit.tpl");
                $o .= Renderer::replaceMacros($tpl, [
                        '$personal_account' => $personal_account,
-                       '$detailled_profile' => $detailled_profile,
+                       '$detailled_profile' => $detailed_profile,
 
                        '$details' => [
-                               'detailled_profile', //Name
+                               'detailed_profile', //Name
                                L10n::t('Show more profile fields:'), //Label
-                               $detailled_profile, //Value
+                               $detailed_profile, //Value
                                '', //Help string
                                [L10n::t('No'), L10n::t('Yes')] //Off - On strings
                        ],
index bb3212ece0621c46e8b544a8f8a659f7bbfa4313..6f368b1d145945252f6864073e44828500750928 100644 (file)
@@ -26,7 +26,7 @@ function share_init(App $a) {
                $o = share_header($item['author-name'], $item['author-link'], $item['author-avatar'], $item['guid'], $item['created'], $item['plink']);
 
                if ($item['title']) {
-                       $o .= '[b]'.$item['title'].'[/b]'."\n";
+                       $o .= '[h3]'.$item['title'].'[/h3]'."\n";
                }
 
                $o .= $item['body'];
index 1afbfe81c10873b06e55e19d7cee4baa65699e84..23dfd6e0004ba7cc46ae7189270a856c40776abc 100644 (file)
@@ -41,11 +41,7 @@ function worker_init()
 
        Worker::callWorker();
 
-       $passing_slow = false;
-       $entries = 0;
-       $deferred = 0;
-
-       if ($r = Worker::workerProcess($passing_slow, $entries, $deferred)) {
+       if ($r = Worker::workerProcess()) {
                // On most configurations this parameter wouldn't have any effect.
                // But since it doesn't destroy anything, we just try to get more execution time in any way.
                set_time_limit(0);
index f48abcf9cbda92c1238e27083c73497e720da024..6945dc459d734d95eaf1decd1209a5c08bc56442 100644 (file)
@@ -197,7 +197,6 @@ class App
                $this->footerScripts[] = trim($url, '/');
        }
 
-       public $process_id;
        public $queue;
        private $scheme;
        private $hostname;
@@ -205,6 +204,7 @@ class App
        /**
         * @brief App constructor.
         *
+        * @param string           $basePath   The basedir of the app
         * @param Configuration    $config    The Configuration
         * @param LoggerInterface  $logger    The current app logger
         * @param Profiler         $profiler  The profiler of this application
@@ -212,14 +212,15 @@ class App
         *
         * @throws Exception if the Basepath is not usable
         */
-       public function __construct(Configuration $config, LoggerInterface $logger, Profiler $profiler, $isBackend = true)
+       public function __construct($basePath, Configuration $config, LoggerInterface $logger, Profiler $profiler, $isBackend = true)
        {
                BaseObject::setApp($this);
 
                $this->logger   = $logger;
                $this->config   = $config;
                $this->profiler = $profiler;
-               $this->basePath = $this->config->get('system', 'basepath');
+               $cfgBasePath = $this->config->get('system', 'basepath');
+               $this->basePath = !empty($cfgBasePath) ? $cfgBasePath : $basePath;
 
                if (!Core\System::isDirectoryUsable($this->basePath, false)) {
                        throw new Exception('Basepath \'' . $this->basePath . '\' isn\'t usable.');
@@ -358,17 +359,20 @@ class App
                $this->getMode()->determine($this->basePath);
 
                if ($this->getMode()->has(App\Mode::DBAVAILABLE)) {
-                       Core\Hook::loadHooks();
                        $loader = new ConfigCacheLoader($this->basePath);
-                       Core\Hook::callAll('load_config', $loader);
                        $this->config->getCache()->load($loader->loadCoreConfig('addon'), true);
+
+                       $this->profiler->update(
+                               $this->config->get('system', 'profiler', false),
+                               $this->config->get('rendertime', 'callstack', false));
+
+                       Core\Hook::loadHooks();
+                       Core\Hook::callAll('load_config', $loader);
                }
 
                $this->loadDefaultTimezone();
 
                Core\L10n::init();
-
-               $this->process_id = Core\System::processID('log');
        }
 
        /**
@@ -397,16 +401,25 @@ class App
         */
        private function determineURLPath()
        {
+               /*
+                * The automatic path detection in this function is currently deactivated,
+                * see issue https://github.com/friendica/friendica/issues/6679
+                *
+                * The problem is that the function seems to be confused with some url.
+                * These then confuses the detection which changes the url path.
+                */
+
                /* Relative script path to the web server root
                 * Not all of those $_SERVER properties can be present, so we do by inverse priority order
                 */
+/*
                $relative_script_path = '';
                $relative_script_path = defaults($_SERVER, 'REDIRECT_URL'       , $relative_script_path);
                $relative_script_path = defaults($_SERVER, 'REDIRECT_URI'       , $relative_script_path);
                $relative_script_path = defaults($_SERVER, 'REDIRECT_SCRIPT_URL', $relative_script_path);
                $relative_script_path = defaults($_SERVER, 'SCRIPT_URL'         , $relative_script_path);
                $relative_script_path = defaults($_SERVER, 'REQUEST_URI'        , $relative_script_path);
-
+*/
                $this->urlPath = $this->config->get('system', 'urlpath');
 
                /* $relative_script_path gives /relative/path/to/friendica/module/parameter
@@ -414,6 +427,7 @@ class App
                 *
                 * To get /relative/path/to/friendica we perform dirname() for as many levels as there are slashes in the QUERY_STRING
                 */
+/*
                if (!empty($relative_script_path)) {
                        // Module
                        if (!empty($_SERVER['QUERY_STRING'])) {
@@ -427,6 +441,7 @@ class App
                                $this->urlPath = $path;
                        }
                }
+*/
        }
 
        public function getScheme()
index 470590388447bf3634a37ab76dad849da0761059..e327069b33fd86653bad93e0b9a661c1c3a1bcc3 100644 (file)
@@ -150,7 +150,7 @@ class ContactSelector
        {
                $o = '';
                $select = [
-                       'EMPTY'            => '',
+                       ''                 => L10n::t('No answer'),
                        'Male'             => L10n::t('Male'),
                        'Female'           => L10n::t('Female'),
                        'Currently Male'   => L10n::t('Currently Male'),
@@ -190,7 +190,7 @@ class ContactSelector
        {
                $o = '';
                $select = [
-                       'EMPTY'         => '',
+                       ''              => L10n::t('No answer'),
                        'Males'         => L10n::t('Males'),
                        'Females'       => L10n::t('Females'),
                        'Gay'           => L10n::t('Gay'),
@@ -228,7 +228,7 @@ class ContactSelector
        {
                $o = '';
                $select = [
-                       'EMPTY'                => '',
+                       ''                     => L10n::t('No answer'),
                        'Single'               => L10n::t('Single'),
                        'Lonely'               => L10n::t('Lonely'),
                        'Available'            => L10n::t('Available'),
index e9b5f98d0b496deb0f6839f78a66b4b0e986a896..e49b14f47cbcaa7ab2324302574032a8770e0702 100644 (file)
@@ -67,6 +67,7 @@ class BBCode extends BaseObject
                                        $post["after"] = trim(substr($body, $pos + strlen($data[0])));
                                } else {
                                        $post["text"] = trim(str_replace($data[0], "", $body));
+                                       $post["after"] = '';
                                }
 
                                $attacheddata = $data[2];
@@ -949,15 +950,19 @@ class BBCode extends BaseObject
                                $text = ($is_quote_share? '<br />' : '') . '<p>' . html_entity_decode('&#x2672; ', ENT_QUOTES, 'UTF-8') . ' ' . $author_contact['addr'] . ': </p>' . "\n" . $content;
                                break;
                        case 3: // Diaspora
-                               $headline = '<p><b>' . html_entity_decode('&#x2672; ', ENT_QUOTES, 'UTF-8') . $mention . ':</b></p>' . "\n";
-
                                if (stripos(Strings::normaliseLink($attributes['link']), 'http://twitter.com/') === 0) {
                                        $text = ($is_quote_share? '<hr />' : '') . '<p><a href="' . $attributes['link'] . '">' . $attributes['link'] . '</a></p>' . "\n";
                                } else {
+                                       $headline = '<p><b>♲ <a href="' . $attributes['profile'] . '">' . $attributes['author'] . '</a>:</b></p>' . "\n";
+
+                                       if (!empty($attributes['posted']) && !empty($attributes['link'])) {
+                                               $headline = '<p><b>♲ <a href="' . $attributes['profile'] . '">' . $attributes['author'] . '</a></b> - <a href="' . $attributes['link'] . '">' . $attributes['posted'] . ' GMT</a></p>' . "\n";
+                                       }
+
                                        $text = ($is_quote_share? '<hr />' : '') . $headline . '<blockquote>' . trim($content) . '</blockquote>' . "\n";
 
-                                       if ($attributes['link'] != '') {
-                                               $text .= '<p><a href="' . $attributes['link'] . '">[l]</a></p>' . "\n";
+                                       if (empty($attributes['posted']) && !empty($attributes['link'])) {
+                                               $text .= '<p><a href="' . $attributes['link'] . '">[Source]</a></p>' . "\n";
                                        }
                                }
 
index 770dfd2c957107814bcda19cfa99fd53c5734c99..38caf35cac1cfb6f537468f42c5b233a28fc8d07 100644 (file)
@@ -6,7 +6,11 @@ use Friendica\Database\DBA;
 
 abstract class AbstractDbaConfigAdapter
 {
-       /** @var bool */
+       /**
+        * The connection state of the adapter
+        *
+        * @var bool
+        */
        protected $connected = true;
 
        public function __construct()
@@ -14,8 +18,66 @@ abstract class AbstractDbaConfigAdapter
                $this->connected = DBA::connected();
        }
 
+       /**
+        * Checks if the adapter is currently connected
+        *
+        * @return bool
+        */
        public function isConnected()
        {
                return $this->connected;
        }
+
+       /**
+        * Formats a DB value to a config value
+        * - null   = The db-value isn't set
+        * - bool   = The db-value is either '0' or '1'
+        * - array  = The db-value is a serialized array
+        * - string = The db-value is a string
+        *
+        * Keep in mind that there aren't any numeric/integer config values in the database
+        *
+        * @param null|string $value
+        *
+        * @return null|array|string
+        */
+       protected function toConfigValue($value)
+       {
+               if (!isset($value)) {
+                       return null;
+               }
+
+               switch (true) {
+                       // manage array value
+                       case preg_match("|^a:[0-9]+:{.*}$|s", $value):
+                               return unserialize($value);
+
+                       default:
+                               return $value;
+               }
+       }
+
+       /**
+        * Formats a config value to a DB value (string)
+        *
+        * @param mixed $value
+        *
+        * @return string
+        */
+       protected function toDbValue($value)
+       {
+               // if not set, save an empty string
+               if (!isset($value)) {
+                       return '';
+               }
+
+               switch (true) {
+                       // manage arrays
+                       case is_array($value):
+                               return serialize($value);
+
+                       default:
+                               return (string)$value;
+               }
+       }
 }
index 21cd9a4b2ab8f184f870af8e55add727b81ee92a..892c476e7c30f3b1d003c0096594b35ffc5b30e7 100644 (file)
@@ -21,10 +21,12 @@ interface IConfigAdapter
         * Get a particular system-wide config variable given the category name
         * ($family) and a key.
         *
+        * Note: Boolean variables are defined as 0/1 in the database
+        *
         * @param string  $cat The category of the configuration value
         * @param string  $key The configuration key to query
         *
-        * @return mixed Stored value or "!<unset>!" if it does not exist
+        * @return null|mixed Stored value or null if it does not exist
         */
        public function get($cat, $key);
 
@@ -46,9 +48,9 @@ interface IConfigAdapter
         * and removes it from the database.
         *
         * @param string $cat The category of the configuration value
-        * @param string $key   The configuration key to delete
+        * @param string $key The configuration key to delete
         *
-        * @return mixed
+        * @return bool Operation success
         */
        public function delete($cat, $key);
 
index 8e6c050b276d0e22840d07a8c9043b9db29da75f..c505532c5922b7b6cb1809809463c3bb820cb010 100644 (file)
@@ -28,11 +28,13 @@ interface IPConfigAdapter
         * Get a particular user's config variable given the category name
         * ($family) and a key.
         *
+        * Note: Boolean variables are defined as 0/1 in the database
+        *
         * @param string  $uid           The user_id
         * @param string  $cat           The category of the configuration value
         * @param string  $key           The configuration key to query
         *
-        * @return mixed Stored value or "!<unset>!" if it does not exist
+        * @return null|mixed Stored value or null if it does not exist
         */
        public function get($uid, $cat, $key);
 
@@ -59,7 +61,7 @@ interface IPConfigAdapter
         * @param string $cat The category of the configuration value
         * @param string $key The configuration key to delete
         *
-        * @return bool
+        * @return bool Operation success
         */
        public function delete($uid, $cat, $key);
 
index c0d680d2c9657458f2c7029c2dae01f731db905f..d125f7d40048c5dacedff2a5fb44c56808d22086 100644 (file)
@@ -34,40 +34,48 @@ class JITConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAdapte
                $configs = DBA::select('config', ['v', 'k'], ['cat' => $cat]);
                while ($config = DBA::fetch($configs)) {
                        $key   = $config['k'];
-                       $value = $config['v'];
+                       $value = $this->toConfigValue($config['v']);
 
-                       if (isset($value) && $value !== '') {
+                       // The value was in the db, so don't check it again (unless you have to)
+                       $this->in_db[$cat][$key] = true;
+
+                       // just save it in case it is set
+                       if (isset($value)) {
                                $return[$key] = $value;
-                               $this->in_db[$cat][$key] = true;
                        }
                }
                DBA::close($configs);
 
-               return [$cat => $config];
+               return [$cat => $return];
        }
 
        /**
         * {@inheritdoc}
+        *
+        * @param bool $mark if true, mark the selection of the current cat/key pair
         */
-       public function get($cat, $key)
+       public function get($cat, $key, $mark = true)
        {
                if (!$this->isConnected()) {
-                       return '!<unset>!';
+                       return null;
+               }
+
+               // The value got checked, so mark it to avoid checking it over and over again
+               if ($mark) {
+                       $this->in_db[$cat][$key] = true;
                }
 
                $config = DBA::selectFirst('config', ['v'], ['cat' => $cat, 'k' => $key]);
                if (DBA::isResult($config)) {
-                       // manage array value
-                       $value = (preg_match("|^a:[0-9]+:{.*}$|s", $config['v']) ? unserialize($config['v']) : $config['v']);
+                       $value = $this->toConfigValue($config['v']);
 
-                       if (isset($value) && $value !== '') {
-                               $this->in_db[$cat][$key] = true;
+                       // just return it in case it is set
+                       if (isset($value)) {
                                return $value;
                        }
                }
 
-               $this->in_db[$cat][$key] = false;
-               return '!<unset>!';
+               return null;
        }
 
        /**
@@ -82,9 +90,8 @@ class JITConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAdapte
                // We store our setting values in a string variable.
                // So we have to do the conversion here so that the compare below works.
                // The exception are array values.
-               $dbvalue = (!is_array($value) ? (string)$value : $value);
-
-               $stored = $this->get($cat, $key);
+               $compare_value = (!is_array($value) ? (string)$value : $value);
+               $stored_value = $this->get($cat, $key, false);
 
                if (!isset($this->in_db[$cat])) {
                        $this->in_db[$cat] = [];
@@ -93,12 +100,11 @@ class JITConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAdapte
                        $this->in_db[$cat][$key] = false;
                }
 
-               if (($stored === $dbvalue) && $this->in_db[$cat][$key]) {
+               if (isset($stored_value) && ($stored_value === $compare_value) && $this->in_db[$cat][$key]) {
                        return true;
                }
 
-               // manage array value
-               $dbvalue = (is_array($value) ? serialize($value) : $dbvalue);
+               $dbvalue = $this->toDbValue($value);
 
                $result = DBA::update('config', ['v' => $dbvalue], ['cat' => $cat, 'k' => $key], true);
 
index 4485ee5df9ddd759cccec5352318acc3ef9b5e06..a0c6a9547fdc46bf83b512853f7824e3a71d0a1e 100644 (file)
@@ -29,16 +29,18 @@ class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdap
                if (DBA::isResult($pconfigs)) {
                        while ($pconfig = DBA::fetch($pconfigs)) {
                                $key = $pconfig['k'];
-                               $value = $pconfig['v'];
+                               $value = $this->toConfigValue($pconfig['v']);
 
-                               if (isset($value) && $value !== '') {
+                               // The value was in the db, so don't check it again (unless you have to)
+                               $this->in_db[$uid][$cat][$key] = true;
+
+                               if (isset($value)) {
                                        $return[$key] = $value;
-                                       $this->in_db[$uid][$cat][$key] = true;
                                }
                        }
                } else if ($cat != 'config') {
                        // Negative caching
-                       $return = "!<unset>!";
+                       $return = null;
                }
                DBA::close($pconfigs);
 
@@ -47,26 +49,31 @@ class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdap
 
        /**
         * {@inheritdoc}
+        *
+        * @param bool $mark if true, mark the selection of the current cat/key pair
         */
-       public function get($uid, $cat, $key)
+       public function get($uid, $cat, $key, $mark = true)
        {
                if (!$this->isConnected()) {
-                       return '!<unset>!';
+                       return null;
+               }
+
+               // The value was in the db, so don't check it again (unless you have to)
+               if ($mark) {
+                       $this->in_db[$uid][$cat][$key] = true;
                }
 
                $pconfig = DBA::selectFirst('pconfig', ['v'], ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
                if (DBA::isResult($pconfig)) {
-                       // manage array value
-                       $value = (preg_match("|^a:[0-9]+:{.*}$|s", $pconfig['v']) ? unserialize($pconfig['v']) : $pconfig['v']);
+                       $value = $this->toConfigValue($pconfig['v']);
 
-                       if (isset($value) && $value !== '') {
-                               $this->in_db[$uid][$cat][$key] = true;
+                       if (isset($value)) {
                                return $value;
                        }
                }
 
                $this->in_db[$uid][$cat][$key] = false;
-               return '!<unset>!';
+               return null;
        }
 
        /**
@@ -81,9 +88,8 @@ class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdap
                // We store our setting values in a string variable.
                // So we have to do the conversion here so that the compare below works.
                // The exception are array values.
-               $dbvalue = (!is_array($value) ? (string)$value : $value);
-
-               $stored = $this->get($uid, $cat, $key);
+               $compare_value = (!is_array($value) ? (string)$value : $value);
+               $stored_value = $this->get($uid, $cat, $key, false);
 
                if (!isset($this->in_db[$uid])) {
                        $this->in_db[$uid] = [];
@@ -95,12 +101,12 @@ class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdap
                        $this->in_db[$uid][$cat][$key] = false;
                }
 
-               if (($stored === $dbvalue) && $this->in_db[$uid][$cat][$key]) {
+               if (isset($stored_value) && ($stored_value === $compare_value) && $this->in_db[$uid][$cat][$key]) {
                        return true;
                }
 
                // manage array value
-               $dbvalue = (is_array($value) ? serialize($value) : $dbvalue);
+               $dbvalue = (is_array($value) ? serialize($value) : $value);
 
                $result = DBA::update('pconfig', ['v' => $dbvalue], ['uid' => $uid, 'cat' => $cat, 'k' => $key], true);
 
@@ -118,13 +124,11 @@ class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdap
                        return false;
                }
 
-               if (!empty($this->in_db[$uid][$cat][$key])) {
+               if (isset($this->in_db[$uid][$cat][$key])) {
                        unset($this->in_db[$uid][$cat][$key]);
                }
 
-               $result = DBA::delete('pconfig', ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
-
-               return $result;
+               return DBA::delete('pconfig', ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
        }
 
        /**
index 218648cbdb4fc4e2c1dfaae67f959d24c7d2313c..c691c88bc53615a3ba14526c142786a9905191fe 100644 (file)
@@ -32,11 +32,9 @@ class PreloadConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAd
 
                $configs = DBA::select('config', ['cat', 'v', 'k']);
                while ($config = DBA::fetch($configs)) {
-                       $value = $config['v'];
-                       if (isset($value) && $value !== '') {
+                       $value = $this->toConfigValue($config['v']);
+                       if (isset($value)) {
                                $return[$config['cat']][$config['k']] = $value;
-                       } else {
-                               $return[$config['cat']][$config['k']] = '!<unset>!';
                        }
                }
                DBA::close($configs);
@@ -52,20 +50,19 @@ class PreloadConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAd
        public function get($cat, $key)
        {
                if (!$this->isConnected()) {
-                       return '!<unset>!';
+                       return null;
                }
 
                $config = DBA::selectFirst('config', ['v'], ['cat' => $cat, 'k' => $key]);
                if (DBA::isResult($config)) {
-                       // manage array value
-                       $value = (preg_match("|^a:[0-9]+:{.*}$|s", $config['v']) ? unserialize($config['v']) : $config['v']);
+                       $value = $this->toConfigValue($config['v']);
 
-                       if (isset($value) && $value !== '') {
+                       if (isset($value)) {
                                return $value;
                        }
                }
 
-               return '!<unset>!';
+               return null;
        }
 
        /**
@@ -81,17 +78,15 @@ class PreloadConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAd
                // So we have to do the conversion here so that the compare below works.
                // The exception are array values.
                $compare_value = !is_array($value) ? (string)$value : $value;
+               $stored_value = $this->get($cat, $key);
 
-               if ($this->get($cat, $key) === $compare_value) {
+               if (isset($stored_value) && $stored_value === $compare_value) {
                        return true;
                }
 
-               // manage array value
-               $dbvalue = is_array($value) ? serialize($value) : $value;
+               $dbvalue = $this->toDbValue($value);
 
-               $result = DBA::update('config', ['v' => $dbvalue], ['cat' => $cat, 'k' => $key], true);
-
-               return $result;
+               return DBA::update('config', ['v' => $dbvalue], ['cat' => $cat, 'k' => $key], true);
        }
 
        /**
@@ -103,9 +98,7 @@ class PreloadConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAd
                        return false;
                }
 
-               $result = DBA::delete('config', ['cat' => $cat, 'k' => $key]);
-
-               return $result;
+               return DBA::delete('config', ['cat' => $cat, 'k' => $key]);
        }
 
        /**
index 12e25df9f903d069b081e036cf4cba0b11a07c18..838f3763dfcd5f26849b3c915bbbd1baa957696b 100644 (file)
@@ -49,11 +49,9 @@ class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfig
 
                $pconfigs = DBA::select('pconfig', ['cat', 'v', 'k'], ['uid' => $uid]);
                while ($pconfig = DBA::fetch($pconfigs)) {
-                       $value = $pconfig['v'];
-                       if (isset($value) && $value !== '') {
+                       $value = $this->toConfigValue($pconfig['v']);
+                       if (isset($value)) {
                                $return[$pconfig['cat']][$pconfig['k']] = $value;
-                       } else {
-                               $return[$pconfig['cat']][$pconfig['k']] = '!<unset>!';
                        }
                }
                DBA::close($pconfigs);
@@ -69,7 +67,7 @@ class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfig
        public function get($uid, $cat, $key)
        {
                if (!$this->isConnected()) {
-                       return '!<unset>!';
+                       return null;
                }
 
                if (!$this->isLoaded($uid, $cat, $key)) {
@@ -78,14 +76,13 @@ class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfig
 
                $config = DBA::selectFirst('pconfig', ['v'], ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
                if (DBA::isResult($config)) {
-                       // manage array value
-                       $value = (preg_match("|^a:[0-9]+:{.*}$|s", $config['v']) ? unserialize($config['v']) : $config['v']);
+                       $value = $this->toConfigValue($config['v']);
 
-                       if (isset($value) && $value !== '') {
+                       if (isset($value)) {
                                return $value;
                        }
                }
-               return '!<unset>!';
+               return null;
        }
 
        /**
@@ -104,17 +101,15 @@ class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfig
                // So we have to do the conversion here so that the compare below works.
                // The exception are array values.
                $compare_value = !is_array($value) ? (string)$value : $value;
+               $stored_value = $this->get($uid, $cat, $key);
 
-               if ($this->get($uid, $cat, $key) === $compare_value) {
+               if (isset($stored_value) && $stored_value === $compare_value) {
                        return true;
                }
 
-               // manage array value
-               $dbvalue = is_array($value) ? serialize($value) : $value;
+               $dbvalue = $this->toDbValue($value);
 
-               $result = DBA::update('pconfig', ['v' => $dbvalue], ['uid' => $uid, 'cat' => $cat, 'k' => $key], true);
-
-               return $result;
+               return DBA::update('pconfig', ['v' => $dbvalue], ['uid' => $uid, 'cat' => $cat, 'k' => $key], true);
        }
 
        /**
@@ -130,9 +125,7 @@ class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfig
                        $this->load($uid, $cat);
                }
 
-               $result = DBA::delete('pconfig', ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
-
-               return $result;
+               return DBA::delete('pconfig', ['uid' => $uid, 'cat' => $cat, 'k' => $key]);
        }
 
        /**
index 4ebcc87482f044b278d0fdd626d47b97624fc9da..cf50b43d4f4685fb1ba221ac8fa021aa9f559f65 100644 (file)
@@ -6,8 +6,6 @@ namespace Friendica\Core\Config\Cache;
  * The Friendica config cache for the application
  * Initial, all *.config.php files are loaded into this cache with the
  * ConfigCacheLoader ( @see ConfigCacheLoader )
- *
- * Is used for further caching operations too (depending on the ConfigAdapter )
  */
 class ConfigCache implements IConfigCache, IPConfigCache
 {
@@ -37,7 +35,7 @@ class ConfigCache implements IConfigCache, IPConfigCache
 
                                foreach ($keys as $key) {
                                        $value = $config[$category][$key];
-                                       if (isset($value) && $value !== '!<unset>!') {
+                                       if (isset($value)) {
                                                if ($overwrite) {
                                                        $this->set($category, $key, $value);
                                                } else {
@@ -56,22 +54,13 @@ class ConfigCache implements IConfigCache, IPConfigCache
        {
                if (isset($this->config[$cat][$key])) {
                        return $this->config[$cat][$key];
-               } elseif ($key == null && isset($this->config[$cat])) {
+               } elseif (!isset($key) && isset($this->config[$cat])) {
                        return $this->config[$cat];
                } else {
-                       return '!<unset>!';
+                       return null;
                }
        }
 
-       /**
-        * {@inheritdoc}
-        */
-       public function has($cat, $key = null)
-       {
-               return (isset($this->config[$cat][$key]) && $this->config[$cat][$key] !== '!<unset>!') ||
-               ($key == null && isset($this->config[$cat]) && $this->config[$cat] !== '!<unset>!' && is_array($this->config[$cat]));
-       }
-
        /**
         * Sets a default value in the config cache. Ignores already existing keys.
         *
@@ -91,9 +80,6 @@ class ConfigCache implements IConfigCache, IPConfigCache
         */
        public function set($cat, $key, $value)
        {
-               // Only arrays are serialized in database, so we have to unserialize sparingly
-               $value = is_string($value) && preg_match("|^a:[0-9]+:{.*}$|s", $value) ? unserialize($value) : $value;
-
                if (!isset($this->config[$cat])) {
                        $this->config[$cat] = [];
                }
@@ -103,15 +89,6 @@ class ConfigCache implements IConfigCache, IPConfigCache
                return true;
        }
 
-       /**
-        * {@inheritdoc}
-        */
-       public function hasP($uid, $cat, $key = null)
-       {
-               return (isset($this->config[$uid][$cat][$key]) && $this->config[$uid][$cat][$key] !== '!<unset>!') ||
-                       ($key == null && isset($this->config[$uid][$cat]) && $this->config[$uid][$cat] !== '!<unset>!' && is_array($this->config[$uid][$cat]));
-       }
-
        /**
         * {@inheritdoc}
         */
@@ -142,7 +119,7 @@ class ConfigCache implements IConfigCache, IPConfigCache
 
                                foreach ($keys as $key) {
                                        $value = $config[$category][$key];
-                                       if (isset($value) && $value !== '!<unset>!') {
+                                       if (isset($value)) {
                                                $this->setP($uid, $category, $key, $value);
                                        }
                                }
@@ -157,10 +134,10 @@ class ConfigCache implements IConfigCache, IPConfigCache
        {
                if (isset($this->config[$uid][$cat][$key])) {
                        return $this->config[$uid][$cat][$key];
-               } elseif ($key == null && isset($this->config[$uid][$cat])) {
+               } elseif (!isset($key) && isset($this->config[$uid][$cat])) {
                        return $this->config[$uid][$cat];
                } else {
-                       return '!<unset>!';
+                       return null;
                }
        }
 
@@ -169,9 +146,6 @@ class ConfigCache implements IConfigCache, IPConfigCache
         */
        public function setP($uid, $cat, $key, $value)
        {
-               // Only arrays are serialized in database, so we have to unserialize sparingly
-               $value = is_string($value) && preg_match("|^a:[0-9]+:{.*}$|s", $value) ? unserialize($value) : $value;
-
                if (!isset($this->config[$uid]) || !is_array($this->config[$uid])) {
                        $this->config[$uid] = [];
                }
index b728d1082140c5279d70f03d8ca6791c1770b25b..b043bf27cbc21b0e19d0d5ab194261ec90d1e332 100644 (file)
@@ -37,9 +37,6 @@ class ConfigCacheLoader
         */
        public function loadConfigFiles(ConfigCache $config)
        {
-               // Setting at least the basepath we know
-               $config->set('system', 'basepath', $this->baseDir);
-
                $config->load($this->loadCoreConfig('defaults'));
                $config->load($this->loadCoreConfig('settings'));
 
index 9d948527d4659d359a139207483c0bb36f907607..499bd312d0c5365d836de46b453941c3073a4de7 100644 (file)
@@ -20,9 +20,9 @@ interface IConfigCache
         * Gets a value from the config cache.
         *
         * @param string $cat     Config category
-        * @param string $key       Config key
+        * @param string $key     Config key
         *
-        * @return mixed Returns the value of the Config entry or '!<unset>!' if not set
+        * @return null|mixed Returns the value of the Config entry or null if not set
         */
        function get($cat, $key = null);
 
@@ -47,15 +47,6 @@ interface IConfigCache
         */
        function delete($cat, $key);
 
-       /**
-        * Checks if a value is set in the config cache.
-        *
-        * @param string $cat  Config category
-        * @param string $key  Config key
-        * @return bool
-        */
-       function has($cat, $key = null);
-
        /**
         * Returns the whole configuration cache
         *
index 4ac21481a15180bff68ef3a832db56bfdfaee030..30076a2a9302db8712df0546ad098980fa40dd15 100644 (file)
@@ -23,7 +23,7 @@ interface IPConfigCache
         * @param string $cat     Config category
         * @param string $key     Config key
         *
-        * @return string The value of the config entry or '!<unset>!' if not set
+        * @return null|string The value of the config entry or null if not set
         */
        function getP($uid, $cat, $key = null);
 
@@ -50,17 +50,6 @@ interface IPConfigCache
         */
        function deleteP($uid, $cat, $key);
 
-
-       /**
-        * Checks if a value is set in the user config cache.
-        *
-        * @param int    $uid  User Id
-        * @param string $cat  Config category
-        * @param string $key  Config key
-        * @return bool
-        */
-       function hasP($uid, $cat, $key = null);
-
        /**
         * Returns the whole configuration cache
         *
index 2ac0da0ad1b967b0d580f1f559b2d971f3f055e7..532ed982a9d46498d3de738e741f58db33b26cbc 100644 (file)
@@ -83,20 +83,19 @@ class Configuration
                if ($this->configAdapter->isConnected() &&
                        (!$this->configAdapter->isLoaded($cat, $key) ||
                        $refresh)) {
+
                        $dbvalue = $this->configAdapter->get($cat, $key);
 
-                       if ($dbvalue !== '!<unset>!') {
+                       if (isset($dbvalue)) {
                                $this->configCache->set($cat, $key, $dbvalue);
                                return $dbvalue;
                        }
                }
 
                // use the config cache for return
-               if ($this->configCache->has($cat, $key)) {
-                       return $this->configCache->get($cat, $key);
-               } else {
-                       return $default_value;
-               }
+               $result = $this->configCache->get($cat, $key);
+
+               return (isset($result)) ? $result : $default_value;
        }
 
        /**
index 99b1aa14698b17d9b14fc0f57c966b39419c22dc..0d3b0c178c6cb24c02a53c8ec54454e3a096e220 100644 (file)
@@ -77,18 +77,15 @@ class PConfiguration
                                $refresh)) {
                        $dbValue = $this->configAdapter->get($uid, $cat, $key);
 
-                       if ($dbValue !== '!<unset>!') {
+                       if (isset($dbValue)) {
                                $this->configCache->setP($uid, $cat, $key, $dbValue);
                                return $dbValue;
                        }
                }
 
                // use the config cache for return
-               if ($this->configCache->hasP($uid, $cat, $key)) {
-                       return $this->configCache->getP($uid, $cat, $key);
-               } else {
-                       return $default_value;
-               }
+               $result = $this->configCache->getP($uid, $cat, $key);
+               return (isset($result)) ? $result : $default_value;
        }
 
        /**
index 682d109712fb5fbfee1e551455ac2222714379cb..9d1e8506cc6887430ab8fae01517e109882e239a 100644 (file)
@@ -146,7 +146,7 @@ HELP;
 
                $installer->resetChecks();
 
-               if (!$installer->checkDB($a->getConfigCache(), $a->getProfiler(), $db_host, $db_user, $db_pass, $db_data)) {
+               if (!$installer->checkDB($a->getBasePath(), $a->getConfigCache(), $a->getProfiler(), $db_host, $db_user, $db_pass, $db_data)) {
                        $errorMessage = $this->extractErrors($installer->getChecks());
                        throw new RuntimeException($errorMessage);
                }
index 1ec108d2e61cfd2f0d5d2fc07502b733ba3843b3..dededa9b3a4321e09fcd3ea31ea6d07c6f026b07 100644 (file)
@@ -31,9 +31,10 @@ Commands
        toinnodb Convert all tables from MyISAM to InnoDB
 
 Options
-    -h|--help|-? Show help information
-    -v           Show more debug information.
-    -f|--force   Force the command in case of "update" (Ignore failed updates/running updates)
+    -h|--help|-?       Show help information
+    -v                 Show more debug information.
+    -f|--force         Force the update command (Even if the database structure matches)
+    -o|--override      Override running or stalling updates
 HELP;
                return $help;
        }
@@ -68,8 +69,9 @@ HELP;
                                $output = DBStructure::update($a->getBasePath(), true, false);
                                break;
                        case "update":
-                               $force = $this->getOption(['f', 'force'], false);
-                               $output = Update::run($a->getBasePath(), $force, true, false);
+                               $force    = $this->getOption(['f', 'force'], false);
+                               $override = $this->getOption(['o', 'override'], false);
+                               $output = Update::run($a->getBasePath(), $force, $override,true, false);
                                break;
                        case "dumpsql":
                                ob_start();
@@ -89,5 +91,4 @@ HELP;
 
                return 0;
        }
-
 }
index 103d0fef7e68062928cdfd79100234a8dfd0187d..a903cd7dd49ccefe137aaf9b1efd4ffcd90d6627 100644 (file)
@@ -56,7 +56,7 @@ HELP;
                }
 
                echo L10n::t('Check for pending update actions.') . "\n";
-               Update::run($a->getBasePath(), true, true, false);
+               Update::run($a->getBasePath(), true, false, true, false);
                echo L10n::t('Done.') . "\n";
 
                echo L10n::t('Execute pending post updates.') . "\n";
index e0083598c319ec07b93b7c64f7bd533fff945e44..52f453471eed4bc501da51bcd5d351df5e84e33e 100644 (file)
@@ -112,19 +112,21 @@ HELP;
 
        protected function do_move()
        {
-               $table = null;
+               $tables = null;
                if (count($this->args) < 1 || count($this->args) > 2) {
                        throw new CommandArgsException('Invalid arguments');
                }
+
                if (count($this->args) == 2) {
                        $table = strtolower($this->args[1]);
                        if (!in_array($table, ['photo', 'attach'])) {
                                throw new CommandArgsException('Invalid table');
                        }
+                       $tables = [$table];
                }
 
                $current = StorageManager::getBackend();
-               $r = StorageManager::move($current);
+               $r = StorageManager::move($current, $tables);
                $this->out(sprintf('Moved %d files', $r));
        }
 }
index ed4721014191dac11316bb8eb8bf685849b58de0..b6090bddb60f667e2be9919036aad4d5eb455226 100644 (file)
@@ -591,6 +591,7 @@ class Installer
        /**
         * Checking the Database connection and if it is available for the current installation
         *
+        * @param string       $basePath    The basepath of this call
         * @param IConfigCache $configCache The configuration cache
         * @param Profiler    $profiler    The profiler of this app
         * @param string $dbhost           Hostname/IP of the Friendica Database
@@ -601,9 +602,9 @@ class Installer
         * @return bool true if the check was successful, otherwise false
         * @throws Exception
         */
-       public function checkDB(IConfigCache $configCache, Profiler $profiler, $dbhost, $dbuser, $dbpass, $dbdata)
+       public function checkDB($basePath, IConfigCache $configCache, Profiler $profiler, $dbhost, $dbuser, $dbpass, $dbdata)
        {
-               if (!DBA::connect($configCache, $profiler, $dbhost, $dbuser, $dbpass, $dbdata)) {
+               if (!DBA::connect($basePath, $configCache, $profiler, $dbhost, $dbuser, $dbpass, $dbdata)) {
                        $this->addCheck(L10n::t('Could not connect to database.'), false, true, '');
 
                        return false;
index e8c8a7041605b0826be5912722f7e9b75629de5d..8bc2c242d18a588d984bb10be0c8daebd4e8e69e 100644 (file)
@@ -122,12 +122,13 @@ class Lock
        /**
         * @brief Releases a lock if it was set by us
         *
-        * @param string $key Name of the lock
+        * @param string $key      Name of the lock
+        * @param bool   $override Overrides the lock to get releases
         * @return void
         */
-       public static function release($key)
+       public static function release($key, $override = false)
        {
-               self::getDriver()->releaseLock($key);
+               self::getDriver()->releaseLock($key, $override);
        }
 
        /**
index 18d441ffea09d5a0910ec6ac3ada461db885ab7c..c1cd8ffb43a3ab407324c757e2cbd0190737ed75 100644 (file)
@@ -61,11 +61,15 @@ class CacheLockDriver extends AbstractLockDriver
        /**
         * (@inheritdoc)
         */
-       public function releaseLock($key)
+       public function releaseLock($key, $override = false)
        {
                $cachekey = self::getLockKey($key);
 
-               $this->cache->compareDelete($cachekey, getmypid());
+               if ($override) {
+                       $this->cache->delete($cachekey);
+               } else {
+                       $this->cache->compareDelete($cachekey, getmypid());
+               }
                $this->markRelease($key);
        }
 
index 6f18fb5bec7dcf63416c4112cec7c2bf307b89f1..a137ef12edcac6e6766af4f704128e3ce97085d3 100644 (file)
@@ -68,9 +68,15 @@ class DatabaseLockDriver extends AbstractLockDriver
        /**
         * (@inheritdoc)
         */
-       public function releaseLock($key)
+       public function releaseLock($key, $override = false)
        {
-               DBA::delete('locks', ['name' => $key, 'pid' => $this->pid]);
+               if ($override) {
+                       $where = ['name' => $key];
+               } else {
+                       $where = ['name' => $key, 'pid' => $this->pid];
+               }
+
+               DBA::delete('locks', $where);
 
                $this->markRelease($key);
 
index a255f683454753e414e2c20677f106661dccf486..7cbaa4fc6908a701721c1886705a3a85c2ff3fae 100644 (file)
@@ -33,11 +33,12 @@ interface ILockDriver
        /**
         * Releases a lock if it was set by us
         *
-        * @param string $key The Name of the lock
+        * @param string $key      The Name of the lock
+        * @param bool   $override Overrides the lock to get released
         *
         * @return void
         */
-       public function releaseLock($key);
+       public function releaseLock($key, $override = false);
 
        /**
         * Releases all lock that were set by us
index cf1ce5a8d8bc770cdc06120868f351e4aef65402..781e110b1708a83633d1497296448ba639632595 100644 (file)
@@ -50,7 +50,7 @@ class SemaphoreLockDriver extends AbstractLockDriver
        /**
         * (@inheritdoc)
         */
-       public function releaseLock($key)
+       public function releaseLock($key, $override = false)
        {
                if (empty(self::$semaphore[$key])) {
                        return false;
index f62b59f4765342e2b5b77fc5d35b9a09b6c9b1e2..da4c802937d301271f3d80497bb454a50b5a2983 100644 (file)
@@ -65,8 +65,6 @@ class PConfig
        /**
         * @brief Sets a configuration value for a user
         *
-        * @note  Please do not store booleans - convert to 0/1 integer values!
-        *
         * @param string $uid    The user_id
         * @param string $cat    The category of the configuration value
         * @param string $key    The configuration key to set
index cfefa5f35a7dcc91738a2d63d9bc500221d6aa4b..ef6cef480a355c28f2f3dace16914a163ec18c45 100644 (file)
@@ -110,8 +110,8 @@ class StorageManager
         * Copy existing data to destination storage and delete from source.
         * This method cannot move to legacy in-table `data` field.
         *
-        * @param string  $dest    Destination storage class name
-        * @param array   $tables  Tables to look in for resources. Optional, defaults to ['photo', 'attach']
+        * @param string     $dest    Destination storage class name
+        * @param array|null $tables  Tables to look in for resources. Optional, defaults to ['photo', 'attach']
         *
         * @throws \Exception
         * @return int Number of moved resources
index f0ed08357359f5cc75f1d3a77652085e35ca657e..45a88fe0937b6d92c349d527c8985eab28e04c05 100644 (file)
@@ -176,6 +176,12 @@ class System extends BaseObject
                exit();
        }
 
+       public static function jsonError($httpCode, $data, $content_type = 'application/json')
+       {
+               header($_SERVER["SERVER_PROTOCOL"] . ' ' . $httpCode);
+               self::jsonExit($data, $content_type);
+       }
+
        /**
         * @brief Encodes content to json.
         *
@@ -234,21 +240,6 @@ class System extends BaseObject
                }
        }
 
-       /**
-        * Generates a process identifier for the logging
-        *
-        * @param string $prefix A given prefix
-        *
-        * @return string a generated process identifier
-        */
-       public static function processID($prefix)
-       {
-               // We aren't calling any other function here.
-               // Doing so could easily create an endless loop
-               $trailer = $prefix . ':' . getmypid() . ':';
-               return substr($trailer . uniqid('') . mt_rand(), 0, 26);
-       }
-
        /**
         * Returns the current Load of the System
         *
index 5df0675cdaeb46cd7520468d693e79f349b034c2..115abbab152fc1f96bddf8cc0c166cbac819067f 100644 (file)
@@ -37,9 +37,13 @@ class Update
                }
 
                if ($build < DB_UPDATE_VERSION) {
-                       // When we cannot execute the database update via the worker, we will do it directly
-                       if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) {
+                       if ($via_worker) {
+                               // Calling the database update directly via the worker enables us to perform database changes to the workerqueue table itself.
+                               // This is a fallback, since normally the database update will be performed by a worker job.
+                               // This worker job doesn't work for changes to the "workerqueue" table itself.
                                self::run($basePath);
+                       } else {
+                               Worker::add(PRIORITY_CRITICAL, 'DBUpdate');
                        }
                }
        }
@@ -48,19 +52,20 @@ class Update
         * Automatic database updates
         *
         * @param string $basePath The base path of this application
-        * @param bool $force      Force the Update-Check even if the lock is set
+        * @param bool $force      Force the Update-Check even if the database version doesn't match
+        * @param bool $override   Overrides any running/stuck updates
         * @param bool $verbose    Run the Update-Check verbose
         * @param bool $sendMail   Sends a Mail to the administrator in case of success/failure
         *
         * @return string Empty string if the update is successful, error messages otherwise
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function run($basePath, $force = false, $verbose = false, $sendMail = true)
+       public static function run($basePath, $force = false, $override = false, $verbose = false, $sendMail = true)
        {
                // In force mode, we release the dbupdate lock first
                // Necessary in case of an stuck update
-               if ($force) {
-                       Lock::release('dbupdate');
+               if ($override) {
+                       Lock::release('dbupdate', true);
                }
 
                $build = Config::get('system', 'build');
@@ -70,12 +75,12 @@ class Update
                        Config::set('system', 'build', $build);
                }
 
-               if ($build != DB_UPDATE_VERSION) {
+               if ($build != DB_UPDATE_VERSION || $force) {
                        require_once 'update.php';
 
                        $stored = intval($build);
                        $current = intval(DB_UPDATE_VERSION);
-                       if ($stored < $current) {
+                       if ($stored < $current || $force) {
                                Config::load('database');
 
                                Logger::log('Update from \'' . $stored . '\'  to \'' . $current . '\' - starting', Logger::DEBUG);
@@ -94,7 +99,7 @@ class Update
 
                                        // update the structure in one call
                                        $retval = DBStructure::update($basePath, $verbose, true);
-                                       if ($retval) {
+                                       if (!empty($retval)) {
                                                if ($sendMail) {
                                                        self::updateFailed(
                                                                DB_UPDATE_VERSION,
@@ -126,8 +131,6 @@ class Update
                                        Lock::release('dbupdate');
                                }
                        }
-               } elseif ($force) {
-                       DBStructure::update($basePath, $verbose, true);
                }
 
                return '';
@@ -206,8 +209,7 @@ class Update
         */
        private static function updateFailed($update_id, $error_message) {
                //send the administrators an e-mail
-               $admin_mail_list = "'".implode("','", array_map(['Friendica\Database\DBA', 'escape'], explode(",", str_replace(" ", "", Config::get('config', 'admin_email')))))."'";
-               $adminlist = DBA::select('user', ['uid', 'language', 'email'], ['`email` IN (%s)', $admin_mail_list]);
+               $adminlist = DBA::select('user', ['uid', 'language', 'email'], ['email' => explode(",", str_replace(" ", "", Config::get('config', 'admin_email')))]);
 
                // No valid result?
                if (!DBA::isResult($adminlist)) {
@@ -248,8 +250,7 @@ class Update
        private static function updateSuccessfull($from_build, $to_build)
        {
                //send the administrators an e-mail
-               $admin_mail_list = "'".implode("','", array_map(['Friendica\Database\DBA', 'escape'], explode(",", str_replace(" ", "", Config::get('config', 'admin_email')))))."'";
-               $adminlist = DBA::select('user', ['uid', 'language', 'email'], ['`email` IN (%s)', $admin_mail_list]);
+               $adminlist = DBA::select('user', ['uid', 'language', 'email'], ['email' => explode(",", str_replace(" ", "", Config::get('config', 'admin_email')))]);
 
                if (DBA::isResult($adminlist)) {
                        // every admin could had different language
index 4007a7923cae2dda94ec8f3af051ebc1551b4e27..ea8f6d24254cf24f63bb259e97236ee78004dcac 100644 (file)
@@ -8,6 +8,7 @@ use Friendica\BaseObject;
 use Friendica\Database\DBA;
 use Friendica\Model\Process;
 use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Logger\WorkerLogger;
 use Friendica\Util\Network;
 
 /**
@@ -21,6 +22,11 @@ use Friendica\Util\Network;
  */
 class Worker
 {
+       const STATE_STARTUP    = 1; // Worker is in startup. This takes most time.
+       const STATE_SHORT_LOOP = 2; // Worker is processing preassigned jobs, thus saving much time.
+       const STATE_REFETCH    = 3; // Worker had refetched jobs in the execution loop.
+       const STATE_LONG_LOOP  = 4; // Worker is processing the whole - long - loop.
+
        private static $up_start;
        private static $db_duration = 0;
        private static $db_duration_count = 0;
@@ -28,6 +34,7 @@ class Worker
        private static $db_duration_stat = 0;
        private static $lock_duration = 0;
        private static $last_update;
+       private static $state;
 
        /**
         * @brief Processes the tasks that are in the workerqueue table
@@ -91,16 +98,10 @@ class Worker
                }
 
                $starttime = time();
-
-               $entries = 0;
-               $deferred = 0;
+               self::$state = self::STATE_STARTUP;
 
                // We fetch the next queue entry that is about to be executed
-               while ($r = self::workerProcess($passing_slow, $entries, $deferred)) {
-                       // When we are processing jobs with a lower priority, we don't refetch new jobs
-                       // Otherwise fast jobs could wait behind slow ones and could be blocked.
-                       $refetched = $passing_slow;
-
+               while ($r = self::workerProcess()) {
                        foreach ($r as $entry) {
                                // Assure that the priority is an integer value
                                $entry['priority'] = (int)$entry['priority'];
@@ -112,20 +113,21 @@ class Worker
                                }
 
                                // If possible we will fetch new jobs for this worker
-                               if (!$refetched) {
-                                       $entries = self::totalEntries();
-                                       $deferred = self::deferredEntries();
-                                       if (Lock::acquire('worker_process', 0)) {
-                                               $refetched = self::findWorkerProcesses($passing_slow, $entries, $deferred);
-                                               Lock::release('worker_process');
-                                       }
+                               if (!self::getWaitingJobForPID() && Lock::acquire('worker_process', 0)) {
+                                       self::findWorkerProcesses();
+                                       Lock::release('worker_process');
+                                       self::$state = self::STATE_REFETCH;
                                }
                        }
 
+                       if (self::$state != self::STATE_REFETCH) {
+                               self::$state = self::STATE_LONG_LOOP;
+                       }
+
                        // To avoid the quitting of multiple workers only one worker at a time will execute the check
                        if (Lock::acquire('worker', 0)) {
                                // Count active workers and compare them with a maximum value that depends on the load
-                               if (self::tooMuchWorkers($entries, $deferred)) {
+                               if (self::tooMuchWorkers()) {
                                        Logger::log('Active worker limit reached, quitting.', Logger::DEBUG);
                                        Lock::release('worker');
                                        return;
@@ -140,9 +142,10 @@ class Worker
                                Lock::release('worker');
                        }
 
-                       // Quit the worker once every 5 minutes
-                       if (time() > ($starttime + 300)) {
-                               Logger::log('Process lifetime reached, quitting.', Logger::DEBUG);
+                       // Quit the worker once every cron interval
+                       if (time() > ($starttime + (Config::get('system', 'cron_interval') * 60))) {
+                               Logger::info('Process lifetime reached, respawning.');
+                               self::spawnWorker();
                                return;
                        }
                }
@@ -366,15 +369,12 @@ class Worker
        {
                $a = \get_app();
 
-               $mypid = getmypid();
-
                $argc = count($argv);
 
-               // Currently deactivated, since the new logger doesn't support this
-               //$new_process_id = System::processID("wrk");
-               $new_process_id = '';
+               $logger = $a->getLogger();
+               $workerLogger = new WorkerLogger($logger, $funcname);
 
-               Logger::log("Process ".$mypid." - Prio ".$queue["priority"]." - ID ".$queue["id"].": ".$funcname." ".$queue["parameter"]." - Process PID: ".$new_process_id);
+               $workerLogger ->info("Process start.", ['priority' => $queue["priority"], 'id' => $queue["id"]]);
 
                $stamp = (float)microtime(true);
 
@@ -382,10 +382,6 @@ class Worker
                // For this reason the variables have to be initialized.
                $a->getProfiler()->reset();
 
-               // For better logging create a new process id for every worker call
-               // But preserve the old one for the worker
-               $old_process_id = $a->process_id;
-               $a->process_id = $new_process_id;
                $a->queue = $queue;
 
                $up_duration = microtime(true) - self::$up_start;
@@ -393,13 +389,15 @@ class Worker
                // Reset global data to avoid interferences
                unset($_SESSION);
 
+               // Set the workerLogger as new default logger
+               Logger::init($workerLogger);
                if ($method_call) {
                        call_user_func_array(sprintf('Friendica\Worker\%s::execute', $funcname), $argv);
                } else {
                        $funcname($argv, $argc);
                }
+               Logger::init($logger);
 
-               $a->process_id = $old_process_id;
                unset($a->queue);
 
                $duration = (microtime(true) - $stamp);
@@ -409,16 +407,16 @@ class Worker
                 * The execution time is the productive time.
                 * By changing parameters like the maximum number of workers we can check the effectivness.
                */
-               Logger::log(
-                       'DB: '.number_format(self::$db_duration - (self::$db_duration_count + self::$db_duration_write + self::$db_duration_stat), 4).
-                       ' - DB-Count: '.number_format(self::$db_duration_count, 4).
-                       ' - DB-Stat: '.number_format(self::$db_duration_stat, 4).
-                       ' - DB-Write: '.number_format(self::$db_duration_write, 4).
-                       ' - Lock: '.number_format(self::$lock_duration, 4).
-                       ' - Rest: '.number_format(max(0, $up_duration - (self::$db_duration + self::$lock_duration)), 4).
-                       ' - Execution: '.number_format($duration, 4),
-                       Logger::DEBUG
-               );
+               $dbtotal = round(self::$db_duration, 2);
+               $dbread  = round(self::$db_duration - (self::$db_duration_count + self::$db_duration_write + self::$db_duration_stat), 2);
+               $dbcount = round(self::$db_duration_count, 2);
+               $dbstat  = round(self::$db_duration_stat, 2);
+               $dbwrite = round(self::$db_duration_write, 2);
+               $dblock  = round(self::$lock_duration, 2);
+               $rest    = round(max(0, $up_duration - (self::$db_duration + self::$lock_duration)), 2);
+               $exec    = round($duration, 2);
+
+               $logger->info('Performance:', ['state' => self::$state, 'count' => $dbcount, 'stat' => $dbstat, 'write' => $dbwrite, 'lock' => $dblock, 'total' => $dbtotal, 'rest' => $rest, 'exec' => $exec]);
 
                self::$up_start = microtime(true);
                self::$db_duration = 0;
@@ -426,25 +424,26 @@ class Worker
                self::$db_duration_stat = 0;
                self::$db_duration_write = 0;
                self::$lock_duration = 0;
+               self::$state = self::STATE_SHORT_LOOP;
 
                if ($duration > 3600) {
-                       Logger::log("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 1 hour (".round($duration/60, 3).")", Logger::DEBUG);
+                       $logger->info('Longer than 1 hour.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                } elseif ($duration > 600) {
-                       Logger::log("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 10 minutes (".round($duration/60, 3).")", Logger::DEBUG);
+                       $logger->info('Longer than 10 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                } elseif ($duration > 300) {
-                       Logger::log("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 5 minutes (".round($duration/60, 3).")", Logger::DEBUG);
+                       $logger->info('Longer than 5 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                } elseif ($duration > 120) {
-                       Logger::log("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 2 minutes (".round($duration/60, 3).")", Logger::DEBUG);
+                       $logger->info('Longer than 2 minutes.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration/60, 3)]);
                }
 
-               Logger::log("Process ".$mypid." - Prio ".$queue["priority"]." - ID ".$queue["id"].": ".$funcname." - done in ".number_format($duration, 4)." seconds. Process PID: ".$new_process_id);
+               $workerLogger->info('Process done.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'duration' => round($duration, 3)]);
 
                $a->getProfiler()->saveLog($a->getLogger(), "ID " . $queue["id"] . ": " . $funcname);
 
                $cooldown = Config::get("system", "worker_cooldown", 0);
 
                if ($cooldown > 0) {
-                       Logger::log("Process ".$mypid." - Prio ".$queue["priority"]." - ID ".$queue["id"].": ".$funcname." - in cooldown for ".$cooldown." seconds");
+                       $logger->info('Cooldown.', ['priority' => $queue["priority"], 'id' => $queue["id"], 'cooldown' => $cooldown]);
                        sleep($cooldown);
                }
        }
@@ -607,13 +606,10 @@ class Worker
        /**
         * @brief Checks if the number of active workers exceeds the given limits
         *
-        * @param integer $entries Total number of queue entries
-        * @param integer $deferred Number of deferred queue entries
-        *
         * @return bool Are there too much workers running?
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function tooMuchWorkers($entries = 0, $deferred = 0)
+       private static function tooMuchWorkers()
        {
                $queues = Config::get("system", "worker_queues", 4);
 
@@ -664,12 +660,7 @@ class Worker
 
                        $idle_workers = $active;
 
-                       if (empty($deferred) && empty($entries)) {
-                               $deferred = self::deferredEntries();
-                               $entries = max(self::totalEntries() - $deferred, 0);
-                       }
-
-                       $waiting_processes = max(0, $entries - $deferred);
+                       $deferred = self::deferredEntries();
 
                        if (Config::get('system', 'worker_debug')) {
                                $waiting_processes = 0;
@@ -691,10 +682,14 @@ class Worker
                                        DBA::close($processes);
                                }
                                DBA::close($jobs);
+                               $entries = $deferred + $waiting_processes;
                        } else {
+                               $entries = self::totalEntries();
+                               $waiting_processes = max(0, $entries - $deferred);
                                $stamp = (float)microtime(true);
                                $jobs = DBA::p("SELECT COUNT(*) AS `running`, `priority` FROM `process` INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid` AND NOT `done` GROUP BY `priority` ORDER BY `priority`");
                                self::$db_duration += (microtime(true) - $stamp);
+                               self::$db_duration_stat += (microtime(true) - $stamp);
 
                                while ($entry = DBA::fetch($jobs)) {
                                        $idle_workers -= $entry["running"];
@@ -753,212 +748,180 @@ class Worker
        }
 
        /**
-        * @brief Check if we should pass some slow processes
+        * @brief Returns waiting jobs for the current process id
         *
-        * When the active processes of the highest priority are using more than 2/3
-        * of all processes, we let pass slower processes.
-        *
-        * @param string $highest_priority Returns the currently highest priority
-        * @return bool We let pass a slower process than $highest_priority
+        * @return array waiting workerqueue jobs
         * @throws \Exception
         */
-       private static function passingSlow(&$highest_priority)
+       private static function getWaitingJobForPID()
        {
-               $highest_priority = 0;
-
                $stamp = (float)microtime(true);
-               $r = DBA::p(
-                       "SELECT `priority`
-                               FROM `process`
-                               INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid` AND NOT `done`"
-               );
+               $r = DBA::select('workerqueue', [], ['pid' => getmypid(), 'done' => false]);
                self::$db_duration += (microtime(true) - $stamp);
-
-               // No active processes at all? Fine
-               if (!DBA::isResult($r)) {
-                       return false;
-               }
-               $priorities = [];
-               while ($line = DBA::fetch($r)) {
-                       $priorities[] = $line["priority"];
+               if (DBA::isResult($r)) {
+                       return DBA::toArray($r);
                }
                DBA::close($r);
 
-               // Should not happen
-               if (count($priorities) == 0) {
-                       return false;
-               }
-               $highest_priority = min($priorities);
+               return false;
+       }
 
-               // The highest process is already the slowest one?
-               // Then we quit
-               if ($highest_priority == PRIORITY_NEGLIGIBLE) {
-                       return false;
+       /**
+        * @brief Returns the next jobs that should be executed
+        *
+        * @return array array with next jobs
+        * @throws \Exception
+        */
+       private static function nextProcess()
+       {
+               $priority = self::nextPriority();
+               if (empty($priority)) {
+                       Logger::info('No tasks found');
+                       return [];
                }
-               $high = 0;
-               foreach ($priorities as $priority) {
-                       if ($priority == $highest_priority) {
-                               ++$high;
-                       }
+
+               if ($priority <= PRIORITY_MEDIUM) {
+                       $limit = Config::get('system', 'worker_fetch_limit', 1);
+               } else {
+                       $limit = 1;
                }
-               Logger::log("Highest priority: ".$highest_priority." Total processes: ".count($priorities)." Count high priority processes: ".$high, Logger::DEBUG);
-               $passing_slow = (($high/count($priorities)) > (2/3));
 
-               if ($passing_slow) {
-                       Logger::log("Passing slower processes than priority ".$highest_priority, Logger::DEBUG);
+               $ids = [];
+               $stamp = (float)microtime(true);
+               $condition = ["`priority` = ? AND `pid` = 0 AND NOT `done` AND `next_try` < ?", $priority, DateTimeFormat::utcNow()];
+               $tasks = DBA::select('workerqueue', ['id'], $condition, ['limit' => $limit, 'order' => ['created']]);
+               self::$db_duration += (microtime(true) - $stamp);
+               while ($task = DBA::fetch($tasks)) {
+                       $ids[] = $task['id'];
                }
-               return $passing_slow;
+               DBA::close($tasks);
+
+               Logger::info('Found:', ['id' => $ids, 'priority' => $priority]);
+               return $ids;
        }
 
        /**
-        * @brief Find and claim the next worker process for us
+        * @brief Returns the priority of the next workerqueue job
         *
-        * @param boolean $passing_slow Returns if we had passed low priority processes
-        * @param integer $entries Total number of queue entries
-        * @param integer $deferred Number of deferred queue entries
-        * @return boolean Have we found something?
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @return string priority
+        * @throws \Exception
         */
-       private static function findWorkerProcesses(&$passing_slow, $entries, $deferred)
+       private static function nextPriority()
        {
-               $mypid = getmypid();
-
-               // Check if we should pass some low priority process
-               $highest_priority = 0;
-               $found = false;
-               $passing_slow = false;
-
-               // The higher the number of parallel workers, the more we prefetch to prevent concurring access
-               // We decrease the limit with the number of entries left in the queue
-               $worker_queues = Config::get("system", "worker_queues", 4);
-               $queue_length = Config::get('system', 'worker_fetch_limit', 1);
-               $lower_job_limit = $worker_queues * $queue_length * 2;
-               $entries = max($entries - $deferred, 0);
-
-               // Now do some magic
-               $exponent = 2;
-               $slope = $queue_length / pow($lower_job_limit, $exponent);
-               $limit = min($queue_length, ceil($slope * pow($entries, $exponent)));
-
-               Logger::log('Deferred: ' . $deferred . ' - Total: ' . $entries . ' - Maximum: ' . $queue_length . ' - jobs per queue: ' . $limit, Logger::DEBUG);
-               $ids = [];
-               if (self::passingSlow($highest_priority)) {
-                       // Are there waiting processes with a higher priority than the currently highest?
+               $waiting = [];
+               $priorities = [PRIORITY_CRITICAL, PRIORITY_HIGH, PRIORITY_MEDIUM, PRIORITY_LOW, PRIORITY_NEGLIGIBLE];
+               foreach ($priorities as $priority) {
                        $stamp = (float)microtime(true);
-                       $result = DBA::select(
-                               'workerqueue',
-                               ['id'],
-                               ["`pid` = 0 AND `priority` < ? AND NOT `done` AND `next_try` < ?",
-                               $highest_priority, DateTimeFormat::utcNow()],
-                               ['limit' => 1, 'order' => ['priority', 'created']]
-                       );
+                       if (DBA::exists('workerqueue', ["`priority` = ? AND `pid` = 0 AND NOT `done` AND `next_try` < ?", $priority, DateTimeFormat::utcNow()])) {
+                               $waiting[$priority] = true;
+                       }
                        self::$db_duration += (microtime(true) - $stamp);
+               }
 
-                       while ($id = DBA::fetch($result)) {
-                               $ids[] = $id["id"];
-                       }
-                       DBA::close($result);
+               if (!empty($waiting[PRIORITY_CRITICAL])) {
+                       return PRIORITY_CRITICAL;
+               }
 
-                       $found = (count($ids) > 0);
+               $running = [];
+               $running_total = 0;
+               $stamp = (float)microtime(true);
+               $processes = DBA::p("SELECT COUNT(DISTINCT(`process`.`pid`)) AS `running`, `priority` FROM `process`
+                       INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid`
+                       WHERE NOT `done` GROUP BY `priority`");
+               self::$db_duration += (microtime(true) - $stamp);
+               while ($process = DBA::fetch($processes)) {
+                       $running[$process['priority']] = $process['running'];
+                       $running_total += $process['running'];
+               }
+               DBA::close($processes);
 
-                       if (!$found) {
-                               // Give slower processes some processing time
-                               $stamp = (float)microtime(true);
-                               $result = DBA::select(
-                                       'workerqueue',
-                                       ['id'],
-                                       ["`pid` = 0 AND `priority` > ? AND NOT `done` AND `next_try` < ?",
-                                       $highest_priority, DateTimeFormat::utcNow()],
-                                       ['limit' => 1, 'order' => ['priority', 'created']]
-                               );
-                               self::$db_duration += (microtime(true) - $stamp);
+               foreach ($priorities as $priority) {
+                       if (!empty($waiting[$priority]) && empty($running[$priority])) {
+                               Logger::info('No running worker found with priority {priority} - assigning it.', ['priority' => $priority]);
+                               return $priority;
+                       }
+               }
 
-                               while ($id = DBA::fetch($result)) {
-                                       $ids[] = $id["id"];
-                               }
-                               DBA::close($result);
+               $active = max(self::activeWorkers(), $running_total);
+               $priorities = max(count($waiting), count($running));
+               $exponent = 2;
 
-                               $found = (count($ids) > 0);
-                               $passing_slow = $found;
-                       }
+               $total = 0;
+               for ($i = 1; $i <= $priorities; ++$i) {
+                       $total += pow($i, $exponent);
                }
 
-               // At first try to fetch a bunch of high or medium tasks
-               if (!$found && ($limit > 1)) {
-                       $stamp = (float)microtime(true);
-                       $result = DBA::select(
-                               'workerqueue',
-                               ['id'],
-                               ["`pid` = 0 AND NOT `done` AND `priority` <= ? AND `next_try` < ? AND `retrial` = 0",
-                               PRIORITY_MEDIUM, DateTimeFormat::utcNow()],
-                               ['limit' => $limit, 'order' => ['created']]
-                       );
-                       self::$db_duration += (microtime(true) - $stamp);
+               $limit = [];
+               for ($i = 1; $i <= $priorities; ++$i) {
+                       $limit[$priorities - $i] = max(1, round($active * (pow($i, $exponent) / $total)));
+               }
 
-                       while ($id = DBA::fetch($result)) {
-                               $ids[] = $id["id"];
+               $i = 0;
+               foreach ($running as $priority => $workers) {
+                       if ($workers < $limit[$i++]) {
+                               Logger::info('Priority {priority} has got {workers} workers out of a limit of {limit}', ['priority' => $priority, 'workers' => $workers, 'limit' => $limit[$i - 1]]);
+                               return $priority;
                        }
-                       DBA::close($result);
+               }
 
-                       $found = (count($ids) > 0);
+               if (!empty($waiting)) {
+                       $priority = array_keys($waiting)[0];
+                       Logger::info('No underassigned priority found, now taking the highest priority.', ['priority' => $priority]);
+                       return $priority;
                }
 
-               // If there is no result (or we shouldn't pass lower processes) we check without priority limit
-               if (!$found) {
+               return false;
+       }
+
+       /**
+        * @brief Find and claim the next worker process for us
+        *
+        * @return boolean Have we found something?
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       private static function findWorkerProcesses()
+       {
+               $mypid = getmypid();
+
+               $ids = self::nextProcess();
+
+               // If there is no result we check without priority limit
+               if (empty($ids)) {
                        $stamp = (float)microtime(true);
-                       $result = DBA::select(
-                               'workerqueue',
-                               ['id'],
-                               ["`pid` = 0 AND NOT `done` AND `next_try` < ?",
-                               DateTimeFormat::utcNow()],
-                               ['limit' => 1, 'order' => ['priority', 'created']]
-                       );
+                       $condition = ["`pid` = 0 AND NOT `done` AND `next_try` < ?", DateTimeFormat::utcNow()];
+                       $result = DBA::select('workerqueue', ['id'], $condition, ['limit' => 1, 'order' => ['priority', 'created']]);
                        self::$db_duration += (microtime(true) - $stamp);
 
                        while ($id = DBA::fetch($result)) {
                                $ids[] = $id["id"];
                        }
                        DBA::close($result);
-
-                       $found = (count($ids) > 0);
                }
 
-               if ($found) {
+               if (!empty($ids)) {
                        $stamp = (float)microtime(true);
-                       $condition = "`id` IN (".substr(str_repeat("?, ", count($ids)), 0, -2).") AND `pid` = 0 AND NOT `done`";
-                       array_unshift($ids, $condition);
-                       DBA::update('workerqueue', ['executed' => DateTimeFormat::utcNow(), 'pid' => $mypid], $ids);
+                       $condition = ['id' => $ids, 'done' => false, 'pid' => 0];
+                       DBA::update('workerqueue', ['executed' => DateTimeFormat::utcNow(), 'pid' => $mypid], $condition);
                        self::$db_duration += (microtime(true) - $stamp);
                        self::$db_duration_write += (microtime(true) - $stamp);
                }
 
-               return $found;
+               return !empty($ids);
        }
 
        /**
         * @brief Returns the next worker process
         *
-        * @param boolean $passing_slow Returns if we had passed low priority processes
-        * @param integer $entries Returns total number of queue entries
-        * @param integer $deferred Returns number of deferred queue entries
-        *
         * @return string SQL statement
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function workerProcess(&$passing_slow, &$entries, &$deferred)
+       public static function workerProcess()
        {
                // There can already be jobs for us in the queue.
-               $stamp = (float)microtime(true);
-               $r = DBA::select('workerqueue', [], ['pid' => getmypid(), 'done' => false]);
-               self::$db_duration += (microtime(true) - $stamp);
-               if (DBA::isResult($r)) {
-                       return DBA::toArray($r);
+               $waiting = self::getWaitingJobForPID();
+               if (!empty($waiting)) {
+                       return $waiting;
                }
-               DBA::close($r);
-
-               // Counting the rows outside the lock reduces the lock time
-               $entries = self::totalEntries();
-               $deferred = self::deferredEntries();
 
                $stamp = (float)microtime(true);
                if (!Lock::acquire('worker_process')) {
@@ -966,7 +929,7 @@ class Worker
                }
                self::$lock_duration += (microtime(true) - $stamp);
 
-               $found = self::findWorkerProcesses($passing_slow, $entries, $deferred);
+               $found = self::findWorkerProcesses();
 
                Lock::release('worker_process');
 
index 1c17d9aca52d38f7a59ea91e9a9cf2ccfef85c10..832f0a444f994684354267123a0f9ff6c8c39fed 100644 (file)
@@ -40,6 +40,10 @@ class DBA
         * @var Profiler
         */
        private static $profiler;
+       /**
+        * @var string
+        */
+       private static $basePath;
        private static $server_info = '';
        private static $connection;
        private static $driver;
@@ -55,13 +59,14 @@ class DBA
        private static $db_name = '';
        private static $db_charset = '';
 
-       public static function connect(IConfigCache $configCache, Profiler $profiler, $serveraddr, $user, $pass, $db, $charset = null)
+       public static function connect($basePath, IConfigCache $configCache, Profiler $profiler, $serveraddr, $user, $pass, $db, $charset = null)
        {
                if (!is_null(self::$connection) && self::connected()) {
                        return true;
                }
 
                // We are storing these values for being able to perform a reconnect
+               self::$basePath = $basePath;
                self::$configCache = $configCache;
                self::$profiler = $profiler;
                self::$db_serveraddr = $serveraddr;
@@ -164,7 +169,7 @@ class DBA
        public static function reconnect() {
                self::disconnect();
 
-               $ret = self::connect(self::$configCache, self::$profiler, self::$db_serveraddr, self::$db_user, self::$db_pass, self::$db_name, self::$db_charset);
+               $ret = self::connect(self::$basePath, self::$configCache, self::$profiler, self::$db_serveraddr, self::$db_user, self::$db_pass, self::$db_name, self::$db_charset);
                return $ret;
        }
 
@@ -420,7 +425,7 @@ class DBA
 
                if ((substr_count($sql, '?') != count($args)) && (count($args) > 0)) {
                        // Question: Should we continue or stop the query here?
-                       Logger::log('Parameter mismatch. Query "'.$sql.'" - Parameters '.print_r($args, true), Logger::DEBUG);
+                       Logger::warning('Query parameters mismatch.', ['query' => $sql, 'args' => $args, 'callstack' => System::callstack()]);
                }
 
                $sql = self::cleanQuery($sql);
@@ -1034,7 +1039,7 @@ class DBA
         * This process must only be started once, since the value is cached.
         */
        private static function buildRelationData() {
-               $definition = DBStructure::definition(self::$configCache->get('system', 'basepath'));
+               $definition = DBStructure::definition(self::$basePath);
 
                foreach ($definition AS $table => $structure) {
                        foreach ($structure['fields'] AS $field => $field_struct) {
index c1a7965013e84a14dff775c365a7d11e2f3a9a85..b4f0c9e3c194eb11f664df918c3654a04e96f366 100644 (file)
@@ -11,13 +11,16 @@ class DBFactory
        /**
         * Initialize the DBA connection
         *
+        * @param string             $basePath    The basepath of the application
         * @param Cache\IConfigCache $configCache The configuration cache
-        * @param Profiler          $profiler    The profiler
-        * @param array             $server      The $_SERVER variables
+        * @param Profiler           $profiler    The profiler
+        * @param array              $server      The $_SERVER variables
         *
         * @throws \Exception if connection went bad
+        *
+        * @todo refactor basedir during https://github.com/friendica/friendica/issues/6720
         */
-       public static function init(Cache\IConfigCache $configCache, Profiler $profiler, array $server)
+       public static function init($basePath, Cache\IConfigCache $configCache, Profiler $profiler, array $server)
        {
                if (Database\DBA::connected()) {
                        return;
@@ -48,9 +51,9 @@ class DBFactory
                        $db_data = $server['MYSQL_DATABASE'];
                }
 
-               if (Database\DBA::connect($configCache, $profiler, $db_host, $db_user, $db_pass, $db_data, $charset)) {
+               if (Database\DBA::connect($basePath, $configCache, $profiler, $db_host, $db_user, $db_pass, $db_data, $charset)) {
                        // Loads DB_UPDATE_VERSION constant
-                       Database\DBStructure::definition($configCache->get('system', 'basepath'), false);
+                       Database\DBStructure::definition($basePath, false);
                }
 
                unset($db_host, $db_user, $db_pass, $db_data, $charset);
index acbf4bfaf7a0ced05776e455404baba58439d194..52178bb77fb9d41e753205f187d94d20b55f191d 100644 (file)
@@ -22,16 +22,16 @@ class DependencyFactory
         */
        public static function setUp($channel, $directory, $isBackend = true)
        {
-               $basedir = BasePath::create($directory, $_SERVER);
-               $configLoader = new Cache\ConfigCacheLoader($basedir);
+               $basePath = BasePath::create($directory, $_SERVER);
+               $configLoader = new Cache\ConfigCacheLoader($basePath);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                // needed to call PConfig::init()
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create($channel, $config);
 
-               return new App($config, $logger, $profiler, $isBackend);
+               return new App($basePath, $config, $logger, $profiler, $isBackend);
        }
 }
index 77a09637c46d9dc3dffc23330f543de9ffe31e23..681dc8a6c6bc5ce7fe3af5e00828f9feb8a92634 100644 (file)
@@ -7,6 +7,7 @@ use Friendica\Core\Logger;
 use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Util\Logger\FriendicaDevelopHandler;
 use Friendica\Util\Logger\FriendicaIntrospectionProcessor;
+use Friendica\Util\Logger\WorkerLogger;
 use Friendica\Util\Profiler;
 use Monolog;
 use Psr\Log\LoggerInterface;
@@ -19,6 +20,16 @@ use Psr\Log\LogLevel;
  */
 class LoggerFactory
 {
+       /**
+        * A list of classes, which shouldn't get logged
+        * @var array
+        */
+       private static $ignoreClassList = [
+               Logger::class,
+               Profiler::class,
+               WorkerLogger::class
+       ];
+
        /**
         * Creates a new PSR-3 compliant logger instances
         *
@@ -33,7 +44,7 @@ class LoggerFactory
                $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
                $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
                $logger->pushProcessor(new Monolog\Processor\UidProcessor());
-               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, [Logger::class, Profiler::class]));
+               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, self::$ignoreClassList));
 
                $debugging = $config->get('system', 'debugging');
                $stream    = $config->get('system', 'logfile');
@@ -78,7 +89,7 @@ class LoggerFactory
                $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
                $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
                $logger->pushProcessor(new Monolog\Processor\UidProcessor());
-               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, ['Friendica\\Core\\Logger']));
+               $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, self::$ignoreClassList));
 
                $logger->pushHandler(new FriendicaDevelopHandler($developerIp));
 
@@ -145,6 +156,7 @@ class LoggerFactory
                        if (!is_int($loglevel)) {
                                $loglevel = LogLevel::NOTICE;
                        }
+
                        $fileHandler = new Monolog\Handler\StreamHandler($stream, $loglevel);
 
                        $formatter = new Monolog\Formatter\LineFormatter("%datetime% %channel% [%level_name%]: %message% %context% %extra%\n");
index 26a156639e6bb05d79d8976f0862418cef2183be..19c96e8ca216eab37c4b30f567e56c46705fc370 100644 (file)
@@ -17,9 +17,9 @@ class ProfilerFactory
        public static function create(IConfigCache $configCache)
        {
                $enabled = $configCache->get('system', 'profiler');
-               $enabled = isset($enabled) && $enabled !== '!<unset>!';
+               $enabled = isset($enabled) && $enabled !== '0';
                $renderTime = $configCache->get('rendertime', 'callstack');
-               $renderTime = isset($renderTime) && $renderTime !== '!<unset>!';
+               $renderTime = isset($renderTime) && $renderTime !== '0';
 
                return new Profiler($enabled, $renderTime);
        }
index 2d6bc716bb11338fdbffcc2af290b66ff1fa090c..c472da2c07602170e79e886625500dfe62a98c4f 100644 (file)
@@ -232,6 +232,11 @@ class Contact extends BaseObject
                }
 
                DBA::update('user-contact', ['blocked' => $blocked], ['cid' => $cdata['public'], 'uid' => $uid], true);
+
+               if ($blocked) {
+                       // Blocked contact can't be in any group
+                       self::removeFromGroups($cid);
+               }
        }
 
        /**
@@ -616,7 +621,7 @@ class Contact extends BaseObject
                DBA::update('contact', ['archive' => true, 'network' => Protocol::PHANTOM, 'deleted' => true], ['id' => $id]);
 
                // Delete it in the background
-               Worker::add(PRIORITY_LOW, 'RemoveContact', $id);
+               Worker::add(PRIORITY_MEDIUM, 'RemoveContact', $id);
        }
 
        /**
@@ -1001,7 +1006,7 @@ class Contact extends BaseObject
                $sparkle = false;
                if (($contact['network'] === Protocol::DFRN) && !$contact['self']) {
                        $sparkle = true;
-                       $profile_link = System::baseUrl() . '/redir/' . $contact['id'];
+                       $profile_link = System::baseUrl() . '/redir/' . $contact['id'] . '?url=' . $contact['url'];
                } else {
                        $profile_link = $contact['url'];
                }
@@ -1011,9 +1016,9 @@ class Contact extends BaseObject
                }
 
                if ($sparkle) {
-                       $status_link = $profile_link . '?url=status';
-                       $photos_link = $profile_link . '?url=photos';
-                       $profile_link = $profile_link . '?url=profile';
+                       $status_link = $profile_link . '?tab=status';
+                       $photos_link = str_replace('/profile/', '/photos/', $profile_link);
+                       $profile_link = $profile_link . '?tab=profile';
                }
 
                if (in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA]) && !$contact['self']) {
@@ -2184,7 +2189,7 @@ class Contact extends BaseObject
        {
                $contact = DBA::selectFirst('contact', ['id', 'network', 'url', 'uid'], ['id' => $cid]);
 
-               return self::magicLinkbyContact($contact, $url);
+               return self::magicLinkByContact($contact, $url);
        }
 
        /**
@@ -2197,7 +2202,7 @@ class Contact extends BaseObject
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function magicLinkbyContact($contact, $url = '')
+       public static function magicLinkByContact($contact, $url = '')
        {
                if ((!local_user() && !remote_user()) || ($contact['network'] != Protocol::DFRN)) {
                        return $url ?: $contact['url']; // Equivalent to ($url != '') ? $url : $contact['url'];
@@ -2220,4 +2225,9 @@ class Contact extends BaseObject
 
                return $redirect;
        }
+
+       public static function removeFromGroups($contact_id)
+       {
+               return DBA::delete('group_member', ['contact-id' => $contact_id]);
+       }
 }
index 0af10995b4a70e698105993a58ad8b9678930834..feff4661ab6f8856fb916d7b12ffe0eacd7a2099 100644 (file)
@@ -16,6 +16,26 @@ use Friendica\Database\DBA;
  */
 class Group extends BaseObject
 {
+       /**
+        *
+        *
+        * @param int $group_id
+        * @return bool
+        * @throws \Exception
+        */
+       public static function exists($group_id, $uid = null)
+       {
+               $condition = ['id' => $group_id, 'deleted' => false];
+
+               if (isset($uid)) {
+                       $condition = [
+                               'uid' => $uid
+                       ];
+               }
+
+               return DBA::exists('group', $condition);
+       }
+
        /**
         * @brief Create a new contact group
         *
index 475f9131fd2bfb227b375f7c09c6fb6e0723e2f9..16a3b07b53097e98ab3d52dccd693a1b9ce4f888 100644 (file)
@@ -1336,7 +1336,11 @@ class Item extends BaseObject
                        $expire_date = time() - ($expire_interval * 86400);
                        $created_date = strtotime($item['created']);
                        if ($created_date < $expire_date) {
-                               Logger::log('item-store: item created ('.date('c', $created_date).') before expiration time ('.date('c', $expire_date).'). ignored. ' . print_r($item,true), Logger::DEBUG);
+                               Logger::notice('Item created before expiration interval.', [
+                                       'created' => date('c', $created_date),
+                                       'expired' => date('c', $expire_date),
+                                       '$item' => $item
+                               ]);
                                return 0;
                        }
                }
@@ -1354,7 +1358,13 @@ class Item extends BaseObject
                        if (DBA::isResult($existing)) {
                                // We only log the entries with a different user id than 0. Otherwise we would have too many false positives
                                if ($uid != 0) {
-                                       Logger::log("Item with uri ".$item['uri']." already existed for user ".$uid." with id ".$existing["id"]." target network ".$existing["network"]." - new network: ".$item['network']);
+                                       Logger::notice('Item already existed for user', [
+                                               'uri' => $item['uri'],
+                                               'uid' => $uid,
+                                               'network' => $item['network'],
+                                               'existing_id' => $existing["id"],
+                                               'existing_network' => $existing["network"]
+                                       ]);
                                }
 
                                return $existing["id"];
@@ -1405,7 +1415,7 @@ class Item extends BaseObject
 
                // When there is no content then we don't post it
                if ($item['body'].$item['title'] == '') {
-                       Logger::log('No body, no title.');
+                       Logger::notice('No body, no title.');
                        return 0;
                }
 
@@ -1432,7 +1442,7 @@ class Item extends BaseObject
                $item['author-id'] = defaults($item, 'author-id', Contact::getIdForURL($item["author-link"], 0, false, $default));
 
                if (Contact::isBlocked($item["author-id"])) {
-                       Logger::log('Contact '.$item["author-id"].' is blocked, item '.$item["uri"].' will not be stored');
+                       Logger::notice('Author is blocked node-wide', ['author-link' => $item["author-link"], 'item-uri' => $item["uri"]]);
                        return 0;
                }
 
@@ -1442,22 +1452,27 @@ class Item extends BaseObject
                $item['owner-id'] = defaults($item, 'owner-id', Contact::getIdForURL($item["owner-link"], 0, false, $default));
 
                if (Contact::isBlocked($item["owner-id"])) {
-                       Logger::log('Contact '.$item["owner-id"].' is blocked, item '.$item["uri"].' will not be stored');
+                       Logger::notice('Owner is blocked node-wide', ['owner-link' => $item["owner-link"], 'item-uri' => $item["uri"]]);
                        return 0;
                }
 
                if ($item['network'] == Protocol::PHANTOM) {
-                       Logger::log('Missing network. Called by: '.System::callstack(), Logger::DEBUG);
-
                        $item['network'] = Protocol::DFRN;
-                       Logger::log("Set network to " . $item["network"] . " for " . $item["uri"], Logger::DEBUG);
+                       Logger::notice('Missing network, setting to {network}.', [
+                               'uri' => $item["uri"],
+                               'network' => $item['network'],
+                               'callstack' => System::callstack()
+                       ]);
                }
 
                // Checking if there is already an item with the same guid
-               Logger::log('Checking for an item for user '.$item['uid'].' on network '.$item['network'].' with the guid '.$item['guid'], Logger::DEBUG);
                $condition = ['guid' => $item['guid'], 'network' => $item['network'], 'uid' => $item['uid']];
                if (self::exists($condition)) {
-                       Logger::log('found item with guid '.$item['guid'].' for user '.$item['uid'].' on network '.$item['network'], Logger::DEBUG);
+                       Logger::notice('Found already existing item', [
+                               'guid' => $item['guid'],
+                               'uid' => $item['uid'],
+                               'network' => $item['network']
+                       ]);
                        return 0;
                }
 
index 152e870e8595c57da88a7f14212b9a8131cb173b..8ad7f3145f3d8c30d593c3b1b34c24999774171a 100644 (file)
@@ -10,8 +10,8 @@ use Friendica\BaseObject;
 use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Core\L10n;
-use Friendica\Core\System;
 use Friendica\Core\StorageManager;
+use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Database\DBStructure;
 use Friendica\Model\Storage\IStorage;
@@ -203,7 +203,7 @@ class Photo extends BaseObject
         */
        private static function getFields()
        {
-               $allfields = DBStructure::definition(false);
+               $allfields = DBStructure::definition(self::getApp()->getBasePath(), false);
                $fields = array_keys($allfields["photo"]["fields"]);
                array_splice($fields, array_search("data", $fields), 1);
                return $fields;
index aacceedb3a9f8876e85850c11f510b4d315f1b68..b10e9848f5893d269fe79dcb1214ceb8beff159b 100644 (file)
@@ -787,7 +787,7 @@ class Profile
                                $profile['marital']['with'] = $a->profile['with'];
                        }
 
-                       if (strlen($a->profile['howlong']) && $a->profile['howlong'] >= DBA::NULL_DATETIME) {
+                       if (strlen($a->profile['howlong']) && $a->profile['howlong'] > DBA::NULL_DATETIME) {
                                $profile['howlong'] = Temporal::getRelativeDate($a->profile['howlong'], L10n::t('for %1$d %2$s'));
                        }
 
index 6e3425524a1dcff0dd6e5b2f10effd6babcd5385..f196974a8f66d10279c286a4be23fcf6931e2ff2 100644 (file)
@@ -1,37 +1,82 @@
 <?php
 /**
- * @file src/Model/Term
+ * @file src/Model/Term.php
  */
 namespace Friendica\Model;
 
+use Friendica\Core\Logger;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
+use Friendica\Util\Strings;
 
+/**
+ * Class Term
+ *
+ * This Model class handles term table interactions.
+ * This tables stores relevant terms related to posts, photos and searches, like hashtags, mentions and
+ * user-applied categories.
+ *
+ * @package Friendica\Model
+ */
 class Term
 {
-       public static function tagTextFromItemId($itemid)
-       {
-               $tag_text = '';
-               $condition = ['otype' => TERM_OBJ_POST, 'oid' => $itemid, 'type' => [TERM_HASHTAG, TERM_MENTION]];
-               $tags = DBA::select('term', [], $condition);
-               while ($tag = DBA::fetch($tags)) {
-                       if ($tag_text != '') {
-                               $tag_text .= ',';
-                       }
+    const UNKNOWN           = 0;
+    const HASHTAG           = 1;
+    const MENTION           = 2;
+    const CATEGORY          = 3;
+    const PCATEGORY         = 4;
+    const FILE              = 5;
+    const SAVEDSEARCH       = 6;
+    const CONVERSATION      = 7;
+       /**
+        * An implicit mention is a mention in a comment body that is redundant with the threading information.
+        */
+    const IMPLICIT_MENTION  = 8;
+       /**
+        * An exclusive mention transfers the ownership of the post to the target account, usually a forum.
+        */
+    const EXCLUSIVE_MENTION = 9;
 
-                       if ($tag['type'] == 1) {
-                               $tag_text .= '#';
-                       } else {
-                               $tag_text .= '@';
-                       }
-                       $tag_text .= '[url=' . $tag['url'] . ']' . $tag['term'] . '[/url]';
+    const TAG_CHARACTER = [
+       self::HASHTAG           => '#',
+       self::MENTION           => '@',
+       self::IMPLICIT_MENTION  => '%',
+       self::EXCLUSIVE_MENTION => '!',
+    ];
+
+    const OBJECT_TYPE_POST  = 1;
+    const OBJECT_TYPE_PHOTO = 2;
+
+       /**
+        * Generates the legacy item.tag field comma-separated BBCode string from an item ID.
+        * Includes only hashtags, implicit and explicit mentions.
+        *
+        * @param int $item_id
+        * @return string
+        * @throws \Exception
+        */
+       public static function tagTextFromItemId($item_id)
+       {
+               $tag_list = [];
+               $tags = self::tagArrayFromItemId($item_id, [self::HASHTAG, self::MENTION, self::IMPLICIT_MENTION]);
+               foreach ($tags as $tag) {
+                       $tag_list[] = self::TAG_CHARACTER[$tag['type']] . '[url=' . $tag['url'] . ']' . $tag['term'] . '[/url]';
                }
-               return $tag_text;
+
+               return implode(',', $tag_list);
        }
 
-       public static function tagArrayFromItemId($itemid, $type = [TERM_HASHTAG, TERM_MENTION])
+       /**
+        * Retrieves the terms from the provided type(s) associated with the provided item ID.
+        *
+        * @param int       $item_id
+        * @param int|array $type
+        * @return array
+        * @throws \Exception
+        */
+       public static function tagArrayFromItemId($item_id, $type = [self::HASHTAG, self::MENTION])
        {
-               $condition = ['otype' => TERM_OBJ_POST, 'oid' => $itemid, 'type' => $type];
+               $condition = ['otype' => self::OBJECT_TYPE_POST, 'oid' => $item_id, 'type' => $type];
                $tags = DBA::select('term', ['type', 'term', 'url'], $condition);
                if (!DBA::isResult($tags)) {
                        return [];
@@ -40,22 +85,39 @@ class Term
                return DBA::toArray($tags);
        }
 
-       public static function fileTextFromItemId($itemid)
+       /**
+        * Generates the legacy item.file field string from an item ID.
+        * Includes only file and category terms.
+        *
+        * @param int $item_id
+        * @return string
+        * @throws \Exception
+        */
+       public static function fileTextFromItemId($item_id)
        {
                $file_text = '';
-               $condition = ['otype' => TERM_OBJ_POST, 'oid' => $itemid, 'type' => [TERM_FILE, TERM_CATEGORY]];
-               $tags = DBA::select('term', [], $condition);
-               while ($tag = DBA::fetch($tags)) {
-                       if ($tag['type'] == TERM_CATEGORY) {
+               $tags = self::tagArrayFromItemId($item_id, [self::FILE, self::CATEGORY]);
+               foreach ($tags as $tag) {
+                       if ($tag['type'] == self::CATEGORY) {
                                $file_text .= '<' . $tag['term'] . '>';
                        } else {
                                $file_text .= '[' . $tag['term'] . ']';
                        }
                }
+
                return $file_text;
        }
 
-       public static function insertFromTagFieldByItemId($itemid, $tags)
+       /**
+        * Inserts new terms for the provided item ID based on the legacy item.tag field BBCode content.
+        * Deletes all previous tag terms for the same item ID.
+        * Sets both the item.mention and thread.mentions field flags if a mention concerning the item UID is found.
+        *
+        * @param int    $item_id
+        * @param string $tag_str
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public static function insertFromTagFieldByItemId($item_id, $tag_str)
        {
                $profile_base = System::baseUrl();
                $profile_data = parse_url($profile_base);
@@ -64,32 +126,32 @@ class Term
                $profile_base_diaspora = $profile_data['host'] . $profile_path . '/u/';
 
                $fields = ['guid', 'uid', 'id', 'edited', 'deleted', 'created', 'received', 'title', 'body', 'parent'];
-               $message = Item::selectFirst($fields, ['id' => $itemid]);
-               if (!DBA::isResult($message)) {
+               $item = Item::selectFirst($fields, ['id' => $item_id]);
+               if (!DBA::isResult($item)) {
                        return;
                }
 
-               $message['tag'] = $tags;
+               $item['tag'] = $tag_str;
 
                // Clean up all tags
-               self::deleteByItemId($itemid);
+               self::deleteByItemId($item_id);
 
-               if ($message['deleted']) {
+               if ($item['deleted']) {
                        return;
                }
 
-               $taglist = explode(',', $message['tag']);
+               $taglist = explode(',', $item['tag']);
 
                $tags_string = '';
                foreach ($taglist as $tag) {
-                       if ((substr(trim($tag), 0, 1) == '#') || (substr(trim($tag), 0, 1) == '@') || (substr(trim($tag), 0, 1) == '!')) {
+                       if (Strings::startsWith($tag, self::TAG_CHARACTER)) {
                                $tags_string .= ' ' . trim($tag);
                        } else {
                                $tags_string .= ' #' . trim($tag);
                        }
                }
 
-               $data = ' ' . $message['title'] . ' ' . $message['body'] . ' ' . $tags_string . ' ';
+               $data = ' ' . $item['title'] . ' ' . $item['body'] . ' ' . $tags_string . ' ';
 
                // ignore anything in a code block
                $data = preg_replace('/\[code\](.*?)\[\/code\]/sm', '', $data);
@@ -103,11 +165,15 @@ class Term
                        }
                }
 
-               $pattern = '/\W([\#@!])\[url\=(.*?)\](.*?)\[\/url\]/ism';
+               $pattern = '/\W([\#@!%])\[url\=(.*?)\](.*?)\[\/url\]/ism';
                if (preg_match_all($pattern, $data, $matches, PREG_SET_ORDER)) {
                        foreach ($matches as $match) {
 
-                               if (($match[1] == '@') || ($match[1] == '!')) {
+                               if (in_array($match[1], [
+                                       self::TAG_CHARACTER[self::MENTION],
+                                       self::TAG_CHARACTER[self::IMPLICIT_MENTION],
+                                       self::TAG_CHARACTER[self::EXCLUSIVE_MENTION]
+                               ])) {
                                        $contact = Contact::getDetailsByURL($match[2], 0);
                                        if (!empty($contact['addr'])) {
                                                $match[3] = $contact['addr'];
@@ -118,12 +184,12 @@ class Term
                                        }
                                }
 
-                               $tags[$match[1] . trim($match[3], ',.:;[]/\"?!')] = $match[2];
+                               $tags[$match[2]] = $match[1] . trim($match[3], ',.:;[]/\"?!');
                        }
                }
 
-               foreach ($tags as $tag => $link) {
-                       if (substr(trim($tag), 0, 1) == '#') {
+               foreach ($tags as $link => $tag) {
+                       if (self::isType($tag, self::HASHTAG)) {
                                // try to ignore #039 or #1 or anything like that
                                if (ctype_digit(substr(trim($tag), 1))) {
                                        continue;
@@ -134,11 +200,15 @@ class Term
                                        continue;
                                }
 
-                               $type = TERM_HASHTAG;
+                               $type = self::HASHTAG;
                                $term = substr($tag, 1);
                                $link = '';
-                       } elseif ((substr(trim($tag), 0, 1) == '@') || (substr(trim($tag), 0, 1) == '!')) {
-                               $type = TERM_MENTION;
+                       } elseif (self::isType($tag, self::MENTION, self::EXCLUSIVE_MENTION, self::IMPLICIT_MENTION)) {
+                               if (self::isType($tag, self::MENTION, self::EXCLUSIVE_MENTION)) {
+                                       $type = self::MENTION;
+                               } else {
+                                       $type = self::IMPLICIT_MENTION;
+                               }
 
                                $contact = Contact::getDetailsByURL($link, 0);
                                if (!empty($contact['name'])) {
@@ -147,43 +217,51 @@ class Term
                                        $term = substr($tag, 1);
                                }
                        } else { // This shouldn't happen
-                               $type = TERM_HASHTAG;
+                               $type = self::HASHTAG;
                                $term = $tag;
                                $link = '';
+
+                               Logger::notice('Unknown term type', ['tag' => $tag]);
                        }
 
-                       if (DBA::exists('term', ['uid' => $message['uid'], 'otype' => TERM_OBJ_POST, 'oid' => $itemid, 'term' => $term])) {
+                       if (DBA::exists('term', ['uid' => $item['uid'], 'otype' => self::OBJECT_TYPE_POST, 'oid' => $item_id, 'term' => $term, 'type' => $type])) {
                                continue;
                        }
 
-                       if ($message['uid'] == 0) {
+                       if ($item['uid'] == 0) {
                                $global = true;
-                               DBA::update('term', ['global' => true], ['otype' => TERM_OBJ_POST, 'guid' => $message['guid']]);
+                               DBA::update('term', ['global' => true], ['otype' => self::OBJECT_TYPE_POST, 'guid' => $item['guid']]);
                        } else {
-                               $global = DBA::exists('term', ['uid' => 0, 'otype' => TERM_OBJ_POST, 'guid' => $message['guid']]);
+                               $global = DBA::exists('term', ['uid' => 0, 'otype' => self::OBJECT_TYPE_POST, 'guid' => $item['guid']]);
                        }
 
                        DBA::insert('term', [
-                               'uid'      => $message['uid'],
-                               'oid'      => $itemid,
-                               'otype'    => TERM_OBJ_POST,
+                               'uid'      => $item['uid'],
+                               'oid'      => $item_id,
+                               'otype'    => self::OBJECT_TYPE_POST,
                                'type'     => $type,
                                'term'     => $term,
                                'url'      => $link,
-                               'guid'     => $message['guid'],
-                               'created'  => $message['created'],
-                               'received' => $message['received'],
+                               'guid'     => $item['guid'],
+                               'created'  => $item['created'],
+                               'received' => $item['received'],
                                'global'   => $global
                        ]);
 
                        // Search for mentions
-                       if (((substr($tag, 0, 1) == '@') || (substr($tag, 0, 1) == '!')) && (strpos($link, $profile_base_friendica) || strpos($link, $profile_base_diaspora))) {
-                               $users = q("SELECT `uid` FROM `contact` WHERE self AND (`url` = '%s' OR `nurl` = '%s')", $link, $link);
+                       if (self::isType($tag, self::MENTION, self::EXCLUSIVE_MENTION)
+                               && (
+                                       strpos($link, $profile_base_friendica) !== false
+                                       || strpos($link, $profile_base_diaspora) !== false
+                               )
+                       ) {
+                               $users_stmt = DBA::p("SELECT `uid` FROM `contact` WHERE self AND (`url` = ? OR `nurl` = ?)", $link, $link);
+                               $users = DBA::toArray($users_stmt);
                                foreach ($users AS $user) {
-                                       if ($user['uid'] == $message['uid']) {
-                                               /// @todo This function is called frim Item::update - so we mustn't call that function here
-                                               DBA::update('item', ['mention' => true], ['id' => $itemid]);
-                                               DBA::update('thread', ['mention' => true], ['iid' => $message['parent']]);
+                                       if ($user['uid'] == $item['uid']) {
+                                               /// @todo This function is called from Item::update - so we mustn't call that function here
+                                               DBA::update('item', ['mention' => true], ['id' => $item_id]);
+                                               DBA::update('thread', ['mention' => true], ['iid' => $item['parent']]);
                                        }
                                }
                        }
@@ -191,20 +269,23 @@ class Term
        }
 
        /**
-        * @param integer $itemid item id
+        * Inserts new terms for the provided item ID based on the legacy item.file field BBCode content.
+        * Deletes all previous file terms for the same item ID.
+        *
+        * @param integer $item_id item id
         * @param         $files
         * @return void
         * @throws \Exception
         */
-       public static function insertFromFileFieldByItemId($itemid, $files)
+       public static function insertFromFileFieldByItemId($item_id, $files)
        {
-               $message = Item::selectFirst(['uid', 'deleted'], ['id' => $itemid]);
+               $message = Item::selectFirst(['uid', 'deleted'], ['id' => $item_id]);
                if (!DBA::isResult($message)) {
                        return;
                }
 
                // Clean up all tags
-               DBA::delete('term', ['otype' => TERM_OBJ_POST, 'oid' => $itemid, 'type' => [TERM_FILE, TERM_CATEGORY]]);
+               DBA::delete('term', ['otype' => self::OBJECT_TYPE_POST, 'oid' => $item_id, 'type' => [self::FILE, self::CATEGORY]]);
 
                if ($message["deleted"]) {
                        return;
@@ -216,9 +297,9 @@ class Term
                        foreach ($files[1] as $file) {
                                DBA::insert('term', [
                                        'uid' => $message["uid"],
-                                       'oid' => $itemid,
-                                       'otype' => TERM_OBJ_POST,
-                                       'type' => TERM_FILE,
+                                       'oid' => $item_id,
+                                       'otype' => self::OBJECT_TYPE_POST,
+                                       'type' => self::FILE,
                                        'term' => $file
                                ]);
                        }
@@ -228,9 +309,9 @@ class Term
                        foreach ($files[1] as $file) {
                                DBA::insert('term', [
                                        'uid' => $message["uid"],
-                                       'oid' => $itemid,
-                                       'otype' => TERM_OBJ_POST,
-                                       'type' => TERM_CATEGORY,
+                                       'oid' => $item_id,
+                                       'otype' => self::OBJECT_TYPE_POST,
+                                       'type' => self::CATEGORY,
                                        'term' => $file
                                ]);
                        }
@@ -252,6 +333,7 @@ class Term
                        'tags' => [],
                        'hashtags' => [],
                        'mentions' => [],
+                       'implicit_mentions' => [],
                ];
 
                $searchpath = System::baseUrl() . "/search?tag=";
@@ -259,10 +341,9 @@ class Term
                $taglist = DBA::select(
                        'term',
                        ['type', 'term', 'url'],
-                       ["`otype` = ? AND `oid` = ? AND `type` IN (?, ?)", TERM_OBJ_POST, $item['id'], TERM_HASHTAG, TERM_MENTION],
+                       ['otype' => self::OBJECT_TYPE_POST, 'oid' => $item['id'], 'type' => [self::HASHTAG, self::MENTION, self::IMPLICIT_MENTION]],
                        ['order' => ['tid']]
                );
-
                while ($tag = DBA::fetch($taglist)) {
                        if ($tag['url'] == '') {
                                $tag['url'] = $searchpath . rawurlencode($tag['term']);
@@ -270,25 +351,25 @@ class Term
 
                        $orig_tag = $tag['url'];
 
-                       $author = ['uid' => 0, 'id' => $item['author-id'],
-                               'network' => $item['author-network'], 'url' => $item['author-link']];
-
-                       $prefix = '';
-                       if ($tag['type'] == TERM_HASHTAG) {
-                               $tag['url'] = Contact::magicLinkByContact($author, $tag['url']);
-                               if ($orig_tag != $tag['url']) {
-                                       $item['body'] = str_replace($orig_tag, $tag['url'], $item['body']);
-                               }
+                       $prefix = self::TAG_CHARACTER[$tag['type']];
+                       switch($tag['type']) {
+                               case self::HASHTAG:
+                                       if ($orig_tag != $tag['url']) {
+                                               $item['body'] = str_replace($orig_tag, $tag['url'], $item['body']);
+                                       }
 
-                               $return['hashtags'][] = '#<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
-                               $prefix = '#';
-                       } elseif ($tag['type'] == TERM_MENTION) {
-                               $tag['url'] = Contact::magicLink($tag['url']);
-                               $return['mentions'][] = '@<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
-                               $prefix = '@';
+                                       $return['hashtags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
+                                       $return['tags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
+                                       break;
+                               case self::MENTION:
+                                       $tag['url'] = Contact::magicLink($tag['url']);
+                                       $return['mentions'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
+                                       $return['tags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
+                                       break;
+                               case self::IMPLICIT_MENTION:
+                                       $return['implicit_mentions'][] = $prefix . $tag['term'];
+                                       break;
                        }
-
-                       $return['tags'][] = $prefix . '<a href="' . $tag['url'] . '" target="_blank">' . $tag['term'] . '</a>';
                }
                DBA::close($taglist);
 
@@ -296,20 +377,38 @@ class Term
        }
 
        /**
-        * Delete all tags from an item
+        * Delete tags of the specific type(s) from an item
         *
-        * @param int itemid - choose from which item the tags will be removed
-        * @param array $type
+        * @param int       $item_id
+        * @param int|array $type
         * @throws \Exception
         */
-       public static function deleteByItemId($itemid, $type = [TERM_HASHTAG, TERM_MENTION])
+       public static function deleteByItemId($item_id, $type = [self::HASHTAG, self::MENTION, self::IMPLICIT_MENTION])
        {
-               if (empty($itemid)) {
+               if (empty($item_id)) {
                        return;
                }
 
                // Clean up all tags
-               DBA::delete('term', ['otype' => TERM_OBJ_POST, 'oid' => $itemid, 'type' => $type]);
+               DBA::delete('term', ['otype' => self::OBJECT_TYPE_POST, 'oid' => $item_id, 'type' => $type]);
+       }
+
+       /**
+        * Check if the provided tag is of one of the provided term types.
+        *
+        * @param string $tag
+        * @param int    ...$types
+        * @return bool
+        */
+       public static function isType($tag, ...$types)
+       {
+               $tag_chars = [];
+               foreach ($types as $type) {
+                       if (array_key_exists($type, self::TAG_CHARACTER)) {
+                               $tag_chars[] = self::TAG_CHARACTER[$type];
+                       }
+               }
 
+               return Strings::startsWith($tag, $tag_chars);
        }
 }
diff --git a/src/Module/Group.php b/src/Module/Group.php
new file mode 100644 (file)
index 0000000..747ec1e
--- /dev/null
@@ -0,0 +1,350 @@
+<?php\r
+/**\r
+ * @file src/Module/Group.php\r
+ */\r
+\r
+namespace Friendica\Module;\r
+\r
+use Friendica\BaseModule;\r
+use Friendica\Core\Config;\r
+use Friendica\Core\L10n;\r
+use Friendica\Core\PConfig;\r
+use Friendica\Core\Renderer;\r
+use Friendica\Core\System;\r
+use Friendica\Database\DBA;\r
+use Friendica\Model;\r
+use Friendica\Util\Strings;\r
+\r
+require_once 'boot.php';\r
+\r
+class Group extends BaseModule\r
+{\r
+       public static function post()\r
+       {\r
+               $a = self::getApp();\r
+\r
+               if ($a->isAjax()) {\r
+                       self::ajaxPost();\r
+               }\r
+\r
+               if (!local_user()) {\r
+                       notice(L10n::t('Permission denied.'));\r
+                       $a->internalRedirect();\r
+               }\r
+\r
+               if (($a->argc == 2) && ($a->argv[1] === 'new')) {\r
+                       BaseModule::checkFormSecurityTokenRedirectOnError('/group/new', 'group_edit');\r
+\r
+                       $name = Strings::escapeTags(trim($_POST['groupname']));\r
+                       $r = Model\Group::create(local_user(), $name);\r
+                       if ($r) {\r
+                               info(L10n::t('Group created.'));\r
+                               $r = Model\Group::getIdByName(local_user(), $name);\r
+                               if ($r) {\r
+                                       $a->internalRedirect('group/' . $r);\r
+                               }\r
+                       } else {\r
+                               notice(L10n::t('Could not create group.'));\r
+                       }\r
+                       $a->internalRedirect('group');\r
+               }\r
+\r
+               if (($a->argc == 2) && intval($a->argv[1])) {\r
+                       BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_edit');\r
+\r
+                       $group = DBA::selectFirst('group', ['id', 'name'], ['id' => $a->argv[1], 'uid' => local_user()]);\r
+                       if (!DBA::isResult($group)) {\r
+                               notice(L10n::t('Group not found.'));\r
+                               $a->internalRedirect('contact');\r
+                       }\r
+                       $groupname = Strings::escapeTags(trim($_POST['groupname']));\r
+                       if (strlen($groupname) && ($groupname != $group['name'])) {\r
+                               if (Model\Group::update($group['id'], $groupname)) {\r
+                                       info(L10n::t('Group name changed.'));\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public static function ajaxPost()\r
+       {\r
+               try {\r
+                       $a = self::getApp();\r
+\r
+                       if (!local_user()) {\r
+                               throw new \Exception(L10n::t('Permission denied.'), 403);\r
+                       }\r
+\r
+                       // POST /group/123/add/123\r
+                       // POST /group/123/remove/123\r
+                       if ($a->argc == 4) {\r
+                               list($group_id, $command, $contact_id) = array_slice($a->argv, 1);\r
+\r
+                               if (!Model\Group::exists($group_id, local_user())) {\r
+                                       throw new \Exception(L10n::t('Unknown group.'), 404);\r
+                               }\r
+\r
+                               $contact = DBA::selectFirst('contact', ['pending', 'blocked', 'deleted'], ['id' => $contact_id, 'uid' => local_user()]);\r
+                               if (!DBA::isResult($contact)) {\r
+                                       throw new \Exception(L10n::t('Contact not found.'), 404);\r
+                               }\r
+\r
+                               if ($contact['pending']) {\r
+                                       throw new \Exception(L10n::t('Contact is unavailable.'), 400);\r
+                               }\r
+\r
+                               if ($contact['deleted']) {\r
+                                       throw new \Exception(L10n::t('Contact is deleted.'), 410);\r
+                               }\r
+\r
+                               switch($command) {\r
+                                       case 'add':\r
+                                               if ($contact['blocked']) {\r
+                                                       throw new \Exception(L10n::t('Contact is blocked, unable to add it to a group.'), 400);\r
+                                               }\r
+\r
+                                               if (!Model\Group::addMember($group_id, $contact_id)) {\r
+                                                       throw new \Exception(L10n::t('Unable to add the contact to the group.'), 500);\r
+                                               }\r
+                                               $message = L10n::t('Contact successfully added to group.');\r
+                                               break;\r
+                                       case 'remove':\r
+                                               if (!Model\Group::removeMember($group_id, $contact_id)) {\r
+                                                       throw new \Exception(L10n::t('Unable to remove the contact from the group.'), 500);\r
+                                               }\r
+                                               $message = L10n::t('Contact successfully removed from group.');\r
+                                               break;\r
+                                       default:\r
+                                               throw new \Exception(L10n::t('Unknown group command.'), 400);\r
+                               }\r
+                       } else {\r
+                               throw new \Exception(L10n::t('Bad request.'), 400);\r
+                       }\r
+\r
+                       notice($message);\r
+                       System::jsonExit(['status' => 'OK', 'message' => $message]);\r
+               } catch (\Exception $e) {\r
+                       notice($e->getMessage());\r
+                       System::jsonError($e->getCode(), ['status' => 'error', 'message' => $e->getMessage()]);\r
+               }\r
+       }\r
+\r
+       public static function content()\r
+       {\r
+               $change = false;\r
+\r
+               if (!local_user()) {\r
+                       System::httpExit(403);\r
+               }\r
+\r
+               $a = self::getApp();\r
+\r
+               $a->page['aside'] = Model\Group::sidebarWidget('contact', 'group', 'extended', (($a->argc > 1) ? $a->argv[1] : 'everyone'));\r
+\r
+               // With no group number provided we jump to the unassigned contacts as a starting point\r
+               if ($a->argc == 1) {\r
+                       $a->internalRedirect('group/none');\r
+               }\r
+\r
+               // Switch to text mode interface if we have more than 'n' contacts or group members\r
+               $switchtotext = PConfig::get(local_user(), 'system', 'groupedit_image_limit');\r
+               if (is_null($switchtotext)) {\r
+                       $switchtotext = Config::get('system', 'groupedit_image_limit', 200);\r
+               }\r
+\r
+               $tpl = Renderer::getMarkupTemplate('group_edit.tpl');\r
+\r
+\r
+               $context = [\r
+                       '$submit' => L10n::t('Save Group'),\r
+                       '$submit_filter' => L10n::t('Filter'),\r
+               ];\r
+\r
+               if (($a->argc == 2) && ($a->argv[1] === 'new')) {\r
+                       return Renderer::replaceMacros($tpl, $context + [\r
+                               '$title' => L10n::t('Create a group of contacts/friends.'),\r
+                               '$gname' => ['groupname', L10n::t('Group Name: '), '', ''],\r
+                               '$gid' => 'new',\r
+                               '$form_security_token' => BaseModule::getFormSecurityToken("group_edit"),\r
+                       ]);\r
+               }\r
+\r
+               $nogroup = false;\r
+\r
+               if (($a->argc == 2) && ($a->argv[1] === 'none')) {\r
+                       $id = -1;\r
+                       $nogroup = true;\r
+                       $group = [\r
+                               'id' => $id,\r
+                               'name' => L10n::t('Contacts not in any group'),\r
+                       ];\r
+\r
+                       $members = [];\r
+                       $preselected = [];\r
+\r
+                       $context = $context + [\r
+                               '$title' => $group['name'],\r
+                               '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],\r
+                               '$gid' => $id,\r
+                               '$editable' => 0,\r
+                       ];\r
+               }\r
+\r
+               if (($a->argc == 3) && ($a->argv[1] === 'drop')) {\r
+                       BaseModule::checkFormSecurityTokenRedirectOnError('/group', 'group_drop', 't');\r
+\r
+                       if (intval($a->argv[2])) {\r
+                               if (!Model\Group::exists($a->argv[2], local_user())) {\r
+                                       notice(L10n::t('Group not found.'));\r
+                                       $a->internalRedirect('contact');\r
+                               }\r
+\r
+                               if (Model\Group::remove($a->argv[2])) {\r
+                                       info(L10n::t('Group removed.'));\r
+                               } else {\r
+                                       notice(L10n::t('Unable to remove group.'));\r
+                               }\r
+                       }\r
+                       $a->internalRedirect('group');\r
+               }\r
+\r
+               if (($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {\r
+                       BaseModule::checkFormSecurityTokenForbiddenOnError('group_member_change', 't');\r
+\r
+                       if (DBA::exists('contact', ['id' => $a->argv[2], 'uid' => local_user(), 'self' => false, 'pending' => false, 'blocked' => false])) {\r
+                               $change = intval($a->argv[2]);\r
+                       }\r
+               }\r
+\r
+               if (($a->argc > 1) && intval($a->argv[1])) {\r
+                       $group = DBA::selectFirst('group', ['id', 'name'], ['id' => $a->argv[1], 'uid' => local_user(), 'deleted' => false]);\r
+                       if (!DBA::isResult($group)) {\r
+                               notice(L10n::t('Group not found.'));\r
+                               $a->internalRedirect('contact');\r
+                       }\r
+\r
+                       $members = Model\Contact::getByGroupId($group['id']);\r
+                       $preselected = [];\r
+\r
+                       if (count($members)) {\r
+                               foreach ($members as $member) {\r
+                                       $preselected[] = $member['id'];\r
+                               }\r
+                       }\r
+\r
+                       if ($change) {\r
+                               if (in_array($change, $preselected)) {\r
+                                       Model\Group::removeMember($group['id'], $change);\r
+                               } else {\r
+                                       Model\Group::addMember($group['id'], $change);\r
+                               }\r
+\r
+                               $members = Model\Contact::getByGroupId($group['id']);\r
+                               $preselected = [];\r
+                               if (count($members)) {\r
+                                       foreach ($members as $member) {\r
+                                               $preselected[] = $member['id'];\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       $drop_tpl = Renderer::getMarkupTemplate('group_drop.tpl');\r
+                       $drop_txt = Renderer::replaceMacros($drop_tpl, [\r
+                               '$id' => $group['id'],\r
+                               '$delete' => L10n::t('Delete Group'),\r
+                               '$form_security_token' => BaseModule::getFormSecurityToken("group_drop"),\r
+                       ]);\r
+\r
+                       $context = $context + [\r
+                               '$title' => $group['name'],\r
+                               '$gname' => ['groupname', L10n::t('Group Name: '), $group['name'], ''],\r
+                               '$gid' => $group['id'],\r
+                               '$drop' => $drop_txt,\r
+                               '$form_security_token' => BaseModule::getFormSecurityToken('group_edit'),\r
+                               '$edit_name' => L10n::t('Edit Group Name'),\r
+                               '$editable' => 1,\r
+                       ];\r
+               }\r
+\r
+               if (!isset($group)) {\r
+                       System::httpExit(400);\r
+               }\r
+\r
+               $groupeditor = [\r
+                       'label_members' => L10n::t('Members'),\r
+                       'members' => [],\r
+                       'label_contacts' => L10n::t('All Contacts'),\r
+                       'group_is_empty' => L10n::t('Group is empty'),\r
+                       'contacts' => [],\r
+               ];\r
+\r
+               $sec_token = addslashes(BaseModule::getFormSecurityToken('group_member_change'));\r
+\r
+               // Format the data of the group members\r
+               foreach ($members as $member) {\r
+                       if ($member['url']) {\r
+                               $entry = Contact::getContactTemplateVars($member);\r
+                               $entry['label'] = 'members';\r
+                               $entry['photo_menu'] = '';\r
+                               $entry['change_member'] = [\r
+                                       'title'     => L10n::t("Remove contact from group"),\r
+                                       'gid'       => $group['id'],\r
+                                       'cid'       => $member['id'],\r
+                                       'sec_token' => $sec_token\r
+                               ];\r
+\r
+                               $groupeditor['members'][] = $entry;\r
+                       } else {\r
+                               Model\Group::removeMember($group['id'], $member['id']);\r
+                       }\r
+               }\r
+\r
+               if ($nogroup) {\r
+                       $contacts = Model\Contact::getUngroupedList(local_user());\r
+               } else {\r
+                       $contacts_stmt = DBA::select('contact', [],\r
+                               ['uid' => local_user(), 'pending' => false, 'blocked' => false, 'self' => false],\r
+                               ['order' => ['name']]\r
+                       );\r
+                       $contacts = DBA::toArray($contacts_stmt);\r
+                       $context['$desc'] = L10n::t('Click on a contact to add or remove.');\r
+               }\r
+\r
+               if (DBA::isResult($contacts)) {\r
+                       // Format the data of the contacts who aren't in the contact group\r
+                       foreach ($contacts as $member) {\r
+                               if (!in_array($member['id'], $preselected)) {\r
+                                       $entry = Contact::getContactTemplateVars($member);\r
+                                       $entry['label'] = 'contacts';\r
+                                       if (!$nogroup)\r
+                                               $entry['photo_menu'] = [];\r
+\r
+                                       if (!$nogroup) {\r
+                                               $entry['change_member'] = [\r
+                                                       'title'     => L10n::t("Add contact to group"),\r
+                                                       'gid'       => $group['id'],\r
+                                                       'cid'       => $member['id'],\r
+                                                       'sec_token' => $sec_token\r
+                                               ];\r
+                                       }\r
+\r
+                                       $groupeditor['contacts'][] = $entry;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               $context['$groupeditor'] = $groupeditor;\r
+\r
+               // If there are to many contacts we could provide an alternative view mode\r
+               $total = count($groupeditor['members']) + count($groupeditor['contacts']);\r
+               $context['$shortmode'] = (($switchtotext && ($total > $switchtotext)) ? true : false);\r
+\r
+               if ($change) {\r
+                       $tpl = Renderer::getMarkupTemplate('groupeditor.tpl');\r
+                       echo Renderer::replaceMacros($tpl, $context);\r
+                       exit();\r
+               }\r
+\r
+               return Renderer::replaceMacros($tpl, $context);\r
+       }\r
+}
\ No newline at end of file
index 3414e887fa93438b89253a565751ad178a0273de..de19bc86ab81da9e1248cb21f0b292dcdcf7e878 100644 (file)
@@ -43,6 +43,10 @@ class Install extends BaseModule
        {
                $a = self::getApp();
 
+               if (!$a->getMode()->isInstall()) {
+                       Core\System::httpExit(403);
+               }
+
                // route: install/testrwrite
                // $baseurl/install/testrwrite to test if rewrite in .htaccess is working
                if ($a->getArgumentValue(1, '') == 'testrewrite') {
@@ -75,7 +79,7 @@ class Install extends BaseModule
                                $dbdata  = Strings::escapeTags(trim(defaults($_POST, 'dbdata', '')));
 
                                // If we cannot connect to the database, return to the previous step
-                               if (!self::$installer->checkDB($a->getConfigCache(), $a->getProfiler(), $dbhost, $dbuser, $dbpass, $dbdata)) {
+                               if (!self::$installer->checkDB($a->getBasePath(), $a->getConfigCache(), $a->getProfiler(), $dbhost, $dbuser, $dbpass, $dbdata)) {
                                        self::$currentWizardStep = self::DATABASE_CONFIG;
                                }
 
@@ -92,7 +96,7 @@ class Install extends BaseModule
                                $adminmail = Strings::escapeTags(trim(defaults($_POST, 'adminmail', '')));
 
                                // If we cannot connect to the database, return to the Database config wizard
-                               if (!self::$installer->checkDB($a->getConfigCache(), $a->getProfiler(), $dbhost, $dbuser, $dbpass, $dbdata)) {
+                               if (!self::$installer->checkDB($a->getBasePath(), $a->getConfigCache(), $a->getProfiler(), $dbhost, $dbuser, $dbpass, $dbdata)) {
                                        self::$currentWizardStep = self::DATABASE_CONFIG;
                                        return;
                                }
index 9e62a568c89bf93b68c4e97f3347f5963da21d7e..12ce04f95c315f18634016fdcb3d8bf2a7e14e4e 100644 (file)
@@ -2,9 +2,12 @@
 
 namespace Friendica\Module;
 
+use Friendica\Content\Text\HTML;
 use Friendica\Core\L10n;
 use Friendica\Core\Renderer;
 use Friendica\Model;
+use Friendica\Protocol\ActivityPub\Processor;
+use Friendica\Protocol\Diaspora;
 
 /**
  * @author Hypolite Petovan <mrpetovan@gmail.com>
@@ -27,20 +30,27 @@ class Itemsource extends \Friendica\BaseModule
 
                $source = '';
                $item_uri = '';
+               $item_id = '';
+               $terms = [];
                if (!empty($guid)) {
-                       $item = Model\Item::selectFirst([], ['guid' => $guid]);
+                       $item = Model\Item::selectFirst(['id', 'guid', 'uri'], ['guid' => $guid]);
 
                        $conversation = Model\Conversation::getByItemUri($item['uri']);
 
+                       $guid = $item['guid'];
+                       $item_id = $item['id'];
                        $item_uri = $item['uri'];
                        $source = $conversation['source'];
+                       $terms = Model\Term::tagArrayFromItemId($item['id'], [Model\Term::HASHTAG, Model\Term::MENTION, Model\Term::IMPLICIT_MENTION]);
                }
 
                $tpl = Renderer::getMarkupTemplate('debug/itemsource.tpl');
                $o = Renderer::replaceMacros($tpl, [
-                       '$guid'          => ['guid', L10n::t('Item Guid'), defaults($_REQUEST, 'guid', ''), ''],
+                       '$guid'          => ['guid', L10n::t('Item Guid'), $guid, ''],
                        '$source'        => $source,
-                       '$item_uri'      => $item_uri
+                       '$item_uri'      => $item_uri,
+                       '$item_id'       => $item_id,
+                       '$terms'         => $terms,
                ]);
 
                return $o;
index deec3cf2dcb22f3bb0d51b6ee7a08c9492bf1caa..b061595d263d7e579f92cb9fc53254d868ab2ffa 100644 (file)
@@ -156,7 +156,7 @@ class Probe
                                continue;
                        }
 
-                       if (($attributes["rel"] == "lrdd") && !empty($attributes["template"])) {
+                       if (!empty($attributes["rel"]) && $attributes["rel"] == "lrdd" && !empty($attributes["template"])) {
                                $type = (empty($attributes["type"]) ? '' : $attributes["type"]);
 
                                $lrdd[$type] = $attributes["template"];
index 05ffeb52b213a75df1d44e576195a9b8b0759576..807c2d2227364ecb510503668c8118c5a1bdc807 100644 (file)
@@ -19,6 +19,7 @@ use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Model\Term;
+use Friendica\Model\User;
 use Friendica\Util\Crypto;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Proxy as ProxyUtils;
@@ -82,7 +83,7 @@ class Post extends BaseObject
                $author = ['uid' => 0, 'id' => $this->getDataValue('author-id'),
                        'network' => $this->getDataValue('author-network'),
                        'url' => $this->getDataValue('author-link')];
-               $this->redirect_url = Contact::magicLinkbyContact($author);
+               $this->redirect_url = Contact::magicLinkByContact($author);
                if (!$this->isToplevel()) {
                        $this->threaded = true;
                }
@@ -223,7 +224,7 @@ class Post extends BaseObject
                        'network' => $item['author-network'], 'url' => $item['author-link']];
 
                if (local_user() || remote_user()) {
-                       $profile_link = Contact::magicLinkbyContact($author);
+                       $profile_link = Contact::magicLinkByContact($author);
                } else {
                        $profile_link = $item['author-link'];
                }
@@ -365,6 +366,7 @@ class Post extends BaseObject
                        'tags'            => $tags['tags'],
                        'hashtags'        => $tags['hashtags'],
                        'mentions'        => $tags['mentions'],
+                       'implicit_mentions' => $tags['implicit_mentions'],
                        'txt_cats'        => L10n::t('Categories:'),
                        'txt_folders'     => L10n::t('Filed under:'),
                        'has_cats'        => ((count($categories)) ? 'true' : ''),
@@ -781,10 +783,12 @@ class Post extends BaseObject
        {
                $a = self::getApp();
 
-               if (!local_user() || empty($a->profile['addr'])) {
+               if (!local_user()) {
                        return '';
                }
 
+               $owner = User::getOwnerDataById($a->user['uid']);
+
                if (!Feature::isEnabled(local_user(), 'explicit_mentions')) {
                        return '';
                }
@@ -795,18 +799,18 @@ class Post extends BaseObject
                        return '';
                }
 
-               if ($item['author-addr'] != $a->profile['addr']) {
+               if ($item['author-addr'] != $owner['addr']) {
                        $text = '@' . $item['author-addr'] . ' ';
                } else {
                        $text = '';
                }
 
-               $terms = Term::tagArrayFromItemId($this->getId(), TERM_MENTION);
+               $terms = Term::tagArrayFromItemId($this->getId(), [Term::MENTION, Term::IMPLICIT_MENTION]);
 
                foreach ($terms as $term) {
                        $profile = Contact::getDetailsByURL($term['url']);
-                       if (!empty($profile['addr']) && ($profile['contact-type'] != Contact::TYPE_COMMUNITY) &&
-                               ($profile['addr'] != $a->profile['addr']) && !strstr($text, $profile['addr'])) {
+                       if (!empty($profile['addr']) && !empty($profile['contact-type']) && ($profile['contact-type'] != Contact::TYPE_COMMUNITY) &&
+                               ($profile['addr'] != $owner['addr']) && !strstr($text, $profile['addr'])) {
                                $text .= '@' . $profile['addr'] . ' ';
                        }
                }
@@ -945,7 +949,7 @@ class Post extends BaseObject
                                                $owner = ['uid' => 0, 'id' => $this->getDataValue('owner-id'),
                                                        'network' => $this->getDataValue('owner-network'),
                                                        'url' => $this->getDataValue('owner-link')];
-                                               $this->owner_url = Contact::magicLinkbyContact($owner);
+                                               $this->owner_url = Contact::magicLinkByContact($owner);
                                        }
                                }
                        }
index f4befcd6f1f0f630d15df668cdfcbca986209458..fafc26b7332f29743fdce7ee44fc67207aa7380f 100644 (file)
@@ -65,7 +65,7 @@ class Processor
         * @param array   $implicit_mentions List of profile URLs to skip
         * @return string with tags
         */
-       private static function constructTagString($tags, $sensitive, array $implicit_mentions)
+       private static function constructTagString(array $tags, $sensitive)
        {
                if (empty($tags)) {
                        return '';
@@ -73,7 +73,7 @@ class Processor
 
                $tag_text = '';
                foreach ($tags as $tag) {
-                       if (in_array(defaults($tag, 'type', ''), ['Mention', 'Hashtag']) && !in_array($tag['href'], $implicit_mentions)) {
+                       if (in_array(defaults($tag, 'type', ''), ['Mention', 'Hashtag'])) {
                                if (!empty($tag_text)) {
                                        $tag_text .= ',';
                                }
@@ -129,7 +129,7 @@ class Processor
         */
        public static function updateItem($activity)
        {
-               $item = Item::selectFirst(['uri', 'parent-uri', 'gravity'], ['uri' => $activity['id']]);
+               $item = Item::selectFirst(['uri', 'thr-parent', 'gravity'], ['uri' => $activity['id']]);
                if (!DBA::isResult($item)) {
                        Logger::warning('Unknown item', ['uri' => $activity['id']]);
                        return;
@@ -144,20 +144,20 @@ class Processor
                $content = self::replaceEmojis($content, $activity['emojis']);
                $content = self::convertMentions($content);
 
-               $implicit_mentions = [];
-               if (($item['parent-uri'] != $item['uri']) && ($item['gravity'] == GRAVITY_COMMENT)) {
-                       $parent = Item::selectFirst(['id', 'author-link', 'alias'], ['uri' => $item['parent-uri']]);
+               if (($item['thr-parent'] != $item['uri']) && ($item['gravity'] == GRAVITY_COMMENT)) {
+                       $parent = Item::selectFirst(['id', 'author-link', 'alias'], ['uri' => $item['thr-parent']]);
                        if (!DBA::isResult($parent)) {
-                               Logger::warning('Unknown parent item.', ['uri' => $item['parent-uri']]);
+                               Logger::warning('Unknown parent item.', ['uri' => $item['thr-parent']]);
                                return;
                        }
 
-                       $implicit_mentions = self::getImplicitMentionList($parent);
-                       $content = self::removeImplicitMentionsFromBody($content, $implicit_mentions);
+                       $potential_implicit_mentions = self::getImplicitMentionList($parent);
+                       $content = self::removeImplicitMentionsFromBody($content, $potential_implicit_mentions);
+                       $activity['tags'] = self::convertImplicitMentionsInTags($activity['tags'], $potential_implicit_mentions);
                }
 
                $item['body'] = $content;
-               $item['tag'] = self::constructTagString($activity['tags'], $activity['sensitive'], $implicit_mentions);
+               $item['tag'] = self::constructTagString($activity['tags'], $activity['sensitive']);
 
                Item::update($item, ['uri' => $activity['id']]);
        }
@@ -173,7 +173,7 @@ class Processor
        {
                $item = [];
                $item['verb'] = ACTIVITY_POST;
-               $item['parent-uri'] = $activity['reply-to-id'];
+               $item['thr-parent'] = $activity['reply-to-id'];
 
                if ($activity['reply-to-id'] == $activity['id']) {
                        $item['gravity'] = GRAVITY_PARENT;
@@ -220,7 +220,7 @@ class Processor
        {
                $item = [];
                $item['verb'] = $verb;
-               $item['parent-uri'] = $activity['object_id'];
+               $item['thr-parent'] = $activity['object_id'];
                $item['gravity'] = GRAVITY_ACTIVITY;
                $item['object-type'] = ACTIVITY_OBJ_NOTE;
 
@@ -275,8 +275,8 @@ class Processor
        {
                /// @todo What to do with $activity['context']?
 
-               if (($item['gravity'] != GRAVITY_PARENT) && !Item::exists(['uri' => $item['parent-uri']])) {
-                       Logger::log('Parent ' . $item['parent-uri'] . ' not found, message will be discarded.', Logger::DEBUG);
+               if (($item['gravity'] != GRAVITY_PARENT) && !Item::exists(['uri' => $item['thr-parent']])) {
+                       Logger::info('Parent not found, message will be discarded.', ['thr-parent' => $item['thr-parent']]);
                        return;
                }
 
@@ -289,7 +289,7 @@ class Processor
                        $item['owner-link'] = $activity['actor'];
                        $item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, true);
                } else {
-                       Logger::log('Ignoring actor because of thread completion.', Logger::DEBUG);
+                       Logger::info('Ignoring actor because of thread completion.');
                        $item['owner-link'] = $item['author-link'];
                        $item['owner-id'] = $item['author-id'];
                }
@@ -299,21 +299,20 @@ class Processor
                $content = self::replaceEmojis($content, $activity['emojis']);
                $content = self::convertMentions($content);
 
-               $implicit_mentions = [];
-
-               if (($item['parent-uri'] != $item['uri']) && ($item['gravity'] == GRAVITY_COMMENT)) {
+               if (($item['thr-parent'] != $item['uri']) && ($item['gravity'] == GRAVITY_COMMENT)) {
                        $item_private = !in_array(0, $activity['item_receiver']);
-                       $parent = Item::selectFirst(['id', 'private', 'author-link', 'alias'], ['uri' => $item['parent-uri']]);
+                       $parent = Item::selectFirst(['id', 'private', 'author-link', 'alias'], ['uri' => $item['thr-parent']]);
                        if (!DBA::isResult($parent)) {
                                return;
                        }
                        if ($item_private && !$parent['private']) {
-                               Logger::log('Item ' . $item['uri'] . ' is private but the parent ' . $item['parent-uri'] . ' is not. So we drop it.');
+                               Logger::warning('Item is private but the parent is not. Dropping.', ['item-uri' => $item['uri'], 'thr-parent' => $item['thr-parent']]);
                                return;
                        }
 
-                       $implicit_mentions = self::getImplicitMentionList($parent);
-                       $content = self::removeImplicitMentionsFromBody($content, $implicit_mentions);
+                       $potential_implicit_mentions = self::getImplicitMentionList($parent);
+                       $content = self::removeImplicitMentionsFromBody($content, $potential_implicit_mentions);
+                       $activity['tags'] = self::convertImplicitMentionsInTags($activity['tags'], $potential_implicit_mentions);
                }
 
                $item['created'] = $activity['published'];
@@ -333,7 +332,7 @@ class Processor
                        $item['coord'] = $item['latitude'] . ' ' . $item['longitude'];
                }
 
-               $item['tag'] = self::constructTagString($activity['tags'], $activity['sensitive'], $implicit_mentions);
+               $item['tag'] = self::constructTagString($activity['tags'], $activity['sensitive']);
                $item['app'] = $activity['generator'];
                $item['plink'] = defaults($activity, 'alternate-url', $item['uri']);
 
@@ -358,7 +357,11 @@ class Processor
                        }
 
                        $item_id = Item::insert($item);
-                       Logger::log('Storing for user ' . $item['uid'] . ': ' . $item_id);
+                       if ($item_id) {
+                               Logger::info('Item insertion successful', ['user' => $item['uid'], 'item_id' => $item_id]);
+                       } else {
+                               Logger::notice('Item insertion aborted', ['user' => $item['uid']]);
+                       }
 
                        if ($item['uid'] == 0) {
                                $stored = $item_id;
@@ -658,13 +661,24 @@ class Processor
         */
        private static function getImplicitMentionList(array $parent)
        {
-               $parent_terms = Term::tagArrayFromItemId($parent['id'], [TERM_MENTION]);
+               if (Config::get('system', 'disable_implicit_mentions')) {
+                       return [];
+               }
 
-               $implicit_mentions = [
-                       $parent['author-link']
-               ];
+               $parent_terms = Term::tagArrayFromItemId($parent['id'], [Term::MENTION, Term::IMPLICIT_MENTION]);
+
+               $parent_author = Contact::getDetailsByURL($parent['author-link'], 0);
 
-               if ($parent['alias']) {
+               $implicit_mentions = [];
+               if (empty($parent_author)) {
+                       Logger::notice('Author public contact unknown.', ['author-link' => $parent['author-link'], 'item-id' => $parent['id']]);
+               } else {
+                       $implicit_mentions[] = $parent_author['url'];
+                       $implicit_mentions[] = $parent_author['nurl'];
+                       $implicit_mentions[] = $parent_author['alias'];
+               }
+
+               if (!empty($parent['alias'])) {
                        $implicit_mentions[] = $parent['alias'];
                }
 
@@ -684,12 +698,12 @@ class Processor
         * Strips from the body prepended implicit mentions
         *
         * @param string $body
-        * @param array  $implicit_mentions List of profile URLs
+        * @param array $potential_mentions
         * @return string
         */
-       private static function removeImplicitMentionsFromBody($body, array $implicit_mentions)
+       private static function removeImplicitMentionsFromBody($body, array $potential_mentions)
        {
-               if (Config::get('system', 'disable_mentions_removal')) {
+               if (Config::get('system', 'disable_implicit_mentions')) {
                        return $body;
                }
 
@@ -697,7 +711,7 @@ class Processor
 
                // Extract one prepended mention at a time from the body
                while(preg_match('#^(@\[url=([^\]]+)].*?\[\/url]\s)(.*)#mis', $body, $matches)) {
-                       if (!in_array($matches[2], $implicit_mentions) ) {
+                       if (!in_array($matches[2], $potential_mentions) ) {
                                $kept_mentions[] = $matches[1];
                        }
 
@@ -709,4 +723,50 @@ class Processor
 
                return implode('', $kept_mentions);
        }
+
+       private static function convertImplicitMentionsInTags($activity_tags, array $potential_mentions)
+       {
+               if (Config::get('system', 'disable_implicit_mentions')) {
+                       return $activity_tags;
+               }
+
+               foreach ($activity_tags as $index => $tag) {
+                       if (in_array($tag['href'], $potential_mentions)) {
+                               $activity_tags[$index]['name'] = preg_replace(
+                                       '/' . preg_quote(Term::TAG_CHARACTER[Term::MENTION], '/') . '/',
+                                       Term::TAG_CHARACTER[Term::IMPLICIT_MENTION],
+                                       $activity_tags[$index]['name'],
+                                       1
+                               );
+                       }
+               }
+
+               return $activity_tags;
+       }
+
+       public static function testImplicitMentions($item, $source)
+       {
+               $parent = Item::selectFirst(['id', 'guid', 'author-link', 'alias'], ['uri' => $item['thr-parent']]);
+
+               $implicit_mentions = self::getImplicitMentionList($parent);
+               var_dump($implicit_mentions);
+
+               $object = json_decode($source, true)['object'];
+               var_dump($object);
+
+               $content = HTML::toBBCode($object['content']);
+               $content = self::convertMentions($content);
+
+               $activity = [
+                       'tags' => $object['tag'],
+                       'content' => $content
+               ];
+
+               var_dump($activity);
+
+               $activity['content'] = Processor::removeImplicitMentionsFromBody($activity['content'], $implicit_mentions);
+               $activity['tags'] = Processor::convertImplicitMentionsInTags($activity['tags'], $implicit_mentions);
+
+               return $activity;
+       }
 }
index e0ee1f0f90e71ac6a200580dcddb1e0d13aefd66..5ee81302f2cf0d85a23a3601410635c646d2fa40 100644 (file)
@@ -62,16 +62,16 @@ class Receiver
        {
                $http_signer = HTTPSignature::getSigner($body, $header);
                if (empty($http_signer)) {
-                       Logger::log('Invalid HTTP signature, message will be discarded.', Logger::DEBUG);
+                       Logger::warning('Invalid HTTP signature, message will be discarded.');
                        return;
                } else {
-                       Logger::log('HTTP signature is signed by ' . $http_signer, Logger::DEBUG);
+                       Logger::info('Valid HTTP signature', ['signer' => $http_signer]);
                }
 
                $activity = json_decode($body, true);
 
                if (empty($activity)) {
-                       Logger::log('Invalid body.', Logger::DEBUG);
+                       Logger::warning('Invalid body.');
                        return;
                }
 
@@ -79,7 +79,7 @@ class Receiver
 
                $actor = JsonLD::fetchElement($ldactivity, 'as:actor');
 
-               Logger::log('Message for user ' . $uid . ' is from actor ' . $actor, Logger::DEBUG);
+               Logger::info('Message for user ' . $uid . ' is from actor ' . $actor);
 
                if (LDSignature::isSigned($activity)) {
                        $ld_signer = LDSignature::getSigner($activity);
index ebd32786a82e603a86e0db4f2ad1780980417e72..7d33fb2dc54713cdafdcd7a1bbe6713a811764e6 100644 (file)
@@ -343,7 +343,7 @@ class Transmitter
                        $actor_profile = APContact::getByURL($item['author-link']);
                }
 
-               $terms = Term::tagArrayFromItemId($item['id'], TERM_MENTION);
+               $terms = Term::tagArrayFromItemId($item['id'], [Term::MENTION, Term::IMPLICIT_MENTION]);
 
                if (!$item['private']) {
                        $data = array_merge($data, self::fetchPermissionBlockFromConversation($item));
@@ -807,12 +807,12 @@ class Transmitter
        {
                $tags = [];
 
-               $terms = Term::tagArrayFromItemId($item['id']);
+               $terms = Term::tagArrayFromItemId($item['id'], [Term::HASHTAG, Term::MENTION, Term::IMPLICIT_MENTION]);
                foreach ($terms as $term) {
-                       if ($term['type'] == TERM_HASHTAG) {
+                       if ($term['type'] == Term::HASHTAG) {
                                $url = System::baseUrl() . '/search?tag=' . urlencode($term['term']);
                                $tags[] = ['type' => 'Hashtag', 'href' => $url, 'name' => '#' . $term['term']];
-                       } elseif ($term['type'] == TERM_MENTION) {
+                       } elseif ($term['type'] == Term::MENTION || $term['type'] == Term::IMPLICIT_MENTION) {
                                $contact = Contact::getDetailsByURL($term['url']);
                                if (!empty($contact['addr'])) {
                                        $mention = '@' . $contact['addr'];
@@ -1439,6 +1439,10 @@ class Transmitter
 
        private static function prependMentions($body, array $permission_block)
        {
+               if (Config::get('system', 'disable_implicit_mentions')) {
+                       return $body;
+               }
+
                $mentions = [];
 
                foreach ($permission_block['to'] as $profile_url) {
index e6524de965e418f2cf9315cd9bb9abfffd2cc414..efd3c4aa606a0320ba5da97f8682379801d0e639 100644 (file)
@@ -119,7 +119,9 @@ class DFRN
                        $item["entry:cid"] = defaults($item, "entry:cid", 0);
 
                        $entry = self::entry($doc, "text", $item, $owner, $item["entry:comment-allow"], $item["entry:cid"]);
-                       $root->appendChild($entry);
+                       if (isset($entry)) {
+                               $root->appendChild($entry);
+                       }
                }
 
                return trim($doc->saveXML());
@@ -323,7 +325,9 @@ class DFRN
                        }
 
                        $entry = self::entry($doc, $type, $item, $owner, true);
-                       $root->appendChild($entry);
+                       if (isset($entry)) {
+                               $root->appendChild($entry);
+                       }
                }
 
                $atom = trim($doc->saveXML());
@@ -390,7 +394,9 @@ class DFRN
 
                        foreach ($items as $item) {
                                $entry = self::entry($doc, $type, $item, $owner, true, 0);
-                               $root->appendChild($entry);
+                               if (isset($entry)) {
+                                       $root->appendChild($entry);
+                               }
                        }
                } else {
                        $root = self::entry($doc, $type, $item, $owner, true, 0, true);
@@ -763,31 +769,33 @@ class DFRN
         */
        private static function addEntryAuthor(DOMDocument $doc, $element, $contact_url, $item)
        {
-               $contact = Contact::getDetailsByURL($contact_url, $item["uid"]);
-
                $author = $doc->createElement($element);
-               XML::addElement($doc, $author, "name", $contact["name"]);
-               XML::addElement($doc, $author, "uri", $contact["url"]);
-               XML::addElement($doc, $author, "dfrn:handle", $contact["addr"]);
 
-               /// @Todo
-               /// - Check real image type and image size
-               /// - Check which of these boths elements we should use
-               $attributes = [
+               $contact = Contact::getDetailsByURL($contact_url, $item["uid"]);
+               if (!empty($contact)) {
+                       XML::addElement($doc, $author, "name", $contact["name"]);
+                       XML::addElement($doc, $author, "uri", $contact["url"]);
+                       XML::addElement($doc, $author, "dfrn:handle", $contact["addr"]);
+
+                       /// @Todo
+                       /// - Check real image type and image size
+                       /// - Check which of these boths elements we should use
+                       $attributes = [
                                "rel" => "photo",
                                "type" => "image/jpeg",
                                "media:width" => 80,
                                "media:height" => 80,
                                "href" => $contact["photo"]];
-               XML::addElement($doc, $author, "link", "", $attributes);
+                       XML::addElement($doc, $author, "link", "", $attributes);
 
-               $attributes = [
+                       $attributes = [
                                "rel" => "avatar",
                                "type" => "image/jpeg",
                                "media:width" => 80,
                                "media:height" => 80,
                                "href" => $contact["photo"]];
-               XML::addElement($doc, $author, "link", "", $attributes);
+                       XML::addElement($doc, $author, "link", "", $attributes);
+               }
 
                return $author;
        }
@@ -906,7 +914,7 @@ class DFRN
         * @param int         $cid     Contact ID of the recipient
         * @param bool        $single  If set, the entry is created as an XML document with a single "entry" element
         *
-        * @return \DOMElement XML entry object
+        * @return null|\DOMElement XML entry object
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         * @todo  Find proper type-hints
@@ -916,7 +924,8 @@ class DFRN
                $mentioned = [];
 
                if (!$item['parent']) {
-                       return;
+                       Logger::notice('Item without parent found.', ['type' => $type, 'item' => $item]);
+                       return null;
                }
 
                if ($item['deleted']) {
@@ -1546,7 +1555,7 @@ class DFRN
                        $author["network"] = $contact_old["network"];
                } else {
                        if (!$onlyfetch) {
-                               Logger::log("Contact ".$author["link"]." wasn't found for user ".$importer["importer_uid"]." XML: ".$xml, Logger::DEBUG);
+                               Logger::debug("Contact ".$author["link"]." wasn't found for user ".$importer["importer_uid"]." XML: ".$xml);
                        }
 
                        $author["contact-unknown"] = true;
@@ -1596,6 +1605,7 @@ class DFRN
 
                if (empty($author['avatar'])) {
                        Logger::log('Empty author: ' . $xml);
+                       $author['avatar'] = '';
                }
 
                if (DBA::isResult($contact_old) && !$onlyfetch) {
index 77ad0170442359a5cac8a6bf3dc27898f194d7e7..ca66aa0a67d73e820999fe21f5809952f2043304 100644 (file)
@@ -942,7 +942,7 @@ class Diaspora
 
                $person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]);
                if (DBA::isResult($person)) {
-                       Logger::log("In cache " . print_r($person, true), Logger::DEBUG);
+                       Logger::debug("In cache " . print_r($person, true));
 
                        // update record occasionally so it doesn't get stale
                        $d = strtotime($person["updated"]." +00:00");
@@ -3675,7 +3675,7 @@ class Diaspora
                        && !strstr($body, $profile['addr'])
                        && !strstr($body, $profile_url)
                ) {
-                       $body = '@[url=' . $profile_url . ']' . $profile['nick'] . '[/url] ' . $body;
+                       $body = '@[url=' . $profile_url . ']' . $profile['name'] . '[/url] ' . $body;
                }
 
                return $body;
@@ -3776,7 +3776,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 a comment
+        * @return array|false The data for a comment
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function constructComment(array $item, array $owner)
@@ -3788,30 +3788,40 @@ class Diaspora
                        return $result;
                }
 
-               $parent = Item::selectFirst(['guid', 'author-link'], ['id' => $item["parent"], 'parent' => $item["parent"]]);
-               if (!DBA::isResult($parent)) {
+               $toplevel_item = Item::selectFirst(['guid', 'author-link'], ['id' => $item["parent"], 'parent' => $item["parent"]]);
+               if (!DBA::isResult($toplevel_item)) {
+                       Logger::error('Missing parent conversation item', ['parent' => $item["parent"]]);
                        return false;
                }
 
+               $thread_parent_item = $toplevel_item;
+               if ($item['thr-parent'] != $item['parent-uri']) {
+                       $thread_parent_item = Item::selectFirst(['guid', 'author-link'], ['uri' => $item['thr-parent'], 'uid' => $item['uid']]);
+               }
+
                $body = $item["body"];
 
-               if (empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions')) {
-                       $body = self::prependParentAuthorMention($body, $parent['author-link']);
+               if ((empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions'))
+                       && !Config::get('system', 'disable_implicit_mentions')
+               ) {
+                       $body = self::prependParentAuthorMention($body, $thread_parent_item['author-link']);
                }
 
                $text = html_entity_decode(BBCode::toMarkdown($body));
                $created = DateTimeFormat::utc($item["created"], DateTimeFormat::ATOM);
 
-               $comment = ["author" => self::myHandle($owner),
-                               "guid" => $item["guid"],
-                               "created_at" => $created,
-                               "parent_guid" => $parent["guid"],
-                               "text" => $text,
-                               "author_signature" => ""];
+               $comment = [
+                       "author"      => self::myHandle($owner),
+                       "guid"        => $item["guid"],
+                       "created_at"  => $created,
+                       "parent_guid" => $toplevel_item["guid"],
+                       "text"        => $text,
+                       "author_signature" => ""
+               ];
 
                // Send the thread parent guid only if it is a threaded comment
                if ($item['thr-parent'] != $item['parent-uri']) {
-                       $comment['thread_parent_guid'] = self::getGuidFromUri($item['thr-parent'], $item['uid']);
+                       $comment['thread_parent_guid'] = $thread_parent_item['guid'];
                }
 
                Cache::set($cachekey, $comment, Cache::QUARTER_HOUR);
index 38105e452a929dbdf589675964837c4b7e4c39cb..dec5c4c80b021a572da0d951304a7234dcbab6bc 100644 (file)
@@ -1763,19 +1763,16 @@ class OStatus
                $verb = NAMESPACE_ACTIVITY_SCHEMA."favorite";
                self::entryContent($doc, $entry, $item, $owner, "Favorite", $verb, false);
 
-               $as_object = $doc->createElement("activity:object");
-
                $parent = Item::selectFirst([], ['uri' => $item["thr-parent"], 'uid' => $item["uid"]]);
+               if (DBA::isResult($parent)) {
+                       $as_object = $doc->createElement("activity:object");
 
-               if (!$parent) {
-                       $parent = [];
-               }
-
-               XML::addElement($doc, $as_object, "activity:object-type", self::constructObjecttype($parent));
+                       XML::addElement($doc, $as_object, "activity:object-type", self::constructObjecttype($parent));
 
-               self::entryContent($doc, $as_object, $parent, $owner, "New entry");
+                       self::entryContent($doc, $as_object, $parent, $owner, "New entry");
 
-               $entry->appendChild($as_object);
+                       $entry->appendChild($as_object);
+               }
 
                self::entryFooter($doc, $entry, $item, $owner);
 
index 7900ff540bfda7672d76416a6acba139c6b8d676..b9c1533e6601365a53af1045fa66355895d998cd 100644 (file)
@@ -505,8 +505,15 @@ class PortableContact
                $last_updated = "";
 
                foreach ($entries as $entry) {
-                       $published = DateTimeFormat::utc($xpath->query('atom:published/text()', $entry)->item(0)->nodeValue);
-                       $updated   = DateTimeFormat::utc($xpath->query('atom:updated/text()'  , $entry)->item(0)->nodeValue);
+                       $published_item = $xpath->query('atom:published/text()', $entry)->item(0);
+                       $updated_item   = $xpath->query('atom:updated/text()'  , $entry)->item(0);
+                       $published      = isset($published_item->nodeValue) ? DateTimeFormat::utc($published_item->nodeValue) : null;
+                       $updated        = isset($updated_item->nodeValue) ? DateTimeFormat::utc($updated_item->nodeValue) : null;
+
+                       if (!isset($published) || !isset($updated)) {
+                               Logger::notice('Invalid entry for XPath.', ['entry' => $entry, 'profile' => $profile]);
+                               continue;
+                       }
 
                        if ($last_updated < $published) {
                                $last_updated = $published;
index ec68375d65dca8dc5e3c027af387c95772dca69a..9b0012fe381ac31ffc2e878eb4416c39c94dcaa0 100644 (file)
@@ -35,7 +35,7 @@ class JsonLD
                }
 
                if ($recursion > 5) {
-                       Logger::log('jsonld bomb detected at: ' . $url);
+                       Logger::error('jsonld bomb detected at: ' . $url);
                        exit();
                }
 
@@ -68,7 +68,9 @@ class JsonLD
                }
                catch (Exception $e) {
                        $normalized = false;
-                       Logger::log('normalise error:' . substr(print_r($e, true), 0, 10000), Logger::DEBUG);
+                       Logger::error('normalise error');
+                       // Sooner or later we should log some details as well - but currently this leads to memory issues
+                       // Logger::log('normalise error:' . substr(print_r($e, true), 0, 10000), Logger::DEBUG);
                }
 
                return $normalized;
@@ -115,7 +117,9 @@ class JsonLD
                }
                catch (Exception $e) {
                        $compacted = false;
-                       Logger::log('compacting error:' . substr(print_r($e, true), 0, 10000), Logger::DEBUG);
+                       Logger::error('compacting error');
+                       // Sooner or later we should log some details as well - but currently this leads to memory issues
+                       // Logger::log('compacting error:' . substr(print_r($e, true), 0, 10000), Logger::DEBUG);
                }
 
                $json = json_decode(json_encode($compacted, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE), true);
diff --git a/src/Util/Logger/WorkerLogger.php b/src/Util/Logger/WorkerLogger.php
new file mode 100644 (file)
index 0000000..be7f82a
--- /dev/null
@@ -0,0 +1,199 @@
+<?php
+
+namespace Friendica\Util\Logger;
+
+use Friendica\Util\Strings;
+use Psr\Log\LoggerInterface;
+
+/**
+ * A Logger for specific worker tasks, which adds an additional woker-id to it.
+ * Uses the decorator pattern (https://en.wikipedia.org/wiki/Decorator_pattern)
+ */
+class WorkerLogger implements LoggerInterface
+{
+       /**
+        * @var LoggerInterface The original Logger instance
+        */
+       private $logger;
+
+       /**
+        * @var string the current worker ID
+        */
+       private $workerId;
+
+       /**
+        * @var string The called function name
+        */
+       private $functionName;
+
+       /**
+        * @param LoggerInterface $logger The logger for worker entries
+        * @param string $functionName The current function name of the worker
+        * @param int $idLength The length of the generated worker ID
+        */
+       public function __construct(LoggerInterface $logger, $functionName, $idLength = 7)
+       {
+               $this->logger = $logger;
+               $this->functionName = $functionName;
+               $this->workerId = Strings::getRandomHex($idLength);
+       }
+
+       /**
+        * Adds the worker context for each log entry
+        *
+        * @param array $context
+        */
+       private function addContext(array &$context)
+       {
+               $context['worker_id'] = $this->workerId;
+               $context['worker_cmd'] = $this->functionName;
+       }
+
+       /**
+        * Returns the worker ID
+        *
+        * @return string
+        */
+       public function getWorkerId()
+       {
+               return $this->workerId;
+       }
+
+       /**
+        * System is unusable.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function emergency($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->emergency($message, $context);
+       }
+
+       /**
+        * Action must be taken immediately.
+        *
+        * Example: Entire website down, database unavailable, etc. This should
+        * trigger the SMS alerts and wake you up.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function alert($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->alert($message, $context);
+       }
+
+       /**
+        * Critical conditions.
+        *
+        * Example: Application component unavailable, unexpected exception.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function critical($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->critical($message, $context);
+       }
+
+       /**
+        * Runtime errors that do not require immediate action but should typically
+        * be logged and monitored.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function error($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->error($message, $context);
+       }
+
+       /**
+        * Exceptional occurrences that are not errors.
+        *
+        * Example: Use of deprecated APIs, poor use of an API, undesirable things
+        * that are not necessarily wrong.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function warning($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->warning($message, $context);
+       }
+
+       /**
+        * Normal but significant events.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function notice($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->notice($message, $context);
+       }
+
+       /**
+        * Interesting events.
+        *
+        * Example: User logs in, SQL logs.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function info($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->info($message, $context);
+       }
+
+       /**
+        * Detailed debug information.
+        *
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function debug($message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->debug($message, $context);
+       }
+
+       /**
+        * Logs with an arbitrary level.
+        *
+        * @param mixed $level
+        * @param string $message
+        * @param array $context
+        *
+        * @return void
+        */
+       public function log($level, $message, array $context = [])
+       {
+               $this->addContext($context);
+               $this->logger->log($level, $message, $context);
+       }
+}
index 2d3da3a9c0b99f762a29f9b9bb9e7288a87ab337..fe72efce40beec2e623598e3c6efd35c050d3f54 100644 (file)
@@ -32,6 +32,28 @@ class Profiler implements ContainerInterface
         */
        private $rendertime;
 
+       /**
+        * True, if the Profiler should measure the whole rendertime including functions
+        *
+        * @return bool
+        */
+       public function isRendertime()
+       {
+               return $this->rendertime;
+       }
+
+       /**
+        * Updates the enabling of the current profiler
+        *
+        * @param bool $enabled
+        * @param bool $renderTime
+        */
+       public function update($enabled = false, $renderTime = false)
+       {
+               $this->enabled = $enabled;
+               $this->rendertime = $renderTime;
+       }
+
        /**
         * @param bool $enabled           True, if the Profiler is enabled
         * @param bool $renderTime        True, if the Profiler should measure the whole rendertime including functions
@@ -120,86 +142,97 @@ class Profiler implements ContainerInterface
        }
 
        /**
-        * Save the current profiling data to a log entry
+        * Returns the rendertime string
         *
-        * @param LoggerInterface $logger The logger to save the current log
-        * @param string          $message Additional message for the log
+        * @return string the rendertime
         */
-       public function saveLog(LoggerInterface $logger, $message = '')
+       public function getRendertimeString()
        {
-               // Write down the performance values into the log
-               if (!$this->enabled) {
-                       return;
-               }
-               $duration = microtime(true) - $this->get('start');
-               $logger->info(
-                       $message,
-                       [
-                               'action' => 'profiling',
-                               'database_read' => round($this->get('database') - $this->get('database_write'), 3),
-                               'database_write' => round($this->get('database_write'), 3),
-                               'cache_read' => round($this->get('cache'), 3),
-                               'cache_write' => round($this->get('cache_write'), 3),
-                               'network_io' => round($this->get('network'), 2),
-                               'file_io' => round($this->get('file'), 2),
-                               'other_io' => round($duration - ($this->get('database')
-                                               + $this->get('cache') + $this->get('cache_write')
-                                               + $this->get('network') + $this->get('file')), 2),
-                               'total' => round($duration, 2)
-                       ]
-               );
+               $output = '';
 
-               if (!$this->rendertime) {
-                       return;
+               if (!$this->enabled || !$this->rendertime) {
+                       return $output;
                }
-               
-               $o = '';
+
                if (isset($this->callstack["database"])) {
-                       $o .= "\nDatabase Read:\n";
+                       $output .= "\nDatabase Read:\n";
                        foreach ($this->callstack["database"] as $func => $time) {
                                $time = round($time, 3);
                                if ($time > 0) {
-                                       $o .= $func . ": " . $time . "\n";
+                                       $output .= $func . ": " . $time . "\n";
                                }
                        }
                }
                if (isset($this->callstack["database_write"])) {
-                       $o .= "\nDatabase Write:\n";
+                       $output .= "\nDatabase Write:\n";
                        foreach ($this->callstack["database_write"] as $func => $time) {
                                $time = round($time, 3);
                                if ($time > 0) {
-                                       $o .= $func . ": " . $time . "\n";
+                                       $output .= $func . ": " . $time . "\n";
                                }
                        }
                }
                if (isset($this->callstack["cache"])) {
-                       $o .= "\nCache Read:\n";
+                       $output .= "\nCache Read:\n";
                        foreach ($this->callstack["cache"] as $func => $time) {
                                $time = round($time, 3);
                                if ($time > 0) {
-                                       $o .= $func . ": " . $time . "\n";
+                                       $output .= $func . ": " . $time . "\n";
                                }
                        }
                }
                if (isset($this->callstack["cache_write"])) {
-                       $o .= "\nCache Write:\n";
+                       $output .= "\nCache Write:\n";
                        foreach ($this->callstack["cache_write"] as $func => $time) {
                                $time = round($time, 3);
                                if ($time > 0) {
-                                       $o .= $func . ": " . $time . "\n";
+                                       $output .= $func . ": " . $time . "\n";
                                }
                        }
                }
                if (isset($this->callstack["network"])) {
-                       $o .= "\nNetwork:\n";
+                       $output .= "\nNetwork:\n";
                        foreach ($this->callstack["network"] as $func => $time) {
                                $time = round($time, 3);
                                if ($time > 0) {
-                                       $o .= $func . ": " . $time . "\n";
+                                       $output .= $func . ": " . $time . "\n";
                                }
                        }
                }
-               $logger->info($message . ": " . $o, ['action' => 'profiling']);
+
+               return $output;
+       }
+
+       /**
+        * Save the current profiling data to a log entry
+        *
+        * @param LoggerInterface $logger  The logger to save the current log
+        * @param string          $message Additional message for the log
+        */
+       public function saveLog(LoggerInterface $logger, $message = '')
+       {
+               $duration = microtime(true) - $this->get('start');
+               $logger->info(
+                       $message,
+                       [
+                               'action' => 'profiling',
+                               'database_read' => round($this->get('database') - $this->get('database_write'), 3),
+                               'database_write' => round($this->get('database_write'), 3),
+                               'cache_read' => round($this->get('cache'), 3),
+                               'cache_write' => round($this->get('cache_write'), 3),
+                               'network_io' => round($this->get('network'), 2),
+                               'file_io' => round($this->get('file'), 2),
+                               'other_io' => round($duration - ($this->get('database')
+                                               + $this->get('cache') + $this->get('cache_write')
+                                               + $this->get('network') + $this->get('file')), 2),
+                               'total' => round($duration, 2)
+                       ]
+               );
+
+               if ($this->isRendertime()) {
+                       $output = $this->getRendertimeString();
+                       $logger->info($message . ": " . $output, ['action' => 'profiling']);
+               }
        }
 
        /**
index 0c63749c8593603b85c7f0a5b25fd3e5a80cbfbe..55751d8d8274a901fca6a76b75171a89e886a1e7 100644 (file)
@@ -331,4 +331,19 @@ class Strings
 
                return $uri;
        }
+
+
+       /**
+        * Check if the trimmed provided string is starting with one of the provided characters
+        *
+        * @param string $string
+        * @param array  $chars
+        * @return bool
+        */
+       public static function startsWith($string, array $chars)
+       {
+               $return = in_array(substr(trim($string), 0, 1), $chars);
+
+               return $return;
+       }
 }
index ba146ec7b8172298180ca36ae82acd52f2d041f3..4dd6d84ecbefea7d50a2c24e21a8b934402ddbbd 100644 (file)
@@ -6,6 +6,7 @@ namespace Friendica\Util;
 
 use Friendica\Core\Logger;
 use DOMXPath;
+use Friendica\Core\System;
 use SimpleXMLElement;
 
 /**
@@ -422,10 +423,11 @@ class XML
 
                $x = @simplexml_load_string($s);
                if (!$x) {
-                       Logger::log('libxml: parse: error: ' . $s, Logger::DATA);
+                       Logger::error('Error(s) while parsing XML string.', ['callstack' => System::callstack()]);
                        foreach (libxml_get_errors() as $err) {
-                               Logger::log('libxml: parse: ' . $err->code." at ".$err->line.":".$err->column." : ".$err->message, Logger::DATA);
+                               Logger::info('libxml error', ['code' => $err->code, 'position' => $err->line . ":" . $err->column, 'message' => $err->message]);
                        }
+                       Logger::debug('Erroring XML string', ['xml' => $s]);
                        libxml_clear_errors();
                }
                return $x;
index dde61e856b8d6392f525df1c4461559d1278ea00..3ff4c6fe14f529aa00066dc466092ea883e42fe8 100644 (file)
@@ -40,13 +40,14 @@ abstract class DatabaseTest extends MockedTest
                        $this->markTestSkipped('Please set the MYSQL_* environment variables to your test database credentials.');
                }
 
-               $basedir = BasePath::create(dirname(__DIR__));
-               $configLoader = new Cache\ConfigCacheLoader($basedir);
+               $basePath = BasePath::create(dirname(__DIR__));
+               $configLoader = new Cache\ConfigCacheLoader($basePath);
                $config = Factory\ConfigFactory::createCache($configLoader);
 
                $profiler = \Mockery::mock(Profiler::class);
 
                DBA::connect(
+                       $basePath,
                        $config,
                        $profiler,
                        getenv('MYSQL_HOST'),
index 296e3539496f225f1397686ed91212ced47ec449..ab5bc6059edec3765c9fa132610ec7f692f6c0fc 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Database\DBA;
 use Mockery\MockInterface;
 
 class DBAStub
@@ -22,7 +23,7 @@ trait DBAMockTrait
        private function checkMock()
        {
                if (!isset($this->dbaMock)) {
-                       $this->dbaMock = \Mockery::namedMock('Friendica\Database\DBA', 'Friendica\Test\Util\DBAStub');
+                       $this->dbaMock = \Mockery::namedMock(DBA::class, DBAStub::class);
                }
        }
 
index 92ec412cb7ed4bec698c49c768248b2efe9d67a1..224e5d07af27482eedb0915c891dfbb72cfababc 100644 (file)
@@ -26,7 +26,7 @@ trait DBStructureMockTrait
        public function mockUpdate($args = [], $return = true, $times = null)
        {
                if (!isset($this->dbStructure)) {
-                       $this->dbStructure = \Mockery::mock('alias:Friendica\Database\DBStructure');
+                       $this->dbStructure = \Mockery::mock('alias:' . DBStructure::class);
                }
 
                $this->dbStructure
@@ -46,7 +46,7 @@ trait DBStructureMockTrait
        public function mockExistsTable($tableName, $return = true, $times = null)
        {
                if (!isset($this->dbStructure)) {
-                       $this->dbStructure = \Mockery::mock('alias:Friendica\Database\DBStructure');
+                       $this->dbStructure = \Mockery::mock('alias:' . DBStructure::class);
                }
 
                $this->dbStructure
index 1f1ad0199a52caf6b2271133448644697f6dc37c..0230e16a432019613996eb4962083bc3e5d0f12a 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Util\DateTimeFormat;
 use Mockery\MockInterface;
 
 trait DateTimeFormatMockTrait
@@ -14,7 +15,7 @@ trait DateTimeFormatMockTrait
        public function mockUtcNow($time, $times = null)
        {
                if (!isset($this->dtfMock)) {
-                       $this->dtfMock = \Mockery::mock('alias:Friendica\Util\DateTimeFormat');
+                       $this->dtfMock = \Mockery::mock('alias:'. DateTimeFormat::class);
                }
 
                $this->dtfMock
@@ -26,7 +27,7 @@ trait DateTimeFormatMockTrait
        public function mockUtc($input, $time, $times = null)
        {
                if (!isset($this->dtfMock)) {
-                       $this->dtfMock = \Mockery::mock('alias:Friendica\Util\DateTimeFormat');
+                       $this->dtfMock = \Mockery::mock('alias:' . DateTimeFormat::class);
                }
 
                $this->dtfMock
index f1c771c6b3f6d36b8256a32f0009a8998bcde10c..e47a35edccd62ea89286384128373c59832bccae 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Core\L10n;
 use Mockery\MockInterface;
 
 trait L10nMockTrait
@@ -21,7 +22,7 @@ trait L10nMockTrait
        public function mockL10nT($input = null, $times = null, $return = null)
        {
                if (!isset($this->l10nMock)) {
-                       $this->l10nMock = \Mockery::mock('alias:Friendica\Core\L10n');
+                       $this->l10nMock = \Mockery::mock('alias:' . L10n::class);
                }
 
                $with = isset($input) ? $input : \Mockery::any();
index bea0fe16fc24db01e00e969b2455982fe3b03003..f4e05f39b8a1e7597f510aad06fbaf57cd0745a3 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\Util;
 
+use Friendica\Core\Renderer;
 use Mockery\MockInterface;
 
 trait RendererMockTrait
@@ -21,7 +22,7 @@ trait RendererMockTrait
        public function mockGetMarkupTemplate($templateName, $return = '', $times = null)
        {
                if (!isset($this->rendererMock)) {
-                       $this->rendererMock = \Mockery::mock('alias:Friendica\Core\Renderer');
+                       $this->rendererMock = \Mockery::mock('alias:' . Renderer::class);
                }
 
                $this->rendererMock
@@ -42,7 +43,7 @@ trait RendererMockTrait
        public function mockReplaceMacros($template, $args = [], $return = '', $times = null)
        {
                if (!isset($this->rendererMock)) {
-                       $this->rendererMock = \Mockery::mock('alias:Friendica\Core\Renderer');
+                       $this->rendererMock = \Mockery::mock('alias:' . Renderer::class);
                }
 
                $this->rendererMock
index 289b3fcea54f278db4f5b099817d7dd7109b0f0f..2f8becc18cb8195b8beaf10808014e46b0c636d0 100644 (file)
@@ -36,15 +36,15 @@ class ApiTest extends DatabaseTest
         */
        public function setUp()
        {
-               $basedir = BasePath::create(dirname(__DIR__) . '/../');
-               $configLoader = new Cache\ConfigCacheLoader($basedir);
+               $basePath = BasePath::create(dirname(__DIR__) . '/../');
+               $configLoader = new Cache\ConfigCacheLoader($basePath);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create('test', $config);
-               $this->app = new App($config, $logger, $profiler, false);
+               $this->app = new App($basePath, $config, $logger, $profiler, false);
 
                parent::setUp();
 
index 3341503915f4738e68cad7d74e6cfaab641e72e6..749ae77c2a2554416600e24a485c3c7b73ef50ec 100644 (file)
@@ -3,7 +3,7 @@
  * BaseObjectTest class.
  */
 
-namespace Friendica\Test;
+namespace Friendica\Test\src;
 
 use Friendica\BaseObject;
 use Friendica\Test\Util\AppMockTrait;
index f91f267c71b9b52f5f1058bd0aec0312c8917c75..d473aec00c14e00f1640b7c684d0dca78e5ba6cf 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-namespace Friendica\Test\Core\Config\Cache;
+namespace Friendica\Test\src\Core\Config\Cache;
 
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Core\Config\Cache\ConfigCacheLoader;
@@ -19,19 +19,6 @@ class ConfigCacheLoaderTest extends MockedTest
                $this->setUpVfsDir();
        }
 
-       /**
-        * Test the loadConfigFiles() method with default values
-        */
-       public function testLoadConfigFiles()
-       {
-               $configCacheLoader = new ConfigCacheLoader($this->root->url());
-               $configCache = new ConfigCache();
-
-               $configCacheLoader->loadConfigFiles($configCache);
-
-               $this->assertEquals($this->root->url(), $configCache->get('system', 'basepath'));
-       }
-
        /**
         * Test the loadConfigFiles() method with a wrong local.config.php
         * @expectedException \Exception
index ac9fae540b8c45ab89eb0c977d28408b21955f6b..1ee2a3f80270aa78c673936f74d9bc20fe6db418 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-namespace Friendica\Test\Core\Config\Cache;
+namespace Friendica\Test\src\Core\Config\Cache;
 
 use Friendica\Core\Config\Cache\ConfigCache;
 use Friendica\Test\MockedTest;
@@ -138,22 +138,7 @@ class ConfigCacheTest extends MockedTest
        {
                $configCache = new ConfigCache();
 
-               $this->assertEquals('!<unset>!', $configCache->get('something', 'value'));
-       }
-
-       /**
-        * Test the has() method
-        */
-       public function testHas()
-       {
-               $configCache = new ConfigCache();
-
-               $this->assertFalse($configCache->has('system', 'test'));
-               $this->assertFalse($configCache->has('system'));
-
-               $configCache->set('system', 'test', 'it');
-               $this->assertTrue($configCache->has('system', 'test'));
-               $this->assertTrue($configCache->has('system'));
+               $this->assertNull($configCache->get('something', 'value'));
        }
 
        /**
@@ -171,8 +156,6 @@ class ConfigCacheTest extends MockedTest
                        ],
                ]);
 
-               $this->assertTrue($configCache->has('system'));
-
                $this->assertEquals([
                        'key1' => 'value1',
                        'key2' => 'value2',
@@ -233,8 +216,6 @@ class ConfigCacheTest extends MockedTest
                        ],
                ]);
 
-               $this->assertTrue($configCache->hasP($uid,'system'));
-
                $this->assertEquals([
                        'key1' => 'value1',
                        'key2' => 'value2',
@@ -264,20 +245,4 @@ class ConfigCacheTest extends MockedTest
 
                $this->assertEmpty($configCache->getAll());
        }
-
-       /**
-        * Test the hasP() method
-        */
-       public function testHasP()
-       {
-               $configCache = new ConfigCache();
-               $uid = 345;
-
-               $this->assertFalse($configCache->hasP($uid, 'system', 'test'));
-               $this->assertFalse($configCache->hasP($uid, 'system'));
-
-               $configCache->setP($uid, 'system', 'test', 'it');
-               $this->assertTrue($configCache->hasP($uid, 'system', 'test'));
-               $this->assertTrue($configCache->hasP($uid, 'system'));
-       }
 }
index 2e4fcd4f58db9d90a8bcb0671eb24cb9a1469e9d..b07f9e6302bd0fa1f5ff8c19a5fb3f86a0de8bcd 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-namespace Friendica\Test\Core\Config;
+namespace Friendica\Test\src\Core\Config;
 
 use Friendica\Core\Config\Adapter\IConfigAdapter;
 use Friendica\Core\Config\Cache\ConfigCache;
@@ -142,7 +142,7 @@ class ConfigurationTest extends MockedTest
                $this->assertNull($configuration->get('test', 'it'));
 
                /// beware that the cache returns '!<unset>!' and not null for a non existing value
-               $this->assertEquals('!<unset>!', $configuration->getCache()->get('test', 'it'));
+               $this->assertNull($configuration->getCache()->get('test', 'it'));
 
                // with default value
                $this->assertEquals('default', $configuration->get('test', 'it', 'default'));
@@ -165,7 +165,7 @@ class ConfigurationTest extends MockedTest
                $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->twice();
                $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn($data)->once();
                $configAdapter->shouldReceive('isLoaded')->with('test', 'not')->andReturn(false)->once();
-               $configAdapter->shouldReceive('get')->with('test', 'not')->andReturn('!<unset>!')->once();
+               $configAdapter->shouldReceive('get')->with('test', 'not')->andReturn(null)->once();
 
                $configuration = new Configuration($configCache, $configAdapter);
 
@@ -179,7 +179,7 @@ class ConfigurationTest extends MockedTest
 
                // without refresh and wrong value and default
                $this->assertEquals('default', $configuration->get('test', 'not', 'default'));
-               $this->assertEquals('!<unset>!', $configuration->getCache()->get('test', 'not'));
+               $this->assertNull($configuration->getCache()->get('test', 'not'));
        }
 
        /**
@@ -195,7 +195,7 @@ class ConfigurationTest extends MockedTest
                $configAdapter->shouldReceive('load')->andReturn([])->once();
 
                $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(false)->once();
-               $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn('!<unset>!')->once();
+               $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn(null)->once();
 
                $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(false)->once();
                $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn($data)->once();
@@ -234,7 +234,7 @@ class ConfigurationTest extends MockedTest
 
                $this->assertTrue($configuration->delete('test', 'it'));
                $this->assertNull($configuration->get('test', 'it'));
-               $this->assertEquals('!<unset>!', $configuration->getCache()->get('test', 'it'));
+               $this->assertNull($configuration->getCache()->get('test', 'it'));
 
                $this->assertEmpty($configuration->getCache()->getAll());
        }
index 0259944147a1c7670b15ab18cc3468fc1041eaca..294a73bba46a920f574651ba6c89e85d843264bb 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-namespace Friendica\Test\Core\Config;
+namespace Friendica\Test\src\Core\Config;
 
 use Friendica\Core\Config\Adapter\IPConfigAdapter;
 use Friendica\Core\Config\Cache\ConfigCache;
@@ -145,7 +145,7 @@ class PConfigurationTest extends MockedTest
                $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->twice();
                $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn($data)->once();
                $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'not')->andReturn(false)->once();
-               $configAdapter->shouldReceive('get')->with($uid, 'test', 'not')->andReturn('!<unset>!')->once();
+               $configAdapter->shouldReceive('get')->with($uid, 'test', 'not')->andReturn(null)->once();
 
                $configuration = new PConfiguration($configCache, $configAdapter);
 
@@ -173,7 +173,7 @@ class PConfigurationTest extends MockedTest
                $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3);
 
                $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once();
-               $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn('!<unset>!')->once();
+               $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn(null)->once();
 
                $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once();
                $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn($data)->once();
index 579b28e026b4a94ff1623c5e4710a65472d27c00..ef50c19b7271a895acf592486522fb990810facf 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Friendica\Test\src\Core\Console;
 
+use Friendica\App\Mode;
 use Friendica\Core\Console\Config;
 
 /**
@@ -16,12 +17,12 @@ class ConfigConsoleTest extends ConsoleTest
                parent::setUp();
 
                \Mockery::getConfiguration()->setConstantsMap([
-                       'Friendica\App\Mode' => [
+                       Mode::class => [
                                'DBCONFIGAVAILABLE' => 0
                        ]
                ]);
 
-               $mode = \Mockery::mock('Friendica\App\Mode');
+               $mode = \Mockery::mock(Mode::class);
                $mode
                        ->shouldReceive('has')
                        ->andReturn(true);
index c1a003bade6d0ba374ca5b61056112afbf404b3e..e56596c6c090b67fc0574d9c0041d74723173da9 100644 (file)
@@ -3,9 +3,12 @@
 // this is in the same namespace as Install for mocking 'function_exists'
 namespace Friendica\Core;
 
+use Friendica\Network\CurlResult;
+use Friendica\Object\Image;
 use Friendica\Test\MockedTest;
 use Friendica\Test\Util\L10nMockTrait;
 use Friendica\Test\Util\VFSTrait;
+use Friendica\Util\Network;
 
 /**
  * @runTestsInSeparateProcesses
@@ -248,7 +251,7 @@ class InstallerTest extends MockedTest
                $this->mockL10nT();
 
                // Mocking the CURL Response
-               $curlResult = \Mockery::mock('Friendica\Network\CurlResult');
+               $curlResult = \Mockery::mock(CurlResult::class);
                $curlResult
                        ->shouldReceive('getReturnCode')
                        ->andReturn('404');
@@ -260,7 +263,7 @@ class InstallerTest extends MockedTest
                        ->andReturn('test Error');
 
                // Mocking the CURL Request
-               $networkMock = \Mockery::mock('alias:Friendica\Util\Network');
+               $networkMock = \Mockery::mock('alias:' . Network::class);
                $networkMock
                        ->shouldReceive('fetchUrlFull')
                        ->with('https://test/install/testrewrite')
@@ -287,19 +290,19 @@ class InstallerTest extends MockedTest
                $this->mockL10nT();
 
                // Mocking the failed CURL Response
-               $curlResultF = \Mockery::mock('Friendica\Network\CurlResult');
+               $curlResultF = \Mockery::mock(CurlResult::class);
                $curlResultF
                        ->shouldReceive('getReturnCode')
                        ->andReturn('404');
 
                // Mocking the working CURL Response
-               $curlResultW = \Mockery::mock('Friendica\Network\CurlResult');
+               $curlResultW = \Mockery::mock(CurlResult::class);
                $curlResultW
                        ->shouldReceive('getReturnCode')
                        ->andReturn('204');
 
                // Mocking the CURL Request
-               $networkMock = \Mockery::mock('alias:Friendica\Util\Network');
+               $networkMock = \Mockery::mock('alias:' . Network::class);
                $networkMock
                        ->shouldReceive('fetchUrlFull')
                        ->with('https://test/install/testrewrite')
@@ -327,7 +330,7 @@ class InstallerTest extends MockedTest
        {
                $this->mockL10nT();
 
-               $imageMock = \Mockery::mock('alias:Friendica\Object\Image');
+               $imageMock = \Mockery::mock('alias:'. Image::class);
                $imageMock
                        ->shouldReceive('supportedTypes')
                        ->andReturn(['image/gif' => 'gif']);
@@ -354,7 +357,7 @@ class InstallerTest extends MockedTest
        {
                $this->mockL10nT();
 
-               $imageMock = \Mockery::mock('alias:Friendica\Object\Image');
+               $imageMock = \Mockery::mock('alias:' . Image::class);
                $imageMock
                        ->shouldReceive('supportedTypes')
                        ->andReturn([]);
index e8b9c68b19c3aff0f40e9457c923931ab4bf4e4a..511821da57d06462d5a551dfa01e488296c458f0 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-namespace Friendica\Test\Database;
+namespace Friendica\Test\src\Database;
 
 use Friendica\App;
 use Friendica\Core\Config;
@@ -13,15 +13,15 @@ class DBATest extends DatabaseTest
 {
        public function setUp()
        {
-               $basedir = BasePath::create(dirname(__DIR__) . '/../../');
-               $configLoader = new Cache\ConfigCacheLoader($basedir);
+               $basePath = BasePath::create(dirname(__DIR__) . '/../../');
+               $configLoader = new Cache\ConfigCacheLoader($basePath);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create('test', $config);
-               $this->app = new App($config, $logger, $profiler, false);
+               $this->app = new App($basePath, $config, $logger, $profiler, false);
 
                parent::setUp();
 
index 325ad4e5e7f18571358e7403473b265c0d437129..7b1ff2a31f566dacfc48adae58f936e483e448e4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-namespace Friendica\Test\Database;
+namespace Friendica\Test\src\Database;
 
 use Friendica\App;
 use Friendica\Core\Config\Cache;
@@ -13,15 +13,15 @@ class DBStructureTest extends DatabaseTest
 {
        public function setUp()
        {
-               $basedir = BasePath::create(dirname(__DIR__) . '/../../');
-               $configLoader = new Cache\ConfigCacheLoader($basedir);
+               $basePath = BasePath::create(dirname(__DIR__) . '/../../');
+               $configLoader = new Cache\ConfigCacheLoader($basePath);
                $configCache = Factory\ConfigFactory::createCache($configLoader);
                $profiler = Factory\ProfilerFactory::create($configCache);
-               Factory\DBFactory::init($configCache, $profiler, $_SERVER);
+               Factory\DBFactory::init($basePath, $configCache, $profiler, $_SERVER);
                $config = Factory\ConfigFactory::createConfig($configCache);
                Factory\ConfigFactory::createPConfig($configCache);
                $logger = Factory\LoggerFactory::create('test', $config);
-               $this->app = new App($config, $logger, $profiler, false);
+               $this->app = new App($basePath, $config, $logger, $profiler, false);
 
                parent::setUp();
        }
index 3e224fb4c573f22c6ccbfef1afed62f7ff3683fb..583b1dbfd2e22ca387c410ac29a5f0727097aff3 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-namespace Friendica\Test\Model;
+namespace Friendica\Test\src\Model;
 
 use Friendica\Model\User;
 use Friendica\Test\MockedTest;
index 2028cfc90e45a4a5d13eb7d33441be2cdf53c8f7..a360285da8528ba985717a309c9bf60859cfadd4 100644 (file)
@@ -3,7 +3,7 @@
  * @file tests/src/Util/Arrays.php
  * @author Roland Haeder<https://f.haeder.net/profile/roland>
  */
-namespace Friendica\Test\Util;
+namespace Friendica\Test\src\Util;
 
 use Friendica\Util\Arrays;
 use PHPUnit\Framework\TestCase;
diff --git a/tests/src/Util/Logger/WorkerLoggerTest.php b/tests/src/Util/Logger/WorkerLoggerTest.php
new file mode 100644 (file)
index 0000000..7676b01
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+namespace Friendica\Test\src\Util\Logger;
+
+use Friendica\Test\MockedTest;
+use Friendica\Util\Logger\WorkerLogger;
+use Psr\Log\LoggerInterface;
+
+class WorkerLoggerTest extends MockedTest
+{
+       private function assertUid($uid, $length = 7)
+       {
+               $this->assertRegExp('/^[a-zA-Z0-9]{' . $length . '}+$/', $uid);
+       }
+
+       /**
+        * Test the a id with length zero
+        * @expectedException \Error
+        */
+       public function testGetWorkerIdZero()
+       {
+               $logger = \Mockery::mock(LoggerInterface::class);
+               new WorkerLogger($logger, 'test', 0);
+       }
+
+       /**
+        * Test the generated Uid
+        */
+       public function testGetWorkerId()
+       {
+               $logger = \Mockery::mock(LoggerInterface::class);
+               for ($i = 1; $i < 14; $i++) {
+                       $workLogger = new WorkerLogger($logger, 'test', $i);
+                       $uid = $workLogger->getWorkerId();
+                       $this->assertUid($uid, $i);
+               }
+       }
+
+       public function dataTest()
+       {
+               return [
+                       'info' => [
+                               'func' => 'info',
+                               'msg' => 'the alert',
+                               'context' => [],
+                       ],
+                       'alert' => [
+                               'func' => 'alert',
+                               'msg' => 'another alert',
+                               'context' => ['test' => 'it'],
+                       ],
+                       'critical' => [
+                               'func' => 'critical',
+                               'msg' => 'Critical msg used',
+                               'context' => ['test' => 'it', 'more' => 0.24545],
+                       ],
+                       'error' => [
+                               'func' => 'error',
+                               'msg' => 21345623,
+                               'context' => ['test' => 'it', 'yet' => true],
+                       ],
+                       'warning' => [
+                               'func' => 'warning',
+                               'msg' => 'another alert' . 123523 . 324.54534 . 'test',
+                               'context' => ['test' => 'it', 2 => 'nope'],
+                       ],
+                       'notice' => [
+                               'func' => 'notice',
+                               'msg' => 'Notice' . ' alert' . true . 'with' . '\'strange\'' . 1.24. 'behavior',
+                               'context' => ['test' => 'it'],
+                       ],
+                       'debug' => [
+                               'func' => 'debug',
+                               'msg' => 'at last a debug',
+                               'context' => ['test' => 'it'],
+                       ],
+               ];
+       }
+
+       /**
+        * Test the WorkerLogger with different log calls
+        * @dataProvider dataTest
+        */
+       public function testEmergency($func, $msg, $context = [])
+       {
+               $logger = \Mockery::mock(LoggerInterface::class);
+               $workLogger = new WorkerLogger($logger, 'test');
+               $testContext = $context;
+               $testContext['worker_id'] = $workLogger->getWorkerId();
+               $testContext['worker_cmd'] = 'test';
+               $this->assertUid($testContext['worker_id']);
+               $logger
+                       ->shouldReceive($func)
+                       ->with($msg, $testContext)
+                       ->once();
+               $workLogger->$func($msg, $context);
+       }
+
+       /**
+        * Test the WorkerLogger with
+        */
+       public function testLog()
+       {
+               $logger = \Mockery::mock(LoggerInterface::class);
+               $workLogger = new WorkerLogger($logger, 'test');
+               $context = $testContext = ['test' => 'it'];
+               $testContext['worker_id'] = $workLogger->getWorkerId();
+               $testContext['worker_cmd'] = 'test';
+               $this->assertUid($testContext['worker_id']);
+               $logger
+                       ->shouldReceive('log')
+                       ->with('debug', 'a test', $testContext)
+                       ->once();
+               $workLogger->log('debug', 'a test', $context);
+       }
+}
index f242fd43c5ebc6354dc011fd207f0f941638174a..1dbf36f38bb1f11e8bc5e6db99fc65f563db0004 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-namespace src\Util;
+namespace Friendica\Test\src\Util;
 
 use Friendica\Test\MockedTest;
 use Friendica\Util\Profiler;
@@ -18,7 +18,7 @@ class ProfilerTest extends MockedTest
        {
                parent::setUp();
 
-               $this->logger = \Mockery::mock('Psr\Log\LoggerInterface');
+               $this->logger = \Mockery::mock(LoggerInterface::class);
        }
 
        /**
@@ -177,5 +177,41 @@ class ProfilerTest extends MockedTest
                }
 
                $profiler->saveLog($this->logger, 'test');
+
+               $output = $profiler->getRendertimeString();
+
+               foreach ($data as $perf => $items) {
+                       foreach ($items['functions'] as $function) {
+                               // assert that the output contains the functions
+                               $this->assertRegExp('/' . $function . ': \d+/', $output);
+                       }
+               }
+       }
+
+       /**
+        * Test different enable and disable states of the profiler
+        */
+       public function testEnableDisable()
+       {
+               $profiler = new Profiler(true, false);
+
+               $this->assertFalse($profiler->isRendertime());
+               $this->assertEmpty($profiler->getRendertimeString());
+
+               $profiler->saveTimestamp(time(), 'network', 'test1');
+
+               $profiler->update(false, false);
+
+               $this->assertFalse($profiler->isRendertime());
+               $this->assertEmpty($profiler->getRendertimeString());
+
+               $profiler->update(true, true);
+
+               $profiler->saveTimestamp(time(), 'database', 'test2');
+
+               $this->assertTrue($profiler->isRendertime());
+               $output = $profiler->getRendertimeString();
+               $this->assertRegExp('/test1: \d+/', $output);
+               $this->assertRegExp('/test2: \d+/', $output);
        }
 }
index 21349c848317d6d7657565e17de00734c7349335..666b76e57b1c225bd2c6348e42a530bc3a690075 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * @file tests/src/Util/StringsTest.php
  */
-namespace Friendica\Test\Util;
+namespace Friendica\Test\src\Util;
 
 use Friendica\Util\Strings;
 use PHPUnit\Framework\TestCase;
index ba78e4ff1abf19b7dfdb35757a886e7955e19b75..97498a3c2a2ee3b7113b1cb1bd3f13c81ab4f0b7 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * @file tests/src/Util/XmlTest.php
  */
-namespace Friendica\Test\Util;
+namespace Friendica\Test\src\Util;
 
 use Friendica\Util\XML;
 use PHPUnit\Framework\TestCase;
index 3370d7ccd3a20515e2b1dbed10459756b4fcb103..cd09de014376e36a946c1c790ad867abcab50082 100644 (file)
@@ -793,11 +793,25 @@ function profChangeMember(gid,cid) {
        });
 }
 
-function contactgroupChangeMember(gid,cid) {
+function contactgroupChangeMember(checkbox, gid, cid) {
+       let url;
+       // checkbox.checked is the checkbox state after the click
+       if (checkbox.checked) {
+               url = 'group/' + gid + '/add/' + cid;
+       } else {
+               url = 'group/' + gid + '/remove/' + cid;
+       }
        $('body').css('cursor', 'wait');
-       $.get('contactgroup/' + gid + '/' + cid, function(data) {
-                       $('body').css('cursor', 'auto');
+       $.post(url)
+       .error(function () {
+               // Restores previous state in case of error
+               checkbox.checked = !checkbox.checked;
+       })
+       .always(function() {
+               $('body').css('cursor', 'auto');
        });
+
+       return true;
 }
 
 function checkboxhighlight(box) {
index b0a1cf3f0a26b27b0c25f1507c75372d37eb3156..7ef1cfad042661577cb93a2c83b467e8ad0e5be3 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-02-15 09:33-0500\n"
+"POT-Creation-Date: 2019-02-23 18:53-0500\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"
@@ -18,26 +18,26 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 
 
-#: include/api.php:1179
+#: include/api.php:1117
 #, php-format
 msgid "Daily posting limit of %d post reached. The post was rejected."
 msgid_plural "Daily posting limit of %d posts reached. The post was rejected."
 msgstr[0] ""
 msgstr[1] ""
 
-#: include/api.php:1193
+#: include/api.php:1131
 #, php-format
 msgid "Weekly posting limit of %d post reached. The post was rejected."
 msgid_plural "Weekly posting limit of %d posts reached. The post was rejected."
 msgstr[0] ""
 msgstr[1] ""
 
-#: include/api.php:1207
+#: include/api.php:1145
 #, php-format
 msgid "Monthly posting limit of %d post reached. The post was rejected."
 msgstr ""
 
-#: include/api.php:4578 mod/photos.php:93 mod/photos.php:201 mod/photos.php:695
+#: include/api.php:4520 mod/photos.php:93 mod/photos.php:201 mod/photos.php:695
 #: mod/photos.php:1126 mod/photos.php:1143 mod/photos.php:1636
 #: mod/profile_photo.php:85 mod/profile_photo.php:94 mod/profile_photo.php:103
 #: mod/profile_photo.php:217 mod/profile_photo.php:305
@@ -134,7 +134,7 @@ msgstr ""
 msgid "Might attend"
 msgstr ""
 
-#: include/conversation.php:649 mod/photos.php:1524 src/Object/Post.php:207
+#: include/conversation.php:649 mod/photos.php:1524 src/Object/Post.php:208
 msgid "Select"
 msgstr ""
 
@@ -143,20 +143,20 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: include/conversation.php:684 src/Object/Post.php:380 src/Object/Post.php:381
+#: include/conversation.php:684 src/Object/Post.php:381 src/Object/Post.php:382
 #, php-format
 msgid "View %s's profile @ %s"
 msgstr ""
 
-#: include/conversation.php:696 src/Object/Post.php:368
+#: include/conversation.php:696 src/Object/Post.php:369
 msgid "Categories:"
 msgstr ""
 
-#: include/conversation.php:697 src/Object/Post.php:369
+#: include/conversation.php:697 src/Object/Post.php:370
 msgid "Filed under:"
 msgstr ""
 
-#: include/conversation.php:704 src/Object/Post.php:394
+#: include/conversation.php:704 src/Object/Post.php:395
 #, php-format
 msgid "%s from %s"
 msgstr ""
@@ -167,7 +167,7 @@ msgstr ""
 
 #: include/conversation.php:721 include/conversation.php:1171
 #: mod/editpost.php:88 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:421
+#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:422
 msgid "Please wait"
 msgstr ""
 
@@ -188,7 +188,7 @@ msgid "View Status"
 msgstr ""
 
 #: include/conversation.php:895 include/conversation.php:911
-#: mod/allfriends.php:72 mod/directory.php:167 mod/dirfind.php:226
+#: mod/allfriends.php:72 mod/directory.php:198 mod/dirfind.php:226
 #: mod/match.php:87 mod/suggest.php:87 src/Model/Contact.php:989
 #: src/Model/Contact.php:1042 src/Model/Contact.php:1050
 msgid "View Profile"
@@ -311,7 +311,7 @@ msgstr ""
 msgid "Visible to <strong>everybody</strong>"
 msgstr ""
 
-#: include/conversation.php:1111 src/Object/Post.php:883
+#: include/conversation.php:1111 src/Object/Post.php:886
 msgid "Please enter a image/video/audio/webpage URL:"
 msgstr ""
 
@@ -356,35 +356,35 @@ msgstr ""
 msgid "attach file"
 msgstr ""
 
-#: include/conversation.php:1155 src/Object/Post.php:875
+#: include/conversation.php:1155 src/Object/Post.php:878
 msgid "Bold"
 msgstr ""
 
-#: include/conversation.php:1156 src/Object/Post.php:876
+#: include/conversation.php:1156 src/Object/Post.php:879
 msgid "Italic"
 msgstr ""
 
-#: include/conversation.php:1157 src/Object/Post.php:877
+#: include/conversation.php:1157 src/Object/Post.php:880
 msgid "Underline"
 msgstr ""
 
-#: include/conversation.php:1158 src/Object/Post.php:878
+#: include/conversation.php:1158 src/Object/Post.php:881
 msgid "Quote"
 msgstr ""
 
-#: include/conversation.php:1159 src/Object/Post.php:879
+#: include/conversation.php:1159 src/Object/Post.php:882
 msgid "Code"
 msgstr ""
 
-#: include/conversation.php:1160 src/Object/Post.php:880
+#: include/conversation.php:1160 src/Object/Post.php:883
 msgid "Image"
 msgstr ""
 
-#: include/conversation.php:1161 src/Object/Post.php:881
+#: include/conversation.php:1161 src/Object/Post.php:884
 msgid "Link"
 msgstr ""
 
-#: include/conversation.php:1162 src/Object/Post.php:882
+#: include/conversation.php:1162 src/Object/Post.php:885
 msgid "Link or Media"
 msgstr ""
 
@@ -426,7 +426,7 @@ msgstr ""
 
 #: include/conversation.php:1186 mod/editpost.php:110 mod/events.php:551
 #: mod/photos.php:1458 mod/photos.php:1497 mod/photos.php:1557
-#: src/Object/Post.php:884
+#: src/Object/Post.php:887
 msgid "Preview"
 msgstr ""
 
@@ -837,7 +837,7 @@ msgstr ""
 #: mod/unfollow.php:77 mod/unfollow.php:109 mod/viewcontacts.php:56
 #: mod/wallmessage.php:19 mod/wallmessage.php:43 mod/wallmessage.php:82
 #: mod/wallmessage.php:106 mod/wall_attach.php:76 mod/wall_attach.php:79
-#: mod/wall_upload.php:107 mod/wall_upload.php:110 src/App.php:1480
+#: mod/wall_upload.php:107 mod/wall_upload.php:110 src/App.php:1390
 #: src/Module/Attach.php:42 src/Module/Contact.php:360
 #: src/Module/Register.php:193
 msgid "Permission denied."
@@ -2875,7 +2875,7 @@ msgstr ""
 msgid "No"
 msgstr ""
 
-#: mod/apps.php:15 src/App.php:1349
+#: mod/apps.php:15 src/App.php:1259
 msgid "You must be logged in to use addons. "
 msgstr ""
 
@@ -3009,7 +3009,7 @@ msgid "Access denied."
 msgstr ""
 
 #: mod/cal.php:46 mod/dfrn_poll.php:486 mod/help.php:68 mod/viewcontacts.php:34
-#: src/App.php:1400
+#: src/App.php:1310
 msgid "Page not found."
 msgstr ""
 
@@ -3185,7 +3185,7 @@ msgstr ""
 #: mod/photos.php:1137 mod/photos.php:1412 mod/photos.php:1457
 #: mod/photos.php:1496 mod/photos.php:1556 mod/poke.php:188
 #: mod/profiles.php:562 src/Module/Contact.php:594 src/Module/Install.php:187
-#: src/Module/Install.php:222 src/Object/Post.php:874
+#: src/Module/Install.php:222 src/Object/Post.php:877
 #: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:119
 #: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
 msgid "Submit"
@@ -3561,54 +3561,54 @@ msgstr ""
 msgid "Submit Request"
 msgstr ""
 
-#: mod/directory.php:154 mod/events.php:541 mod/notifications.php:253
-#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:437
-#: src/Model/Event.php:933 src/Model/Profile.php:443 src/Module/Contact.php:643
-msgid "Location:"
+#: mod/directory.php:121
+msgid "No entries (some entries may be hidden)."
 msgstr ""
 
-#: mod/directory.php:159 mod/notifications.php:259 src/Model/Profile.php:446
-#: src/Model/Profile.php:758
-msgid "Gender:"
+#: mod/directory.php:128 src/Content/Widget.php:70
+#: view/theme/vier/theme.php:208
+msgid "Global Directory"
 msgstr ""
 
-#: mod/directory.php:160 src/Model/Profile.php:447 src/Model/Profile.php:782
-msgid "Status:"
+#: mod/directory.php:130
+msgid "Find on this site"
 msgstr ""
 
-#: mod/directory.php:161 src/Model/Profile.php:448 src/Model/Profile.php:799
-msgid "Homepage:"
+#: mod/directory.php:132
+msgid "Results for:"
 msgstr ""
 
-#: mod/directory.php:162 mod/notifications.php:255 src/Model/Profile.php:449
-#: src/Model/Profile.php:819 src/Module/Contact.php:647
-msgid "About:"
+#: mod/directory.php:134
+msgid "Site Directory"
 msgstr ""
 
-#: mod/directory.php:210 src/Content/Widget.php:70
-#: view/theme/vier/theme.php:208
-msgid "Global Directory"
+#: mod/directory.php:136 src/Content/Widget.php:65 src/Module/Contact.php:817
+#: view/theme/vier/theme.php:203
+msgid "Find"
 msgstr ""
 
-#: mod/directory.php:212
-msgid "Find on this site"
+#: mod/directory.php:185 mod/events.php:541 mod/notifications.php:253
+#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:437
+#: src/Model/Event.php:933 src/Model/Profile.php:443 src/Module/Contact.php:643
+msgid "Location:"
 msgstr ""
 
-#: mod/directory.php:214
-msgid "Results for:"
+#: mod/directory.php:190 mod/notifications.php:259 src/Model/Profile.php:446
+#: src/Model/Profile.php:758
+msgid "Gender:"
 msgstr ""
 
-#: mod/directory.php:216
-msgid "Site Directory"
+#: mod/directory.php:191 src/Model/Profile.php:447 src/Model/Profile.php:782
+msgid "Status:"
 msgstr ""
 
-#: mod/directory.php:217 src/Content/Widget.php:65 src/Module/Contact.php:817
-#: view/theme/vier/theme.php:203
-msgid "Find"
+#: mod/directory.php:192 src/Model/Profile.php:448 src/Model/Profile.php:799
+msgid "Homepage:"
 msgstr ""
 
-#: mod/directory.php:221
-msgid "No entries (some entries may be hidden)."
+#: mod/directory.php:193 mod/notifications.php:255 src/Model/Profile.php:449
+#: src/Model/Profile.php:819 src/Module/Contact.php:647
+msgid "About:"
 msgstr ""
 
 #: mod/dirfind.php:55
@@ -3747,8 +3747,8 @@ msgstr ""
 
 #: mod/fbrowser.php:45 mod/fbrowser.php:69 mod/photos.php:201
 #: mod/photos.php:1031 mod/photos.php:1126 mod/photos.php:1143
-#: mod/photos.php:1610 mod/photos.php:1625 src/Model/Photo.php:547
-#: src/Model/Photo.php:556
+#: mod/photos.php:1610 mod/photos.php:1625 src/Model/Photo.php:552
+#: src/Model/Photo.php:561
 msgid "Contact Photos"
 msgstr ""
 
@@ -3874,7 +3874,7 @@ msgstr ""
 msgid "Group name changed."
 msgstr ""
 
-#: mod/group.php:85 mod/profperm.php:30 src/App.php:1479
+#: mod/group.php:85 mod/profperm.php:30 src/App.php:1389
 msgid "Permission denied"
 msgstr ""
 
@@ -3951,7 +3951,7 @@ msgstr ""
 msgid "Help"
 msgstr ""
 
-#: mod/help.php:65 src/App.php:1397
+#: mod/help.php:65 src/App.php:1307
 msgid "Not Found"
 msgstr ""
 
@@ -4873,7 +4873,7 @@ msgstr ""
 msgid "failed"
 msgstr ""
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:283
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:284
 msgid "ignored"
 msgstr ""
 
@@ -5030,7 +5030,7 @@ msgstr ""
 msgid "Use as profile photo"
 msgstr ""
 
-#: mod/photos.php:1297 src/Object/Post.php:156
+#: mod/photos.php:1297 src/Object/Post.php:157
 msgid "Private Message"
 msgstr ""
 
@@ -5074,21 +5074,21 @@ msgstr ""
 msgid "Rotate CCW (left)"
 msgstr ""
 
-#: mod/photos.php:1438 src/Object/Post.php:311
+#: mod/photos.php:1438 src/Object/Post.php:312
 msgid "I like this (toggle)"
 msgstr ""
 
-#: mod/photos.php:1439 src/Object/Post.php:312
+#: mod/photos.php:1439 src/Object/Post.php:313
 msgid "I don't like this (toggle)"
 msgstr ""
 
 #: mod/photos.php:1454 mod/photos.php:1493 mod/photos.php:1553
-#: src/Module/Contact.php:1018 src/Object/Post.php:871
+#: src/Module/Contact.php:1018 src/Object/Post.php:874
 msgid "This is you"
 msgstr ""
 
 #: mod/photos.php:1456 mod/photos.php:1495 mod/photos.php:1555
-#: src/Object/Post.php:417 src/Object/Post.php:873
+#: src/Object/Post.php:418 src/Object/Post.php:876
 msgid "Comment"
 msgstr ""
 
@@ -5736,7 +5736,7 @@ msgstr ""
 msgid "Connected Apps"
 msgstr ""
 
-#: mod/settings.php:725 src/Object/Post.php:166 src/Object/Post.php:168
+#: mod/settings.php:725 src/Object/Post.php:167 src/Object/Post.php:169
 msgid "Edit"
 msgstr ""
 
@@ -6644,15 +6644,15 @@ msgstr ""
 msgid "Wall Photos"
 msgstr ""
 
-#: src/App.php:665
+#: src/App.php:610
 msgid "Delete this item?"
 msgstr ""
 
-#: src/App.php:707
+#: src/App.php:652
 msgid "toggle mobile"
 msgstr ""
 
-#: src/App.php:1075
+#: src/App.php:985
 msgid "No system theme config value set."
 msgstr ""
 
@@ -6742,6 +6742,11 @@ msgstr ""
 msgid "pnut"
 msgstr ""
 
+#: src/Content/ContactSelector.php:153 src/Content/ContactSelector.php:193
+#: src/Content/ContactSelector.php:231
+msgid "No answer"
+msgstr ""
+
 #: src/Content/ContactSelector.php:154
 msgid "Male"
 msgstr ""
@@ -7562,29 +7567,29 @@ msgstr ""
 msgid "All pending post updates are done."
 msgstr ""
 
-#: src/Core/Installer.php:163
+#: src/Core/Installer.php:164
 msgid ""
 "The database configuration file \"config/local.config.php\" could not be "
 "written. Please use the enclosed text to create a configuration file in your "
 "web server root."
 msgstr ""
 
-#: src/Core/Installer.php:182
+#: src/Core/Installer.php:183
 msgid ""
 "You may need to import the file \"database.sql\" manually using phpmyadmin "
 "or mysql."
 msgstr ""
 
-#: src/Core/Installer.php:183 src/Module/Install.php:132
+#: src/Core/Installer.php:184 src/Module/Install.php:132
 #: src/Module/Install.php:263
 msgid "Please see the file \"INSTALL.txt\"."
 msgstr ""
 
-#: src/Core/Installer.php:244
+#: src/Core/Installer.php:245
 msgid "Could not find a command line version of PHP in the web server PATH."
 msgstr ""
 
-#: src/Core/Installer.php:245
+#: src/Core/Installer.php:246
 msgid ""
 "If you don't have a command line version of PHP installed on your server, "
 "you will not be able to run the background processing. See <a href='https://"
@@ -7592,237 +7597,245 @@ msgid ""
 "worker'>'Setup the worker'</a>"
 msgstr ""
 
-#: src/Core/Installer.php:249
+#: src/Core/Installer.php:250
 msgid "PHP executable path"
 msgstr ""
 
-#: src/Core/Installer.php:249
+#: src/Core/Installer.php:250
 msgid ""
 "Enter full path to php executable. You can leave this blank to continue the "
 "installation."
 msgstr ""
 
-#: src/Core/Installer.php:254
+#: src/Core/Installer.php:255
 msgid "Command line PHP"
 msgstr ""
 
-#: src/Core/Installer.php:263
+#: src/Core/Installer.php:264
 msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
 msgstr ""
 
-#: src/Core/Installer.php:264
+#: src/Core/Installer.php:265
 msgid "Found PHP version: "
 msgstr ""
 
-#: src/Core/Installer.php:266
+#: src/Core/Installer.php:267
 msgid "PHP cli binary"
 msgstr ""
 
-#: src/Core/Installer.php:279
+#: src/Core/Installer.php:280
 msgid ""
 "The command line version of PHP on your system does not have "
 "\"register_argc_argv\" enabled."
 msgstr ""
 
-#: src/Core/Installer.php:280
+#: src/Core/Installer.php:281
 msgid "This is required for message delivery to work."
 msgstr ""
 
-#: src/Core/Installer.php:285
+#: src/Core/Installer.php:286
 msgid "PHP register_argc_argv"
 msgstr ""
 
-#: src/Core/Installer.php:317
+#: src/Core/Installer.php:318
 msgid ""
 "Error: the \"openssl_pkey_new\" function on this system is not able to "
 "generate encryption keys"
 msgstr ""
 
-#: src/Core/Installer.php:318
+#: src/Core/Installer.php:319
 msgid ""
 "If running under Windows, please see \"http://www.php.net/manual/en/openssl."
 "installation.php\"."
 msgstr ""
 
-#: src/Core/Installer.php:321
+#: src/Core/Installer.php:322
 msgid "Generate encryption keys"
 msgstr ""
 
-#: src/Core/Installer.php:372
+#: src/Core/Installer.php:374
 msgid ""
 "Error: Apache webserver mod-rewrite module is required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:377
+#: src/Core/Installer.php:379
 msgid "Apache mod_rewrite module"
 msgstr ""
 
-#: src/Core/Installer.php:383
+#: src/Core/Installer.php:385
 msgid "Error: PDO or MySQLi PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:388
+#: src/Core/Installer.php:390
 msgid "Error: The MySQL driver for PDO is not installed."
 msgstr ""
 
-#: src/Core/Installer.php:392
+#: src/Core/Installer.php:394
 msgid "PDO or MySQLi PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:400
+#: src/Core/Installer.php:402
 msgid "Error, XML PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:404
+#: src/Core/Installer.php:406
 msgid "XML PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:407
+#: src/Core/Installer.php:409
 msgid "libCurl PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:408
+#: src/Core/Installer.php:410
 msgid "Error: libCURL PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:414
+#: src/Core/Installer.php:416
 msgid "GD graphics PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:415
+#: src/Core/Installer.php:417
 msgid ""
 "Error: GD graphics PHP module with JPEG support required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:421
+#: src/Core/Installer.php:423
 msgid "OpenSSL PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:422
+#: src/Core/Installer.php:424
 msgid "Error: openssl PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:428
+#: src/Core/Installer.php:430
 msgid "mb_string PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:429
+#: src/Core/Installer.php:431
 msgid "Error: mb_string PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:435
+#: src/Core/Installer.php:437
 msgid "iconv PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:436
+#: src/Core/Installer.php:438
 msgid "Error: iconv PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:442
+#: src/Core/Installer.php:444
 msgid "POSIX PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:443
+#: src/Core/Installer.php:445
 msgid "Error: POSIX PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:449
+#: src/Core/Installer.php:451
 msgid "JSON PHP module"
 msgstr ""
 
-#: src/Core/Installer.php:450
+#: src/Core/Installer.php:452
 msgid "Error: JSON PHP module required but not installed."
 msgstr ""
 
-#: src/Core/Installer.php:473
+#: src/Core/Installer.php:458
+msgid "File Information PHP module"
+msgstr ""
+
+#: src/Core/Installer.php:459
+msgid "Error: File Information PHP module required but not installed."
+msgstr ""
+
+#: src/Core/Installer.php:482
 msgid ""
 "The web installer needs to be able to create a file called \"local.config.php"
 "\" in the \"config\" folder of your web server and it is unable to do so."
 msgstr ""
 
-#: src/Core/Installer.php:474
+#: src/Core/Installer.php:483
 msgid ""
 "This is most often a permission setting, as the web server may not be able "
 "to write files in your folder - even if you can."
 msgstr ""
 
-#: src/Core/Installer.php:475
+#: src/Core/Installer.php:484
 msgid ""
 "At the end of this procedure, we will give you a text to save in a file "
 "named local.config.php in your Friendica \"config\" folder."
 msgstr ""
 
-#: src/Core/Installer.php:476
+#: src/Core/Installer.php:485
 msgid ""
 "You can alternatively skip this procedure and perform a manual installation. "
 "Please see the file \"INSTALL.txt\" for instructions."
 msgstr ""
 
-#: src/Core/Installer.php:479
+#: src/Core/Installer.php:488
 msgid "config/local.config.php is writable"
 msgstr ""
 
-#: src/Core/Installer.php:499
+#: src/Core/Installer.php:508
 msgid ""
 "Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
 "compiles templates to PHP to speed up rendering."
 msgstr ""
 
-#: src/Core/Installer.php:500
+#: src/Core/Installer.php:509
 msgid ""
 "In order to store these compiled templates, the web server needs to have "
 "write access to the directory view/smarty3/ under the Friendica top level "
 "folder."
 msgstr ""
 
-#: src/Core/Installer.php:501
+#: src/Core/Installer.php:510
 msgid ""
 "Please ensure that the user that your web server runs as (e.g. www-data) has "
 "write access to this folder."
 msgstr ""
 
-#: src/Core/Installer.php:502
+#: src/Core/Installer.php:511
 msgid ""
 "Note: as a security measure, you should give the web server write access to "
 "view/smarty3/ only--not the template files (.tpl) that it contains."
 msgstr ""
 
-#: src/Core/Installer.php:505
+#: src/Core/Installer.php:514
 msgid "view/smarty3 is writable"
 msgstr ""
 
-#: src/Core/Installer.php:534
+#: src/Core/Installer.php:543
 msgid ""
 "Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist "
 "to .htaccess."
 msgstr ""
 
-#: src/Core/Installer.php:536
+#: src/Core/Installer.php:545
 msgid "Error message from Curl when fetching"
 msgstr ""
 
-#: src/Core/Installer.php:541
+#: src/Core/Installer.php:550
 msgid "Url rewrite is working"
 msgstr ""
 
-#: src/Core/Installer.php:570
+#: src/Core/Installer.php:579
 msgid "ImageMagick PHP extension is not installed"
 msgstr ""
 
-#: src/Core/Installer.php:572
+#: src/Core/Installer.php:581
 msgid "ImageMagick PHP extension is installed"
 msgstr ""
 
-#: src/Core/Installer.php:574 tests/src/Core/InstallerTest.php:329
-#: tests/src/Core/InstallerTest.php:355
+#: src/Core/Installer.php:583 tests/src/Core/InstallerTest.php:343
+#: tests/src/Core/InstallerTest.php:369
 msgid "ImageMagick supports GIF"
 msgstr ""
 
-#: src/Core/Installer.php:597
+#: src/Core/Installer.php:608
 msgid "Could not connect to database."
 msgstr ""
 
-#: src/Core/Installer.php:604
+#: src/Core/Installer.php:615
 msgid "Database already in use."
 msgstr ""
 
@@ -8401,7 +8414,7 @@ msgstr ""
 msgid "activity"
 msgstr ""
 
-#: src/Model/Item.php:3289 src/Object/Post.php:470
+#: src/Model/Item.php:3289 src/Object/Post.php:471
 msgid "comment"
 msgid_plural "comments"
 msgstr[0] ""
@@ -9466,139 +9479,139 @@ msgstr ""
 msgid "Privacy Statement"
 msgstr ""
 
-#: src/Object/Post.php:136
+#: src/Object/Post.php:137
 msgid "This entry was edited"
 msgstr ""
 
-#: src/Object/Post.php:198
+#: src/Object/Post.php:199
 msgid "Delete locally"
 msgstr ""
 
-#: src/Object/Post.php:201
+#: src/Object/Post.php:202
 msgid "Delete globally"
 msgstr ""
 
-#: src/Object/Post.php:201
+#: src/Object/Post.php:202
 msgid "Remove locally"
 msgstr ""
 
-#: src/Object/Post.php:215
+#: src/Object/Post.php:216
 msgid "save to folder"
 msgstr ""
 
-#: src/Object/Post.php:250
+#: src/Object/Post.php:251
 msgid "I will attend"
 msgstr ""
 
-#: src/Object/Post.php:250
+#: src/Object/Post.php:251
 msgid "I will not attend"
 msgstr ""
 
-#: src/Object/Post.php:250
+#: src/Object/Post.php:251
 msgid "I might attend"
 msgstr ""
 
-#: src/Object/Post.php:278
+#: src/Object/Post.php:279
 msgid "ignore thread"
 msgstr ""
 
-#: src/Object/Post.php:279
+#: src/Object/Post.php:280
 msgid "unignore thread"
 msgstr ""
 
-#: src/Object/Post.php:280
+#: src/Object/Post.php:281
 msgid "toggle ignore status"
 msgstr ""
 
-#: src/Object/Post.php:291
+#: src/Object/Post.php:292
 msgid "add star"
 msgstr ""
 
-#: src/Object/Post.php:292
+#: src/Object/Post.php:293
 msgid "remove star"
 msgstr ""
 
-#: src/Object/Post.php:293
+#: src/Object/Post.php:294
 msgid "toggle star status"
 msgstr ""
 
-#: src/Object/Post.php:296
+#: src/Object/Post.php:297
 msgid "starred"
 msgstr ""
 
-#: src/Object/Post.php:300
+#: src/Object/Post.php:301
 msgid "add tag"
 msgstr ""
 
-#: src/Object/Post.php:311
+#: src/Object/Post.php:312
 msgid "like"
 msgstr ""
 
-#: src/Object/Post.php:312
+#: src/Object/Post.php:313
 msgid "dislike"
 msgstr ""
 
-#: src/Object/Post.php:315
+#: src/Object/Post.php:316
 msgid "Share this"
 msgstr ""
 
-#: src/Object/Post.php:315
+#: src/Object/Post.php:316
 msgid "share"
 msgstr ""
 
-#: src/Object/Post.php:382
+#: src/Object/Post.php:383
 msgid "to"
 msgstr ""
 
-#: src/Object/Post.php:383
+#: src/Object/Post.php:384
 msgid "via"
 msgstr ""
 
-#: src/Object/Post.php:384
+#: src/Object/Post.php:385
 msgid "Wall-to-Wall"
 msgstr ""
 
-#: src/Object/Post.php:385
+#: src/Object/Post.php:386
 msgid "via Wall-To-Wall:"
 msgstr ""
 
-#: src/Object/Post.php:418
+#: src/Object/Post.php:419
 #, php-format
 msgid "Reply to %s"
 msgstr ""
 
-#: src/Object/Post.php:433
+#: src/Object/Post.php:434
 msgid "Notifier task is pending"
 msgstr ""
 
-#: src/Object/Post.php:434
+#: src/Object/Post.php:435
 msgid "Delivery to remote servers is pending"
 msgstr ""
 
-#: src/Object/Post.php:435
+#: src/Object/Post.php:436
 msgid "Delivery to remote servers is underway"
 msgstr ""
 
-#: src/Object/Post.php:436
+#: src/Object/Post.php:437
 msgid "Delivery to remote servers is mostly done"
 msgstr ""
 
-#: src/Object/Post.php:437
+#: src/Object/Post.php:438
 msgid "Delivery to remote servers is done"
 msgstr ""
 
-#: src/Object/Post.php:457
+#: src/Object/Post.php:458
 #, php-format
 msgid "%d comment"
 msgid_plural "%d comments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/Object/Post.php:458
+#: src/Object/Post.php:459
 msgid "Show more"
 msgstr ""
 
-#: src/Object/Post.php:459
+#: src/Object/Post.php:460
 msgid "Show fewer"
 msgstr ""
 
index 5496fe66fb7211b33a125e821272611aa05f76b1..bf68707e77d964a9374d698ef232877087b89e1b 100644 (file)
@@ -12,8 +12,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-02-08 23:34-0500\n"
-"PO-Revision-Date: 2019-02-09 19:22+0000\n"
+"POT-Creation-Date: 2019-02-15 09:33-0500\n"
+"PO-Revision-Date: 2019-02-20 19:19+0000\n"
 "Last-Translator: Aditoo\n"
 "Language-Team: Czech (http://www.transifex.com/Friendica/friendica/language/cs/)\n"
 "MIME-Version: 1.0\n"
@@ -50,13 +50,13 @@ msgstr "Byl dosažen měsíční limit %d příspěvků. Příspěvek byl odmít
 #: mod/photos.php:695 mod/photos.php:1126 mod/photos.php:1143
 #: mod/photos.php:1636 mod/profile_photo.php:85 mod/profile_photo.php:94
 #: mod/profile_photo.php:103 mod/profile_photo.php:217
-#: mod/profile_photo.php:305 mod/profile_photo.php:315 src/Model/User.php:735
-#: src/Model/User.php:743 src/Model/User.php:751
+#: mod/profile_photo.php:305 mod/profile_photo.php:315 src/Model/User.php:736
+#: src/Model/User.php:744 src/Model/User.php:752
 msgid "Profile Photos"
 msgstr "Profilové fotky"
 
 #: include/conversation.php:160 include/conversation.php:297
-#: src/Model/Item.php:3265
+#: src/Model/Item.php:3283
 msgid "event"
 msgstr "událost"
 
@@ -67,7 +67,7 @@ msgid "status"
 msgstr "stav"
 
 #: include/conversation.php:168 include/conversation.php:305
-#: mod/subthread.php:88 mod/tagger.php:70 src/Model/Item.php:3267
+#: mod/subthread.php:88 mod/tagger.php:70 src/Model/Item.php:3285
 msgid "photo"
 msgstr "fotka"
 
@@ -128,7 +128,7 @@ msgstr "Libí se"
 msgid "Dislikes"
 msgstr "Nelibí se"
 
-#: include/conversation.php:569 include/conversation.php:1506
+#: include/conversation.php:569 include/conversation.php:1505
 #: mod/photos.php:1468
 msgid "Attending"
 msgid_plural "Attending"
@@ -145,30 +145,30 @@ msgstr "Neúčastní se"
 msgid "Might attend"
 msgstr "Mohl/a by se zúčastnit"
 
-#: include/conversation.php:649 mod/photos.php:1524 src/Object/Post.php:206
+#: include/conversation.php:649 mod/photos.php:1524 src/Object/Post.php:207
 msgid "Select"
 msgstr "Vybrat"
 
-#: include/conversation.php:650 mod/admin.php:2071 mod/photos.php:1525
+#: include/conversation.php:650 mod/admin.php:2072 mod/photos.php:1525
 #: mod/settings.php:726 src/Module/Contact.php:827 src/Module/Contact.php:1102
 msgid "Delete"
 msgstr "Odstranit"
 
-#: include/conversation.php:684 src/Object/Post.php:379
-#: src/Object/Post.php:380
+#: include/conversation.php:684 src/Object/Post.php:380
+#: src/Object/Post.php:381
 #, php-format
 msgid "View %s's profile @ %s"
 msgstr "Zobrazit profil uživatele %s na %s"
 
-#: include/conversation.php:696 src/Object/Post.php:367
+#: include/conversation.php:696 src/Object/Post.php:368
 msgid "Categories:"
 msgstr "Kategorie:"
 
-#: include/conversation.php:697 src/Object/Post.php:368
+#: include/conversation.php:697 src/Object/Post.php:369
 msgid "Filed under:"
 msgstr "Vyplněn pod:"
 
-#: include/conversation.php:704 src/Object/Post.php:393
+#: include/conversation.php:704 src/Object/Post.php:394
 #, php-format
 msgid "%s from %s"
 msgstr "%s z %s"
@@ -177,9 +177,9 @@ msgstr "%s z %s"
 msgid "View in context"
 msgstr "Zobrazit v kontextu"
 
-#: include/conversation.php:721 include/conversation.php:1172
+#: include/conversation.php:721 include/conversation.php:1171
 #: mod/editpost.php:88 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:419
+#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:421
 msgid "Please wait"
 msgstr "Čekejte prosím"
 
@@ -195,42 +195,42 @@ msgstr "Smazat vybrané položky"
 msgid "Follow Thread"
 msgstr "Sledovat vlákno"
 
-#: include/conversation.php:894 src/Model/Contact.php:1032
+#: include/conversation.php:894 src/Model/Contact.php:1049
 msgid "View Status"
 msgstr "Zobrazit stav"
 
 #: include/conversation.php:895 include/conversation.php:911
 #: mod/allfriends.php:72 mod/directory.php:167 mod/dirfind.php:226
-#: mod/match.php:87 mod/suggest.php:87 src/Model/Contact.php:972
-#: src/Model/Contact.php:1025 src/Model/Contact.php:1033
+#: mod/match.php:87 mod/suggest.php:87 src/Model/Contact.php:989
+#: src/Model/Contact.php:1042 src/Model/Contact.php:1050
 msgid "View Profile"
 msgstr "Zobrazit profil"
 
-#: include/conversation.php:896 src/Model/Contact.php:1034
+#: include/conversation.php:896 src/Model/Contact.php:1051
 msgid "View Photos"
 msgstr "Zobrazit fotky"
 
-#: include/conversation.php:897 src/Model/Contact.php:1026
-#: src/Model/Contact.php:1035
+#: include/conversation.php:897 src/Model/Contact.php:1043
+#: src/Model/Contact.php:1052
 msgid "Network Posts"
 msgstr "Síťové příspěvky"
 
-#: include/conversation.php:898 src/Model/Contact.php:1027
-#: src/Model/Contact.php:1036
+#: include/conversation.php:898 src/Model/Contact.php:1044
+#: src/Model/Contact.php:1053
 msgid "View Contact"
 msgstr "Zobrazit kontakt"
 
-#: include/conversation.php:899 src/Model/Contact.php:1038
+#: include/conversation.php:899 src/Model/Contact.php:1055
 msgid "Send PM"
 msgstr "Poslat soukromou zprávu"
 
-#: include/conversation.php:903 src/Model/Contact.php:1039
+#: include/conversation.php:903 src/Model/Contact.php:1056
 msgid "Poke"
 msgstr "Šťouchnout"
 
 #: include/conversation.php:908 mod/allfriends.php:73 mod/dirfind.php:227
 #: mod/follow.php:147 mod/match.php:88 mod/suggest.php:88
-#: src/Content/Widget.php:63 src/Model/Contact.php:1028
+#: src/Content/Widget.php:63 src/Model/Contact.php:1045
 #: src/Module/Contact.php:574 view/theme/vier/theme.php:201
 msgid "Connect/Follow"
 msgstr "Spojit se/sledovat"
@@ -319,130 +319,130 @@ msgstr "<span  %1$s>%2$d lidí</span> se možná účastní"
 msgid "%s attend maybe."
 msgstr "%s se možná účastní"
 
-#: include/conversation.php:1111
+#: include/conversation.php:1110
 msgid "Visible to <strong>everybody</strong>"
 msgstr "Viditelné pro <strong>všechny</strong>"
 
-#: include/conversation.php:1112 src/Object/Post.php:876
+#: include/conversation.php:1111 src/Object/Post.php:883
 msgid "Please enter a image/video/audio/webpage URL:"
 msgstr "Prosím zadejte URL obrázku/videa/audia/webové stránky:"
 
-#: include/conversation.php:1113
+#: include/conversation.php:1112
 msgid "Tag term:"
 msgstr "Štítek:"
 
-#: include/conversation.php:1114 mod/filer.php:35
+#: include/conversation.php:1113 mod/filer.php:35
 msgid "Save to Folder:"
 msgstr "Uložit do složky:"
 
-#: include/conversation.php:1115
+#: include/conversation.php:1114
 msgid "Where are you right now?"
 msgstr "Kde právě jste?"
 
-#: include/conversation.php:1116
+#: include/conversation.php:1115
 msgid "Delete item(s)?"
 msgstr "Smazat položku(y)?"
 
-#: include/conversation.php:1148
+#: include/conversation.php:1147
 msgid "New Post"
 msgstr "Nový příspěvek"
 
-#: include/conversation.php:1151
+#: include/conversation.php:1150
 msgid "Share"
 msgstr "Sdílet"
 
-#: include/conversation.php:1152 mod/editpost.php:74 mod/message.php:258
+#: include/conversation.php:1151 mod/editpost.php:74 mod/message.php:258
 #: mod/message.php:439 mod/wallmessage.php:139
 msgid "Upload photo"
 msgstr "Nahrát fotku"
 
-#: include/conversation.php:1153 mod/editpost.php:75
+#: include/conversation.php:1152 mod/editpost.php:75
 msgid "upload photo"
 msgstr "nahrát fotku"
 
-#: include/conversation.php:1154 mod/editpost.php:76
+#: include/conversation.php:1153 mod/editpost.php:76
 msgid "Attach file"
 msgstr "Přiložit soubor"
 
-#: include/conversation.php:1155 mod/editpost.php:77
+#: include/conversation.php:1154 mod/editpost.php:77
 msgid "attach file"
 msgstr "přiložit soubor"
 
-#: include/conversation.php:1156 src/Object/Post.php:868
+#: include/conversation.php:1155 src/Object/Post.php:875
 msgid "Bold"
 msgstr "Tučné"
 
-#: include/conversation.php:1157 src/Object/Post.php:869
+#: include/conversation.php:1156 src/Object/Post.php:876
 msgid "Italic"
 msgstr "Kurziva"
 
-#: include/conversation.php:1158 src/Object/Post.php:870
+#: include/conversation.php:1157 src/Object/Post.php:877
 msgid "Underline"
 msgstr "Podtržené"
 
-#: include/conversation.php:1159 src/Object/Post.php:871
+#: include/conversation.php:1158 src/Object/Post.php:878
 msgid "Quote"
 msgstr "Citace"
 
-#: include/conversation.php:1160 src/Object/Post.php:872
+#: include/conversation.php:1159 src/Object/Post.php:879
 msgid "Code"
 msgstr "Kód"
 
-#: include/conversation.php:1161 src/Object/Post.php:873
+#: include/conversation.php:1160 src/Object/Post.php:880
 msgid "Image"
 msgstr "Obrázek"
 
-#: include/conversation.php:1162 src/Object/Post.php:874
+#: include/conversation.php:1161 src/Object/Post.php:881
 msgid "Link"
 msgstr "Odkaz"
 
-#: include/conversation.php:1163 src/Object/Post.php:875
+#: include/conversation.php:1162 src/Object/Post.php:882
 msgid "Link or Media"
 msgstr "Odkaz nebo média"
 
-#: include/conversation.php:1164 mod/editpost.php:84
+#: include/conversation.php:1163 mod/editpost.php:84
 msgid "Set your location"
 msgstr "Nastavit vaši polohu"
 
-#: include/conversation.php:1165 mod/editpost.php:85
+#: include/conversation.php:1164 mod/editpost.php:85
 msgid "set location"
 msgstr "nastavit polohu"
 
-#: include/conversation.php:1166 mod/editpost.php:86
+#: include/conversation.php:1165 mod/editpost.php:86
 msgid "Clear browser location"
 msgstr "Vymazat polohu v prohlížeči"
 
-#: include/conversation.php:1167 mod/editpost.php:87
+#: include/conversation.php:1166 mod/editpost.php:87
 msgid "clear location"
 msgstr "vymazat polohu"
 
-#: include/conversation.php:1169 mod/editpost.php:102
+#: include/conversation.php:1168 mod/editpost.php:102
 msgid "Set title"
 msgstr "Nastavit nadpis"
 
-#: include/conversation.php:1171 mod/editpost.php:104
+#: include/conversation.php:1170 mod/editpost.php:104
 msgid "Categories (comma-separated list)"
 msgstr "Kategorie (seznam, oddělujte čárkou)"
 
-#: include/conversation.php:1173 mod/editpost.php:89
+#: include/conversation.php:1172 mod/editpost.php:89
 msgid "Permission settings"
 msgstr "Nastavení oprávnění"
 
-#: include/conversation.php:1174 mod/editpost.php:119
+#: include/conversation.php:1173 mod/editpost.php:119
 msgid "permissions"
 msgstr "oprávnění"
 
-#: include/conversation.php:1183 mod/editpost.php:99
+#: include/conversation.php:1182 mod/editpost.php:99
 msgid "Public post"
 msgstr "Veřejný příspěvek"
 
-#: include/conversation.php:1187 mod/editpost.php:110 mod/events.php:551
+#: include/conversation.php:1186 mod/editpost.php:110 mod/events.php:551
 #: mod/photos.php:1458 mod/photos.php:1497 mod/photos.php:1557
-#: src/Object/Post.php:877
+#: src/Object/Post.php:884
 msgid "Preview"
 msgstr "Náhled"
 
-#: include/conversation.php:1191 include/items.php:396
+#: include/conversation.php:1190 include/items.php:396
 #: mod/dfrn_request.php:650 mod/editpost.php:113 mod/fbrowser.php:104
 #: mod/fbrowser.php:134 mod/follow.php:161 mod/message.php:153
 #: mod/photos.php:257 mod/photos.php:325 mod/settings.php:666
@@ -451,32 +451,32 @@ msgstr "Náhled"
 msgid "Cancel"
 msgstr "Zrušit"
 
-#: include/conversation.php:1196
+#: include/conversation.php:1195
 msgid "Post to Groups"
 msgstr "Zveřejnit ve skupinách"
 
-#: include/conversation.php:1197
+#: include/conversation.php:1196
 msgid "Post to Contacts"
 msgstr "Zveřejnit v kontaktech"
 
-#: include/conversation.php:1198
+#: include/conversation.php:1197
 msgid "Private post"
 msgstr "Soukromý příspěvek"
 
-#: include/conversation.php:1203 mod/editpost.php:117
+#: include/conversation.php:1202 mod/editpost.php:117
 #: src/Model/Profile.php:370
 msgid "Message"
 msgstr "Zpráva"
 
-#: include/conversation.php:1204 mod/editpost.php:118
+#: include/conversation.php:1203 mod/editpost.php:118
 msgid "Browser"
 msgstr "Prohlížeč"
 
-#: include/conversation.php:1476
+#: include/conversation.php:1475
 msgid "View all"
 msgstr "Zobrazit vše"
 
-#: include/conversation.php:1500
+#: include/conversation.php:1499
 msgid "Like"
 msgid_plural "Likes"
 msgstr[0] "Líbí se"
@@ -484,7 +484,7 @@ msgstr[1] "Líbí se"
 msgstr[2] "Líbí se"
 msgstr[3] "Líbí se"
 
-#: include/conversation.php:1503
+#: include/conversation.php:1502
 msgid "Dislike"
 msgid_plural "Dislikes"
 msgstr[0] "Nelíbí se"
@@ -492,7 +492,7 @@ msgstr[1] "Nelíbí se"
 msgstr[2] "Nelíbí se"
 msgstr[3] "Nelíbí se"
 
-#: include/conversation.php:1509
+#: include/conversation.php:1508
 msgid "Not Attending"
 msgid_plural "Not Attending"
 msgstr[0] "Neúčastní se"
@@ -500,7 +500,7 @@ msgstr[1] "Neúčastní se"
 msgstr[2] "Neúčastní se"
 msgstr[3] "Neúčastní se"
 
-#: include/conversation.php:1512 src/Content/ContactSelector.php:167
+#: include/conversation.php:1511 src/Content/ContactSelector.php:167
 msgid "Undecided"
 msgid_plural "Undecided"
 msgstr[0] "Nerozhodnut"
@@ -823,8 +823,8 @@ msgstr "Celé jméno:\t\t%s\nAdresa stránky:\t\t%s\nPřihlašovací jméno:\t%s
 msgid "Please visit %s to approve or reject the request."
 msgstr "Prosím navštivte %s k odsouhlasení nebo k zamítnutí požadavku."
 
-#: include/items.php:353 mod/admin.php:301 mod/admin.php:2130
-#: mod/admin.php:2377 mod/notice.php:20 mod/viewsrc.php:22
+#: include/items.php:353 mod/admin.php:302 mod/admin.php:2131
+#: mod/admin.php:2378 mod/notice.php:20 mod/viewsrc.php:22
 msgid "Item not found."
 msgstr "Položka nenalezena."
 
@@ -844,7 +844,7 @@ msgid "Yes"
 msgstr "Ano"
 
 #: include/items.php:443 mod/allfriends.php:22 mod/api.php:34 mod/api.php:39
-#: mod/cal.php:303 mod/common.php:27 mod/crepair.php:101 mod/delegate.php:30
+#: mod/cal.php:303 mod/common.php:27 mod/crepair.php:90 mod/delegate.php:30
 #: mod/delegate.php:48 mod/delegate.php:59 mod/dfrn_confirm.php:66
 #: mod/dirfind.php:29 mod/editpost.php:22 mod/events.php:207 mod/follow.php:57
 #: mod/follow.php:121 mod/fsuggest.php:77 mod/group.php:28 mod/invite.php:23
@@ -859,214 +859,213 @@ msgstr "Ano"
 #: mod/unfollow.php:77 mod/unfollow.php:109 mod/viewcontacts.php:56
 #: mod/wallmessage.php:19 mod/wallmessage.php:43 mod/wallmessage.php:82
 #: mod/wallmessage.php:106 mod/wall_attach.php:76 mod/wall_attach.php:79
-#: mod/wall_upload.php:107 mod/wall_upload.php:110 src/App.php:1482
+#: mod/wall_upload.php:107 mod/wall_upload.php:110 src/App.php:1480
 #: src/Module/Attach.php:42 src/Module/Contact.php:360
 #: src/Module/Register.php:193
 msgid "Permission denied."
 msgstr "Přístup odmítnut."
 
-#: include/items.php:514 src/Content/Feature.php:98
+#: include/items.php:514 src/Content/Feature.php:99
 msgid "Archives"
 msgstr "Archivy"
 
-#: include/items.php:520 src/App.php:666 src/Content/ForumManager.php:135
-#: src/Content/Widget.php:329 src/Object/Post.php:457
-#: view/theme/vier/theme.php:255
+#: include/items.php:520 src/Content/ForumManager.php:135
+#: src/Content/Widget.php:329 view/theme/vier/theme.php:255
 msgid "show more"
 msgstr "zobrazit více"
 
-#: mod/admin.php:121
+#: mod/admin.php:122
 msgid "Theme settings updated."
 msgstr "Nastavení motivu bylo aktualizováno."
 
-#: mod/admin.php:195 src/Content/Nav.php:231
+#: mod/admin.php:196 src/Content/Nav.php:231
 msgid "Information"
 msgstr "Informace"
 
-#: mod/admin.php:196
+#: mod/admin.php:197
 msgid "Overview"
 msgstr "Přehled"
 
-#: mod/admin.php:197 mod/admin.php:778
+#: mod/admin.php:198 mod/admin.php:779
 msgid "Federation Statistics"
 msgstr "Statistiky Federation"
 
-#: mod/admin.php:198
+#: mod/admin.php:199
 msgid "Configuration"
 msgstr "Konfigurace"
 
-#: mod/admin.php:199 mod/admin.php:1580
+#: mod/admin.php:200 mod/admin.php:1581
 msgid "Site"
 msgstr "Web"
 
-#: mod/admin.php:200 mod/admin.php:1481 mod/admin.php:2061 mod/admin.php:2078
+#: mod/admin.php:201 mod/admin.php:1482 mod/admin.php:2062 mod/admin.php:2079
 msgid "Users"
 msgstr "Uživatelé"
 
-#: mod/admin.php:201 mod/admin.php:2178 mod/admin.php:2238 mod/settings.php:99
+#: mod/admin.php:202 mod/admin.php:2179 mod/admin.php:2239 mod/settings.php:99
 msgid "Addons"
 msgstr "Doplňky"
 
-#: mod/admin.php:202 mod/admin.php:2435 mod/admin.php:2479
+#: mod/admin.php:203 mod/admin.php:2436 mod/admin.php:2480
 msgid "Themes"
 msgstr "Motivy"
 
-#: mod/admin.php:203 mod/settings.php:77
+#: mod/admin.php:204 mod/settings.php:77
 msgid "Additional features"
 msgstr "Dodatečné vlastnosti"
 
-#: mod/admin.php:204 mod/admin.php:328 src/Content/Nav.php:234
+#: mod/admin.php:205 mod/admin.php:329 src/Content/Nav.php:234
 #: src/Module/Register.php:144 src/Module/Tos.php:73
 msgid "Terms of Service"
 msgstr "Podmínky používání"
 
-#: mod/admin.php:205
+#: mod/admin.php:206
 msgid "Database"
 msgstr "Databáze"
 
-#: mod/admin.php:206
+#: mod/admin.php:207
 msgid "DB updates"
 msgstr "Aktualizace databáze"
 
-#: mod/admin.php:207 mod/admin.php:822
+#: mod/admin.php:208 mod/admin.php:823
 msgid "Inspect Queue"
 msgstr "Prozkoumat frontu"
 
-#: mod/admin.php:208
+#: mod/admin.php:209
 msgid "Inspect Deferred Workers"
 msgstr "Prozkoumat odložené pracovníky"
 
-#: mod/admin.php:209
+#: mod/admin.php:210
 msgid "Inspect worker Queue"
 msgstr "Prozkoumat frontu pro pracovníka"
 
-#: mod/admin.php:210
+#: mod/admin.php:211
 msgid "Tools"
 msgstr "Nástroje"
 
-#: mod/admin.php:211
+#: mod/admin.php:212
 msgid "Contact Blocklist"
 msgstr "Blokované kontakty"
 
-#: mod/admin.php:212 mod/admin.php:394
+#: mod/admin.php:213 mod/admin.php:395
 msgid "Server Blocklist"
 msgstr "Blokované servery"
 
-#: mod/admin.php:213 mod/admin.php:557
+#: mod/admin.php:214 mod/admin.php:558
 msgid "Delete Item"
 msgstr "Smazat položku"
 
-#: mod/admin.php:214 mod/admin.php:215 mod/admin.php:2555
+#: mod/admin.php:215 mod/admin.php:216 mod/admin.php:2556
 msgid "Logs"
 msgstr "Záznamy"
 
-#: mod/admin.php:216 mod/admin.php:2623
+#: mod/admin.php:217 mod/admin.php:2624
 msgid "View Logs"
 msgstr "Zobrazit záznamy"
 
-#: mod/admin.php:218
+#: mod/admin.php:219
 msgid "Diagnostics"
 msgstr "Diagnostika"
 
-#: mod/admin.php:219
+#: mod/admin.php:220
 msgid "PHP Info"
 msgstr "Info o PHP"
 
-#: mod/admin.php:220
+#: mod/admin.php:221
 msgid "probe address"
 msgstr "vyzkoušet adresu"
 
-#: mod/admin.php:221
+#: mod/admin.php:222
 msgid "check webfinger"
 msgstr "vyzkoušet webfinger"
 
-#: mod/admin.php:241 src/Content/Nav.php:274
+#: mod/admin.php:242 src/Content/Nav.php:274
 msgid "Admin"
 msgstr "Administrátor"
 
-#: mod/admin.php:242
+#: mod/admin.php:243
 msgid "Addon Features"
 msgstr "Vlastnosti doplňků"
 
-#: mod/admin.php:243
+#: mod/admin.php:244
 msgid "User registrations waiting for confirmation"
 msgstr "Registrace uživatelů čekající na potvrzení"
 
-#: mod/admin.php:327 mod/admin.php:393 mod/admin.php:513 mod/admin.php:556
-#: mod/admin.php:777 mod/admin.php:821 mod/admin.php:874 mod/admin.php:997
-#: mod/admin.php:1579 mod/admin.php:2060 mod/admin.php:2177 mod/admin.php:2237
-#: mod/admin.php:2434 mod/admin.php:2478 mod/admin.php:2554 mod/admin.php:2622
+#: mod/admin.php:328 mod/admin.php:394 mod/admin.php:514 mod/admin.php:557
+#: mod/admin.php:778 mod/admin.php:822 mod/admin.php:875 mod/admin.php:998
+#: mod/admin.php:1580 mod/admin.php:2061 mod/admin.php:2178 mod/admin.php:2238
+#: mod/admin.php:2435 mod/admin.php:2479 mod/admin.php:2555 mod/admin.php:2623
 msgid "Administration"
 msgstr "Administrace"
 
-#: mod/admin.php:329
+#: mod/admin.php:330
 msgid "Display Terms of Service"
 msgstr "Zobrazit Podmínky používání"
 
-#: mod/admin.php:329
+#: mod/admin.php:330
 msgid ""
 "Enable the Terms of Service page. If this is enabled a link to the terms "
 "will be added to the registration form and the general information page."
 msgstr "Povolí stránku Podmínky používání. Pokud je toto povoleno, bude na formulář pro registrací a stránku s obecnými informacemi přidán odkaz k podmínkám."
 
-#: mod/admin.php:330
+#: mod/admin.php:331
 msgid "Display Privacy Statement"
 msgstr "Zobrazit Prohlášení o soukromí"
 
-#: mod/admin.php:330
+#: mod/admin.php:331
 #, php-format
 msgid ""
 "Show some informations regarding the needed information to operate the node "
 "according e.g. to <a href=\"%s\" target=\"_blank\">EU-GDPR</a>."
 msgstr "Ukázat některé informace ohledně potřebných informací k provozování serveru podle například <a href=\"%s\" target=\"_blank\">Obecného nařízení o ochraně osobních údajů EU (GDPR)</a>"
 
-#: mod/admin.php:331
+#: mod/admin.php:332
 msgid "Privacy Statement Preview"
 msgstr "Náhled Prohlášení o soukromí"
 
-#: mod/admin.php:333
+#: mod/admin.php:334
 msgid "The Terms of Service"
 msgstr "Podmínky používání"
 
-#: mod/admin.php:333
+#: mod/admin.php:334
 msgid ""
 "Enter the Terms of Service for your node here. You can use BBCode. Headers "
 "of sections should be [h2] and below."
 msgstr "Zde zadejte podmínky používání vašeho serveru. Můžete používat BBCode. Záhlaví sekcí by měly být označeny [h2] a níže."
 
-#: mod/admin.php:335 mod/admin.php:1581 mod/admin.php:2239 mod/admin.php:2480
-#: mod/admin.php:2556 mod/admin.php:2706 mod/delegate.php:175
+#: mod/admin.php:336 mod/admin.php:1582 mod/admin.php:2240 mod/admin.php:2481
+#: mod/admin.php:2557 mod/admin.php:2707 mod/delegate.php:175
 #: mod/settings.php:665 mod/settings.php:772 mod/settings.php:860
 #: mod/settings.php:949 mod/settings.php:1174
 msgid "Save Settings"
 msgstr "Uložit nastavení"
 
-#: mod/admin.php:385 mod/admin.php:403 mod/dfrn_request.php:346
-#: mod/friendica.php:130 src/Model/Contact.php:1702
+#: mod/admin.php:386 mod/admin.php:404 mod/dfrn_request.php:346
+#: mod/friendica.php:131 src/Model/Contact.php:1719
 msgid "Blocked domain"
 msgstr "Zablokovaná doména"
 
-#: mod/admin.php:385
+#: mod/admin.php:386
 msgid "The blocked domain"
 msgstr "Zablokovaná doména"
 
-#: mod/admin.php:386 mod/admin.php:404 mod/friendica.php:130
+#: mod/admin.php:387 mod/admin.php:405 mod/friendica.php:131
 msgid "Reason for the block"
 msgstr "Důvody pro zablokování"
 
-#: mod/admin.php:386 mod/admin.php:399
+#: mod/admin.php:387 mod/admin.php:400
 msgid "The reason why you blocked this domain."
 msgstr "Důvod, proč jste doménu zablokoval/a"
 
-#: mod/admin.php:387
+#: mod/admin.php:388
 msgid "Delete domain"
 msgstr "Smazat doménu"
 
-#: mod/admin.php:387
+#: mod/admin.php:388
 msgid "Check to delete this entry from the blocklist"
 msgstr "Zaškrtnutím odstraníte tuto položku z blokovacího seznamu"
 
-#: mod/admin.php:395
+#: mod/admin.php:396
 msgid ""
 "This page can be used to define a black list of servers from the federated "
 "network that are not allowed to interact with your node. For all entered "
@@ -1074,69 +1073,69 @@ msgid ""
 "server."
 msgstr "Tato stránka může být použita k definici „černé listiny“ serverů z federované sítě, kterým není dovoleno interagovat s vaším serverem. Měl/a byste také pro všechny zadané domény uvést důvod, proč jste vzdálený server zablokoval/a."
 
-#: mod/admin.php:396
+#: mod/admin.php:397
 msgid ""
 "The list of blocked servers will be made publically available on the "
 "/friendica page so that your users and people investigating communication "
 "problems can find the reason easily."
 msgstr "Seznam zablokovaných serverů bude zveřejněn na stránce /friendica, takže vaši uživatelé a lidé vyšetřující probém s komunikací mohou důvod najít snadno."
 
-#: mod/admin.php:397
+#: mod/admin.php:398
 msgid "Add new entry to block list"
 msgstr "Přidat na blokovací seznam novou položku"
 
-#: mod/admin.php:398
+#: mod/admin.php:399
 msgid "Server Domain"
 msgstr "Serverová doména"
 
-#: mod/admin.php:398
+#: mod/admin.php:399
 msgid ""
 "The domain of the new server to add to the block list. Do not include the "
 "protocol."
 msgstr "Doména serveru, který má být přidán na blokovací seznam. Vynechejte protokol („http://“)."
 
-#: mod/admin.php:399
+#: mod/admin.php:400
 msgid "Block reason"
 msgstr "Důvod zablokování"
 
-#: mod/admin.php:400
+#: mod/admin.php:401
 msgid "Add Entry"
 msgstr "Přidat položku"
 
-#: mod/admin.php:401
+#: mod/admin.php:402
 msgid "Save changes to the blocklist"
 msgstr "Uložit změny do blokovacího seznamu"
 
-#: mod/admin.php:402
+#: mod/admin.php:403
 msgid "Current Entries in the Blocklist"
 msgstr "Aktuální položky v bokovacím seznamu"
 
-#: mod/admin.php:405
+#: mod/admin.php:406
 msgid "Delete entry from blocklist"
 msgstr "Odstranit položku z blokovacího seznamu"
 
-#: mod/admin.php:408
+#: mod/admin.php:409
 msgid "Delete entry from blocklist?"
 msgstr "Odstranit položku z blokovacího seznamu?"
 
-#: mod/admin.php:435
+#: mod/admin.php:436
 msgid "Server added to blocklist."
 msgstr "Server přidán do blokovacího seznamu"
 
-#: mod/admin.php:451
+#: mod/admin.php:452
 msgid "Site blocklist updated."
 msgstr "Blokovací seznam stránky aktualizován"
 
-#: mod/admin.php:476 src/Core/Console/GlobalCommunityBlock.php:68
+#: mod/admin.php:477 src/Core/Console/GlobalCommunityBlock.php:68
 msgid "The contact has been blocked from the node"
 msgstr "Kontakt byl na serveru zablokován"
 
-#: mod/admin.php:478 src/Core/Console/GlobalCommunityBlock.php:65
+#: mod/admin.php:479 src/Core/Console/GlobalCommunityBlock.php:65
 #, php-format
 msgid "Could not find any contact entry for this URL (%s)"
 msgstr "Nelze nalézt žádnou položku v kontaktech pro tuto URL adresu (%s)"
 
-#: mod/admin.php:485
+#: mod/admin.php:486
 #, php-format
 msgid "%s contact unblocked"
 msgid_plural "%s contacts unblocked"
@@ -1145,71 +1144,71 @@ msgstr[1] "%s kontakty odblokovány"
 msgstr[2] "%s kontaktu odblokováno"
 msgstr[3] "%s kontaktů odblokováno"
 
-#: mod/admin.php:514
+#: mod/admin.php:515
 msgid "Remote Contact Blocklist"
 msgstr "Blokované vzdálené kontakty"
 
-#: mod/admin.php:515
+#: mod/admin.php:516
 msgid ""
 "This page allows you to prevent any message from a remote contact to reach "
 "your node."
 msgstr "Tato stránka vám umožňuje zabránit jakýmkoliv zprávám ze vzdáleného kontaktu, aby se k vašemu serveru dostaly."
 
-#: mod/admin.php:516
+#: mod/admin.php:517
 msgid "Block Remote Contact"
 msgstr "Zablokovat vzdálený kontakt"
 
-#: mod/admin.php:517 mod/admin.php:2063
+#: mod/admin.php:518 mod/admin.php:2064
 msgid "select all"
 msgstr "Vybrat vše"
 
-#: mod/admin.php:518
+#: mod/admin.php:519
 msgid "select none"
 msgstr "nevybrat žádný"
 
-#: mod/admin.php:519 mod/admin.php:2072 src/Module/Contact.php:621
+#: mod/admin.php:520 mod/admin.php:2073 src/Module/Contact.php:621
 #: src/Module/Contact.php:824 src/Module/Contact.php:1077
 msgid "Block"
 msgstr "Blokovat"
 
-#: mod/admin.php:520 mod/admin.php:2074 src/Module/Contact.php:621
+#: mod/admin.php:521 mod/admin.php:2075 src/Module/Contact.php:621
 #: src/Module/Contact.php:824 src/Module/Contact.php:1077
 msgid "Unblock"
 msgstr "Odblokovat"
 
-#: mod/admin.php:521
+#: mod/admin.php:522
 msgid "No remote contact is blocked from this node."
 msgstr "Žádný vzdálený kontakt není na tomto serveru zablokován."
 
-#: mod/admin.php:523
+#: mod/admin.php:524
 msgid "Blocked Remote Contacts"
 msgstr "Zablokované vzdálené kontakty"
 
-#: mod/admin.php:524
+#: mod/admin.php:525
 msgid "Block New Remote Contact"
 msgstr "Zablokovat nový vzdálený kontakt"
 
-#: mod/admin.php:525
+#: mod/admin.php:526
 msgid "Photo"
 msgstr "Fotka"
 
-#: mod/admin.php:525 mod/admin.php:2055 mod/admin.php:2066 mod/admin.php:2080
-#: mod/admin.php:2096 mod/crepair.php:161 mod/settings.php:667
+#: mod/admin.php:526 mod/admin.php:2056 mod/admin.php:2067 mod/admin.php:2081
+#: mod/admin.php:2097 mod/crepair.php:159 mod/settings.php:667
 #: mod/settings.php:693
 msgid "Name"
 msgstr "Jméno"
 
-#: mod/admin.php:525 mod/profiles.php:382
+#: mod/admin.php:526 mod/profiles.php:382
 msgid "Address"
 msgstr "Adresa"
 
-#: mod/admin.php:525 mod/admin.php:535 mod/follow.php:166
+#: mod/admin.php:526 mod/admin.php:536 mod/follow.php:166
 #: mod/notifications.php:179 mod/notifications.php:263 mod/unfollow.php:137
 #: src/Module/Contact.php:639
 msgid "Profile URL"
 msgstr "URL profilu"
 
-#: mod/admin.php:533
+#: mod/admin.php:534
 #, php-format
 msgid "%s total blocked contact"
 msgid_plural "%s total blocked contacts"
@@ -1218,124 +1217,124 @@ msgstr[1] "Celkem %s zablokované kontakty"
 msgstr[2] "Celkem %s zablokovaného kontaktu"
 msgstr[3] "Celkem %s zablokovaných kontaktů"
 
-#: mod/admin.php:535
+#: mod/admin.php:536
 msgid "URL of the remote contact to block."
 msgstr "Adresa URL vzdáleného kontaktu k zablokování."
 
-#: mod/admin.php:558
+#: mod/admin.php:559
 msgid "Delete this Item"
 msgstr "Smazat tuto položku"
 
-#: mod/admin.php:559
+#: mod/admin.php:560
 msgid ""
 "On this page you can delete an item from your node. If the item is a top "
 "level posting, the entire thread will be deleted."
 msgstr "Na této stránce můžete smazat položku z vašeho serveru. Pokud je položkou příspěvek nejvyššího stupně, bude smazáno celé vlákno."
 
-#: mod/admin.php:560
+#: mod/admin.php:561
 msgid ""
 "You need to know the GUID of the item. You can find it e.g. by looking at "
 "the display URL. The last part of http://example.com/display/123456 is the "
 "GUID, here 123456."
 msgstr "Budete muset znát číslo GUID položky. Můžete jej najít např. v adrese URL. Poslední část adresy http://priklad.cz/display/123456 je GUID, v tomto případě 123456"
 
-#: mod/admin.php:561
+#: mod/admin.php:562
 msgid "GUID"
 msgstr "GUID"
 
-#: mod/admin.php:561
+#: mod/admin.php:562
 msgid "The GUID of the item you want to delete."
 msgstr "Číslo GUID položky, kterou chcete smazat"
 
-#: mod/admin.php:596
+#: mod/admin.php:597
 msgid "Item marked for deletion."
 msgstr "Položka označená ke smazání"
 
-#: mod/admin.php:668
+#: mod/admin.php:669
 msgid "unknown"
 msgstr "neznámé"
 
-#: mod/admin.php:771
+#: mod/admin.php:772
 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 "Tato stránka vám nabízí pár čísel pro známou část federované sociální sítě, které je Váš server Friendica součástí. Tato čísla nejsou kompletní, ale pouze odrážejí část sítě, které si je Váš server vědom."
 
-#: mod/admin.php:772
+#: mod/admin.php:773
 msgid ""
 "The <em>Auto Discovered Contact Directory</em> feature is not enabled, it "
 "will improve the data displayed here."
 msgstr "Funkce <em>Adresář automaticky objevených kontaktů</em> není zapnuta, zlepší zde zobrazená data."
 
-#: mod/admin.php:784
+#: mod/admin.php:785
 #, php-format
 msgid ""
 "Currently this node is aware of %d nodes with %d registered users from the "
 "following platforms:"
 msgstr "Aktuálně si je tento server vědom %d serverů s %d registrovanými uživateli z těchto platforem:"
 
-#: mod/admin.php:824 mod/admin.php:877
+#: mod/admin.php:825 mod/admin.php:878
 msgid "ID"
 msgstr "Identifikátor"
 
-#: mod/admin.php:825
+#: mod/admin.php:826
 msgid "Recipient Name"
 msgstr "Jméno příjemce"
 
-#: mod/admin.php:826
+#: mod/admin.php:827
 msgid "Recipient Profile"
 msgstr "Profil příjemce"
 
-#: mod/admin.php:827 src/Content/Nav.php:239
+#: mod/admin.php:828 src/Content/Nav.php:239
 #: src/Core/NotificationsManager.php:182 view/theme/frio/theme.php:269
 msgid "Network"
 msgstr "Síť"
 
-#: mod/admin.php:828 mod/admin.php:879
+#: mod/admin.php:829 mod/admin.php:880
 msgid "Created"
 msgstr "Vytvořeno"
 
-#: mod/admin.php:829
+#: mod/admin.php:830
 msgid "Last Tried"
 msgstr "Naposled vyzkoušeno"
 
-#: mod/admin.php:830
+#: mod/admin.php:831
 msgid ""
 "This page lists the content of the queue for outgoing postings. These are "
 "postings the initial delivery failed for. They will be resend later and "
 "eventually deleted if the delivery fails permanently."
 msgstr "Na této stránce najdete obsah fronty odchozích příspěvků. Toto jsou příspěvky, u kterých počáteční doručení selhalo. Budou znovu poslány později, a pokud doručení selže trvale, budou nakonec smazány."
 
-#: mod/admin.php:853
+#: mod/admin.php:854
 msgid "Inspect Deferred Worker Queue"
 msgstr "Prozkoumat frontu odložených pracovníků"
 
-#: mod/admin.php:854
+#: mod/admin.php:855
 msgid ""
 "This page lists the deferred worker jobs. This are jobs that couldn't be "
 "executed at the first time."
 msgstr "Na této stránce jsou vypsány odložené úlohy pracovníků. To jsou úlohy, které nemohly být napoprvé provedeny."
 
-#: mod/admin.php:857
+#: mod/admin.php:858
 msgid "Inspect Worker Queue"
 msgstr "Prozkoumat frontu pro pracovníka"
 
-#: mod/admin.php:858
+#: mod/admin.php:859
 msgid ""
 "This page lists the currently queued worker jobs. These jobs are handled by "
 "the worker cronjob you've set up during install."
 msgstr "Na této stránce jsou vypsány aktuálně čekající úlohy pro pracovníka . Tyto úlohy vykonává úloha cron pracovníka, kterou jste nastavil/a při instalaci."
 
-#: mod/admin.php:878
+#: mod/admin.php:879
 msgid "Job Parameters"
 msgstr "Parametry úlohy"
 
-#: mod/admin.php:880
+#: mod/admin.php:881
 msgid "Priority"
 msgstr "Priorita"
 
-#: mod/admin.php:906
+#: mod/admin.php:907
 #, php-format
 msgid ""
 "Your DB still runs with MyISAM tables. You should change the engine type to "
@@ -1346,32 +1345,32 @@ msgid ""
 " an automatic conversion.<br />"
 msgstr "Vaše databáze stále běží s tabulkami MyISAM. Měl/a byste změnit typ datového úložiště na InnoDB. Protože Friendica bude v budoucnu používat pouze funkce pro InnoDB, měl/a byste to změnit! <a href=\"%s\">Zde</a> naleznete návod, který by pro vás mohl být užitečný při konverzi úložišť. Můžete také použít příkaz <tt>php bin/console.php dbstructure toinnodb</tt> na Vaší instalaci Friendica pro automatickou konverzi.<br />"
 
-#: mod/admin.php:913
+#: mod/admin.php:914
 #, 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 "Je dostupná ke stažení nová verze Friendica. Vaše aktuální verze je %1$s, upstreamová verze je %2$s"
 
-#: mod/admin.php:923
+#: mod/admin.php:924
 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 "Aktualizace databáze selhala. Prosím, spusťte příkaz „php bin/console.php dbstructure update“ z příkazového řádku a podívejte se na chyby, které by se mohly vyskytnout."
 
-#: mod/admin.php:929
+#: mod/admin.php:930
 msgid "The worker was never executed. Please check your database structure!"
 msgstr "Pracovník nebyl nikdy spuštěn. Prosím zkontrolujte strukturu Vaší databáze!"
 
-#: mod/admin.php:932
+#: mod/admin.php:933
 #, php-format
 msgid ""
 "The last worker execution was on %s UTC. This is older than one hour. Please"
 " check your crontab settings."
 msgstr "Pracovník byl naposledy spuštěn v %s UTC. Toto je více než jedna hodina. Prosím zkontrolujte si nastavení crontab."
 
-#: mod/admin.php:938
+#: mod/admin.php:939
 #, php-format
 msgid ""
 "Friendica's configuration now is stored in config/local.config.php, please "
@@ -1380,7 +1379,7 @@ msgid ""
 "help with the transition."
 msgstr "Konfigurace Friendica je nyní uložena v souboru config/local.config.php, prosím zkopírujte soubor config/local-sample.config.php a přesuňte svou konfiguraci ze souboru <code>.htconfig.php</code>. Pro pomoc při přechodu navštivte <a href=\"%s\">stránku Config v sekci nápovědy</a>."
 
-#: mod/admin.php:942
+#: mod/admin.php:943
 #, php-format
 msgid ""
 "Friendica's configuration now is stored in config/local.config.php, please "
@@ -1389,7 +1388,7 @@ msgid ""
 "page</a> for help with the transition."
 msgstr "Konfigurace Friendica je nyní uložena v souboru config/local.config.php, prosím zkopírujte soubor config/local-sample.config.php a přesuňte svou konfiguraci ze souboru <code>local.config.php</code>. Pro pomoc při přechodu navštivte <a href=\"%s\">stránku Config v sekci nápovědy</a>."
 
-#: mod/admin.php:949
+#: mod/admin.php:950
 #, php-format
 msgid ""
 "<a href=\"%s\">%s</a> is not reachable on your system. This is a severe "
@@ -1397,319 +1396,319 @@ msgid ""
 "href=\"%s\">the installation page</a> for help."
 msgstr "<a href=\"%s\">%s</a> není na Vašem systému dosažitelné. Tohle je závažná chyba konfigurace, která brání komunikaci mezi servery. Pro pomoc navštivte <a href=\"%s\">stránku instalace</a>."
 
-#: mod/admin.php:955
+#: mod/admin.php:956
 msgid "Normal Account"
 msgstr "Normální účet"
 
-#: mod/admin.php:956
+#: mod/admin.php:957
 msgid "Automatic Follower Account"
 msgstr "Účet s automatickými sledujícími"
 
-#: mod/admin.php:957
+#: mod/admin.php:958
 msgid "Public Forum Account"
 msgstr "Účet veřejného fóra"
 
-#: mod/admin.php:958
+#: mod/admin.php:959
 msgid "Automatic Friend Account"
 msgstr "Účet s automatickými přáteli"
 
-#: mod/admin.php:959
+#: mod/admin.php:960
 msgid "Blog Account"
 msgstr "Blogovací účet"
 
-#: mod/admin.php:960
+#: mod/admin.php:961
 msgid "Private Forum Account"
 msgstr "Účet soukromého fóra"
 
-#: mod/admin.php:983
+#: mod/admin.php:984
 msgid "Message queues"
 msgstr "Fronty zpráv"
 
-#: mod/admin.php:989
+#: mod/admin.php:990
 msgid "Server Settings"
 msgstr "Nastavení serveru"
 
-#: mod/admin.php:998
+#: mod/admin.php:999
 msgid "Summary"
 msgstr "Shrnutí"
 
-#: mod/admin.php:1000
+#: mod/admin.php:1001
 msgid "Registered users"
 msgstr "Registrovaní uživatelé"
 
-#: mod/admin.php:1002
+#: mod/admin.php:1003
 msgid "Pending registrations"
 msgstr "Čekající registrace"
 
-#: mod/admin.php:1003
+#: mod/admin.php:1004
 msgid "Version"
 msgstr "Verze"
 
-#: mod/admin.php:1008
+#: mod/admin.php:1009
 msgid "Active addons"
 msgstr "Aktivní doplňky"
 
-#: mod/admin.php:1041
+#: mod/admin.php:1042
 msgid "Can not parse base url. Must have at least <scheme>://<domain>"
 msgstr "Nelze zpracovat výchozí url adresu. Musí obsahovat alespoň <scheme>://<domain>"
 
-#: mod/admin.php:1414
+#: mod/admin.php:1415
 msgid "Site settings updated."
 msgstr "Nastavení webu aktualizováno."
 
-#: mod/admin.php:1443 mod/settings.php:893
+#: mod/admin.php:1444 mod/settings.php:893
 msgid "No special theme for mobile devices"
 msgstr "Žádný speciální motiv pro mobilní zařízení"
 
-#: mod/admin.php:1472
+#: mod/admin.php:1473
 msgid "No community page for local users"
 msgstr "Žádná komunitní stránka pro místní uživatele"
 
-#: mod/admin.php:1473
+#: mod/admin.php:1474
 msgid "No community page"
 msgstr "Žádná komunitní stránka"
 
-#: mod/admin.php:1474
+#: mod/admin.php:1475
 msgid "Public postings from users of this site"
 msgstr "Veřejné příspěvky od místních uživatelů"
 
-#: mod/admin.php:1475
+#: mod/admin.php:1476
 msgid "Public postings from the federated network"
 msgstr "Veřejné příspěvky z federované sítě"
 
-#: mod/admin.php:1476
+#: mod/admin.php:1477
 msgid "Public postings from local users and the federated network"
 msgstr "Veřejné příspěvky od místních uživatelů a z federované sítě"
 
-#: mod/admin.php:1480 mod/admin.php:1681 mod/admin.php:1691
+#: mod/admin.php:1481 mod/admin.php:1682 mod/admin.php:1692
 #: src/Module/Contact.php:546
 msgid "Disabled"
 msgstr "Zakázáno"
 
-#: mod/admin.php:1482
+#: mod/admin.php:1483
 msgid "Users, Global Contacts"
 msgstr "Uživatelé, globální kontakty"
 
-#: mod/admin.php:1483
+#: mod/admin.php:1484
 msgid "Users, Global Contacts/fallback"
 msgstr "Uživatelé, globální kontakty/fallback"
 
-#: mod/admin.php:1487
+#: mod/admin.php:1488
 msgid "One month"
 msgstr "Jeden měsíc"
 
-#: mod/admin.php:1488
+#: mod/admin.php:1489
 msgid "Three months"
 msgstr "Tři měsíce"
 
-#: mod/admin.php:1489
+#: mod/admin.php:1490
 msgid "Half a year"
 msgstr "Půl roku"
 
-#: mod/admin.php:1490
+#: mod/admin.php:1491
 msgid "One year"
 msgstr "Jeden rok"
 
-#: mod/admin.php:1495
+#: mod/admin.php:1496
 msgid "Multi user instance"
 msgstr "Víceuživatelská instance"
 
-#: mod/admin.php:1519
+#: mod/admin.php:1520
 msgid "Closed"
 msgstr "Uzavřeno"
 
-#: mod/admin.php:1520
+#: mod/admin.php:1521
 msgid "Requires approval"
 msgstr "Vyžaduje schválení"
 
-#: mod/admin.php:1521
+#: mod/admin.php:1522
 msgid "Open"
 msgstr "Otevřeno"
 
-#: mod/admin.php:1525
+#: mod/admin.php:1526
 msgid "No SSL policy, links will track page SSL state"
 msgstr "Žádná SSL politika, odkazy budou následovat SSL stav stránky"
 
-#: mod/admin.php:1526
+#: mod/admin.php:1527
 msgid "Force all links to use SSL"
 msgstr "Vyžadovat u všech odkazů použití SSL"
 
-#: mod/admin.php:1527
+#: mod/admin.php:1528
 msgid "Self-signed certificate, use SSL for local links only (discouraged)"
 msgstr "Certifikát podepsaný sám sebou, použít SSL pouze pro místní odkazy (nedoporučeno)"
 
-#: mod/admin.php:1531
+#: mod/admin.php:1532
 msgid "Don't check"
 msgstr "Nekontrolovat"
 
-#: mod/admin.php:1532
+#: mod/admin.php:1533
 msgid "check the stable version"
 msgstr "kontrolovat stabilní verzi"
 
-#: mod/admin.php:1533
+#: mod/admin.php:1534
 msgid "check the development version"
 msgstr "kontrolovat vývojovou verzi"
 
-#: mod/admin.php:1555
+#: mod/admin.php:1556
 msgid "Database (legacy)"
 msgstr "Databáze (legacy)"
 
-#: mod/admin.php:1582
+#: mod/admin.php:1583
 msgid "Republish users to directory"
 msgstr "Znovu publikovat uživatele do adresáře"
 
-#: mod/admin.php:1583 src/Module/Register.php:121
+#: mod/admin.php:1584 src/Module/Register.php:121
 msgid "Registration"
 msgstr "Registrace"
 
-#: mod/admin.php:1584
+#: mod/admin.php:1585
 msgid "File upload"
 msgstr "Nahrání souborů"
 
-#: mod/admin.php:1585
+#: mod/admin.php:1586
 msgid "Policies"
 msgstr "Politika"
 
-#: mod/admin.php:1586 mod/events.php:555 src/Model/Profile.php:878
+#: mod/admin.php:1587 mod/events.php:555 src/Model/Profile.php:878
 #: src/Module/Contact.php:902
 msgid "Advanced"
 msgstr "Pokročilé"
 
-#: mod/admin.php:1587
+#: mod/admin.php:1588
 msgid "Auto Discovered Contact Directory"
 msgstr "Adresář automaticky objevených kontaktů"
 
-#: mod/admin.php:1588
+#: mod/admin.php:1589
 msgid "Performance"
 msgstr "Výkon"
 
-#: mod/admin.php:1589
+#: mod/admin.php:1590
 msgid "Worker"
 msgstr "Pracovník (worker)"
 
-#: mod/admin.php:1590
+#: mod/admin.php:1591
 msgid "Message Relay"
 msgstr "Přeposílání zpráv"
 
-#: mod/admin.php:1591
+#: mod/admin.php:1592
 msgid "Relocate Instance"
 msgstr "Přemístit instanci"
 
-#: mod/admin.php:1592
+#: mod/admin.php:1593
 msgid "Warning! Advanced function. Could make this server unreachable."
 msgstr "Varování! Pokročilá funkce. Tímto můžete znepřístupnit server."
 
-#: mod/admin.php:1596
+#: mod/admin.php:1597
 msgid "Site name"
 msgstr "Název webu"
 
-#: mod/admin.php:1597
+#: mod/admin.php:1598
 msgid "Host name"
 msgstr "Jméno hostitele (host name)"
 
-#: mod/admin.php:1598
+#: mod/admin.php:1599
 msgid "Sender Email"
 msgstr "E-mail odesílatele"
 
-#: mod/admin.php:1598
+#: mod/admin.php:1599
 msgid ""
 "The email address your server shall use to send notification emails from."
 msgstr "E-mailová adresa, kterou bude Váš server používat pro posílání e-mailů s oznámeními."
 
-#: mod/admin.php:1599
+#: mod/admin.php:1600
 msgid "Banner/Logo"
 msgstr "Banner/logo"
 
-#: mod/admin.php:1600
+#: mod/admin.php:1601
 msgid "Shortcut icon"
 msgstr "Favikona"
 
-#: mod/admin.php:1600
+#: mod/admin.php:1601
 msgid "Link to an icon that will be used for browsers."
 msgstr "Odkaz k ikoně, která bude použita pro prohlížeče."
 
-#: mod/admin.php:1601
+#: mod/admin.php:1602
 msgid "Touch icon"
 msgstr "Dotyková ikona"
 
-#: mod/admin.php:1601
+#: mod/admin.php:1602
 msgid "Link to an icon that will be used for tablets and mobiles."
 msgstr "Odkaz k ikoně, která bude použita pro tablety a mobilní zařízení."
 
-#: mod/admin.php:1602
+#: mod/admin.php:1603
 msgid "Additional Info"
 msgstr "Dodatečné informace"
 
-#: mod/admin.php:1602
+#: mod/admin.php:1603
 #, php-format
 msgid ""
 "For public servers: you can add additional information here that will be "
 "listed at %s/servers."
 msgstr "Pro veřejné servery: zde můžete přidat dodatečné informace, které budou vypsané na stránce %s/servers."
 
-#: mod/admin.php:1603
+#: mod/admin.php:1604
 msgid "System language"
 msgstr "Systémový jazyk"
 
-#: mod/admin.php:1604
+#: mod/admin.php:1605
 msgid "System theme"
 msgstr "Systémový motiv"
 
-#: mod/admin.php:1604
+#: mod/admin.php:1605
 msgid ""
 "Default system theme - may be over-ridden by user profiles - <a href='#' "
 "id='cnftheme'>change theme settings</a>"
 msgstr "Výchozí systémový motiv - může být změněn v uživatelských profilech - <a href='#' id='cnftheme'>změnit nastavení motivu</a>"
 
-#: mod/admin.php:1605
+#: mod/admin.php:1606
 msgid "Mobile system theme"
 msgstr "Mobilní systémový motiv"
 
-#: mod/admin.php:1605
+#: mod/admin.php:1606
 msgid "Theme for mobile devices"
 msgstr "Motiv pro mobilní zařízení"
 
-#: mod/admin.php:1606
+#: mod/admin.php:1607
 msgid "SSL link policy"
 msgstr "Politika SSL odkazů"
 
-#: mod/admin.php:1606
+#: mod/admin.php:1607
 msgid "Determines whether generated links should be forced to use SSL"
 msgstr "Určuje, zda-li budou generované odkazy používat SSL"
 
-#: mod/admin.php:1607
+#: mod/admin.php:1608
 msgid "Force SSL"
 msgstr "Vynutit SSL"
 
-#: mod/admin.php:1607
+#: mod/admin.php:1608
 msgid ""
 "Force all Non-SSL requests to SSL - Attention: on some systems it could lead"
 " to endless loops."
 msgstr "Vynutit SSL pro všechny ne-SSL žádosti - Upozornění: na některých systémech může dojít k nekonečnému zacyklení."
 
-#: mod/admin.php:1608
+#: mod/admin.php:1609
 msgid "Hide help entry from navigation menu"
 msgstr "Skrýt nápovědu z navigačního menu"
 
-#: mod/admin.php:1608
+#: mod/admin.php:1609
 msgid ""
 "Hides the menu entry for the Help pages from the navigation menu. You can "
 "still access it calling /help directly."
 msgstr "Skryje z navigačního menu položku pro stránky nápovědy. Nápovědu můžete stále zobrazit přímo zadáním /help."
 
-#: mod/admin.php:1609
+#: mod/admin.php:1610
 msgid "Single user instance"
 msgstr "Jednouživatelská instance"
 
-#: mod/admin.php:1609
+#: mod/admin.php:1610
 msgid "Make this instance multi-user or single-user for the named user"
 msgstr "Nastavit tuto instanci víceuživatelskou nebo jednouživatelskou pro pojmenovaného uživatele"
 
-#: mod/admin.php:1611
+#: mod/admin.php:1612
 msgid "File storage backend"
 msgstr "Backend souborového úložiště"
 
-#: mod/admin.php:1611
+#: mod/admin.php:1612
 msgid ""
 "The backend used to store uploaded data. If you change the storage backend, "
 "you can manually move the existing files. If you do not do so, the files "
@@ -1718,190 +1717,190 @@ msgid ""
 " for more information about the choices and the moving procedure."
 msgstr "Backend použitý pro ukládání nahraných dat. Pokud změníte backend úložiště, můžete manuálně přesunout existující soubory. Pokud tak neučiníte, budou soubory nahrané před změnou stále dostupné ve starém backendu. Pro více informací o možnostech a proceduře pro přesun si prosím přečtěte <a href=\"/help/Settings#1_2_3_1\">dokumentaci nastavení</a>."
 
-#: mod/admin.php:1613
+#: mod/admin.php:1614
 msgid "Maximum image size"
 msgstr "Maximální velikost obrázků"
 
-#: mod/admin.php:1613
+#: mod/admin.php:1614
 msgid ""
 "Maximum size in bytes of uploaded images. Default is 0, which means no "
 "limits."
 msgstr "Maximální velikost nahraných obrázků v bajtech. Výchozí hodnota je 0, což znamená bez omezení."
 
-#: mod/admin.php:1614
+#: mod/admin.php:1615
 msgid "Maximum image length"
 msgstr "Maximální velikost obrázků"
 
-#: mod/admin.php:1614
+#: mod/admin.php:1615
 msgid ""
 "Maximum length in pixels of the longest side of uploaded images. Default is "
 "-1, which means no limits."
 msgstr "Maximální délka delší stránky nahrávaných obrázků v pixelech. Výchozí hodnota je -1, což znamená bez omezení."
 
-#: mod/admin.php:1615
+#: mod/admin.php:1616
 msgid "JPEG image quality"
 msgstr "Kvalita obrázků JPEG"
 
-#: mod/admin.php:1615
+#: mod/admin.php:1616
 msgid ""
 "Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
 "100, which is full quality."
 msgstr "Nahrávané obrázky JPEG budou uloženy se zadanou kvalitou v rozmezí [0-100]. Výchozí hodnota je 100, což znamená plnou kvalitu."
 
-#: mod/admin.php:1617
+#: mod/admin.php:1618
 msgid "Register policy"
 msgstr "Politika registrace"
 
-#: mod/admin.php:1618
+#: mod/admin.php:1619
 msgid "Maximum Daily Registrations"
 msgstr "Maximální počet denních registrací"
 
-#: mod/admin.php:1618
+#: mod/admin.php:1619
 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 "Pokud je registrace výše povolena, zde se nastaví maximální počet registrací nových uživatelů za den. Pokud je registrace zakázána, toto nastavení nemá žádný efekt."
 
-#: mod/admin.php:1619
+#: mod/admin.php:1620
 msgid "Register text"
 msgstr "Text při registraci"
 
-#: mod/admin.php:1619
+#: mod/admin.php:1620
 msgid ""
 "Will be displayed prominently on the registration page. You can use BBCode "
 "here."
 msgstr "Bude zobrazen viditelně na stránce registrace. Zde můžete používat BBCode."
 
-#: mod/admin.php:1620
+#: mod/admin.php:1621
 msgid "Forbidden Nicknames"
 msgstr "Zakázané přezdívky"
 
-#: mod/admin.php:1620
+#: mod/admin.php:1621
 msgid ""
 "Comma separated list of nicknames that are forbidden from registration. "
 "Preset is a list of role names according RFC 2142."
 msgstr "Seznam přezdívek, které nelze registrovat, oddělených čárkami. Přednastaven je seznam častých přezdívek dle RFC 2142."
 
-#: mod/admin.php:1621
+#: mod/admin.php:1622
 msgid "Accounts abandoned after x days"
 msgstr "Účty jsou opuštěny po x dnech"
 
-#: mod/admin.php:1621
+#: mod/admin.php:1622
 msgid ""
 "Will not waste system resources polling external sites for abandonded "
 "accounts. Enter 0 for no time limit."
 msgstr "Nebude se plýtvat systémovými zdroji kontaktováním externích webů s opuštěnými účty. Zadejte 0 pro žádný časový limit."
 
-#: mod/admin.php:1622
+#: mod/admin.php:1623
 msgid "Allowed friend domains"
 msgstr "Povolené domény přátel"
 
-#: mod/admin.php:1622
+#: mod/admin.php:1623
 msgid ""
 "Comma separated list of domains which are allowed to establish friendships "
 "with this site. Wildcards are accepted. Empty to allow any domains"
 msgstr "Seznam domén, kterým je povoleno navazovat přátelství s tímto webem, oddělených čárkami. Zástupné znaky (wildcards) jsou povoleny. Prázné znamená libovolné domény."
 
-#: mod/admin.php:1623
+#: mod/admin.php:1624
 msgid "Allowed email domains"
 msgstr "Povolené e-mailové domény"
 
-#: mod/admin.php:1623
+#: mod/admin.php:1624
 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 "Seznam domén e-mailových adres, kterým je povoleno provádět registraci na tomto webu, oddělených čárkami. Zástupné znaky (wildcards) jsou povoleny. Prázné znamená libovolné domény."
 
-#: mod/admin.php:1624
+#: mod/admin.php:1625
 msgid "No OEmbed rich content"
 msgstr "Žádný obohacený obsah oEmbed"
 
-#: mod/admin.php:1624
+#: mod/admin.php:1625
 msgid ""
 "Don't show the rich content (e.g. embedded PDF), except from the domains "
 "listed below."
 msgstr "Neukazovat obohacený obsah (např. vložené PDF dokumenty), kromě toho z domén vypsaných níže."
 
-#: mod/admin.php:1625
+#: mod/admin.php:1626
 msgid "Allowed OEmbed domains"
 msgstr "Povolené domény pro oEmbed"
 
-#: mod/admin.php:1625
+#: mod/admin.php:1626
 msgid ""
 "Comma separated list of domains which oembed content is allowed to be "
 "displayed. Wildcards are accepted."
 msgstr "Seznam domén, u nichž je povoleno zobrazit obsah oEmbed, oddělených čárkami. Zástupné znaky jsou povoleny."
 
-#: mod/admin.php:1626
+#: mod/admin.php:1627
 msgid "Block public"
 msgstr "Blokovat veřejný přístup"
 
-#: mod/admin.php:1626
+#: mod/admin.php:1627
 msgid ""
 "Check to block public access to all otherwise public personal pages on this "
 "site unless you are currently logged in."
 msgstr "Označením zablokujete veřejný přístup ke všem jinak veřejně přístupným osobním stránkám nepřihlášeným uživatelům."
 
-#: mod/admin.php:1627
+#: mod/admin.php:1628
 msgid "Force publish"
 msgstr "Vynutit publikaci"
 
-#: mod/admin.php:1627
+#: mod/admin.php:1628
 msgid ""
 "Check to force all profiles on this site to be listed in the site directory."
 msgstr "Označením budou všechny profily na tomto serveru uvedeny v adresáři stránky."
 
-#: mod/admin.php:1627
+#: mod/admin.php:1628
 msgid "Enabling this may violate privacy laws like the GDPR"
 msgstr "Povolení této funkce může porušit zákony o ochraně soukromí, jako je Obecné nařízení o ochraně osobních údajů (GDPR)"
 
-#: mod/admin.php:1628
+#: mod/admin.php:1629
 msgid "Global directory URL"
 msgstr "Adresa URL globálního adresáře"
 
-#: mod/admin.php:1628
+#: mod/admin.php:1629
 msgid ""
 "URL to the global directory. If this is not set, the global directory is "
 "completely unavailable to the application."
 msgstr "Adresa URL globálního adresáře. Pokud toto není nastaveno, globální adresář bude aplikaci naprosto nedostupný."
 
-#: mod/admin.php:1629
+#: mod/admin.php:1630
 msgid "Private posts by default for new users"
 msgstr "Nastavit pro nové uživatele příspěvky jako soukromé"
 
-#: mod/admin.php:1629
+#: mod/admin.php:1630
 msgid ""
 "Set default post permissions for all new members to the default privacy "
 "group rather than public."
 msgstr "Nastavit výchozí práva pro příspěvky od všech nových členů na výchozí soukromou skupinu místo veřejné."
 
-#: mod/admin.php:1630
+#: mod/admin.php:1631
 msgid "Don't include post content in email notifications"
 msgstr "Nezahrnovat v e-mailových oznámeních obsah příspěvků"
 
-#: mod/admin.php:1630
+#: mod/admin.php:1631
 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 " V e-mailových oznámeních, které jsou odesílány z tohoto webu, nebudou z důvodů bezpečnosti obsaženy příspěvky/komentáře/soukromé zprávy apod. "
 
-#: mod/admin.php:1631
+#: mod/admin.php:1632
 msgid "Disallow public access to addons listed in the apps menu."
 msgstr "Zakázat veřejný přístup k rozšířením uvedeným v menu aplikace."
 
-#: mod/admin.php:1631
+#: mod/admin.php:1632
 msgid ""
 "Checking this box will restrict addons listed in the apps menu to members "
 "only."
 msgstr "Označení této volby omezí rozšíření uvedená v menu aplikace pouze pro členy."
 
-#: mod/admin.php:1632
+#: mod/admin.php:1633
 msgid "Don't embed private images in posts"
 msgstr "Nepovolit přidávání soukromých obrázků do příspěvků"
 
-#: mod/admin.php:1632
+#: mod/admin.php:1633
 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 "
@@ -1909,11 +1908,11 @@ msgid ""
 "while."
 msgstr "Nenahrazovat místní soukromé fotky v příspěvcích vloženou kopií obrázku. To znamená, že kontakty, které obdrží příspěvek obsahující soukromé fotky, budou muset autentikovat a načíst každý obrázek, což může zabrat nějaký čas."
 
-#: mod/admin.php:1633
+#: mod/admin.php:1634
 msgid "Explicit Content"
 msgstr "Explicitní obsah"
 
-#: mod/admin.php:1633
+#: mod/admin.php:1634
 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 "
@@ -1922,245 +1921,245 @@ msgid ""
 "will be shown at the user registration page."
 msgstr "Touto funkcí oznámíte, že je Váš server používán hlavně pro explicitní obsah, který nemusí být vhodný pro mladistvé. Tato informace bude publikována na stránce informací o serveru a může být využita např. globálním adresářem pro odfiltrování Vašeho serveru ze seznamu serverů pro spojení. Poznámka o tom bude navíc zobrazena na stránce registrace."
 
-#: mod/admin.php:1634
+#: mod/admin.php:1635
 msgid "Allow Users to set remote_self"
 msgstr "Umožnit uživatelům nastavit remote_self"
 
-#: mod/admin.php:1634
+#: mod/admin.php:1635
 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 "S tímto označením má každý uživatel možnost označit jakékoliv ze svých kontakt jako „remote_self“ v nastavení v dialogu opravit kontakt. Tímto označením se budou zrcadlit všechny správy tohoto kontaktu v uživatelově proudu."
 
-#: mod/admin.php:1635
+#: mod/admin.php:1636
 msgid "Block multiple registrations"
 msgstr "Blokovat více registrací"
 
-#: mod/admin.php:1635
+#: mod/admin.php:1636
 msgid "Disallow users to register additional accounts for use as pages."
 msgstr "Znemožnit uživatelům registraci dodatečných účtů k použití jako stránky."
 
-#: mod/admin.php:1636
+#: mod/admin.php:1637
 msgid "Disable OpenID"
 msgstr "Zakázat OpenID"
 
-#: mod/admin.php:1636
+#: mod/admin.php:1637
 msgid "Disable OpenID support for registration and logins."
 msgstr "Zakázat podporu OpenID pro registrace a přihlášení."
 
-#: mod/admin.php:1637
+#: mod/admin.php:1638
 msgid "No Fullname check"
 msgstr "Bez kontroly celého jména"
 
-#: mod/admin.php:1637
+#: mod/admin.php:1638
 msgid ""
 "Allow users to register without a space between the first name and the last "
 "name in their full name."
 msgstr "Dovolit uživatelům se registrovat bez mezery mezi křestním jménem a příjmením ve svém celém jméně."
 
-#: mod/admin.php:1638
+#: mod/admin.php:1639
 msgid "Community pages for visitors"
 msgstr "Komunitní stránky pro návštěvníky"
 
-#: mod/admin.php:1638
+#: mod/admin.php:1639
 msgid ""
 "Which community pages should be available for visitors. Local users always "
 "see both pages."
 msgstr "Které komunitní stránky by měly být viditelné pro návštěvníky. Místní uživatelé vždy vidí obě stránky."
 
-#: mod/admin.php:1639
+#: mod/admin.php:1640
 msgid "Posts per user on community page"
 msgstr "Počet příspěvků na komunitní stránce"
 
-#: mod/admin.php:1639
+#: mod/admin.php:1640
 msgid ""
 "The maximum number of posts per user on the community page. (Not valid for "
 "'Global Community')"
 msgstr "Maximální počet příspěvků na uživatele na komunitní stránce. (neplatí pro „Globální komunitu“)"
 
-#: mod/admin.php:1640
+#: mod/admin.php:1641
 msgid "Disable OStatus support"
 msgstr "Zakázat podporu pro OStatus"
 
-#: mod/admin.php:1640
+#: mod/admin.php:1641
 msgid ""
 "Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All "
 "communications in OStatus are public, so privacy warnings will be "
 "occasionally displayed."
 msgstr "Zakázat zabudouvanou kompatibilitu s OStatus (StatusNet, GNU social apod.). Veškerá komunikace pomocí OStatus je veřejná, proto budou občas zobrazena varování o soukromí."
 
-#: mod/admin.php:1641
+#: mod/admin.php:1642
 msgid "Only import OStatus/ActivityPub threads from our contacts"
 msgstr "Pouze importovat vlákna z OStatus/ActivityPub z našich kontaktů"
 
-#: mod/admin.php:1641
+#: mod/admin.php:1642
 msgid ""
 "Normally we import every content from our OStatus and ActivityPub contacts. "
 "With this option we only store threads that are started by a contact that is"
 " known on our system."
 msgstr "Běžně importujeme všechen obsah z našich kontaktů na OStatus a ActivityPub. S touto volbou uchováváme vlákna počatá kontaktem, který je na našem systému známý."
 
-#: mod/admin.php:1642
+#: mod/admin.php:1643
 msgid "OStatus support can only be enabled if threading is enabled."
 msgstr "Podpora pro OStatus může být zapnuta pouze, je-li povolen threading."
 
-#: mod/admin.php:1644
+#: mod/admin.php:1645
 msgid ""
 "Diaspora support can't be enabled because Friendica was installed into a sub"
 " directory."
 msgstr "Podpora pro Diasporu nemůže být zapnuta, protože Friendica byla nainstalována do podadresáře."
 
-#: mod/admin.php:1645
+#: mod/admin.php:1646
 msgid "Enable Diaspora support"
 msgstr "Zapnout podporu pro Diaspora"
 
-#: mod/admin.php:1645
+#: mod/admin.php:1646
 msgid "Provide built-in Diaspora network compatibility."
 msgstr "Poskytnout zabudovanou kompatibilitu sitě Diaspora."
 
-#: mod/admin.php:1646
+#: mod/admin.php:1647
 msgid "Only allow Friendica contacts"
 msgstr "Povolit pouze kontakty z Friendica"
 
-#: mod/admin.php:1646
+#: mod/admin.php:1647
 msgid ""
 "All contacts must use Friendica protocols. All other built-in communication "
 "protocols disabled."
 msgstr "Všechny kontakty musí používat protokol Friendica. Všchny ostatní zabudované komunikační protokoly budou zablokované."
 
-#: mod/admin.php:1647
+#: mod/admin.php:1648
 msgid "Verify SSL"
 msgstr "Ověřit SSL"
 
-#: mod/admin.php:1647
+#: mod/admin.php:1648
 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 "Pokud si přejete, můžete vynutit striktní ověřování certifikátů. To znamená že se nebudete moci připojit k žádnému serveru s vlastním SSL certifikátem."
 
-#: mod/admin.php:1648
+#: mod/admin.php:1649
 msgid "Proxy user"
 msgstr "Proxy uživatel"
 
-#: mod/admin.php:1649
+#: mod/admin.php:1650
 msgid "Proxy URL"
 msgstr "Proxy URL adresa"
 
-#: mod/admin.php:1650
+#: mod/admin.php:1651
 msgid "Network timeout"
 msgstr "Čas vypršení síťového spojení (timeout)"
 
-#: mod/admin.php:1650
+#: mod/admin.php:1651
 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
 msgstr "Hodnota ve vteřinách. Nastavte 0 pro neomezeno (není doporučeno)."
 
-#: mod/admin.php:1651
+#: mod/admin.php:1652
 msgid "Maximum Load Average"
 msgstr "Maximální průměrné zatížení"
 
-#: mod/admin.php:1651
+#: mod/admin.php:1652
 msgid ""
 "Maximum system load before delivery and poll processes are deferred - "
 "default 50."
 msgstr "Maximální zatížení systému před pozastavením procesů zajišťujících doručování aktualizací - výchozí hodnota 50"
 
-#: mod/admin.php:1652
+#: mod/admin.php:1653
 msgid "Maximum Load Average (Frontend)"
 msgstr "Maximální průměrné zatížení (Frontend)"
 
-#: mod/admin.php:1652
+#: mod/admin.php:1653
 msgid "Maximum system load before the frontend quits service - default 50."
 msgstr "Maximální zatížení systému předtím, než frontend ukončí službu - výchozí hodnota 50"
 
-#: mod/admin.php:1653
+#: mod/admin.php:1654
 msgid "Minimal Memory"
 msgstr "Minimální paměť"
 
-#: mod/admin.php:1653
+#: mod/admin.php:1654
 msgid ""
 "Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
 "default 0 (deactivated)."
 msgstr "Minimální volná paměť v MB pro pracovníka. Potřebuje přístup do /proc/meminfo - výchozí hodnota 0 (deaktivováno)"
 
-#: mod/admin.php:1654
+#: mod/admin.php:1655
 msgid "Maximum table size for optimization"
 msgstr "Maximální velikost tabulky pro optimalizaci"
 
-#: mod/admin.php:1654
+#: mod/admin.php:1655
 msgid ""
 "Maximum table size (in MB) for the automatic optimization. Enter -1 to "
 "disable it."
 msgstr "Maximální velikost tabulky (v MB) pro automatickou optimalizaci. Zadáním -1 ji vypnete."
 
-#: mod/admin.php:1655
+#: mod/admin.php:1656
 msgid "Minimum level of fragmentation"
 msgstr "Minimální úroveň fragmentace"
 
-#: mod/admin.php:1655
+#: mod/admin.php:1656
 msgid ""
 "Minimum fragmenation level to start the automatic optimization - default "
 "value is 30%."
 msgstr "Minimální úroveň fragmentace pro spuštění automatické optimalizace - výchozí hodnota je 30%."
 
-#: mod/admin.php:1657
+#: mod/admin.php:1658
 msgid "Periodical check of global contacts"
 msgstr "Pravidelně ověřování globálních kontaktů"
 
-#: mod/admin.php:1657
+#: mod/admin.php:1658
 msgid ""
 "If enabled, the global contacts are checked periodically for missing or "
 "outdated data and the vitality of the contacts and servers."
 msgstr "Pokud je toto povoleno, budou globální kontakty pravidelně kontrolovány pro zastaralá data a životnost kontaktů a serverů."
 
-#: mod/admin.php:1658
+#: mod/admin.php:1659
 msgid "Days between requery"
 msgstr "Dny mezi dotazy"
 
-#: mod/admin.php:1658
+#: mod/admin.php:1659
 msgid "Number of days after which a server is requeried for his contacts."
 msgstr "Počet dnů, po kterých je server znovu dotázán na své kontakty"
 
-#: mod/admin.php:1659
+#: mod/admin.php:1660
 msgid "Discover contacts from other servers"
 msgstr "Objevit kontakty z ostatních serverů"
 
-#: mod/admin.php:1659
+#: mod/admin.php:1660
 msgid ""
 "Periodically query other servers for contacts. You can choose between "
 "'users': the users on the remote system, 'Global Contacts': active contacts "
 "that are known on the system. The fallback is meant for Redmatrix servers "
 "and older friendica servers, where global contacts weren't available. The "
-"fallback increases the server load, so the recommened setting is 'Users, "
+"fallback increases the server load, so the recommended setting is 'Users, "
 "Global Contacts'."
-msgstr "Periodicky dotazovat ostatní servery pro kontakty. Můžete si vybrat mezi možnostmi: „uživatelé“ - uživatelé na vzdáleném systému, a „globální kontakty“ - aktivní kontakty, které jsou známy na systému. Funkce fallback je určena pro servery Redmatrix a starší servery Friendica, kde globální kontakty nejsou dostupné. Fallback zvyšuje serverovou zátěž, doporučené nastavení je proto „Uživatelé, globální kontakty“."
+msgstr "Periodicky dotazovat ostatní servery pro kontakty. Můžete si vybrat mezi možnostmi: „uživatelé“ - uživatelé na vzdáleném systému, a „globální kontakty“ - aktivní kontakty, které jsou známy na systému. Funkce fallback je určena pro servery Redmatrix a starší servery Friendica, kde globální kontakty nejsou dostupné. Fallback zvyšuje serverovou zátěž, doporučené nastavení je proto „Uživatelé, globální kontakty“. "
 
-#: mod/admin.php:1660
+#: mod/admin.php:1661
 msgid "Timeframe for fetching global contacts"
 msgstr "Časový rámec pro načítání globálních kontaktů"
 
-#: mod/admin.php:1660
+#: mod/admin.php:1661
 msgid ""
 "When the discovery is activated, this value defines the timeframe for the "
 "activity of the global contacts that are fetched from other servers."
 msgstr "Pokud je aktivováno objevování, tato hodnota definuje časový rámec pro aktivitu globálních kontaktů, které jsou načteny z jiných serverů."
 
-#: mod/admin.php:1661
+#: mod/admin.php:1662
 msgid "Search the local directory"
 msgstr "Hledat  v místním adresáři"
 
-#: mod/admin.php:1661
+#: mod/admin.php:1662
 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 "Prohledat místní adresář místo globálního adresáře. Při místním prohledávání bude každé hledání provedeno v globálním adresáři na pozadí. To vylepšuje výsledky při zopakování hledání."
 
-#: mod/admin.php:1663
+#: mod/admin.php:1664
 msgid "Publish server information"
 msgstr "Zveřejnit informace o serveru"
 
-#: mod/admin.php:1663
+#: mod/admin.php:1664
 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 "
@@ -2168,50 +2167,50 @@ msgid ""
 " href='http://the-federation.info/'>the-federation.info</a> for details."
 msgstr "Pokud je toto povoleno, budou zveřejněna obecná data o serveru a jeho používání. Data obsahují jméno a verzi serveru, počet uživatelů s veřejnými profily, počet příspěvků a aktivované protokoly a konektory. Pro více informací navštivte <a href='http://the-federation.info/'>the-federation.info</a>."
 
-#: mod/admin.php:1665
+#: mod/admin.php:1666
 msgid "Check upstream version"
 msgstr "Zkontrolovat upstreamovou verzi"
 
-#: mod/admin.php:1665
+#: mod/admin.php:1666
 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 "Umožní kontrolovat nové verze Friendica na GitHubu. Pokud existuje nová verze, budete informován/a na přehledu administračního panelu."
 
-#: mod/admin.php:1666
+#: mod/admin.php:1667
 msgid "Suppress Tags"
 msgstr "Potlačit štítky"
 
-#: mod/admin.php:1666
+#: mod/admin.php:1667
 msgid "Suppress showing a list of hashtags at the end of the posting."
 msgstr "Potlačit zobrazení seznamu hastagů na konci příspěvků."
 
-#: mod/admin.php:1667
+#: mod/admin.php:1668
 msgid "Clean database"
 msgstr "Vyčistit databázi"
 
-#: mod/admin.php:1667
+#: mod/admin.php:1668
 msgid ""
 "Remove old remote items, orphaned database records and old content from some"
 " other helper tables."
 msgstr "Odstranit staré vzdálené položky, osiřelé záznamy v databázi a starý obsah z některých dalších pomocných tabulek."
 
-#: mod/admin.php:1668
+#: mod/admin.php:1669
 msgid "Lifespan of remote items"
 msgstr "Životnost vzdálených položek"
 
-#: mod/admin.php:1668
+#: mod/admin.php:1669
 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 "Pokud je zapnuto čištění databáze, tato funkce definuje počet dnů, po kterých budou smazány vzdálené položky. Vlastní položky a označené či vyplněné položky jsou vždy ponechány. Hodnota 0 tuto funkci vypíná."
 
-#: mod/admin.php:1669
+#: mod/admin.php:1670
 msgid "Lifespan of unclaimed items"
 msgstr "Životnost nevyžádaných položek"
 
-#: mod/admin.php:1669
+#: mod/admin.php:1670
 msgid ""
 "When the database cleanup is enabled, this defines the days after which "
 "unclaimed remote items (mostly content from the relay) will be deleted. "
@@ -2219,141 +2218,141 @@ msgid ""
 "items if set to 0."
 msgstr "Pokud je zapnuto čištění databáze, tato funkce definuje počet dnů, po kterých budou smazány nevyžádané vzdálené položky (většinou obsah z přeposílacího serveru). Výchozí hodnota je 90 dní. Pokud je zadaná hodnota 0, výchozí hodnotou bude obecná hodnota životnosti vzdálených položek."
 
-#: mod/admin.php:1670
+#: mod/admin.php:1671
 msgid "Lifespan of raw conversation data"
 msgstr "Životnost hrubých dat konverzací"
 
-#: mod/admin.php:1670
+#: mod/admin.php:1671
 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 "Data konverzací jsou použita pro ActivityPub a OStatus a pro účely ladění. Mělo by být bezpečné je odstranit po 14 dnech, výchozí hodnota je 90 dní."
 
-#: mod/admin.php:1671
+#: mod/admin.php:1672
 msgid "Path to item cache"
 msgstr "Cesta k položkám v mezipaměti"
 
-#: mod/admin.php:1671
+#: mod/admin.php:1672
 msgid "The item caches buffers generated bbcode and external images."
 msgstr "V mezipaměti je uložen vygenerovaný BBCode a externí obrázky."
 
-#: mod/admin.php:1672
+#: mod/admin.php:1673
 msgid "Cache duration in seconds"
 msgstr "Doba platnosti vyrovnávací paměti v sekundách"
 
-#: mod/admin.php:1672
+#: mod/admin.php:1673
 msgid ""
 "How long should the cache files be hold? Default value is 86400 seconds (One"
 " day). To disable the item cache, set the value to -1."
 msgstr "Jak dlouho by měla vyrovnávací paměť držet data? Výchozí hodnota je 86400 sekund (Jeden den). Pro vypnutí funkce vyrovnávací paměti nastavte hodnotu na -1."
 
-#: mod/admin.php:1673
+#: mod/admin.php:1674
 msgid "Maximum numbers of comments per post"
 msgstr "Maximální počet komentářů k příspěvku"
 
-#: mod/admin.php:1673
+#: mod/admin.php:1674
 msgid "How much comments should be shown for each post? Default value is 100."
 msgstr "Kolik komentářů by mělo být zobrazeno k každému příspěvku? Výchozí hodnotou je 100."
 
-#: mod/admin.php:1674
+#: mod/admin.php:1675
 msgid "Temp path"
 msgstr "Cesta k dočasným souborům"
 
-#: mod/admin.php:1674
+#: mod/admin.php:1675
 msgid ""
 "If you have a restricted system where the webserver can't access the system "
 "temp path, enter another path here."
 msgstr "Pokud máte omezený systém, kde webový server nemá přístup k systémové složce temp, zde zadejte jinou cestu."
 
-#: mod/admin.php:1675
+#: mod/admin.php:1676
 msgid "Base path to installation"
 msgstr "Základní cesta k instalaci"
 
-#: mod/admin.php:1675
+#: mod/admin.php:1676
 msgid ""
 "If the system cannot detect the correct path to your installation, enter the"
 " correct path here. This setting should only be set if you are using a "
 "restricted system and symbolic links to your webroot."
 msgstr "Pokud systém nemůže detekovat správnou cestu k Vaší instalaci, zde zadejte jinou cestu. Toto nastavení by mělo být nastaveno pouze, pokud používáte omezený systém a symbolické odkazy ke kořenové složce webu."
 
-#: mod/admin.php:1676
+#: mod/admin.php:1677
 msgid "Disable picture proxy"
 msgstr "Vypnutí obrázkové proxy"
 
-#: mod/admin.php:1676
+#: mod/admin.php:1677
 msgid ""
 "The picture proxy increases performance and privacy. It shouldn't be used on"
 " systems with very low bandwidth."
 msgstr "Obrázková proxy zvyšuje výkon a soukromí. Neměla by však být používána na systémech s velmi malou rychlostí připojení."
 
-#: mod/admin.php:1677
+#: mod/admin.php:1678
 msgid "Only search in tags"
 msgstr "Hledat pouze ve štítcích"
 
-#: mod/admin.php:1677
+#: mod/admin.php:1678
 msgid "On large systems the text search can slow down the system extremely."
 msgstr "Textové vyhledávání může u rozsáhlých systémů znamenat velmi citelné zpomalení systému."
 
-#: mod/admin.php:1679
+#: mod/admin.php:1680
 msgid "New base url"
 msgstr "Nová výchozí url adresa"
 
-#: mod/admin.php:1679
+#: mod/admin.php:1680
 msgid ""
 "Change base url for this server. Sends relocate message to all Friendica and"
 " Diaspora* contacts of all users."
 msgstr "Změnit výchozí URL adresu pro tento server. Toto odešle zprávu o přemístění všem kontaktům na Friendica a Diaspora* všech uživatelů."
 
-#: mod/admin.php:1681
+#: mod/admin.php:1682
 msgid "RINO Encryption"
 msgstr "RINO Šifrování"
 
-#: mod/admin.php:1681
+#: mod/admin.php:1682
 msgid "Encryption layer between nodes."
 msgstr "Šifrovací vrstva mezi servery."
 
-#: mod/admin.php:1681
+#: mod/admin.php:1682
 msgid "Enabled"
 msgstr "Povoleno"
 
-#: mod/admin.php:1683
+#: mod/admin.php:1684
 msgid "Maximum number of parallel workers"
 msgstr "Maximální počet paralelních pracovníků"
 
-#: mod/admin.php:1683
+#: mod/admin.php:1684
 #, php-format
 msgid ""
 "On shared hosters set this to %d. On larger systems, values of %d are great."
 " Default value is %d."
 msgstr "Na sdílených hostinzích toto nastavte na hodnotu %d. Na větších systémech se hodí hodnoty kolem %d. Výchozí hodnotou je %d."
 
-#: mod/admin.php:1684
+#: mod/admin.php:1685
 msgid "Don't use 'proc_open' with the worker"
 msgstr "Nepoužívat „proc_open“ s pracovníkem"
 
-#: mod/admin.php:1684
+#: mod/admin.php:1685
 msgid ""
 "Enable this if your system doesn't allow the use of 'proc_open'. This can "
 "happen on shared hosters. If this is enabled you should increase the "
 "frequency of worker calls in your crontab."
 msgstr "Toto zapněte, pokud Váš systém nedovoluje používání „proc_open“. To se může stát na sdíleném hostingu. Pokud je toto povoleno, bude zvýšena častost vyvolávání pracovníka v crontabu."
 
-#: mod/admin.php:1685
+#: mod/admin.php:1686
 msgid "Enable fastlane"
 msgstr "Povolit fastlane"
 
-#: mod/admin.php:1685
+#: mod/admin.php:1686
 msgid ""
 "When enabed, the fastlane mechanism starts an additional worker if processes"
 " with higher priority are blocked by processes of lower priority."
 msgstr "Pokud je toto povoleno, mechanismus fastlane spustí dodatečného pracovníka, pokud jsou procesy vyšší priority zablokované procesy nižší priority."
 
-#: mod/admin.php:1686
+#: mod/admin.php:1687
 msgid "Enable frontend worker"
 msgstr "Povolit frontendového pracovníka"
 
-#: mod/admin.php:1686
+#: mod/admin.php:1687
 #, php-format
 msgid ""
 "When enabled the Worker process is triggered when backend access is "
@@ -2363,136 +2362,136 @@ msgid ""
 " on your server."
 msgstr "Pokud je toto povoleno, bude proces pracovníka vyvolán, pokud je proveden backendový přístup (např. když jsou doručovány zprávy). Na menších stránkách možná budete chtít pravidelně vyvolávat %s/worker přes externí úlohu cron. Tuto možnost byste měl/a zapnout pouze, pokud nemůžete na Vašem serveru používat cron/plánované úlohy."
 
-#: mod/admin.php:1688
+#: mod/admin.php:1689
 msgid "Subscribe to relay"
 msgstr "Odebírat ze serveru pro přeposílání"
 
-#: mod/admin.php:1688
+#: mod/admin.php:1689
 msgid ""
 "Enables the receiving of public posts from the relay. They will be included "
 "in the search, subscribed tags and on the global community page."
 msgstr "Umožňuje přijímat veřejné příspěvky z přeposílacího serveru. Budou zahrnuty ve vyhledávání, odebíraných štítcích a na globální komunitní stránce."
 
-#: mod/admin.php:1689
+#: mod/admin.php:1690
 msgid "Relay server"
 msgstr "Server pro přeposílání (relay)"
 
-#: mod/admin.php:1689
+#: mod/admin.php:1690
 msgid ""
 "Address of the relay server where public posts should be send to. For "
 "example https://relay.diasp.org"
 msgstr "Adresa přeposílacího serveru, kam budou posílány veřejné příspěvky. Příklad: https://relay.diasp.org"
 
-#: mod/admin.php:1690
+#: mod/admin.php:1691
 msgid "Direct relay transfer"
 msgstr "Přímý přenos na server pro přeposílání"
 
-#: mod/admin.php:1690
+#: mod/admin.php:1691
 msgid ""
 "Enables the direct transfer to other servers without using the relay servers"
 msgstr "Umožňuje přímý přenos na ostatní servery bez použití přeposílacích serverů"
 
-#: mod/admin.php:1691
+#: mod/admin.php:1692
 msgid "Relay scope"
 msgstr "Rozsah příspěvků z přeposílacího serveru"
 
-#: mod/admin.php:1691
+#: mod/admin.php:1692
 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 "Může být buď „vše“ nebo „štítky“. „vše“ znamená, že budou přijaty všechny veřejné příspěvky. „štítky“ znamená, že budou přijaty pouze příspěvky s vybranými štítky."
 
-#: mod/admin.php:1691
+#: mod/admin.php:1692
 msgid "all"
 msgstr "vše"
 
-#: mod/admin.php:1691
+#: mod/admin.php:1692
 msgid "tags"
 msgstr "štítky"
 
-#: mod/admin.php:1692
+#: mod/admin.php:1693
 msgid "Server tags"
 msgstr "Serverové štítky"
 
-#: mod/admin.php:1692
+#: mod/admin.php:1693
 msgid "Comma separated list of tags for the 'tags' subscription."
 msgstr "Seznam štítků pro odběr „tags“, oddělených čárkami."
 
-#: mod/admin.php:1693
+#: mod/admin.php:1694
 msgid "Allow user tags"
 msgstr "Povolit uživatelské štítky"
 
-#: mod/admin.php:1693
+#: mod/admin.php:1694
 msgid ""
 "If enabled, the tags from the saved searches will used for the 'tags' "
 "subscription in addition to the 'relay_server_tags'."
 msgstr "Pokud je toto povoleno, budou štítky z uložených hledání vedle odběru „relay_server_tags“ použity i pro odběr „tags“."
 
-#: mod/admin.php:1696
+#: mod/admin.php:1697
 msgid "Start Relocation"
 msgstr "Začít přemístění"
 
-#: mod/admin.php:1723
+#: mod/admin.php:1724
 msgid "Update has been marked successful"
 msgstr "Aktualizace byla označena jako úspěšná."
 
-#: mod/admin.php:1730
+#: mod/admin.php:1731
 #, php-format
 msgid "Database structure update %s was successfully applied."
 msgstr "Aktualizace struktury databáze %s byla úspěšně aplikována."
 
-#: mod/admin.php:1734
+#: mod/admin.php:1735
 #, php-format
 msgid "Executing of database structure update %s failed with error: %s"
 msgstr "Provádění aktualizace databáze %s selhalo s chybou: %s"
 
-#: mod/admin.php:1750
+#: mod/admin.php:1751
 #, php-format
 msgid "Executing %s failed with error: %s"
 msgstr "Vykonávání %s selhalo s chybou: %s"
 
-#: mod/admin.php:1752
+#: mod/admin.php:1753
 #, php-format
 msgid "Update %s was successfully applied."
 msgstr "Aktualizace %s byla úspěšně aplikována."
 
-#: mod/admin.php:1755
+#: mod/admin.php:1756
 #, php-format
 msgid "Update %s did not return a status. Unknown if it succeeded."
 msgstr "Aktualizace %s nevrátila žádný stav. Není zřejmé, jestli byla úspěšná."
 
-#: mod/admin.php:1758
+#: mod/admin.php:1759
 #, php-format
 msgid "There was no additional update function %s that needed to be called."
 msgstr "Nebyla nalezena žádná další aktualizační funkce %s která by měla být volána."
 
-#: mod/admin.php:1781
+#: mod/admin.php:1782
 msgid "No failed updates."
 msgstr "Žádné neúspěšné aktualizace."
 
-#: mod/admin.php:1782
+#: mod/admin.php:1783
 msgid "Check database structure"
 msgstr "Ověřit strukturu databáze"
 
-#: mod/admin.php:1787
+#: mod/admin.php:1788
 msgid "Failed Updates"
 msgstr "Neúspěšné aktualizace"
 
-#: mod/admin.php:1788
+#: mod/admin.php:1789
 msgid ""
 "This does not include updates prior to 1139, which did not return a status."
 msgstr "To nezahrnuje aktualizace do verze 1139, které nevracejí žádný status."
 
-#: mod/admin.php:1789
+#: mod/admin.php:1790
 msgid "Mark success (if update was manually applied)"
 msgstr "Označit za úspěšné (pokud byla aktualizace aplikována manuálně)"
 
-#: mod/admin.php:1790
+#: mod/admin.php:1791
 msgid "Attempt to execute this update step automatically"
 msgstr "Pokusit se provést tuto aktualizaci automaticky."
 
-#: mod/admin.php:1830
+#: mod/admin.php:1831
 #, php-format
 msgid ""
 "\n"
@@ -2500,7 +2499,7 @@ msgid ""
 "\t\t\t\tthe administrator of %2$s has set up an account for you."
 msgstr "\n\t\t\tVážený/á %1$s,\n\t\t\t\tadministrátor %2$s pro Vás vytvořil uživatelský účet."
 
-#: mod/admin.php:1833
+#: mod/admin.php:1834
 #, php-format
 msgid ""
 "\n"
@@ -2532,12 +2531,12 @@ msgid ""
 "\t\t\tThank you and welcome to %4$s."
 msgstr "\n\t\t\tZde jsou vaše přihlašovací detaily:\n\n\t\t\tAdresa stránky:\t\t%1$s\n\t\t\tPřihlašovací jméno:\t%2$s\n\t\t\tHeslo:\t\t\t%3$s\n\n\t\t\tSvé heslo si po přihlášení můžete změnit na stránce „Nastavení“ vašeho\n\t\t\túčtu.\n\n\t\t\tProsím, prohlédněte si na chvilku ostatní nastavení účtu na této stránce.\n\n\t\t\tMožná byste si také přál/a přidat pár základních informací na svůj výchozí\n\t\t\tprofil (na stránce „Profily“) aby vás další lidé mohli snadno najít.\n\t\t\tDoporučujeme nastavit si Vaše celé jméno, přidat profilovou fotku,\n\t\t\tpřidat pár „klíčových slov“ k profilu (velmi užitečné při získávání nových\n\t\t\tpřátel) - a možná v jaké zemi žijete; pokud nechcete být konkrétnější.\n\n\t\t\tZcela respektujeme vaše právo na soukromí a žádnou z těchto položek\n\t\t\tnení potřeba vyplňovat. Pokud jste zde nový/á a nikoho zde neznáte, mohou vám\n\t\t\tpomoci si získat nové a zajímavé přátele.\n\t\t\tPokud byste si někdy přál/a smazat účet, můžete tak učinit na stránce\n\t\t\t%1$s/removeme.\n\n\t\t\tDěkujeme vám a vítáme vás na %4$s."
 
-#: mod/admin.php:1870 src/Model/User.php:858
+#: mod/admin.php:1871 src/Model/User.php:859
 #, php-format
 msgid "Registration details for %s"
 msgstr "Registrační údaje pro uživatele %s"
 
-#: mod/admin.php:1880
+#: mod/admin.php:1881
 #, php-format
 msgid "%s user blocked/unblocked"
 msgid_plural "%s users blocked/unblocked"
@@ -2546,11 +2545,11 @@ msgstr[1] "%s uživatelů blokováno/odblokováno"
 msgstr[2] "%s uživatele blokováno/odblokováno"
 msgstr[3] "%s uživatelů blokováno/odblokováno"
 
-#: mod/admin.php:1887 mod/admin.php:1941
+#: mod/admin.php:1888 mod/admin.php:1942
 msgid "You can't remove yourself"
 msgstr "Nemůžete odstranit sebe sama"
 
-#: mod/admin.php:1890
+#: mod/admin.php:1891
 #, php-format
 msgid "%s user deleted"
 msgid_plural "%s users deleted"
@@ -2559,202 +2558,202 @@ msgstr[1] "%s uživatelů smazáno"
 msgstr[2] "%s uživatele smazáno"
 msgstr[3] "%s uživatelů smazáno"
 
-#: mod/admin.php:1939
+#: mod/admin.php:1940
 #, php-format
 msgid "User '%s' deleted"
 msgstr "Uživatel „%s“ smazán"
 
-#: mod/admin.php:1950
+#: mod/admin.php:1951
 #, php-format
 msgid "User '%s' unblocked"
 msgstr "Uživatel „%s“ odblokován"
 
-#: mod/admin.php:1950
+#: mod/admin.php:1951
 #, php-format
 msgid "User '%s' blocked"
 msgstr "Uživatel „%s“ zablokován"
 
-#: mod/admin.php:1998 mod/settings.php:1049
+#: mod/admin.php:1999 mod/settings.php:1049
 msgid "Normal Account Page"
 msgstr "Normální stránka účtu"
 
-#: mod/admin.php:1999 mod/settings.php:1053
+#: mod/admin.php:2000 mod/settings.php:1053
 msgid "Soapbox Page"
 msgstr "Propagační stránka"
 
-#: mod/admin.php:2000 mod/settings.php:1057
+#: mod/admin.php:2001 mod/settings.php:1057
 msgid "Public Forum"
 msgstr "Veřejné fórum"
 
-#: mod/admin.php:2001 mod/settings.php:1061
+#: mod/admin.php:2002 mod/settings.php:1061
 msgid "Automatic Friend Page"
 msgstr "Stránka s automatickými přátely"
 
-#: mod/admin.php:2002
+#: mod/admin.php:2003
 msgid "Private Forum"
 msgstr "Soukromé fórum"
 
-#: mod/admin.php:2005 mod/settings.php:1033
+#: mod/admin.php:2006 mod/settings.php:1033
 msgid "Personal Page"
 msgstr "Osobní stránka"
 
-#: mod/admin.php:2006 mod/settings.php:1037
+#: mod/admin.php:2007 mod/settings.php:1037
 msgid "Organisation Page"
 msgstr "Stránka organizace"
 
-#: mod/admin.php:2007 mod/settings.php:1041
+#: mod/admin.php:2008 mod/settings.php:1041
 msgid "News Page"
 msgstr "Zpravodajská stránka"
 
-#: mod/admin.php:2008 mod/settings.php:1045
+#: mod/admin.php:2009 mod/settings.php:1045
 msgid "Community Forum"
 msgstr "Komunitní fórum"
 
-#: mod/admin.php:2009
+#: mod/admin.php:2010
 msgid "Relay"
 msgstr "Přeposílací server"
 
-#: mod/admin.php:2055 mod/admin.php:2066 mod/admin.php:2080 mod/admin.php:2098
+#: mod/admin.php:2056 mod/admin.php:2067 mod/admin.php:2081 mod/admin.php:2099
 #: src/Content/ContactSelector.php:86
 msgid "Email"
 msgstr "E-mail"
 
-#: mod/admin.php:2055 mod/admin.php:2080
+#: mod/admin.php:2056 mod/admin.php:2081
 msgid "Register date"
 msgstr "Datum registrace"
 
-#: mod/admin.php:2055 mod/admin.php:2080
+#: mod/admin.php:2056 mod/admin.php:2081
 msgid "Last login"
 msgstr "Datum posledního přihlášení"
 
-#: mod/admin.php:2055 mod/admin.php:2080
+#: mod/admin.php:2056 mod/admin.php:2081
 msgid "Last item"
 msgstr "Poslední položka"
 
-#: mod/admin.php:2055
+#: mod/admin.php:2056
 msgid "Type"
 msgstr "Typ"
 
-#: mod/admin.php:2062
+#: mod/admin.php:2063
 msgid "Add User"
 msgstr "Přidat uživatele"
 
-#: mod/admin.php:2064
+#: mod/admin.php:2065
 msgid "User registrations waiting for confirm"
 msgstr "Registrace uživatelů čekající na potvrzení"
 
-#: mod/admin.php:2065
+#: mod/admin.php:2066
 msgid "User waiting for permanent deletion"
 msgstr "Uživatel čekající na trvalé smazání"
 
-#: mod/admin.php:2066
+#: mod/admin.php:2067
 msgid "Request date"
 msgstr "Datum požadavku"
 
-#: mod/admin.php:2067
+#: mod/admin.php:2068
 msgid "No registrations."
 msgstr "Žádné registrace."
 
-#: mod/admin.php:2068
+#: mod/admin.php:2069
 msgid "Note from the user"
 msgstr "Poznámka od uživatele"
 
-#: mod/admin.php:2069 mod/notifications.php:183 mod/notifications.php:269
+#: mod/admin.php:2070 mod/notifications.php:183 mod/notifications.php:269
 msgid "Approve"
 msgstr "Schválit"
 
-#: mod/admin.php:2070
+#: mod/admin.php:2071
 msgid "Deny"
 msgstr "Odmítnout"
 
-#: mod/admin.php:2073
+#: mod/admin.php:2074
 msgid "User blocked"
 msgstr "Uživatel zablokován"
 
-#: mod/admin.php:2075
+#: mod/admin.php:2076
 msgid "Site admin"
 msgstr "Administrátor webu"
 
-#: mod/admin.php:2076
+#: mod/admin.php:2077
 msgid "Account expired"
 msgstr "Účtu vypršela platnost"
 
-#: mod/admin.php:2079
+#: mod/admin.php:2080
 msgid "New User"
 msgstr "Nový uživatel"
 
-#: mod/admin.php:2080
+#: mod/admin.php:2081
 msgid "Permanent deletion"
 msgstr "Trvalé smazání"
 
-#: mod/admin.php:2085
+#: mod/admin.php:2086
 msgid ""
 "Selected users will be deleted!\\n\\nEverything these users had posted on "
 "this site will be permanently deleted!\\n\\nAre you sure?"
 msgstr "Vybraní uživatelé budou smazáni!\\n\\n Vše, co tito uživatelé na těchto stránkách vytvořili, bude trvale odstraněno!\\n\\nOpravdu chcete pokračovat?"
 
-#: mod/admin.php:2086
+#: mod/admin.php:2087
 msgid ""
 "The user {0} will be deleted!\\n\\nEverything this user has posted on this "
 "site will be permanently deleted!\\n\\nAre you sure?"
 msgstr "Uživatel {0} bude smazán!\\n\\n Vše, co tento uživatel na těchto stránkách vytvořil, bude trvale odstraněno!\\n\\n Opravdu chcete pokračovat?"
 
-#: mod/admin.php:2096
+#: mod/admin.php:2097
 msgid "Name of the new user."
 msgstr "Jméno nového uživatele."
 
-#: mod/admin.php:2097
+#: mod/admin.php:2098
 msgid "Nickname"
 msgstr "Přezdívka"
 
-#: mod/admin.php:2097
+#: mod/admin.php:2098
 msgid "Nickname of the new user."
 msgstr "Přezdívka nového uživatele."
 
-#: mod/admin.php:2098
+#: mod/admin.php:2099
 msgid "Email address of the new user."
 msgstr "Emailová adresa nového uživatele."
 
-#: mod/admin.php:2140
+#: mod/admin.php:2141
 #, php-format
 msgid "Addon %s disabled."
 msgstr "Doplněk %s zakázán."
 
-#: mod/admin.php:2143
+#: mod/admin.php:2144
 #, php-format
 msgid "Addon %s enabled."
 msgstr "Doplněk %s povolen."
 
-#: mod/admin.php:2154 mod/admin.php:2404
+#: mod/admin.php:2155 mod/admin.php:2405
 msgid "Disable"
 msgstr "Zakázat"
 
-#: mod/admin.php:2157 mod/admin.php:2407
+#: mod/admin.php:2158 mod/admin.php:2408
 msgid "Enable"
 msgstr "Povolit"
 
-#: mod/admin.php:2179 mod/admin.php:2436
+#: mod/admin.php:2180 mod/admin.php:2437
 msgid "Toggle"
 msgstr "Přepnout"
 
-#: mod/admin.php:2180 mod/admin.php:2437 mod/newmember.php:20
+#: mod/admin.php:2181 mod/admin.php:2438 mod/newmember.php:20
 #: mod/settings.php:136 src/Content/Nav.php:263 view/theme/frio/theme.php:272
 msgid "Settings"
 msgstr "Nastavení"
 
-#: mod/admin.php:2187 mod/admin.php:2445
+#: mod/admin.php:2188 mod/admin.php:2446
 msgid "Author: "
 msgstr "Autor: "
 
-#: mod/admin.php:2188 mod/admin.php:2446
+#: mod/admin.php:2189 mod/admin.php:2447
 msgid "Maintainer: "
 msgstr "Správce: "
 
-#: mod/admin.php:2240
+#: mod/admin.php:2241
 msgid "Reload active addons"
 msgstr "Znovu načíst aktivní doplňky"
 
-#: mod/admin.php:2245
+#: mod/admin.php:2246
 #, php-format
 msgid ""
 "There are currently no addons available on your node. You can find the "
@@ -2762,70 +2761,70 @@ msgid ""
 " the open addon registry at %2$s"
 msgstr "Aktuálně nejsou na Vašem serveru k dispozici žádné doplňky. Oficiální repozitář doplňků najdete na %1$s a další zajímavé doplňky můžete najít v otevřeném registru doplňků na %2$s"
 
-#: mod/admin.php:2366
+#: mod/admin.php:2367
 msgid "No themes found."
 msgstr "Nenalezeny žádné motivy."
 
-#: mod/admin.php:2427
+#: mod/admin.php:2428
 msgid "Screenshot"
 msgstr "Snímek obrazovky"
 
-#: mod/admin.php:2481
+#: mod/admin.php:2482
 msgid "Reload active themes"
 msgstr "Znovu načíst aktivní motivy"
 
-#: mod/admin.php:2486
+#: mod/admin.php:2487
 #, php-format
 msgid "No themes found on the system. They should be placed in %1$s"
 msgstr "V systému nebyly nalezeny žádné motivy. Měly by být uloženy v %1$s"
 
-#: mod/admin.php:2487
+#: mod/admin.php:2488
 msgid "[Experimental]"
 msgstr "[Experimentální]"
 
-#: mod/admin.php:2488
+#: mod/admin.php:2489
 msgid "[Unsupported]"
 msgstr "[Nepodporováno]"
 
-#: mod/admin.php:2513
+#: mod/admin.php:2514
 msgid "Log settings updated."
 msgstr "Nastavení záznamů aktualizována."
 
-#: mod/admin.php:2546
+#: mod/admin.php:2547
 msgid "PHP log currently enabled."
 msgstr "PHP záznamy jsou aktuálně povolené."
 
-#: mod/admin.php:2548
+#: mod/admin.php:2549
 msgid "PHP log currently disabled."
 msgstr "PHP záznamy jsou aktuálně zakázané."
 
-#: mod/admin.php:2557
+#: mod/admin.php:2558
 msgid "Clear"
 msgstr "Vyčistit"
 
-#: mod/admin.php:2561
+#: mod/admin.php:2562
 msgid "Enable Debugging"
 msgstr "Povolit ladění"
 
-#: mod/admin.php:2562
+#: mod/admin.php:2563
 msgid "Log file"
 msgstr "Soubor se záznamem"
 
-#: mod/admin.php:2562
+#: mod/admin.php:2563
 msgid ""
 "Must be writable by web server. Relative to your Friendica top-level "
 "directory."
 msgstr "Musí být zapisovatelný webovým serverem. Cesta relativní k vašemu kořenovému adresáři Friendica."
 
-#: mod/admin.php:2563
+#: mod/admin.php:2564
 msgid "Log level"
 msgstr "Úroveň auditu"
 
-#: mod/admin.php:2565
+#: mod/admin.php:2566
 msgid "PHP logging"
 msgstr "Záznamování PHP"
 
-#: mod/admin.php:2566
+#: mod/admin.php:2567
 msgid ""
 "To temporarily enable logging of PHP errors and warnings you can prepend the"
 " following to the index.php file of your installation. The filename set in "
@@ -2834,34 +2833,34 @@ msgid ""
 "'display_errors' is to enable these options, set to '0' to disable them."
 msgstr "Pro dočasné umožnění zaznamenávání PHP chyb a varování, můžete přidat do souboru index.php na vaší instalaci následující: Název souboru nastavený v řádku „error_log“ je relativní ke kořenovému adresáři Friendica a webový server musí mít povolení na něj zapisovat. Možnost „1“ pro „log_errors“ a „display_errors“ tyto funkce povoluje, nastavením hodnoty na „0“ je zakážete. "
 
-#: mod/admin.php:2598
+#: mod/admin.php:2599
 #, php-format
 msgid ""
 "Error trying to open <strong>%1$s</strong> log file.\\r\\n<br/>Check to see "
 "if file %1$s exist and is readable."
 msgstr "Chyba při otevírání záznamu <strong>%1$s</strong>.\\r\\n<br/>Zkontrolujte, jestli soubor %1$s existuje a může se číst."
 
-#: mod/admin.php:2602
+#: mod/admin.php:2603
 #, php-format
 msgid ""
 "Couldn't open <strong>%1$s</strong> log file.\\r\\n<br/>Check to see if file"
 " %1$s is readable."
 msgstr "Nelze otevřít záznam <strong>%1$s</strong>.\\r\\n<br/>Zkontrolujte, jestli se soubor %1$s může číst."
 
-#: mod/admin.php:2695 mod/admin.php:2696 mod/settings.php:763
+#: mod/admin.php:2696 mod/admin.php:2697 mod/settings.php:763
 msgid "Off"
 msgstr "Vyp"
 
-#: mod/admin.php:2695 mod/admin.php:2696 mod/settings.php:763
+#: mod/admin.php:2696 mod/admin.php:2697 mod/settings.php:763
 msgid "On"
 msgstr "Zap"
 
-#: mod/admin.php:2696
+#: mod/admin.php:2697
 #, php-format
 msgid "Lock feature %s"
 msgstr "Uzamknout vlastnost %s"
 
-#: mod/admin.php:2704
+#: mod/admin.php:2705
 msgid "Manage Additional Features"
 msgstr "Spravovat další funkce"
 
@@ -2902,7 +2901,7 @@ msgstr "Chcete umožnit této aplikaci přístup k vašim příspěvkům a konta
 msgid "No"
 msgstr "Ne"
 
-#: mod/apps.php:15 src/App.php:1351
+#: mod/apps.php:15 src/App.php:1349
 msgid "You must be logged in to use addons. "
 msgstr "Pro použití doplňků musíte být přihlášen/a."
 
@@ -3036,7 +3035,7 @@ msgid "Access denied."
 msgstr "Přístup odmítnut."
 
 #: mod/cal.php:46 mod/dfrn_poll.php:486 mod/help.php:68
-#: mod/viewcontacts.php:34 src/App.php:1402
+#: mod/viewcontacts.php:34 src/App.php:1400
 msgid "Page not found."
 msgstr "Stránka nenalezena"
 
@@ -3062,21 +3061,21 @@ msgstr "Předchozí"
 msgid "Next"
 msgstr "Dále"
 
-#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:429
+#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:428
 msgid "today"
 msgstr "dnes"
 
-#: mod/cal.php:280 mod/events.php:394 src/Model/Event.php:430
+#: mod/cal.php:280 mod/events.php:394 src/Model/Event.php:429
 #: src/Util/Temporal.php:314
 msgid "month"
 msgstr "měsíc"
 
-#: mod/cal.php:281 mod/events.php:395 src/Model/Event.php:431
+#: mod/cal.php:281 mod/events.php:395 src/Model/Event.php:430
 #: src/Util/Temporal.php:315
 msgid "week"
 msgstr "týden"
 
-#: mod/cal.php:282 mod/events.php:396 src/Model/Event.php:432
+#: mod/cal.php:282 mod/events.php:396 src/Model/Event.php:431
 #: src/Util/Temporal.php:316
 msgid "day"
 msgstr "den"
@@ -3085,7 +3084,7 @@ msgstr "den"
 msgid "list"
 msgstr "seznam"
 
-#: mod/cal.php:296 src/Core/Console/NewPassword.php:67 src/Model/User.php:323
+#: mod/cal.php:296 src/Core/Console/NewPassword.php:67 src/Model/User.php:324
 msgid "User not found"
 msgstr "Uživatel nenalezen."
 
@@ -3161,106 +3160,110 @@ msgid ""
 "code or the translation of Friendica. Thank you all!"
 msgstr "Friendica je komunitní projekt, který by nebyl možný bez pomoci mnoha lidí. Zde je seznam těch, kteří přispěli ke kódu nebo k překladu Friendica. Děkujeme všem!"
 
-#: mod/crepair.php:90
+#: mod/crepair.php:79
 msgid "Contact settings applied."
 msgstr "Nastavení kontaktu změněno"
 
-#: mod/crepair.php:92
+#: mod/crepair.php:81
 msgid "Contact update failed."
 msgstr "Aktualizace kontaktu selhala."
 
-#: mod/crepair.php:113 mod/dfrn_confirm.php:127 mod/fsuggest.php:28
+#: mod/crepair.php:102 mod/dfrn_confirm.php:127 mod/fsuggest.php:28
 #: mod/fsuggest.php:89 mod/redir.php:31 mod/redir.php:137
 msgid "Contact not found."
 msgstr "Kontakt nenalezen."
 
-#: mod/crepair.php:117
+#: mod/crepair.php:115
 msgid ""
 "<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
 " information your communications with this contact may stop working."
 msgstr "<strong>VAROVÁNÍ: Toto je velmi pokročilé</strong> a pokud zadáte nesprávné informace, vaše komunikace s tímto kontaktem může přestat fungovat."
 
-#: mod/crepair.php:118
+#: mod/crepair.php:116
 msgid ""
 "Please use your browser 'Back' button <strong>now</strong> if you are "
 "uncertain what to do on this page."
 msgstr "Prosím použijte <strong>ihned</strong> v prohlížeči tlačítko „zpět“ pokud si nejste jisti, co dělat na této stránce."
 
-#: mod/crepair.php:132 mod/crepair.php:134
+#: mod/crepair.php:130 mod/crepair.php:132
 msgid "No mirroring"
 msgstr "Žádné zrcadlení"
 
-#: mod/crepair.php:132
+#: mod/crepair.php:130
 msgid "Mirror as forwarded posting"
 msgstr "Zrcadlit pro přeposlané příspěvky"
 
-#: mod/crepair.php:132 mod/crepair.php:134
+#: mod/crepair.php:130 mod/crepair.php:132
 msgid "Mirror as my own posting"
 msgstr "Zrcadlit jako mé vlastní příspěvky"
 
-#: mod/crepair.php:147
+#: mod/crepair.php:145
 msgid "Return to contact editor"
 msgstr "Zpět k editoru kontaktu"
 
-#: mod/crepair.php:149
+#: mod/crepair.php:147
 msgid "Refetch contact data"
 msgstr "Znovu načíst data kontaktu"
 
-#: mod/crepair.php:151 mod/events.php:553 mod/fsuggest.php:106
+#: mod/crepair.php:149 mod/events.php:553 mod/fsuggest.php:106
 #: mod/invite.php:154 mod/localtime.php:56 mod/manage.php:182
 #: mod/message.php:261 mod/message.php:441 mod/photos.php:1049
 #: mod/photos.php:1137 mod/photos.php:1412 mod/photos.php:1457
 #: mod/photos.php:1496 mod/photos.php:1556 mod/poke.php:188
 #: mod/profiles.php:562 src/Module/Contact.php:594 src/Module/Install.php:187
-#: src/Module/Install.php:222 src/Object/Post.php:867
+#: src/Module/Install.php:222 src/Object/Post.php:874
 #: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:119
 #: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
 msgid "Submit"
 msgstr "Odeslat"
 
-#: mod/crepair.php:152
+#: mod/crepair.php:150
 msgid "Remote Self"
 msgstr "Vzdálené zrcadlení"
 
-#: mod/crepair.php:155
+#: mod/crepair.php:153
 msgid "Mirror postings from this contact"
 msgstr "Zrcadlení příspěvků od tohoto kontaktu"
 
-#: mod/crepair.php:157
+#: mod/crepair.php:155
 msgid ""
 "Mark this contact as remote_self, this will cause friendica to repost new "
 "entries from this contact."
 msgstr "Označit tento kontakt jako „remote_self“, s tímto nastavením bude Friendica znovupublikovat všechny nové příspěvky od tohoto kontaktu."
 
-#: mod/crepair.php:162
+#: mod/crepair.php:160
 msgid "Account Nickname"
 msgstr "Přezdívka účtu"
 
-#: mod/crepair.php:163
+#: mod/crepair.php:161
 msgid "@Tagname - overrides Name/Nickname"
 msgstr "@jménoštítku- upřednostněno před jménem/přezdívkou"
 
-#: mod/crepair.php:164
+#: mod/crepair.php:162
 msgid "Account URL"
 msgstr "URL adresa účtu"
 
-#: mod/crepair.php:165
+#: mod/crepair.php:163
+msgid "Account URL Alias"
+msgstr "Alias URL adresy účtu"
+
+#: mod/crepair.php:164
 msgid "Friend Request URL"
 msgstr "URL požadavku o přátelství"
 
-#: mod/crepair.php:166
+#: mod/crepair.php:165
 msgid "Friend Confirm URL"
 msgstr "URL adresa pro potvrzení přátelství"
 
-#: mod/crepair.php:167
+#: mod/crepair.php:166
 msgid "Notification Endpoint URL"
 msgstr "URL adresa koncového bodu oznámení"
 
-#: mod/crepair.php:168
+#: mod/crepair.php:167
 msgid "Poll/Feed URL"
 msgstr "URL adresa poll/feed"
 
-#: mod/crepair.php:169
+#: mod/crepair.php:168
 msgid "New photo from this URL"
 msgstr "Nová fotka z této URL adresy"
 
@@ -3402,7 +3405,7 @@ msgid "Unable to update your contact profile details on our system"
 msgstr "Nelze aktualizovat váš profil v našem systému"
 
 #: mod/dfrn_confirm.php:612 mod/dfrn_request.php:560
-#: src/Model/Contact.php:2026
+#: src/Model/Contact.php:2043
 msgid "[Name Withheld]"
 msgstr "[Jméno odepřeno]"
 
@@ -3478,7 +3481,7 @@ msgstr "Zřejmě jste s %s již přátelé."
 msgid "Invalid profile URL."
 msgstr "Neplatné URL profilu."
 
-#: mod/dfrn_request.php:340 src/Model/Contact.php:1697
+#: mod/dfrn_request.php:340 src/Model/Contact.php:1714
 msgid "Disallowed profile URL."
 msgstr "Nepovolené URL profilu."
 
@@ -3588,8 +3591,8 @@ msgid "Submit Request"
 msgstr "Odeslat požadavek"
 
 #: mod/directory.php:154 mod/events.php:541 mod/notifications.php:253
-#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:438
-#: src/Model/Event.php:934 src/Model/Profile.php:443
+#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:437
+#: src/Model/Event.php:933 src/Model/Profile.php:443
 #: src/Module/Contact.php:643
 msgid "Location:"
 msgstr "Poloha:"
@@ -3829,45 +3832,45 @@ msgstr "Štítky:"
 msgid "Status Messages and Posts"
 msgstr "Stavové zprávy a příspěvky "
 
-#: mod/friendica.php:87
+#: mod/friendica.php:88
 #, php-format
 msgid ""
 "This is Friendica, version %s that is running at the web location %s. The "
 "database version is %s, the post update version is %s."
 msgstr "Tohle je Friendica, verze %s, běžící na webové adrese %s. Verze databáze je %s, verze post update je %s."
 
-#: mod/friendica.php:93
+#: mod/friendica.php:94
 msgid ""
 "Please visit <a href=\"https://friendi.ca\">Friendi.ca</a> to learn more "
 "about the Friendica project."
 msgstr "Pro více informací o projektu Friendica, prosím, navštivte stránku <a href=\"https://friendi.ca\">Friendi.ca</a>"
 
-#: mod/friendica.php:97
+#: mod/friendica.php:98
 msgid "Bug reports and issues: please visit"
 msgstr "Pro hlášení chyb a námětů na změny prosím navštivte"
 
-#: mod/friendica.php:97
+#: mod/friendica.php:98
 msgid "the bugtracker at github"
 msgstr "sledování chyb na GitHubu"
 
-#: mod/friendica.php:100
+#: mod/friendica.php:101
 msgid "Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca"
 msgstr "Návrhy, pochvaly atd. prosím posílejte na adresu „info“ zavináč „friendi“-tečka-„ca“"
 
-#: mod/friendica.php:105
+#: mod/friendica.php:106
 msgid "Installed addons/apps:"
 msgstr "Nainstalované doplňky/aplikace:"
 
-#: mod/friendica.php:119
+#: mod/friendica.php:120
 msgid "No installed addons/apps"
 msgstr "Žádne nainstalované doplňky/aplikace"
 
-#: mod/friendica.php:124
+#: mod/friendica.php:125
 #, php-format
 msgid "Read about the <a href=\"%1$s/tos\">Terms of Service</a> of this node."
 msgstr "Přečtěte si o <a href=\"%1$s/tos\">Podmínkách používání</a> tohoto serveru."
 
-#: mod/friendica.php:129
+#: mod/friendica.php:130
 msgid "On this server the following remote servers are blocked."
 msgstr "Na tomto serveru jsou zablokovány následující vzdálené servery."
 
@@ -3900,7 +3903,7 @@ msgstr "Skupina nenalezena."
 msgid "Group name changed."
 msgstr "Název skupiny byl změněn."
 
-#: mod/group.php:85 mod/profperm.php:30 src/App.php:1481
+#: mod/group.php:85 mod/profperm.php:30 src/App.php:1479
 msgid "Permission denied"
 msgstr "Nedostatečné oprávnění"
 
@@ -3977,7 +3980,7 @@ msgstr "Nápověda:"
 msgid "Help"
 msgstr "Nápověda"
 
-#: mod/help.php:65 src/App.php:1399
+#: mod/help.php:65 src/App.php:1397
 msgid "Not Found"
 msgstr "Nenalezeno"
 
@@ -4128,7 +4131,7 @@ msgstr "Pokud nechcete dostávat tyto zprávy, kontaktujte prosím odesílatele
 msgid "%s posted an update."
 msgstr "%s poslal/a aktualizaci."
 
-#: mod/localtime.php:19 src/Model/Event.php:34 src/Model/Event.php:848
+#: mod/localtime.php:19 src/Model/Event.php:34 src/Model/Event.php:847
 msgid "l F d, Y \\@ g:i A"
 msgstr "l d. F, Y v g:i A"
 
@@ -4902,7 +4905,7 @@ msgstr "úspěch"
 msgid "failed"
 msgstr "selhalo"
 
-#: mod/ostatus_subscribe.php:89 src/Object/Post.php:282
+#: mod/ostatus_subscribe.php:89 src/Object/Post.php:283
 msgid "ignored"
 msgstr "ignorován"
 
@@ -5059,7 +5062,7 @@ msgstr "Upravit fotku"
 msgid "Use as profile photo"
 msgstr "Použít jako profilovou fotku"
 
-#: mod/photos.php:1297 src/Object/Post.php:155
+#: mod/photos.php:1297 src/Object/Post.php:156
 msgid "Private Message"
 msgstr "Soukromá zpráva"
 
@@ -5104,21 +5107,21 @@ msgstr "Otáčet po směru hodinových ručiček (doprava)"
 msgid "Rotate CCW (left)"
 msgstr "Otáčet proti směru hodinových ručiček (doleva)"
 
-#: mod/photos.php:1438 src/Object/Post.php:310
+#: mod/photos.php:1438 src/Object/Post.php:311
 msgid "I like this (toggle)"
 msgstr "To se mi líbí (přepínat)"
 
-#: mod/photos.php:1439 src/Object/Post.php:311
+#: mod/photos.php:1439 src/Object/Post.php:312
 msgid "I don't like this (toggle)"
 msgstr "To se mi nelíbí (přepínat)"
 
 #: mod/photos.php:1454 mod/photos.php:1493 mod/photos.php:1553
-#: src/Module/Contact.php:1018 src/Object/Post.php:864
+#: src/Module/Contact.php:1018 src/Object/Post.php:871
 msgid "This is you"
 msgstr "Tohle jste vy"
 
 #: mod/photos.php:1456 mod/photos.php:1495 mod/photos.php:1555
-#: src/Object/Post.php:416 src/Object/Post.php:866
+#: src/Object/Post.php:417 src/Object/Post.php:873
 msgid "Comment"
 msgstr "Okomentovat"
 
@@ -5766,7 +5769,7 @@ msgstr "Nemůžete upravit tuto aplikaci."
 msgid "Connected Apps"
 msgstr "Připojené aplikace"
 
-#: mod/settings.php:725 src/Object/Post.php:165 src/Object/Post.php:167
+#: mod/settings.php:725 src/Object/Post.php:166 src/Object/Post.php:168
 msgid "Edit"
 msgstr "Upravit"
 
@@ -5948,11 +5951,11 @@ msgstr "%s - (Nepodporováno)"
 msgid "%s - (Experimental)"
 msgstr "%s - (Experimentální)"
 
-#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:396
+#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:395
 msgid "Sunday"
 msgstr "neděle"
 
-#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:397
+#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:396
 msgid "Monday"
 msgstr "pondělí"
 
@@ -6598,7 +6601,7 @@ msgstr "Odstranit video"
 msgid "No videos selected"
 msgstr "Není vybráno žádné video"
 
-#: mod/videos.php:309 src/Model/Item.php:3435
+#: mod/videos.php:309 src/Model/Item.php:3453
 msgid "View Video"
 msgstr "Zobrazit video"
 
@@ -6679,15 +6682,11 @@ msgstr "Fotky na zdi"
 msgid "Delete this item?"
 msgstr "Odstranit tuto položku?"
 
-#: src/App.php:667
-msgid "show fewer"
-msgstr "zobrazit méně"
-
-#: src/App.php:709
+#: src/App.php:707
 msgid "toggle mobile"
 msgstr "přepínat mobilní zobrazení"
 
-#: src/App.php:1077
+#: src/App.php:1075
 msgid "No system theme config value set."
 msgstr "Není nastavena konfigurační hodnota systémového motivu."
 
@@ -6917,7 +6916,7 @@ msgstr "Nevěrný/á"
 msgid "Sex Addict"
 msgstr "Posedlý/á sexem"
 
-#: src/Content/ContactSelector.php:241 src/Model/User.php:701
+#: src/Content/ContactSelector.php:241 src/Model/User.php:702
 msgid "Friends"
 msgstr "Přátelé"
 
@@ -7048,79 +7047,89 @@ msgid ""
 "Add/remove mention when a forum page is selected/deselected in ACL window."
 msgstr "Přidat/odstranit zmínku, když je stránka na fóru označena/odznačena v okně ACL."
 
-#: src/Content/Feature.php:97
+#: src/Content/Feature.php:93
+msgid "Explicit Mentions"
+msgstr "Výslovné zmínky"
+
+#: src/Content/Feature.php:93
+msgid ""
+"Add explicit mentions to comment box for manual control over who gets "
+"mentioned in replies."
+msgstr "Přidá do pole pro komentování výslovné zmínky pro ruční kontrolu nad tím, koho zmíníte v odpovědích."
+
+#: src/Content/Feature.php:98
 msgid "Network Sidebar"
 msgstr "Síťová postranní lišta"
 
-#: src/Content/Feature.php:98
+#: src/Content/Feature.php:99
 msgid "Ability to select posts by date ranges"
 msgstr "Možnost označit příspěvky dle časového intervalu"
 
-#: src/Content/Feature.php:99
+#: src/Content/Feature.php:100
 msgid "Protocol Filter"
 msgstr "Filtr protokolů"
 
-#: src/Content/Feature.php:99
+#: src/Content/Feature.php:100
 msgid "Enable widget to display Network posts only from selected protocols"
 msgstr "Povolením této funkce se budou zobrazovat síťové příspěvky pouze z vybraných protokolů"
 
-#: src/Content/Feature.php:104
+#: src/Content/Feature.php:105
 msgid "Network Tabs"
 msgstr "Síťové záložky"
 
-#: src/Content/Feature.php:105
+#: src/Content/Feature.php:106
 msgid "Network New Tab"
 msgstr "Síťová záložka Nové"
 
-#: src/Content/Feature.php:105
+#: src/Content/Feature.php:106
 msgid "Enable tab to display only new Network posts (from the last 12 hours)"
 msgstr "Povolit záložku pro zobrazení pouze nových příspěvků (za posledních 12 hodin)"
 
-#: src/Content/Feature.php:106
+#: src/Content/Feature.php:107
 msgid "Network Shared Links Tab"
 msgstr "Síťová záložka Sdílené odkazy "
 
-#: src/Content/Feature.php:106
+#: src/Content/Feature.php:107
 msgid "Enable tab to display only Network posts with links in them"
 msgstr "Povolit záložky pro zobrazování pouze Síťových příspěvků s vazbou na ně"
 
-#: src/Content/Feature.php:111
+#: src/Content/Feature.php:112
 msgid "Post/Comment Tools"
 msgstr "Nástroje příspěvků/komentářů"
 
-#: src/Content/Feature.php:112
+#: src/Content/Feature.php:113
 msgid "Post Categories"
 msgstr "Kategorie příspěvků"
 
-#: src/Content/Feature.php:112
+#: src/Content/Feature.php:113
 msgid "Add categories to your posts"
 msgstr "Přidat kategorie k vašim příspěvkům"
 
-#: src/Content/Feature.php:117
+#: src/Content/Feature.php:118
 msgid "Advanced Profile Settings"
 msgstr "Pokročilá nastavení profilu"
 
-#: src/Content/Feature.php:118
+#: src/Content/Feature.php:119
 msgid "List Forums"
 msgstr "Vypsat fóra"
 
-#: src/Content/Feature.php:118
+#: src/Content/Feature.php:119
 msgid "Show visitors public community forums at the Advanced Profile Page"
 msgstr "Zobrazit návštěvníkům veřejná komunitní fóra na stránce pokročilého profilu"
 
-#: src/Content/Feature.php:119
+#: src/Content/Feature.php:120
 msgid "Tag Cloud"
 msgstr "Štítkový oblak"
 
-#: src/Content/Feature.php:119
+#: src/Content/Feature.php:120
 msgid "Provide a personal tag cloud on your profile page"
 msgstr "Poskytne na vaší profilové stránce osobní „štítkový oblak“"
 
-#: src/Content/Feature.php:120
+#: src/Content/Feature.php:121
 msgid "Display Membership Date"
 msgstr "Zobrazit datum členství"
 
-#: src/Content/Feature.php:120
+#: src/Content/Feature.php:121
 msgid "Display membership date in profile"
 msgstr "Zobrazit v profilu datum připojení"
 
@@ -7408,8 +7417,8 @@ msgstr "Konec"
 msgid "Follow"
 msgstr "Sledovat"
 
-#: src/Content/Text/HTML.php:951 src/Model/Item.php:3485
-#: src/Model/Item.php:3496
+#: src/Content/Text/HTML.php:951 src/Model/Item.php:3503
+#: src/Model/Item.php:3514
 msgid "Click to open/close"
 msgstr "Kliknutím otevřete/zavřete"
 
@@ -7595,29 +7604,29 @@ msgstr "Provést čekající aktualizace příspěvků."
 msgid "All pending post updates are done."
 msgstr "Všechny čekající aktualizace příspěvků jsou hotové."
 
-#: src/Core/Installer.php:162
+#: src/Core/Installer.php:163
 msgid ""
 "The database configuration file \"config/local.config.php\" could not be "
 "written. Please use the enclosed text to create a configuration file in your"
 " web server root."
 msgstr "Databázový konfigurační soubor „config/local.config.php“ nemohl být zapsán. Prosím, použijte přiložený text k vytvoření konfiguračního souboru v kořenovém adresáři vašeho webového serveru."
 
-#: src/Core/Installer.php:181
+#: src/Core/Installer.php:182
 msgid ""
 "You may need to import the file \"database.sql\" manually using phpmyadmin "
 "or mysql."
 msgstr "Nejspíše budete muset manuálně importovat soubor „database.sql“ pomocí phpMyAdmin či MySQL."
 
-#: src/Core/Installer.php:182 src/Module/Install.php:132
+#: src/Core/Installer.php:183 src/Module/Install.php:132
 #: src/Module/Install.php:263
 msgid "Please see the file \"INSTALL.txt\"."
 msgstr "Přečtěte si prosím informace v souboru „INSTALL.txt“."
 
-#: src/Core/Installer.php:243
+#: src/Core/Installer.php:244
 msgid "Could not find a command line version of PHP in the web server PATH."
 msgstr "Nelze najít verzi PHP pro příkazový řádek v PATH webového serveru."
 
-#: src/Core/Installer.php:244
+#: src/Core/Installer.php:245
 msgid ""
 "If you don't have a command line version of PHP installed on your server, "
 "you will not be able to run the background processing. See <a "
@@ -7625,358 +7634,358 @@ msgid ""
 "up-the-worker'>'Setup the worker'</a>"
 msgstr "Pokud nemáte na vašem serveru nainstalovanou verzi PHP pro příkazový řádek, nebudete moci spouštět procesy v pozadí. Více na <a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-worker'>„Nastavte pracovníka“</a>"
 
-#: src/Core/Installer.php:248
+#: src/Core/Installer.php:249
 msgid "PHP executable path"
 msgstr "Cesta ke spustitelnému souboru PHP"
 
-#: src/Core/Installer.php:248
+#: src/Core/Installer.php:249
 msgid ""
 "Enter full path to php executable. You can leave this blank to continue the "
 "installation."
 msgstr "Zadejte plnou cestu ke spustitelnému souboru PHP. Tento údaj můžete ponechat nevyplněný a pokračovat v instalaci."
 
-#: src/Core/Installer.php:253
+#: src/Core/Installer.php:254
 msgid "Command line PHP"
 msgstr "Příkazový řádek PHP"
 
-#: src/Core/Installer.php:262
+#: src/Core/Installer.php:263
 msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
 msgstr "PHP executable není php cli binary (může být verze cgi-fgci)"
 
-#: src/Core/Installer.php:263
+#: src/Core/Installer.php:264
 msgid "Found PHP version: "
 msgstr "Nalezena verze PHP:"
 
-#: src/Core/Installer.php:265
+#: src/Core/Installer.php:266
 msgid "PHP cli binary"
 msgstr "PHP cli binary"
 
-#: src/Core/Installer.php:278
+#: src/Core/Installer.php:279
 msgid ""
 "The command line version of PHP on your system does not have "
 "\"register_argc_argv\" enabled."
 msgstr "Verze PHP pro příkazový řádek na vašem systému nemá povoleno nastavení „register_argc_argv“."
 
-#: src/Core/Installer.php:279
+#: src/Core/Installer.php:280
 msgid "This is required for message delivery to work."
 msgstr "Toto je nutné pro fungování doručování zpráv."
 
-#: src/Core/Installer.php:284
+#: src/Core/Installer.php:285
 msgid "PHP register_argc_argv"
 msgstr "PHP register_argc_argv"
 
-#: src/Core/Installer.php:316
+#: src/Core/Installer.php:317
 msgid ""
 "Error: the \"openssl_pkey_new\" function on this system is not able to "
 "generate encryption keys"
 msgstr "Chyba: funkce „openssl_pkey_new“ na tomto systému není schopna generovat šifrovací klíče"
 
-#: src/Core/Installer.php:317
+#: src/Core/Installer.php:318
 msgid ""
 "If running under Windows, please see "
 "\"http://www.php.net/manual/en/openssl.installation.php\"."
 msgstr "Pokud systém běží na Windows, prosím přečtěte si „http://www.php.net/manual/en/openssl.installation.php“."
 
-#: src/Core/Installer.php:320
+#: src/Core/Installer.php:321
 msgid "Generate encryption keys"
 msgstr "Generovat šifrovací klíče"
 
-#: src/Core/Installer.php:371
+#: src/Core/Installer.php:372
 msgid ""
 "Error: Apache webserver mod-rewrite module is required but not installed."
 msgstr "Chyba: Modul mod_rewrite webového serveru Apache je vyadován, ale není nainstalován."
 
-#: src/Core/Installer.php:376
+#: src/Core/Installer.php:377
 msgid "Apache mod_rewrite module"
 msgstr "Modul Apache mod_rewrite"
 
-#: src/Core/Installer.php:382
+#: src/Core/Installer.php:383
 msgid "Error: PDO or MySQLi PHP module required but not installed."
 msgstr "Chyba: PHP modul PDO nebo MySQLi je vyžadován, ale není nainstalován."
 
-#: src/Core/Installer.php:387
+#: src/Core/Installer.php:388
 msgid "Error: The MySQL driver for PDO is not installed."
 msgstr "Chyba: Ovladač MySQL pro PDO není nainstalován"
 
-#: src/Core/Installer.php:391
+#: src/Core/Installer.php:392
 msgid "PDO or MySQLi PHP module"
 msgstr "PHP modul PDO nebo MySQLi"
 
-#: src/Core/Installer.php:399
+#: src/Core/Installer.php:400
 msgid "Error, XML PHP module required but not installed."
 msgstr "Chyba: PHP modul XML je vyžadován, ale není nainstalován"
 
-#: src/Core/Installer.php:403
+#: src/Core/Installer.php:404
 msgid "XML PHP module"
 msgstr "PHP modul XML"
 
-#: src/Core/Installer.php:406
+#: src/Core/Installer.php:407
 msgid "libCurl PHP module"
 msgstr "PHP modul libCurl"
 
-#: src/Core/Installer.php:407
+#: src/Core/Installer.php:408
 msgid "Error: libCURL PHP module required but not installed."
 msgstr "Chyba: PHP modul libcurl je vyžadován, ale není nainstalován."
 
-#: src/Core/Installer.php:413
+#: src/Core/Installer.php:414
 msgid "GD graphics PHP module"
 msgstr "PHP modul GD graphics"
 
-#: src/Core/Installer.php:414
+#: src/Core/Installer.php:415
 msgid ""
 "Error: GD graphics PHP module with JPEG support required but not installed."
 msgstr "Chyba: PHP modul GD graphics je vyžadován, ale není nainstalován."
 
-#: src/Core/Installer.php:420
+#: src/Core/Installer.php:421
 msgid "OpenSSL PHP module"
 msgstr "PHP modul OpenSSL"
 
-#: src/Core/Installer.php:421
+#: src/Core/Installer.php:422
 msgid "Error: openssl PHP module required but not installed."
 msgstr "Chyba: PHP modul openssl je vyžadován, ale není nainstalován."
 
-#: src/Core/Installer.php:427
+#: src/Core/Installer.php:428
 msgid "mb_string PHP module"
 msgstr "PHP modul mb_string"
 
-#: src/Core/Installer.php:428
+#: src/Core/Installer.php:429
 msgid "Error: mb_string PHP module required but not installed."
 msgstr "Chyba: PHP modul mb_string  je vyžadován, ale není nainstalován."
 
-#: src/Core/Installer.php:434
+#: src/Core/Installer.php:435
 msgid "iconv PHP module"
 msgstr "PHP modul iconv"
 
-#: src/Core/Installer.php:435
+#: src/Core/Installer.php:436
 msgid "Error: iconv PHP module required but not installed."
 msgstr "Chyba: PHP modul iconv je vyžadován, ale není nainstalován"
 
-#: src/Core/Installer.php:441
+#: src/Core/Installer.php:442
 msgid "POSIX PHP module"
 msgstr "PHP modul POSIX"
 
-#: src/Core/Installer.php:442
+#: src/Core/Installer.php:443
 msgid "Error: POSIX PHP module required but not installed."
 msgstr "Chyba: PHP modul POSIX je vyžadován, ale není nainstalován."
 
-#: src/Core/Installer.php:448
+#: src/Core/Installer.php:449
 msgid "JSON PHP module"
 msgstr "PHP modul JSON"
 
-#: src/Core/Installer.php:449
+#: src/Core/Installer.php:450
 msgid "Error: JSON PHP module required but not installed."
 msgstr "Chyba: PHP modul JSON je vyžadován, ale není nainstalován"
 
-#: src/Core/Installer.php:472
+#: src/Core/Installer.php:473
 msgid ""
 "The web installer needs to be able to create a file called "
 "\"local.config.php\" in the \"config\" folder of your web server and it is "
 "unable to do so."
 msgstr "Webový instalátor musí být schopen vytvořit soubor s názvem „local.config.php“ v adresáři „config“ Vašeho webového serveru a není mu to umožněno. "
 
-#: src/Core/Installer.php:473
+#: src/Core/Installer.php:474
 msgid ""
 "This is most often a permission setting, as the web server may not be able "
 "to write files in your folder - even if you can."
 msgstr "Toto je nejčastěji nastavením oprávnění, kdy webový server nemusí být schopen zapisovat soubory do vašeho adresáře - i když vy můžete."
 
-#: src/Core/Installer.php:474
+#: src/Core/Installer.php:475
 msgid ""
 "At the end of this procedure, we will give you a text to save in a file "
 "named local.config.php in your Friendica \"config\" folder."
 msgstr "Na konci této procedury od nás obdržíte text k uložení v souboru pojmenovaném local.config.php v adresáři „config“ na Vaší instalaci Friendica."
 
-#: src/Core/Installer.php:475
+#: src/Core/Installer.php:476
 msgid ""
 "You can alternatively skip this procedure and perform a manual installation."
 " Please see the file \"INSTALL.txt\" for instructions."
 msgstr "Alternativně můžete tento krok přeskočit a provést manuální instalaci. Přečtěte si prosím soubor „INSTALL.txt“ pro další instrukce."
 
-#: src/Core/Installer.php:478
+#: src/Core/Installer.php:479
 msgid "config/local.config.php is writable"
 msgstr "Soubor config/local.config.php je zapisovatelný"
 
-#: src/Core/Installer.php:498
+#: src/Core/Installer.php:499
 msgid ""
 "Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
 "compiles templates to PHP to speed up rendering."
 msgstr "Friendica používá k zobrazení svých webových stránek šablonovací nástroj Smarty3. Smarty3 kompiluje šablony do PHP pro zrychlení vykreslování."
 
-#: src/Core/Installer.php:499
+#: src/Core/Installer.php:500
 msgid ""
 "In order to store these compiled templates, the web server needs to have "
 "write access to the directory view/smarty3/ under the Friendica top level "
 "folder."
 msgstr "Pro uložení kompilovaných šablon potřebuje webový server mít přístup k zápisu do adresáře view/smarty3/ pod kořenovým adresářem Friendica."
 
-#: src/Core/Installer.php:500
+#: src/Core/Installer.php:501
 msgid ""
 "Please ensure that the user that your web server runs as (e.g. www-data) has"
 " write access to this folder."
 msgstr "Prosím ujistěte se, že má uživatel webového serveru (jako například www-data) právo zápisu do tohoto adresáře"
 
-#: src/Core/Installer.php:501
+#: src/Core/Installer.php:502
 msgid ""
 "Note: as a security measure, you should give the web server write access to "
 "view/smarty3/ only--not the template files (.tpl) that it contains."
 msgstr "Poznámka: jako bezpečnostní opatření byste měl/a přidělit webovém serveru právo zápisu pouze do adresáře /view/smarty3/ -- a nikoliv už do souborů s šablonami (.tpl), které obsahuje."
 
-#: src/Core/Installer.php:504
+#: src/Core/Installer.php:505
 msgid "view/smarty3 is writable"
 msgstr "Adresář view/smarty3 je zapisovatelný"
 
-#: src/Core/Installer.php:533
+#: src/Core/Installer.php:534
 msgid ""
 "Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
 " to .htaccess."
 msgstr "URL rewrite v souboru .htacess nefunguje. Ujistěte se, že jste zkopíroval/a soubor .htaccess-dist jako .htaccess"
 
-#: src/Core/Installer.php:535
+#: src/Core/Installer.php:536
 msgid "Error message from Curl when fetching"
 msgstr "Chybová zpráva od Curl při načítání"
 
-#: src/Core/Installer.php:540
+#: src/Core/Installer.php:541
 msgid "Url rewrite is working"
 msgstr "Url rewrite je funkční."
 
-#: src/Core/Installer.php:569
+#: src/Core/Installer.php:570
 msgid "ImageMagick PHP extension is not installed"
 msgstr "PHP rozšíření ImageMagick není nainstalováno"
 
-#: src/Core/Installer.php:571
+#: src/Core/Installer.php:572
 msgid "ImageMagick PHP extension is installed"
 msgstr "PHP rozšíření ImageMagick je nainstalováno"
 
-#: src/Core/Installer.php:573 tests/src/Core/InstallerTest.php:329
+#: src/Core/Installer.php:574 tests/src/Core/InstallerTest.php:329
 #: tests/src/Core/InstallerTest.php:355
 msgid "ImageMagick supports GIF"
 msgstr "ImageMagick podporuje GIF"
 
-#: src/Core/Installer.php:595
+#: src/Core/Installer.php:597
 msgid "Could not connect to database."
 msgstr "Nelze se připojit k databázi."
 
-#: src/Core/Installer.php:602
+#: src/Core/Installer.php:604
 msgid "Database already in use."
 msgstr "Databáze se již používá."
 
-#: src/Core/L10n.php:368 src/Model/Event.php:398
+#: src/Core/L10n.php:368 src/Model/Event.php:397
 msgid "Tuesday"
 msgstr "úterý"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:399
+#: src/Core/L10n.php:368 src/Model/Event.php:398
 msgid "Wednesday"
 msgstr "středa"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:400
+#: src/Core/L10n.php:368 src/Model/Event.php:399
 msgid "Thursday"
 msgstr "čtvrtek"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:401
+#: src/Core/L10n.php:368 src/Model/Event.php:400
 msgid "Friday"
 msgstr "pátek"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:402
+#: src/Core/L10n.php:368 src/Model/Event.php:401
 msgid "Saturday"
 msgstr "sobota"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:417
+#: src/Core/L10n.php:372 src/Model/Event.php:416
 msgid "January"
 msgstr "leden"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:418
+#: src/Core/L10n.php:372 src/Model/Event.php:417
 msgid "February"
 msgstr "únor"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:419
+#: src/Core/L10n.php:372 src/Model/Event.php:418
 msgid "March"
 msgstr "březen"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:420
+#: src/Core/L10n.php:372 src/Model/Event.php:419
 msgid "April"
 msgstr "duben"
 
-#: src/Core/L10n.php:372 src/Core/L10n.php:391 src/Model/Event.php:408
+#: src/Core/L10n.php:372 src/Core/L10n.php:391 src/Model/Event.php:407
 msgid "May"
 msgstr "květen"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:421
+#: src/Core/L10n.php:372 src/Model/Event.php:420
 msgid "June"
 msgstr "červen"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:422
+#: src/Core/L10n.php:372 src/Model/Event.php:421
 msgid "July"
 msgstr "červenec"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:423
+#: src/Core/L10n.php:372 src/Model/Event.php:422
 msgid "August"
 msgstr "srpen"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:424
+#: src/Core/L10n.php:372 src/Model/Event.php:423
 msgid "September"
 msgstr "září"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:425
+#: src/Core/L10n.php:372 src/Model/Event.php:424
 msgid "October"
 msgstr "říjen"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:426
+#: src/Core/L10n.php:372 src/Model/Event.php:425
 msgid "November"
 msgstr "listopad"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:427
+#: src/Core/L10n.php:372 src/Model/Event.php:426
 msgid "December"
 msgstr "prosinec"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:389
+#: src/Core/L10n.php:387 src/Model/Event.php:388
 msgid "Mon"
 msgstr "pon"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:390
+#: src/Core/L10n.php:387 src/Model/Event.php:389
 msgid "Tue"
 msgstr "úte"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:391
+#: src/Core/L10n.php:387 src/Model/Event.php:390
 msgid "Wed"
 msgstr "stř"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:392
+#: src/Core/L10n.php:387 src/Model/Event.php:391
 msgid "Thu"
 msgstr "čtv"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:393
+#: src/Core/L10n.php:387 src/Model/Event.php:392
 msgid "Fri"
 msgstr "pát"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:394
+#: src/Core/L10n.php:387 src/Model/Event.php:393
 msgid "Sat"
 msgstr "sob"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:388
+#: src/Core/L10n.php:387 src/Model/Event.php:387
 msgid "Sun"
 msgstr "ned"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:404
+#: src/Core/L10n.php:391 src/Model/Event.php:403
 msgid "Jan"
 msgstr "led"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:405
+#: src/Core/L10n.php:391 src/Model/Event.php:404
 msgid "Feb"
 msgstr "úno"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:406
+#: src/Core/L10n.php:391 src/Model/Event.php:405
 msgid "Mar"
 msgstr "bře"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:407
+#: src/Core/L10n.php:391 src/Model/Event.php:406
 msgid "Apr"
 msgstr "dub"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:410
+#: src/Core/L10n.php:391 src/Model/Event.php:409
 msgid "Jul"
 msgstr "čvc"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:411
+#: src/Core/L10n.php:391 src/Model/Event.php:410
 msgid "Aug"
 msgstr "srp"
 
@@ -7984,15 +7993,15 @@ msgstr "srp"
 msgid "Sep"
 msgstr "zář"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:413
+#: src/Core/L10n.php:391 src/Model/Event.php:412
 msgid "Oct"
 msgstr "říj"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:414
+#: src/Core/L10n.php:391 src/Model/Event.php:413
 msgid "Nov"
 msgstr "lis"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:415
+#: src/Core/L10n.php:391 src/Model/Event.php:414
 msgid "Dec"
 msgstr "pro"
 
@@ -8253,147 +8262,147 @@ msgstr "%s: aktualizuji tabulku %s"
 msgid "Legacy module file not found: %s"
 msgstr "Soubor legacy modulu nenalezen: %s"
 
-#: src/Model/Contact.php:1037
+#: src/Model/Contact.php:1054
 msgid "Drop Contact"
 msgstr "Odstranit kontakt"
 
-#: src/Model/Contact.php:1509
+#: src/Model/Contact.php:1526
 msgid "Organisation"
 msgstr "Organizace"
 
-#: src/Model/Contact.php:1513
+#: src/Model/Contact.php:1530
 msgid "News"
 msgstr "Zprávy"
 
-#: src/Model/Contact.php:1517
+#: src/Model/Contact.php:1534
 msgid "Forum"
 msgstr "Fórum"
 
-#: src/Model/Contact.php:1707
+#: src/Model/Contact.php:1724
 msgid "Connect URL missing."
 msgstr "Chybí URL adresa pro připojení."
 
-#: src/Model/Contact.php:1716
+#: src/Model/Contact.php:1733
 msgid ""
 "The contact could not be added. Please check the relevant network "
 "credentials in your Settings -> Social Networks page."
 msgstr "Kontakt nemohl být přidán. Prosím zkontrolujte relevantní přihlašovací údaje sítě na stránce Nastavení -> Sociální sítě."
 
-#: src/Model/Contact.php:1755
+#: src/Model/Contact.php:1772
 msgid ""
 "This site is not configured to allow communications with other networks."
 msgstr "Tento web není nakonfigurován tak, aby umožňoval komunikaci s ostatními sítěmi."
 
-#: src/Model/Contact.php:1756 src/Model/Contact.php:1769
+#: src/Model/Contact.php:1773 src/Model/Contact.php:1786
 msgid "No compatible communication protocols or feeds were discovered."
 msgstr "Nenalezen žádný kompatibilní komunikační protokol nebo kanál."
 
-#: src/Model/Contact.php:1767
+#: src/Model/Contact.php:1784
 msgid "The profile address specified does not provide adequate information."
 msgstr "Uvedená adresa profilu neposkytuje dostatečné informace."
 
-#: src/Model/Contact.php:1772
+#: src/Model/Contact.php:1789
 msgid "An author or name was not found."
 msgstr "Autor nebo jméno nenalezeno"
 
-#: src/Model/Contact.php:1775
+#: src/Model/Contact.php:1792
 msgid "No browser URL could be matched to this address."
 msgstr "Této adrese neodpovídá žádné URL prohlížeče."
 
-#: src/Model/Contact.php:1778
+#: src/Model/Contact.php:1795
 msgid ""
 "Unable to match @-style Identity Address with a known protocol or email "
 "contact."
 msgstr "Není možné namapovat adresu identity ve stylu @ s žádným možným protokolem ani emailovým kontaktem."
 
-#: src/Model/Contact.php:1779
+#: src/Model/Contact.php:1796
 msgid "Use mailto: in front of address to force email check."
 msgstr "Použite mailo: před adresou k vynucení emailové kontroly."
 
-#: src/Model/Contact.php:1785
+#: src/Model/Contact.php:1802
 msgid ""
 "The profile address specified belongs to a network which has been disabled "
 "on this site."
 msgstr "Zadaná adresa profilu patří do sítě, která  byla na tomto serveru zakázána."
 
-#: src/Model/Contact.php:1790
+#: src/Model/Contact.php:1807
 msgid ""
 "Limited profile. This person will be unable to receive direct/personal "
 "notifications from you."
 msgstr "Omezený profil. Tato osoba nebude schopna od vás přijímat přímá/osobní oznámení."
 
-#: src/Model/Contact.php:1843
+#: src/Model/Contact.php:1860
 msgid "Unable to retrieve contact information."
 msgstr "Nepodařilo se získat kontaktní informace."
 
-#: src/Model/Event.php:61 src/Model/Event.php:78 src/Model/Event.php:436
-#: src/Model/Event.php:916
+#: src/Model/Event.php:61 src/Model/Event.php:78 src/Model/Event.php:435
+#: src/Model/Event.php:915
 msgid "Starts:"
 msgstr "Začíná:"
 
-#: src/Model/Event.php:64 src/Model/Event.php:84 src/Model/Event.php:437
-#: src/Model/Event.php:920
+#: src/Model/Event.php:64 src/Model/Event.php:84 src/Model/Event.php:436
+#: src/Model/Event.php:919
 msgid "Finishes:"
 msgstr "Končí:"
 
-#: src/Model/Event.php:386
+#: src/Model/Event.php:385
 msgid "all-day"
 msgstr "celodenní"
 
-#: src/Model/Event.php:409
+#: src/Model/Event.php:408
 msgid "Jun"
 msgstr "čvn"
 
-#: src/Model/Event.php:412
+#: src/Model/Event.php:411
 msgid "Sept"
 msgstr "září"
 
-#: src/Model/Event.php:434
+#: src/Model/Event.php:433
 msgid "No events to display"
 msgstr "Žádné události k zobrazení"
 
-#: src/Model/Event.php:562
+#: src/Model/Event.php:561
 msgid "l, F j"
 msgstr "l, j. F"
 
-#: src/Model/Event.php:593
+#: src/Model/Event.php:592
 msgid "Edit event"
 msgstr "Upravit událost"
 
-#: src/Model/Event.php:594
+#: src/Model/Event.php:593
 msgid "Duplicate event"
 msgstr "Duplikovat událost"
 
-#: src/Model/Event.php:595
+#: src/Model/Event.php:594
 msgid "Delete event"
 msgstr "Smazat událost"
 
-#: src/Model/Event.php:627 src/Model/Item.php:3536 src/Model/Item.php:3543
+#: src/Model/Event.php:626 src/Model/Item.php:3554 src/Model/Item.php:3561
 msgid "link to source"
 msgstr "odkaz na zdroj"
 
-#: src/Model/Event.php:849
+#: src/Model/Event.php:848
 msgid "D g:i A"
 msgstr "D g:i A"
 
-#: src/Model/Event.php:850
+#: src/Model/Event.php:849
 msgid "g:i A"
 msgstr "g:i A"
 
-#: src/Model/Event.php:935 src/Model/Event.php:937
+#: src/Model/Event.php:934 src/Model/Event.php:936
 msgid "Show map"
 msgstr "Zobrazit mapu"
 
-#: src/Model/Event.php:936
+#: src/Model/Event.php:935
 msgid "Hide map"
 msgstr "Skrýt mapu"
 
-#: src/Model/Event.php:1028
+#: src/Model/Event.php:1027
 #, php-format
 msgid "%s's birthday"
 msgstr "%s má narozeniny"
 
-#: src/Model/Event.php:1029
+#: src/Model/Event.php:1028
 #, php-format
 msgid "Happy Birthday %s"
 msgstr "Veselé narozeniny, %s"
@@ -8433,11 +8442,11 @@ msgstr "Vytvořit novou skupinu"
 msgid "Edit groups"
 msgstr "Upravit skupiny"
 
-#: src/Model/Item.php:3269
+#: src/Model/Item.php:3287
 msgid "activity"
 msgstr "aktivita"
 
-#: src/Model/Item.php:3271 src/Object/Post.php:456 src/Object/Post.php:468
+#: src/Model/Item.php:3289 src/Object/Post.php:470
 msgid "comment"
 msgid_plural "comments"
 msgstr[0] "komentář"
@@ -8445,24 +8454,24 @@ msgstr[1] "komentáře"
 msgstr[2] "komentáře"
 msgstr[3] "komentářů"
 
-#: src/Model/Item.php:3274
+#: src/Model/Item.php:3292
 msgid "post"
 msgstr "příspěvek"
 
-#: src/Model/Item.php:3373
+#: src/Model/Item.php:3391
 #, php-format
 msgid "Content warning: %s"
 msgstr "Varování o obsahu: %s"
 
-#: src/Model/Item.php:3452
+#: src/Model/Item.php:3470
 msgid "bytes"
 msgstr "bytů"
 
-#: src/Model/Item.php:3530
+#: src/Model/Item.php:3548
 msgid "View on separate page"
 msgstr "Zobrazit na separátní stránce"
 
-#: src/Model/Item.php:3531
+#: src/Model/Item.php:3549
 msgid "view on separate page"
 msgstr "zobrazit na separátní stránce"
 
@@ -8640,79 +8649,79 @@ msgstr "Cesta ke kořenové složce úložiště"
 
 #: src/Model/Storage/Filesystem.php:128
 msgid ""
-"Folder were uploaded files are saved. For maximum security, This should be a"
-" path outside web server folder tree"
+"Folder where uploaded files are saved. For maximum security, This should be "
+"a path outside web server folder tree"
 msgstr "Složka, do které jsou ukládány nahrané soubory. Pro maximální bezpečnost to musí být cesta mimo složku webového serveru"
 
 #: src/Model/Storage/Filesystem.php:138
 msgid "Enter a valid existing folder"
 msgstr "Zadejte platnou existující složku"
 
-#: src/Model/User.php:270
+#: src/Model/User.php:271
 msgid "Login failed"
 msgstr "Přihlášení selhalo"
 
-#: src/Model/User.php:301
+#: src/Model/User.php:302
 msgid "Not enough information to authenticate"
 msgstr "Není dost informací pro autentikaci"
 
-#: src/Model/User.php:379
+#: src/Model/User.php:380
 msgid "Password can't be empty"
 msgstr "Heslo nemůže být prázdné"
 
-#: src/Model/User.php:398
+#: src/Model/User.php:399
 msgid "Empty passwords are not allowed."
 msgstr "Prázdná hesla nejsou povolena."
 
-#: src/Model/User.php:402
+#: src/Model/User.php:403
 msgid ""
 "The new password has been exposed in a public data dump, please choose "
 "another."
 msgstr "Nové heslo bylo zveřejněno ve veřejném výpisu dat, prosím zvolte si jiné."
 
-#: src/Model/User.php:408
+#: src/Model/User.php:409
 msgid ""
 "The password can't contain accentuated letters, white spaces or colons (:)"
 msgstr "Heslo nesmí obsahovat mezery, znaky s diakritikou a dvojtečky (:)"
 
-#: src/Model/User.php:508
+#: src/Model/User.php:509
 msgid "Passwords do not match. Password unchanged."
 msgstr "Hesla se neshodují. Heslo nebylo změněno."
 
-#: src/Model/User.php:515
+#: src/Model/User.php:516
 msgid "An invitation is required."
 msgstr "Je vyžadována pozvánka."
 
-#: src/Model/User.php:519
+#: src/Model/User.php:520
 msgid "Invitation could not be verified."
 msgstr "Pozvánka nemohla být ověřena."
 
-#: src/Model/User.php:526
+#: src/Model/User.php:527
 msgid "Invalid OpenID url"
 msgstr "Neplatný odkaz OpenID"
 
-#: src/Model/User.php:539 src/Module/Login.php:106
+#: src/Model/User.php:540 src/Module/Login.php:106
 msgid ""
 "We encountered a problem while logging in with the OpenID you provided. "
 "Please check the correct spelling of the ID."
 msgstr "Zaznamenali jsme problém s vaším přihlášením prostřednictvím Vámi zadaným OpenID. Prosím ověřte si, že jste ID zadali správně. "
 
-#: src/Model/User.php:539 src/Module/Login.php:106
+#: src/Model/User.php:540 src/Module/Login.php:106
 msgid "The error message was:"
 msgstr "Chybová zpráva byla:"
 
-#: src/Model/User.php:545
+#: src/Model/User.php:546
 msgid "Please enter the required information."
 msgstr "Zadejte prosím požadované informace."
 
-#: src/Model/User.php:559
+#: src/Model/User.php:560
 #, php-format
 msgid ""
 "system.username_min_length (%s) and system.username_max_length (%s) are "
 "excluding each other, swapping values."
 msgstr "system.username_min_length (%s) a system.username_max_length (%s) se vzájemně vylučují, čímž se vyměňují hodnoty."
 
-#: src/Model/User.php:566
+#: src/Model/User.php:567
 #, php-format
 msgid "Username should be at least %s character."
 msgid_plural "Username should be at least %s characters."
@@ -8721,7 +8730,7 @@ msgstr[1] "Uživateleké jméno musí mít alespoň %s znaky."
 msgstr[2] "Uživateleké jméno musí mít alespoň %s znaku."
 msgstr[3] "Uživateleké jméno musí mít alespoň %s znaků."
 
-#: src/Model/User.php:570
+#: src/Model/User.php:571
 #, php-format
 msgid "Username should be at most %s character."
 msgid_plural "Username should be at most %s characters."
@@ -8730,60 +8739,60 @@ msgstr[1] "Uživateleké jméno musí mít nanejvýš %s znaky."
 msgstr[2] "Uživateleké jméno musí mít nanejvýš %s znaku."
 msgstr[3] "Uživateleké jméno musí mít nanejvýš %s znaků."
 
-#: src/Model/User.php:578
+#: src/Model/User.php:579
 msgid "That doesn't appear to be your full (First Last) name."
 msgstr "Nezdá se, že by to bylo vaše celé jméno (křestní jméno a příjmení)."
 
-#: src/Model/User.php:583
+#: src/Model/User.php:584
 msgid "Your email domain is not among those allowed on this site."
 msgstr "Vaše e-mailová doména není na tomto serveru mezi povolenými."
 
-#: src/Model/User.php:587
+#: src/Model/User.php:588
 msgid "Not a valid email address."
 msgstr "Neplatná e-mailová adresa."
 
-#: src/Model/User.php:590
+#: src/Model/User.php:591
 msgid "The nickname was blocked from registration by the nodes admin."
 msgstr "Administrátor serveru zablokoval registraci této přezdívky."
 
-#: src/Model/User.php:594 src/Model/User.php:602
+#: src/Model/User.php:595 src/Model/User.php:603
 msgid "Cannot use that email."
 msgstr "Tento e-mail nelze použít."
 
-#: src/Model/User.php:609
+#: src/Model/User.php:610
 msgid "Your nickname can only contain a-z, 0-9 and _."
 msgstr "Uživatelské jméno může obsahovat pouze znaky a-z, 0-9 a _."
 
-#: src/Model/User.php:616 src/Model/User.php:673
+#: src/Model/User.php:617 src/Model/User.php:674
 msgid "Nickname is already registered. Please choose another."
 msgstr "Přezdívka je již registrována. Prosím vyberte jinou."
 
-#: src/Model/User.php:626
+#: src/Model/User.php:627
 msgid "SERIOUS ERROR: Generation of security keys failed."
 msgstr "ZÁVAŽNÁ CHYBA: Generování bezpečnostních klíčů se nezdařilo."
 
-#: src/Model/User.php:660 src/Model/User.php:664
+#: src/Model/User.php:661 src/Model/User.php:665
 msgid "An error occurred during registration. Please try again."
 msgstr "Došlo k chybě při registraci. Zkuste to prosím znovu."
 
-#: src/Model/User.php:684 view/theme/duepuntozero/config.php:55
+#: src/Model/User.php:685 view/theme/duepuntozero/config.php:55
 msgid "default"
 msgstr "výchozí"
 
-#: src/Model/User.php:689
+#: src/Model/User.php:690
 msgid "An error occurred creating your default profile. Please try again."
 msgstr "Při vytváření vašeho výchozího profilu došlo k chybě. Zkuste to prosím znovu."
 
-#: src/Model/User.php:696
+#: src/Model/User.php:697
 msgid "An error occurred creating your self contact. Please try again."
 msgstr "Při vytváření vašeho kontaktu na sebe došlo k chybě. Zkuste to prosím znovu."
 
-#: src/Model/User.php:705
+#: src/Model/User.php:706
 msgid ""
 "An error occurred creating your default contact group. Please try again."
 msgstr "Při vytváření vaší výchozí skupiny kontaktů došlo k chybě. Zkuste to prosím znovu."
 
-#: src/Model/User.php:781
+#: src/Model/User.php:782
 #, php-format
 msgid ""
 "\n"
@@ -8798,12 +8807,12 @@ msgid ""
 "\t\t"
 msgstr "\n\t\t\tVážený/á %1$s,\n\t\t\t\tDěkujeme, že jste se registroval/a na %2$s. Váš účet čeká na schválení administrátora.\n\n\t\t\tZde jsou vaše přihlašovací detaily:\n\n\t\t\tAdresa stránky:\t\t%3$s\n\t\t\tPřihlašovací jméno:\t%4$s\n\t\t\tHeslo:\t\t\t%5$s\n\t\t"
 
-#: src/Model/User.php:798
+#: src/Model/User.php:799
 #, php-format
 msgid "Registration at %s"
 msgstr "Registrace na %s"
 
-#: src/Model/User.php:817
+#: src/Model/User.php:818
 #, php-format
 msgid ""
 "\n"
@@ -8812,7 +8821,7 @@ msgid ""
 "\t\t"
 msgstr "\n\t\t\tVážený/á %1$s,\n\t\t\t\tDěkujeme, že jste se registroval/a na %2$s. Váš účet byl vytvořen.\n\t\t"
 
-#: src/Model/User.php:823
+#: src/Model/User.php:824
 #, php-format
 msgid ""
 "\n"
@@ -9311,7 +9320,7 @@ msgid ""
 " administrator email. This will allow you to enter the site admin panel."
 msgstr "Přejděte k <a href=\"%s/register\">registrační stránce</a> vašeho nového serveru Friendica a zaregistrujte se jako nový uživatel. Nezapomeňte použít stejný e-mail, který jste zadal/a jako administrátorský e-mail. To vám umožní navštívit panel pro administraci stránky."
 
-#: src/Module/Itemsource.php:33
+#: src/Module/Itemsource.php:41
 msgid "Item Guid"
 msgstr "Číslo GUID položky"
 
@@ -9503,123 +9512,128 @@ msgstr "Přihlášený uživatel si kdykoliv může exportovat svoje data účtu
 msgid "Privacy Statement"
 msgstr "Prohlášení o soukromí"
 
-#: src/Object/Post.php:135
+#: src/Object/Post.php:136
 msgid "This entry was edited"
 msgstr "Tato položka byla upravena"
 
-#: src/Object/Post.php:197
+#: src/Object/Post.php:198
 msgid "Delete locally"
 msgstr "Smazat lokálně"
 
-#: src/Object/Post.php:200
+#: src/Object/Post.php:201
 msgid "Delete globally"
 msgstr "Smazat globálně"
 
-#: src/Object/Post.php:200
+#: src/Object/Post.php:201
 msgid "Remove locally"
 msgstr "Odstranit lokálně"
 
-#: src/Object/Post.php:214
+#: src/Object/Post.php:215
 msgid "save to folder"
 msgstr "uložit do složky"
 
-#: src/Object/Post.php:249
+#: src/Object/Post.php:250
 msgid "I will attend"
 msgstr "zúčastním se"
 
-#: src/Object/Post.php:249
+#: src/Object/Post.php:250
 msgid "I will not attend"
 msgstr "nezúčastním se"
 
-#: src/Object/Post.php:249
+#: src/Object/Post.php:250
 msgid "I might attend"
 msgstr "mohl bych se zúčastnit"
 
-#: src/Object/Post.php:277
+#: src/Object/Post.php:278
 msgid "ignore thread"
 msgstr "ignorovat vlákno"
 
-#: src/Object/Post.php:278
+#: src/Object/Post.php:279
 msgid "unignore thread"
 msgstr "přestat ignorovat vlákno"
 
-#: src/Object/Post.php:279
+#: src/Object/Post.php:280
 msgid "toggle ignore status"
 msgstr "přepínat stav ignorování"
 
-#: src/Object/Post.php:290
+#: src/Object/Post.php:291
 msgid "add star"
 msgstr "přidat hvězdu"
 
-#: src/Object/Post.php:291
+#: src/Object/Post.php:292
 msgid "remove star"
 msgstr "odebrat hvězdu"
 
-#: src/Object/Post.php:292
+#: src/Object/Post.php:293
 msgid "toggle star status"
 msgstr "přepínat hvězdu"
 
-#: src/Object/Post.php:295
+#: src/Object/Post.php:296
 msgid "starred"
 msgstr "s hvězdou"
 
-#: src/Object/Post.php:299
+#: src/Object/Post.php:300
 msgid "add tag"
 msgstr "přidat štítek"
 
-#: src/Object/Post.php:310
+#: src/Object/Post.php:311
 msgid "like"
 msgstr "líbí se mi"
 
-#: src/Object/Post.php:311
+#: src/Object/Post.php:312
 msgid "dislike"
 msgstr "nelíbí se mi"
 
-#: src/Object/Post.php:314
+#: src/Object/Post.php:315
 msgid "Share this"
 msgstr "Sdílet toto"
 
-#: src/Object/Post.php:314
+#: src/Object/Post.php:315
 msgid "share"
 msgstr "sdílet"
 
-#: src/Object/Post.php:381
+#: src/Object/Post.php:382
 msgid "to"
 msgstr "na"
 
-#: src/Object/Post.php:382
+#: src/Object/Post.php:383
 msgid "via"
 msgstr "přes"
 
-#: src/Object/Post.php:383
+#: src/Object/Post.php:384
 msgid "Wall-to-Wall"
 msgstr "Ze zdi na zeď"
 
-#: src/Object/Post.php:384
+#: src/Object/Post.php:385
 msgid "via Wall-To-Wall:"
 msgstr "ze zdi na zeď"
 
-#: src/Object/Post.php:431
+#: src/Object/Post.php:418
+#, php-format
+msgid "Reply to %s"
+msgstr "Odpovědět uživateli %s"
+
+#: src/Object/Post.php:433
 msgid "Notifier task is pending"
 msgstr "Úloha pro notifiera čeká"
 
-#: src/Object/Post.php:432
+#: src/Object/Post.php:434
 msgid "Delivery to remote servers is pending"
 msgstr "Doručení vzdáleným serverům čeká"
 
-#: src/Object/Post.php:433
+#: src/Object/Post.php:435
 msgid "Delivery to remote servers is underway"
 msgstr "Doručení vzdáleným serverům je v plném proudu"
 
-#: src/Object/Post.php:434
+#: src/Object/Post.php:436
 msgid "Delivery to remote servers is mostly done"
 msgstr "Doručení vzdáleným serverům je téměř hotovo"
 
-#: src/Object/Post.php:435
+#: src/Object/Post.php:437
 msgid "Delivery to remote servers is done"
 msgstr "Doručení vzdáleným serverům je hotovo"
 
-#: src/Object/Post.php:454
+#: src/Object/Post.php:457
 #, php-format
 msgid "%d comment"
 msgid_plural "%d comments"
@@ -9628,11 +9642,19 @@ msgstr[1] "%d komentáře"
 msgstr[2] "%d komentáře"
 msgstr[3] "%d komentářů"
 
-#: src/Protocol/Diaspora.php:2495
+#: src/Object/Post.php:458
+msgid "Show more"
+msgstr "Zobrazit více"
+
+#: src/Object/Post.php:459
+msgid "Show fewer"
+msgstr "Zobrazit méně"
+
+#: src/Protocol/Diaspora.php:2496
 msgid "Sharing notification from Diaspora network"
 msgstr "Oznámení o sdílení ze sítě Diaspora"
 
-#: src/Protocol/Diaspora.php:3612
+#: src/Protocol/Diaspora.php:3613
 msgid "Attachments:"
 msgstr "Přílohy:"
 
index 86fd159f13e1b4faa67eddad1f8ee09ac1e80584..f479e50463ae49826e8ea60cdfc2985b2118695e 100644 (file)
@@ -485,7 +485,7 @@ $a->strings["If enabled, the global contacts are checked periodically for missin
 $a->strings["Days between requery"] = "Dny mezi dotazy";
 $a->strings["Number of days after which a server is requeried for his contacts."] = "Počet dnů, po kterých je server znovu dotázán na své kontakty";
 $a->strings["Discover contacts from other servers"] = "Objevit kontakty z ostatních serverů";
-$a->strings["Periodically query other servers for contacts. You can choose between 'users': the users on the remote system, 'Global Contacts': active contacts that are known on the system. The fallback is meant for Redmatrix servers and older friendica servers, where global contacts weren't available. The fallback increases the server load, so the recommened setting is 'Users, Global Contacts'."] = "Periodicky dotazovat ostatní servery pro kontakty. Můžete si vybrat mezi možnostmi: „uživatelé“ - uživatelé na vzdáleném systému, a „globální kontakty“ - aktivní kontakty, které jsou známy na systému. Funkce fallback je určena pro servery Redmatrix a starší servery Friendica, kde globální kontakty nejsou dostupné. Fallback zvyšuje serverovou zátěž, doporučené nastavení je proto „Uživatelé, globální kontakty“.";
+$a->strings["Periodically query other servers for contacts. You can choose between 'users': the users on the remote system, 'Global Contacts': active contacts that are known on the system. The fallback is meant for Redmatrix servers and older friendica servers, where global contacts weren't available. The fallback increases the server load, so the recommended setting is 'Users, Global Contacts'."] = "Periodicky dotazovat ostatní servery pro kontakty. Můžete si vybrat mezi možnostmi: „uživatelé“ - uživatelé na vzdáleném systému, a „globální kontakty“ - aktivní kontakty, které jsou známy na systému. Funkce fallback je určena pro servery Redmatrix a starší servery Friendica, kde globální kontakty nejsou dostupné. Fallback zvyšuje serverovou zátěž, doporučené nastavení je proto „Uživatelé, globální kontakty“. ";
 $a->strings["Timeframe for fetching global contacts"] = "Časový rámec pro načítání globálních kontaktů";
 $a->strings["When the discovery is activated, this value defines the timeframe for the activity of the global contacts that are fetched from other servers."] = "Pokud je aktivováno objevování, tato hodnota definuje časový rámec pro aktivitu globálních kontaktů, které jsou načteny z jiných serverů.";
 $a->strings["Search the local directory"] = "Hledat  v místním adresáři";
@@ -729,6 +729,7 @@ $a->strings["Mark this contact as remote_self, this will cause friendica to repo
 $a->strings["Account Nickname"] = "Přezdívka účtu";
 $a->strings["@Tagname - overrides Name/Nickname"] = "@jménoštítku- upřednostněno před jménem/přezdívkou";
 $a->strings["Account URL"] = "URL adresa účtu";
+$a->strings["Account URL Alias"] = "Alias URL adresy účtu";
 $a->strings["Friend Request URL"] = "URL požadavku o přátelství";
 $a->strings["Friend Confirm URL"] = "URL adresa pro potvrzení přátelství";
 $a->strings["Notification Endpoint URL"] = "URL adresa koncového bodu oznámení";
@@ -1516,7 +1517,6 @@ $a->strings["File exceeds size limit of %s"] = "Velikost souboru přesáhla limi
 $a->strings["File upload failed."] = "Nahrání souboru se nezdařilo.";
 $a->strings["Wall Photos"] = "Fotky na zdi";
 $a->strings["Delete this item?"] = "Odstranit tuto položku?";
-$a->strings["show fewer"] = "zobrazit méně";
 $a->strings["toggle mobile"] = "přepínat mobilní zobrazení";
 $a->strings["No system theme config value set."] = "Není nastavena konfigurační hodnota systémového motivu.";
 $a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Formulářový bezpečnostní token nebyl správný. To pravděpodobně nastalo kvůli tom, že formulář byl otevřen příliš dlouho (>3 hodiny) před jeho odesláním.";
@@ -1607,6 +1607,8 @@ $a->strings["Ability for visitors to download the public calendar"] = "Umožnit
 $a->strings["Post Composition Features"] = "Nastavení vytváření příspěvků";
 $a->strings["Auto-mention Forums"] = "Automaticky zmiňovat fóra";
 $a->strings["Add/remove mention when a forum page is selected/deselected in ACL window."] = "Přidat/odstranit zmínku, když je stránka na fóru označena/odznačena v okně ACL.";
+$a->strings["Explicit Mentions"] = "Výslovné zmínky";
+$a->strings["Add explicit mentions to comment box for manual control over who gets mentioned in replies."] = "Přidá do pole pro komentování výslovné zmínky pro ruční kontrolu nad tím, koho zmíníte v odpovědích.";
 $a->strings["Network Sidebar"] = "Síťová postranní lišta";
 $a->strings["Ability to select posts by date ranges"] = "Možnost označit příspěvky dle časového intervalu";
 $a->strings["Protocol Filter"] = "Filtr protokolů";
@@ -1993,7 +1995,7 @@ $a->strings["Database storage failed to insert data"] = "Vklad dat do databázov
 $a->strings["Filesystem storage failed to create \"%s\". Check you write permissions."] = "Vytvoření „%s“ v úložišti souborového systému neuspělo. Zkontrolujte vaše povolení zapisovat.";
 $a->strings["Filesystem storage failed to save data to \"%s\". Check your write permissions"] = "Uložení dat do „%s“ v úložišti souborového systému neuspělo. Zkontrolujte vaše povolení zapisovat";
 $a->strings["Storage base path"] = "Cesta ke kořenové složce úložiště";
-$a->strings["Folder were uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "Složka, do které jsou ukládány nahrané soubory. Pro maximální bezpečnost to musí být cesta mimo složku webového serveru";
+$a->strings["Folder where uploaded files are saved. For maximum security, This should be a path outside web server folder tree"] = "Složka, do které jsou ukládány nahrané soubory. Pro maximální bezpečnost to musí být cesta mimo složku webového serveru";
 $a->strings["Enter a valid existing folder"] = "Zadejte platnou existující složku";
 $a->strings["Login failed"] = "Přihlášení selhalo";
 $a->strings["Not enough information to authenticate"] = "Není dost informací pro autentikaci";
@@ -2214,6 +2216,7 @@ $a->strings["to"] = "na";
 $a->strings["via"] = "přes";
 $a->strings["Wall-to-Wall"] = "Ze zdi na zeď";
 $a->strings["via Wall-To-Wall:"] = "ze zdi na zeď";
+$a->strings["Reply to %s"] = "Odpovědět uživateli %s";
 $a->strings["Notifier task is pending"] = "Úloha pro notifiera čeká";
 $a->strings["Delivery to remote servers is pending"] = "Doručení vzdáleným serverům čeká";
 $a->strings["Delivery to remote servers is underway"] = "Doručení vzdáleným serverům je v plném proudu";
@@ -2225,6 +2228,8 @@ $a->strings["%d comment"] = [
        2 => "%d komentáře",
        3 => "%d komentářů",
 ];
+$a->strings["Show more"] = "Zobrazit více";
+$a->strings["Show fewer"] = "Zobrazit méně";
 $a->strings["Sharing notification from Diaspora network"] = "Oznámení o sdílení ze sítě Diaspora";
 $a->strings["Attachments:"] = "Přílohy:";
 $a->strings["%s is now following %s."] = "%s nyní sleduje %s.";
index f433d12a27f9f640eb74f0ee6cfeef2156d0e63c..8a4a4b7f76a9bc1f0168b18a5d473a65c8080a75 100644 (file)
@@ -28,8 +28,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-02-10 08:14+0100\n"
-"PO-Revision-Date: 2019-02-15 20:23+0000\n"
+"POT-Creation-Date: 2019-02-15 09:33-0500\n"
+"PO-Revision-Date: 2019-02-20 15:30+0000\n"
 "Last-Translator: Hypolite Petovan <hypolite@mrpetovan.com>\n"
 "Language-Team: French (http://www.transifex.com/Friendica/friendica/language/fr/)\n"
 "MIME-Version: 1.0\n"
@@ -42,8 +42,8 @@ msgstr ""
 #, php-format
 msgid "Daily posting limit of %d post reached. The post was rejected."
 msgid_plural "Daily posting limit of %d posts reached. The post was rejected."
-msgstr[0] "Limite quotidienne de publications de%d atteinte. La publication a été rejetée."
-msgstr[1] "Limite quotidienne de %dpublications atteinte.  La publication a été rejetée."
+msgstr[0] "Limite quotidienne d'%d publication atteinte. La publication a été rejetée."
+msgstr[1] "Limite quotidienne de %d publications atteinte.  La publication a été rejetée."
 
 #: include/api.php:1193
 #, php-format
@@ -62,13 +62,13 @@ msgstr "La limite mensuelle de%d publication est atteinte. Votre publication a 
 #: mod/photos.php:695 mod/photos.php:1126 mod/photos.php:1143
 #: mod/photos.php:1636 mod/profile_photo.php:85 mod/profile_photo.php:94
 #: mod/profile_photo.php:103 mod/profile_photo.php:217
-#: mod/profile_photo.php:305 mod/profile_photo.php:315 src/Model/User.php:735
-#: src/Model/User.php:743 src/Model/User.php:751
+#: mod/profile_photo.php:305 mod/profile_photo.php:315 src/Model/User.php:736
+#: src/Model/User.php:744 src/Model/User.php:752
 msgid "Profile Photos"
 msgstr "Photos du profil"
 
 #: include/conversation.php:160 include/conversation.php:297
-#: src/Model/Item.php:3265
+#: src/Model/Item.php:3283
 msgid "event"
 msgstr "événement"
 
@@ -79,7 +79,7 @@ msgid "status"
 msgstr "le statut"
 
 #: include/conversation.php:168 include/conversation.php:305
-#: mod/subthread.php:88 mod/tagger.php:70 src/Model/Item.php:3267
+#: mod/subthread.php:88 mod/tagger.php:70 src/Model/Item.php:3285
 msgid "photo"
 msgstr "photo"
 
@@ -140,7 +140,7 @@ msgstr "Derniers \"J'aime\""
 msgid "Dislikes"
 msgstr "Derniers \"Je n'aime pas\""
 
-#: include/conversation.php:569 include/conversation.php:1506
+#: include/conversation.php:569 include/conversation.php:1505
 #: mod/photos.php:1468
 msgid "Attending"
 msgid_plural "Attending"
@@ -187,9 +187,9 @@ msgstr "%s de %s"
 msgid "View in context"
 msgstr "Voir dans le contexte"
 
-#: include/conversation.php:721 include/conversation.php:1172
+#: include/conversation.php:721 include/conversation.php:1171
 #: mod/editpost.php:88 mod/message.php:260 mod/message.php:442
-#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:420
+#: mod/photos.php:1440 mod/wallmessage.php:141 src/Object/Post.php:421
 msgid "Please wait"
 msgstr "Patientez"
 
@@ -205,43 +205,43 @@ msgstr "Supprimer les éléments sélectionnés"
 msgid "Follow Thread"
 msgstr "Suivre le fil"
 
-#: include/conversation.php:894 src/Model/Contact.php:1032
+#: include/conversation.php:894 src/Model/Contact.php:1049
 msgid "View Status"
 msgstr "Voir les statuts"
 
 #: include/conversation.php:895 include/conversation.php:911
 #: mod/allfriends.php:72 mod/directory.php:167 mod/dirfind.php:226
-#: mod/match.php:87 mod/suggest.php:87 src/Model/Contact.php:972
-#: src/Model/Contact.php:1025 src/Model/Contact.php:1033
+#: mod/match.php:87 mod/suggest.php:87 src/Model/Contact.php:989
+#: src/Model/Contact.php:1042 src/Model/Contact.php:1050
 msgid "View Profile"
 msgstr "Voir le profil"
 
-#: include/conversation.php:896 src/Model/Contact.php:1034
+#: include/conversation.php:896 src/Model/Contact.php:1051
 msgid "View Photos"
 msgstr "Voir les photos"
 
-#: include/conversation.php:897 src/Model/Contact.php:1026
-#: src/Model/Contact.php:1035
+#: include/conversation.php:897 src/Model/Contact.php:1043
+#: src/Model/Contact.php:1052
 msgid "Network Posts"
 msgstr "Publications du réseau"
 
-#: include/conversation.php:898 src/Model/Contact.php:1027
-#: src/Model/Contact.php:1036
+#: include/conversation.php:898 src/Model/Contact.php:1044
+#: src/Model/Contact.php:1053
 msgid "View Contact"
 msgstr "Voir Contact"
 
-#: include/conversation.php:899 src/Model/Contact.php:1038
+#: include/conversation.php:899 src/Model/Contact.php:1055
 msgid "Send PM"
 msgstr "Message privé"
 
-#: include/conversation.php:903 src/Model/Contact.php:1039
+#: include/conversation.php:903 src/Model/Contact.php:1056
 msgid "Poke"
 msgstr "Sollicitations (pokes)"
 
 #: include/conversation.php:908 mod/allfriends.php:73 mod/dirfind.php:227
 #: mod/follow.php:147 mod/match.php:88 mod/suggest.php:88
-#: view/theme/vier/theme.php:201 src/Content/Widget.php:63
-#: src/Model/Contact.php:1028 src/Module/Contact.php:574
+#: src/Content/Widget.php:63 src/Model/Contact.php:1045
+#: src/Module/Contact.php:574 view/theme/vier/theme.php:201
 msgid "Connect/Follow"
 msgstr "Se connecter/Suivre"
 
@@ -329,130 +329,130 @@ msgstr "<span  %1$s>%2$d personnes</span> vont peut-être participer"
 msgid "%s attend maybe."
 msgstr "%sparticipent peut-être"
 
-#: include/conversation.php:1111
+#: include/conversation.php:1110
 msgid "Visible to <strong>everybody</strong>"
 msgstr "Visible par <strong>tout le monde</strong>"
 
-#: include/conversation.php:1112 src/Object/Post.php:882
+#: include/conversation.php:1111 src/Object/Post.php:883
 msgid "Please enter a image/video/audio/webpage URL:"
 msgstr "Veuillez entrer une URL d'image/vidéo/page web."
 
-#: include/conversation.php:1113
+#: include/conversation.php:1112
 msgid "Tag term:"
 msgstr "Étiquette :"
 
-#: include/conversation.php:1114 mod/filer.php:35
+#: include/conversation.php:1113 mod/filer.php:35
 msgid "Save to Folder:"
 msgstr "Sauver dans le Dossier :"
 
-#: include/conversation.php:1115
+#: include/conversation.php:1114
 msgid "Where are you right now?"
 msgstr "Où êtes-vous actuellement ?"
 
-#: include/conversation.php:1116
+#: include/conversation.php:1115
 msgid "Delete item(s)?"
 msgstr "Supprimer les élément(s) ?"
 
-#: include/conversation.php:1148
+#: include/conversation.php:1147
 msgid "New Post"
 msgstr "Nouvelle publication"
 
-#: include/conversation.php:1151
+#: include/conversation.php:1150
 msgid "Share"
 msgstr "Partager"
 
-#: include/conversation.php:1152 mod/editpost.php:74 mod/message.php:258
+#: include/conversation.php:1151 mod/editpost.php:74 mod/message.php:258
 #: mod/message.php:439 mod/wallmessage.php:139
 msgid "Upload photo"
 msgstr "Joindre photo"
 
-#: include/conversation.php:1153 mod/editpost.php:75
+#: include/conversation.php:1152 mod/editpost.php:75
 msgid "upload photo"
 msgstr "envoi image"
 
-#: include/conversation.php:1154 mod/editpost.php:76
+#: include/conversation.php:1153 mod/editpost.php:76
 msgid "Attach file"
 msgstr "Joindre fichier"
 
-#: include/conversation.php:1155 mod/editpost.php:77
+#: include/conversation.php:1154 mod/editpost.php:77
 msgid "attach file"
 msgstr "ajout fichier"
 
-#: include/conversation.php:1156 src/Object/Post.php:874
+#: include/conversation.php:1155 src/Object/Post.php:875
 msgid "Bold"
 msgstr "Gras"
 
-#: include/conversation.php:1157 src/Object/Post.php:875
+#: include/conversation.php:1156 src/Object/Post.php:876
 msgid "Italic"
 msgstr "Italique"
 
-#: include/conversation.php:1158 src/Object/Post.php:876
+#: include/conversation.php:1157 src/Object/Post.php:877
 msgid "Underline"
 msgstr "Souligné"
 
-#: include/conversation.php:1159 src/Object/Post.php:877
+#: include/conversation.php:1158 src/Object/Post.php:878
 msgid "Quote"
 msgstr "Citation"
 
-#: include/conversation.php:1160 src/Object/Post.php:878
+#: include/conversation.php:1159 src/Object/Post.php:879
 msgid "Code"
 msgstr "Code"
 
-#: include/conversation.php:1161 src/Object/Post.php:879
+#: include/conversation.php:1160 src/Object/Post.php:880
 msgid "Image"
 msgstr "Image"
 
-#: include/conversation.php:1162 src/Object/Post.php:880
+#: include/conversation.php:1161 src/Object/Post.php:881
 msgid "Link"
 msgstr "Lien"
 
-#: include/conversation.php:1163 src/Object/Post.php:881
+#: include/conversation.php:1162 src/Object/Post.php:882
 msgid "Link or Media"
 msgstr "Lien ou média"
 
-#: include/conversation.php:1164 mod/editpost.php:84
+#: include/conversation.php:1163 mod/editpost.php:84
 msgid "Set your location"
 msgstr "Définir votre localisation"
 
-#: include/conversation.php:1165 mod/editpost.php:85
+#: include/conversation.php:1164 mod/editpost.php:85
 msgid "set location"
 msgstr "spéc. localisation"
 
-#: include/conversation.php:1166 mod/editpost.php:86
+#: include/conversation.php:1165 mod/editpost.php:86
 msgid "Clear browser location"
 msgstr "Effacer la localisation du navigateur"
 
-#: include/conversation.php:1167 mod/editpost.php:87
+#: include/conversation.php:1166 mod/editpost.php:87
 msgid "clear location"
 msgstr "supp. localisation"
 
-#: include/conversation.php:1169 mod/editpost.php:102
+#: include/conversation.php:1168 mod/editpost.php:102
 msgid "Set title"
 msgstr "Définir un titre"
 
-#: include/conversation.php:1171 mod/editpost.php:104
+#: include/conversation.php:1170 mod/editpost.php:104
 msgid "Categories (comma-separated list)"
 msgstr "Catégories (séparées par des virgules)"
 
-#: include/conversation.php:1173 mod/editpost.php:89
+#: include/conversation.php:1172 mod/editpost.php:89
 msgid "Permission settings"
 msgstr "Réglages des permissions"
 
-#: include/conversation.php:1174 mod/editpost.php:119
+#: include/conversation.php:1173 mod/editpost.php:119
 msgid "permissions"
 msgstr "permissions"
 
-#: include/conversation.php:1183 mod/editpost.php:99
+#: include/conversation.php:1182 mod/editpost.php:99
 msgid "Public post"
 msgstr "Publication publique"
 
-#: include/conversation.php:1187 mod/editpost.php:110 mod/events.php:551
+#: include/conversation.php:1186 mod/editpost.php:110 mod/events.php:551
 #: mod/photos.php:1458 mod/photos.php:1497 mod/photos.php:1557
-#: src/Object/Post.php:883
+#: src/Object/Post.php:884
 msgid "Preview"
 msgstr "Aperçu"
 
-#: include/conversation.php:1191 include/items.php:396
+#: include/conversation.php:1190 include/items.php:396
 #: mod/dfrn_request.php:650 mod/editpost.php:113 mod/fbrowser.php:104
 #: mod/fbrowser.php:134 mod/follow.php:161 mod/message.php:153
 #: mod/photos.php:257 mod/photos.php:325 mod/settings.php:666
@@ -461,50 +461,50 @@ msgstr "Aperçu"
 msgid "Cancel"
 msgstr "Annuler"
 
-#: include/conversation.php:1196
+#: include/conversation.php:1195
 msgid "Post to Groups"
 msgstr "Publier aux groupes"
 
-#: include/conversation.php:1197
+#: include/conversation.php:1196
 msgid "Post to Contacts"
 msgstr "Publier aux contacts"
 
-#: include/conversation.php:1198
+#: include/conversation.php:1197
 msgid "Private post"
 msgstr "Message privé"
 
-#: include/conversation.php:1203 mod/editpost.php:117
+#: include/conversation.php:1202 mod/editpost.php:117
 #: src/Model/Profile.php:370
 msgid "Message"
 msgstr "Message"
 
-#: include/conversation.php:1204 mod/editpost.php:118
+#: include/conversation.php:1203 mod/editpost.php:118
 msgid "Browser"
 msgstr "Navigateur"
 
-#: include/conversation.php:1476
+#: include/conversation.php:1475
 msgid "View all"
 msgstr "Voir tout"
 
-#: include/conversation.php:1500
+#: include/conversation.php:1499
 msgid "Like"
 msgid_plural "Likes"
 msgstr[0] "Like"
 msgstr[1] "Likes"
 
-#: include/conversation.php:1503
+#: include/conversation.php:1502
 msgid "Dislike"
 msgid_plural "Dislikes"
 msgstr[0] "Dislike"
 msgstr[1] "Dislikes"
 
-#: include/conversation.php:1509
+#: include/conversation.php:1508
 msgid "Not Attending"
 msgid_plural "Not Attending"
 msgstr[0] "Ne participe pas"
 msgstr[1] "Ne participent pas"
 
-#: include/conversation.php:1512 src/Content/ContactSelector.php:167
+#: include/conversation.php:1511 src/Content/ContactSelector.php:167
 msgid "Undecided"
 msgid_plural "Undecided"
 msgstr[0] "Indécis"
@@ -853,16 +853,17 @@ msgstr "Oui"
 #: mod/invite.php:111 mod/item.php:167 mod/manage.php:129 mod/message.php:56
 #: mod/message.php:101 mod/network.php:35 mod/nogroup.php:18 mod/notes.php:27
 #: mod/notifications.php:70 mod/ostatus_subscribe.php:18 mod/photos.php:186
-#: mod/photos.php:1020 mod/poke.php:141 mod/profile_photo.php:32
-#: mod/profile_photo.php:177 mod/profile_photo.php:204 mod/profiles.php:182
-#: mod/profiles.php:499 mod/regmod.php:89 mod/repair_ostatus.php:16
+#: mod/photos.php:1020 mod/poke.php:141 mod/profiles.php:182
+#: mod/profiles.php:499 mod/profile_photo.php:32 mod/profile_photo.php:177
+#: mod/profile_photo.php:204 mod/regmod.php:89 mod/repair_ostatus.php:16
 #: mod/settings.php:48 mod/settings.php:154 mod/settings.php:655
 #: mod/suggest.php:62 mod/uimport.php:17 mod/unfollow.php:22
 #: mod/unfollow.php:77 mod/unfollow.php:109 mod/viewcontacts.php:56
-#: mod/wall_attach.php:76 mod/wall_attach.php:79 mod/wall_upload.php:107
-#: mod/wall_upload.php:110 mod/wallmessage.php:19 mod/wallmessage.php:43
-#: mod/wallmessage.php:82 mod/wallmessage.php:106 src/Module/Attach.php:42
-#: src/Module/Contact.php:360 src/Module/Register.php:193 src/App.php:1482
+#: mod/wallmessage.php:19 mod/wallmessage.php:43 mod/wallmessage.php:82
+#: mod/wallmessage.php:106 mod/wall_attach.php:76 mod/wall_attach.php:79
+#: mod/wall_upload.php:107 mod/wall_upload.php:110 src/App.php:1480
+#: src/Module/Attach.php:42 src/Module/Contact.php:360
+#: src/Module/Register.php:193
 msgid "Permission denied."
 msgstr "Permission refusée."
 
@@ -870,28 +871,11 @@ msgstr "Permission refusée."
 msgid "Archives"
 msgstr "Archives"
 
-#: include/items.php:520 view/theme/vier/theme.php:255
-#: src/Content/ForumManager.php:135 src/Content/Widget.php:329
-#: src/Object/Post.php:458 src/App.php:666
+#: include/items.php:520 src/Content/ForumManager.php:135
+#: src/Content/Widget.php:329 view/theme/vier/theme.php:255
 msgid "show more"
 msgstr "montrer plus"
 
-#: mod/apps.php:15 src/App.php:1351
-msgid "You must be logged in to use addons. "
-msgstr "Vous devez être connecté pour utiliser les greffons."
-
-#: mod/apps.php:20
-msgid "Applications"
-msgstr "Applications"
-
-#: mod/apps.php:25
-msgid "No installed applications."
-msgstr "Pas d'application installée."
-
-#: mod/maintenance.php:26
-msgid "System down for maintenance"
-msgstr "Système indisponible pour cause de maintenance"
-
 #: mod/admin.php:122
 msgid "Theme settings updated."
 msgstr "Réglages du thème sauvés."
@@ -1059,7 +1043,7 @@ msgid "Save Settings"
 msgstr "Sauvegarder les paramètres"
 
 #: mod/admin.php:386 mod/admin.php:404 mod/dfrn_request.php:346
-#: mod/friendica.php:131 src/Model/Contact.php:1702
+#: mod/friendica.php:131 src/Model/Contact.php:1719
 msgid "Blocked domain"
 msgstr "Domaine bloqué"
 
@@ -1300,8 +1284,8 @@ msgstr "Nom du destinataire"
 msgid "Recipient Profile"
 msgstr "Profil du destinataire"
 
-#: mod/admin.php:828 view/theme/frio/theme.php:269
-#: src/Core/NotificationsManager.php:182 src/Content/Nav.php:239
+#: mod/admin.php:828 src/Content/Nav.php:239
+#: src/Core/NotificationsManager.php:182 view/theme/frio/theme.php:269
 msgid "Network"
 msgstr "Réseau"
 
@@ -2005,14 +1989,14 @@ msgstr "Désactive le support natif d'OStatus (StatusNet, GNU Social, etc...). T
 
 #: mod/admin.php:1642
 msgid "Only import OStatus/ActivityPub threads from our contacts"
-msgstr ""
+msgstr "Importer seulement les conversations OStatus/ActivityPub provenant de profils distants connus."
 
 #: mod/admin.php:1642
 msgid ""
 "Normally we import every content from our OStatus and ActivityPub contacts. "
 "With this option we only store threads that are started by a contact that is"
 " known on our system."
-msgstr ""
+msgstr "Normalement toutes les conversations auxquelles les contacts suivis participent sont importées en entier peu importe l'auteur original. Avec cette option, seules les conversations démarrées par un contact suivi sont importées."
 
 #: mod/admin.php:1643
 msgid "OStatus support can only be enabled if threading is enabled."
@@ -2088,13 +2072,13 @@ msgstr "Limite de charge système pour le rendu des pages - défaut 50."
 
 #: mod/admin.php:1654
 msgid "Minimal Memory"
-msgstr ""
+msgstr "Mémoire minimum"
 
 #: mod/admin.php:1654
 msgid ""
 "Minimal free memory in MB for the worker. Needs access to /proc/meminfo - "
 "default 0 (deactivated)."
-msgstr ""
+msgstr "Mémoire libre minimale pour les tâches de fond (en Mo). Requiert l'accès à <code>/proc/meminfo</code>. La valeur par défaut est 0 (désactivé)."
 
 #: mod/admin.php:1655
 msgid "Maximum table size for optimization"
@@ -2104,7 +2088,7 @@ msgstr "Limite de taille de table pour l'optimisation"
 msgid ""
 "Maximum table size (in MB) for the automatic optimization. Enter -1 to "
 "disable it."
-msgstr ""
+msgstr "Limite de taille de table (en Mo) pour l'optimisation automatique. -1 pour désactiver cette limite."
 
 #: mod/admin.php:1656
 msgid "Minimum level of fragmentation"
@@ -2146,7 +2130,7 @@ msgid ""
 "and older friendica servers, where global contacts weren't available. The "
 "fallback increases the server load, so the recommended setting is 'Users, "
 "Global Contacts'."
-msgstr ""
+msgstr "Demande régulièrement les serveurs distants connus une liste de profils distants. \"Utilisateurs\" concerne les utilisateurs locaux du serveur distant, \"Contacts Globaux\" concerne tous les profils dont le serveur distant a connaissance. \"Alternative\" est prévu pour les serveurs RedMatrix et les versions obsolètes de Friendica. Ce choix augmente significativement la charge serveur, donc le choix recommendé est \"Utilisateurs, Contacts Globaux\"."
 
 #: mod/admin.php:1661
 msgid "Timeframe for fetching global contacts"
@@ -2201,28 +2185,28 @@ msgstr "Ne pas afficher la liste des hashtags à la fin d’un message."
 
 #: mod/admin.php:1668
 msgid "Clean database"
-msgstr ""
+msgstr "Nettoyer la base de données"
 
 #: mod/admin.php:1668
 msgid ""
 "Remove old remote items, orphaned database records and old content from some"
 " other helper tables."
-msgstr ""
+msgstr "Supprime les conversations distantes anciennes, les enregistrements orphelins et le contenu obsolète de certaines tables de débogage."
 
 #: mod/admin.php:1669
 msgid "Lifespan of remote items"
-msgstr ""
+msgstr "Durée de vie des conversations distantes"
 
 #: mod/admin.php:1669
 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 ""
+msgstr "Si le nettoyage de la base de donnée est actif, cette valeur représente le délai en jours après lequel les conversations distantes sont supprimées. Les conversations démarrées par un utilisateur local, étoilées ou archivées sont toujours conservées. 0 pour désactiver."
 
 #: mod/admin.php:1670
 msgid "Lifespan of unclaimed items"
-msgstr ""
+msgstr "Durée de vie des conversations relayées"
 
 #: mod/admin.php:1670
 msgid ""
@@ -2230,18 +2214,18 @@ msgid ""
 "unclaimed remote items (mostly content from the relay) will be deleted. "
 "Default value is 90 days. Defaults to the general lifespan value of remote "
 "items if set to 0."
-msgstr ""
+msgstr "Si le nettoyage de la base de donnée est actif, cette valeur représente le délai en jours après lequel les conversations relayées qui n'ont pas reçu d'interactions locales sont supprimées. La valeur par défaut est 90 jours. 0 pour aligner cette valeur sur la durée de vie des conversations distantes."
 
 #: mod/admin.php:1671
 msgid "Lifespan of raw conversation data"
-msgstr ""
+msgstr "Durée de vie des méta-données de conversation"
 
 #: mod/admin.php:1671
 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 ""
+msgstr "Cette valeur représente le délai en jours après lequel les méta-données de conversations sont supprimées. Ces méta-données sont utilisées par les protocoles ActivityPub et OStatus, et pour le débogage. Il est prudent de conserver ces meta-données pendant au moins 14 jours. La valeur par défaut est 90 jours."
 
 #: mod/admin.php:1672
 msgid "Path to item cache"
@@ -2249,7 +2233,7 @@ msgstr "Chemin vers le cache des objets."
 
 #: mod/admin.php:1672
 msgid "The item caches buffers generated bbcode and external images."
-msgstr ""
+msgstr "Le cache de publications contient des textes HTML de BBCode compil's et une copie de chaque image distante."
 
 #: mod/admin.php:1673
 msgid "Cache duration in seconds"
@@ -2298,7 +2282,7 @@ msgstr "Désactiver le proxy image "
 msgid ""
 "The picture proxy increases performance and privacy. It shouldn't be used on"
 " systems with very low bandwidth."
-msgstr ""
+msgstr "Le proxy d'image améliore les performances d'affichage et protège la vie privée des utilisateurs locaux. Il n'est pas recommandé de l'activer sur un serveur avec une bande passante limitée."
 
 #: mod/admin.php:1678
 msgid "Only search in tags"
@@ -2316,7 +2300,7 @@ msgstr "Nouvelle URL de base"
 msgid ""
 "Change base url for this server. Sends relocate message to all Friendica and"
 " Diaspora* contacts of all users."
-msgstr ""
+msgstr "Changer l'URL de base de ce serveur. Envoie un message de déménagement à tous les contacts Friendica et Diaspora des utilisateurs locaux."
 
 #: mod/admin.php:1682
 msgid "RINO Encryption"
@@ -2328,7 +2312,7 @@ msgstr "Couche de chiffrement entre les nœuds du réseau."
 
 #: mod/admin.php:1682
 msgid "Enabled"
-msgstr ""
+msgstr "Activé"
 
 #: mod/admin.php:1684
 msgid "Maximum number of parallel workers"
@@ -2339,7 +2323,7 @@ msgstr "Nombre maximum de processus simultanés"
 msgid ""
 "On shared hosters set this to %d. On larger systems, values of %d are great."
 " Default value is %d."
-msgstr ""
+msgstr "Sur un hébergement partagé, mettez %d. Sur des serveurs plus puissants, %d est optimal. La valeur par défaut est %d."
 
 #: mod/admin.php:1685
 msgid "Don't use 'proc_open' with the worker"
@@ -2354,17 +2338,17 @@ msgstr "Activez cette option si votre système ne permet pas d'utiliser 'proc_op
 
 #: mod/admin.php:1686
 msgid "Enable fastlane"
-msgstr ""
+msgstr "Activer la file prioritaire"
 
 #: mod/admin.php:1686
 msgid ""
 "When enabed, the fastlane mechanism starts an additional worker if processes"
 " with higher priority are blocked by processes of lower priority."
-msgstr ""
+msgstr "La file prioritaire est un ouvrier additionel démarré quand des tâches de fondde grande importance sont bloquées par des tâches de moindre importance dans la file d'attente."
 
 #: mod/admin.php:1687
 msgid "Enable frontend worker"
-msgstr ""
+msgstr "Activer l'ouvrier manuel"
 
 #: mod/admin.php:1687
 #, php-format
@@ -2374,77 +2358,77 @@ msgid ""
 "might want to call %s/worker on a regular basis via an external cron job. "
 "You should only enable this option if you cannot utilize cron/scheduled jobs"
 " on your server."
-msgstr ""
+msgstr "L'ouvrier manuel est lancé à la réception de messages distants. Sur un petit serveur il est conseillé d'ouvrir %s/worker régulièrement via une tâche planifée. Vous ne devriez activer cette option que si vous ne pouvez pas définir de tâches récurrentes sur votre serveur,"
 
 #: mod/admin.php:1689
 msgid "Subscribe to relay"
-msgstr ""
+msgstr "S'abonner au relai"
 
 #: mod/admin.php:1689
 msgid ""
 "Enables the receiving of public posts from the relay. They will be included "
 "in the search, subscribed tags and on the global community page."
-msgstr ""
+msgstr "Active la réception de conversations publiques relayées. Elles sont affichées dans la page de recherche, les recherches enregistrées et dans la page de communauté globale."
 
 #: mod/admin.php:1690
 msgid "Relay server"
-msgstr ""
+msgstr "Serveur relai"
 
 #: mod/admin.php:1690
 msgid ""
 "Address of the relay server where public posts should be send to. For "
 "example https://relay.diasp.org"
-msgstr ""
+msgstr "URL du serveur relai auquel les conversations publique locales doivent être soumises."
 
 #: mod/admin.php:1691
 msgid "Direct relay transfer"
-msgstr ""
+msgstr "Relai direct"
 
 #: mod/admin.php:1691
 msgid ""
 "Enables the direct transfer to other servers without using the relay servers"
-msgstr ""
+msgstr "Soumet les conversations publiques aux serveurs distants sans passer par le serveur relai."
 
 #: mod/admin.php:1692
 msgid "Relay scope"
-msgstr ""
+msgstr "Filtre du relai"
 
 #: mod/admin.php:1692
 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 ""
+msgstr "\"Tous\" signifie que toutes les conversations publiques en provenance du relai sont acceptées. \"Tags\" signifie que seules les conversations comportant les tags suivants sont acceptées."
 
 #: mod/admin.php:1692
 msgid "all"
-msgstr ""
+msgstr "Tous"
 
 #: mod/admin.php:1692
 msgid "tags"
-msgstr ""
+msgstr "Tags"
 
 #: mod/admin.php:1693
 msgid "Server tags"
-msgstr ""
+msgstr "Tags de filtre du relai"
 
 #: mod/admin.php:1693
 msgid "Comma separated list of tags for the 'tags' subscription."
-msgstr ""
+msgstr "Liste de tags séparés par des virgules pour le filtre de relai."
 
 #: mod/admin.php:1694
 msgid "Allow user tags"
-msgstr ""
+msgstr "Inclure les tags des utilisateurs"
 
 #: mod/admin.php:1694
 msgid ""
 "If enabled, the tags from the saved searches will used for the 'tags' "
 "subscription in addition to the 'relay_server_tags'."
-msgstr ""
+msgstr "Inclut les tags des recherches enregistrées des utilisateurs au filtre de relai."
 
 #: mod/admin.php:1697
 msgid "Start Relocation"
-msgstr ""
+msgstr "Démarrer le déménagement"
 
 #: mod/admin.php:1724
 msgid "Update has been marked successful"
@@ -2545,7 +2529,7 @@ msgid ""
 "\t\t\tThank you and welcome to %4$s."
 msgstr ""
 
-#: mod/admin.php:1871 src/Model/User.php:858
+#: mod/admin.php:1871 src/Model/User.php:859
 #, php-format
 msgid "Registration details for %s"
 msgstr "Détails d'inscription pour %s"
@@ -2559,7 +2543,7 @@ msgstr[1] "%s utilisateurs ont (dé)bloqué"
 
 #: mod/admin.php:1888 mod/admin.php:1942
 msgid "You can't remove yourself"
-msgstr ""
+msgstr "Vous ne pouvez pas supprimer votre propre compte"
 
 #: mod/admin.php:1891
 #, php-format
@@ -2601,7 +2585,7 @@ msgstr "Compte d' \"amitié automatique\""
 
 #: mod/admin.php:2003
 msgid "Private Forum"
-msgstr ""
+msgstr "Forum Privé"
 
 #: mod/admin.php:2006 mod/settings.php:1033
 msgid "Personal Page"
@@ -2609,7 +2593,7 @@ msgstr "Page personnelle"
 
 #: mod/admin.php:2007 mod/settings.php:1037
 msgid "Organisation Page"
-msgstr ""
+msgstr "Page Associative"
 
 #: mod/admin.php:2008 mod/settings.php:1041
 msgid "News Page"
@@ -2617,11 +2601,11 @@ msgstr "Page d'informations"
 
 #: mod/admin.php:2009 mod/settings.php:1045
 msgid "Community Forum"
-msgstr ""
+msgstr "Forum Communautaire"
 
 #: mod/admin.php:2010
 msgid "Relay"
-msgstr ""
+msgstr "Relai"
 
 #: mod/admin.php:2056 mod/admin.php:2067 mod/admin.php:2081 mod/admin.php:2099
 #: src/Content/ContactSelector.php:86
@@ -2642,7 +2626,7 @@ msgstr "Dernier élément"
 
 #: mod/admin.php:2056
 msgid "Type"
-msgstr ""
+msgstr "Type"
 
 #: mod/admin.php:2063
 msgid "Add User"
@@ -2666,7 +2650,7 @@ msgstr "Pas d'inscriptions."
 
 #: mod/admin.php:2069
 msgid "Note from the user"
-msgstr ""
+msgstr "Message personnel"
 
 #: mod/admin.php:2070 mod/notifications.php:183 mod/notifications.php:269
 msgid "Approve"
@@ -2678,7 +2662,7 @@ msgstr "Rejetter"
 
 #: mod/admin.php:2074
 msgid "User blocked"
-msgstr ""
+msgstr "Utilisateur bloqué"
 
 #: mod/admin.php:2076
 msgid "Site admin"
@@ -2694,7 +2678,7 @@ msgstr "Nouvel utilisateur"
 
 #: mod/admin.php:2081
 msgid "Permanent deletion"
-msgstr ""
+msgstr "Suppression définitive"
 
 #: mod/admin.php:2086
 msgid ""
@@ -2727,12 +2711,12 @@ msgstr "Adresse mail du nouvel utilisateur."
 #: mod/admin.php:2141
 #, php-format
 msgid "Addon %s disabled."
-msgstr ""
+msgstr "Add-on %s désactivé."
 
 #: mod/admin.php:2144
 #, php-format
 msgid "Addon %s enabled."
-msgstr ""
+msgstr "Add-on %s activé."
 
 #: mod/admin.php:2155 mod/admin.php:2405
 msgid "Disable"
@@ -2747,7 +2731,7 @@ msgid "Toggle"
 msgstr "Activer/Désactiver"
 
 #: mod/admin.php:2181 mod/admin.php:2438 mod/newmember.php:20
-#: mod/settings.php:136 view/theme/frio/theme.php:272 src/Content/Nav.php:263
+#: mod/settings.php:136 src/Content/Nav.php:263 view/theme/frio/theme.php:272
 msgid "Settings"
 msgstr "Réglages"
 
@@ -2761,7 +2745,7 @@ msgstr "Mainteneur : "
 
 #: mod/admin.php:2241
 msgid "Reload active addons"
-msgstr ""
+msgstr "Recharger les add-ons activés."
 
 #: mod/admin.php:2246
 #, php-format
@@ -2769,7 +2753,7 @@ msgid ""
 "There are currently no addons available on your node. You can find the "
 "official addon repository at %1$s and might find other interesting addons in"
 " the open addon registry at %2$s"
-msgstr ""
+msgstr "Il n'y a pas d'add-on disponible sur votre serveur. Vous pouvez trouver le dépôt officiel d'add-ons sur %1$s et des add-ons non-officiel dans le répertoire d'add-ons ouvert sur %2$s."
 
 #: mod/admin.php:2367
 msgid "No themes found."
@@ -2786,7 +2770,7 @@ msgstr "Recharger les thèmes actifs"
 #: mod/admin.php:2487
 #, php-format
 msgid "No themes found on the system. They should be placed in %1$s"
-msgstr ""
+msgstr "Aucun thème trouvé. Leur emplacement d'installation est%1$s."
 
 #: mod/admin.php:2488
 msgid "[Experimental]"
@@ -2841,21 +2825,21 @@ msgid ""
 "the 'error_log' line is relative to the friendica top-level directory and "
 "must be writeable by the web server. The option '1' for 'log_errors' and "
 "'display_errors' is to enable these options, set to '0' to disable them."
-msgstr ""
+msgstr "Pour activer temporairement la journalisation de PHP vous pouvez insérez les lignes suivantes au début du fichier <code>index.php</code> dans votre répertoire Friendica. The nom de fichier défini dans la ligne <code>'error_log'</code> est relatif au répertoire d'installation de Friendica et le serveur web doit avoir le droit d'écriture sur ce fichier. Les lignes <code>log_errors</code> et <code>display_errors</code> prennent les valeurs <code>0</code>  et <code>1</code> respectivement pour les activer ou désactiver."
 
 #: mod/admin.php:2599
 #, php-format
 msgid ""
 "Error trying to open <strong>%1$s</strong> log file.\\r\\n<br/>Check to see "
 "if file %1$s exist and is readable."
-msgstr ""
+msgstr "Erreur lors de l'ouverture du fichier de journal <strong>%1$s</strong>.\\r\\n<br/>Veuillez vérifier que le fichier %1$s existe et que le serveur web a le droit de lecture dessus."
 
 #: mod/admin.php:2603
 #, php-format
 msgid ""
 "Couldn't open <strong>%1$s</strong> log file.\\r\\n<br/>Check to see if file"
 " %1$s is readable."
-msgstr ""
+msgstr "Erreur lors de l'ouverture du fichier de journal <strong>%1$s</strong>.\\r\\n<br/>Veuillez vérifier que le fichier %1$s existe et que le serveur web a le droit de lecture dessus."
 
 #: mod/admin.php:2696 mod/admin.php:2697 mod/settings.php:763
 msgid "Off"
@@ -2911,109 +2895,121 @@ msgstr "Voulez-vous autoriser cette application à accéder à vos publications
 msgid "No"
 msgstr "Non"
 
+#: mod/apps.php:15 src/App.php:1349
+msgid "You must be logged in to use addons. "
+msgstr "Vous devez être connecté pour utiliser les greffons."
+
+#: mod/apps.php:20
+msgid "Applications"
+msgstr "Applications"
+
+#: mod/apps.php:25
+msgid "No installed applications."
+msgstr "Pas d'application installée."
+
 #: mod/babel.php:25
 msgid "Source input"
-msgstr ""
+msgstr "Saisie source"
 
 #: mod/babel.php:31
 msgid "BBCode::toPlaintext"
-msgstr ""
+msgstr "BBCode::toPlaintext"
 
 #: mod/babel.php:37
 msgid "BBCode::convert (raw HTML)"
-msgstr ""
+msgstr "BBCode::convert (code HTML)"
 
 #: mod/babel.php:42
 msgid "BBCode::convert"
-msgstr ""
+msgstr "BBCode::convert"
 
 #: mod/babel.php:48
 msgid "BBCode::convert => HTML::toBBCode"
-msgstr ""
+msgstr "BBCode::convert => HTML::toBBCode"
 
 #: mod/babel.php:54
 msgid "BBCode::toMarkdown"
-msgstr ""
+msgstr "BBCode::toMarkdown"
 
 #: mod/babel.php:60
 msgid "BBCode::toMarkdown => Markdown::convert"
-msgstr ""
+msgstr "BBCode::toMarkdown => Markdown::convert"
 
 #: mod/babel.php:66
 msgid "BBCode::toMarkdown => Markdown::toBBCode"
-msgstr ""
+msgstr "BBCode::toMarkdown => Markdown::toBBCode"
 
 #: mod/babel.php:72
 msgid "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
-msgstr ""
+msgstr "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"
 
 #: mod/babel.php:83
 msgid "Item Body"
-msgstr ""
+msgstr "Corps du message"
 
 #: mod/babel.php:87
 msgid "Item Tags"
-msgstr ""
+msgstr "Tags du messages"
 
 #: mod/babel.php:94
 msgid "Source input (Diaspora format)"
-msgstr ""
+msgstr "Saisie source (format Diaspora)"
 
 #: mod/babel.php:100
 msgid "Markdown::convert (raw HTML)"
-msgstr ""
+msgstr "Markdown::convert (code HTML)"
 
 #: mod/babel.php:105
 msgid "Markdown::convert"
-msgstr ""
+msgstr "Markdown::convert"
 
 #: mod/babel.php:111
 msgid "Markdown::toBBCode"
-msgstr ""
+msgstr "Markdown::toBBCode"
 
 #: mod/babel.php:118
 msgid "Raw HTML input"
-msgstr ""
+msgstr "Saisie code HTML"
 
 #: mod/babel.php:123
 msgid "HTML Input"
-msgstr ""
+msgstr "Code HTML"
 
 #: mod/babel.php:129
 msgid "HTML::toBBCode"
-msgstr ""
+msgstr "HTML::toBBCode"
 
 #: mod/babel.php:135
 msgid "HTML::toBBCode => BBCode::convert"
-msgstr ""
+msgstr "HTML::toBBCode => BBCode::convert"
 
 #: mod/babel.php:140
 msgid "HTML::toBBCode => BBCode::convert (raw HTML)"
-msgstr ""
+msgstr "HTML::toBBCode => BBCode::convert (code HTML)"
 
 #: mod/babel.php:146
 msgid "HTML::toMarkdown"
-msgstr ""
+msgstr "HTML::toMarkdown"
 
 #: mod/babel.php:152
 msgid "HTML::toPlaintext"
-msgstr ""
+msgstr "HTML::toPlaintext"
 
 #: mod/babel.php:160
 msgid "Source text"
-msgstr ""
+msgstr "Texte source"
 
 #: mod/babel.php:161
 msgid "BBCode"
-msgstr ""
+msgstr "BBCode"
 
 #: mod/babel.php:162
 msgid "Markdown"
-msgstr ""
+msgstr "Markdown"
 
 #: mod/babel.php:163
 msgid "HTML"
-msgstr ""
+msgstr "HTML"
 
 #: mod/bookmarklet.php:22 src/Content/Nav.php:170 src/Module/Login.php:322
 msgid "Login"
@@ -3021,7 +3017,7 @@ msgstr "Connexion"
 
 #: mod/bookmarklet.php:32
 msgid "Bad Request"
-msgstr ""
+msgstr "Requête erronée"
 
 #: mod/bookmarklet.php:54
 msgid "The post was created"
@@ -3033,7 +3029,7 @@ msgid "Access denied."
 msgstr "Accès refusé."
 
 #: mod/cal.php:46 mod/dfrn_poll.php:486 mod/help.php:68
-#: mod/viewcontacts.php:34 src/App.php:1402
+#: mod/viewcontacts.php:34 src/App.php:1400
 msgid "Page not found."
 msgstr "Page introuvable."
 
@@ -3041,9 +3037,9 @@ msgstr "Page introuvable."
 msgid "Access to this profile has been restricted."
 msgstr "L'accès au profil a été restreint."
 
-#: mod/cal.php:273 mod/events.php:384 view/theme/frio/theme.php:266
-#: view/theme/frio/theme.php:270 src/Content/Nav.php:160
+#: mod/cal.php:273 mod/events.php:384 src/Content/Nav.php:160
 #: src/Content/Nav.php:226 src/Model/Profile.php:937 src/Model/Profile.php:948
+#: view/theme/frio/theme.php:266 view/theme/frio/theme.php:270
 msgid "Events"
 msgstr "Événements"
 
@@ -3059,30 +3055,30 @@ msgstr "Précédent"
 msgid "Next"
 msgstr "Suivant"
 
-#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:429
+#: mod/cal.php:279 mod/events.php:393 src/Model/Event.php:428
 msgid "today"
 msgstr "aujourd'hui"
 
-#: mod/cal.php:280 mod/events.php:394 src/Util/Temporal.php:314
-#: src/Model/Event.php:430
+#: mod/cal.php:280 mod/events.php:394 src/Model/Event.php:429
+#: src/Util/Temporal.php:314
 msgid "month"
 msgstr "mois"
 
-#: mod/cal.php:281 mod/events.php:395 src/Util/Temporal.php:315
-#: src/Model/Event.php:431
+#: mod/cal.php:281 mod/events.php:395 src/Model/Event.php:430
+#: src/Util/Temporal.php:315
 msgid "week"
 msgstr "semaine"
 
-#: mod/cal.php:282 mod/events.php:396 src/Util/Temporal.php:316
-#: src/Model/Event.php:432
+#: mod/cal.php:282 mod/events.php:396 src/Model/Event.php:431
+#: src/Util/Temporal.php:316
 msgid "day"
 msgstr "jour"
 
 #: mod/cal.php:283 mod/events.php:397
 msgid "list"
-msgstr ""
+msgstr "liste"
 
-#: mod/cal.php:296 src/Core/Console/NewPassword.php:67 src/Model/User.php:323
+#: mod/cal.php:296 src/Core/Console/NewPassword.php:67 src/Model/User.php:324
 msgid "User not found"
 msgstr "Utilisateur introuvable"
 
@@ -3115,7 +3111,7 @@ msgstr "Accès public refusé."
 
 #: mod/community.php:75
 msgid "Community option not available."
-msgstr ""
+msgstr "L'option communauté n'est pas disponible"
 
 #: mod/community.php:92
 msgid "Not available."
@@ -3123,19 +3119,19 @@ msgstr "Indisponible."
 
 #: mod/community.php:102
 msgid "Local Community"
-msgstr ""
+msgstr "Communauté locale"
 
 #: mod/community.php:105
 msgid "Posts from local users on this server"
-msgstr ""
+msgstr "Conversations publiques démarrées par des utilisateurs locaux"
 
 #: mod/community.php:113
 msgid "Global Community"
-msgstr ""
+msgstr "Communauté globale"
 
 #: mod/community.php:116
 msgid "Posts from users of the whole federated network"
-msgstr ""
+msgstr "Conversations publiques provenant du réseau fédéré global"
 
 #: mod/community.php:162 mod/search.php:229
 msgid "No results."
@@ -3145,7 +3141,7 @@ msgstr "Aucun résultat."
 msgid ""
 "This community stream shows all public posts received by this node. They may"
 " not reflect the opinions of this node’s users."
-msgstr ""
+msgstr "Ce fil communautaire liste toutes les conversations publiques reçues par ce serveur. Elles ne reflètent pas nécessairement les opinions personelles des utilisateurs locaux."
 
 #: mod/credits.php:19
 msgid "Credits"
@@ -3189,11 +3185,11 @@ msgstr "Pas de miroir"
 
 #: mod/crepair.php:130
 msgid "Mirror as forwarded posting"
-msgstr ""
+msgstr "Refléter les publications de ce profil comme des partages"
 
 #: mod/crepair.php:130 mod/crepair.php:132
 msgid "Mirror as my own posting"
-msgstr ""
+msgstr "Refléter les publications de ce profil comme les vôtres"
 
 #: mod/crepair.php:145
 msgid "Return to contact editor"
@@ -3208,11 +3204,10 @@ msgstr "Récupérer à nouveau les données de contact"
 #: mod/message.php:261 mod/message.php:441 mod/photos.php:1049
 #: mod/photos.php:1137 mod/photos.php:1412 mod/photos.php:1457
 #: mod/photos.php:1496 mod/photos.php:1556 mod/poke.php:188
-#: mod/profiles.php:562 view/theme/duepuntozero/config.php:72
-#: view/theme/frio/config.php:119 view/theme/quattro/config.php:74
-#: view/theme/vier/config.php:120 src/Module/Contact.php:594
-#: src/Module/Install.php:187 src/Module/Install.php:222
-#: src/Object/Post.php:873
+#: mod/profiles.php:562 src/Module/Contact.php:594 src/Module/Install.php:187
+#: src/Module/Install.php:222 src/Object/Post.php:874
+#: view/theme/duepuntozero/config.php:72 view/theme/frio/config.php:119
+#: view/theme/quattro/config.php:74 view/theme/vier/config.php:120
 msgid "Submit"
 msgstr "Envoyer"
 
@@ -3244,7 +3239,7 @@ msgstr "URL du compte"
 
 #: mod/crepair.php:163
 msgid "Account URL Alias"
-msgstr ""
+msgstr "Alias d'URL du compte"
 
 #: mod/crepair.php:164
 msgid "Friend Request URL"
@@ -3268,30 +3263,30 @@ msgstr "Nouvelle photo depuis cette URL"
 
 #: mod/delegate.php:42
 msgid "Parent user not found."
-msgstr ""
+msgstr "Compte parent inconnu."
 
 #: mod/delegate.php:149
 msgid "No parent user"
-msgstr ""
+msgstr "Pas d'utilisateur parent"
 
 #: mod/delegate.php:164
 msgid "Parent Password:"
-msgstr ""
+msgstr "Mot de passe du compte parent :"
 
 #: mod/delegate.php:164
 msgid ""
 "Please enter the password of the parent account to legitimize your request."
-msgstr ""
+msgstr "Veuillez saisir le mot de passe du compte parent pour authentifier votre requête."
 
 #: mod/delegate.php:171
 msgid "Parent User"
-msgstr ""
+msgstr "Compte parent"
 
 #: mod/delegate.php:174
 msgid ""
 "Parent users have total control about this account, including the account "
 "settings. Please double check whom you give this access."
-msgstr ""
+msgstr "Le compte parent a un contrôle total sur ce compte, incluant les paramètres de compte. Veuillez vérifier à qui vous donnez cet accès."
 
 #: mod/delegate.php:176 src/Content/Nav.php:261
 msgid "Delegate Page Management"
@@ -3404,7 +3399,7 @@ msgid "Unable to update your contact profile details on our system"
 msgstr "Impossible de mettre les détails de votre profil à jour sur notre système"
 
 #: mod/dfrn_confirm.php:612 mod/dfrn_request.php:560
-#: src/Model/Contact.php:2026
+#: src/Model/Contact.php:2043
 msgid "[Name Withheld]"
 msgstr "[Nom non-publié]"
 
@@ -3478,7 +3473,7 @@ msgstr "Il semblerait que vous soyez déjà ami avec %s."
 msgid "Invalid profile URL."
 msgstr "URL de profil invalide."
 
-#: mod/dfrn_request.php:340 src/Model/Contact.php:1697
+#: mod/dfrn_request.php:340 src/Model/Contact.php:1714
 msgid "Disallowed profile URL."
 msgstr "URL de profil interdite."
 
@@ -3566,11 +3561,11 @@ msgstr "Friendica"
 
 #: mod/dfrn_request.php:644
 msgid "GNU Social (Pleroma, Mastodon)"
-msgstr ""
+msgstr "GNU Social (Pleroma, Mastodon)"
 
 #: mod/dfrn_request.php:645
 msgid "Diaspora (Socialhome, Hubzilla)"
-msgstr ""
+msgstr "Diaspora (Socialhome, Hubzilla)"
 
 #: mod/dfrn_request.php:646
 #, php-format
@@ -3588,8 +3583,8 @@ msgid "Submit Request"
 msgstr "Envoyer la requête"
 
 #: mod/directory.php:154 mod/events.php:541 mod/notifications.php:253
-#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:438
-#: src/Model/Event.php:934 src/Model/Profile.php:443
+#: src/Model/Event.php:68 src/Model/Event.php:95 src/Model/Event.php:437
+#: src/Model/Event.php:933 src/Model/Profile.php:443
 #: src/Module/Contact.php:643
 msgid "Location:"
 msgstr "Localisation :"
@@ -3612,8 +3607,8 @@ msgstr "Page personnelle :"
 msgid "About:"
 msgstr "À propos :"
 
-#: mod/directory.php:210 view/theme/vier/theme.php:208
-#: src/Content/Widget.php:70
+#: mod/directory.php:210 src/Content/Widget.php:70
+#: view/theme/vier/theme.php:208
 msgid "Global Directory"
 msgstr "Annuaire global"
 
@@ -3629,8 +3624,8 @@ msgstr "Résultats pour :"
 msgid "Site Directory"
 msgstr "Annuaire local"
 
-#: mod/directory.php:217 view/theme/vier/theme.php:203
-#: src/Content/Widget.php:65 src/Module/Contact.php:817
+#: mod/directory.php:217 src/Content/Widget.php:65 src/Module/Contact.php:817
+#: view/theme/vier/theme.php:203
 msgid "Find"
 msgstr "Trouver"
 
@@ -3767,8 +3762,8 @@ msgstr "La suppression de l'événement a échoué."
 msgid "Event removed"
 msgstr "Événement supprimé."
 
-#: mod/fbrowser.php:36 view/theme/frio/theme.php:264 src/Content/Nav.php:158
-#: src/Model/Profile.php:917
+#: mod/fbrowser.php:36 src/Content/Nav.php:158 src/Model/Profile.php:917
+#: view/theme/frio/theme.php:264
 msgid "Photos"
 msgstr "Photos"
 
@@ -3789,11 +3784,11 @@ msgstr "Fichiers"
 
 #: mod/feedtest.php:18
 msgid "You must be logged in to use this module"
-msgstr ""
+msgstr "Vous devez être identifié pour accéder à cette fonctionnalité"
 
 #: mod/feedtest.php:45
 msgid "Source URL"
-msgstr ""
+msgstr "URL Source"
 
 #: mod/filer.php:35
 msgid "- select -"
@@ -3801,7 +3796,7 @@ msgstr "- choisir -"
 
 #: mod/follow.php:46
 msgid "The contact could not be added."
-msgstr ""
+msgstr "Le contact n'a pas pu être ajouté."
 
 #: mod/follow.php:76
 msgid "You already added this contact."
@@ -3856,11 +3851,11 @@ msgstr ""
 
 #: mod/friendica.php:106
 msgid "Installed addons/apps:"
-msgstr ""
+msgstr "Add-ons/Applications installés :"
 
 #: mod/friendica.php:120
 msgid "No installed addons/apps"
-msgstr ""
+msgstr "Aucun add-on/application n'est installé"
 
 #: mod/friendica.php:125
 #, php-format
@@ -3900,7 +3895,7 @@ msgstr "Groupe introuvable."
 msgid "Group name changed."
 msgstr "Groupe renommé."
 
-#: mod/group.php:85 mod/profperm.php:30 src/App.php:1481
+#: mod/group.php:85 mod/profperm.php:30 src/App.php:1479
 msgid "Permission denied"
 msgstr "Permission refusée"
 
@@ -3910,7 +3905,7 @@ msgstr "Sauvegarder le groupe"
 
 #: mod/group.php:104
 msgid "Filter"
-msgstr ""
+msgstr "Filtre"
 
 #: mod/group.php:109
 msgid "Create a group of contacts/friends."
@@ -3955,7 +3950,7 @@ msgstr "Groupe vide"
 
 #: mod/group.php:255
 msgid "Remove contact from group"
-msgstr ""
+msgstr "Retirer ce contact du groupe"
 
 #: mod/group.php:273 mod/profperm.php:119
 msgid "Click on a contact to add or remove."
@@ -3963,7 +3958,7 @@ msgstr "Cliquez sur un contact pour l'ajouter ou le supprimer."
 
 #: mod/group.php:287
 msgid "Add contact to group"
-msgstr ""
+msgstr "Ajouter ce contact au groupe"
 
 #: mod/hcard.php:20
 msgid "No profile"
@@ -3973,11 +3968,11 @@ msgstr "Aucun profil"
 msgid "Help:"
 msgstr "Aide :"
 
-#: mod/help.php:59 view/theme/vier/theme.php:294 src/Content/Nav.php:190
+#: mod/help.php:59 src/Content/Nav.php:190 view/theme/vier/theme.php:294
 msgid "Help"
 msgstr "Aide"
 
-#: mod/help.php:65 src/App.php:1399
+#: mod/help.php:65 src/App.php:1397
 msgid "Not Found"
 msgstr "Non trouvé"
 
@@ -4126,7 +4121,7 @@ msgstr "Merci de contacter l’émetteur en répondant à cette publication si v
 msgid "%s posted an update."
 msgstr "%s a publié une mise à jour."
 
-#: mod/localtime.php:19 src/Model/Event.php:34 src/Model/Event.php:848
+#: mod/localtime.php:19 src/Model/Event.php:34 src/Model/Event.php:847
 msgid "l F d, Y \\@ g:i A"
 msgstr "l F d, Y \\@ g:i A"
 
@@ -4221,7 +4216,7 @@ msgstr "Impossible d'honorer cette demande. (Vous l'avez peut-être déjà utili
 
 #: mod/lostpass.php:102
 msgid "Request has expired, please make a new one."
-msgstr ""
+msgstr "La requête a expiré, veuillez la renouveler."
 
 #: mod/lostpass.php:117
 msgid "Forgot your Password?"
@@ -4297,6 +4292,10 @@ msgstr ""
 msgid "Your password has been changed at %s"
 msgstr "Votre mot de passe a été modifié à %s"
 
+#: mod/maintenance.php:26
+msgid "System down for maintenance"
+msgstr "Système indisponible pour cause de maintenance"
+
 #: mod/manage.php:178
 msgid "Manage Identities and/or Pages"
 msgstr "Gérer les identités et/ou les pages"
@@ -4356,7 +4355,7 @@ msgstr "Message envoyé."
 msgid "Discard"
 msgstr "Rejeter"
 
-#: mod/message.php:123 view/theme/frio/theme.php:271 src/Content/Nav.php:252
+#: mod/message.php:123 src/Content/Nav.php:252 view/theme/frio/theme.php:271
 msgid "Messages"
 msgstr "Messages"
 
@@ -4366,7 +4365,7 @@ msgstr "Voulez-vous vraiment supprimer ce message ?"
 
 #: mod/message.php:166
 msgid "Conversation not found."
-msgstr ""
+msgstr "Conversation inconnue."
 
 #: mod/message.php:171
 msgid "Message deleted."
@@ -4587,13 +4586,14 @@ msgid ""
 "potential friends know exactly how to find you."
 msgstr "Vérifiez les autres réglages, tout particulièrement ceux liés à la vie privée. Un profil non listé, c'est un peu comme un numéro sur liste rouge. En général, vous devriez probablement publier votre profil - à moins que tous vos amis (potentiels) sachent déjà comment vous trouver."
 
-#: mod/newmember.php:25 mod/profperm.php:117 view/theme/frio/theme.php:263
-#: src/Content/Nav.php:157 src/Model/Profile.php:876 src/Model/Profile.php:909
+#: mod/newmember.php:25 mod/profperm.php:117 src/Content/Nav.php:157
+#: src/Model/Profile.php:876 src/Model/Profile.php:909
 #: src/Module/Contact.php:654 src/Module/Contact.php:869
+#: view/theme/frio/theme.php:263
 msgid "Profile"
 msgstr "Profil"
 
-#: mod/newmember.php:27 mod/profile_photo.php:253 mod/profiles.php:583
+#: mod/newmember.php:27 mod/profiles.php:583 mod/profile_photo.php:253
 msgid "Upload Profile Photo"
 msgstr "Téléverser une photo de profil"
 
@@ -4768,11 +4768,11 @@ msgstr "Cacher les demandes ignorées"
 
 #: mod/notifications.php:166 mod/notifications.php:243
 msgid "Notification type:"
-msgstr ""
+msgstr "Type de notification :"
 
 #: mod/notifications.php:169
 msgid "Suggested by:"
-msgstr ""
+msgstr "Suggéré par :"
 
 #: mod/notifications.php:181 mod/notifications.php:260
 #: src/Module/Contact.php:630
@@ -4826,7 +4826,7 @@ msgstr "Initiateur du partage"
 
 #: mod/notifications.php:223
 msgid "Subscriber"
-msgstr ""
+msgstr "Abonné∙e"
 
 #: mod/notifications.php:266 src/Model/Profile.php:543
 #: src/Module/Contact.php:88
@@ -5102,12 +5102,12 @@ msgid "I don't like this (toggle)"
 msgstr "Je n'aime pas"
 
 #: mod/photos.php:1454 mod/photos.php:1493 mod/photos.php:1553
-#: src/Module/Contact.php:1018 src/Object/Post.php:870
+#: src/Module/Contact.php:1018 src/Object/Post.php:871
 msgid "This is you"
 msgstr "C'est vous"
 
 #: mod/photos.php:1456 mod/photos.php:1495 mod/photos.php:1555
-#: src/Object/Post.php:417 src/Object/Post.php:872
+#: src/Object/Post.php:417 src/Object/Post.php:873
 msgid "Comment"
 msgstr "Commenter"
 
@@ -5151,62 +5151,6 @@ msgstr "Rendez ce message privé"
 msgid "Only logged in users are permitted to perform a probing."
 msgstr ""
 
-#: mod/profile_photo.php:58
-msgid "Image uploaded but image cropping failed."
-msgstr "Image envoyée, mais impossible de la retailler."
-
-#: mod/profile_photo.php:88 mod/profile_photo.php:97 mod/profile_photo.php:106
-#: mod/profile_photo.php:318
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Réduction de la taille de l'image [%s] échouée."
-
-#: mod/profile_photo.php:125
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Rechargez la page avec la touche Maj pressée, ou bien effacez le cache du navigateur, si d'aventure la nouvelle photo n'apparaissait pas immédiatement."
-
-#: mod/profile_photo.php:133
-msgid "Unable to process image"
-msgstr "Impossible de traiter l'image"
-
-#: mod/profile_photo.php:251
-msgid "Upload File:"
-msgstr "Fichier à téléverser :"
-
-#: mod/profile_photo.php:252
-msgid "Select a profile:"
-msgstr "Choisir un profil :"
-
-#: mod/profile_photo.php:257
-msgid "or"
-msgstr "ou"
-
-#: mod/profile_photo.php:258
-msgid "skip this step"
-msgstr "ignorer cette étape"
-
-#: mod/profile_photo.php:258
-msgid "select a photo from your photo albums"
-msgstr "choisissez une photo depuis vos albums"
-
-#: mod/profile_photo.php:271
-msgid "Crop Image"
-msgstr "(Re)cadrer l'image"
-
-#: mod/profile_photo.php:272
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Ajustez le cadre de l'image pour une visualisation optimale."
-
-#: mod/profile_photo.php:274
-msgid "Done Editing"
-msgstr "Édition terminée"
-
-#: mod/profile_photo.php:308
-msgid "Image uploaded successfully."
-msgstr "Image téléversée avec succès."
-
 #: mod/profiles.php:62
 msgid "Profile deleted."
 msgstr "Profil supprimé."
@@ -5531,34 +5475,90 @@ msgstr "Changer de photo de profil"
 msgid "Create New Profile"
 msgstr "Créer un nouveau profil"
 
-#: mod/profperm.php:36 mod/profperm.php:69
-msgid "Invalid profile identifier."
-msgstr "Identifiant de profil invalide."
+#: mod/profile_photo.php:58
+msgid "Image uploaded but image cropping failed."
+msgstr "Image envoyée, mais impossible de la retailler."
 
-#: mod/profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Éditer la visibilité du profil"
+#: mod/profile_photo.php:88 mod/profile_photo.php:97 mod/profile_photo.php:106
+#: mod/profile_photo.php:318
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Réduction de la taille de l'image [%s] échouée."
 
-#: mod/profperm.php:128
-msgid "Visible To"
-msgstr "Visible par"
+#: mod/profile_photo.php:125
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Rechargez la page avec la touche Maj pressée, ou bien effacez le cache du navigateur, si d'aventure la nouvelle photo n'apparaissait pas immédiatement."
 
-#: mod/profperm.php:144
-msgid "All Contacts (with secure profile access)"
-msgstr "Tous les contacts (ayant un accès sécurisé)"
+#: mod/profile_photo.php:133
+msgid "Unable to process image"
+msgstr "Impossible de traiter l'image"
 
-#: mod/regmod.php:53
-msgid "Account approved."
-msgstr "Inscription validée."
+#: mod/profile_photo.php:251
+msgid "Upload File:"
+msgstr "Fichier à téléverser :"
 
-#: mod/regmod.php:77
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Inscription révoquée pour %s"
+#: mod/profile_photo.php:252
+msgid "Select a profile:"
+msgstr "Choisir un profil :"
 
-#: mod/regmod.php:84
-msgid "Please login."
-msgstr "Merci de vous connecter."
+#: mod/profile_photo.php:257
+msgid "or"
+msgstr "ou"
+
+#: mod/profile_photo.php:258
+msgid "skip this step"
+msgstr "ignorer cette étape"
+
+#: mod/profile_photo.php:258
+msgid "select a photo from your photo albums"
+msgstr "choisissez une photo depuis vos albums"
+
+#: mod/profile_photo.php:271
+msgid "Crop Image"
+msgstr "(Re)cadrer l'image"
+
+#: mod/profile_photo.php:272
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Ajustez le cadre de l'image pour une visualisation optimale."
+
+#: mod/profile_photo.php:274
+msgid "Done Editing"
+msgstr "Édition terminée"
+
+#: mod/profile_photo.php:308
+msgid "Image uploaded successfully."
+msgstr "Image téléversée avec succès."
+
+#: mod/profperm.php:36 mod/profperm.php:69
+msgid "Invalid profile identifier."
+msgstr "Identifiant de profil invalide."
+
+#: mod/profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Éditer la visibilité du profil"
+
+#: mod/profperm.php:128
+msgid "Visible To"
+msgstr "Visible par"
+
+#: mod/profperm.php:144
+msgid "All Contacts (with secure profile access)"
+msgstr "Tous les contacts (ayant un accès sécurisé)"
+
+#: mod/regmod.php:53
+msgid "Account approved."
+msgstr "Inscription validée."
+
+#: mod/regmod.php:77
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Inscription révoquée pour %s"
+
+#: mod/regmod.php:84
+msgid "Please login."
+msgstr "Merci de vous connecter."
 
 #: mod/removeme.php:46
 msgid "User deleted their account"
@@ -5609,7 +5609,7 @@ msgstr "Trop de requêtes"
 msgid "Only one search per minute is permitted for not logged in users."
 msgstr "Une seule recherche par minute pour les utilisateurs qui ne sont pas connectés."
 
-#: mod/search.php:149 src/Content/Text/HTML.php:900 src/Content/Nav.php:198
+#: mod/search.php:149 src/Content/Nav.php:198 src/Content/Text/HTML.php:900
 msgid "Search"
 msgstr "Recherche"
 
@@ -5937,11 +5937,11 @@ msgstr ""
 msgid "%s - (Experimental)"
 msgstr ""
 
-#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:396
+#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:395
 msgid "Sunday"
 msgstr "Dimanche"
 
-#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:397
+#: mod/settings.php:931 src/Core/L10n.php:368 src/Model/Event.php:396
 msgid "Monday"
 msgstr "Lundi"
 
@@ -6471,7 +6471,7 @@ msgstr "Aucune suggestion. Si ce site est récent, merci de recommencer dans 24h
 msgid "Ignore/Hide"
 msgstr "Ignorer/cacher"
 
-#: mod/suggest.php:119 view/theme/vier/theme.php:204 src/Content/Widget.php:66
+#: mod/suggest.php:119 src/Content/Widget.php:66 view/theme/vier/theme.php:204
 msgid "Friend Suggestions"
 msgstr "Suggestions d'amitiés/contacts"
 
@@ -6587,7 +6587,7 @@ msgstr "Supprimer la vidéo"
 msgid "No videos selected"
 msgstr "Pas de vidéo sélectionné"
 
-#: mod/videos.php:309 src/Model/Item.php:3435
+#: mod/videos.php:309 src/Model/Item.php:3453
 msgid "View Video"
 msgstr "Regarder la vidéo"
 
@@ -6609,13 +6609,33 @@ msgstr "Aucun contact."
 msgid "Visit %s's profile [%s]"
 msgstr "Visiter le profil de %s [%s]"
 
-#: mod/viewcontacts.php:114 view/theme/frio/theme.php:273
-#: src/Content/Text/HTML.php:911 src/Content/Nav.php:203
-#: src/Content/Nav.php:269 src/Model/Profile.php:980 src/Model/Profile.php:983
-#: src/Module/Contact.php:811 src/Module/Contact.php:881
+#: mod/viewcontacts.php:114 src/Content/Nav.php:203 src/Content/Nav.php:269
+#: src/Content/Text/HTML.php:911 src/Model/Profile.php:980
+#: src/Model/Profile.php:983 src/Module/Contact.php:811
+#: src/Module/Contact.php:881 view/theme/frio/theme.php:273
 msgid "Contacts"
 msgstr "Contacts"
 
+#: mod/wallmessage.php:52 mod/wallmessage.php:115
+#, php-format
+msgid "Number of daily wall messages for %s exceeded. Message failed."
+msgstr "Nombre de messages de mur quotidiens pour %s dépassé. Échec du message."
+
+#: mod/wallmessage.php:63
+msgid "Unable to check your home location."
+msgstr "Impossible de vérifier votre localisation."
+
+#: mod/wallmessage.php:89 mod/wallmessage.php:98
+msgid "No recipient."
+msgstr "Pas de destinataire."
+
+#: mod/wallmessage.php:129
+#, php-format
+msgid ""
+"If you wish for %s to respond, please check that the privacy settings on "
+"your site allow private mail from unknown senders."
+msgstr "Si vous souhaitez que %s réponde, merci de vérifier vos réglages pour autoriser les messages privés venant d'inconnus."
+
 #: mod/wall_attach.php:26 mod/wall_attach.php:33 mod/wall_attach.php:85
 #: mod/wall_upload.php:42 mod/wall_upload.php:58 mod/wall_upload.php:116
 #: mod/wall_upload.php:167 mod/wall_upload.php:170
@@ -6644,3261 +6664,3250 @@ msgstr "Le téléversement a échoué."
 msgid "Wall Photos"
 msgstr "Photos du mur"
 
-#: mod/wallmessage.php:52 mod/wallmessage.php:115
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Nombre de messages de mur quotidiens pour %s dépassé. Échec du message."
+#: src/App.php:665
+msgid "Delete this item?"
+msgstr "Effacer cet élément?"
 
-#: mod/wallmessage.php:63
-msgid "Unable to check your home location."
-msgstr "Impossible de vérifier votre localisation."
+#: src/App.php:707
+msgid "toggle mobile"
+msgstr "activ. mobile"
 
-#: mod/wallmessage.php:89 mod/wallmessage.php:98
-msgid "No recipient."
-msgstr "Pas de destinataire."
+#: src/App.php:1075
+msgid "No system theme config value set."
+msgstr ""
 
-#: mod/wallmessage.php:129
-#, php-format
+#: src/BaseModule.php:133
 msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
-msgstr "Si vous souhaitez que %s réponde, merci de vérifier vos réglages pour autoriser les messages privés venant d'inconnus."
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "Le jeton de sécurité du formulaire n'est pas correct. Ceci veut probablement dire que le formulaire est resté ouvert trop longtemps (plus de 3 heures) avant d'être validé."
 
-#: view/theme/duepuntozero/config.php:55 src/Model/User.php:684
-msgid "default"
-msgstr "défaut"
+#: src/Content/ContactSelector.php:58
+msgid "Frequently"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:56
-msgid "greenzero"
-msgstr "greenzero"
+#: src/Content/ContactSelector.php:59
+msgid "Hourly"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:57
-msgid "purplezero"
-msgstr "purplezero"
+#: src/Content/ContactSelector.php:60
+msgid "Twice daily"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:58
-msgid "easterbunny"
-msgstr "easterbunny"
+#: src/Content/ContactSelector.php:61
+msgid "Daily"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:59
-msgid "darkzero"
-msgstr "darkzero"
+#: src/Content/ContactSelector.php:62
+msgid "Weekly"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:60
-msgid "comix"
-msgstr "comix"
+#: src/Content/ContactSelector.php:63
+msgid "Monthly"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:61
-msgid "slackr"
-msgstr "slackr"
+#: src/Content/ContactSelector.php:83
+msgid "DFRN"
+msgstr ""
 
-#: view/theme/duepuntozero/config.php:75
-msgid "Variations"
-msgstr "Variations"
+#: src/Content/ContactSelector.php:84
+msgid "OStatus"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:24
-msgid "Top Banner"
-msgstr "Bannière du haut"
+#: src/Content/ContactSelector.php:85
+msgid "RSS/Atom"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:24
-msgid ""
-"Resize image to the width of the screen and show background color below on "
-"long pages."
-msgstr "Redimensionner l'image à la largeur de l'écran et combler en dessous avec la couleur d'arrière plan."
+#: src/Content/ContactSelector.php:88
+msgid "Zot!"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:25
-msgid "Full screen"
-msgstr "Plein écran"
+#: src/Content/ContactSelector.php:89
+msgid "LinkedIn"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:25
-msgid ""
-"Resize image to fill entire screen, clipping either the right or the bottom."
-msgstr "Agrandir l'image pour remplir l'écran, jusqu'à toucher le bord droit ou le bas de l'écran."
+#: src/Content/ContactSelector.php:90
+msgid "XMPP/IM"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:26
-msgid "Single row mosaic"
-msgstr "Mosaïque sur un rang"
+#: src/Content/ContactSelector.php:91
+msgid "MySpace"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:26
-msgid ""
-"Resize image to repeat it on a single row, either vertical or horizontal."
-msgstr "Redimensionner l'image pour la dupliquer sur un seul rang, vertical ou horizontal."
+#: src/Content/ContactSelector.php:92
+msgid "Google+"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:27
-msgid "Mosaic"
-msgstr "Mosaïque"
+#: src/Content/ContactSelector.php:93
+msgid "pump.io"
+msgstr ""
 
-#: view/theme/frio/php/Image.php:27
-msgid "Repeat image to fill the screen."
-msgstr "Dupliquer l'image pour couvrir l'écran."
+#: src/Content/ContactSelector.php:94
+msgid "Twitter"
+msgstr ""
 
-#: view/theme/frio/config.php:103
-msgid "Custom"
-msgstr "Personnalisé"
+#: src/Content/ContactSelector.php:95
+msgid "Diaspora Connector"
+msgstr ""
 
-#: view/theme/frio/config.php:115
-msgid "Note"
-msgstr "Remarque"
+#: src/Content/ContactSelector.php:96
+msgid "GNU Social Connector"
+msgstr ""
 
-#: view/theme/frio/config.php:115
-msgid "Check image permissions if all users are allowed to see the image"
-msgstr "Vérifier que tous les utilisateurs du site sont autorisés à voir l'image."
+#: src/Content/ContactSelector.php:97
+msgid "ActivityPub"
+msgstr ""
 
-#: view/theme/frio/config.php:122
-msgid "Select color scheme"
-msgstr "Choisir le schéma de couleurs"
+#: src/Content/ContactSelector.php:98
+msgid "pnut"
+msgstr ""
 
-#: view/theme/frio/config.php:123
-msgid "Navigation bar background color"
-msgstr "Couleur d'arrière-plan de la barre de navigation"
+#: src/Content/ContactSelector.php:154
+msgid "Male"
+msgstr ""
 
-#: view/theme/frio/config.php:124
-msgid "Navigation bar icon color "
-msgstr "Couleur des icônes de la barre de navigation"
+#: src/Content/ContactSelector.php:155
+msgid "Female"
+msgstr ""
 
-#: view/theme/frio/config.php:125
-msgid "Link color"
-msgstr "Couleur des liens"
+#: src/Content/ContactSelector.php:156
+msgid "Currently Male"
+msgstr ""
 
-#: view/theme/frio/config.php:126
-msgid "Set the background color"
-msgstr "Couleur d'arrière-plan"
+#: src/Content/ContactSelector.php:157
+msgid "Currently Female"
+msgstr ""
 
-#: view/theme/frio/config.php:127
-msgid "Content background opacity"
-msgstr "Opacité du contenu d'arrière-plan"
+#: src/Content/ContactSelector.php:158
+msgid "Mostly Male"
+msgstr ""
 
-#: view/theme/frio/config.php:128
-msgid "Set the background image"
-msgstr "Image d'arrière-plan"
+#: src/Content/ContactSelector.php:159
+msgid "Mostly Female"
+msgstr ""
 
-#: view/theme/frio/config.php:129
-msgid "Background image style"
-msgstr "Style de l'image de fond"
+#: src/Content/ContactSelector.php:160
+msgid "Transgender"
+msgstr ""
 
-#: view/theme/frio/config.php:134
-msgid "Login page background image"
-msgstr "Image de fond de la page de login"
+#: src/Content/ContactSelector.php:161
+msgid "Intersex"
+msgstr ""
 
-#: view/theme/frio/config.php:138
-msgid "Login page background color"
-msgstr "Couleur d'arrière-plan de la page de login"
+#: src/Content/ContactSelector.php:162
+msgid "Transsexual"
+msgstr ""
 
-#: view/theme/frio/config.php:138
-msgid "Leave background image and color empty for theme defaults"
-msgstr "Laisser l'image et la couleur de fond vides pour les paramètres par défaut du thème"
+#: src/Content/ContactSelector.php:163
+msgid "Hermaphrodite"
+msgstr ""
 
-#: view/theme/frio/theme.php:239
-msgid "Guest"
-msgstr "Invité"
+#: src/Content/ContactSelector.php:164
+msgid "Neuter"
+msgstr ""
 
-#: view/theme/frio/theme.php:244
-msgid "Visitor"
-msgstr "Visiteur"
+#: src/Content/ContactSelector.php:165
+msgid "Non-specific"
+msgstr "Non-spécifique"
 
-#: view/theme/frio/theme.php:259 src/Content/Nav.php:153
-#: src/Module/Login.php:321
-msgid "Logout"
-msgstr "Se déconnecter"
+#: src/Content/ContactSelector.php:166
+msgid "Other"
+msgstr "Autre"
 
-#: view/theme/frio/theme.php:259 src/Content/Nav.php:153
-msgid "End this session"
-msgstr "Mettre fin à cette session"
+#: src/Content/ContactSelector.php:194
+msgid "Males"
+msgstr "Hommes"
 
-#: view/theme/frio/theme.php:262 src/Content/Nav.php:156
-#: src/Model/Profile.php:901 src/Module/Contact.php:652
-#: src/Module/Contact.php:853
-msgid "Status"
-msgstr "Statut"
+#: src/Content/ContactSelector.php:195
+msgid "Females"
+msgstr "Femmes"
 
-#: view/theme/frio/theme.php:262 src/Content/Nav.php:156
-#: src/Content/Nav.php:242
-msgid "Your posts and conversations"
-msgstr "Vos publications et conversations"
+#: src/Content/ContactSelector.php:196
+msgid "Gay"
+msgstr "Gay"
 
-#: view/theme/frio/theme.php:263 src/Content/Nav.php:157
-msgid "Your profile page"
-msgstr "Votre page de profil"
+#: src/Content/ContactSelector.php:197
+msgid "Lesbian"
+msgstr "Lesbienne"
 
-#: view/theme/frio/theme.php:264 src/Content/Nav.php:158
-msgid "Your photos"
-msgstr "Vos photos"
+#: src/Content/ContactSelector.php:198
+msgid "No Preference"
+msgstr "Sans préférence"
 
-#: view/theme/frio/theme.php:265 src/Content/Nav.php:159
-#: src/Model/Profile.php:925 src/Model/Profile.php:928
-msgid "Videos"
-msgstr "Vidéos"
+#: src/Content/ContactSelector.php:199
+msgid "Bisexual"
+msgstr "Bisexuel"
 
-#: view/theme/frio/theme.php:265 src/Content/Nav.php:159
-msgid "Your videos"
-msgstr "Vos vidéos"
+#: src/Content/ContactSelector.php:200
+msgid "Autosexual"
+msgstr "Auto-sexuel"
 
-#: view/theme/frio/theme.php:266 src/Content/Nav.php:160
-msgid "Your events"
-msgstr "Vos événements"
+#: src/Content/ContactSelector.php:201
+msgid "Abstinent"
+msgstr "Abstinent"
 
-#: view/theme/frio/theme.php:269 src/Content/Nav.php:239
-msgid "Conversations from your friends"
-msgstr "Conversations de vos amis"
+#: src/Content/ContactSelector.php:202
+msgid "Virgin"
+msgstr "Vierge"
 
-#: view/theme/frio/theme.php:270 src/Content/Nav.php:226
-#: src/Model/Profile.php:940 src/Model/Profile.php:951
-msgid "Events and Calendar"
-msgstr "Événements et agenda"
+#: src/Content/ContactSelector.php:203
+msgid "Deviant"
+msgstr "Déviant"
 
-#: view/theme/frio/theme.php:271 src/Content/Nav.php:252
-msgid "Private mail"
-msgstr "Messages privés"
+#: src/Content/ContactSelector.php:204
+msgid "Fetish"
+msgstr "Fétichiste"
 
-#: view/theme/frio/theme.php:272 src/Content/Nav.php:263
-msgid "Account settings"
-msgstr "Compte"
+#: src/Content/ContactSelector.php:205
+msgid "Oodles"
+msgstr "Oodles"
 
-#: view/theme/frio/theme.php:273 src/Content/Nav.php:269
-msgid "Manage/edit friends and contacts"
-msgstr "Gérer/éditer les amitiés et contacts"
+#: src/Content/ContactSelector.php:206
+msgid "Nonsexual"
+msgstr "Non-sexuel"
 
-#: view/theme/quattro/config.php:77
-msgid "Alignment"
-msgstr "Alignement"
+#: src/Content/ContactSelector.php:232
+msgid "Single"
+msgstr "Célibataire"
 
-#: view/theme/quattro/config.php:77
-msgid "Left"
-msgstr "Gauche"
+#: src/Content/ContactSelector.php:233
+msgid "Lonely"
+msgstr "Esseulé"
 
-#: view/theme/quattro/config.php:77
-msgid "Center"
-msgstr "Centre"
+#: src/Content/ContactSelector.php:234
+msgid "Available"
+msgstr "Disponible"
 
-#: view/theme/quattro/config.php:78
-msgid "Color scheme"
-msgstr "Palette de couleurs"
+#: src/Content/ContactSelector.php:235
+msgid "Unavailable"
+msgstr "Indisponible"
 
-#: view/theme/quattro/config.php:79
-msgid "Posts font size"
-msgstr "Taille de texte des publications"
+#: src/Content/ContactSelector.php:236
+msgid "Has crush"
+msgstr "Attiré par quelqu'un"
 
-#: view/theme/quattro/config.php:80
-msgid "Textareas font size"
-msgstr "Taille de police des zones de texte"
+#: src/Content/ContactSelector.php:237
+msgid "Infatuated"
+msgstr "Entiché"
 
-#: view/theme/vier/config.php:76
-msgid "Comma separated list of helper forums"
-msgstr "Liste de forums d'aide, séparés par des virgules"
+#: src/Content/ContactSelector.php:238
+msgid "Dating"
+msgstr "Dans une relation"
 
-#: view/theme/vier/config.php:116 src/Core/ACL.php:301
-msgid "don't show"
-msgstr "cacher"
+#: src/Content/ContactSelector.php:239
+msgid "Unfaithful"
+msgstr "Infidèle"
 
-#: view/theme/vier/config.php:116 src/Core/ACL.php:300
-msgid "show"
-msgstr "montrer"
+#: src/Content/ContactSelector.php:240
+msgid "Sex Addict"
+msgstr "Accro au sexe"
 
-#: view/theme/vier/config.php:123
-msgid "Set style"
-msgstr "Définir le style"
+#: src/Content/ContactSelector.php:241 src/Model/User.php:702
+msgid "Friends"
+msgstr "Amis"
 
-#: view/theme/vier/config.php:124
-msgid "Community Pages"
-msgstr "Pages de Communauté"
+#: src/Content/ContactSelector.php:242
+msgid "Friends/Benefits"
+msgstr "Amis par intérêt"
 
-#: view/theme/vier/config.php:125 view/theme/vier/theme.php:151
-msgid "Community Profiles"
-msgstr "Profils communautaires"
+#: src/Content/ContactSelector.php:243
+msgid "Casual"
+msgstr "Casual"
 
-#: view/theme/vier/config.php:126
-msgid "Help or @NewHere ?"
-msgstr "Aide ou @NewHere?"
+#: src/Content/ContactSelector.php:244
+msgid "Engaged"
+msgstr "Fiancé"
 
-#: view/theme/vier/config.php:127 view/theme/vier/theme.php:373
-msgid "Connect Services"
-msgstr "Connecter des services"
+#: src/Content/ContactSelector.php:245
+msgid "Married"
+msgstr "Marié"
 
-#: view/theme/vier/config.php:128
-msgid "Find Friends"
-msgstr "Trouver des amis"
+#: src/Content/ContactSelector.php:246
+msgid "Imaginarily married"
+msgstr "Se croit marié"
 
-#: view/theme/vier/config.php:129 view/theme/vier/theme.php:181
-msgid "Last users"
-msgstr "Derniers utilisateurs"
+#: src/Content/ContactSelector.php:247
+msgid "Partners"
+msgstr "Partenaire"
 
-#: view/theme/vier/theme.php:199 src/Content/Widget.php:61
-msgid "Find People"
-msgstr "Trouver des personnes"
+#: src/Content/ContactSelector.php:248
+msgid "Cohabiting"
+msgstr "En cohabitation"
 
-#: view/theme/vier/theme.php:200 src/Content/Widget.php:62
-msgid "Enter name or interest"
-msgstr "Entrez un nom ou un centre d'intérêt"
+#: src/Content/ContactSelector.php:249
+msgid "Common law"
+msgstr "Marié \"de fait\"/\"sui juris\" (concubin)"
 
-#: view/theme/vier/theme.php:202 src/Content/Widget.php:64
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Exemples : Robert Morgenstein, Pêche"
+#: src/Content/ContactSelector.php:250
+msgid "Happy"
+msgstr "Heureux"
 
-#: view/theme/vier/theme.php:205 src/Content/Widget.php:67
-msgid "Similar Interests"
-msgstr "Intérêts similaires"
+#: src/Content/ContactSelector.php:251
+msgid "Not looking"
+msgstr "Pas intéressé"
 
-#: view/theme/vier/theme.php:206 src/Content/Widget.php:68
-msgid "Random Profile"
-msgstr "Profil au hasard"
+#: src/Content/ContactSelector.php:252
+msgid "Swinger"
+msgstr "Échangiste"
 
-#: view/theme/vier/theme.php:207 src/Content/Widget.php:69
-msgid "Invite Friends"
-msgstr "Inviter des amis"
+#: src/Content/ContactSelector.php:253
+msgid "Betrayed"
+msgstr "Trahi(e)"
 
-#: view/theme/vier/theme.php:210 src/Content/Widget.php:72
-msgid "Local Directory"
-msgstr "Annuaire local"
+#: src/Content/ContactSelector.php:254
+msgid "Separated"
+msgstr "Séparé"
 
-#: view/theme/vier/theme.php:250 src/Content/Text/HTML.php:914
-#: src/Content/ForumManager.php:130 src/Content/Nav.php:207
-msgid "Forums"
-msgstr "Forums"
+#: src/Content/ContactSelector.php:255
+msgid "Unstable"
+msgstr "Instable"
 
-#: view/theme/vier/theme.php:252 src/Content/ForumManager.php:132
-msgid "External link to forum"
-msgstr "Lien sortant vers le forum"
+#: src/Content/ContactSelector.php:256
+msgid "Divorced"
+msgstr "Divorcé"
 
-#: view/theme/vier/theme.php:288
-msgid "Quick Start"
-msgstr "Démarrage rapide"
+#: src/Content/ContactSelector.php:257
+msgid "Imaginarily divorced"
+msgstr "Se croit divorcé"
 
-#: src/Core/Console/ArchiveContact.php:65
-#, php-format
-msgid "Could not find any unarchived contact entry for this URL (%s)"
-msgstr ""
-
-#: src/Core/Console/ArchiveContact.php:70
-msgid "The contact entries have been archived"
-msgstr ""
-
-#: src/Core/Console/NewPassword.php:72
-msgid "Enter new password: "
-msgstr ""
+#: src/Content/ContactSelector.php:258
+msgid "Widowed"
+msgstr "Veuf/Veuve"
 
-#: src/Core/Console/PostUpdate.php:50
-#, php-format
-msgid "Post update version number has been set to %s."
-msgstr ""
+#: src/Content/ContactSelector.php:259
+msgid "Uncertain"
+msgstr "Incertain"
 
-#: src/Core/Console/PostUpdate.php:58
-msgid "Check for pending update actions."
-msgstr ""
+#: src/Content/ContactSelector.php:260
+msgid "It's complicated"
+msgstr "C'est compliqué"
 
-#: src/Core/Console/PostUpdate.php:60
-msgid "Done."
-msgstr ""
+#: src/Content/ContactSelector.php:261
+msgid "Don't care"
+msgstr "S'en désintéresse"
 
-#: src/Core/Console/PostUpdate.php:62
-msgid "Execute pending post updates."
-msgstr ""
+#: src/Content/ContactSelector.php:262
+msgid "Ask me"
+msgstr "Me demander"
 
-#: src/Core/Console/PostUpdate.php:68
-msgid "All pending post updates are done."
-msgstr ""
+#: src/Content/Feature.php:82
+msgid "General Features"
+msgstr "Fonctions générales"
 
-#: src/Core/ACL.php:287
-msgid "Post to Email"
-msgstr "Publier aux courriels"
+#: src/Content/Feature.php:84
+msgid "Multiple Profiles"
+msgstr "Profils multiples"
 
-#: src/Core/ACL.php:293
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Cacher les détails du profil aux visiteurs inconnus?"
+#: src/Content/Feature.php:84
+msgid "Ability to create multiple profiles"
+msgstr "Possibilité de créer plusieurs profils"
 
-#: src/Core/ACL.php:292
-#, php-format
-msgid "Connectors disabled, since \"%s\" is enabled."
-msgstr "Les connecteurs sont désactivés parce que \"%s\" est activé."
+#: src/Content/Feature.php:85
+msgid "Photo Location"
+msgstr "Lieu de prise de la photo"
 
-#: src/Core/ACL.php:299
-msgid "Visible to everybody"
-msgstr "Visible par tout le monde"
+#: src/Content/Feature.php:85
+msgid ""
+"Photo metadata is normally stripped. This extracts the location (if present)"
+" prior to stripping metadata and links it to a map."
+msgstr "Les métadonnées des photos sont normalement retirées. Ceci permet de sauver l'emplacement (si présent) et de positionner la photo sur une carte."
 
-#: src/Core/ACL.php:311
-msgid "Close"
-msgstr "Fermer"
+#: src/Content/Feature.php:86
+msgid "Export Public Calendar"
+msgstr "Exporter le Calendrier Public"
 
-#: src/Core/Authentication.php:87
-msgid "Welcome "
-msgstr "Bienvenue "
+#: src/Content/Feature.php:86
+msgid "Ability for visitors to download the public calendar"
+msgstr "Les visiteurs peuvent télécharger le calendrier public"
 
-#: src/Core/Authentication.php:88
-msgid "Please upload a profile photo."
-msgstr "Merci d'illustrer votre profil d'une image."
+#: src/Content/Feature.php:91
+msgid "Post Composition Features"
+msgstr "Caractéristiques de composition de publication"
 
-#: src/Core/Authentication.php:90
-msgid "Welcome back "
-msgstr "Bienvenue à nouveau, "
+#: src/Content/Feature.php:92
+msgid "Auto-mention Forums"
+msgstr "Mentionner automatiquement les Forums"
 
-#: src/Core/Installer.php:162
+#: src/Content/Feature.php:92
 msgid ""
-"The database configuration file \"config/local.config.php\" could not be "
-"written. Please use the enclosed text to create a configuration file in your"
-" web server root."
+"Add/remove mention when a forum page is selected/deselected in ACL window."
+msgstr "Ajoute/retire une mention quand une page forum est sélectionnée/désélectionnée lors du choix des destinataires d'une publication."
+
+#: src/Content/Feature.php:93
+msgid "Explicit Mentions"
 msgstr ""
 
-#: src/Core/Installer.php:181
+#: src/Content/Feature.php:93
 msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Vous pourriez avoir besoin d'importer le fichier \"database.sql\" manuellement au moyen de phpmyadmin ou de la commande mysql."
+"Add explicit mentions to comment box for manual control over who gets "
+"mentioned in replies."
+msgstr ""
 
-#: src/Core/Installer.php:182 src/Module/Install.php:132
-#: src/Module/Install.php:263
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Référez-vous au fichier \"INSTALL.txt\"."
+#: src/Content/Feature.php:98
+msgid "Network Sidebar"
+msgstr ""
 
-#: src/Core/Installer.php:243
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH du serveur web."
+#: src/Content/Feature.php:99
+msgid "Ability to select posts by date ranges"
+msgstr "Capacité de sélectionner les publications par intervalles de dates"
 
-#: src/Core/Installer.php:244
-msgid ""
-"If you don't have a command line version of PHP installed on your server, "
-"you will not be able to run the background processing. See <a "
-"href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-"
-"up-the-worker'>'Setup the worker'</a>"
+#: src/Content/Feature.php:100
+msgid "Protocol Filter"
 msgstr ""
 
-#: src/Core/Installer.php:248
-msgid "PHP executable path"
-msgstr "Chemin vers l'exécutable de PHP"
-
-#: src/Core/Installer.php:248
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Entrez le chemin (absolu) vers l'exécutable 'php'. Vous pouvez laisser cette ligne vide pour continuer l'installation."
+#: src/Content/Feature.php:100
+msgid "Enable widget to display Network posts only from selected protocols"
+msgstr ""
 
-#: src/Core/Installer.php:253
-msgid "Command line PHP"
-msgstr "Version \"ligne de commande\" de PHP"
+#: src/Content/Feature.php:105
+msgid "Network Tabs"
+msgstr "Onglets Réseau"
 
-#: src/Core/Installer.php:262
-msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
-msgstr "L'executable PHP n'est pas le binaire php client (c'est peut être la version cgi-fcgi)"
+#: src/Content/Feature.php:106
+msgid "Network New Tab"
+msgstr "Nouvel onglet réseaux"
 
-#: src/Core/Installer.php:263
-msgid "Found PHP version: "
-msgstr "Version de PHP :"
+#: src/Content/Feature.php:106
+msgid "Enable tab to display only new Network posts (from the last 12 hours)"
+msgstr "Activer l'onglet pour afficher seulement les publications du réseau (dans les 12 dernières heures)"
 
-#: src/Core/Installer.php:265
-msgid "PHP cli binary"
-msgstr "PHP cli binary"
+#: src/Content/Feature.php:107
+msgid "Network Shared Links Tab"
+msgstr "Onglet réseau partagé"
 
-#: src/Core/Installer.php:278
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "La version \"ligne de commande\" de PHP de votre système n'a pas \"register_argc_argv\" d'activé."
+#: src/Content/Feature.php:107
+msgid "Enable tab to display only Network posts with links in them"
+msgstr "Activer l'onglet pour afficher seulement les publications du réseau contenant des liens"
 
-#: src/Core/Installer.php:279
-msgid "This is required for message delivery to work."
-msgstr "Ceci est requis pour que la livraison des messages fonctionne."
+#: src/Content/Feature.php:112
+msgid "Post/Comment Tools"
+msgstr "Outils de publication/commentaire"
 
-#: src/Core/Installer.php:284
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: src/Content/Feature.php:113
+msgid "Post Categories"
+msgstr "Catégories des publications"
 
-#: src/Core/Installer.php:316
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Erreur: la fonction \"openssl_pkey_new\" de ce système ne permet pas de générer des clés de chiffrement"
+#: src/Content/Feature.php:113
+msgid "Add categories to your posts"
+msgstr "Ajouter des catégories à vos publications"
 
-#: src/Core/Installer.php:317
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Si vous utilisez Windows, merci de vous réferer à \"http://www.php.net/manual/en/openssl.installation.php\"."
+#: src/Content/Feature.php:118
+msgid "Advanced Profile Settings"
+msgstr "Paramètres Avancés du Profil"
 
-#: src/Core/Installer.php:320
-msgid "Generate encryption keys"
-msgstr "Générer les clés de chiffrement"
+#: src/Content/Feature.php:119
+msgid "List Forums"
+msgstr "Liste des forums"
 
-#: src/Core/Installer.php:371
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Erreur : Le module \"rewrite\" du serveur web Apache est requis mais pas installé."
+#: src/Content/Feature.php:119
+msgid "Show visitors public community forums at the Advanced Profile Page"
+msgstr "Montrer les forums communautaires aux visiteurs sur la Page de profil avancé"
 
-#: src/Core/Installer.php:376
-msgid "Apache mod_rewrite module"
-msgstr "Module mod_rewrite Apache"
+#: src/Content/Feature.php:120
+msgid "Tag Cloud"
+msgstr ""
 
-#: src/Core/Installer.php:382
-msgid "Error: PDO or MySQLi PHP module required but not installed."
+#: src/Content/Feature.php:120
+msgid "Provide a personal tag cloud on your profile page"
 msgstr ""
 
-#: src/Core/Installer.php:387
-msgid "Error: The MySQL driver for PDO is not installed."
+#: src/Content/Feature.php:121
+msgid "Display Membership Date"
 msgstr ""
 
-#: src/Core/Installer.php:391
-msgid "PDO or MySQLi PHP module"
+#: src/Content/Feature.php:121
+msgid "Display membership date in profile"
 msgstr ""
 
-#: src/Core/Installer.php:399
-msgid "Error, XML PHP module required but not installed."
-msgstr "Erreur : le module PHP XML requis est absent."
+#: src/Content/ForumManager.php:130 src/Content/Nav.php:207
+#: src/Content/Text/HTML.php:914 view/theme/vier/theme.php:250
+msgid "Forums"
+msgstr "Forums"
 
-#: src/Core/Installer.php:403
-msgid "XML PHP module"
-msgstr "Module PHP XML"
+#: src/Content/ForumManager.php:132 view/theme/vier/theme.php:252
+msgid "External link to forum"
+msgstr "Lien sortant vers le forum"
 
-#: src/Core/Installer.php:406
-msgid "libCurl PHP module"
-msgstr "Module libCurl de PHP"
+#: src/Content/Nav.php:74
+msgid "Nothing new here"
+msgstr "Rien de neuf ici"
 
-#: src/Core/Installer.php:407
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Erreur : Le module PHP \"libCURL\" est requis mais pas installé."
+#: src/Content/Nav.php:78
+msgid "Clear notifications"
+msgstr "Effacer les notifications"
 
-#: src/Core/Installer.php:413
-msgid "GD graphics PHP module"
-msgstr "Module GD (graphiques) de PHP"
+#: src/Content/Nav.php:79 src/Content/Text/HTML.php:903
+msgid "@name, !forum, #tags, content"
+msgstr "@nom, !forum, #tags, contenu"
 
-#: src/Core/Installer.php:414
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Erreur : Le module PHP \"GD\" disposant du support JPEG est requis mais pas installé."
+#: src/Content/Nav.php:153 src/Module/Login.php:321
+#: view/theme/frio/theme.php:259
+msgid "Logout"
+msgstr "Se déconnecter"
 
-#: src/Core/Installer.php:420
-msgid "OpenSSL PHP module"
-msgstr "Module OpenSSL de PHP"
+#: src/Content/Nav.php:153 view/theme/frio/theme.php:259
+msgid "End this session"
+msgstr "Mettre fin à cette session"
 
-#: src/Core/Installer.php:421
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Erreur : Le module PHP \"openssl\" est requis mais pas installé."
+#: src/Content/Nav.php:156 src/Model/Profile.php:901
+#: src/Module/Contact.php:652 src/Module/Contact.php:853
+#: view/theme/frio/theme.php:262
+msgid "Status"
+msgstr "Statut"
 
-#: src/Core/Installer.php:427
-msgid "mb_string PHP module"
-msgstr "Module mb_string de PHP"
+#: src/Content/Nav.php:156 src/Content/Nav.php:242
+#: view/theme/frio/theme.php:262
+msgid "Your posts and conversations"
+msgstr "Vos publications et conversations"
 
-#: src/Core/Installer.php:428
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Erreur : le module PHP mb_string est requis mais pas installé."
+#: src/Content/Nav.php:157 view/theme/frio/theme.php:263
+msgid "Your profile page"
+msgstr "Votre page de profil"
 
-#: src/Core/Installer.php:434
-msgid "iconv PHP module"
-msgstr ""
+#: src/Content/Nav.php:158 view/theme/frio/theme.php:264
+msgid "Your photos"
+msgstr "Vos photos"
 
-#: src/Core/Installer.php:435
-msgid "Error: iconv PHP module required but not installed."
-msgstr "Erreur : Le module PHP iconv requis est absent."
+#: src/Content/Nav.php:159 src/Model/Profile.php:925 src/Model/Profile.php:928
+#: view/theme/frio/theme.php:265
+msgid "Videos"
+msgstr "Vidéos"
 
-#: src/Core/Installer.php:441
-msgid "POSIX PHP module"
-msgstr ""
+#: src/Content/Nav.php:159 view/theme/frio/theme.php:265
+msgid "Your videos"
+msgstr "Vos vidéos"
 
-#: src/Core/Installer.php:442
-msgid "Error: POSIX PHP module required but not installed."
-msgstr ""
+#: src/Content/Nav.php:160 view/theme/frio/theme.php:266
+msgid "Your events"
+msgstr "Vos événements"
 
-#: src/Core/Installer.php:448
-msgid "JSON PHP module"
-msgstr ""
+#: src/Content/Nav.php:161
+msgid "Personal notes"
+msgstr "Notes personnelles"
 
-#: src/Core/Installer.php:449
-msgid "Error: JSON PHP module required but not installed."
-msgstr ""
+#: src/Content/Nav.php:161
+msgid "Your personal notes"
+msgstr "Vos notes personnelles"
 
-#: src/Core/Installer.php:472
-msgid ""
-"The web installer needs to be able to create a file called "
-"\"local.config.php\" in the \"config\" folder of your web server and it is "
-"unable to do so."
-msgstr ""
+#: src/Content/Nav.php:170
+msgid "Sign in"
+msgstr "Se connecter"
 
-#: src/Core/Installer.php:473
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "Le plus souvent, il s'agit d'un problème de permission. Le serveur web peut ne pas être capable d'écrire dans votre répertoire - alors que vous-même le pouvez."
+#: src/Content/Nav.php:180 src/Content/Nav.php:242
+#: src/Core/NotificationsManager.php:196
+msgid "Home"
+msgstr "Profil"
 
-#: src/Core/Installer.php:474
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named local.config.php in your Friendica \"config\" folder."
-msgstr ""
+#: src/Content/Nav.php:180
+msgid "Home Page"
+msgstr "Page d'accueil"
 
-#: src/Core/Installer.php:475
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr "Vous pouvez également sauter cette étape et procéder à une installation manuelle. Pour cela, merci de lire le fichier \"INSTALL.txt\"."
+#: src/Content/Nav.php:184 src/Module/Login.php:293
+#: src/Module/Register.php:136
+msgid "Register"
+msgstr "S'inscrire"
 
-#: src/Core/Installer.php:478
-msgid "config/local.config.php is writable"
-msgstr ""
+#: src/Content/Nav.php:184
+msgid "Create an account"
+msgstr "Créer un compte"
 
-#: src/Core/Installer.php:498
-msgid ""
-"Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "Friendica utilise le moteur de modèles Smarty3 pour le rendu d'affichage web. Smarty3 compile les modèles en PHP pour accélérer le rendu."
+#: src/Content/Nav.php:190
+msgid "Help and documentation"
+msgstr "Aide et documentation"
 
-#: src/Core/Installer.php:499
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory view/smarty3/ under the Friendica top level "
-"folder."
-msgstr "Pour pouvoir stocker ces modèles compilés, le serveur internet doit avoir accès au droit d'écriture pour le répertoire view/smarty3/ sous le dossier racine de Friendica."
+#: src/Content/Nav.php:194
+msgid "Apps"
+msgstr "Applications"
 
-#: src/Core/Installer.php:500
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Veuillez vous assurer que l'utilisateur qui exécute votre serveur internet (p. ex. www-data) détient le droit d'accès en écriture sur ce dossier."
+#: src/Content/Nav.php:194
+msgid "Addon applications, utilities, games"
+msgstr "Applications supplémentaires, utilitaires, jeux"
 
-#: src/Core/Installer.php:501
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"view/smarty3/ only--not the template files (.tpl) that it contains."
-msgstr "Note: pour plus de sécurité, vous devriez ne donner le droit d'accès en écriture qu'à view/smarty3/ et pas aux fichiers modèles (.tpl) qu'il contient."
+#: src/Content/Nav.php:198
+msgid "Search site content"
+msgstr "Rechercher dans le contenu du site"
 
-#: src/Core/Installer.php:504
-msgid "view/smarty3 is writable"
-msgstr "view/smarty3 est autorisé à l écriture"
+#: src/Content/Nav.php:201 src/Content/Text/HTML.php:909
+msgid "Full Text"
+msgstr "Texte Entier"
 
-#: src/Core/Installer.php:533
-msgid ""
-"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
-" to .htaccess."
-msgstr ""
+#: src/Content/Nav.php:202 src/Content/Text/HTML.php:910
+#: src/Content/Widget/TagCloud.php:54
+msgid "Tags"
+msgstr "Tags"
 
-#: src/Core/Installer.php:535
-msgid "Error message from Curl when fetching"
-msgstr ""
+#: src/Content/Nav.php:222
+msgid "Community"
+msgstr "Communauté"
 
-#: src/Core/Installer.php:540
-msgid "Url rewrite is working"
-msgstr "La réécriture d'URL fonctionne."
+#: src/Content/Nav.php:222
+msgid "Conversations on this and other servers"
+msgstr ""
 
-#: src/Core/Installer.php:569
-msgid "ImageMagick PHP extension is not installed"
-msgstr "L'extension PHP ImageMagick n'est pas installée"
+#: src/Content/Nav.php:226 src/Model/Profile.php:940 src/Model/Profile.php:951
+#: view/theme/frio/theme.php:270
+msgid "Events and Calendar"
+msgstr "Événements et agenda"
 
-#: src/Core/Installer.php:571
-msgid "ImageMagick PHP extension is installed"
-msgstr "L’extension PHP ImageMagick est installée"
+#: src/Content/Nav.php:229
+msgid "Directory"
+msgstr "Annuaire"
 
-#: src/Core/Installer.php:573 tests/src/Core/InstallerTest.php:329
-#: tests/src/Core/InstallerTest.php:355
-msgid "ImageMagick supports GIF"
-msgstr "ImageMagick supporte le format GIF"
+#: src/Content/Nav.php:229
+msgid "People directory"
+msgstr "Annuaire des utilisateurs"
 
-#: src/Core/Installer.php:595
-msgid "Could not connect to database."
-msgstr "Impossible de se connecter à la base."
+#: src/Content/Nav.php:231
+msgid "Information about this friendica instance"
+msgstr "Information au sujet de cette instance de friendica"
 
-#: src/Core/Installer.php:602
-msgid "Database already in use."
-msgstr "Base de données déjà en cours d'utilisation."
+#: src/Content/Nav.php:234
+msgid "Terms of Service of this Friendica instance"
+msgstr ""
 
-#: src/Core/L10n.php:368 src/Model/Event.php:398
-msgid "Tuesday"
-msgstr "Mardi"
+#: src/Content/Nav.php:239 view/theme/frio/theme.php:269
+msgid "Conversations from your friends"
+msgstr "Conversations de vos amis"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:399
-msgid "Wednesday"
-msgstr "Mercredi"
+#: src/Content/Nav.php:240
+msgid "Network Reset"
+msgstr "Réinitialiser le réseau"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:400
-msgid "Thursday"
-msgstr "Jeudi"
+#: src/Content/Nav.php:240
+msgid "Load Network page with no filters"
+msgstr "Chargement des pages du réseau sans filtre"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:401
-msgid "Friday"
-msgstr "Vendredi"
+#: src/Content/Nav.php:246 src/Core/NotificationsManager.php:203
+msgid "Introductions"
+msgstr "Introductions"
 
-#: src/Core/L10n.php:368 src/Model/Event.php:402
-msgid "Saturday"
-msgstr "Samedi"
+#: src/Content/Nav.php:246
+msgid "Friend Requests"
+msgstr "Demande d'amitié"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:417
-msgid "January"
-msgstr "Janvier"
+#: src/Content/Nav.php:248
+msgid "See all notifications"
+msgstr "Voir toutes les notifications"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:418
-msgid "February"
-msgstr "Février"
+#: src/Content/Nav.php:249
+msgid "Mark all system notifications seen"
+msgstr "Marquer toutes les notifications système comme 'vues'"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:419
-msgid "March"
-msgstr "Mars"
+#: src/Content/Nav.php:252 view/theme/frio/theme.php:271
+msgid "Private mail"
+msgstr "Messages privés"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:420
-msgid "April"
-msgstr "Avril"
+#: src/Content/Nav.php:253
+msgid "Inbox"
+msgstr "Messages entrants"
 
-#: src/Core/L10n.php:372 src/Core/L10n.php:391 src/Model/Event.php:408
-msgid "May"
-msgstr "Mai"
+#: src/Content/Nav.php:254
+msgid "Outbox"
+msgstr "Messages sortants"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:421
-msgid "June"
-msgstr "Juin"
+#: src/Content/Nav.php:258
+msgid "Manage"
+msgstr "Gérer"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:422
-msgid "July"
-msgstr "Juillet"
+#: src/Content/Nav.php:258
+msgid "Manage other pages"
+msgstr "Gérer les autres pages"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:423
-msgid "August"
-msgstr "Août"
+#: src/Content/Nav.php:263 view/theme/frio/theme.php:272
+msgid "Account settings"
+msgstr "Compte"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:424
-msgid "September"
-msgstr "Septembre"
+#: src/Content/Nav.php:266
+msgid "Manage/Edit Profiles"
+msgstr "Gérer/Éditer les profiles"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:425
-msgid "October"
-msgstr "Octobre"
+#: src/Content/Nav.php:269 view/theme/frio/theme.php:273
+msgid "Manage/edit friends and contacts"
+msgstr "Gérer/éditer les amitiés et contacts"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:426
-msgid "November"
-msgstr "Novembre"
+#: src/Content/Nav.php:274
+msgid "Site setup and configuration"
+msgstr "Démarrage et configuration du site"
 
-#: src/Core/L10n.php:372 src/Model/Event.php:427
-msgid "December"
-msgstr "Décembre"
+#: src/Content/Nav.php:277
+msgid "Navigation"
+msgstr "Navigation"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:389
-msgid "Mon"
-msgstr "Lun"
+#: src/Content/Nav.php:277
+msgid "Site map"
+msgstr "Carte du site"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:390
-msgid "Tue"
-msgstr "Mar"
+#: src/Content/OEmbed.php:256
+msgid "Embedding disabled"
+msgstr "Incorporation désactivée"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:391
-msgid "Wed"
-msgstr "Mer"
+#: src/Content/OEmbed.php:379
+msgid "Embedded content"
+msgstr "Contenu incorporé"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:392
-msgid "Thu"
-msgstr "Jeu"
+#: src/Content/Pager.php:153
+msgid "newer"
+msgstr "Plus récent"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:393
-msgid "Fri"
-msgstr "Ven"
+#: src/Content/Pager.php:158
+msgid "older"
+msgstr "Plus ancien"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:394
-msgid "Sat"
-msgstr "Sam"
+#: src/Content/Pager.php:203
+msgid "prev"
+msgstr "précédent"
 
-#: src/Core/L10n.php:387 src/Model/Event.php:388
-msgid "Sun"
-msgstr "Dim"
+#: src/Content/Pager.php:263
+msgid "last"
+msgstr "dernier"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:404
-msgid "Jan"
-msgstr "Jan"
+#: src/Content/Text/BBCode.php:429
+msgid "view full size"
+msgstr "voir en pleine taille"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:405
-msgid "Feb"
-msgstr "Fév"
+#: src/Content/Text/BBCode.php:863 src/Content/Text/BBCode.php:1596
+#: src/Content/Text/BBCode.php:1597
+msgid "Image/photo"
+msgstr "Image/photo"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:406
-msgid "Mar"
-msgstr "Mar"
+#: src/Content/Text/BBCode.php:967
+#, php-format
+msgid "<a href=\"%1$s\" target=\"_blank\">%2$s</a> %3$s"
+msgstr "<a href=\"%1$s\" target=\"_blank\">%2$s</a> %3$s"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:407
-msgid "Apr"
-msgstr "Avr"
+#: src/Content/Text/BBCode.php:1523 src/Content/Text/BBCode.php:1545
+msgid "$1 wrote:"
+msgstr "$1 a écrit :"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:410
-msgid "Jul"
-msgstr "Jul"
+#: src/Content/Text/BBCode.php:1607 src/Content/Text/BBCode.php:1608
+msgid "Encrypted content"
+msgstr "Contenu chiffré"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:411
-msgid "Aug"
-msgstr "Aoû"
+#: src/Content/Text/BBCode.php:1715
+msgid "Invalid source protocol"
+msgstr ""
 
-#: src/Core/L10n.php:391
-msgid "Sep"
+#: src/Content/Text/BBCode.php:1726
+msgid "Invalid link protocol"
 msgstr ""
 
-#: src/Core/L10n.php:391 src/Model/Event.php:413
-msgid "Oct"
-msgstr "Oct"
+#: src/Content/Text/HTML.php:800
+msgid "Loading more entries..."
+msgstr "Chargement de résultats supplémentaires..."
 
-#: src/Core/L10n.php:391 src/Model/Event.php:414
-msgid "Nov"
-msgstr "Nov"
+#: src/Content/Text/HTML.php:801
+msgid "The end"
+msgstr "Fin"
 
-#: src/Core/L10n.php:391 src/Model/Event.php:415
-msgid "Dec"
-msgstr "Déc"
+#: src/Content/Text/HTML.php:894
+msgid "Follow"
+msgstr "S'abonner"
 
-#: src/Core/L10n.php:410
-msgid "poke"
-msgstr "titiller"
+#: src/Content/Text/HTML.php:951 src/Model/Item.php:3503
+#: src/Model/Item.php:3514
+msgid "Click to open/close"
+msgstr "Cliquer pour ouvrir/fermer"
 
-#: src/Core/L10n.php:410
-msgid "poked"
-msgstr "a titillé"
+#: src/Content/Widget/CalendarExport.php:64
+msgid "Export"
+msgstr "Exporter"
 
-#: src/Core/L10n.php:411
-msgid "ping"
-msgstr "attirer l'attention"
+#: src/Content/Widget/CalendarExport.php:65
+msgid "Export calendar as ical"
+msgstr "Exporter au format iCal"
 
-#: src/Core/L10n.php:411
-msgid "pinged"
-msgstr "a attiré l'attention de"
+#: src/Content/Widget/CalendarExport.php:66
+msgid "Export calendar as csv"
+msgstr "Exporter au format CSV"
 
-#: src/Core/L10n.php:412
-msgid "prod"
-msgstr "aiguillonner"
+#: src/Content/Widget/ContactBlock.php:58
+msgid "No contacts"
+msgstr "Aucun contact"
 
-#: src/Core/L10n.php:412
-msgid "prodded"
-msgstr "a aiguillonné"
+#: src/Content/Widget/ContactBlock.php:90
+#, php-format
+msgid "%d Contact"
+msgid_plural "%d Contacts"
+msgstr[0] "%d contact"
+msgstr[1] "%d contacts"
 
-#: src/Core/L10n.php:413
-msgid "slap"
-msgstr "gifler"
+#: src/Content/Widget/ContactBlock.php:109
+msgid "View Contacts"
+msgstr "Voir les contacts"
 
-#: src/Core/L10n.php:413
-msgid "slapped"
-msgstr "a giflé"
+#: src/Content/Widget.php:35
+msgid "Add New Contact"
+msgstr "Ajouter un nouveau contact"
 
-#: src/Core/L10n.php:414
-msgid "finger"
-msgstr "tripoter"
+#: src/Content/Widget.php:36
+msgid "Enter address or web location"
+msgstr "Entrez son adresse ou sa localisation web"
 
-#: src/Core/L10n.php:414
-msgid "fingered"
-msgstr "a tripoté"
+#: src/Content/Widget.php:37
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Exemple : bob@example.com, http://example.com/barbara"
 
-#: src/Core/L10n.php:415
-msgid "rebuff"
-msgstr "rabrouer"
+#: src/Content/Widget.php:55
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invitation disponible"
+msgstr[1] "%d invitations disponibles"
 
-#: src/Core/L10n.php:415
-msgid "rebuffed"
-msgstr "a rabroué"
+#: src/Content/Widget.php:61 view/theme/vier/theme.php:199
+msgid "Find People"
+msgstr "Trouver des personnes"
 
-#: src/Core/NotificationsManager.php:175
-msgid "System"
-msgstr "Système"
+#: src/Content/Widget.php:62 view/theme/vier/theme.php:200
+msgid "Enter name or interest"
+msgstr "Entrez un nom ou un centre d'intérêt"
 
-#: src/Core/NotificationsManager.php:196 src/Content/Nav.php:180
-#: src/Content/Nav.php:242
-msgid "Home"
-msgstr "Profil"
+#: src/Content/Widget.php:64 view/theme/vier/theme.php:202
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Exemples : Robert Morgenstein, Pêche"
 
-#: src/Core/NotificationsManager.php:203 src/Content/Nav.php:246
-msgid "Introductions"
-msgstr "Introductions"
+#: src/Content/Widget.php:67 view/theme/vier/theme.php:205
+msgid "Similar Interests"
+msgstr "Intérêts similaires"
 
-#: src/Core/NotificationsManager.php:265 src/Core/NotificationsManager.php:277
-#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s a commenté la publication de %s"
+#: src/Content/Widget.php:68 view/theme/vier/theme.php:206
+msgid "Random Profile"
+msgstr "Profil au hasard"
 
-#: src/Core/NotificationsManager.php:276
-#, php-format
-msgid "%s created a new post"
-msgstr "%s a créé une nouvelle publication"
+#: src/Content/Widget.php:69 view/theme/vier/theme.php:207
+msgid "Invite Friends"
+msgstr "Inviter des amis"
 
-#: src/Core/NotificationsManager.php:290
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s a aimé la publication de %s"
+#: src/Content/Widget.php:72 view/theme/vier/theme.php:210
+msgid "Local Directory"
+msgstr "Annuaire local"
 
-#: src/Core/NotificationsManager.php:303
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s n'a pas aimé la publication de %s"
+#: src/Content/Widget.php:158
+msgid "Protocols"
+msgstr ""
 
-#: src/Core/NotificationsManager.php:316
-#, php-format
-msgid "%s is attending %s's event"
-msgstr "%s participe à l'événement de %s"
+#: src/Content/Widget.php:161
+msgid "All Protocols"
+msgstr ""
 
-#: src/Core/NotificationsManager.php:329
-#, php-format
-msgid "%s is not attending %s's event"
-msgstr "%s ne participe pas à l'événement de %s"
+#: src/Content/Widget.php:198
+msgid "Saved Folders"
+msgstr "Dossiers sauvegardés"
 
-#: src/Core/NotificationsManager.php:342
-#, php-format
-msgid "%s may attend %s's event"
-msgstr "%s participera peut-être à l'événement de %s"
+#: src/Content/Widget.php:201 src/Content/Widget.php:243
+msgid "Everything"
+msgstr "Tout"
 
-#: src/Core/NotificationsManager.php:375
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s est désormais ami(e) avec %s"
+#: src/Content/Widget.php:240
+msgid "Categories"
+msgstr "Catégories"
 
-#: src/Core/NotificationsManager.php:651
-msgid "Friend Suggestion"
-msgstr "Suggestion d'amitié/contact"
+#: src/Content/Widget.php:324
+#, php-format
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
+msgstr[0] "%d contact en commun"
+msgstr[1] "%d contacts en commun"
 
-#: src/Core/NotificationsManager.php:685
-msgid "Friend/Connect Request"
-msgstr "Demande de connexion/relation"
+#: src/Core/ACL.php:287
+msgid "Post to Email"
+msgstr "Publier aux courriels"
 
-#: src/Core/NotificationsManager.php:685
-msgid "New Follower"
-msgstr "Nouvel abonné"
+#: src/Core/ACL.php:293
+msgid "Hide your profile details from unknown viewers?"
+msgstr "Cacher les détails du profil aux visiteurs inconnus?"
 
-#: src/Core/System.php:137
-msgid "Error 400 - Bad Request"
-msgstr ""
+#: src/Core/ACL.php:292
+#, php-format
+msgid "Connectors disabled, since \"%s\" is enabled."
+msgstr "Les connecteurs sont désactivés parce que \"%s\" est activé."
 
-#: src/Core/System.php:138
-msgid "Error 401 - Unauthorized"
-msgstr ""
+#: src/Core/ACL.php:299
+msgid "Visible to everybody"
+msgstr "Visible par tout le monde"
 
-#: src/Core/System.php:139
-msgid "Error 403 - Forbidden"
+#: src/Core/ACL.php:300 view/theme/vier/config.php:116
+msgid "show"
+msgstr "montrer"
+
+#: src/Core/ACL.php:301 view/theme/vier/config.php:116
+msgid "don't show"
+msgstr "cacher"
+
+#: src/Core/ACL.php:311
+msgid "Close"
+msgstr "Fermer"
+
+#: src/Core/Authentication.php:87
+msgid "Welcome "
+msgstr "Bienvenue "
+
+#: src/Core/Authentication.php:88
+msgid "Please upload a profile photo."
+msgstr "Merci d'illustrer votre profil d'une image."
+
+#: src/Core/Authentication.php:90
+msgid "Welcome back "
+msgstr "Bienvenue à nouveau, "
+
+#: src/Core/Console/ArchiveContact.php:65
+#, php-format
+msgid "Could not find any unarchived contact entry for this URL (%s)"
 msgstr ""
 
-#: src/Core/System.php:140
-msgid "Error 404 - Not Found"
+#: src/Core/Console/ArchiveContact.php:70
+msgid "The contact entries have been archived"
 msgstr ""
 
-#: src/Core/System.php:141
-msgid "Error 500 - Internal Server Error"
+#: src/Core/Console/NewPassword.php:72
+msgid "Enter new password: "
 msgstr ""
 
-#: src/Core/System.php:142
-msgid "Error 503 - Service Unavailable"
+#: src/Core/Console/PostUpdate.php:50
+#, php-format
+msgid "Post update version number has been set to %s."
 msgstr ""
 
-#: src/Core/System.php:150
-msgid ""
-"The server cannot or will not process the request due to an apparent client "
-"error."
+#: src/Core/Console/PostUpdate.php:58
+msgid "Check for pending update actions."
 msgstr ""
 
-#: src/Core/System.php:151
-msgid ""
-"Authentication is required and has failed or has not yet been provided."
+#: src/Core/Console/PostUpdate.php:60
+msgid "Done."
 msgstr ""
 
-#: src/Core/System.php:152
-msgid ""
-"The request was valid, but the server is refusing action. The user might not"
-" have the necessary permissions for a resource, or may need an account."
+#: src/Core/Console/PostUpdate.php:62
+msgid "Execute pending post updates."
 msgstr ""
 
-#: src/Core/System.php:153
-msgid ""
-"The requested resource could not be found but may be available in the "
-"future."
+#: src/Core/Console/PostUpdate.php:68
+msgid "All pending post updates are done."
 msgstr ""
 
-#: src/Core/System.php:154
+#: src/Core/Installer.php:163
 msgid ""
-"An unexpected condition was encountered and no more specific message is "
-"suitable."
+"The database configuration file \"config/local.config.php\" could not be "
+"written. Please use the enclosed text to create a configuration file in your"
+" web server root."
 msgstr ""
 
-#: src/Core/System.php:155
+#: src/Core/Installer.php:182
 msgid ""
-"The server is currently unavailable (because it is overloaded or down for "
-"maintenance). Please try again later."
-msgstr ""
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
+msgstr "Vous pourriez avoir besoin d'importer le fichier \"database.sql\" manuellement au moyen de phpmyadmin ou de la commande mysql."
 
-#: src/Core/Update.php:168
-#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "Mise-à-jour %s échouée. Voir les journaux d'erreur."
+#: src/Core/Installer.php:183 src/Module/Install.php:132
+#: src/Module/Install.php:263
+msgid "Please see the file \"INSTALL.txt\"."
+msgstr "Référez-vous au fichier \"INSTALL.txt\"."
 
-#: src/Core/Update.php:225
-#, php-format
+#: src/Core/Installer.php:244
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH du serveur web."
+
+#: src/Core/Installer.php:245
 msgid ""
-"\n"
-"\t\t\t\tThe friendica developers released update %s recently,\n"
-"\t\t\t\tbut when I tried to install it, something went terribly wrong.\n"
-"\t\t\t\tThis needs to be fixed soon and I can't do it alone. Please contact a\n"
-"\t\t\t\tfriendica developer if you can not help me on your own. My database might be invalid."
+"If you don't have a command line version of PHP installed on your server, "
+"you will not be able to run the background processing. See <a "
+"href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-"
+"up-the-worker'>'Setup the worker'</a>"
 msgstr ""
 
-#: src/Core/Update.php:231
-#, php-format
-msgid ""
-"The error message is\n"
-"[pre]%s[/pre]"
-msgstr "Le message d’erreur est\n[pre]%s[/pre]"
+#: src/Core/Installer.php:249
+msgid "PHP executable path"
+msgstr "Chemin vers l'exécutable de PHP"
 
-#: src/Core/Update.php:260
-#, php-format
+#: src/Core/Installer.php:249
 msgid ""
-"\n"
-"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
-msgstr ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Entrez le chemin (absolu) vers l'exécutable 'php'. Vous pouvez laisser cette ligne vide pour continuer l'installation."
 
-#: src/Core/UserImport.php:103
-msgid "Error decoding account file"
-msgstr "Une erreur a été détecté en décodant un fichier utilisateur"
+#: src/Core/Installer.php:254
+msgid "Command line PHP"
+msgstr "Version \"ligne de commande\" de PHP"
 
-#: src/Core/UserImport.php:109
-msgid "Error! No version data in file! This is not a Friendica account file?"
-msgstr "Erreur ! Pas de ficher de version existant ! Êtes vous sur un compte Friendica ?"
+#: src/Core/Installer.php:263
+msgid "PHP executable is not the php cli binary (could be cgi-fgci version)"
+msgstr "L'executable PHP n'est pas le binaire php client (c'est peut être la version cgi-fcgi)"
 
-#: src/Core/UserImport.php:117
-#, php-format
-msgid "User '%s' already exists on this server!"
-msgstr "L'utilisateur '%s' existe déjà sur ce serveur!"
+#: src/Core/Installer.php:264
+msgid "Found PHP version: "
+msgstr "Version de PHP :"
 
-#: src/Core/UserImport.php:153
-msgid "User creation error"
-msgstr "Erreur de création d'utilisateur"
+#: src/Core/Installer.php:266
+msgid "PHP cli binary"
+msgstr "PHP cli binary"
 
-#: src/Core/UserImport.php:171
-msgid "User profile creation error"
-msgstr "Erreur de création du profil utilisateur"
+#: src/Core/Installer.php:279
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "La version \"ligne de commande\" de PHP de votre système n'a pas \"register_argc_argv\" d'activé."
 
-#: src/Core/UserImport.php:215
-#, php-format
-msgid "%d contact not imported"
-msgid_plural "%d contacts not imported"
-msgstr[0] "%d contacts non importés"
-msgstr[1] "%d contacts non importés"
+#: src/Core/Installer.php:280
+msgid "This is required for message delivery to work."
+msgstr "Ceci est requis pour que la livraison des messages fonctionne."
 
-#: src/Core/UserImport.php:280
-msgid "Done. You can now login with your username and password"
-msgstr "Action réalisée. Vous pouvez désormais vous connecter avec votre nom d'utilisateur et votre mot de passe"
+#: src/Core/Installer.php:285
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
 
-#: src/Util/Temporal.php:147 src/Model/Profile.php:771
-msgid "Birthday:"
-msgstr "Anniversaire :"
+#: src/Core/Installer.php:317
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Erreur: la fonction \"openssl_pkey_new\" de ce système ne permet pas de générer des clés de chiffrement"
 
-#: src/Util/Temporal.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "AAAA-MM-JJ ou MM-JJ"
+#: src/Core/Installer.php:318
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Si vous utilisez Windows, merci de vous réferer à \"http://www.php.net/manual/en/openssl.installation.php\"."
 
-#: src/Util/Temporal.php:298
-msgid "never"
-msgstr "jamais"
+#: src/Core/Installer.php:321
+msgid "Generate encryption keys"
+msgstr "Générer les clés de chiffrement"
 
-#: src/Util/Temporal.php:305
-msgid "less than a second ago"
-msgstr "il y a moins d'une seconde"
+#: src/Core/Installer.php:372
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Erreur : Le module \"rewrite\" du serveur web Apache est requis mais pas installé."
 
-#: src/Util/Temporal.php:313
-msgid "year"
-msgstr "an"
+#: src/Core/Installer.php:377
+msgid "Apache mod_rewrite module"
+msgstr "Module mod_rewrite Apache"
 
-#: src/Util/Temporal.php:313
-msgid "years"
-msgstr "ans"
+#: src/Core/Installer.php:383
+msgid "Error: PDO or MySQLi PHP module required but not installed."
+msgstr ""
 
-#: src/Util/Temporal.php:314
-msgid "months"
-msgstr "mois"
+#: src/Core/Installer.php:388
+msgid "Error: The MySQL driver for PDO is not installed."
+msgstr ""
 
-#: src/Util/Temporal.php:315
-msgid "weeks"
-msgstr "semaines"
+#: src/Core/Installer.php:392
+msgid "PDO or MySQLi PHP module"
+msgstr ""
 
-#: src/Util/Temporal.php:316
-msgid "days"
-msgstr "jours"
+#: src/Core/Installer.php:400
+msgid "Error, XML PHP module required but not installed."
+msgstr "Erreur : le module PHP XML requis est absent."
 
-#: src/Util/Temporal.php:317
-msgid "hour"
-msgstr "heure"
+#: src/Core/Installer.php:404
+msgid "XML PHP module"
+msgstr "Module PHP XML"
 
-#: src/Util/Temporal.php:317
-msgid "hours"
-msgstr "heures"
+#: src/Core/Installer.php:407
+msgid "libCurl PHP module"
+msgstr "Module libCurl de PHP"
 
-#: src/Util/Temporal.php:318
-msgid "minute"
-msgstr "minute"
+#: src/Core/Installer.php:408
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Erreur : Le module PHP \"libCURL\" est requis mais pas installé."
 
-#: src/Util/Temporal.php:318
-msgid "minutes"
-msgstr "minutes"
+#: src/Core/Installer.php:414
+msgid "GD graphics PHP module"
+msgstr "Module GD (graphiques) de PHP"
 
-#: src/Util/Temporal.php:319
-msgid "second"
-msgstr "seconde"
+#: src/Core/Installer.php:415
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Erreur : Le module PHP \"GD\" disposant du support JPEG est requis mais pas installé."
 
-#: src/Util/Temporal.php:319
-msgid "seconds"
-msgstr "secondes"
+#: src/Core/Installer.php:421
+msgid "OpenSSL PHP module"
+msgstr "Module OpenSSL de PHP"
 
-#: src/Util/Temporal.php:329
-#, php-format
-msgid "in %1$d %2$s"
-msgstr ""
-
-#: src/Util/Temporal.php:332
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "il y a %1$d %2$s "
-
-#: src/Content/Text/BBCode.php:429
-msgid "view full size"
-msgstr "voir en pleine taille"
+#: src/Core/Installer.php:422
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Erreur : Le module PHP \"openssl\" est requis mais pas installé."
 
-#: src/Content/Text/BBCode.php:863 src/Content/Text/BBCode.php:1596
-#: src/Content/Text/BBCode.php:1597
-msgid "Image/photo"
-msgstr "Image/photo"
+#: src/Core/Installer.php:428
+msgid "mb_string PHP module"
+msgstr "Module mb_string de PHP"
 
-#: src/Content/Text/BBCode.php:967
-#, php-format
-msgid "<a href=\"%1$s\" target=\"_blank\">%2$s</a> %3$s"
-msgstr "<a href=\"%1$s\" target=\"_blank\">%2$s</a> %3$s"
+#: src/Core/Installer.php:429
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Erreur : le module PHP mb_string est requis mais pas installé."
 
-#: src/Content/Text/BBCode.php:1523 src/Content/Text/BBCode.php:1545
-msgid "$1 wrote:"
-msgstr "$1 a écrit :"
+#: src/Core/Installer.php:435
+msgid "iconv PHP module"
+msgstr ""
 
-#: src/Content/Text/BBCode.php:1607 src/Content/Text/BBCode.php:1608
-msgid "Encrypted content"
-msgstr "Contenu chiffré"
+#: src/Core/Installer.php:436
+msgid "Error: iconv PHP module required but not installed."
+msgstr "Erreur : Le module PHP iconv requis est absent."
 
-#: src/Content/Text/BBCode.php:1715
-msgid "Invalid source protocol"
+#: src/Core/Installer.php:442
+msgid "POSIX PHP module"
 msgstr ""
 
-#: src/Content/Text/BBCode.php:1726
-msgid "Invalid link protocol"
+#: src/Core/Installer.php:443
+msgid "Error: POSIX PHP module required but not installed."
 msgstr ""
 
-#: src/Content/Text/HTML.php:800
-msgid "Loading more entries..."
-msgstr "Chargement de résultats supplémentaires..."
-
-#: src/Content/Text/HTML.php:801
-msgid "The end"
-msgstr "Fin"
+#: src/Core/Installer.php:449
+msgid "JSON PHP module"
+msgstr ""
 
-#: src/Content/Text/HTML.php:894
-msgid "Follow"
-msgstr "S'abonner"
+#: src/Core/Installer.php:450
+msgid "Error: JSON PHP module required but not installed."
+msgstr ""
 
-#: src/Content/Text/HTML.php:903 src/Content/Nav.php:79
-msgid "@name, !forum, #tags, content"
-msgstr "@nom, !forum, #tags, contenu"
+#: src/Core/Installer.php:473
+msgid ""
+"The web installer needs to be able to create a file called "
+"\"local.config.php\" in the \"config\" folder of your web server and it is "
+"unable to do so."
+msgstr ""
 
-#: src/Content/Text/HTML.php:909 src/Content/Nav.php:201
-msgid "Full Text"
-msgstr "Texte Entier"
+#: src/Core/Installer.php:474
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "Le plus souvent, il s'agit d'un problème de permission. Le serveur web peut ne pas être capable d'écrire dans votre répertoire - alors que vous-même le pouvez."
 
-#: src/Content/Text/HTML.php:910 src/Content/Widget/TagCloud.php:54
-#: src/Content/Nav.php:202
-msgid "Tags"
-msgstr "Tags"
+#: src/Core/Installer.php:475
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named local.config.php in your Friendica \"config\" folder."
+msgstr ""
 
-#: src/Content/Text/HTML.php:951 src/Model/Item.php:3485
-#: src/Model/Item.php:3496
-msgid "Click to open/close"
-msgstr "Cliquer pour ouvrir/fermer"
+#: src/Core/Installer.php:476
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"INSTALL.txt\" for instructions."
+msgstr "Vous pouvez également sauter cette étape et procéder à une installation manuelle. Pour cela, merci de lire le fichier \"INSTALL.txt\"."
 
-#: src/Content/Widget/CalendarExport.php:64
-msgid "Export"
-msgstr "Exporter"
+#: src/Core/Installer.php:479
+msgid "config/local.config.php is writable"
+msgstr ""
 
-#: src/Content/Widget/CalendarExport.php:65
-msgid "Export calendar as ical"
-msgstr "Exporter au format iCal"
+#: src/Core/Installer.php:499
+msgid ""
+"Friendica uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Friendica utilise le moteur de modèles Smarty3 pour le rendu d'affichage web. Smarty3 compile les modèles en PHP pour accélérer le rendu."
 
-#: src/Content/Widget/CalendarExport.php:66
-msgid "Export calendar as csv"
-msgstr "Exporter au format CSV"
+#: src/Core/Installer.php:500
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/smarty3/ under the Friendica top level "
+"folder."
+msgstr "Pour pouvoir stocker ces modèles compilés, le serveur internet doit avoir accès au droit d'écriture pour le répertoire view/smarty3/ sous le dossier racine de Friendica."
 
-#: src/Content/Widget/ContactBlock.php:58
-msgid "No contacts"
-msgstr "Aucun contact"
+#: src/Core/Installer.php:501
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Veuillez vous assurer que l'utilisateur qui exécute votre serveur internet (p. ex. www-data) détient le droit d'accès en écriture sur ce dossier."
 
-#: src/Content/Widget/ContactBlock.php:90
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d contact"
-msgstr[1] "%d contacts"
+#: src/Core/Installer.php:502
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Note: pour plus de sécurité, vous devriez ne donner le droit d'accès en écriture qu'à view/smarty3/ et pas aux fichiers modèles (.tpl) qu'il contient."
 
-#: src/Content/Widget/ContactBlock.php:109
-msgid "View Contacts"
-msgstr "Voir les contacts"
+#: src/Core/Installer.php:505
+msgid "view/smarty3 is writable"
+msgstr "view/smarty3 est autorisé à l écriture"
 
-#: src/Content/ContactSelector.php:58
-msgid "Frequently"
+#: src/Core/Installer.php:534
+msgid ""
+"Url rewrite in .htaccess is not working. Make sure you copied .htaccess-dist"
+" to .htaccess."
 msgstr ""
 
-#: src/Content/ContactSelector.php:59
-msgid "Hourly"
+#: src/Core/Installer.php:536
+msgid "Error message from Curl when fetching"
 msgstr ""
 
-#: src/Content/ContactSelector.php:60
-msgid "Twice daily"
-msgstr ""
+#: src/Core/Installer.php:541
+msgid "Url rewrite is working"
+msgstr "La réécriture d'URL fonctionne."
 
-#: src/Content/ContactSelector.php:61
-msgid "Daily"
-msgstr ""
+#: src/Core/Installer.php:570
+msgid "ImageMagick PHP extension is not installed"
+msgstr "L'extension PHP ImageMagick n'est pas installée"
 
-#: src/Content/ContactSelector.php:62
-msgid "Weekly"
-msgstr ""
+#: src/Core/Installer.php:572
+msgid "ImageMagick PHP extension is installed"
+msgstr "L’extension PHP ImageMagick est installée"
 
-#: src/Content/ContactSelector.php:63
-msgid "Monthly"
-msgstr ""
+#: src/Core/Installer.php:574 tests/src/Core/InstallerTest.php:329
+#: tests/src/Core/InstallerTest.php:355
+msgid "ImageMagick supports GIF"
+msgstr "ImageMagick supporte le format GIF"
 
-#: src/Content/ContactSelector.php:83
-msgid "DFRN"
-msgstr ""
+#: src/Core/Installer.php:597
+msgid "Could not connect to database."
+msgstr "Impossible de se connecter à la base."
 
-#: src/Content/ContactSelector.php:84
-msgid "OStatus"
-msgstr ""
+#: src/Core/Installer.php:604
+msgid "Database already in use."
+msgstr "Base de données déjà en cours d'utilisation."
 
-#: src/Content/ContactSelector.php:85
-msgid "RSS/Atom"
-msgstr ""
+#: src/Core/L10n.php:368 src/Model/Event.php:397
+msgid "Tuesday"
+msgstr "Mardi"
 
-#: src/Content/ContactSelector.php:88
-msgid "Zot!"
-msgstr ""
+#: src/Core/L10n.php:368 src/Model/Event.php:398
+msgid "Wednesday"
+msgstr "Mercredi"
 
-#: src/Content/ContactSelector.php:89
-msgid "LinkedIn"
-msgstr ""
+#: src/Core/L10n.php:368 src/Model/Event.php:399
+msgid "Thursday"
+msgstr "Jeudi"
 
-#: src/Content/ContactSelector.php:90
-msgid "XMPP/IM"
-msgstr ""
+#: src/Core/L10n.php:368 src/Model/Event.php:400
+msgid "Friday"
+msgstr "Vendredi"
 
-#: src/Content/ContactSelector.php:91
-msgid "MySpace"
-msgstr ""
+#: src/Core/L10n.php:368 src/Model/Event.php:401
+msgid "Saturday"
+msgstr "Samedi"
 
-#: src/Content/ContactSelector.php:92
-msgid "Google+"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:416
+msgid "January"
+msgstr "Janvier"
 
-#: src/Content/ContactSelector.php:93
-msgid "pump.io"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:417
+msgid "February"
+msgstr "Février"
 
-#: src/Content/ContactSelector.php:94
-msgid "Twitter"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:418
+msgid "March"
+msgstr "Mars"
 
-#: src/Content/ContactSelector.php:95
-msgid "Diaspora Connector"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:419
+msgid "April"
+msgstr "Avril"
 
-#: src/Content/ContactSelector.php:96
-msgid "GNU Social Connector"
-msgstr ""
+#: src/Core/L10n.php:372 src/Core/L10n.php:391 src/Model/Event.php:407
+msgid "May"
+msgstr "Mai"
 
-#: src/Content/ContactSelector.php:97
-msgid "ActivityPub"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:420
+msgid "June"
+msgstr "Juin"
 
-#: src/Content/ContactSelector.php:98
-msgid "pnut"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:421
+msgid "July"
+msgstr "Juillet"
 
-#: src/Content/ContactSelector.php:154
-msgid "Male"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:422
+msgid "August"
+msgstr "Août"
 
-#: src/Content/ContactSelector.php:155
-msgid "Female"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:423
+msgid "September"
+msgstr "Septembre"
 
-#: src/Content/ContactSelector.php:156
-msgid "Currently Male"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:424
+msgid "October"
+msgstr "Octobre"
 
-#: src/Content/ContactSelector.php:157
-msgid "Currently Female"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:425
+msgid "November"
+msgstr "Novembre"
 
-#: src/Content/ContactSelector.php:158
-msgid "Mostly Male"
-msgstr ""
+#: src/Core/L10n.php:372 src/Model/Event.php:426
+msgid "December"
+msgstr "Décembre"
 
-#: src/Content/ContactSelector.php:159
-msgid "Mostly Female"
-msgstr ""
+#: src/Core/L10n.php:387 src/Model/Event.php:388
+msgid "Mon"
+msgstr "Lun"
 
-#: src/Content/ContactSelector.php:160
-msgid "Transgender"
-msgstr ""
+#: src/Core/L10n.php:387 src/Model/Event.php:389
+msgid "Tue"
+msgstr "Mar"
 
-#: src/Content/ContactSelector.php:161
-msgid "Intersex"
-msgstr ""
+#: src/Core/L10n.php:387 src/Model/Event.php:390
+msgid "Wed"
+msgstr "Mer"
 
-#: src/Content/ContactSelector.php:162
-msgid "Transsexual"
-msgstr ""
+#: src/Core/L10n.php:387 src/Model/Event.php:391
+msgid "Thu"
+msgstr "Jeu"
 
-#: src/Content/ContactSelector.php:163
-msgid "Hermaphrodite"
-msgstr ""
+#: src/Core/L10n.php:387 src/Model/Event.php:392
+msgid "Fri"
+msgstr "Ven"
 
-#: src/Content/ContactSelector.php:164
-msgid "Neuter"
-msgstr ""
+#: src/Core/L10n.php:387 src/Model/Event.php:393
+msgid "Sat"
+msgstr "Sam"
 
-#: src/Content/ContactSelector.php:165
-msgid "Non-specific"
-msgstr "Non-spécifique"
+#: src/Core/L10n.php:387 src/Model/Event.php:387
+msgid "Sun"
+msgstr "Dim"
 
-#: src/Content/ContactSelector.php:166
-msgid "Other"
-msgstr "Autre"
+#: src/Core/L10n.php:391 src/Model/Event.php:403
+msgid "Jan"
+msgstr "Jan"
 
-#: src/Content/ContactSelector.php:194
-msgid "Males"
-msgstr "Hommes"
+#: src/Core/L10n.php:391 src/Model/Event.php:404
+msgid "Feb"
+msgstr "Fév"
 
-#: src/Content/ContactSelector.php:195
-msgid "Females"
-msgstr "Femmes"
+#: src/Core/L10n.php:391 src/Model/Event.php:405
+msgid "Mar"
+msgstr "Mar"
 
-#: src/Content/ContactSelector.php:196
-msgid "Gay"
-msgstr "Gay"
+#: src/Core/L10n.php:391 src/Model/Event.php:406
+msgid "Apr"
+msgstr "Avr"
 
-#: src/Content/ContactSelector.php:197
-msgid "Lesbian"
-msgstr "Lesbienne"
+#: src/Core/L10n.php:391 src/Model/Event.php:409
+msgid "Jul"
+msgstr "Jul"
 
-#: src/Content/ContactSelector.php:198
-msgid "No Preference"
-msgstr "Sans préférence"
+#: src/Core/L10n.php:391 src/Model/Event.php:410
+msgid "Aug"
+msgstr "Aoû"
 
-#: src/Content/ContactSelector.php:199
-msgid "Bisexual"
-msgstr "Bisexuel"
+#: src/Core/L10n.php:391
+msgid "Sep"
+msgstr ""
 
-#: src/Content/ContactSelector.php:200
-msgid "Autosexual"
-msgstr "Auto-sexuel"
+#: src/Core/L10n.php:391 src/Model/Event.php:412
+msgid "Oct"
+msgstr "Oct"
 
-#: src/Content/ContactSelector.php:201
-msgid "Abstinent"
-msgstr "Abstinent"
+#: src/Core/L10n.php:391 src/Model/Event.php:413
+msgid "Nov"
+msgstr "Nov"
 
-#: src/Content/ContactSelector.php:202
-msgid "Virgin"
-msgstr "Vierge"
+#: src/Core/L10n.php:391 src/Model/Event.php:414
+msgid "Dec"
+msgstr "Déc"
 
-#: src/Content/ContactSelector.php:203
-msgid "Deviant"
-msgstr "Déviant"
+#: src/Core/L10n.php:410
+msgid "poke"
+msgstr "titiller"
 
-#: src/Content/ContactSelector.php:204
-msgid "Fetish"
-msgstr "Fétichiste"
+#: src/Core/L10n.php:410
+msgid "poked"
+msgstr "a titillé"
 
-#: src/Content/ContactSelector.php:205
-msgid "Oodles"
-msgstr "Oodles"
+#: src/Core/L10n.php:411
+msgid "ping"
+msgstr "attirer l'attention"
 
-#: src/Content/ContactSelector.php:206
-msgid "Nonsexual"
-msgstr "Non-sexuel"
+#: src/Core/L10n.php:411
+msgid "pinged"
+msgstr "a attiré l'attention de"
 
-#: src/Content/ContactSelector.php:232
-msgid "Single"
-msgstr "Célibataire"
+#: src/Core/L10n.php:412
+msgid "prod"
+msgstr "aiguillonner"
 
-#: src/Content/ContactSelector.php:233
-msgid "Lonely"
-msgstr "Esseulé"
+#: src/Core/L10n.php:412
+msgid "prodded"
+msgstr "a aiguillonné"
 
-#: src/Content/ContactSelector.php:234
-msgid "Available"
-msgstr "Disponible"
+#: src/Core/L10n.php:413
+msgid "slap"
+msgstr "gifler"
 
-#: src/Content/ContactSelector.php:235
-msgid "Unavailable"
-msgstr "Indisponible"
+#: src/Core/L10n.php:413
+msgid "slapped"
+msgstr "a giflé"
 
-#: src/Content/ContactSelector.php:236
-msgid "Has crush"
-msgstr "Attiré par quelqu'un"
+#: src/Core/L10n.php:414
+msgid "finger"
+msgstr "tripoter"
 
-#: src/Content/ContactSelector.php:237
-msgid "Infatuated"
-msgstr "Entiché"
+#: src/Core/L10n.php:414
+msgid "fingered"
+msgstr "a tripoté"
 
-#: src/Content/ContactSelector.php:238
-msgid "Dating"
-msgstr "Dans une relation"
+#: src/Core/L10n.php:415
+msgid "rebuff"
+msgstr "rabrouer"
 
-#: src/Content/ContactSelector.php:239
-msgid "Unfaithful"
-msgstr "Infidèle"
+#: src/Core/L10n.php:415
+msgid "rebuffed"
+msgstr "a rabroué"
 
-#: src/Content/ContactSelector.php:240
-msgid "Sex Addict"
-msgstr "Accro au sexe"
+#: src/Core/NotificationsManager.php:175
+msgid "System"
+msgstr "Système"
 
-#: src/Content/ContactSelector.php:241 src/Model/User.php:701
-msgid "Friends"
-msgstr "Amis"
+#: src/Core/NotificationsManager.php:265 src/Core/NotificationsManager.php:277
+#, php-format
+msgid "%s commented on %s's post"
+msgstr "%s a commenté la publication de %s"
 
-#: src/Content/ContactSelector.php:242
-msgid "Friends/Benefits"
-msgstr "Amis par intérêt"
+#: src/Core/NotificationsManager.php:276
+#, php-format
+msgid "%s created a new post"
+msgstr "%s a créé une nouvelle publication"
 
-#: src/Content/ContactSelector.php:243
-msgid "Casual"
-msgstr "Casual"
+#: src/Core/NotificationsManager.php:290
+#, php-format
+msgid "%s liked %s's post"
+msgstr "%s a aimé la publication de %s"
 
-#: src/Content/ContactSelector.php:244
-msgid "Engaged"
-msgstr "Fiancé"
+#: src/Core/NotificationsManager.php:303
+#, php-format
+msgid "%s disliked %s's post"
+msgstr "%s n'a pas aimé la publication de %s"
 
-#: src/Content/ContactSelector.php:245
-msgid "Married"
-msgstr "Marié"
+#: src/Core/NotificationsManager.php:316
+#, php-format
+msgid "%s is attending %s's event"
+msgstr "%s participe à l'événement de %s"
 
-#: src/Content/ContactSelector.php:246
-msgid "Imaginarily married"
-msgstr "Se croit marié"
+#: src/Core/NotificationsManager.php:329
+#, php-format
+msgid "%s is not attending %s's event"
+msgstr "%s ne participe pas à l'événement de %s"
 
-#: src/Content/ContactSelector.php:247
-msgid "Partners"
-msgstr "Partenaire"
+#: src/Core/NotificationsManager.php:342
+#, php-format
+msgid "%s may attend %s's event"
+msgstr "%s participera peut-être à l'événement de %s"
 
-#: src/Content/ContactSelector.php:248
-msgid "Cohabiting"
-msgstr "En cohabitation"
+#: src/Core/NotificationsManager.php:375
+#, php-format
+msgid "%s is now friends with %s"
+msgstr "%s est désormais ami(e) avec %s"
 
-#: src/Content/ContactSelector.php:249
-msgid "Common law"
-msgstr "Marié \"de fait\"/\"sui juris\" (concubin)"
+#: src/Core/NotificationsManager.php:651
+msgid "Friend Suggestion"
+msgstr "Suggestion d'amitié/contact"
 
-#: src/Content/ContactSelector.php:250
-msgid "Happy"
-msgstr "Heureux"
+#: src/Core/NotificationsManager.php:685
+msgid "Friend/Connect Request"
+msgstr "Demande de connexion/relation"
 
-#: src/Content/ContactSelector.php:251
-msgid "Not looking"
-msgstr "Pas intéressé"
+#: src/Core/NotificationsManager.php:685
+msgid "New Follower"
+msgstr "Nouvel abonné"
 
-#: src/Content/ContactSelector.php:252
-msgid "Swinger"
-msgstr "Échangiste"
+#: src/Core/System.php:137
+msgid "Error 400 - Bad Request"
+msgstr ""
 
-#: src/Content/ContactSelector.php:253
-msgid "Betrayed"
-msgstr "Trahi(e)"
+#: src/Core/System.php:138
+msgid "Error 401 - Unauthorized"
+msgstr ""
 
-#: src/Content/ContactSelector.php:254
-msgid "Separated"
-msgstr "Séparé"
+#: src/Core/System.php:139
+msgid "Error 403 - Forbidden"
+msgstr ""
 
-#: src/Content/ContactSelector.php:255
-msgid "Unstable"
-msgstr "Instable"
+#: src/Core/System.php:140
+msgid "Error 404 - Not Found"
+msgstr ""
 
-#: src/Content/ContactSelector.php:256
-msgid "Divorced"
-msgstr "Divorcé"
+#: src/Core/System.php:141
+msgid "Error 500 - Internal Server Error"
+msgstr ""
 
-#: src/Content/ContactSelector.php:257
-msgid "Imaginarily divorced"
-msgstr "Se croit divorcé"
+#: src/Core/System.php:142
+msgid "Error 503 - Service Unavailable"
+msgstr ""
 
-#: src/Content/ContactSelector.php:258
-msgid "Widowed"
-msgstr "Veuf/Veuve"
+#: src/Core/System.php:150
+msgid ""
+"The server cannot or will not process the request due to an apparent client "
+"error."
+msgstr ""
 
-#: src/Content/ContactSelector.php:259
-msgid "Uncertain"
-msgstr "Incertain"
+#: src/Core/System.php:151
+msgid ""
+"Authentication is required and has failed or has not yet been provided."
+msgstr ""
 
-#: src/Content/ContactSelector.php:260
-msgid "It's complicated"
-msgstr "C'est compliqué"
+#: src/Core/System.php:152
+msgid ""
+"The request was valid, but the server is refusing action. The user might not"
+" have the necessary permissions for a resource, or may need an account."
+msgstr ""
 
-#: src/Content/ContactSelector.php:261
-msgid "Don't care"
-msgstr "S'en désintéresse"
+#: src/Core/System.php:153
+msgid ""
+"The requested resource could not be found but may be available in the "
+"future."
+msgstr ""
 
-#: src/Content/ContactSelector.php:262
-msgid "Ask me"
-msgstr "Me demander"
+#: src/Core/System.php:154
+msgid ""
+"An unexpected condition was encountered and no more specific message is "
+"suitable."
+msgstr ""
 
-#: src/Content/Feature.php:82
-msgid "General Features"
-msgstr "Fonctions générales"
+#: src/Core/System.php:155
+msgid ""
+"The server is currently unavailable (because it is overloaded or down for "
+"maintenance). Please try again later."
+msgstr ""
 
-#: src/Content/Feature.php:84
-msgid "Multiple Profiles"
-msgstr "Profils multiples"
+#: src/Core/Update.php:168
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Mise-à-jour %s échouée. Voir les journaux d'erreur."
 
-#: src/Content/Feature.php:84
-msgid "Ability to create multiple profiles"
-msgstr "Possibilité de créer plusieurs profils"
+#: src/Core/Update.php:225
+#, php-format
+msgid ""
+"\n"
+"\t\t\t\tThe friendica developers released update %s recently,\n"
+"\t\t\t\tbut when I tried to install it, something went terribly wrong.\n"
+"\t\t\t\tThis needs to be fixed soon and I can't do it alone. Please contact a\n"
+"\t\t\t\tfriendica developer if you can not help me on your own. My database might be invalid."
+msgstr ""
 
-#: src/Content/Feature.php:85
-msgid "Photo Location"
-msgstr "Lieu de prise de la photo"
+#: src/Core/Update.php:231
+#, php-format
+msgid ""
+"The error message is\n"
+"[pre]%s[/pre]"
+msgstr "Le message d’erreur est\n[pre]%s[/pre]"
 
-#: src/Content/Feature.php:85
+#: src/Core/Update.php:260
+#, php-format
 msgid ""
-"Photo metadata is normally stripped. This extracts the location (if present)"
-" prior to stripping metadata and links it to a map."
-msgstr "Les métadonnées des photos sont normalement retirées. Ceci permet de sauver l'emplacement (si présent) et de positionner la photo sur une carte."
+"\n"
+"\t\t\t\t\tThe friendica database was successfully updated from %s to %s."
+msgstr ""
 
-#: src/Content/Feature.php:86
-msgid "Export Public Calendar"
-msgstr "Exporter le Calendrier Public"
+#: src/Core/UserImport.php:103
+msgid "Error decoding account file"
+msgstr "Une erreur a été détecté en décodant un fichier utilisateur"
 
-#: src/Content/Feature.php:86
-msgid "Ability for visitors to download the public calendar"
-msgstr "Les visiteurs peuvent télécharger le calendrier public"
+#: src/Core/UserImport.php:109
+msgid "Error! No version data in file! This is not a Friendica account file?"
+msgstr "Erreur ! Pas de ficher de version existant ! Êtes vous sur un compte Friendica ?"
 
-#: src/Content/Feature.php:91
-msgid "Post Composition Features"
-msgstr "Caractéristiques de composition de publication"
+#: src/Core/UserImport.php:117
+#, php-format
+msgid "User '%s' already exists on this server!"
+msgstr "L'utilisateur '%s' existe déjà sur ce serveur!"
 
-#: src/Content/Feature.php:92
-msgid "Auto-mention Forums"
-msgstr "Mentionner automatiquement les Forums"
+#: src/Core/UserImport.php:153
+msgid "User creation error"
+msgstr "Erreur de création d'utilisateur"
 
-#: src/Content/Feature.php:92
-msgid ""
-"Add/remove mention when a forum page is selected/deselected in ACL window."
-msgstr "Ajoute/retire une mention quand une page forum est sélectionnée/désélectionnée lors du choix des destinataires d'une publication."
+#: src/Core/UserImport.php:171
+msgid "User profile creation error"
+msgstr "Erreur de création du profil utilisateur"
 
-#: src/Content/Feature.php:93
-msgid "Explicit Mentions"
+#: src/Core/UserImport.php:215
+#, php-format
+msgid "%d contact not imported"
+msgid_plural "%d contacts not imported"
+msgstr[0] "%d contacts non importés"
+msgstr[1] "%d contacts non importés"
+
+#: src/Core/UserImport.php:280
+msgid "Done. You can now login with your username and password"
+msgstr "Action réalisée. Vous pouvez désormais vous connecter avec votre nom d'utilisateur et votre mot de passe"
+
+#: src/Database/DBStructure.php:47
+msgid "There are no tables on MyISAM."
 msgstr ""
 
-#: src/Content/Feature.php:93
+#: src/Database/DBStructure.php:71
+#, php-format
 msgid ""
-"Add explicit mentions to comment box for manual control over who gets "
-"mentioned in replies."
+"\n"
+"Error %d occurred during database update:\n"
+"%s\n"
+msgstr "\nErreur %d survenue durant la mise à jour de la base de données :\n%s\n"
+
+#: src/Database/DBStructure.php:74
+msgid "Errors encountered performing database changes: "
 msgstr ""
 
-#: src/Content/Feature.php:98
-msgid "Network Sidebar"
+#: src/Database/DBStructure.php:263
+#, php-format
+msgid "%s: Database update"
 msgstr ""
 
-#: src/Content/Feature.php:99
-msgid "Ability to select posts by date ranges"
-msgstr "Capacité de sélectionner les publications par intervalles de dates"
+#: src/Database/DBStructure.php:524
+#, php-format
+msgid "%s: updating %s table."
+msgstr ""
 
-#: src/Content/Feature.php:100
-msgid "Protocol Filter"
+#: src/LegacyModule.php:30
+#, php-format
+msgid "Legacy module file not found: %s"
 msgstr ""
 
-#: src/Content/Feature.php:100
-msgid "Enable widget to display Network posts only from selected protocols"
+#: src/Model/Contact.php:1054
+msgid "Drop Contact"
+msgstr "Supprimer le contact"
+
+#: src/Model/Contact.php:1526
+msgid "Organisation"
 msgstr ""
 
-#: src/Content/Feature.php:105
-msgid "Network Tabs"
-msgstr "Onglets Réseau"
+#: src/Model/Contact.php:1530
+msgid "News"
+msgstr "Nouvelles"
 
-#: src/Content/Feature.php:106
-msgid "Network New Tab"
-msgstr "Nouvel onglet réseaux"
+#: src/Model/Contact.php:1534
+msgid "Forum"
+msgstr "Forum"
 
-#: src/Content/Feature.php:106
-msgid "Enable tab to display only new Network posts (from the last 12 hours)"
-msgstr "Activer l'onglet pour afficher seulement les publications du réseau (dans les 12 dernières heures)"
+#: src/Model/Contact.php:1724
+msgid "Connect URL missing."
+msgstr "URL de connexion manquante."
 
-#: src/Content/Feature.php:107
-msgid "Network Shared Links Tab"
-msgstr "Onglet réseau partagé"
+#: src/Model/Contact.php:1733
+msgid ""
+"The contact could not be added. Please check the relevant network "
+"credentials in your Settings -> Social Networks page."
+msgstr ""
 
-#: src/Content/Feature.php:107
-msgid "Enable tab to display only Network posts with links in them"
-msgstr "Activer l'onglet pour afficher seulement les publications du réseau contenant des liens"
+#: src/Model/Contact.php:1772
+msgid ""
+"This site is not configured to allow communications with other networks."
+msgstr "Ce site n'est pas configuré pour dialoguer avec d'autres réseaux."
 
-#: src/Content/Feature.php:112
-msgid "Post/Comment Tools"
-msgstr "Outils de publication/commentaire"
+#: src/Model/Contact.php:1773 src/Model/Contact.php:1786
+msgid "No compatible communication protocols or feeds were discovered."
+msgstr "Aucun protocole de communication ni aucun flux n'a pu être découvert."
 
-#: src/Content/Feature.php:113
-msgid "Post Categories"
-msgstr "Catégories des publications"
+#: src/Model/Contact.php:1784
+msgid "The profile address specified does not provide adequate information."
+msgstr "L'adresse de profil indiquée ne fournit par les informations adéquates."
 
-#: src/Content/Feature.php:113
-msgid "Add categories to your posts"
-msgstr "Ajouter des catégories à vos publications"
+#: src/Model/Contact.php:1789
+msgid "An author or name was not found."
+msgstr "Aucun auteur ou nom d'auteur n'a pu être trouvé."
 
-#: src/Content/Feature.php:118
-msgid "Advanced Profile Settings"
-msgstr "Paramètres Avancés du Profil"
+#: src/Model/Contact.php:1792
+msgid "No browser URL could be matched to this address."
+msgstr "Aucune URL de navigation ne correspond à cette adresse."
 
-#: src/Content/Feature.php:119
-msgid "List Forums"
-msgstr "Liste des forums"
-
-#: src/Content/Feature.php:119
-msgid "Show visitors public community forums at the Advanced Profile Page"
-msgstr "Montrer les forums communautaires aux visiteurs sur la Page de profil avancé"
-
-#: src/Content/Feature.php:120
-msgid "Tag Cloud"
-msgstr ""
+#: src/Model/Contact.php:1795
+msgid ""
+"Unable to match @-style Identity Address with a known protocol or email "
+"contact."
+msgstr "Impossible de faire correspondre l'adresse d'identité en \"@\" avec un protocole connu ou un contact courriel."
 
-#: src/Content/Feature.php:120
-msgid "Provide a personal tag cloud on your profile page"
-msgstr ""
+#: src/Model/Contact.php:1796
+msgid "Use mailto: in front of address to force email check."
+msgstr "Utilisez mailto: en face d'une adresse pour l'obliger à être reconnue comme courriel."
 
-#: src/Content/Feature.php:121
-msgid "Display Membership Date"
-msgstr ""
+#: src/Model/Contact.php:1802
+msgid ""
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
+msgstr "L'adresse de profil spécifiée correspond à un réseau qui a été désactivé sur ce site."
 
-#: src/Content/Feature.php:121
-msgid "Display membership date in profile"
-msgstr ""
+#: src/Model/Contact.php:1807
+msgid ""
+"Limited profile. This person will be unable to receive direct/personal "
+"notifications from you."
+msgstr "Profil limité. Cette personne ne sera pas capable de recevoir des notifications directes/personnelles de votre part."
 
-#: src/Content/Nav.php:74
-msgid "Nothing new here"
-msgstr "Rien de neuf ici"
+#: src/Model/Contact.php:1860
+msgid "Unable to retrieve contact information."
+msgstr "Impossible de récupérer les informations du contact."
 
-#: src/Content/Nav.php:78
-msgid "Clear notifications"
-msgstr "Effacer les notifications"
+#: src/Model/Event.php:61 src/Model/Event.php:78 src/Model/Event.php:435
+#: src/Model/Event.php:915
+msgid "Starts:"
+msgstr "Débute :"
 
-#: src/Content/Nav.php:161
-msgid "Personal notes"
-msgstr "Notes personnelles"
+#: src/Model/Event.php:64 src/Model/Event.php:84 src/Model/Event.php:436
+#: src/Model/Event.php:919
+msgid "Finishes:"
+msgstr "Finit :"
 
-#: src/Content/Nav.php:161
-msgid "Your personal notes"
-msgstr "Vos notes personnelles"
+#: src/Model/Event.php:385
+msgid "all-day"
+msgstr "toute la journée"
 
-#: src/Content/Nav.php:170
-msgid "Sign in"
-msgstr "Se connecter"
+#: src/Model/Event.php:408
+msgid "Jun"
+msgstr "Jun"
 
-#: src/Content/Nav.php:180
-msgid "Home Page"
-msgstr "Page d'accueil"
+#: src/Model/Event.php:411
+msgid "Sept"
+msgstr "Sep"
 
-#: src/Content/Nav.php:184 src/Module/Login.php:293
-#: src/Module/Register.php:136
-msgid "Register"
-msgstr "S'inscrire"
+#: src/Model/Event.php:433
+msgid "No events to display"
+msgstr "Pas d'événement à afficher"
 
-#: src/Content/Nav.php:184
-msgid "Create an account"
-msgstr "Créer un compte"
+#: src/Model/Event.php:561
+msgid "l, F j"
+msgstr "l, F j"
 
-#: src/Content/Nav.php:190
-msgid "Help and documentation"
-msgstr "Aide et documentation"
+#: src/Model/Event.php:592
+msgid "Edit event"
+msgstr "Editer l'événement"
 
-#: src/Content/Nav.php:194
-msgid "Apps"
-msgstr "Applications"
+#: src/Model/Event.php:593
+msgid "Duplicate event"
+msgstr "Dupliquer l'événement"
 
-#: src/Content/Nav.php:194
-msgid "Addon applications, utilities, games"
-msgstr "Applications supplémentaires, utilitaires, jeux"
+#: src/Model/Event.php:594
+msgid "Delete event"
+msgstr "Supprimer l'événement"
 
-#: src/Content/Nav.php:198
-msgid "Search site content"
-msgstr "Rechercher dans le contenu du site"
+#: src/Model/Event.php:626 src/Model/Item.php:3554 src/Model/Item.php:3561
+msgid "link to source"
+msgstr "lien original"
 
-#: src/Content/Nav.php:222
-msgid "Community"
-msgstr "Communauté"
+#: src/Model/Event.php:848
+msgid "D g:i A"
+msgstr ""
 
-#: src/Content/Nav.php:222
-msgid "Conversations on this and other servers"
+#: src/Model/Event.php:849
+msgid "g:i A"
 msgstr ""
 
-#: src/Content/Nav.php:229
-msgid "Directory"
-msgstr "Annuaire"
+#: src/Model/Event.php:934 src/Model/Event.php:936
+msgid "Show map"
+msgstr "Montrer la carte"
 
-#: src/Content/Nav.php:229
-msgid "People directory"
-msgstr "Annuaire des utilisateurs"
+#: src/Model/Event.php:935
+msgid "Hide map"
+msgstr "Cacher la carte"
 
-#: src/Content/Nav.php:231
-msgid "Information about this friendica instance"
-msgstr "Information au sujet de cette instance de friendica"
+#: src/Model/Event.php:1027
+#, php-format
+msgid "%s's birthday"
+msgstr "Anniversaire de %s's"
 
-#: src/Content/Nav.php:234
-msgid "Terms of Service of this Friendica instance"
-msgstr ""
+#: src/Model/Event.php:1028
+#, php-format
+msgid "Happy Birthday %s"
+msgstr "Joyeux anniversaire, %s !"
 
-#: src/Content/Nav.php:240
-msgid "Network Reset"
-msgstr "Réinitialiser le réseau"
+#: src/Model/FileTag.php:256
+msgid "Item filed"
+msgstr "Élément classé"
 
-#: src/Content/Nav.php:240
-msgid "Load Network page with no filters"
-msgstr "Chargement des pages du réseau sans filtre"
+#: src/Model/Group.php:43
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Un groupe supprimé a été recréé. Les permissions existantes <strong>pourraient</strong> s'appliquer à ce groupe et aux futurs membres. Si ce n'est pas le comportement attendu, merci de re-créer un autre groupe sous un autre nom."
 
-#: src/Content/Nav.php:246
-msgid "Friend Requests"
-msgstr "Demande d'amitié"
+#: src/Model/Group.php:338
+msgid "Default privacy group for new contacts"
+msgstr "Paramètres de confidentialité par défaut pour les nouveaux contacts"
 
-#: src/Content/Nav.php:248
-msgid "See all notifications"
-msgstr "Voir toutes les notifications"
+#: src/Model/Group.php:370
+msgid "Everybody"
+msgstr "Tout le monde"
 
-#: src/Content/Nav.php:249
-msgid "Mark all system notifications seen"
-msgstr "Marquer toutes les notifications système comme 'vues'"
+#: src/Model/Group.php:390
+msgid "edit"
+msgstr "éditer"
 
-#: src/Content/Nav.php:253
-msgid "Inbox"
-msgstr "Messages entrants"
+#: src/Model/Group.php:419
+msgid "Edit group"
+msgstr "Editer groupe"
 
-#: src/Content/Nav.php:254
-msgid "Outbox"
-msgstr "Messages sortants"
+#: src/Model/Group.php:422
+msgid "Create a new group"
+msgstr "Créer un nouveau groupe"
 
-#: src/Content/Nav.php:258
-msgid "Manage"
-msgstr "Gérer"
+#: src/Model/Group.php:424
+msgid "Edit groups"
+msgstr "Modifier les groupes"
 
-#: src/Content/Nav.php:258
-msgid "Manage other pages"
-msgstr "Gérer les autres pages"
+#: src/Model/Item.php:3287
+msgid "activity"
+msgstr "activité"
 
-#: src/Content/Nav.php:266
-msgid "Manage/Edit Profiles"
-msgstr "Gérer/Éditer les profiles"
+#: src/Model/Item.php:3289 src/Object/Post.php:470
+msgid "comment"
+msgid_plural "comments"
+msgstr[0] ""
+msgstr[1] "commentaire"
 
-#: src/Content/Nav.php:274
-msgid "Site setup and configuration"
-msgstr "Démarrage et configuration du site"
+#: src/Model/Item.php:3292
+msgid "post"
+msgstr "publication"
 
-#: src/Content/Nav.php:277
-msgid "Navigation"
-msgstr "Navigation"
+#: src/Model/Item.php:3391
+#, php-format
+msgid "Content warning: %s"
+msgstr "Avertissement de contenu: %s"
 
-#: src/Content/Nav.php:277
-msgid "Site map"
-msgstr "Carte du site"
+#: src/Model/Item.php:3470
+msgid "bytes"
+msgstr "octets"
 
-#: src/Content/OEmbed.php:256
-msgid "Embedding disabled"
-msgstr "Incorporation désactivée"
+#: src/Model/Item.php:3548
+msgid "View on separate page"
+msgstr "Voir dans une nouvelle page"
 
-#: src/Content/OEmbed.php:379
-msgid "Embedded content"
-msgstr "Contenu incorporé"
+#: src/Model/Item.php:3549
+msgid "view on separate page"
+msgstr "voir dans une nouvelle page"
 
-#: src/Content/Pager.php:153
-msgid "newer"
-msgstr "Plus récent"
+#: src/Model/Mail.php:40 src/Model/Mail.php:175
+msgid "[no subject]"
+msgstr "[pas de sujet]"
 
-#: src/Content/Pager.php:158
-msgid "older"
-msgstr "Plus ancien"
+#: src/Model/Profile.php:115
+msgid "Requested account is not available."
+msgstr "Le compte demandé n'est pas disponible."
 
-#: src/Content/Pager.php:203
-msgid "prev"
-msgstr "précédent"
+#: src/Model/Profile.php:133
+msgid "Requested profile is not available."
+msgstr "Le profil demandé n'est pas disponible."
 
-#: src/Content/Pager.php:263
-msgid "last"
-msgstr "dernier"
+#: src/Model/Profile.php:181 src/Model/Profile.php:425
+#: src/Model/Profile.php:872
+msgid "Edit profile"
+msgstr "Editer le profil"
 
-#: src/Content/Widget.php:35
-msgid "Add New Contact"
-msgstr "Ajouter un nouveau contact"
+#: src/Model/Profile.php:359
+msgid "Atom feed"
+msgstr "Flux Atom"
 
-#: src/Content/Widget.php:36
-msgid "Enter address or web location"
-msgstr "Entrez son adresse ou sa localisation web"
+#: src/Model/Profile.php:398
+msgid "Manage/edit profiles"
+msgstr "Gérer/éditer les profils"
 
-#: src/Content/Widget.php:37
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Exemple : bob@example.com, http://example.com/barbara"
+#: src/Model/Profile.php:450 src/Module/Contact.php:645
+msgid "XMPP:"
+msgstr "XMPP"
 
-#: src/Content/Widget.php:55
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d invitation disponible"
-msgstr[1] "%d invitations disponibles"
+#: src/Model/Profile.php:573 src/Model/Profile.php:671
+msgid "g A l F d"
+msgstr "g A | F d"
 
-#: src/Content/Widget.php:158
-msgid "Protocols"
-msgstr ""
+#: src/Model/Profile.php:574
+msgid "F d"
+msgstr "F d"
 
-#: src/Content/Widget.php:161
-msgid "All Protocols"
-msgstr ""
+#: src/Model/Profile.php:636 src/Model/Profile.php:722
+msgid "[today]"
+msgstr "[aujourd'hui]"
 
-#: src/Content/Widget.php:198
-msgid "Saved Folders"
-msgstr "Dossiers sauvegardés"
+#: src/Model/Profile.php:647
+msgid "Birthday Reminders"
+msgstr "Rappels d'anniversaires"
 
-#: src/Content/Widget.php:201 src/Content/Widget.php:243
-msgid "Everything"
-msgstr "Tout"
+#: src/Model/Profile.php:648
+msgid "Birthdays this week:"
+msgstr "Anniversaires cette semaine :"
 
-#: src/Content/Widget.php:240
-msgid "Categories"
-msgstr "Catégories"
+#: src/Model/Profile.php:709
+msgid "[No description]"
+msgstr "[Sans description]"
 
-#: src/Content/Widget.php:324
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d contact en commun"
-msgstr[1] "%d contacts en commun"
+#: src/Model/Profile.php:736
+msgid "Event Reminders"
+msgstr "Rappels d'événements"
 
-#: src/Database/DBStructure.php:47
-msgid "There are no tables on MyISAM."
+#: src/Model/Profile.php:737
+msgid "Upcoming events the next 7 days:"
 msgstr ""
 
-#: src/Database/DBStructure.php:71
-#, php-format
-msgid ""
-"\n"
-"Error %d occurred during database update:\n"
-"%s\n"
-msgstr "\nErreur %d survenue durant la mise à jour de la base de données :\n%s\n"
-
-#: src/Database/DBStructure.php:74
-msgid "Errors encountered performing database changes: "
+#: src/Model/Profile.php:754
+msgid "Member since:"
 msgstr ""
 
-#: src/Database/DBStructure.php:263
-#, php-format
-msgid "%s: Database update"
-msgstr ""
+#: src/Model/Profile.php:762
+msgid "j F, Y"
+msgstr "j F, Y"
 
-#: src/Database/DBStructure.php:524
-#, php-format
-msgid "%s: updating %s table."
-msgstr ""
+#: src/Model/Profile.php:763
+msgid "j F"
+msgstr "j F"
 
-#: src/Model/Contact.php:1037
-msgid "Drop Contact"
-msgstr "Supprimer le contact"
+#: src/Model/Profile.php:771 src/Util/Temporal.php:147
+msgid "Birthday:"
+msgstr "Anniversaire :"
 
-#: src/Model/Contact.php:1509
-msgid "Organisation"
-msgstr ""
+#: src/Model/Profile.php:778
+msgid "Age:"
+msgstr "Age :"
 
-#: src/Model/Contact.php:1513
-msgid "News"
-msgstr "Nouvelles"
+#: src/Model/Profile.php:791
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "depuis %1$d %2$s"
 
-#: src/Model/Contact.php:1517
-msgid "Forum"
-msgstr "Forum"
+#: src/Model/Profile.php:815
+msgid "Religion:"
+msgstr "Religion :"
 
-#: src/Model/Contact.php:1707
-msgid "Connect URL missing."
-msgstr "URL de connexion manquante."
+#: src/Model/Profile.php:823
+msgid "Hobbies/Interests:"
+msgstr "Passe-temps/Centres d'intérêt :"
 
-#: src/Model/Contact.php:1716
-msgid ""
-"The contact could not be added. Please check the relevant network "
-"credentials in your Settings -> Social Networks page."
-msgstr ""
+#: src/Model/Profile.php:835
+msgid "Contact information and Social Networks:"
+msgstr "Coordonnées/Réseaux sociaux :"
 
-#: src/Model/Contact.php:1755
-msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Ce site n'est pas configuré pour dialoguer avec d'autres réseaux."
+#: src/Model/Profile.php:839
+msgid "Musical interests:"
+msgstr "Goûts musicaux :"
 
-#: src/Model/Contact.php:1756 src/Model/Contact.php:1769
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Aucun protocole de communication ni aucun flux n'a pu être découvert."
+#: src/Model/Profile.php:843
+msgid "Books, literature:"
+msgstr "Lectures :"
 
-#: src/Model/Contact.php:1767
-msgid "The profile address specified does not provide adequate information."
-msgstr "L'adresse de profil indiquée ne fournit par les informations adéquates."
+#: src/Model/Profile.php:847
+msgid "Television:"
+msgstr "Télévision :"
 
-#: src/Model/Contact.php:1772
-msgid "An author or name was not found."
-msgstr "Aucun auteur ou nom d'auteur n'a pu être trouvé."
+#: src/Model/Profile.php:851
+msgid "Film/dance/culture/entertainment:"
+msgstr "Cinéma/Danse/Culture/Divertissement :"
 
-#: src/Model/Contact.php:1775
-msgid "No browser URL could be matched to this address."
-msgstr "Aucune URL de navigation ne correspond à cette adresse."
+#: src/Model/Profile.php:855
+msgid "Love/Romance:"
+msgstr "Amour/Romance :"
 
-#: src/Model/Contact.php:1778
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
-msgstr "Impossible de faire correspondre l'adresse d'identité en \"@\" avec un protocole connu ou un contact courriel."
+#: src/Model/Profile.php:859
+msgid "Work/employment:"
+msgstr "Activité professionnelle/Occupation :"
 
-#: src/Model/Contact.php:1779
-msgid "Use mailto: in front of address to force email check."
-msgstr "Utilisez mailto: en face d'une adresse pour l'obliger à être reconnue comme courriel."
+#: src/Model/Profile.php:863
+msgid "School/education:"
+msgstr "Études/Formation :"
 
-#: src/Model/Contact.php:1785
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "L'adresse de profil spécifiée correspond à un réseau qui a été désactivé sur ce site."
+#: src/Model/Profile.php:868
+msgid "Forums:"
+msgstr "Forums :"
 
-#: src/Model/Contact.php:1790
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Profil limité. Cette personne ne sera pas capable de recevoir des notifications directes/personnelles de votre part."
+#: src/Model/Profile.php:912 src/Module/Contact.php:872
+msgid "Profile Details"
+msgstr "Détails du profil"
 
-#: src/Model/Contact.php:1843
-msgid "Unable to retrieve contact information."
-msgstr "Impossible de récupérer les informations du contact."
+#: src/Model/Profile.php:962
+msgid "Only You Can See This"
+msgstr "Vous seul pouvez voir ça"
 
-#: src/Model/Event.php:61 src/Model/Event.php:78 src/Model/Event.php:436
-#: src/Model/Event.php:916
-msgid "Starts:"
-msgstr "Débute :"
+#: src/Model/Profile.php:970 src/Model/Profile.php:973
+msgid "Tips for New Members"
+msgstr "Conseils aux nouveaux venus"
 
-#: src/Model/Event.php:64 src/Model/Event.php:84 src/Model/Event.php:437
-#: src/Model/Event.php:920
-msgid "Finishes:"
-msgstr "Finit :"
+#: src/Model/Profile.php:1150
+#, php-format
+msgid "OpenWebAuth: %1$s welcomes %2$s"
+msgstr ""
 
-#: src/Model/Event.php:386
-msgid "all-day"
-msgstr "toute la journée"
+#: src/Model/Storage/Database.php:36
+#, php-format
+msgid "Database storage failed to update %s"
+msgstr ""
 
-#: src/Model/Event.php:409
-msgid "Jun"
-msgstr "Jun"
+#: src/Model/Storage/Database.php:43
+msgid "Database storage failed to insert data"
+msgstr ""
 
-#: src/Model/Event.php:412
-msgid "Sept"
-msgstr "Sep"
+#: src/Model/Storage/Filesystem.php:63
+#, php-format
+msgid "Filesystem storage failed to create \"%s\". Check you write permissions."
+msgstr ""
 
-#: src/Model/Event.php:434
-msgid "No events to display"
-msgstr "Pas d'événement à afficher"
+#: src/Model/Storage/Filesystem.php:105
+#, php-format
+msgid ""
+"Filesystem storage failed to save data to \"%s\". Check your write "
+"permissions"
+msgstr ""
 
-#: src/Model/Event.php:562
-msgid "l, F j"
-msgstr "l, F j"
+#: src/Model/Storage/Filesystem.php:126
+msgid "Storage base path"
+msgstr ""
 
-#: src/Model/Event.php:593
-msgid "Edit event"
-msgstr "Editer l'événement"
+#: src/Model/Storage/Filesystem.php:128
+msgid ""
+"Folder where uploaded files are saved. For maximum security, This should be "
+"a path outside web server folder tree"
+msgstr ""
 
-#: src/Model/Event.php:594
-msgid "Duplicate event"
-msgstr "Dupliquer l'événement"
+#: src/Model/Storage/Filesystem.php:138
+msgid "Enter a valid existing folder"
+msgstr ""
 
-#: src/Model/Event.php:595
-msgid "Delete event"
-msgstr "Supprimer l'événement"
+#: src/Model/User.php:271
+msgid "Login failed"
+msgstr ""
 
-#: src/Model/Event.php:627 src/Model/Item.php:3536 src/Model/Item.php:3543
-msgid "link to source"
-msgstr "lien original"
+#: src/Model/User.php:302
+msgid "Not enough information to authenticate"
+msgstr ""
 
-#: src/Model/Event.php:849
-msgid "D g:i A"
+#: src/Model/User.php:380
+msgid "Password can't be empty"
 msgstr ""
 
-#: src/Model/Event.php:850
-msgid "g:i A"
+#: src/Model/User.php:399
+msgid "Empty passwords are not allowed."
 msgstr ""
 
-#: src/Model/Event.php:935 src/Model/Event.php:937
-msgid "Show map"
-msgstr "Montrer la carte"
+#: src/Model/User.php:403
+msgid ""
+"The new password has been exposed in a public data dump, please choose "
+"another."
+msgstr ""
 
-#: src/Model/Event.php:936
-msgid "Hide map"
-msgstr "Cacher la carte"
+#: src/Model/User.php:409
+msgid ""
+"The password can't contain accentuated letters, white spaces or colons (:)"
+msgstr ""
 
-#: src/Model/Event.php:1028
-#, php-format
-msgid "%s's birthday"
-msgstr "Anniversaire de %s's"
-
-#: src/Model/Event.php:1029
-#, php-format
-msgid "Happy Birthday %s"
-msgstr "Joyeux anniversaire, %s !"
-
-#: src/Model/FileTag.php:256
-msgid "Item filed"
-msgstr "Élément classé"
-
-#: src/Model/Group.php:43
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Un groupe supprimé a été recréé. Les permissions existantes <strong>pourraient</strong> s'appliquer à ce groupe et aux futurs membres. Si ce n'est pas le comportement attendu, merci de re-créer un autre groupe sous un autre nom."
+#: src/Model/User.php:509
+msgid "Passwords do not match. Password unchanged."
+msgstr "Les mots de passe ne correspondent pas. Aucun changement appliqué."
 
-#: src/Model/Group.php:338
-msgid "Default privacy group for new contacts"
-msgstr "Paramètres de confidentialité par défaut pour les nouveaux contacts"
+#: src/Model/User.php:516
+msgid "An invitation is required."
+msgstr "Une invitation est requise."
 
-#: src/Model/Group.php:370
-msgid "Everybody"
-msgstr "Tout le monde"
+#: src/Model/User.php:520
+msgid "Invitation could not be verified."
+msgstr "L'invitation fournie n'a pu être validée."
 
-#: src/Model/Group.php:390
-msgid "edit"
-msgstr "éditer"
+#: src/Model/User.php:527
+msgid "Invalid OpenID url"
+msgstr "Adresse OpenID invalide"
 
-#: src/Model/Group.php:419
-msgid "Edit group"
-msgstr "Editer groupe"
+#: src/Model/User.php:540 src/Module/Login.php:106
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Nous avons eu un souci avec l'OpenID que vous avez fourni. Merci de vérifier qu'il est correctement écrit."
 
-#: src/Model/Group.php:422
-msgid "Create a new group"
-msgstr "Créer un nouveau groupe"
+#: src/Model/User.php:540 src/Module/Login.php:106
+msgid "The error message was:"
+msgstr "Le message d'erreur était :"
 
-#: src/Model/Group.php:424
-msgid "Edit groups"
-msgstr "Modifier les groupes"
+#: src/Model/User.php:546
+msgid "Please enter the required information."
+msgstr "Entrez les informations requises."
 
-#: src/Model/Item.php:3269
-msgid "activity"
-msgstr "activité"
+#: src/Model/User.php:560
+#, php-format
+msgid ""
+"system.username_min_length (%s) and system.username_max_length (%s) are "
+"excluding each other, swapping values."
+msgstr ""
 
-#: src/Model/Item.php:3271 src/Object/Post.php:457 src/Object/Post.php:469
-msgid "comment"
-msgid_plural "comments"
+#: src/Model/User.php:567
+#, php-format
+msgid "Username should be at least %s character."
+msgid_plural "Username should be at least %s characters."
 msgstr[0] ""
-msgstr[1] "commentaire"
-
-#: src/Model/Item.php:3274
-msgid "post"
-msgstr "publication"
+msgstr[1] ""
 
-#: src/Model/Item.php:3373
+#: src/Model/User.php:571
 #, php-format
-msgid "Content warning: %s"
-msgstr "Avertissement de contenu: %s"
-
-#: src/Model/Item.php:3452
-msgid "bytes"
-msgstr "octets"
-
-#: src/Model/Item.php:3530
-msgid "View on separate page"
-msgstr "Voir dans une nouvelle page"
-
-#: src/Model/Item.php:3531
-msgid "view on separate page"
-msgstr "voir dans une nouvelle page"
-
-#: src/Model/Mail.php:40 src/Model/Mail.php:175
-msgid "[no subject]"
-msgstr "[pas de sujet]"
+msgid "Username should be at most %s character."
+msgid_plural "Username should be at most %s characters."
+msgstr[0] ""
+msgstr[1] ""
 
-#: src/Model/Profile.php:115
-msgid "Requested account is not available."
-msgstr "Le compte demandé n'est pas disponible."
+#: src/Model/User.php:579
+msgid "That doesn't appear to be your full (First Last) name."
+msgstr "Ceci ne semble pas être votre nom complet (Prénom Nom)."
 
-#: src/Model/Profile.php:133
-msgid "Requested profile is not available."
-msgstr "Le profil demandé n'est pas disponible."
+#: src/Model/User.php:584
+msgid "Your email domain is not among those allowed on this site."
+msgstr "Votre domaine de courriel n'est pas autorisé sur ce site."
 
-#: src/Model/Profile.php:181 src/Model/Profile.php:425
-#: src/Model/Profile.php:872
-msgid "Edit profile"
-msgstr "Editer le profil"
+#: src/Model/User.php:588
+msgid "Not a valid email address."
+msgstr "Ceci n'est pas une adresse courriel valide."
 
-#: src/Model/Profile.php:359
-msgid "Atom feed"
-msgstr "Flux Atom"
+#: src/Model/User.php:591
+msgid "The nickname was blocked from registration by the nodes admin."
+msgstr ""
 
-#: src/Model/Profile.php:398
-msgid "Manage/edit profiles"
-msgstr "Gérer/éditer les profils"
+#: src/Model/User.php:595 src/Model/User.php:603
+msgid "Cannot use that email."
+msgstr "Impossible d'utiliser ce courriel."
 
-#: src/Model/Profile.php:450 src/Module/Contact.php:645
-msgid "XMPP:"
-msgstr "XMPP"
+#: src/Model/User.php:610
+msgid "Your nickname can only contain a-z, 0-9 and _."
+msgstr ""
 
-#: src/Model/Profile.php:573 src/Model/Profile.php:671
-msgid "g A l F d"
-msgstr "g A | F d"
+#: src/Model/User.php:617 src/Model/User.php:674
+msgid "Nickname is already registered. Please choose another."
+msgstr "Pseudo déjà utilisé. Merci d'en choisir un autre."
 
-#: src/Model/Profile.php:574
-msgid "F d"
-msgstr "F d"
+#: src/Model/User.php:627
+msgid "SERIOUS ERROR: Generation of security keys failed."
+msgstr "ERREUR FATALE : La génération des clés de sécurité a échoué."
 
-#: src/Model/Profile.php:636 src/Model/Profile.php:722
-msgid "[today]"
-msgstr "[aujourd'hui]"
+#: src/Model/User.php:661 src/Model/User.php:665
+msgid "An error occurred during registration. Please try again."
+msgstr "Une erreur est survenue lors de l'inscription. Merci de recommencer."
 
-#: src/Model/Profile.php:647
-msgid "Birthday Reminders"
-msgstr "Rappels d'anniversaires"
+#: src/Model/User.php:685 view/theme/duepuntozero/config.php:55
+msgid "default"
+msgstr "défaut"
 
-#: src/Model/Profile.php:648
-msgid "Birthdays this week:"
-msgstr "Anniversaires cette semaine :"
+#: src/Model/User.php:690
+msgid "An error occurred creating your default profile. Please try again."
+msgstr "Une erreur est survenue lors de la création de votre profil par défaut. Merci de recommencer."
 
-#: src/Model/Profile.php:709
-msgid "[No description]"
-msgstr "[Sans description]"
+#: src/Model/User.php:697
+msgid "An error occurred creating your self contact. Please try again."
+msgstr ""
 
-#: src/Model/Profile.php:736
-msgid "Event Reminders"
-msgstr "Rappels d'événements"
+#: src/Model/User.php:706
+msgid ""
+"An error occurred creating your default contact group. Please try again."
+msgstr ""
 
-#: src/Model/Profile.php:737
-msgid "Upcoming events the next 7 days:"
+#: src/Model/User.php:782
+#, php-format
+msgid ""
+"\n"
+"\t\t\tDear %1$s,\n"
+"\t\t\t\tThank you for registering at %2$s. Your account is pending for approval by the administrator.\n"
+"\n"
+"\t\t\tYour login details are as follows:\n"
+"\n"
+"\t\t\tSite Location:\t%3$s\n"
+"\t\t\tLogin Name:\t\t%4$s\n"
+"\t\t\tPassword:\t\t%5$s\n"
+"\t\t"
 msgstr ""
 
-#: src/Model/Profile.php:754
-msgid "Member since:"
+#: src/Model/User.php:799
+#, php-format
+msgid "Registration at %s"
 msgstr ""
 
-#: src/Model/Profile.php:762
-msgid "j F, Y"
-msgstr "j F, Y"
+#: src/Model/User.php:818
+#, php-format
+msgid ""
+"\n"
+"\t\t\tDear %1$s,\n"
+"\t\t\t\tThank you for registering at %2$s. Your account has been created.\n"
+"\t\t"
+msgstr ""
 
-#: src/Model/Profile.php:763
-msgid "j F"
-msgstr "j F"
+#: src/Model/User.php:824
+#, php-format
+msgid ""
+"\n"
+"\t\t\tThe login details are as follows:\n"
+"\n"
+"\t\t\tSite Location:\t%3$s\n"
+"\t\t\tLogin Name:\t\t%1$s\n"
+"\t\t\tPassword:\t\t%5$s\n"
+"\n"
+"\t\t\tYou may change your password from your account \"Settings\" page after logging\n"
+"\t\t\tin.\n"
+"\n"
+"\t\t\tPlease take a few moments to review the other account settings on that page.\n"
+"\n"
+"\t\t\tYou may also wish to add some basic information to your default profile\n"
+"\t\t\t(on the \"Profiles\" page) so that other people can easily find you.\n"
+"\n"
+"\t\t\tWe recommend setting your full name, adding a profile photo,\n"
+"\t\t\tadding some profile \"keywords\" (very useful in making new friends) - and\n"
+"\t\t\tperhaps what country you live in; if you do not wish to be more specific\n"
+"\t\t\tthan that.\n"
+"\n"
+"\t\t\tWe fully respect your right to privacy, and none of these items are necessary.\n"
+"\t\t\tIf you are new and do not know anybody here, they may help\n"
+"\t\t\tyou to make some new and interesting friends.\n"
+"\n"
+"\t\t\tIf you ever want to delete your account, you can do so at %3$s/removeme\n"
+"\n"
+"\t\t\tThank you and welcome to %2$s."
+msgstr ""
 
-#: src/Model/Profile.php:778
-msgid "Age:"
-msgstr "Age :"
+#: src/Module/Attach.php:36 src/Module/Attach.php:48
+msgid "Item was not found."
+msgstr "Element introuvable."
 
-#: src/Model/Profile.php:791
+#: src/Module/Contact.php:166
 #, php-format
-msgid "for %1$d %2$s"
-msgstr "depuis %1$d %2$s"
-
-#: src/Model/Profile.php:815
-msgid "Religion:"
-msgstr "Religion :"
+msgid "%d contact edited."
+msgid_plural "%d contacts edited."
+msgstr[0] "%d contact mis à jour."
+msgstr[1] "%d contacts mis à jour."
 
-#: src/Model/Profile.php:823
-msgid "Hobbies/Interests:"
-msgstr "Passe-temps/Centres d'intérêt :"
+#: src/Module/Contact.php:191 src/Module/Contact.php:374
+msgid "Could not access contact record."
+msgstr "Impossible d'accéder à l'enregistrement du contact."
 
-#: src/Model/Profile.php:835
-msgid "Contact information and Social Networks:"
-msgstr "Coordonnées/Réseaux sociaux :"
+#: src/Module/Contact.php:201
+msgid "Could not locate selected profile."
+msgstr "Impossible de localiser le profil séléctionné."
 
-#: src/Model/Profile.php:839
-msgid "Musical interests:"
-msgstr "Goûts musicaux :"
+#: src/Module/Contact.php:233
+msgid "Contact updated."
+msgstr "Contact mis à jour."
 
-#: src/Model/Profile.php:843
-msgid "Books, literature:"
-msgstr "Lectures :"
+#: src/Module/Contact.php:395
+msgid "Contact has been blocked"
+msgstr "Le contact a été bloqué"
 
-#: src/Model/Profile.php:847
-msgid "Television:"
-msgstr "Télévision :"
-
-#: src/Model/Profile.php:851
-msgid "Film/dance/culture/entertainment:"
-msgstr "Cinéma/Danse/Culture/Divertissement :"
-
-#: src/Model/Profile.php:855
-msgid "Love/Romance:"
-msgstr "Amour/Romance :"
+#: src/Module/Contact.php:395
+msgid "Contact has been unblocked"
+msgstr "Le contact n'est plus bloqué"
 
-#: src/Model/Profile.php:859
-msgid "Work/employment:"
-msgstr "Activité professionnelle/Occupation :"
+#: src/Module/Contact.php:405
+msgid "Contact has been ignored"
+msgstr "Le contact a été ignoré"
 
-#: src/Model/Profile.php:863
-msgid "School/education:"
-msgstr "Études/Formation :"
+#: src/Module/Contact.php:405
+msgid "Contact has been unignored"
+msgstr "Le contact n'est plus ignoré"
 
-#: src/Model/Profile.php:868
-msgid "Forums:"
-msgstr "Forums :"
+#: src/Module/Contact.php:415
+msgid "Contact has been archived"
+msgstr "Contact archivé"
 
-#: src/Model/Profile.php:912 src/Module/Contact.php:872
-msgid "Profile Details"
-msgstr "Détails du profil"
+#: src/Module/Contact.php:415
+msgid "Contact has been unarchived"
+msgstr "Contact désarchivé"
 
-#: src/Model/Profile.php:962
-msgid "Only You Can See This"
-msgstr "Vous seul pouvez voir ça"
+#: src/Module/Contact.php:439
+msgid "Drop contact"
+msgstr "Supprimer contact"
 
-#: src/Model/Profile.php:970 src/Model/Profile.php:973
-msgid "Tips for New Members"
-msgstr "Conseils aux nouveaux venus"
+#: src/Module/Contact.php:442 src/Module/Contact.php:820
+msgid "Do you really want to delete this contact?"
+msgstr "Voulez-vous vraiment supprimer ce contact?"
 
-#: src/Model/Profile.php:1150
-#, php-format
-msgid "OpenWebAuth: %1$s welcomes %2$s"
-msgstr ""
+#: src/Module/Contact.php:456
+msgid "Contact has been removed."
+msgstr "Ce contact a été retiré."
 
-#: src/Model/Storage/Database.php:36
+#: src/Module/Contact.php:486
 #, php-format
-msgid "Database storage failed to update %s"
-msgstr ""
-
-#: src/Model/Storage/Database.php:43
-msgid "Database storage failed to insert data"
-msgstr ""
+msgid "You are mutual friends with %s"
+msgstr "Vous êtes ami (et réciproquement) avec %s"
 
-#: src/Model/Storage/Filesystem.php:63
+#: src/Module/Contact.php:491
 #, php-format
-msgid "Filesystem storage failed to create \"%s\". Check you write permissions."
-msgstr ""
+msgid "You are sharing with %s"
+msgstr "Vous partagez avec %s"
 
-#: src/Model/Storage/Filesystem.php:105
+#: src/Module/Contact.php:496
 #, php-format
-msgid ""
-"Filesystem storage failed to save data to \"%s\". Check your write "
-"permissions"
-msgstr ""
+msgid "%s is sharing with you"
+msgstr "%s partage avec vous"
 
-#: src/Model/Storage/Filesystem.php:126
-msgid "Storage base path"
-msgstr ""
+#: src/Module/Contact.php:520
+msgid "Private communications are not available for this contact."
+msgstr "Les communications privées ne sont pas disponibles pour ce contact."
 
-#: src/Model/Storage/Filesystem.php:128
-msgid ""
-"Folder where uploaded files are saved. For maximum security, This should be "
-"a path outside web server folder tree"
-msgstr ""
+#: src/Module/Contact.php:522
+msgid "Never"
+msgstr "Jamais"
 
-#: src/Model/Storage/Filesystem.php:138
-msgid "Enter a valid existing folder"
-msgstr ""
+#: src/Module/Contact.php:525
+msgid "(Update was successful)"
+msgstr "(Mise à jour effectuée avec succès)"
 
-#: src/Model/User.php:270
-msgid "Login failed"
-msgstr ""
+#: src/Module/Contact.php:525
+msgid "(Update was not successful)"
+msgstr "(Échec de la mise à jour)"
 
-#: src/Model/User.php:301
-msgid "Not enough information to authenticate"
-msgstr ""
+#: src/Module/Contact.php:527 src/Module/Contact.php:1058
+msgid "Suggest friends"
+msgstr "Suggérer amitié/contact"
 
-#: src/Model/User.php:379
-msgid "Password can't be empty"
-msgstr ""
+#: src/Module/Contact.php:531
+#, php-format
+msgid "Network type: %s"
+msgstr "Type de réseau %s"
 
-#: src/Model/User.php:398
-msgid "Empty passwords are not allowed."
-msgstr ""
+#: src/Module/Contact.php:536
+msgid "Communications lost with this contact!"
+msgstr "Communications perdues avec ce contact !"
 
-#: src/Model/User.php:402
-msgid ""
-"The new password has been exposed in a public data dump, please choose "
-"another."
-msgstr ""
+#: src/Module/Contact.php:542
+msgid "Fetch further information for feeds"
+msgstr "Chercher plus d'informations pour les flux"
 
-#: src/Model/User.php:408
+#: src/Module/Contact.php:544
 msgid ""
-"The password can't contain accentuated letters, white spaces or colons (:)"
+"Fetch information like preview pictures, title and teaser from the feed "
+"item. You can activate this if the feed doesn't contain much text. Keywords "
+"are taken from the meta header in the feed item and are posted as hash tags."
 msgstr ""
 
-#: src/Model/User.php:508
-msgid "Passwords do not match. Password unchanged."
-msgstr "Les mots de passe ne correspondent pas. Aucun changement appliqué."
+#: src/Module/Contact.php:547
+msgid "Fetch information"
+msgstr "Récupérer informations"
 
-#: src/Model/User.php:515
-msgid "An invitation is required."
-msgstr "Une invitation est requise."
+#: src/Module/Contact.php:548
+msgid "Fetch keywords"
+msgstr ""
 
-#: src/Model/User.php:519
-msgid "Invitation could not be verified."
-msgstr "L'invitation fournie n'a pu être validée."
+#: src/Module/Contact.php:549
+msgid "Fetch information and keywords"
+msgstr "Récupérer informations"
 
-#: src/Model/User.php:526
-msgid "Invalid OpenID url"
-msgstr "Adresse OpenID invalide"
+#: src/Module/Contact.php:581
+msgid "Profile Visibility"
+msgstr "Visibilité du profil"
 
-#: src/Model/User.php:539 src/Module/Login.php:106
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Nous avons eu un souci avec l'OpenID que vous avez fourni. Merci de vérifier qu'il est correctement écrit."
+#: src/Module/Contact.php:582
+msgid "Contact Information / Notes"
+msgstr "Informations de contact / Notes"
 
-#: src/Model/User.php:539 src/Module/Login.php:106
-msgid "The error message was:"
-msgstr "Le message d'erreur était :"
+#: src/Module/Contact.php:583
+msgid "Contact Settings"
+msgstr "Paramètres du Contact"
 
-#: src/Model/User.php:545
-msgid "Please enter the required information."
-msgstr "Entrez les informations requises."
+#: src/Module/Contact.php:592
+msgid "Contact"
+msgstr "Contact"
 
-#: src/Model/User.php:559
+#: src/Module/Contact.php:596
 #, php-format
 msgid ""
-"system.username_min_length (%s) and system.username_max_length (%s) are "
-"excluding each other, swapping values."
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Merci de choisir le profil que vous souhaitez montrer à %s lorsqu'il vous rend visite de manière sécurisée."
+
+#: src/Module/Contact.php:598
+msgid "Their personal note"
 msgstr ""
 
-#: src/Model/User.php:566
-#, php-format
-msgid "Username should be at least %s character."
-msgid_plural "Username should be at least %s characters."
-msgstr[0] ""
-msgstr[1] ""
+#: src/Module/Contact.php:600
+msgid "Edit contact notes"
+msgstr "Éditer les notes des contacts"
 
-#: src/Model/User.php:570
-#, php-format
-msgid "Username should be at most %s character."
-msgid_plural "Username should be at most %s characters."
-msgstr[0] ""
-msgstr[1] ""
+#: src/Module/Contact.php:604
+msgid "Block/Unblock contact"
+msgstr "Bloquer/débloquer ce contact"
 
-#: src/Model/User.php:578
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Ceci ne semble pas être votre nom complet (Prénom Nom)."
+#: src/Module/Contact.php:605
+msgid "Ignore contact"
+msgstr "Ignorer ce contact"
 
-#: src/Model/User.php:583
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Votre domaine de courriel n'est pas autorisé sur ce site."
+#: src/Module/Contact.php:606
+msgid "Repair URL settings"
+msgstr "Réglages de réparation des URL"
 
-#: src/Model/User.php:587
-msgid "Not a valid email address."
-msgstr "Ceci n'est pas une adresse courriel valide."
+#: src/Module/Contact.php:607
+msgid "View conversations"
+msgstr "Voir les conversations"
 
-#: src/Model/User.php:590
-msgid "The nickname was blocked from registration by the nodes admin."
-msgstr ""
+#: src/Module/Contact.php:612
+msgid "Last update:"
+msgstr "Dernière mise-à-jour :"
 
-#: src/Model/User.php:594 src/Model/User.php:602
-msgid "Cannot use that email."
-msgstr "Impossible d'utiliser ce courriel."
+#: src/Module/Contact.php:614
+msgid "Update public posts"
+msgstr "Mettre à jour les publications publiques:"
 
-#: src/Model/User.php:609
-msgid "Your nickname can only contain a-z, 0-9 and _."
-msgstr ""
+#: src/Module/Contact.php:616 src/Module/Contact.php:1068
+msgid "Update now"
+msgstr "Mettre à jour"
 
-#: src/Model/User.php:616 src/Model/User.php:673
-msgid "Nickname is already registered. Please choose another."
-msgstr "Pseudo déjà utilisé. Merci d'en choisir un autre."
+#: src/Module/Contact.php:622 src/Module/Contact.php:825
+#: src/Module/Contact.php:1085
+msgid "Unignore"
+msgstr "Ne plus ignorer"
 
-#: src/Model/User.php:626
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "ERREUR FATALE : La génération des clés de sécurité a échoué."
+#: src/Module/Contact.php:626
+msgid "Currently blocked"
+msgstr "Actuellement bloqué"
 
-#: src/Model/User.php:660 src/Model/User.php:664
-msgid "An error occurred during registration. Please try again."
-msgstr "Une erreur est survenue lors de l'inscription. Merci de recommencer."
+#: src/Module/Contact.php:627
+msgid "Currently ignored"
+msgstr "Actuellement ignoré"
 
-#: src/Model/User.php:689
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "Une erreur est survenue lors de la création de votre profil par défaut. Merci de recommencer."
+#: src/Module/Contact.php:628
+msgid "Currently archived"
+msgstr "Actuellement archivé"
 
-#: src/Model/User.php:696
-msgid "An error occurred creating your self contact. Please try again."
+#: src/Module/Contact.php:629
+msgid "Awaiting connection acknowledge"
 msgstr ""
 
-#: src/Model/User.php:705
+#: src/Module/Contact.php:630
 msgid ""
-"An error occurred creating your default contact group. Please try again."
-msgstr ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Les réponses et \"j'aime\" à vos publications publiques <strong>peuvent</strong> être toujours visibles"
 
-#: src/Model/User.php:781
-#, php-format
-msgid ""
-"\n"
-"\t\t\tDear %1$s,\n"
-"\t\t\t\tThank you for registering at %2$s. Your account is pending for approval by the administrator.\n"
-"\n"
-"\t\t\tYour login details are as follows:\n"
-"\n"
-"\t\t\tSite Location:\t%3$s\n"
-"\t\t\tLogin Name:\t\t%4$s\n"
-"\t\t\tPassword:\t\t%5$s\n"
-"\t\t"
-msgstr ""
+#: src/Module/Contact.php:631
+msgid "Notification for new posts"
+msgstr "Notification des nouvelles publications"
 
-#: src/Model/User.php:798
-#, php-format
-msgid "Registration at %s"
-msgstr ""
+#: src/Module/Contact.php:631
+msgid "Send a notification of every new post of this contact"
+msgstr "Envoyer une notification de chaque nouveau message en provenance de ce contact"
 
-#: src/Model/User.php:817
-#, php-format
-msgid ""
-"\n"
-"\t\t\tDear %1$s,\n"
-"\t\t\t\tThank you for registering at %2$s. Your account has been created.\n"
-"\t\t"
-msgstr ""
+#: src/Module/Contact.php:633
+msgid "Blacklisted keywords"
+msgstr "Mots-clés sur la liste noire"
 
-#: src/Model/User.php:823
-#, php-format
+#: src/Module/Contact.php:633
 msgid ""
-"\n"
-"\t\t\tThe login details are as follows:\n"
-"\n"
-"\t\t\tSite Location:\t%3$s\n"
-"\t\t\tLogin Name:\t\t%1$s\n"
-"\t\t\tPassword:\t\t%5$s\n"
-"\n"
-"\t\t\tYou may change your password from your account \"Settings\" page after logging\n"
-"\t\t\tin.\n"
-"\n"
-"\t\t\tPlease take a few moments to review the other account settings on that page.\n"
-"\n"
-"\t\t\tYou may also wish to add some basic information to your default profile\n"
-"\t\t\t(on the \"Profiles\" page) so that other people can easily find you.\n"
-"\n"
-"\t\t\tWe recommend setting your full name, adding a profile photo,\n"
-"\t\t\tadding some profile \"keywords\" (very useful in making new friends) - and\n"
-"\t\t\tperhaps what country you live in; if you do not wish to be more specific\n"
-"\t\t\tthan that.\n"
-"\n"
-"\t\t\tWe fully respect your right to privacy, and none of these items are necessary.\n"
-"\t\t\tIf you are new and do not know anybody here, they may help\n"
-"\t\t\tyou to make some new and interesting friends.\n"
-"\n"
-"\t\t\tIf you ever want to delete your account, you can do so at %3$s/removeme\n"
-"\n"
-"\t\t\tThank you and welcome to %2$s."
-msgstr ""
+"Comma separated list of keywords that should not be converted to hashtags, "
+"when \"Fetch information and keywords\" is selected"
+msgstr "Liste de mots-clés separés par des virgules qui ne doivent pas être converti en mots-dièse quand  « Récupérer informations et mots-clés » est sélectionné."
 
-#: src/Protocol/Diaspora.php:2496
-msgid "Sharing notification from Diaspora network"
-msgstr "Notification de partage du réseau Diaspora"
+#: src/Module/Contact.php:650
+msgid "Actions"
+msgstr "Actions"
 
-#: src/Protocol/Diaspora.php:3613
-msgid "Attachments:"
-msgstr "Pièces jointes : "
+#: src/Module/Contact.php:696
+msgid "Suggestions"
+msgstr "Suggestions"
 
-#: src/Protocol/OStatus.php:1302 src/Module/Profile.php:102
-#: src/Module/Profile.php:105
-#, php-format
-msgid "%s's timeline"
-msgstr ""
+#: src/Module/Contact.php:699
+msgid "Suggest potential friends"
+msgstr "Suggérer des amis potentiels"
 
-#: src/Protocol/OStatus.php:1306 src/Module/Profile.php:103
-#, php-format
-msgid "%s's posts"
-msgstr ""
+#: src/Module/Contact.php:707
+msgid "Show all contacts"
+msgstr "Montrer tous les contacts"
 
-#: src/Protocol/OStatus.php:1309 src/Module/Profile.php:104
-#, php-format
-msgid "%s's comments"
+#: src/Module/Contact.php:712
+msgid "Unblocked"
+msgstr "Non-bloqués"
+
+#: src/Module/Contact.php:715
+msgid "Only show unblocked contacts"
+msgstr "Ne montrer que les contacts non-bloqués"
+
+#: src/Module/Contact.php:720
+msgid "Blocked"
+msgstr "Bloqués"
+
+#: src/Module/Contact.php:723
+msgid "Only show blocked contacts"
+msgstr "Ne montrer que les contacts bloqués"
+
+#: src/Module/Contact.php:728
+msgid "Ignored"
+msgstr "Ignorés"
+
+#: src/Module/Contact.php:731
+msgid "Only show ignored contacts"
+msgstr "Ne montrer que les contacts ignorés"
+
+#: src/Module/Contact.php:736
+msgid "Archived"
+msgstr "Archivés"
+
+#: src/Module/Contact.php:739
+msgid "Only show archived contacts"
+msgstr "Ne montrer que les contacts archivés"
+
+#: src/Module/Contact.php:744
+msgid "Hidden"
+msgstr "Cachés"
+
+#: src/Module/Contact.php:747
+msgid "Only show hidden contacts"
+msgstr "Ne montrer que les contacts masqués"
+
+#: src/Module/Contact.php:755
+msgid "Organize your contact groups"
 msgstr ""
 
-#: src/Protocol/OStatus.php:1866
-#, php-format
-msgid "%s is now following %s."
-msgstr "%s suit désormais %s."
+#: src/Module/Contact.php:815
+msgid "Search your contacts"
+msgstr "Rechercher dans vos contacts"
 
-#: src/Protocol/OStatus.php:1867
-msgid "following"
-msgstr "following"
+#: src/Module/Contact.php:826 src/Module/Contact.php:1094
+msgid "Archive"
+msgstr "Archiver"
 
-#: src/Protocol/OStatus.php:1870
-#, php-format
-msgid "%s stopped following %s."
-msgstr "%s ne suit plus %s."
+#: src/Module/Contact.php:826 src/Module/Contact.php:1094
+msgid "Unarchive"
+msgstr "Désarchiver"
 
-#: src/Protocol/OStatus.php:1871
-msgid "stopped following"
-msgstr "retiré de la liste de suivi"
+#: src/Module/Contact.php:829
+msgid "Batch Actions"
+msgstr "Actions multiples"
 
-#: src/Worker/Delivery.php:453
-msgid "(no subject)"
-msgstr "(sans titre)"
+#: src/Module/Contact.php:856
+msgid "Conversations started by this contact"
+msgstr ""
 
-#: src/Module/Attach.php:36 src/Module/Attach.php:48
-msgid "Item was not found."
-msgstr "Element introuvable."
+#: src/Module/Contact.php:861
+msgid "Posts and Comments"
+msgstr ""
 
-#: src/Module/Contact.php:166
-#, php-format
-msgid "%d contact edited."
-msgid_plural "%d contacts edited."
-msgstr[0] "%d contact mis à jour."
-msgstr[1] "%d contacts mis à jour."
+#: src/Module/Contact.php:884
+msgid "View all contacts"
+msgstr "Voir tous les contacts"
 
-#: src/Module/Contact.php:191 src/Module/Contact.php:374
-msgid "Could not access contact record."
-msgstr "Impossible d'accéder à l'enregistrement du contact."
+#: src/Module/Contact.php:895
+msgid "View all common friends"
+msgstr "Voir tous les amis communs"
 
-#: src/Module/Contact.php:201
-msgid "Could not locate selected profile."
-msgstr "Impossible de localiser le profil séléctionné."
+#: src/Module/Contact.php:905
+msgid "Advanced Contact Settings"
+msgstr "Réglages avancés du contact"
 
-#: src/Module/Contact.php:233
-msgid "Contact updated."
-msgstr "Contact mis à jour."
+#: src/Module/Contact.php:991
+msgid "Mutual Friendship"
+msgstr "Relation réciproque"
 
-#: src/Module/Contact.php:395
-msgid "Contact has been blocked"
-msgstr "Le contact a été bloqué"
+#: src/Module/Contact.php:996
+msgid "is a fan of yours"
+msgstr "Vous suit"
 
-#: src/Module/Contact.php:395
-msgid "Contact has been unblocked"
-msgstr "Le contact n'est plus bloqué"
+#: src/Module/Contact.php:1001
+msgid "you are a fan of"
+msgstr "Vous le/la suivez"
 
-#: src/Module/Contact.php:405
-msgid "Contact has been ignored"
-msgstr "Le contact a été ignoré"
+#: src/Module/Contact.php:1025
+msgid "Edit contact"
+msgstr "Éditer le contact"
 
-#: src/Module/Contact.php:405
-msgid "Contact has been unignored"
-msgstr "Le contact n'est plus ignoré"
+#: src/Module/Contact.php:1079
+msgid "Toggle Blocked status"
+msgstr "(dés)activer l'état \"bloqué\""
 
-#: src/Module/Contact.php:415
-msgid "Contact has been archived"
-msgstr "Contact archivé"
+#: src/Module/Contact.php:1087
+msgid "Toggle Ignored status"
+msgstr "(dés)activer l'état \"ignoré\""
 
-#: src/Module/Contact.php:415
-msgid "Contact has been unarchived"
-msgstr "Contact désarchivé"
+#: src/Module/Contact.php:1096
+msgid "Toggle Archive status"
+msgstr "(dés)activer l'état \"archivé\""
 
-#: src/Module/Contact.php:439
-msgid "Drop contact"
-msgstr "Supprimer contact"
+#: src/Module/Contact.php:1104
+msgid "Delete contact"
+msgstr "Effacer ce contact"
 
-#: src/Module/Contact.php:442 src/Module/Contact.php:820
-msgid "Do you really want to delete this contact?"
-msgstr "Voulez-vous vraiment supprimer ce contact?"
+#: src/Module/Install.php:118
+msgid "Friendica Communications Server - Setup"
+msgstr ""
 
-#: src/Module/Contact.php:456
-msgid "Contact has been removed."
-msgstr "Ce contact a été retiré."
+#: src/Module/Install.php:129
+msgid "System check"
+msgstr "Vérifications système"
 
-#: src/Module/Contact.php:486
-#, php-format
-msgid "You are mutual friends with %s"
-msgstr "Vous êtes ami (et réciproquement) avec %s"
+#: src/Module/Install.php:134
+msgid "Check again"
+msgstr "Vérifier à nouveau"
 
-#: src/Module/Contact.php:491
-#, php-format
-msgid "You are sharing with %s"
-msgstr "Vous partagez avec %s"
+#: src/Module/Install.php:151
+msgid "Database connection"
+msgstr "Connexion à la base de données"
 
-#: src/Module/Contact.php:496
-#, php-format
-msgid "%s is sharing with you"
-msgstr "%s partage avec vous"
+#: src/Module/Install.php:152
+msgid ""
+"In order to install Friendica we need to know how to connect to your "
+"database."
+msgstr "Pour installer Friendica, nous avons besoin de savoir comment contacter votre base de données."
 
-#: src/Module/Contact.php:520
-msgid "Private communications are not available for this contact."
-msgstr "Les communications privées ne sont pas disponibles pour ce contact."
+#: src/Module/Install.php:153
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Merci de vous tourner vers votre hébergeur et/ou administrateur pour toute question concernant ces réglages."
 
-#: src/Module/Contact.php:522
-msgid "Never"
-msgstr "Jamais"
+#: src/Module/Install.php:154
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "La base de données que vous spécifierez doit exister. Si ce n'est pas encore le cas, merci de la créer avant de continuer."
 
-#: src/Module/Contact.php:525
-msgid "(Update was successful)"
-msgstr "(Mise à jour effectuée avec succès)"
+#: src/Module/Install.php:157
+msgid "Database Server Name"
+msgstr "Serveur de base de données"
 
-#: src/Module/Contact.php:525
-msgid "(Update was not successful)"
-msgstr "(Échec de la mise à jour)"
+#: src/Module/Install.php:162
+msgid "Database Login Name"
+msgstr "Nom d'utilisateur de la base"
 
-#: src/Module/Contact.php:527 src/Module/Contact.php:1058
-msgid "Suggest friends"
-msgstr "Suggérer amitié/contact"
+#: src/Module/Install.php:168
+msgid "Database Login Password"
+msgstr "Mot de passe de la base"
 
-#: src/Module/Contact.php:531
-#, php-format
-msgid "Network type: %s"
-msgstr "Type de réseau %s"
+#: src/Module/Install.php:170
+msgid "For security reasons the password must not be empty"
+msgstr "Pour des raisons de sécurité, le mot de passe ne peut pas être vide."
 
-#: src/Module/Contact.php:536
-msgid "Communications lost with this contact!"
-msgstr "Communications perdues avec ce contact !"
+#: src/Module/Install.php:173
+msgid "Database Name"
+msgstr "Nom de la base"
 
-#: src/Module/Contact.php:542
-msgid "Fetch further information for feeds"
-msgstr "Chercher plus d'informations pour les flux"
+#: src/Module/Install.php:178 src/Module/Install.php:214
+msgid "Site administrator email address"
+msgstr "Adresse électronique de l'administrateur du site"
 
-#: src/Module/Contact.php:544
+#: src/Module/Install.php:180 src/Module/Install.php:214
 msgid ""
-"Fetch information like preview pictures, title and teaser from the feed "
-"item. You can activate this if the feed doesn't contain much text. Keywords "
-"are taken from the meta header in the feed item and are posted as hash tags."
-msgstr ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Votre adresse électronique doit correspondre à celle-ci pour pouvoir utiliser l'interface d'administration."
 
-#: src/Module/Contact.php:547
-msgid "Fetch information"
-msgstr "Récupérer informations"
+#: src/Module/Install.php:184 src/Module/Install.php:215
+msgid "Please select a default timezone for your website"
+msgstr "Sélectionner un fuseau horaire par défaut pour votre site"
 
-#: src/Module/Contact.php:548
-msgid "Fetch keywords"
-msgstr ""
+#: src/Module/Install.php:208
+msgid "Site settings"
+msgstr "Réglages du site"
 
-#: src/Module/Contact.php:549
-msgid "Fetch information and keywords"
-msgstr "Récupérer informations"
+#: src/Module/Install.php:217
+msgid "System Language:"
+msgstr "Langue système :"
 
-#: src/Module/Contact.php:581
-msgid "Profile Visibility"
-msgstr "Visibilité du profil"
+#: src/Module/Install.php:219
+msgid ""
+"Set the default language for your Friendica installation interface and to "
+"send emails."
+msgstr "Définit la langue par défaut pour l'interface de votre instance Friendica et les mails envoyés."
 
-#: src/Module/Contact.php:582
-msgid "Contact Information / Notes"
-msgstr "Informations de contact / Notes"
+#: src/Module/Install.php:231
+msgid "Your Friendica site database has been installed."
+msgstr "La base de données de votre site Friendica a bien été installée."
 
-#: src/Module/Contact.php:583
-msgid "Contact Settings"
-msgstr "Paramètres du Contact"
+#: src/Module/Install.php:239
+msgid "Installation finished"
+msgstr ""
 
-#: src/Module/Contact.php:592
-msgid "Contact"
-msgstr "Contact"
+#: src/Module/Install.php:261
+msgid "<h1>What next</h1>"
+msgstr "<h1>Ensuite</h1>"
 
-#: src/Module/Contact.php:596
-#, php-format
+#: src/Module/Install.php:262
 msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Merci de choisir le profil que vous souhaitez montrer à %s lorsqu'il vous rend visite de manière sécurisée."
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"worker."
+msgstr "IMPORTANT: vous devrez ajouter [manuellement] une tâche planifiée pour le 'worker'."
 
-#: src/Module/Contact.php:598
-msgid "Their personal note"
+#: src/Module/Install.php:265
+#, php-format
+msgid ""
+"Go to your new Friendica node <a href=\"%s/register\">registration page</a> "
+"and register as new user. Remember to use the same email you have entered as"
+" administrator email. This will allow you to enter the site admin panel."
 msgstr ""
 
-#: src/Module/Contact.php:600
-msgid "Edit contact notes"
-msgstr "Éditer les notes des contacts"
-
-#: src/Module/Contact.php:604
-msgid "Block/Unblock contact"
-msgstr "Bloquer/débloquer ce contact"
+#: src/Module/Itemsource.php:41
+msgid "Item Guid"
+msgstr ""
 
-#: src/Module/Contact.php:605
-msgid "Ignore contact"
-msgstr "Ignorer ce contact"
+#: src/Module/Login.php:292
+msgid "Create a New Account"
+msgstr "Créer un nouveau compte"
 
-#: src/Module/Contact.php:606
-msgid "Repair URL settings"
-msgstr "Réglages de réparation des URL"
+#: src/Module/Login.php:325
+msgid "Password: "
+msgstr "Mot de passe : "
 
-#: src/Module/Contact.php:607
-msgid "View conversations"
-msgstr "Voir les conversations"
+#: src/Module/Login.php:326
+msgid "Remember me"
+msgstr "Se souvenir de moi"
 
-#: src/Module/Contact.php:612
-msgid "Last update:"
-msgstr "Dernière mise-à-jour :"
+#: src/Module/Login.php:329
+msgid "Or login using OpenID: "
+msgstr "Ou connectez-vous via OpenID : "
 
-#: src/Module/Contact.php:614
-msgid "Update public posts"
-msgstr "Mettre à jour les publications publiques:"
+#: src/Module/Login.php:335
+msgid "Forgot your password?"
+msgstr "Mot de passe oublié?"
 
-#: src/Module/Contact.php:616 src/Module/Contact.php:1068
-msgid "Update now"
-msgstr "Mettre à jour"
+#: src/Module/Login.php:338
+msgid "Website Terms of Service"
+msgstr "Conditions d'utilisation du site internet"
 
-#: src/Module/Contact.php:622 src/Module/Contact.php:825
-#: src/Module/Contact.php:1085
-msgid "Unignore"
-msgstr "Ne plus ignorer"
+#: src/Module/Login.php:339
+msgid "terms of service"
+msgstr "conditions d'utilisation"
 
-#: src/Module/Contact.php:626
-msgid "Currently blocked"
-msgstr "Actuellement bloqué"
+#: src/Module/Login.php:341
+msgid "Website Privacy Policy"
+msgstr "Politique de confidentialité du site internet"
 
-#: src/Module/Contact.php:627
-msgid "Currently ignored"
-msgstr "Actuellement ignoré"
+#: src/Module/Login.php:342
+msgid "privacy policy"
+msgstr "politique de confidentialité"
 
-#: src/Module/Contact.php:628
-msgid "Currently archived"
-msgstr "Actuellement archivé"
+#: src/Module/Logout.php:27
+msgid "Logged out."
+msgstr "Déconnecté."
 
-#: src/Module/Contact.php:629
-msgid "Awaiting connection acknowledge"
+#: src/Module/Profile.php:102 src/Module/Profile.php:105
+#: src/Protocol/OStatus.php:1302
+#, php-format
+msgid "%s's timeline"
 msgstr ""
 
-#: src/Module/Contact.php:630
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr "Les réponses et \"j'aime\" à vos publications publiques <strong>peuvent</strong> être toujours visibles"
-
-#: src/Module/Contact.php:631
-msgid "Notification for new posts"
-msgstr "Notification des nouvelles publications"
+#: src/Module/Profile.php:103 src/Protocol/OStatus.php:1306
+#, php-format
+msgid "%s's posts"
+msgstr ""
 
-#: src/Module/Contact.php:631
-msgid "Send a notification of every new post of this contact"
-msgstr "Envoyer une notification de chaque nouveau message en provenance de ce contact"
+#: src/Module/Profile.php:104 src/Protocol/OStatus.php:1309
+#, php-format
+msgid "%s's comments"
+msgstr ""
 
-#: src/Module/Contact.php:633
-msgid "Blacklisted keywords"
-msgstr "Mots-clés sur la liste noire"
+#: src/Module/Proxy.php:73
+msgid "Bad Request."
+msgstr ""
 
-#: src/Module/Contact.php:633
+#: src/Module/Register.php:83
 msgid ""
-"Comma separated list of keywords that should not be converted to hashtags, "
-"when \"Fetch information and keywords\" is selected"
-msgstr "Liste de mots-clés separés par des virgules qui ne doivent pas être converti en mots-dièse quand  « Récupérer informations et mots-clés » est sélectionné."
-
-#: src/Module/Contact.php:650
-msgid "Actions"
-msgstr "Actions"
+"You may (optionally) fill in this form via OpenID by supplying your OpenID "
+"and clicking \"Register\"."
+msgstr ""
 
-#: src/Module/Contact.php:696
-msgid "Suggestions"
-msgstr "Suggestions"
+#: src/Module/Register.php:84
+msgid ""
+"If you are not familiar with OpenID, please leave that field blank and fill "
+"in the rest of the items."
+msgstr "Si vous n'êtes pas familier avec OpenID, laissez ce champ vide et remplissez le reste."
 
-#: src/Module/Contact.php:699
-msgid "Suggest potential friends"
-msgstr "Suggérer des amis potentiels"
+#: src/Module/Register.php:85
+msgid "Your OpenID (optional): "
+msgstr "Votre OpenID (facultatif): "
 
-#: src/Module/Contact.php:707
-msgid "Show all contacts"
-msgstr "Montrer tous les contacts"
+#: src/Module/Register.php:94
+msgid "Include your profile in member directory?"
+msgstr "Inclure votre profil dans l'annuaire des membres?"
 
-#: src/Module/Contact.php:712
-msgid "Unblocked"
-msgstr "Non-bloqués"
+#: src/Module/Register.php:117
+msgid "Note for the admin"
+msgstr "Commentaire pour l'administrateur"
 
-#: src/Module/Contact.php:715
-msgid "Only show unblocked contacts"
-msgstr "Ne montrer que les contacts non-bloqués"
+#: src/Module/Register.php:117
+msgid "Leave a message for the admin, why you want to join this node"
+msgstr "Indiquez à l'administrateur les raisons de votre inscription à cette instance."
 
-#: src/Module/Contact.php:720
-msgid "Blocked"
-msgstr "Bloqués"
+#: src/Module/Register.php:118
+msgid "Membership on this site is by invitation only."
+msgstr "L'inscription à ce site se fait uniquement sur invitation."
 
-#: src/Module/Contact.php:723
-msgid "Only show blocked contacts"
-msgstr "Ne montrer que les contacts bloqués"
+#: src/Module/Register.php:119
+msgid "Your invitation code: "
+msgstr ""
 
-#: src/Module/Contact.php:728
-msgid "Ignored"
-msgstr "Ignorés"
+#: src/Module/Register.php:127
+msgid "Your Full Name (e.g. Joe Smith, real or real-looking): "
+msgstr "Votre nom complet (p. ex. Michel Dupont):"
 
-#: src/Module/Contact.php:731
-msgid "Only show ignored contacts"
-msgstr "Ne montrer que les contacts ignorés"
+#: src/Module/Register.php:128
+msgid ""
+"Your Email Address: (Initial information will be send there, so this has to "
+"be an existing address.)"
+msgstr "Votre courriel : (Des informations de connexion vont être envoyées à cette adresse; elle doit exister)."
 
-#: src/Module/Contact.php:736
-msgid "Archived"
-msgstr "Archivés"
+#: src/Module/Register.php:130
+msgid "Leave empty for an auto generated password."
+msgstr "Laisser ce champ libre pour obtenir un mot de passe généré automatiquement."
 
-#: src/Module/Contact.php:739
-msgid "Only show archived contacts"
-msgstr "Ne montrer que les contacts archivés"
+#: src/Module/Register.php:132
+#, php-format
+msgid ""
+"Choose a profile nickname. This must begin with a text character. Your "
+"profile address on this site will then be \"<strong>nickname@%s</strong>\"."
+msgstr ""
 
-#: src/Module/Contact.php:744
-msgid "Hidden"
-msgstr "Cachés"
+#: src/Module/Register.php:133
+msgid "Choose a nickname: "
+msgstr "Choisir un pseudo : "
 
-#: src/Module/Contact.php:747
-msgid "Only show hidden contacts"
-msgstr "Ne montrer que les contacts masqués"
+#: src/Module/Register.php:142
+msgid "Import your profile to this friendica instance"
+msgstr "Importer votre profile dans cette instance de friendica"
 
-#: src/Module/Contact.php:755
-msgid "Organize your contact groups"
+#: src/Module/Register.php:150
+msgid "Note: This node explicitly contains adult content"
 msgstr ""
 
-#: src/Module/Contact.php:815
-msgid "Search your contacts"
-msgstr "Rechercher dans vos contacts"
+#: src/Module/Register.php:243
+msgid ""
+"Registration successful. Please check your email for further instructions."
+msgstr "Inscription réussie. Vérifiez vos emails pour la suite des instructions."
 
-#: src/Module/Contact.php:826 src/Module/Contact.php:1094
-msgid "Archive"
-msgstr "Archiver"
+#: src/Module/Register.php:247
+#, php-format
+msgid ""
+"Failed to send email message. Here your accout details:<br> login: %s<br> "
+"password: %s<br><br>You can change your password after login."
+msgstr "Impossible d’envoyer le courriel de confirmation. Voici vos informations de connexion:<br> identifiant : %s<br> mot de passe : %s<br><br>Vous pourrez changer votre mot de passe une fois connecté."
 
-#: src/Module/Contact.php:826 src/Module/Contact.php:1094
-msgid "Unarchive"
-msgstr "Désarchiver"
+#: src/Module/Register.php:254
+msgid "Registration successful."
+msgstr "Inscription réussie."
 
-#: src/Module/Contact.php:829
-msgid "Batch Actions"
-msgstr "Actions multiples"
+#: src/Module/Register.php:259
+msgid "Your registration can not be processed."
+msgstr "Votre inscription ne peut être traitée."
 
-#: src/Module/Contact.php:856
-msgid "Conversations started by this contact"
-msgstr ""
+#: src/Module/Register.php:305
+msgid "Your registration is pending approval by the site owner."
+msgstr "Votre inscription attend une validation du propriétaire du site."
 
-#: src/Module/Contact.php:861
-msgid "Posts and Comments"
+#: src/Module/Tos.php:35 src/Module/Tos.php:77
+msgid ""
+"At the time of registration, and for providing communications between the "
+"user account and their contacts, the user has to provide a display name (pen"
+" name), an username (nickname) and a working email address. The names will "
+"be accessible on the profile page of the account by any visitor of the page,"
+" even if other profile details are not displayed. The email address will "
+"only be used to send the user notifications about interactions, but wont be "
+"visibly displayed. The listing of an account in the node's user directory or"
+" the global user directory is optional and can be controlled in the user "
+"settings, it is not necessary for communication."
 msgstr ""
 
-#: src/Module/Contact.php:884
-msgid "View all contacts"
-msgstr "Voir tous les contacts"
-
-#: src/Module/Contact.php:895
-msgid "View all common friends"
-msgstr "Voir tous les amis communs"
-
-#: src/Module/Contact.php:905
-msgid "Advanced Contact Settings"
-msgstr "Réglages avancés du contact"
+#: src/Module/Tos.php:36 src/Module/Tos.php:78
+msgid ""
+"This data is required for communication and is passed on to the nodes of the"
+" communication partners and is stored there. Users can enter additional "
+"private data that may be transmitted to the communication partners accounts."
+msgstr ""
 
-#: src/Module/Contact.php:991
-msgid "Mutual Friendship"
-msgstr "Relation réciproque"
+#: src/Module/Tos.php:37 src/Module/Tos.php:79
+#, php-format
+msgid ""
+"At any point in time a logged in user can export their account data from the"
+" <a href=\"%1$s/settings/uexport\">account settings</a>. If the user wants "
+"to delete their account they can do so at <a "
+"href=\"%1$s/removeme\">%1$s/removeme</a>. The deletion of the account will "
+"be permanent. Deletion of the data will also be requested from the nodes of "
+"the communication partners."
+msgstr ""
 
-#: src/Module/Contact.php:996
-msgid "is a fan of yours"
-msgstr "Vous suit"
+#: src/Module/Tos.php:40 src/Module/Tos.php:76
+msgid "Privacy Statement"
+msgstr ""
 
-#: src/Module/Contact.php:1001
-msgid "you are a fan of"
-msgstr "Vous le/la suivez"
+#: src/Object/Post.php:136
+msgid "This entry was edited"
+msgstr "Cette entrée a été éditée"
 
-#: src/Module/Contact.php:1025
-msgid "Edit contact"
-msgstr "Éditer le contact"
+#: src/Object/Post.php:198
+msgid "Delete locally"
+msgstr ""
 
-#: src/Module/Contact.php:1079
-msgid "Toggle Blocked status"
-msgstr "(dés)activer l'état \"bloqué\""
+#: src/Object/Post.php:201
+msgid "Delete globally"
+msgstr ""
 
-#: src/Module/Contact.php:1087
-msgid "Toggle Ignored status"
-msgstr "(dés)activer l'état \"ignoré\""
+#: src/Object/Post.php:201
+msgid "Remove locally"
+msgstr ""
 
-#: src/Module/Contact.php:1096
-msgid "Toggle Archive status"
-msgstr "(dés)activer l'état \"archivé\""
+#: src/Object/Post.php:215
+msgid "save to folder"
+msgstr "sauver vers dossier"
 
-#: src/Module/Contact.php:1104
-msgid "Delete contact"
-msgstr "Effacer ce contact"
+#: src/Object/Post.php:250
+msgid "I will attend"
+msgstr "Je vais participer"
 
-#: src/Module/Install.php:118
-msgid "Friendica Communications Server - Setup"
-msgstr ""
+#: src/Object/Post.php:250
+msgid "I will not attend"
+msgstr "Je ne vais pas participer"
 
-#: src/Module/Install.php:129
-msgid "System check"
-msgstr "Vérifications système"
+#: src/Object/Post.php:250
+msgid "I might attend"
+msgstr "Je vais peut-être participer"
 
-#: src/Module/Install.php:134
-msgid "Check again"
-msgstr "Vérifier à nouveau"
+#: src/Object/Post.php:278
+msgid "ignore thread"
+msgstr "ignorer le fil"
 
-#: src/Module/Install.php:151
-msgid "Database connection"
-msgstr "Connexion à la base de données"
+#: src/Object/Post.php:279
+msgid "unignore thread"
+msgstr "Ne plus ignorer le fil"
 
-#: src/Module/Install.php:152
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr "Pour installer Friendica, nous avons besoin de savoir comment contacter votre base de données."
+#: src/Object/Post.php:280
+msgid "toggle ignore status"
+msgstr "Ignorer le statut"
 
-#: src/Module/Install.php:153
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Merci de vous tourner vers votre hébergeur et/ou administrateur pour toute question concernant ces réglages."
+#: src/Object/Post.php:291
+msgid "add star"
+msgstr "mettre en avant"
 
-#: src/Module/Install.php:154
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "La base de données que vous spécifierez doit exister. Si ce n'est pas encore le cas, merci de la créer avant de continuer."
+#: src/Object/Post.php:292
+msgid "remove star"
+msgstr "ne plus mettre en avant"
 
-#: src/Module/Install.php:157
-msgid "Database Server Name"
-msgstr "Serveur de base de données"
+#: src/Object/Post.php:293
+msgid "toggle star status"
+msgstr "mettre en avant"
 
-#: src/Module/Install.php:162
-msgid "Database Login Name"
-msgstr "Nom d'utilisateur de la base"
+#: src/Object/Post.php:296
+msgid "starred"
+msgstr "mis en avant"
 
-#: src/Module/Install.php:168
-msgid "Database Login Password"
-msgstr "Mot de passe de la base"
+#: src/Object/Post.php:300
+msgid "add tag"
+msgstr "ajouter une étiquette"
 
-#: src/Module/Install.php:170
-msgid "For security reasons the password must not be empty"
-msgstr "Pour des raisons de sécurité, le mot de passe ne peut pas être vide."
+#: src/Object/Post.php:311
+msgid "like"
+msgstr "aime"
 
-#: src/Module/Install.php:173
-msgid "Database Name"
-msgstr "Nom de la base"
+#: src/Object/Post.php:312
+msgid "dislike"
+msgstr "n'aime pas"
 
-#: src/Module/Install.php:178 src/Module/Install.php:214
-msgid "Site administrator email address"
-msgstr "Adresse électronique de l'administrateur du site"
+#: src/Object/Post.php:315
+msgid "Share this"
+msgstr "Partager"
 
-#: src/Module/Install.php:180 src/Module/Install.php:214
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Votre adresse électronique doit correspondre à celle-ci pour pouvoir utiliser l'interface d'administration."
+#: src/Object/Post.php:315
+msgid "share"
+msgstr "partager"
 
-#: src/Module/Install.php:184 src/Module/Install.php:215
-msgid "Please select a default timezone for your website"
-msgstr "Sélectionner un fuseau horaire par défaut pour votre site"
+#: src/Object/Post.php:382
+msgid "to"
+msgstr "à"
 
-#: src/Module/Install.php:208
-msgid "Site settings"
-msgstr "Réglages du site"
+#: src/Object/Post.php:383
+msgid "via"
+msgstr "via"
 
-#: src/Module/Install.php:217
-msgid "System Language:"
-msgstr "Langue système :"
+#: src/Object/Post.php:384
+msgid "Wall-to-Wall"
+msgstr "Inter-mur"
 
-#: src/Module/Install.php:219
-msgid ""
-"Set the default language for your Friendica installation interface and to "
-"send emails."
-msgstr "Définit la langue par défaut pour l'interface de votre instance Friendica et les mails envoyés."
+#: src/Object/Post.php:385
+msgid "via Wall-To-Wall:"
+msgstr "en Inter-mur :"
 
-#: src/Module/Install.php:231
-msgid "Your Friendica site database has been installed."
-msgstr "La base de données de votre site Friendica a bien été installée."
+#: src/Object/Post.php:418
+#, php-format
+msgid "Reply to %s"
+msgstr ""
 
-#: src/Module/Install.php:239
-msgid "Installation finished"
+#: src/Object/Post.php:433
+msgid "Notifier task is pending"
 msgstr ""
 
-#: src/Module/Install.php:261
-msgid "<h1>What next</h1>"
-msgstr "<h1>Ensuite</h1>"
+#: src/Object/Post.php:434
+msgid "Delivery to remote servers is pending"
+msgstr ""
 
-#: src/Module/Install.php:262
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"worker."
-msgstr "IMPORTANT: vous devrez ajouter [manuellement] une tâche planifiée pour le 'worker'."
+#: src/Object/Post.php:435
+msgid "Delivery to remote servers is underway"
+msgstr ""
 
-#: src/Module/Install.php:265
-#, php-format
-msgid ""
-"Go to your new Friendica node <a href=\"%s/register\">registration page</a> "
-"and register as new user. Remember to use the same email you have entered as"
-" administrator email. This will allow you to enter the site admin panel."
+#: src/Object/Post.php:436
+msgid "Delivery to remote servers is mostly done"
 msgstr ""
 
-#: src/Module/Itemsource.php:41
-msgid "Item Guid"
+#: src/Object/Post.php:437
+msgid "Delivery to remote servers is done"
 msgstr ""
 
-#: src/Module/Login.php:292
-msgid "Create a New Account"
-msgstr "Créer un nouveau compte"
+#: src/Object/Post.php:457
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d commentaire"
+msgstr[1] "%d commentaires"
 
-#: src/Module/Login.php:325
-msgid "Password: "
-msgstr "Mot de passe : "
+#: src/Object/Post.php:458
+msgid "Show more"
+msgstr ""
 
-#: src/Module/Login.php:326
-msgid "Remember me"
-msgstr "Se souvenir de moi"
+#: src/Object/Post.php:459
+msgid "Show fewer"
+msgstr ""
 
-#: src/Module/Login.php:329
-msgid "Or login using OpenID: "
-msgstr "Ou connectez-vous via OpenID : "
+#: src/Protocol/Diaspora.php:2496
+msgid "Sharing notification from Diaspora network"
+msgstr "Notification de partage du réseau Diaspora"
 
-#: src/Module/Login.php:335
-msgid "Forgot your password?"
-msgstr "Mot de passe oublié?"
+#: src/Protocol/Diaspora.php:3613
+msgid "Attachments:"
+msgstr "Pièces jointes : "
 
-#: src/Module/Login.php:338
-msgid "Website Terms of Service"
-msgstr "Conditions d'utilisation du site internet"
+#: src/Protocol/OStatus.php:1866
+#, php-format
+msgid "%s is now following %s."
+msgstr "%s suit désormais %s."
 
-#: src/Module/Login.php:339
-msgid "terms of service"
-msgstr "conditions d'utilisation"
+#: src/Protocol/OStatus.php:1867
+msgid "following"
+msgstr "following"
 
-#: src/Module/Login.php:341
-msgid "Website Privacy Policy"
-msgstr "Politique de confidentialité du site internet"
+#: src/Protocol/OStatus.php:1870
+#, php-format
+msgid "%s stopped following %s."
+msgstr "%s ne suit plus %s."
 
-#: src/Module/Login.php:342
-msgid "privacy policy"
-msgstr "politique de confidentialité"
+#: src/Protocol/OStatus.php:1871
+msgid "stopped following"
+msgstr "retiré de la liste de suivi"
 
-#: src/Module/Logout.php:27
-msgid "Logged out."
-msgstr "Déconnecté."
+#: src/Util/Temporal.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "AAAA-MM-JJ ou MM-JJ"
 
-#: src/Module/Proxy.php:73
-msgid "Bad Request."
-msgstr ""
+#: src/Util/Temporal.php:298
+msgid "never"
+msgstr "jamais"
 
-#: src/Module/Register.php:83
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking \"Register\"."
-msgstr ""
+#: src/Util/Temporal.php:305
+msgid "less than a second ago"
+msgstr "il y a moins d'une seconde"
 
-#: src/Module/Register.php:84
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "Si vous n'êtes pas familier avec OpenID, laissez ce champ vide et remplissez le reste."
+#: src/Util/Temporal.php:313
+msgid "year"
+msgstr "an"
 
-#: src/Module/Register.php:85
-msgid "Your OpenID (optional): "
-msgstr "Votre OpenID (facultatif): "
+#: src/Util/Temporal.php:313
+msgid "years"
+msgstr "ans"
 
-#: src/Module/Register.php:94
-msgid "Include your profile in member directory?"
-msgstr "Inclure votre profil dans l'annuaire des membres?"
+#: src/Util/Temporal.php:314
+msgid "months"
+msgstr "mois"
 
-#: src/Module/Register.php:117
-msgid "Note for the admin"
-msgstr "Commentaire pour l'administrateur"
+#: src/Util/Temporal.php:315
+msgid "weeks"
+msgstr "semaines"
 
-#: src/Module/Register.php:117
-msgid "Leave a message for the admin, why you want to join this node"
-msgstr "Indiquez à l'administrateur les raisons de votre inscription à cette instance."
+#: src/Util/Temporal.php:316
+msgid "days"
+msgstr "jours"
 
-#: src/Module/Register.php:118
-msgid "Membership on this site is by invitation only."
-msgstr "L'inscription à ce site se fait uniquement sur invitation."
+#: src/Util/Temporal.php:317
+msgid "hour"
+msgstr "heure"
 
-#: src/Module/Register.php:119
-msgid "Your invitation code: "
-msgstr ""
+#: src/Util/Temporal.php:317
+msgid "hours"
+msgstr "heures"
 
-#: src/Module/Register.php:127
-msgid "Your Full Name (e.g. Joe Smith, real or real-looking): "
-msgstr "Votre nom complet (p. ex. Michel Dupont):"
+#: src/Util/Temporal.php:318
+msgid "minute"
+msgstr "minute"
 
-#: src/Module/Register.php:128
-msgid ""
-"Your Email Address: (Initial information will be send there, so this has to "
-"be an existing address.)"
-msgstr "Votre courriel : (Des informations de connexion vont être envoyées à cette adresse; elle doit exister)."
+#: src/Util/Temporal.php:318
+msgid "minutes"
+msgstr "minutes"
 
-#: src/Module/Register.php:130
-msgid "Leave empty for an auto generated password."
-msgstr "Laisser ce champ libre pour obtenir un mot de passe généré automatiquement."
+#: src/Util/Temporal.php:319
+msgid "second"
+msgstr "seconde"
 
-#: src/Module/Register.php:132
+#: src/Util/Temporal.php:319
+msgid "seconds"
+msgstr "secondes"
+
+#: src/Util/Temporal.php:329
 #, php-format
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be \"<strong>nickname@%s</strong>\"."
+msgid "in %1$d %2$s"
 msgstr ""
 
-#: src/Module/Register.php:133
-msgid "Choose a nickname: "
-msgstr "Choisir un pseudo : "
+#: src/Util/Temporal.php:332
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "il y a %1$d %2$s "
 
-#: src/Module/Register.php:142
-msgid "Import your profile to this friendica instance"
-msgstr "Importer votre profile dans cette instance de friendica"
+#: src/Worker/Delivery.php:453
+msgid "(no subject)"
+msgstr "(sans titre)"
 
-#: src/Module/Register.php:150
-msgid "Note: This node explicitly contains adult content"
+#: update.php:217
+#, php-format
+msgid "%s: Updating author-id and owner-id in item and thread table. "
 msgstr ""
 
-#: src/Module/Register.php:243
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "Inscription réussie. Vérifiez vos emails pour la suite des instructions."
-
-#: src/Module/Register.php:247
+#: update.php:272
 #, php-format
-msgid ""
-"Failed to send email message. Here your accout details:<br> login: %s<br> "
-"password: %s<br><br>You can change your password after login."
-msgstr "Impossible d’envoyer le courriel de confirmation. Voici vos informations de connexion:<br> identifiant : %s<br> mot de passe : %s<br><br>Vous pourrez changer votre mot de passe une fois connecté."
+msgid "%s: Updating post-type."
+msgstr ""
 
-#: src/Module/Register.php:254
-msgid "Registration successful."
-msgstr "Inscription réussie."
+#: view/theme/duepuntozero/config.php:56
+msgid "greenzero"
+msgstr "greenzero"
 
-#: src/Module/Register.php:259
-msgid "Your registration can not be processed."
-msgstr "Votre inscription ne peut être traitée."
+#: view/theme/duepuntozero/config.php:57
+msgid "purplezero"
+msgstr "purplezero"
 
-#: src/Module/Register.php:305
-msgid "Your registration is pending approval by the site owner."
-msgstr "Votre inscription attend une validation du propriétaire du site."
+#: view/theme/duepuntozero/config.php:58
+msgid "easterbunny"
+msgstr "easterbunny"
 
-#: src/Module/Tos.php:35 src/Module/Tos.php:77
-msgid ""
-"At the time of registration, and for providing communications between the "
-"user account and their contacts, the user has to provide a display name (pen"
-" name), an username (nickname) and a working email address. The names will "
-"be accessible on the profile page of the account by any visitor of the page,"
-" even if other profile details are not displayed. The email address will "
-"only be used to send the user notifications about interactions, but wont be "
-"visibly displayed. The listing of an account in the node's user directory or"
-" the global user directory is optional and can be controlled in the user "
-"settings, it is not necessary for communication."
-msgstr ""
+#: view/theme/duepuntozero/config.php:59
+msgid "darkzero"
+msgstr "darkzero"
 
-#: src/Module/Tos.php:36 src/Module/Tos.php:78
-msgid ""
-"This data is required for communication and is passed on to the nodes of the"
-" communication partners and is stored there. Users can enter additional "
-"private data that may be transmitted to the communication partners accounts."
-msgstr ""
+#: view/theme/duepuntozero/config.php:60
+msgid "comix"
+msgstr "comix"
 
-#: src/Module/Tos.php:37 src/Module/Tos.php:79
-#, php-format
-msgid ""
-"At any point in time a logged in user can export their account data from the"
-" <a href=\"%1$s/settings/uexport\">account settings</a>. If the user wants "
-"to delete their account they can do so at <a "
-"href=\"%1$s/removeme\">%1$s/removeme</a>. The deletion of the account will "
-"be permanent. Deletion of the data will also be requested from the nodes of "
-"the communication partners."
-msgstr ""
+#: view/theme/duepuntozero/config.php:61
+msgid "slackr"
+msgstr "slackr"
 
-#: src/Module/Tos.php:40 src/Module/Tos.php:76
-msgid "Privacy Statement"
-msgstr ""
+#: view/theme/duepuntozero/config.php:75
+msgid "Variations"
+msgstr "Variations"
 
-#: src/Object/Post.php:136
-msgid "This entry was edited"
-msgstr "Cette entrée a été éditée"
+#: view/theme/frio/config.php:103
+msgid "Custom"
+msgstr "Personnalisé"
 
-#: src/Object/Post.php:198
-msgid "Delete locally"
-msgstr ""
+#: view/theme/frio/config.php:115
+msgid "Note"
+msgstr "Remarque"
 
-#: src/Object/Post.php:201
-msgid "Delete globally"
-msgstr ""
+#: view/theme/frio/config.php:115
+msgid "Check image permissions if all users are allowed to see the image"
+msgstr "Vérifier que tous les utilisateurs du site sont autorisés à voir l'image."
 
-#: src/Object/Post.php:201
-msgid "Remove locally"
-msgstr ""
+#: view/theme/frio/config.php:122
+msgid "Select color scheme"
+msgstr "Choisir le schéma de couleurs"
 
-#: src/Object/Post.php:215
-msgid "save to folder"
-msgstr "sauver vers dossier"
+#: view/theme/frio/config.php:123
+msgid "Navigation bar background color"
+msgstr "Couleur d'arrière-plan de la barre de navigation"
 
-#: src/Object/Post.php:250
-msgid "I will attend"
-msgstr "Je vais participer"
+#: view/theme/frio/config.php:124
+msgid "Navigation bar icon color "
+msgstr "Couleur des icônes de la barre de navigation"
 
-#: src/Object/Post.php:250
-msgid "I will not attend"
-msgstr "Je ne vais pas participer"
+#: view/theme/frio/config.php:125
+msgid "Link color"
+msgstr "Couleur des liens"
 
-#: src/Object/Post.php:250
-msgid "I might attend"
-msgstr "Je vais peut-être participer"
+#: view/theme/frio/config.php:126
+msgid "Set the background color"
+msgstr "Couleur d'arrière-plan"
 
-#: src/Object/Post.php:278
-msgid "ignore thread"
-msgstr "ignorer le fil"
+#: view/theme/frio/config.php:127
+msgid "Content background opacity"
+msgstr "Opacité du contenu d'arrière-plan"
 
-#: src/Object/Post.php:279
-msgid "unignore thread"
-msgstr "Ne plus ignorer le fil"
+#: view/theme/frio/config.php:128
+msgid "Set the background image"
+msgstr "Image d'arrière-plan"
 
-#: src/Object/Post.php:280
-msgid "toggle ignore status"
-msgstr "Ignorer le statut"
+#: view/theme/frio/config.php:129
+msgid "Background image style"
+msgstr "Style de l'image de fond"
 
-#: src/Object/Post.php:291
-msgid "add star"
-msgstr "mettre en avant"
+#: view/theme/frio/config.php:134
+msgid "Login page background image"
+msgstr "Image de fond de la page de login"
 
-#: src/Object/Post.php:292
-msgid "remove star"
-msgstr "ne plus mettre en avant"
+#: view/theme/frio/config.php:138
+msgid "Login page background color"
+msgstr "Couleur d'arrière-plan de la page de login"
 
-#: src/Object/Post.php:293
-msgid "toggle star status"
-msgstr "mettre en avant"
+#: view/theme/frio/config.php:138
+msgid "Leave background image and color empty for theme defaults"
+msgstr "Laisser l'image et la couleur de fond vides pour les paramètres par défaut du thème"
 
-#: src/Object/Post.php:296
-msgid "starred"
-msgstr "mis en avant"
+#: view/theme/frio/php/Image.php:24
+msgid "Top Banner"
+msgstr "Bannière du haut"
 
-#: src/Object/Post.php:300
-msgid "add tag"
-msgstr "ajouter une étiquette"
+#: view/theme/frio/php/Image.php:24
+msgid ""
+"Resize image to the width of the screen and show background color below on "
+"long pages."
+msgstr "Redimensionner l'image à la largeur de l'écran et combler en dessous avec la couleur d'arrière plan."
 
-#: src/Object/Post.php:311
-msgid "like"
-msgstr "aime"
+#: view/theme/frio/php/Image.php:25
+msgid "Full screen"
+msgstr "Plein écran"
 
-#: src/Object/Post.php:312
-msgid "dislike"
-msgstr "n'aime pas"
+#: view/theme/frio/php/Image.php:25
+msgid ""
+"Resize image to fill entire screen, clipping either the right or the bottom."
+msgstr "Agrandir l'image pour remplir l'écran, jusqu'à toucher le bord droit ou le bas de l'écran."
 
-#: src/Object/Post.php:315
-msgid "Share this"
-msgstr "Partager"
+#: view/theme/frio/php/Image.php:26
+msgid "Single row mosaic"
+msgstr "Mosaïque sur un rang"
 
-#: src/Object/Post.php:315
-msgid "share"
-msgstr "partager"
+#: view/theme/frio/php/Image.php:26
+msgid ""
+"Resize image to repeat it on a single row, either vertical or horizontal."
+msgstr "Redimensionner l'image pour la dupliquer sur un seul rang, vertical ou horizontal."
 
-#: src/Object/Post.php:382
-msgid "to"
-msgstr "à"
+#: view/theme/frio/php/Image.php:27
+msgid "Mosaic"
+msgstr "Mosaïque"
 
-#: src/Object/Post.php:383
-msgid "via"
-msgstr "via"
+#: view/theme/frio/php/Image.php:27
+msgid "Repeat image to fill the screen."
+msgstr "Dupliquer l'image pour couvrir l'écran."
 
-#: src/Object/Post.php:384
-msgid "Wall-to-Wall"
-msgstr "Inter-mur"
+#: view/theme/frio/theme.php:239
+msgid "Guest"
+msgstr "Invité"
 
-#: src/Object/Post.php:385
-msgid "via Wall-To-Wall:"
-msgstr "en Inter-mur :"
+#: view/theme/frio/theme.php:244
+msgid "Visitor"
+msgstr "Visiteur"
 
-#: src/Object/Post.php:432
-msgid "Notifier task is pending"
-msgstr ""
+#: view/theme/quattro/config.php:77
+msgid "Alignment"
+msgstr "Alignement"
 
-#: src/Object/Post.php:433
-msgid "Delivery to remote servers is pending"
-msgstr ""
+#: view/theme/quattro/config.php:77
+msgid "Left"
+msgstr "Gauche"
 
-#: src/Object/Post.php:434
-msgid "Delivery to remote servers is underway"
-msgstr ""
+#: view/theme/quattro/config.php:77
+msgid "Center"
+msgstr "Centre"
 
-#: src/Object/Post.php:435
-msgid "Delivery to remote servers is mostly done"
-msgstr ""
+#: view/theme/quattro/config.php:78
+msgid "Color scheme"
+msgstr "Palette de couleurs"
 
-#: src/Object/Post.php:436
-msgid "Delivery to remote servers is done"
-msgstr ""
+#: view/theme/quattro/config.php:79
+msgid "Posts font size"
+msgstr "Taille de texte des publications"
 
-#: src/Object/Post.php:455
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d commentaire"
-msgstr[1] "%d commentaires"
+#: view/theme/quattro/config.php:80
+msgid "Textareas font size"
+msgstr "Taille de police des zones de texte"
 
-#: src/App.php:665
-msgid "Delete this item?"
-msgstr "Effacer cet élément?"
+#: view/theme/vier/config.php:76
+msgid "Comma separated list of helper forums"
+msgstr "Liste de forums d'aide, séparés par des virgules"
 
-#: src/App.php:667
-msgid "show fewer"
-msgstr "montrer moins"
+#: view/theme/vier/config.php:123
+msgid "Set style"
+msgstr "Définir le style"
 
-#: src/App.php:709
-msgid "toggle mobile"
-msgstr "activ. mobile"
+#: view/theme/vier/config.php:124
+msgid "Community Pages"
+msgstr "Pages de Communauté"
 
-#: src/App.php:1077
-msgid "No system theme config value set."
-msgstr ""
+#: view/theme/vier/config.php:125 view/theme/vier/theme.php:151
+msgid "Community Profiles"
+msgstr "Profils communautaires"
 
-#: src/BaseModule.php:133
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "Le jeton de sécurité du formulaire n'est pas correct. Ceci veut probablement dire que le formulaire est resté ouvert trop longtemps (plus de 3 heures) avant d'être validé."
+#: view/theme/vier/config.php:126
+msgid "Help or @NewHere ?"
+msgstr "Aide ou @NewHere?"
 
-#: src/LegacyModule.php:30
-#, php-format
-msgid "Legacy module file not found: %s"
-msgstr ""
+#: view/theme/vier/config.php:127 view/theme/vier/theme.php:373
+msgid "Connect Services"
+msgstr "Connecter des services"
 
-#: update.php:217
-#, php-format
-msgid "%s: Updating author-id and owner-id in item and thread table. "
-msgstr ""
+#: view/theme/vier/config.php:128
+msgid "Find Friends"
+msgstr "Trouver des amis"
 
-#: update.php:272
-#, php-format
-msgid "%s: Updating post-type."
-msgstr ""
+#: view/theme/vier/config.php:129 view/theme/vier/theme.php:181
+msgid "Last users"
+msgstr "Derniers utilisateurs"
+
+#: view/theme/vier/theme.php:288
+msgid "Quick Start"
+msgstr "Démarrage rapide"
index 6f4943a978bb259205bdfa46bcb778282fad386a..b4efeaf13cb2d616fb179dfffff979ac5c509a42 100644 (file)
@@ -7,8 +7,8 @@ function string_plural_select_fr($n){
 }}
 ;
 $a->strings["Daily posting limit of %d post reached. The post was rejected."] = [
-       0 => "Limite quotidienne de publications de%d atteinte. La publication a été rejetée.",
-       1 => "Limite quotidienne de %dpublications atteinte.  La publication a été rejetée.",
+       0 => "Limite quotidienne d'%d publication atteinte. La publication a été rejetée.",
+       1 => "Limite quotidienne de %d publications atteinte.  La publication a été rejetée.",
 ];
 $a->strings["Weekly posting limit of %d post reached. The post was rejected."] = [
        0 => "Limite hebdomadaire d'%d unique publication atteinte, votre soumission a été rejetée.",
@@ -195,10 +195,6 @@ $a->strings["Yes"] = "Oui";
 $a->strings["Permission denied."] = "Permission refusée.";
 $a->strings["Archives"] = "Archives";
 $a->strings["show more"] = "montrer plus";
-$a->strings["You must be logged in to use addons. "] = "Vous devez être connecté pour utiliser les greffons.";
-$a->strings["Applications"] = "Applications";
-$a->strings["No installed applications."] = "Pas d'application installée.";
-$a->strings["System down for maintenance"] = "Système indisponible pour cause de maintenance";
 $a->strings["Theme settings updated."] = "Réglages du thème sauvés.";
 $a->strings["Information"] = "Information";
 $a->strings["Overview"] = "Synthèse";
@@ -442,8 +438,8 @@ $a->strings["Posts per user on community page"] = "Nombre de publications par ut
 $a->strings["The maximum number of posts per user on the community page. (Not valid for 'Global Community')"] = "Nombre maximal de publications par utilisateurs sur la page de la communauté (ne s'applique pas pour « Communauté globale »).";
 $a->strings["Disable OStatus support"] = "Désactiver OStatus";
 $a->strings["Disable built-in OStatus (StatusNet, GNU Social etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Désactive le support natif d'OStatus (StatusNet, GNU Social, etc...). Toutes les communications via OStatus sont publiques, donc des avertissements de protection de vie privée sont régulièrement affichés.";
-$a->strings["Only import OStatus/ActivityPub threads from our contacts"] = "";
-$a->strings["Normally we import every content from our OStatus and ActivityPub contacts. With this option we only store threads that are started by a contact that is known on our system."] = "";
+$a->strings["Only import OStatus/ActivityPub threads from our contacts"] = "Importer seulement les conversations OStatus/ActivityPub provenant de profils distants connus.";
+$a->strings["Normally we import every content from our OStatus and ActivityPub contacts. With this option we only store threads that are started by a contact that is known on our system."] = "Normalement toutes les conversations auxquelles les contacts suivis participent sont importées en entier peu importe l'auteur original. Avec cette option, seules les conversations démarrées par un contact suivi sont importées.";
 $a->strings["OStatus support can only be enabled if threading is enabled."] = "Le support OStatus ne peut être activé que si l'imbrication des commentaires est activée.";
 $a->strings["Diaspora support can't be enabled because Friendica was installed into a sub directory."] = "Le support de Diaspora ne peut pas être activé parce que Friendica a été installé dans un sous-répertoire.";
 $a->strings["Enable Diaspora support"] = "Activer le support de Diaspora";
@@ -460,10 +456,10 @@ $a->strings["Maximum Load Average"] = "Plafond de la charge moyenne";
 $a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Charge système maximale à partir de laquelle l'émission et la réception seront soumises à un délai supplémentaire. Par défaut, 50.";
 $a->strings["Maximum Load Average (Frontend)"] = "Plafond de la charge moyenne (frontale)";
 $a->strings["Maximum system load before the frontend quits service - default 50."] = "Limite de charge système pour le rendu des pages - défaut 50.";
-$a->strings["Minimal Memory"] = "";
-$a->strings["Minimal free memory in MB for the worker. Needs access to /proc/meminfo - default 0 (deactivated)."] = "";
+$a->strings["Minimal Memory"] = "Mémoire minimum";
+$a->strings["Minimal free memory in MB for the worker. Needs access to /proc/meminfo - default 0 (deactivated)."] = "Mémoire libre minimale pour les tâches de fond (en Mo). Requiert l'accès à <code>/proc/meminfo</code>. La valeur par défaut est 0 (désactivé).";
 $a->strings["Maximum table size for optimization"] = "Limite de taille de table pour l'optimisation";
-$a->strings["Maximum table size (in MB) for the automatic optimization. Enter -1 to disable it."] = "";
+$a->strings["Maximum table size (in MB) for the automatic optimization. Enter -1 to disable it."] = "Limite de taille de table (en Mo) pour l'optimisation automatique. -1 pour désactiver cette limite.";
 $a->strings["Minimum level of fragmentation"] = "Seuil de fragmentation";
 $a->strings["Minimum fragmenation level to start the automatic optimization - default value is 30%."] = "Seuil de fragmentation pour que l'optimisation automatique se déclenche - défaut 30%.";
 $a->strings["Periodical check of global contacts"] = "Vérification périodique des contacts globaux";
@@ -471,7 +467,7 @@ $a->strings["If enabled, the global contacts are checked periodically for missin
 $a->strings["Days between requery"] = "Nombre de jours entre les requêtes";
 $a->strings["Number of days after which a server is requeried for his contacts."] = "Nombre de jours avant qu'une requête de contacts soient envoyée à nouveau à un serveur.";
 $a->strings["Discover contacts from other servers"] = "Découvrir des contacts des autres serveurs";
-$a->strings["Periodically query other servers for contacts. You can choose between 'users': the users on the remote system, 'Global Contacts': active contacts that are known on the system. The fallback is meant for Redmatrix servers and older friendica servers, where global contacts weren't available. The fallback increases the server load, so the recommended setting is 'Users, Global Contacts'."] = "";
+$a->strings["Periodically query other servers for contacts. You can choose between 'users': the users on the remote system, 'Global Contacts': active contacts that are known on the system. The fallback is meant for Redmatrix servers and older friendica servers, where global contacts weren't available. The fallback increases the server load, so the recommended setting is 'Users, Global Contacts'."] = "Demande régulièrement les serveurs distants connus une liste de profils distants. \"Utilisateurs\" concerne les utilisateurs locaux du serveur distant, \"Contacts Globaux\" concerne tous les profils dont le serveur distant a connaissance. \"Alternative\" est prévu pour les serveurs RedMatrix et les versions obsolètes de Friendica. Ce choix augmente significativement la charge serveur, donc le choix recommendé est \"Utilisateurs, Contacts Globaux\".";
 $a->strings["Timeframe for fetching global contacts"] = "Fréquence de récupération des contacts globaux";
 $a->strings["When the discovery is activated, this value defines the timeframe for the activity of the global contacts that are fetched from other servers."] = "Quand la découverte de contacts est activée, cette valeur détermine la fréquence de récupération des données des contacts globaux présents sur d'autres serveurs.";
 $a->strings["Search the local directory"] = "Chercher dans le répertoire local";
@@ -482,16 +478,16 @@ $a->strings["Check upstream version"] = "Mises à jour";
 $a->strings["Enables checking for new Friendica versions at github. If there is a new version, you will be informed in the admin panel overview."] = "Permet de vérifier la présence de nouvelles versions de Friendica sur github. Si une nouvelle version est disponible, vous recevrez une notification dans l'interface d'administration.";
 $a->strings["Suppress Tags"] = "Masquer les tags";
 $a->strings["Suppress showing a list of hashtags at the end of the posting."] = "Ne pas afficher la liste des hashtags à la fin d’un message.";
-$a->strings["Clean database"] = "";
-$a->strings["Remove old remote items, orphaned database records and old content from some other helper tables."] = "";
-$a->strings["Lifespan of remote items"] = "";
-$a->strings["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."] = "";
-$a->strings["Lifespan of unclaimed items"] = "";
-$a->strings["When the database cleanup is enabled, this defines the days after which unclaimed remote items (mostly content from the relay) will be deleted. Default value is 90 days. Defaults to the general lifespan value of remote items if set to 0."] = "";
-$a->strings["Lifespan of raw conversation data"] = "";
-$a->strings["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."] = "";
+$a->strings["Clean database"] = "Nettoyer la base de données";
+$a->strings["Remove old remote items, orphaned database records and old content from some other helper tables."] = "Supprime les conversations distantes anciennes, les enregistrements orphelins et le contenu obsolète de certaines tables de débogage.";
+$a->strings["Lifespan of remote items"] = "Durée de vie des conversations distantes";
+$a->strings["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."] = "Si le nettoyage de la base de donnée est actif, cette valeur représente le délai en jours après lequel les conversations distantes sont supprimées. Les conversations démarrées par un utilisateur local, étoilées ou archivées sont toujours conservées. 0 pour désactiver.";
+$a->strings["Lifespan of unclaimed items"] = "Durée de vie des conversations relayées";
+$a->strings["When the database cleanup is enabled, this defines the days after which unclaimed remote items (mostly content from the relay) will be deleted. Default value is 90 days. Defaults to the general lifespan value of remote items if set to 0."] = "Si le nettoyage de la base de donnée est actif, cette valeur représente le délai en jours après lequel les conversations relayées qui n'ont pas reçu d'interactions locales sont supprimées. La valeur par défaut est 90 jours. 0 pour aligner cette valeur sur la durée de vie des conversations distantes.";
+$a->strings["Lifespan of raw conversation data"] = "Durée de vie des méta-données de conversation";
+$a->strings["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."] = "Cette valeur représente le délai en jours après lequel les méta-données de conversations sont supprimées. Ces méta-données sont utilisées par les protocoles ActivityPub et OStatus, et pour le débogage. Il est prudent de conserver ces meta-données pendant au moins 14 jours. La valeur par défaut est 90 jours.";
 $a->strings["Path to item cache"] = "Chemin vers le cache des objets.";
-$a->strings["The item caches buffers generated bbcode and external images."] = "";
+$a->strings["The item caches buffers generated bbcode and external images."] = "Le cache de publications contient des textes HTML de BBCode compil's et une copie de chaque image distante.";
 $a->strings["Cache duration in seconds"] = "Durée du cache en secondes";
 $a->strings["How long should the cache files be hold? Default value is 86400 seconds (One day). To disable the item cache, set the value to -1."] = "Combien de temps les fichiers de cache doivent être maintenu? La valeur par défaut est 86400 secondes (une journée). Pour désactiver le cache de l'item, définissez la valeur à -1.";
 $a->strings["Maximum numbers of comments per post"] = "Nombre maximum de commentaires par publication";
@@ -501,37 +497,37 @@ $a->strings["If you have a restricted system where the webserver can't access th
 $a->strings["Base path to installation"] = "Chemin de base de l'installation";
 $a->strings["If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot."] = "Si le système ne peut pas détecter le chemin de l'installation, entrez le bon chemin ici. Ce paramètre doit être utilisé uniquement si vous avez des accès restreints à votre système et que vous n'avez qu'un lien symbolique vers le répertoire web.";
 $a->strings["Disable picture proxy"] = "Désactiver le proxy image ";
-$a->strings["The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwidth."] = "";
+$a->strings["The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwidth."] = "Le proxy d'image améliore les performances d'affichage et protège la vie privée des utilisateurs locaux. Il n'est pas recommandé de l'activer sur un serveur avec une bande passante limitée.";
 $a->strings["Only search in tags"] = "Rechercher seulement dans les étiquettes";
 $a->strings["On large systems the text search can slow down the system extremely."] = "La recherche textuelle peut ralentir considérablement les systèmes de grande taille.";
 $a->strings["New base url"] = "Nouvelle URL de base";
-$a->strings["Change base url for this server. Sends relocate message to all Friendica and Diaspora* contacts of all users."] = "";
+$a->strings["Change base url for this server. Sends relocate message to all Friendica and Diaspora* contacts of all users."] = "Changer l'URL de base de ce serveur. Envoie un message de déménagement à tous les contacts Friendica et Diaspora des utilisateurs locaux.";
 $a->strings["RINO Encryption"] = "Chiffrement RINO";
 $a->strings["Encryption layer between nodes."] = "Couche de chiffrement entre les nœuds du réseau.";
-$a->strings["Enabled"] = "";
+$a->strings["Enabled"] = "Activé";
 $a->strings["Maximum number of parallel workers"] = "Nombre maximum de processus simultanés";
-$a->strings["On shared hosters set this to %d. On larger systems, values of %d are great. Default value is %d."] = "";
+$a->strings["On shared hosters set this to %d. On larger systems, values of %d are great. Default value is %d."] = "Sur un hébergement partagé, mettez %d. Sur des serveurs plus puissants, %d est optimal. La valeur par défaut est %d.";
 $a->strings["Don't use 'proc_open' with the worker"] = "Ne pas utiliser 'proc_open' pour les tâches de fond";
 $a->strings["Enable this if your system doesn't allow the use of 'proc_open'. This can happen on shared hosters. If this is enabled you should increase the frequency of worker calls in your crontab."] = "Activez cette option si votre système ne permet pas d'utiliser 'proc_open'. Cela peut être le cas sur les hébergements partagés. Si vous activez cette option, vous devriez augmenter la fréquence d'appel du \"worker\" dans crontab.";
-$a->strings["Enable fastlane"] = "";
-$a->strings["When enabed, the fastlane mechanism starts an additional worker if processes with higher priority are blocked by processes of lower priority."] = "";
-$a->strings["Enable frontend worker"] = "";
-$a->strings["When enabled the Worker process is triggered when backend access is performed \\x28e.g. messages being delivered\\x29. On smaller sites you might want to call %s/worker on a regular basis via an external cron job. You should only enable this option if you cannot utilize cron/scheduled jobs on your server."] = "";
-$a->strings["Subscribe to relay"] = "";
-$a->strings["Enables the receiving of public posts from the relay. They will be included in the search, subscribed tags and on the global community page."] = "";
-$a->strings["Relay server"] = "";
-$a->strings["Address of the relay server where public posts should be send to. For example https://relay.diasp.org"] = "";
-$a->strings["Direct relay transfer"] = "";
-$a->strings["Enables the direct transfer to other servers without using the relay servers"] = "";
-$a->strings["Relay scope"] = "";
-$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["all"] = "";
-$a->strings["tags"] = "";
-$a->strings["Server tags"] = "";
-$a->strings["Comma separated list of tags for the 'tags' subscription."] = "";
-$a->strings["Allow user tags"] = "";
-$a->strings["If enabled, the tags from the saved searches will used for the 'tags' subscription in addition to the 'relay_server_tags'."] = "";
-$a->strings["Start Relocation"] = "";
+$a->strings["Enable fastlane"] = "Activer la file prioritaire";
+$a->strings["When enabed, the fastlane mechanism starts an additional worker if processes with higher priority are blocked by processes of lower priority."] = "La file prioritaire est un ouvrier additionel démarré quand des tâches de fondde grande importance sont bloquées par des tâches de moindre importance dans la file d'attente.";
+$a->strings["Enable frontend worker"] = "Activer l'ouvrier manuel";
+$a->strings["When enabled the Worker process is triggered when backend access is performed \\x28e.g. messages being delivered\\x29. On smaller sites you might want to call %s/worker on a regular basis via an external cron job. You should only enable this option if you cannot utilize cron/scheduled jobs on your server."] = "L'ouvrier manuel est lancé à la réception de messages distants. Sur un petit serveur il est conseillé d'ouvrir %s/worker régulièrement via une tâche planifée. Vous ne devriez activer cette option que si vous ne pouvez pas définir de tâches récurrentes sur votre serveur,";
+$a->strings["Subscribe to relay"] = "S'abonner au relai";
+$a->strings["Enables the receiving of public posts from the relay. They will be included in the search, subscribed tags and on the global community page."] = "Active la réception de conversations publiques relayées. Elles sont affichées dans la page de recherche, les recherches enregistrées et dans la page de communauté globale.";
+$a->strings["Relay server"] = "Serveur relai";
+$a->strings["Address of the relay server where public posts should be send to. For example https://relay.diasp.org"] = "URL du serveur relai auquel les conversations publique locales doivent être soumises.";
+$a->strings["Direct relay transfer"] = "Relai direct";
+$a->strings["Enables the direct transfer to other servers without using the relay servers"] = "Soumet les conversations publiques aux serveurs distants sans passer par le serveur relai.";
+$a->strings["Relay scope"] = "Filtre du relai";
+$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."] = "\"Tous\" signifie que toutes les conversations publiques en provenance du relai sont acceptées. \"Tags\" signifie que seules les conversations comportant les tags suivants sont acceptées.";
+$a->strings["all"] = "Tous";
+$a->strings["tags"] = "Tags";
+$a->strings["Server tags"] = "Tags de filtre du relai";
+$a->strings["Comma separated list of tags for the 'tags' subscription."] = "Liste de tags séparés par des virgules pour le filtre de relai.";
+$a->strings["Allow user tags"] = "Inclure les tags des utilisateurs";
+$a->strings["If enabled, the tags from the saved searches will used for the 'tags' subscription in addition to the 'relay_server_tags'."] = "Inclut les tags des recherches enregistrées des utilisateurs au filtre de relai.";
+$a->strings["Start Relocation"] = "Démarrer le déménagement";
 $a->strings["Update has been marked successful"] = "Mise-à-jour validée comme 'réussie'";
 $a->strings["Database structure update %s was successfully applied."] = "La structure de base de données pour la mise à jour %s a été appliquée avec succès.";
 $a->strings["Executing of database structure update %s failed with error: %s"] = "L'exécution de la mise à jour %s pour la structure de base de données a échoué avec l'erreur: %s";
@@ -552,7 +548,7 @@ $a->strings["%s user blocked/unblocked"] = [
        0 => "%s utilisateur a (dé)bloqué",
        1 => "%s utilisateurs ont (dé)bloqué",
 ];
-$a->strings["You can't remove yourself"] = "";
+$a->strings["You can't remove yourself"] = "Vous ne pouvez pas supprimer votre propre compte";
 $a->strings["%s user deleted"] = [
        0 => "%s utilisateur supprimé",
        1 => "%s utilisateurs supprimés",
@@ -564,50 +560,50 @@ $a->strings["Normal Account Page"] = "Compte normal";
 $a->strings["Soapbox Page"] = "Compte \"boîte à savon\"";
 $a->strings["Public Forum"] = "Forum public";
 $a->strings["Automatic Friend Page"] = "Compte d' \"amitié automatique\"";
-$a->strings["Private Forum"] = "";
+$a->strings["Private Forum"] = "Forum Privé";
 $a->strings["Personal Page"] = "Page personnelle";
-$a->strings["Organisation Page"] = "";
+$a->strings["Organisation Page"] = "Page Associative";
 $a->strings["News Page"] = "Page d'informations";
-$a->strings["Community Forum"] = "";
-$a->strings["Relay"] = "";
+$a->strings["Community Forum"] = "Forum Communautaire";
+$a->strings["Relay"] = "Relai";
 $a->strings["Email"] = "Courriel";
 $a->strings["Register date"] = "Date d'inscription";
 $a->strings["Last login"] = "Dernière connexion";
 $a->strings["Last item"] = "Dernier élément";
-$a->strings["Type"] = "";
+$a->strings["Type"] = "Type";
 $a->strings["Add User"] = "Ajouter l'utilisateur";
 $a->strings["User registrations waiting for confirm"] = "Inscriptions d'utilisateurs en attente de confirmation";
 $a->strings["User waiting for permanent deletion"] = "Utilisateur en attente de suppression définitive";
 $a->strings["Request date"] = "Date de la demande";
 $a->strings["No registrations."] = "Pas d'inscriptions.";
-$a->strings["Note from the user"] = "";
+$a->strings["Note from the user"] = "Message personnel";
 $a->strings["Approve"] = "Approuver";
 $a->strings["Deny"] = "Rejetter";
-$a->strings["User blocked"] = "";
+$a->strings["User blocked"] = "Utilisateur bloqué";
 $a->strings["Site admin"] = "Administration du Site";
 $a->strings["Account expired"] = "Compte expiré";
 $a->strings["New User"] = "Nouvel utilisateur";
-$a->strings["Permanent deletion"] = "";
+$a->strings["Permanent deletion"] = "Suppression définitive";
 $a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les utilisateurs sélectionnés vont être supprimés!\\n\\nTout ce qu'ils ont posté sur ce site sera définitivement effacé!\\n\\nÊtes-vous certain?";
 $a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utilisateur {0} va être supprimé!\\n\\nTout ce qu'il a posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?";
 $a->strings["Name of the new user."] = "Nom du nouvel utilisateur.";
 $a->strings["Nickname"] = "Pseudo";
 $a->strings["Nickname of the new user."] = "Pseudo du nouvel utilisateur.";
 $a->strings["Email address of the new user."] = "Adresse mail du nouvel utilisateur.";
-$a->strings["Addon %s disabled."] = "";
-$a->strings["Addon %s enabled."] = "";
+$a->strings["Addon %s disabled."] = "Add-on %s désactivé.";
+$a->strings["Addon %s enabled."] = "Add-on %s activé.";
 $a->strings["Disable"] = "Désactiver";
 $a->strings["Enable"] = "Activer";
 $a->strings["Toggle"] = "Activer/Désactiver";
 $a->strings["Settings"] = "Réglages";
 $a->strings["Author: "] = "Auteur : ";
 $a->strings["Maintainer: "] = "Mainteneur : ";
-$a->strings["Reload active addons"] = "";
-$a->strings["There are currently no addons available on your node. You can find the official addon repository at %1\$s and might find other interesting addons in the open addon registry at %2\$s"] = "";
+$a->strings["Reload active addons"] = "Recharger les add-ons activés.";
+$a->strings["There are currently no addons available on your node. You can find the official addon repository at %1\$s and might find other interesting addons in the open addon registry at %2\$s"] = "Il n'y a pas d'add-on disponible sur votre serveur. Vous pouvez trouver le dépôt officiel d'add-ons sur %1\$s et des add-ons non-officiel dans le répertoire d'add-ons ouvert sur %2\$s.";
 $a->strings["No themes found."] = "Aucun thème trouvé.";
 $a->strings["Screenshot"] = "Capture d'écran";
 $a->strings["Reload active themes"] = "Recharger les thèmes actifs";
-$a->strings["No themes found on the system. They should be placed in %1\$s"] = "";
+$a->strings["No themes found on the system. They should be placed in %1\$s"] = "Aucun thème trouvé. Leur emplacement d'installation est%1\$s.";
 $a->strings["[Experimental]"] = "[Expérimental]";
 $a->strings["[Unsupported]"] = "[Non supporté]";
 $a->strings["Log settings updated."] = "Réglages des journaux mis-à-jour.";
@@ -619,9 +615,9 @@ $a->strings["Log file"] = "Fichier de journaux";
 $a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "Accès en écriture par le serveur web requis. Relatif à la racine de votre installation de Friendica.";
 $a->strings["Log level"] = "Niveau de journalisaton";
 $a->strings["PHP logging"] = "Log PHP";
-$a->strings["To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."] = "";
-$a->strings["Error trying to open <strong>%1\$s</strong> log file.\\r\\n<br/>Check to see if file %1\$s exist and is readable."] = "";
-$a->strings["Couldn't open <strong>%1\$s</strong> log file.\\r\\n<br/>Check to see if file %1\$s is readable."] = "";
+$a->strings["To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."] = "Pour activer temporairement la journalisation de PHP vous pouvez insérez les lignes suivantes au début du fichier <code>index.php</code> dans votre répertoire Friendica. The nom de fichier défini dans la ligne <code>'error_log'</code> est relatif au répertoire d'installation de Friendica et le serveur web doit avoir le droit d'écriture sur ce fichier. Les lignes <code>log_errors</code> et <code>display_errors</code> prennent les valeurs <code>0</code>  et <code>1</code> respectivement pour les activer ou désactiver.";
+$a->strings["Error trying to open <strong>%1\$s</strong> log file.\\r\\n<br/>Check to see if file %1\$s exist and is readable."] = "Erreur lors de l'ouverture du fichier de journal <strong>%1\$s</strong>.\\r\\n<br/>Veuillez vérifier que le fichier %1\$s existe et que le serveur web a le droit de lecture dessus.";
+$a->strings["Couldn't open <strong>%1\$s</strong> log file.\\r\\n<br/>Check to see if file %1\$s is readable."] = "Erreur lors de l'ouverture du fichier de journal <strong>%1\$s</strong>.\\r\\n<br/>Veuillez vérifier que le fichier %1\$s existe et que le serveur web a le droit de lecture dessus.";
 $a->strings["Off"] = "Éteint";
 $a->strings["On"] = "Allumé";
 $a->strings["Lock feature %s"] = "Verouiller la fonctionnalité %s";
@@ -633,34 +629,37 @@ $a->strings["Return to your app and insert this Securty Code:"] = "Retournez à
 $a->strings["Please login to continue."] = "Merci de vous connecter pour continuer.";
 $a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à créer des billets à votre place?";
 $a->strings["No"] = "Non";
-$a->strings["Source input"] = "";
-$a->strings["BBCode::toPlaintext"] = "";
-$a->strings["BBCode::convert (raw HTML)"] = "";
-$a->strings["BBCode::convert"] = "";
-$a->strings["BBCode::convert => HTML::toBBCode"] = "";
-$a->strings["BBCode::toMarkdown"] = "";
-$a->strings["BBCode::toMarkdown => Markdown::convert"] = "";
-$a->strings["BBCode::toMarkdown => Markdown::toBBCode"] = "";
-$a->strings["BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"] = "";
-$a->strings["Item Body"] = "";
-$a->strings["Item Tags"] = "";
-$a->strings["Source input (Diaspora format)"] = "";
-$a->strings["Markdown::convert (raw HTML)"] = "";
-$a->strings["Markdown::convert"] = "";
-$a->strings["Markdown::toBBCode"] = "";
-$a->strings["Raw HTML input"] = "";
-$a->strings["HTML Input"] = "";
-$a->strings["HTML::toBBCode"] = "";
-$a->strings["HTML::toBBCode => BBCode::convert"] = "";
-$a->strings["HTML::toBBCode => BBCode::convert (raw HTML)"] = "";
-$a->strings["HTML::toMarkdown"] = "";
-$a->strings["HTML::toPlaintext"] = "";
-$a->strings["Source text"] = "";
-$a->strings["BBCode"] = "";
-$a->strings["Markdown"] = "";
-$a->strings["HTML"] = "";
+$a->strings["You must be logged in to use addons. "] = "Vous devez être connecté pour utiliser les greffons.";
+$a->strings["Applications"] = "Applications";
+$a->strings["No installed applications."] = "Pas d'application installée.";
+$a->strings["Source input"] = "Saisie source";
+$a->strings["BBCode::toPlaintext"] = "BBCode::toPlaintext";
+$a->strings["BBCode::convert (raw HTML)"] = "BBCode::convert (code HTML)";
+$a->strings["BBCode::convert"] = "BBCode::convert";
+$a->strings["BBCode::convert => HTML::toBBCode"] = "BBCode::convert => HTML::toBBCode";
+$a->strings["BBCode::toMarkdown"] = "BBCode::toMarkdown";
+$a->strings["BBCode::toMarkdown => Markdown::convert"] = "BBCode::toMarkdown => Markdown::convert";
+$a->strings["BBCode::toMarkdown => Markdown::toBBCode"] = "BBCode::toMarkdown => Markdown::toBBCode";
+$a->strings["BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode"] = "BBCode::toMarkdown =>  Markdown::convert => HTML::toBBCode";
+$a->strings["Item Body"] = "Corps du message";
+$a->strings["Item Tags"] = "Tags du messages";
+$a->strings["Source input (Diaspora format)"] = "Saisie source (format Diaspora)";
+$a->strings["Markdown::convert (raw HTML)"] = "Markdown::convert (code HTML)";
+$a->strings["Markdown::convert"] = "Markdown::convert";
+$a->strings["Markdown::toBBCode"] = "Markdown::toBBCode";
+$a->strings["Raw HTML input"] = "Saisie code HTML";
+$a->strings["HTML Input"] = "Code HTML";
+$a->strings["HTML::toBBCode"] = "HTML::toBBCode";
+$a->strings["HTML::toBBCode => BBCode::convert"] = "HTML::toBBCode => BBCode::convert";
+$a->strings["HTML::toBBCode => BBCode::convert (raw HTML)"] = "HTML::toBBCode => BBCode::convert (code HTML)";
+$a->strings["HTML::toMarkdown"] = "HTML::toMarkdown";
+$a->strings["HTML::toPlaintext"] = "HTML::toPlaintext";
+$a->strings["Source text"] = "Texte source";
+$a->strings["BBCode"] = "BBCode";
+$a->strings["Markdown"] = "Markdown";
+$a->strings["HTML"] = "HTML";
 $a->strings["Login"] = "Connexion";
-$a->strings["Bad Request"] = "";
+$a->strings["Bad Request"] = "Requête erronée";
 $a->strings["The post was created"] = "La publication a été créée";
 $a->strings["Access denied."] = "Accès refusé.";
 $a->strings["Page not found."] = "Page introuvable.";
@@ -673,7 +672,7 @@ $a->strings["today"] = "aujourd'hui";
 $a->strings["month"] = "mois";
 $a->strings["week"] = "semaine";
 $a->strings["day"] = "jour";
-$a->strings["list"] = "";
+$a->strings["list"] = "liste";
 $a->strings["User not found"] = "Utilisateur introuvable";
 $a->strings["This calendar format is not supported"] = "Format de calendrier inconnu";
 $a->strings["No exportable data found"] = "Rien à exporter";
@@ -681,14 +680,14 @@ $a->strings["calendar"] = "calendrier";
 $a->strings["No contacts in common."] = "Pas de contacts en commun.";
 $a->strings["Common Friends"] = "Amis communs";
 $a->strings["Public access denied."] = "Accès public refusé.";
-$a->strings["Community option not available."] = "";
+$a->strings["Community option not available."] = "L'option communauté n'est pas disponible";
 $a->strings["Not available."] = "Indisponible.";
-$a->strings["Local Community"] = "";
-$a->strings["Posts from local users on this server"] = "";
-$a->strings["Global Community"] = "";
-$a->strings["Posts from users of the whole federated network"] = "";
+$a->strings["Local Community"] = "Communauté locale";
+$a->strings["Posts from local users on this server"] = "Conversations publiques démarrées par des utilisateurs locaux";
+$a->strings["Global Community"] = "Communauté globale";
+$a->strings["Posts from users of the whole federated network"] = "Conversations publiques provenant du réseau fédéré global";
 $a->strings["No results."] = "Aucun résultat.";
-$a->strings["This community stream shows all public posts received by this node. They may not reflect the opinions of this node’s users."] = "";
+$a->strings["This community stream shows all public posts received by this node. They may not reflect the opinions of this node’s users."] = "Ce fil communautaire liste toutes les conversations publiques reçues par ce serveur. Elles ne reflètent pas nécessairement les opinions personelles des utilisateurs locaux.";
 $a->strings["Credits"] = "Remerciements";
 $a->strings["Friendica is a community project, that would not be possible without the help of many people. Here is a list of those who have contributed to the code or the translation of Friendica. Thank you all!"] = "Friendica est un projet communautaire, qui ne serait pas possible sans l'aide de beaucoup de gens. Voici une liste de ceux qui ont contribué au code ou à la traduction de Friendica. Merci à tous!";
 $a->strings["Contact settings applied."] = "Réglages du contact appliqués.";
@@ -697,8 +696,8 @@ $a->strings["Contact not found."] = "Contact introuvable.";
 $a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ATTENTION: Manipulation réservée aux experts</strong>, toute information incorrecte pourrait empêcher la communication avec ce contact.";
 $a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "une photo";
 $a->strings["No mirroring"] = "Pas de miroir";
-$a->strings["Mirror as forwarded posting"] = "";
-$a->strings["Mirror as my own posting"] = "";
+$a->strings["Mirror as forwarded posting"] = "Refléter les publications de ce profil comme des partages";
+$a->strings["Mirror as my own posting"] = "Refléter les publications de ce profil comme les vôtres";
 $a->strings["Return to contact editor"] = "Retour à l'éditeur de contact";
 $a->strings["Refetch contact data"] = "Récupérer à nouveau les données de contact";
 $a->strings["Submit"] = "Envoyer";
@@ -708,18 +707,18 @@ $a->strings["Mark this contact as remote_self, this will cause friendica to repo
 $a->strings["Account Nickname"] = "Pseudo du compte";
 $a->strings["@Tagname - overrides Name/Nickname"] = "@NomEtiquette - prend le pas sur Nom/Pseudo";
 $a->strings["Account URL"] = "URL du compte";
-$a->strings["Account URL Alias"] = "";
+$a->strings["Account URL Alias"] = "Alias d'URL du compte";
 $a->strings["Friend Request URL"] = "Echec du téléversement de l'image.";
 $a->strings["Friend Confirm URL"] = "Accès public refusé.";
 $a->strings["Notification Endpoint URL"] = "Aucune photo sélectionnée";
 $a->strings["Poll/Feed URL"] = "Téléverser des photos";
 $a->strings["New photo from this URL"] = "Nouvelle photo depuis cette URL";
-$a->strings["Parent user not found."] = "";
-$a->strings["No parent user"] = "";
-$a->strings["Parent Password:"] = "";
-$a->strings["Please enter the password of the parent account to legitimize your request."] = "";
-$a->strings["Parent User"] = "";
-$a->strings["Parent users have total control about this account, including the account settings. Please double check whom you give this access."] = "";
+$a->strings["Parent user not found."] = "Compte parent inconnu.";
+$a->strings["No parent user"] = "Pas d'utilisateur parent";
+$a->strings["Parent Password:"] = "Mot de passe du compte parent :";
+$a->strings["Please enter the password of the parent account to legitimize your request."] = "Veuillez saisir le mot de passe du compte parent pour authentifier votre requête.";
+$a->strings["Parent User"] = "Compte parent";
+$a->strings["Parent users have total control about this account, including the account settings. Please double check whom you give this access."] = "Le compte parent a un contrôle total sur ce compte, incluant les paramètres de compte. Veuillez vérifier à qui vous donnez cet accès.";
 $a->strings["Delegate Page Management"] = "Déléguer la gestion de la page";
 $a->strings["Delegates"] = "";
 $a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Les délégataires seront capables de gérer tous les aspects de ce compte ou de cette page, à l'exception des réglages de compte. Merci de ne pas déléguer votre compte principal à quelqu'un en qui vous n'avez pas une confiance absolue.";
@@ -783,8 +782,8 @@ $a->strings["Please answer the following:"] = "Merci de répondre à ce qui suit
 $a->strings["Does %s know you?"] = "Est-ce que %s vous connaît?";
 $a->strings["Add a personal note:"] = "Ajouter une note personnelle :";
 $a->strings["Friendica"] = "Friendica";
-$a->strings["GNU Social (Pleroma, Mastodon)"] = "";
-$a->strings["Diaspora (Socialhome, Hubzilla)"] = "";
+$a->strings["GNU Social (Pleroma, Mastodon)"] = "GNU Social (Pleroma, Mastodon)";
+$a->strings["Diaspora (Socialhome, Hubzilla)"] = "Diaspora (Socialhome, Hubzilla)";
 $a->strings[" - please do not use this form.  Instead, enter %s into your Diaspora search bar."] = " - merci de ne pas utiliser ce formulaire.   Entrez plutôt %s dans votre barre de recherche Diaspora.";
 $a->strings["Your Identity Address:"] = "Votre adresse d'identité :";
 $a->strings["Submit Request"] = "Envoyer la requête";
@@ -834,10 +833,10 @@ $a->strings["Photos"] = "Photos";
 $a->strings["Contact Photos"] = "Photos du contact";
 $a->strings["Upload"] = "Téléverser";
 $a->strings["Files"] = "Fichiers";
-$a->strings["You must be logged in to use this module"] = "";
-$a->strings["Source URL"] = "";
+$a->strings["You must be logged in to use this module"] = "Vous devez être identifié pour accéder à cette fonctionnalité";
+$a->strings["Source URL"] = "URL Source";
 $a->strings["- select -"] = "- choisir -";
-$a->strings["The contact could not be added."] = "";
+$a->strings["The contact could not be added."] = "Le contact n'a pas pu être ajouté.";
 $a->strings["You already added this contact."] = "Vous avez déjà ajouté ce contact.";
 $a->strings["Diaspora support isn't enabled. Contact can't be added."] = "Le support de Diaspora est désactivé. Le contact ne peut pas être ajouté.";
 $a->strings["OStatus support is disabled. Contact can't be added."] = "Le support d'OStatus est désactivé. Le contact ne peut pas être ajouté.";
@@ -849,8 +848,8 @@ $a->strings["Please visit <a href=\"https://friendi.ca\">Friendi.ca</a> to learn
 $a->strings["Bug reports and issues: please visit"] = "Pour les rapports de bugs : rendez vous sur";
 $a->strings["the bugtracker at github"] = "le bugtracker sur GitHub";
 $a->strings["Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca"] = "";
-$a->strings["Installed addons/apps:"] = "";
-$a->strings["No installed addons/apps"] = "";
+$a->strings["Installed addons/apps:"] = "Add-ons/Applications installés :";
+$a->strings["No installed addons/apps"] = "Aucun add-on/application n'est installé";
 $a->strings["Read about the <a href=\"%1\$s/tos\">Terms of Service</a> of this node."] = "";
 $a->strings["On this server the following remote servers are blocked."] = "Sur ce serveur, les serveurs suivants sont sur liste noire.";
 $a->strings["Friend suggestion sent."] = "Suggestion d'amitié/contact envoyée.";
@@ -862,7 +861,7 @@ $a->strings["Group not found."] = "Groupe introuvable.";
 $a->strings["Group name changed."] = "Groupe renommé.";
 $a->strings["Permission denied"] = "Permission refusée";
 $a->strings["Save Group"] = "Sauvegarder le groupe";
-$a->strings["Filter"] = "";
+$a->strings["Filter"] = "Filtre";
 $a->strings["Create a group of contacts/friends."] = "Créez un groupe de contacts/amis.";
 $a->strings["Group Name: "] = "Nom du groupe : ";
 $a->strings["Contacts not in any group"] = "Contacts n'appartenant à aucun groupe";
@@ -873,9 +872,9 @@ $a->strings["Edit Group Name"] = "Éditer le nom du groupe";
 $a->strings["Members"] = "Membres";
 $a->strings["All Contacts"] = "Tous les contacts";
 $a->strings["Group is empty"] = "Groupe vide";
-$a->strings["Remove contact from group"] = "";
+$a->strings["Remove contact from group"] = "Retirer ce contact du groupe";
 $a->strings["Click on a contact to add or remove."] = "Cliquez sur un contact pour l'ajouter ou le supprimer.";
-$a->strings["Add contact to group"] = "";
+$a->strings["Add contact to group"] = "Ajouter ce contact au groupe";
 $a->strings["No profile"] = "Aucun profil";
 $a->strings["Help:"] = "Aide :";
 $a->strings["Help"] = "Aide";
@@ -925,7 +924,7 @@ $a->strings["\n\t\tDear %1\$s,\n\t\t\tA request was recently received at \"%2\$s
 $a->strings["\n\t\tFollow this link soon to verify your identity:\n\n\t\t%1\$s\n\n\t\tYou will then receive a follow-up message containing the new password.\n\t\tYou may change that password from your account settings page after logging in.\n\n\t\tThe login details are as follows:\n\n\t\tSite Location:\t%2\$s\n\t\tLogin Name:\t%3\$s"] = "";
 $a->strings["Password reset requested at %s"] = "Requête de réinitialisation de mot de passe à %s";
 $a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Impossible d'honorer cette demande. (Vous l'avez peut-être déjà utilisée par le passé.) La réinitialisation a échoué.";
-$a->strings["Request has expired, please make a new one."] = "";
+$a->strings["Request has expired, please make a new one."] = "La requête a expiré, veuillez la renouveler.";
 $a->strings["Forgot your Password?"] = "Mot de passe oublié ?";
 $a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Entrez votre adresse de courriel et validez pour réinitialiser votre mot de passe. Vous recevrez la suite des instructions par courriel.";
 $a->strings["Nickname or Email: "] = "Pseudo ou eMail : ";
@@ -939,6 +938,7 @@ $a->strings["Your password may be changed from the <em>Settings</em> page after
 $a->strings["\n\t\t\tDear %1\$s,\n\t\t\t\tYour password has been changed as requested. Please retain this\n\t\t\tinformation for your records (or change your password immediately to\n\t\t\tsomething that you will remember).\n\t\t"] = "";
 $a->strings["\n\t\t\tYour login details are as follows:\n\n\t\t\tSite Location:\t%1\$s\n\t\t\tLogin Name:\t%2\$s\n\t\t\tPassword:\t%3\$s\n\n\t\t\tYou may change that password from your account settings page after logging in.\n\t\t"] = "";
 $a->strings["Your password has been changed at %s"] = "Votre mot de passe a été modifié à %s";
+$a->strings["System down for maintenance"] = "Système indisponible pour cause de maintenance";
 $a->strings["Manage Identities and/or Pages"] = "Gérer les identités et/ou les pages";
 $a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Basculez entre les différentes identités ou pages (groupes/communautés) qui se partagent votre compte ou que vous avez été autorisé à gérer.";
 $a->strings["Select an identity to manage: "] = "Choisir une identité à gérer: ";
@@ -955,7 +955,7 @@ $a->strings["Message sent."] = "Message envoyé.";
 $a->strings["Discard"] = "Rejeter";
 $a->strings["Messages"] = "Messages";
 $a->strings["Do you really want to delete this message?"] = "Voulez-vous vraiment supprimer ce message ?";
-$a->strings["Conversation not found."] = "";
+$a->strings["Conversation not found."] = "Conversation inconnue.";
 $a->strings["Message deleted."] = "Message supprimé.";
 $a->strings["Conversation removed."] = "Conversation supprimée.";
 $a->strings["Please enter a link URL:"] = "Entrez un lien web :";
@@ -1045,8 +1045,8 @@ $a->strings["Show unread"] = "Afficher non-lus";
 $a->strings["Show all"] = "Tout afficher";
 $a->strings["Show Ignored Requests"] = "Voir les demandes ignorées";
 $a->strings["Hide Ignored Requests"] = "Cacher les demandes ignorées";
-$a->strings["Notification type:"] = "";
-$a->strings["Suggested by:"] = "";
+$a->strings["Notification type:"] = "Type de notification :";
+$a->strings["Suggested by:"] = "Suggéré par :";
 $a->strings["Hide this contact from others"] = "Cacher ce contact aux autres";
 $a->strings["Claims to be known to you: "] = "Prétend que vous le connaissez : ";
 $a->strings["yes"] = "oui";
@@ -1057,7 +1057,7 @@ $a->strings["Accepting %s as a subscriber allows them to subscribe to your posts
 $a->strings["Accepting %s as a sharer allows them to subscribe to your posts, but you will not receive updates from them in your news feed."] = "";
 $a->strings["Friend"] = "Ami";
 $a->strings["Sharer"] = "Initiateur du partage";
-$a->strings["Subscriber"] = "";
+$a->strings["Subscriber"] = "Abonné∙e";
 $a->strings["Network:"] = "Réseau";
 $a->strings["No introductions."] = "Aucune demande d'introduction.";
 $a->strings["No more %s notifications."] = "Aucune notification de %s";
@@ -1136,19 +1136,6 @@ $a->strings["Recipient"] = "Destinataire";
 $a->strings["Choose what you wish to do to recipient"] = "Choisissez ce que vous voulez faire au destinataire";
 $a->strings["Make this post private"] = "Rendez ce message privé";
 $a->strings["Only logged in users are permitted to perform a probing."] = "";
-$a->strings["Image uploaded but image cropping failed."] = "Image envoyée, mais impossible de la retailler.";
-$a->strings["Image size reduction [%s] failed."] = "Réduction de la taille de l'image [%s] échouée.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Rechargez la page avec la touche Maj pressée, ou bien effacez le cache du navigateur, si d'aventure la nouvelle photo n'apparaissait pas immédiatement.";
-$a->strings["Unable to process image"] = "Impossible de traiter l'image";
-$a->strings["Upload File:"] = "Fichier à téléverser :";
-$a->strings["Select a profile:"] = "Choisir un profil :";
-$a->strings["or"] = "ou";
-$a->strings["skip this step"] = "ignorer cette étape";
-$a->strings["select a photo from your photo albums"] = "choisissez une photo depuis vos albums";
-$a->strings["Crop Image"] = "(Re)cadrer l'image";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Ajustez le cadre de l'image pour une visualisation optimale.";
-$a->strings["Done Editing"] = "Édition terminée";
-$a->strings["Image uploaded successfully."] = "Image téléversée avec succès.";
 $a->strings["Profile deleted."] = "Profil supprimé.";
 $a->strings["Profile-"] = "Profil-";
 $a->strings["New profile created."] = "Nouveau profil créé.";
@@ -1229,6 +1216,19 @@ $a->strings["visible to everybody"] = "visible par tous";
 $a->strings["Edit/Manage Profiles"] = "Editer / gérer les profils";
 $a->strings["Change profile photo"] = "Changer de photo de profil";
 $a->strings["Create New Profile"] = "Créer un nouveau profil";
+$a->strings["Image uploaded but image cropping failed."] = "Image envoyée, mais impossible de la retailler.";
+$a->strings["Image size reduction [%s] failed."] = "Réduction de la taille de l'image [%s] échouée.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Rechargez la page avec la touche Maj pressée, ou bien effacez le cache du navigateur, si d'aventure la nouvelle photo n'apparaissait pas immédiatement.";
+$a->strings["Unable to process image"] = "Impossible de traiter l'image";
+$a->strings["Upload File:"] = "Fichier à téléverser :";
+$a->strings["Select a profile:"] = "Choisir un profil :";
+$a->strings["or"] = "ou";
+$a->strings["skip this step"] = "ignorer cette étape";
+$a->strings["select a photo from your photo albums"] = "choisissez une photo depuis vos albums";
+$a->strings["Crop Image"] = "(Re)cadrer l'image";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Ajustez le cadre de l'image pour une visualisation optimale.";
+$a->strings["Done Editing"] = "Édition terminée";
+$a->strings["Image uploaded successfully."] = "Image téléversée avec succès.";
 $a->strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
 $a->strings["Profile Visibility Editor"] = "Éditer la visibilité du profil";
 $a->strings["Visible To"] = "Visible par";
@@ -1476,48 +1476,133 @@ $a->strings["Upload New Videos"] = "Téléversé une nouvelle vidéo";
 $a->strings["No contacts."] = "Aucun contact.";
 $a->strings["Visit %s's profile [%s]"] = "Visiter le profil de %s [%s]";
 $a->strings["Contacts"] = "Contacts";
+$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Nombre de messages de mur quotidiens pour %s dépassé. Échec du message.";
+$a->strings["Unable to check your home location."] = "Impossible de vérifier votre localisation.";
+$a->strings["No recipient."] = "Pas de destinataire.";
+$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Si vous souhaitez que %s réponde, merci de vérifier vos réglages pour autoriser les messages privés venant d'inconnus.";
 $a->strings["Invalid request."] = "Requête invalide.";
 $a->strings["Sorry, maybe your upload is bigger than the PHP configuration allows"] = "Désolé, il semble que votre fichier est plus important que ce que la configuration de PHP autorise";
 $a->strings["Or - did you try to upload an empty file?"] = "Ou — auriez-vous essayé de télécharger un fichier vide ?";
 $a->strings["File exceeds size limit of %s"] = "La taille du fichier dépasse la limite de %s";
 $a->strings["File upload failed."] = "Le téléversement a échoué.";
 $a->strings["Wall Photos"] = "Photos du mur";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Nombre de messages de mur quotidiens pour %s dépassé. Échec du message.";
-$a->strings["Unable to check your home location."] = "Impossible de vérifier votre localisation.";
-$a->strings["No recipient."] = "Pas de destinataire.";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Si vous souhaitez que %s réponde, merci de vérifier vos réglages pour autoriser les messages privés venant d'inconnus.";
-$a->strings["default"] = "défaut";
-$a->strings["greenzero"] = "greenzero";
-$a->strings["purplezero"] = "purplezero";
-$a->strings["easterbunny"] = "easterbunny";
-$a->strings["darkzero"] = "darkzero";
-$a->strings["comix"] = "comix";
-$a->strings["slackr"] = "slackr";
-$a->strings["Variations"] = "Variations";
-$a->strings["Top Banner"] = "Bannière du haut";
-$a->strings["Resize image to the width of the screen and show background color below on long pages."] = "Redimensionner l'image à la largeur de l'écran et combler en dessous avec la couleur d'arrière plan.";
-$a->strings["Full screen"] = "Plein écran";
-$a->strings["Resize image to fill entire screen, clipping either the right or the bottom."] = "Agrandir l'image pour remplir l'écran, jusqu'à toucher le bord droit ou le bas de l'écran.";
-$a->strings["Single row mosaic"] = "Mosaïque sur un rang";
-$a->strings["Resize image to repeat it on a single row, either vertical or horizontal."] = "Redimensionner l'image pour la dupliquer sur un seul rang, vertical ou horizontal.";
-$a->strings["Mosaic"] = "Mosaïque";
-$a->strings["Repeat image to fill the screen."] = "Dupliquer l'image pour couvrir l'écran.";
-$a->strings["Custom"] = "Personnalisé";
-$a->strings["Note"] = "Remarque";
-$a->strings["Check image permissions if all users are allowed to see the image"] = "Vérifier que tous les utilisateurs du site sont autorisés à voir l'image.";
-$a->strings["Select color scheme"] = "Choisir le schéma de couleurs";
-$a->strings["Navigation bar background color"] = "Couleur d'arrière-plan de la barre de navigation";
-$a->strings["Navigation bar icon color "] = "Couleur des icônes de la barre de navigation";
-$a->strings["Link color"] = "Couleur des liens";
-$a->strings["Set the background color"] = "Couleur d'arrière-plan";
-$a->strings["Content background opacity"] = "Opacité du contenu d'arrière-plan";
-$a->strings["Set the background image"] = "Image d'arrière-plan";
-$a->strings["Background image style"] = "Style de l'image de fond";
-$a->strings["Login page background image"] = "Image de fond de la page de login";
-$a->strings["Login page background color"] = "Couleur d'arrière-plan de la page de login";
-$a->strings["Leave background image and color empty for theme defaults"] = "Laisser l'image et la couleur de fond vides pour les paramètres par défaut du thème";
-$a->strings["Guest"] = "Invité";
-$a->strings["Visitor"] = "Visiteur";
+$a->strings["Delete this item?"] = "Effacer cet élément?";
+$a->strings["toggle mobile"] = "activ. mobile";
+$a->strings["No system theme config value set."] = "";
+$a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Le jeton de sécurité du formulaire n'est pas correct. Ceci veut probablement dire que le formulaire est resté ouvert trop longtemps (plus de 3 heures) avant d'être validé.";
+$a->strings["Frequently"] = "";
+$a->strings["Hourly"] = "";
+$a->strings["Twice daily"] = "";
+$a->strings["Daily"] = "";
+$a->strings["Weekly"] = "";
+$a->strings["Monthly"] = "";
+$a->strings["DFRN"] = "";
+$a->strings["OStatus"] = "";
+$a->strings["RSS/Atom"] = "";
+$a->strings["Zot!"] = "";
+$a->strings["LinkedIn"] = "";
+$a->strings["XMPP/IM"] = "";
+$a->strings["MySpace"] = "";
+$a->strings["Google+"] = "";
+$a->strings["pump.io"] = "";
+$a->strings["Twitter"] = "";
+$a->strings["Diaspora Connector"] = "";
+$a->strings["GNU Social Connector"] = "";
+$a->strings["ActivityPub"] = "";
+$a->strings["pnut"] = "";
+$a->strings["Male"] = "";
+$a->strings["Female"] = "";
+$a->strings["Currently Male"] = "";
+$a->strings["Currently Female"] = "";
+$a->strings["Mostly Male"] = "";
+$a->strings["Mostly Female"] = "";
+$a->strings["Transgender"] = "";
+$a->strings["Intersex"] = "";
+$a->strings["Transsexual"] = "";
+$a->strings["Hermaphrodite"] = "";
+$a->strings["Neuter"] = "";
+$a->strings["Non-specific"] = "Non-spécifique";
+$a->strings["Other"] = "Autre";
+$a->strings["Males"] = "Hommes";
+$a->strings["Females"] = "Femmes";
+$a->strings["Gay"] = "Gay";
+$a->strings["Lesbian"] = "Lesbienne";
+$a->strings["No Preference"] = "Sans préférence";
+$a->strings["Bisexual"] = "Bisexuel";
+$a->strings["Autosexual"] = "Auto-sexuel";
+$a->strings["Abstinent"] = "Abstinent";
+$a->strings["Virgin"] = "Vierge";
+$a->strings["Deviant"] = "Déviant";
+$a->strings["Fetish"] = "Fétichiste";
+$a->strings["Oodles"] = "Oodles";
+$a->strings["Nonsexual"] = "Non-sexuel";
+$a->strings["Single"] = "Célibataire";
+$a->strings["Lonely"] = "Esseulé";
+$a->strings["Available"] = "Disponible";
+$a->strings["Unavailable"] = "Indisponible";
+$a->strings["Has crush"] = "Attiré par quelqu'un";
+$a->strings["Infatuated"] = "Entiché";
+$a->strings["Dating"] = "Dans une relation";
+$a->strings["Unfaithful"] = "Infidèle";
+$a->strings["Sex Addict"] = "Accro au sexe";
+$a->strings["Friends"] = "Amis";
+$a->strings["Friends/Benefits"] = "Amis par intérêt";
+$a->strings["Casual"] = "Casual";
+$a->strings["Engaged"] = "Fiancé";
+$a->strings["Married"] = "Marié";
+$a->strings["Imaginarily married"] = "Se croit marié";
+$a->strings["Partners"] = "Partenaire";
+$a->strings["Cohabiting"] = "En cohabitation";
+$a->strings["Common law"] = "Marié \"de fait\"/\"sui juris\" (concubin)";
+$a->strings["Happy"] = "Heureux";
+$a->strings["Not looking"] = "Pas intéressé";
+$a->strings["Swinger"] = "Échangiste";
+$a->strings["Betrayed"] = "Trahi(e)";
+$a->strings["Separated"] = "Séparé";
+$a->strings["Unstable"] = "Instable";
+$a->strings["Divorced"] = "Divorcé";
+$a->strings["Imaginarily divorced"] = "Se croit divorcé";
+$a->strings["Widowed"] = "Veuf/Veuve";
+$a->strings["Uncertain"] = "Incertain";
+$a->strings["It's complicated"] = "C'est compliqué";
+$a->strings["Don't care"] = "S'en désintéresse";
+$a->strings["Ask me"] = "Me demander";
+$a->strings["General Features"] = "Fonctions générales";
+$a->strings["Multiple Profiles"] = "Profils multiples";
+$a->strings["Ability to create multiple profiles"] = "Possibilité de créer plusieurs profils";
+$a->strings["Photo Location"] = "Lieu de prise de la photo";
+$a->strings["Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map."] = "Les métadonnées des photos sont normalement retirées. Ceci permet de sauver l'emplacement (si présent) et de positionner la photo sur une carte.";
+$a->strings["Export Public Calendar"] = "Exporter le Calendrier Public";
+$a->strings["Ability for visitors to download the public calendar"] = "Les visiteurs peuvent télécharger le calendrier public";
+$a->strings["Post Composition Features"] = "Caractéristiques de composition de publication";
+$a->strings["Auto-mention Forums"] = "Mentionner automatiquement les Forums";
+$a->strings["Add/remove mention when a forum page is selected/deselected in ACL window."] = "Ajoute/retire une mention quand une page forum est sélectionnée/désélectionnée lors du choix des destinataires d'une publication.";
+$a->strings["Explicit Mentions"] = "";
+$a->strings["Add explicit mentions to comment box for manual control over who gets mentioned in replies."] = "";
+$a->strings["Network Sidebar"] = "";
+$a->strings["Ability to select posts by date ranges"] = "Capacité de sélectionner les publications par intervalles de dates";
+$a->strings["Protocol Filter"] = "";
+$a->strings["Enable widget to display Network posts only from selected protocols"] = "";
+$a->strings["Network Tabs"] = "Onglets Réseau";
+$a->strings["Network New Tab"] = "Nouvel onglet réseaux";
+$a->strings["Enable tab to display only new Network posts (from the last 12 hours)"] = "Activer l'onglet pour afficher seulement les publications du réseau (dans les 12 dernières heures)";
+$a->strings["Network Shared Links Tab"] = "Onglet réseau partagé";
+$a->strings["Enable tab to display only Network posts with links in them"] = "Activer l'onglet pour afficher seulement les publications du réseau contenant des liens";
+$a->strings["Post/Comment Tools"] = "Outils de publication/commentaire";
+$a->strings["Post Categories"] = "Catégories des publications";
+$a->strings["Add categories to your posts"] = "Ajouter des catégories à vos publications";
+$a->strings["Advanced Profile Settings"] = "Paramètres Avancés du Profil";
+$a->strings["List Forums"] = "Liste des forums";
+$a->strings["Show visitors public community forums at the Advanced Profile Page"] = "Montrer les forums communautaires aux visiteurs sur la Page de profil avancé";
+$a->strings["Tag Cloud"] = "";
+$a->strings["Provide a personal tag cloud on your profile page"] = "";
+$a->strings["Display Membership Date"] = "";
+$a->strings["Display membership date in profile"] = "";
+$a->strings["Forums"] = "Forums";
+$a->strings["External link to forum"] = "Lien sortant vers le forum";
+$a->strings["Nothing new here"] = "Rien de neuf ici";
+$a->strings["Clear notifications"] = "Effacer les notifications";
+$a->strings["@name, !forum, #tags, content"] = "@nom, !forum, #tags, contenu";
 $a->strings["Logout"] = "Se déconnecter";
 $a->strings["End this session"] = "Mettre fin à cette session";
 $a->strings["Status"] = "Statut";
@@ -1527,53 +1612,111 @@ $a->strings["Your photos"] = "Vos photos";
 $a->strings["Videos"] = "Vidéos";
 $a->strings["Your videos"] = "Vos vidéos";
 $a->strings["Your events"] = "Vos événements";
-$a->strings["Conversations from your friends"] = "Conversations de vos amis";
+$a->strings["Personal notes"] = "Notes personnelles";
+$a->strings["Your personal notes"] = "Vos notes personnelles";
+$a->strings["Sign in"] = "Se connecter";
+$a->strings["Home"] = "Profil";
+$a->strings["Home Page"] = "Page d'accueil";
+$a->strings["Register"] = "S'inscrire";
+$a->strings["Create an account"] = "Créer un compte";
+$a->strings["Help and documentation"] = "Aide et documentation";
+$a->strings["Apps"] = "Applications";
+$a->strings["Addon applications, utilities, games"] = "Applications supplémentaires, utilitaires, jeux";
+$a->strings["Search site content"] = "Rechercher dans le contenu du site";
+$a->strings["Full Text"] = "Texte Entier";
+$a->strings["Tags"] = "Tags";
+$a->strings["Community"] = "Communauté";
+$a->strings["Conversations on this and other servers"] = "";
 $a->strings["Events and Calendar"] = "Événements et agenda";
+$a->strings["Directory"] = "Annuaire";
+$a->strings["People directory"] = "Annuaire des utilisateurs";
+$a->strings["Information about this friendica instance"] = "Information au sujet de cette instance de friendica";
+$a->strings["Terms of Service of this Friendica instance"] = "";
+$a->strings["Conversations from your friends"] = "Conversations de vos amis";
+$a->strings["Network Reset"] = "Réinitialiser le réseau";
+$a->strings["Load Network page with no filters"] = "Chargement des pages du réseau sans filtre";
+$a->strings["Introductions"] = "Introductions";
+$a->strings["Friend Requests"] = "Demande d'amitié";
+$a->strings["See all notifications"] = "Voir toutes les notifications";
+$a->strings["Mark all system notifications seen"] = "Marquer toutes les notifications système comme 'vues'";
 $a->strings["Private mail"] = "Messages privés";
+$a->strings["Inbox"] = "Messages entrants";
+$a->strings["Outbox"] = "Messages sortants";
+$a->strings["Manage"] = "Gérer";
+$a->strings["Manage other pages"] = "Gérer les autres pages";
 $a->strings["Account settings"] = "Compte";
+$a->strings["Manage/Edit Profiles"] = "Gérer/Éditer les profiles";
 $a->strings["Manage/edit friends and contacts"] = "Gérer/éditer les amitiés et contacts";
-$a->strings["Alignment"] = "Alignement";
-$a->strings["Left"] = "Gauche";
-$a->strings["Center"] = "Centre";
-$a->strings["Color scheme"] = "Palette de couleurs";
-$a->strings["Posts font size"] = "Taille de texte des publications";
-$a->strings["Textareas font size"] = "Taille de police des zones de texte";
-$a->strings["Comma separated list of helper forums"] = "Liste de forums d'aide, séparés par des virgules";
-$a->strings["don't show"] = "cacher";
-$a->strings["show"] = "montrer";
-$a->strings["Set style"] = "Définir le style";
-$a->strings["Community Pages"] = "Pages de Communauté";
-$a->strings["Community Profiles"] = "Profils communautaires";
-$a->strings["Help or @NewHere ?"] = "Aide ou @NewHere?";
-$a->strings["Connect Services"] = "Connecter des services";
-$a->strings["Find Friends"] = "Trouver des amis";
-$a->strings["Last users"] = "Derniers utilisateurs";
-$a->strings["Find People"] = "Trouver des personnes";
-$a->strings["Enter name or interest"] = "Entrez un nom ou un centre d'intérêt";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Exemples : Robert Morgenstein, Pêche";
-$a->strings["Similar Interests"] = "Intérêts similaires";
-$a->strings["Random Profile"] = "Profil au hasard";
-$a->strings["Invite Friends"] = "Inviter des amis";
-$a->strings["Local Directory"] = "Annuaire local";
-$a->strings["Forums"] = "Forums";
-$a->strings["External link to forum"] = "Lien sortant vers le forum";
-$a->strings["Quick Start"] = "Démarrage rapide";
-$a->strings["Could not find any unarchived contact entry for this URL (%s)"] = "";
-$a->strings["The contact entries have been archived"] = "";
-$a->strings["Enter new password: "] = "";
-$a->strings["Post update version number has been set to %s."] = "";
-$a->strings["Check for pending update actions."] = "";
-$a->strings["Done."] = "";
-$a->strings["Execute pending post updates."] = "";
-$a->strings["All pending post updates are done."] = "";
+$a->strings["Site setup and configuration"] = "Démarrage et configuration du site";
+$a->strings["Navigation"] = "Navigation";
+$a->strings["Site map"] = "Carte du site";
+$a->strings["Embedding disabled"] = "Incorporation désactivée";
+$a->strings["Embedded content"] = "Contenu incorporé";
+$a->strings["newer"] = "Plus récent";
+$a->strings["older"] = "Plus ancien";
+$a->strings["prev"] = "précédent";
+$a->strings["last"] = "dernier";
+$a->strings["view full size"] = "voir en pleine taille";
+$a->strings["Image/photo"] = "Image/photo";
+$a->strings["<a href=\"%1\$s\" target=\"_blank\">%2\$s</a> %3\$s"] = "<a href=\"%1\$s\" target=\"_blank\">%2\$s</a> %3\$s";
+$a->strings["$1 wrote:"] = "$1 a écrit :";
+$a->strings["Encrypted content"] = "Contenu chiffré";
+$a->strings["Invalid source protocol"] = "";
+$a->strings["Invalid link protocol"] = "";
+$a->strings["Loading more entries..."] = "Chargement de résultats supplémentaires...";
+$a->strings["The end"] = "Fin";
+$a->strings["Follow"] = "S'abonner";
+$a->strings["Click to open/close"] = "Cliquer pour ouvrir/fermer";
+$a->strings["Export"] = "Exporter";
+$a->strings["Export calendar as ical"] = "Exporter au format iCal";
+$a->strings["Export calendar as csv"] = "Exporter au format CSV";
+$a->strings["No contacts"] = "Aucun contact";
+$a->strings["%d Contact"] = [
+       0 => "%d contact",
+       1 => "%d contacts",
+];
+$a->strings["View Contacts"] = "Voir les contacts";
+$a->strings["Add New Contact"] = "Ajouter un nouveau contact";
+$a->strings["Enter address or web location"] = "Entrez son adresse ou sa localisation web";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Exemple : bob@example.com, http://example.com/barbara";
+$a->strings["%d invitation available"] = [
+       0 => "%d invitation disponible",
+       1 => "%d invitations disponibles",
+];
+$a->strings["Find People"] = "Trouver des personnes";
+$a->strings["Enter name or interest"] = "Entrez un nom ou un centre d'intérêt";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Exemples : Robert Morgenstein, Pêche";
+$a->strings["Similar Interests"] = "Intérêts similaires";
+$a->strings["Random Profile"] = "Profil au hasard";
+$a->strings["Invite Friends"] = "Inviter des amis";
+$a->strings["Local Directory"] = "Annuaire local";
+$a->strings["Protocols"] = "";
+$a->strings["All Protocols"] = "";
+$a->strings["Saved Folders"] = "Dossiers sauvegardés";
+$a->strings["Everything"] = "Tout";
+$a->strings["Categories"] = "Catégories";
+$a->strings["%d contact in common"] = [
+       0 => "%d contact en commun",
+       1 => "%d contacts en commun",
+];
 $a->strings["Post to Email"] = "Publier aux courriels";
 $a->strings["Hide your profile details from unknown viewers?"] = "Cacher les détails du profil aux visiteurs inconnus?";
 $a->strings["Connectors disabled, since \"%s\" is enabled."] = "Les connecteurs sont désactivés parce que \"%s\" est activé.";
 $a->strings["Visible to everybody"] = "Visible par tout le monde";
+$a->strings["show"] = "montrer";
+$a->strings["don't show"] = "cacher";
 $a->strings["Close"] = "Fermer";
 $a->strings["Welcome "] = "Bienvenue ";
 $a->strings["Please upload a profile photo."] = "Merci d'illustrer votre profil d'une image.";
 $a->strings["Welcome back "] = "Bienvenue à nouveau, ";
+$a->strings["Could not find any unarchived contact entry for this URL (%s)"] = "";
+$a->strings["The contact entries have been archived"] = "";
+$a->strings["Enter new password: "] = "";
+$a->strings["Post update version number has been set to %s."] = "";
+$a->strings["Check for pending update actions."] = "";
+$a->strings["Done."] = "";
+$a->strings["Execute pending post updates."] = "";
+$a->strings["All pending post updates are done."] = "";
 $a->strings["The database configuration file \"config/local.config.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "";
 $a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Vous pourriez avoir besoin d'importer le fichier \"database.sql\" manuellement au moyen de phpmyadmin ou de la commande mysql.";
 $a->strings["Please see the file \"INSTALL.txt\"."] = "Référez-vous au fichier \"INSTALL.txt\".";
@@ -1677,8 +1820,6 @@ $a->strings["fingered"] = "a tripoté";
 $a->strings["rebuff"] = "rabrouer";
 $a->strings["rebuffed"] = "a rabroué";
 $a->strings["System"] = "Système";
-$a->strings["Home"] = "Profil";
-$a->strings["Introductions"] = "Introductions";
 $a->strings["%s commented on %s's post"] = "%s a commenté la publication de %s";
 $a->strings["%s created a new post"] = "%s a créé une nouvelle publication";
 $a->strings["%s liked %s's post"] = "%s a aimé la publication de %s";
@@ -1716,212 +1857,12 @@ $a->strings["%d contact not imported"] = [
        1 => "%d contacts non importés",
 ];
 $a->strings["Done. You can now login with your username and password"] = "Action réalisée. Vous pouvez désormais vous connecter avec votre nom d'utilisateur et votre mot de passe";
-$a->strings["Birthday:"] = "Anniversaire :";
-$a->strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-JJ ou MM-JJ";
-$a->strings["never"] = "jamais";
-$a->strings["less than a second ago"] = "il y a moins d'une seconde";
-$a->strings["year"] = "an";
-$a->strings["years"] = "ans";
-$a->strings["months"] = "mois";
-$a->strings["weeks"] = "semaines";
-$a->strings["days"] = "jours";
-$a->strings["hour"] = "heure";
-$a->strings["hours"] = "heures";
-$a->strings["minute"] = "minute";
-$a->strings["minutes"] = "minutes";
-$a->strings["second"] = "seconde";
-$a->strings["seconds"] = "secondes";
-$a->strings["in %1\$d %2\$s"] = "";
-$a->strings["%1\$d %2\$s ago"] = "il y a %1\$d %2\$s ";
-$a->strings["view full size"] = "voir en pleine taille";
-$a->strings["Image/photo"] = "Image/photo";
-$a->strings["<a href=\"%1\$s\" target=\"_blank\">%2\$s</a> %3\$s"] = "<a href=\"%1\$s\" target=\"_blank\">%2\$s</a> %3\$s";
-$a->strings["$1 wrote:"] = "$1 a écrit :";
-$a->strings["Encrypted content"] = "Contenu chiffré";
-$a->strings["Invalid source protocol"] = "";
-$a->strings["Invalid link protocol"] = "";
-$a->strings["Loading more entries..."] = "Chargement de résultats supplémentaires...";
-$a->strings["The end"] = "Fin";
-$a->strings["Follow"] = "S'abonner";
-$a->strings["@name, !forum, #tags, content"] = "@nom, !forum, #tags, contenu";
-$a->strings["Full Text"] = "Texte Entier";
-$a->strings["Tags"] = "Tags";
-$a->strings["Click to open/close"] = "Cliquer pour ouvrir/fermer";
-$a->strings["Export"] = "Exporter";
-$a->strings["Export calendar as ical"] = "Exporter au format iCal";
-$a->strings["Export calendar as csv"] = "Exporter au format CSV";
-$a->strings["No contacts"] = "Aucun contact";
-$a->strings["%d Contact"] = [
-       0 => "%d contact",
-       1 => "%d contacts",
-];
-$a->strings["View Contacts"] = "Voir les contacts";
-$a->strings["Frequently"] = "";
-$a->strings["Hourly"] = "";
-$a->strings["Twice daily"] = "";
-$a->strings["Daily"] = "";
-$a->strings["Weekly"] = "";
-$a->strings["Monthly"] = "";
-$a->strings["DFRN"] = "";
-$a->strings["OStatus"] = "";
-$a->strings["RSS/Atom"] = "";
-$a->strings["Zot!"] = "";
-$a->strings["LinkedIn"] = "";
-$a->strings["XMPP/IM"] = "";
-$a->strings["MySpace"] = "";
-$a->strings["Google+"] = "";
-$a->strings["pump.io"] = "";
-$a->strings["Twitter"] = "";
-$a->strings["Diaspora Connector"] = "";
-$a->strings["GNU Social Connector"] = "";
-$a->strings["ActivityPub"] = "";
-$a->strings["pnut"] = "";
-$a->strings["Male"] = "";
-$a->strings["Female"] = "";
-$a->strings["Currently Male"] = "";
-$a->strings["Currently Female"] = "";
-$a->strings["Mostly Male"] = "";
-$a->strings["Mostly Female"] = "";
-$a->strings["Transgender"] = "";
-$a->strings["Intersex"] = "";
-$a->strings["Transsexual"] = "";
-$a->strings["Hermaphrodite"] = "";
-$a->strings["Neuter"] = "";
-$a->strings["Non-specific"] = "Non-spécifique";
-$a->strings["Other"] = "Autre";
-$a->strings["Males"] = "Hommes";
-$a->strings["Females"] = "Femmes";
-$a->strings["Gay"] = "Gay";
-$a->strings["Lesbian"] = "Lesbienne";
-$a->strings["No Preference"] = "Sans préférence";
-$a->strings["Bisexual"] = "Bisexuel";
-$a->strings["Autosexual"] = "Auto-sexuel";
-$a->strings["Abstinent"] = "Abstinent";
-$a->strings["Virgin"] = "Vierge";
-$a->strings["Deviant"] = "Déviant";
-$a->strings["Fetish"] = "Fétichiste";
-$a->strings["Oodles"] = "Oodles";
-$a->strings["Nonsexual"] = "Non-sexuel";
-$a->strings["Single"] = "Célibataire";
-$a->strings["Lonely"] = "Esseulé";
-$a->strings["Available"] = "Disponible";
-$a->strings["Unavailable"] = "Indisponible";
-$a->strings["Has crush"] = "Attiré par quelqu'un";
-$a->strings["Infatuated"] = "Entiché";
-$a->strings["Dating"] = "Dans une relation";
-$a->strings["Unfaithful"] = "Infidèle";
-$a->strings["Sex Addict"] = "Accro au sexe";
-$a->strings["Friends"] = "Amis";
-$a->strings["Friends/Benefits"] = "Amis par intérêt";
-$a->strings["Casual"] = "Casual";
-$a->strings["Engaged"] = "Fiancé";
-$a->strings["Married"] = "Marié";
-$a->strings["Imaginarily married"] = "Se croit marié";
-$a->strings["Partners"] = "Partenaire";
-$a->strings["Cohabiting"] = "En cohabitation";
-$a->strings["Common law"] = "Marié \"de fait\"/\"sui juris\" (concubin)";
-$a->strings["Happy"] = "Heureux";
-$a->strings["Not looking"] = "Pas intéressé";
-$a->strings["Swinger"] = "Échangiste";
-$a->strings["Betrayed"] = "Trahi(e)";
-$a->strings["Separated"] = "Séparé";
-$a->strings["Unstable"] = "Instable";
-$a->strings["Divorced"] = "Divorcé";
-$a->strings["Imaginarily divorced"] = "Se croit divorcé";
-$a->strings["Widowed"] = "Veuf/Veuve";
-$a->strings["Uncertain"] = "Incertain";
-$a->strings["It's complicated"] = "C'est compliqué";
-$a->strings["Don't care"] = "S'en désintéresse";
-$a->strings["Ask me"] = "Me demander";
-$a->strings["General Features"] = "Fonctions générales";
-$a->strings["Multiple Profiles"] = "Profils multiples";
-$a->strings["Ability to create multiple profiles"] = "Possibilité de créer plusieurs profils";
-$a->strings["Photo Location"] = "Lieu de prise de la photo";
-$a->strings["Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map."] = "Les métadonnées des photos sont normalement retirées. Ceci permet de sauver l'emplacement (si présent) et de positionner la photo sur une carte.";
-$a->strings["Export Public Calendar"] = "Exporter le Calendrier Public";
-$a->strings["Ability for visitors to download the public calendar"] = "Les visiteurs peuvent télécharger le calendrier public";
-$a->strings["Post Composition Features"] = "Caractéristiques de composition de publication";
-$a->strings["Auto-mention Forums"] = "Mentionner automatiquement les Forums";
-$a->strings["Add/remove mention when a forum page is selected/deselected in ACL window."] = "Ajoute/retire une mention quand une page forum est sélectionnée/désélectionnée lors du choix des destinataires d'une publication.";
-$a->strings["Explicit Mentions"] = "";
-$a->strings["Add explicit mentions to comment box for manual control over who gets mentioned in replies."] = "";
-$a->strings["Network Sidebar"] = "";
-$a->strings["Ability to select posts by date ranges"] = "Capacité de sélectionner les publications par intervalles de dates";
-$a->strings["Protocol Filter"] = "";
-$a->strings["Enable widget to display Network posts only from selected protocols"] = "";
-$a->strings["Network Tabs"] = "Onglets Réseau";
-$a->strings["Network New Tab"] = "Nouvel onglet réseaux";
-$a->strings["Enable tab to display only new Network posts (from the last 12 hours)"] = "Activer l'onglet pour afficher seulement les publications du réseau (dans les 12 dernières heures)";
-$a->strings["Network Shared Links Tab"] = "Onglet réseau partagé";
-$a->strings["Enable tab to display only Network posts with links in them"] = "Activer l'onglet pour afficher seulement les publications du réseau contenant des liens";
-$a->strings["Post/Comment Tools"] = "Outils de publication/commentaire";
-$a->strings["Post Categories"] = "Catégories des publications";
-$a->strings["Add categories to your posts"] = "Ajouter des catégories à vos publications";
-$a->strings["Advanced Profile Settings"] = "Paramètres Avancés du Profil";
-$a->strings["List Forums"] = "Liste des forums";
-$a->strings["Show visitors public community forums at the Advanced Profile Page"] = "Montrer les forums communautaires aux visiteurs sur la Page de profil avancé";
-$a->strings["Tag Cloud"] = "";
-$a->strings["Provide a personal tag cloud on your profile page"] = "";
-$a->strings["Display Membership Date"] = "";
-$a->strings["Display membership date in profile"] = "";
-$a->strings["Nothing new here"] = "Rien de neuf ici";
-$a->strings["Clear notifications"] = "Effacer les notifications";
-$a->strings["Personal notes"] = "Notes personnelles";
-$a->strings["Your personal notes"] = "Vos notes personnelles";
-$a->strings["Sign in"] = "Se connecter";
-$a->strings["Home Page"] = "Page d'accueil";
-$a->strings["Register"] = "S'inscrire";
-$a->strings["Create an account"] = "Créer un compte";
-$a->strings["Help and documentation"] = "Aide et documentation";
-$a->strings["Apps"] = "Applications";
-$a->strings["Addon applications, utilities, games"] = "Applications supplémentaires, utilitaires, jeux";
-$a->strings["Search site content"] = "Rechercher dans le contenu du site";
-$a->strings["Community"] = "Communauté";
-$a->strings["Conversations on this and other servers"] = "";
-$a->strings["Directory"] = "Annuaire";
-$a->strings["People directory"] = "Annuaire des utilisateurs";
-$a->strings["Information about this friendica instance"] = "Information au sujet de cette instance de friendica";
-$a->strings["Terms of Service of this Friendica instance"] = "";
-$a->strings["Network Reset"] = "Réinitialiser le réseau";
-$a->strings["Load Network page with no filters"] = "Chargement des pages du réseau sans filtre";
-$a->strings["Friend Requests"] = "Demande d'amitié";
-$a->strings["See all notifications"] = "Voir toutes les notifications";
-$a->strings["Mark all system notifications seen"] = "Marquer toutes les notifications système comme 'vues'";
-$a->strings["Inbox"] = "Messages entrants";
-$a->strings["Outbox"] = "Messages sortants";
-$a->strings["Manage"] = "Gérer";
-$a->strings["Manage other pages"] = "Gérer les autres pages";
-$a->strings["Manage/Edit Profiles"] = "Gérer/Éditer les profiles";
-$a->strings["Site setup and configuration"] = "Démarrage et configuration du site";
-$a->strings["Navigation"] = "Navigation";
-$a->strings["Site map"] = "Carte du site";
-$a->strings["Embedding disabled"] = "Incorporation désactivée";
-$a->strings["Embedded content"] = "Contenu incorporé";
-$a->strings["newer"] = "Plus récent";
-$a->strings["older"] = "Plus ancien";
-$a->strings["prev"] = "précédent";
-$a->strings["last"] = "dernier";
-$a->strings["Add New Contact"] = "Ajouter un nouveau contact";
-$a->strings["Enter address or web location"] = "Entrez son adresse ou sa localisation web";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Exemple : bob@example.com, http://example.com/barbara";
-$a->strings["%d invitation available"] = [
-       0 => "%d invitation disponible",
-       1 => "%d invitations disponibles",
-];
-$a->strings["Protocols"] = "";
-$a->strings["All Protocols"] = "";
-$a->strings["Saved Folders"] = "Dossiers sauvegardés";
-$a->strings["Everything"] = "Tout";
-$a->strings["Categories"] = "Catégories";
-$a->strings["%d contact in common"] = [
-       0 => "%d contact en commun",
-       1 => "%d contacts en commun",
-];
 $a->strings["There are no tables on MyISAM."] = "";
 $a->strings["\nError %d occurred during database update:\n%s\n"] = "\nErreur %d survenue durant la mise à jour de la base de données :\n%s\n";
 $a->strings["Errors encountered performing database changes: "] = "";
 $a->strings["%s: Database update"] = "";
 $a->strings["%s: updating %s table."] = "";
+$a->strings["Legacy module file not found: %s"] = "";
 $a->strings["Drop Contact"] = "Supprimer le contact";
 $a->strings["Organisation"] = "";
 $a->strings["News"] = "Nouvelles";
@@ -1991,6 +1932,7 @@ $a->strings["Upcoming events the next 7 days:"] = "";
 $a->strings["Member since:"] = "";
 $a->strings["j F, Y"] = "j F, Y";
 $a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Anniversaire :";
 $a->strings["Age:"] = "Age :";
 $a->strings["for %1\$d %2\$s"] = "depuis %1\$d %2\$s";
 $a->strings["Religion:"] = "Religion :";
@@ -2046,6 +1988,7 @@ $a->strings["Your nickname can only contain a-z, 0-9 and _."] = "";
 $a->strings["Nickname is already registered. Please choose another."] = "Pseudo déjà utilisé. Merci d'en choisir un autre.";
 $a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERREUR FATALE : La génération des clés de sécurité a échoué.";
 $a->strings["An error occurred during registration. Please try again."] = "Une erreur est survenue lors de l'inscription. Merci de recommencer.";
+$a->strings["default"] = "défaut";
 $a->strings["An error occurred creating your default profile. Please try again."] = "Une erreur est survenue lors de la création de votre profil par défaut. Merci de recommencer.";
 $a->strings["An error occurred creating your self contact. Please try again."] = "";
 $a->strings["An error occurred creating your default contact group. Please try again."] = "";
@@ -2053,16 +1996,6 @@ $a->strings["\n\t\t\tDear %1\$s,\n\t\t\t\tThank you for registering at %2\$s. Yo
 $a->strings["Registration at %s"] = "";
 $a->strings["\n\t\t\tDear %1\$s,\n\t\t\t\tThank you for registering at %2\$s. Your account has been created.\n\t\t"] = "";
 $a->strings["\n\t\t\tThe login details are as follows:\n\n\t\t\tSite Location:\t%3\$s\n\t\t\tLogin Name:\t\t%1\$s\n\t\t\tPassword:\t\t%5\$s\n\n\t\t\tYou may change your password from your account \"Settings\" page after logging\n\t\t\tin.\n\n\t\t\tPlease take a few moments to review the other account settings on that page.\n\n\t\t\tYou may also wish to add some basic information to your default profile\n\t\t\t(on the \"Profiles\" page) so that other people can easily find you.\n\n\t\t\tWe recommend setting your full name, adding a profile photo,\n\t\t\tadding some profile \"keywords\" (very useful in making new friends) - and\n\t\t\tperhaps what country you live in; if you do not wish to be more specific\n\t\t\tthan that.\n\n\t\t\tWe fully respect your right to privacy, and none of these items are necessary.\n\t\t\tIf you are new and do not know anybody here, they may help\n\t\t\tyou to make some new and interesting friends.\n\n\t\t\tIf you ever want to delete your account, you can do so at %3\$s/removeme\n\n\t\t\tThank you and welcome to %2\$s."] = "";
-$a->strings["Sharing notification from Diaspora network"] = "Notification de partage du réseau Diaspora";
-$a->strings["Attachments:"] = "Pièces jointes : ";
-$a->strings["%s's timeline"] = "";
-$a->strings["%s's posts"] = "";
-$a->strings["%s's comments"] = "";
-$a->strings["%s is now following %s."] = "%s suit désormais %s.";
-$a->strings["following"] = "following";
-$a->strings["%s stopped following %s."] = "%s ne suit plus %s.";
-$a->strings["stopped following"] = "retiré de la liste de suivi";
-$a->strings["(no subject)"] = "(sans titre)";
 $a->strings["Item was not found."] = "Element introuvable.";
 $a->strings["%d contact edited."] = [
        0 => "%d contact mis à jour.",
@@ -2185,6 +2118,9 @@ $a->strings["terms of service"] = "conditions d'utilisation";
 $a->strings["Website Privacy Policy"] = "Politique de confidentialité du site internet";
 $a->strings["privacy policy"] = "politique de confidentialité";
 $a->strings["Logged out."] = "Déconnecté.";
+$a->strings["%s's timeline"] = "";
+$a->strings["%s's posts"] = "";
+$a->strings["%s's comments"] = "";
 $a->strings["Bad Request."] = "";
 $a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking \"Register\"."] = "";
 $a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Si vous n'êtes pas familier avec OpenID, laissez ce champ vide et remplissez le reste.";
@@ -2234,6 +2170,7 @@ $a->strings["to"] = "à";
 $a->strings["via"] = "via";
 $a->strings["Wall-to-Wall"] = "Inter-mur";
 $a->strings["via Wall-To-Wall:"] = "en Inter-mur :";
+$a->strings["Reply to %s"] = "";
 $a->strings["Notifier task is pending"] = "";
 $a->strings["Delivery to remote servers is pending"] = "";
 $a->strings["Delivery to remote servers is underway"] = "";
@@ -2243,11 +2180,76 @@ $a->strings["%d comment"] = [
        0 => "%d commentaire",
        1 => "%d commentaires",
 ];
-$a->strings["Delete this item?"] = "Effacer cet élément?";
-$a->strings["show fewer"] = "montrer moins";
-$a->strings["toggle mobile"] = "activ. mobile";
-$a->strings["No system theme config value set."] = "";
-$a->strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Le jeton de sécurité du formulaire n'est pas correct. Ceci veut probablement dire que le formulaire est resté ouvert trop longtemps (plus de 3 heures) avant d'être validé.";
-$a->strings["Legacy module file not found: %s"] = "";
+$a->strings["Show more"] = "";
+$a->strings["Show fewer"] = "";
+$a->strings["Sharing notification from Diaspora network"] = "Notification de partage du réseau Diaspora";
+$a->strings["Attachments:"] = "Pièces jointes : ";
+$a->strings["%s is now following %s."] = "%s suit désormais %s.";
+$a->strings["following"] = "following";
+$a->strings["%s stopped following %s."] = "%s ne suit plus %s.";
+$a->strings["stopped following"] = "retiré de la liste de suivi";
+$a->strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-JJ ou MM-JJ";
+$a->strings["never"] = "jamais";
+$a->strings["less than a second ago"] = "il y a moins d'une seconde";
+$a->strings["year"] = "an";
+$a->strings["years"] = "ans";
+$a->strings["months"] = "mois";
+$a->strings["weeks"] = "semaines";
+$a->strings["days"] = "jours";
+$a->strings["hour"] = "heure";
+$a->strings["hours"] = "heures";
+$a->strings["minute"] = "minute";
+$a->strings["minutes"] = "minutes";
+$a->strings["second"] = "seconde";
+$a->strings["seconds"] = "secondes";
+$a->strings["in %1\$d %2\$s"] = "";
+$a->strings["%1\$d %2\$s ago"] = "il y a %1\$d %2\$s ";
+$a->strings["(no subject)"] = "(sans titre)";
 $a->strings["%s: Updating author-id and owner-id in item and thread table. "] = "";
 $a->strings["%s: Updating post-type."] = "";
+$a->strings["greenzero"] = "greenzero";
+$a->strings["purplezero"] = "purplezero";
+$a->strings["easterbunny"] = "easterbunny";
+$a->strings["darkzero"] = "darkzero";
+$a->strings["comix"] = "comix";
+$a->strings["slackr"] = "slackr";
+$a->strings["Variations"] = "Variations";
+$a->strings["Custom"] = "Personnalisé";
+$a->strings["Note"] = "Remarque";
+$a->strings["Check image permissions if all users are allowed to see the image"] = "Vérifier que tous les utilisateurs du site sont autorisés à voir l'image.";
+$a->strings["Select color scheme"] = "Choisir le schéma de couleurs";
+$a->strings["Navigation bar background color"] = "Couleur d'arrière-plan de la barre de navigation";
+$a->strings["Navigation bar icon color "] = "Couleur des icônes de la barre de navigation";
+$a->strings["Link color"] = "Couleur des liens";
+$a->strings["Set the background color"] = "Couleur d'arrière-plan";
+$a->strings["Content background opacity"] = "Opacité du contenu d'arrière-plan";
+$a->strings["Set the background image"] = "Image d'arrière-plan";
+$a->strings["Background image style"] = "Style de l'image de fond";
+$a->strings["Login page background image"] = "Image de fond de la page de login";
+$a->strings["Login page background color"] = "Couleur d'arrière-plan de la page de login";
+$a->strings["Leave background image and color empty for theme defaults"] = "Laisser l'image et la couleur de fond vides pour les paramètres par défaut du thème";
+$a->strings["Top Banner"] = "Bannière du haut";
+$a->strings["Resize image to the width of the screen and show background color below on long pages."] = "Redimensionner l'image à la largeur de l'écran et combler en dessous avec la couleur d'arrière plan.";
+$a->strings["Full screen"] = "Plein écran";
+$a->strings["Resize image to fill entire screen, clipping either the right or the bottom."] = "Agrandir l'image pour remplir l'écran, jusqu'à toucher le bord droit ou le bas de l'écran.";
+$a->strings["Single row mosaic"] = "Mosaïque sur un rang";
+$a->strings["Resize image to repeat it on a single row, either vertical or horizontal."] = "Redimensionner l'image pour la dupliquer sur un seul rang, vertical ou horizontal.";
+$a->strings["Mosaic"] = "Mosaïque";
+$a->strings["Repeat image to fill the screen."] = "Dupliquer l'image pour couvrir l'écran.";
+$a->strings["Guest"] = "Invité";
+$a->strings["Visitor"] = "Visiteur";
+$a->strings["Alignment"] = "Alignement";
+$a->strings["Left"] = "Gauche";
+$a->strings["Center"] = "Centre";
+$a->strings["Color scheme"] = "Palette de couleurs";
+$a->strings["Posts font size"] = "Taille de texte des publications";
+$a->strings["Textareas font size"] = "Taille de police des zones de texte";
+$a->strings["Comma separated list of helper forums"] = "Liste de forums d'aide, séparés par des virgules";
+$a->strings["Set style"] = "Définir le style";
+$a->strings["Community Pages"] = "Pages de Communauté";
+$a->strings["Community Profiles"] = "Profils communautaires";
+$a->strings["Help or @NewHere ?"] = "Aide ou @NewHere?";
+$a->strings["Connect Services"] = "Connecter des services";
+$a->strings["Find Friends"] = "Trouver des amis";
+$a->strings["Last users"] = "Derniers utilisateurs";
+$a->strings["Quick Start"] = "Démarrage rapide";
index 377409ebf3af4a0a99895faea8c8696bbbf8dd05..0d925b3c8aec7c21a6afa9e912cd46b1700d120d 100644 (file)
 
 {{if $source}}
 <div class="itemsource-results">
+       <div class="panel panel-default">
+               <div class="panel-heading">
+                       <h3 class="panel-title">Item Id</h3>
+               </div>
+               <div class="panel-body">
+                       {{$item_id}}
+               </div>
+       </div>
        <div class="panel panel-default">
                <div class="panel-heading">
                        <h3 class="panel-title">Item URI</h3>
                        {{$item_uri}}
                </div>
        </div>
+       <div class="panel panel-default">
+               <div class="panel-heading">
+                       <h3 class="panel-title">Terms</h3>
+               </div>
+               <div class="panel-body">
+                       <table class="table table-condensed table-striped">
+                               <tr>
+                                       <th>Type</th>
+                                       <th>Term</th>
+                                       <th>URL</th>
+                               </tr>
+               {{foreach $terms as $term}}
+                               <tr>
+                                       <td>
+                       {{if $term.type == 1}}Tag{{/if}}
+                       {{if $term.type == 2}}Mention{{/if}}
+                       {{if $term.type == 8}}Implicit Mention{{/if}}
+                                       </td>
+                                       <td>
+                                               {{$term.term}}
+                                       </td>
+                                       <td>
+                                               {{$term.url}}
+                                       </td>
+                               </tr>
+               {{/foreach}}
+                       </table>
+               </div>
+       </div>
        <div class="panel panel-default">
                <div class="panel-heading">
                        <h3 class="panel-title">Source</h3>
index 5796bb735cdfbba5349e18c1199bcee87a2a4d84..31b9287ba826d2ff2c93bdcf93571e3e08c677ba 100644 (file)
@@ -9,7 +9,7 @@
                                        {{if $group.cid}}
                                                <input type="checkbox"
                                                        class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
-                                                       onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+                                                       onclick="return contactgroupChangeMember(this, '{{$group.id}}','{{$group.cid}}');"
                                                        {{if $group.ismember}}checked="checked"{{/if}}
                                                />
                                        {{/if}}
index f73ef3ab0a195114158e75704596b51791343bfa..dcf38d42362cd50b23df90beddba7dc3e4573163 100644 (file)
@@ -35,16 +35,16 @@ function theme_admin_post(App $a)
        }
 
        if (isset($_POST['frio-settings-submit'])) {
-               Config::set('frio', 'scheme',           $_POST['frio_scheme']);
-               Config::set('frio', 'nav_bg',           $_POST['frio_nav_bg']);
-               Config::set('frio', 'nav_icon_color',   $_POST['frio_nav_icon_color']);
-               Config::set('frio', 'link_color',       $_POST['frio_link_color']);
-               Config::set('frio', 'background_color', $_POST['frio_background_color']);
-               Config::set('frio', 'contentbg_transp', $_POST['frio_contentbg_transp']);
-               Config::set('frio', 'background_image', $_POST['frio_background_image']);
-               Config::set('frio', 'bg_image_option',  $_POST['frio_bg_image_option']);
-               Config::set('frio', 'login_bg_image',   $_POST['frio_login_bg_image']);
-               Config::set('frio', 'login_bg_color',   $_POST['frio_login_bg_color']);
+               Config::set('frio', 'scheme',           defaults($_POST, 'frio_scheme', ''));
+               Config::set('frio', 'nav_bg',           defaults($_POST, 'frio_nav_bg', ''));
+               Config::set('frio', 'nav_icon_color',   defaults($_POST, 'frio_nav_icon_color', ''));
+               Config::set('frio', 'link_color',       defaults($_POST, 'frio_link_color', ''));
+               Config::set('frio', 'background_color', defaults($_POST, 'frio_background_color', ''));
+               Config::set('frio', 'contentbg_transp', defaults($_POST, 'frio_contentbg_transp', ''));
+               Config::set('frio', 'background_image', defaults($_POST, 'frio_background_image', ''));
+               Config::set('frio', 'bg_image_option',  defaults($_POST, 'frio_bg_image_option', ''));
+               Config::set('frio', 'login_bg_image',   defaults($_POST, 'frio_login_bg_image', ''));
+               Config::set('frio', 'login_bg_color',   defaults($_POST, 'frio_login_bg_color', ''));
                Config::set('frio', 'css_modified',     time());
        }
 }
index 2f091804394b3eade1d485a00dfb31b3afb0690a..9e3f610cd558d92f353c4e95a814c530add16700 100644 (file)
  *    'version' => Scheme version
  *    'overwrites' => Variables which overwriting custom settings
  */
+
 use Friendica\Core\PConfig;
 
 function get_scheme_info($scheme)
 {
        $theme = \get_app()->getCurrentTheme();
        $themepath = 'view/theme/' . $theme . '/';
-       $scheme = PConfig::get(local_user(), 'frio', 'scheme', PConfig::get(local_user(), 'frio', 'scheme'));
+       if (empty($scheme)) {
+               $scheme = PConfig::get(local_user(), 'frio', 'scheme', PConfig::get(local_user(), 'frio', 'scheme'));
+       }
 
        $info = [
                'name' => $scheme,
index 915a493758569b7be7445cef72f153ffa3857529..78728818039430d734a6d88de52c12cca8c66f86 100644 (file)
@@ -30,6 +30,7 @@
 
 {{if $url}}<dl><dt>{{$url_label}}</dt><dd><a target="blank" href="{{$zrl}}">{{$url}}</a></dd></dl>{{/if}}
 {{if $location}}<dl><dt>{{$location_label}}</dt><dd>{{$location}}</dd></dl>{{/if}}
+
 {{if $keywords}}<dl><dt>{{$keywords_label}}</dt><dd>{{$keywords}}</dd></dl>{{/if}}
 {{if $about}}<dl><dt>{{$about_label}}</dt><dd>{{$about}}</dd></dl>{{/if}}
 
        <label id="dfrn-url-label" for="dfrn-url" >{{$your_address}}</label>
         {{if $myaddr}}
                 {{$myaddr}}
-                <input type="hidden" name="dfrn_url" id="dfrn-url" value="{{$myaddr|escape:'html'}}" />
+                <input type="hidden" name="dfrn_url" id="dfrn-url" value="{{$myaddr}}" />
         {{else}}
-        <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr|escape:'html'}}" />
+        <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr}}" />
         {{/if}}
         {{if $url}}
-                <input type="hidden" name="url" id="url" value="{{$url|escape:'html'}}" />
+                <input type="hidden" name="url" id="url" value="{{$url}}" />
         {{/if}}
        <div id="dfrn-request-url-end"></div>
 </div>
@@ -54,9 +55,9 @@
 
        <div id="dfrn-request-submit-wrapper">
                {{if $submit}}
-                       <input class="btn btn-primary" type="submit" name="submit" id="dfrn-request-submit-button" value="{{$submit|escape:'html'}}" />
+                       <input class="btn btn-primary" type="submit" name="submit" id="dfrn-request-submit-button" value="{{$submit}}" />
                {{/if}}
-               <input class="btn btn-primary" type="submit" name="cancel" id="dfrn-request-cancel-button" value="{{$cancel|escape:'html'}}" />
+               <input class="btn btn-primary" type="submit" name="cancel" id="dfrn-request-cancel-button" value="{{$cancel}}" />
        </div>
 </form>
-</div>
\ No newline at end of file
+</div>
index ebcf3a0621b33f855038d8864dadaf8f46be4baa..478f9bf64f11b95562bce6f76d8111eedf18499a 100644 (file)
        <label id="dfrn-url-label" for="dfrn-url" >{{$your_address}}</label>
        {{if $myaddr}}
                {{$myaddr}}
-               <input type="hidden" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr|escape:'html'}}" />
+               <input type="hidden" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr}}" />
        {{else}}
-       <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr|escape:'html'}}" />
+       <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr}}" />
        {{/if}}
        {{if $url}}
-               <input type="hidden" name="url" id="url" value="{{$url|escape:'html'}}" />
+               <input type="hidden" name="url" id="url" value="{{$url}}" />
        {{/if}}
        <div id="dfrn-request-url-end"></div>
 </div>
@@ -84,9 +84,9 @@
 
        <div id="dfrn-request-submit-wrapper">
                {{if $submit}}
-                       <input class="btn btn-primary" type="submit" name="submit" id="dfrn-request-submit-button" value="{{$submit|escape:'html'}}" />
+                       <input class="btn btn-primary" type="submit" name="submit" id="dfrn-request-submit-button" value="{{$submit}}" />
                {{/if}}
-               <input class="btn btn-primary" type="submit" name="cancel" id="dfrn-request-cancel-button" value="{{$cancel|escape:'html'}}" />
+               <input class="btn btn-primary" type="submit" name="cancel" id="dfrn-request-cancel-button" value="{{$cancel}}" />
        </div>
 </form>
-</div>
\ No newline at end of file
+</div>
index 947ae974e8aec1b4d1eb442d60bd2a746a346ed7..75983b36eea365b6e269a587b44c14047574c6eb 100644 (file)
@@ -28,7 +28,7 @@
                                                        <input type="checkbox"
                                                                id="sidebar-group-checkbox-{{$group.id}}"
                                                                class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
-                                                               onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+                                                               onclick="return contactgroupChangeMember(this, '{{$group.id}}','{{$group.cid}}');"
                                                                {{if $group.ismember}}checked="checked"{{/if}}
                                                                aria-checked="{{if $group.ismember}}true{{else}}false{{/if}}"
                                                        />
index 1fb12212537cdef1b10f18b4f2d161845623aa3d..bd069f5cd7e87f3cb6ed28784911f89f7d195a80 100644 (file)
@@ -293,8 +293,11 @@ as the value of $top_child_total (this is done at the end of this file)
                        {{foreach $item.mentions as $tag}}
                                <span class="mention label btn-warning sm">{{$tag nofilter}} <i class="fa fa-user" aria-hidden="true"></i></span>
                        {{/foreach}}
-               {{/if}}
 
+                       {{*foreach $item.implicit_mentions as $tag}}
+                               <span class="mention label label-default sm">{{$tag nofilter}} <i class="fa fa-eye-slash" aria-hidden="true"></i></span>
+                       {{/foreach*}}
+               {{/if}}
                        {{foreach $item.folders as $cat}}
                                <span class="folder label btn-danger sm p-category">{{$cat.name}}{{if $cat.removeurl}} (<a href="{{$cat.removeurl}}" title="{{$remove}}">x</a>) {{/if}} </span>
                        {{/foreach}}
index 620d2de75aae7db2f29982176b8dc7088ce57e50..18a6105a6e17af76c34b4964ec13a3edeeaffd46 100644 (file)
@@ -17,7 +17,7 @@
                                {{if $group.cid}}
                                        <input type="checkbox"
                                                class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
-                                               onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+                                               onclick="return contactgroupChangeMember(this, '{{$group.id}}','{{$group.cid}}');"
                                                {{if $group.ismember}}checked="checked"{{/if}}
                                        />
                                {{/if}}